common/utils.ts (55 lines of code) (raw):
/*
* Copyright 2021-2025 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import type {Tool} from 'sarif'
export interface Rule {
shortDescription: string
fullDescription: string
}
/**
* Extracts the rules descriptions from SARIF tool field.
* @param tool the SARIF tool field.
* @returns The map of SARIF rule IDs to their descriptions.
*/
export function parseRules(tool: Tool): Map<string, Rule> {
const rules = new Map<string, Rule>()
tool.driver.rules?.forEach(rule => {
rules.set(rule.id, {
shortDescription: rule.shortDescription!.text,
fullDescription:
rule.fullDescription!.markdown || rule.fullDescription!.text
})
})
tool?.extensions?.forEach(ext => {
ext?.rules?.forEach(rule => {
rules.set(rule.id, {
shortDescription: rule.shortDescription!.text,
fullDescription:
rule.fullDescription!.markdown || rule.fullDescription!.text
})
})
})
return rules
}
/**
* Parses given arguments represented as string with respect to --property
* This implementation relies on the fact
* that all arguments in qodana cli are passed using some option which starts with '-'
* The values in the list for property shouldn't start with '-'
* @param rawArgs string with original arguments
*/
export function parseRawArguments(rawArgs: string): string[] {
const initialSplit = rawArgs ? rawArgs.split(',').map(arg => arg.trim()) : []
const result: string[] = []
let i = 0
while (i < initialSplit.length) {
const currentArg = initialSplit[i]
// handle --property,prop.name=val1,val2,...
if (currentArg === '--property') {
result.push(currentArg)
const propertyValues: string[] = []
i++
while (i < initialSplit.length && !initialSplit[i].startsWith('-')) {
propertyValues.push(initialSplit[i])
i++
}
result.push(propertyValues.join(','))
// handle --property prop.name=val1,val2,...
} else if (currentArg.startsWith('--property ')) {
const fullPropertyArg: string[] = [currentArg]
i++
while (i < initialSplit.length && !initialSplit[i].startsWith('-')) {
fullPropertyArg.push(initialSplit[i])
i++
}
result.push(fullPropertyArg.join(','))
} else {
result.push(currentArg)
i++
}
}
return result
}