in eng/tools/typespec-validation/src/rules/linter-ruleset.ts [22:106]
async execute(folder: string): Promise<RuleResult> {
let success = true;
let stdOutput = "";
let errorOutput = "";
const configText = await readTspConfig(folder);
const config = yamlParse(configText);
const rpFolder =
config?.options?.["@azure-tools/typespec-autorest"]?.["azure-resource-provider-folder"];
stdOutput += `azure-resource-provider-folder: ${JSON.stringify(rpFolder)}\n`;
const mainTspExists = await fileExists(join(folder, "main.tsp"));
const clientTspExists = await fileExists(join(folder, "client.tsp"));
let files = [];
if (mainTspExists) {
files.push("main.tsp");
}
if (clientTspExists) {
files.push("client.tsp");
}
stdOutput += `files: ${JSON.stringify(files)}\n`;
const linterExtends: string[] = config?.linter?.extends;
stdOutput += `linter.extends: ${JSON.stringify(linterExtends)}`;
let requiredRuleset = "";
if (rpFolder?.trim()?.endsWith("resource-manager")) {
requiredRuleset = "@azure-tools/typespec-azure-rulesets/resource-manager";
} else if (rpFolder?.trim()?.endsWith("data-plane")) {
requiredRuleset = "@azure-tools/typespec-azure-rulesets/data-plane";
} else if (clientTspExists && !mainTspExists) {
// Assume folders with no autorest setting, containing only "client.tsp" but no "main.tsp",
// are data-plane (e.g. HealthInsights.TrialMatcher)
requiredRuleset = "@azure-tools/typespec-azure-rulesets/data-plane";
} else {
// Cannot determine if spec is data-plane or resource-manager, so cannot know
// which linter ruleset is required.
success = false;
errorOutput +=
"tspconfig.yaml must define the following property:\n" +
"\n" +
"options:\n" +
' "@azure-tools/typespec-autorest":\n' +
' azure-resource-provider-folder: "data-plane" | "resource-manager"\n';
}
if (linterExtends) {
for (const ruleset of linterExtends) {
if (deprecatedRulesets.has(ruleset)) {
const newRuleset = deprecatedRulesets.get(ruleset);
success = false;
errorOutput +=
"tspconfig.yaml references the following ruleset which is deprecated:\n" +
"\n" +
"linter:\n" +
" extends:\n" +
` - "${ruleset}"\n` +
"\n" +
"It should be replaced with the following:\n" +
"\n" +
"linter:\n" +
" extends:\n" +
` - "${newRuleset}"`;
}
}
}
if (requiredRuleset && !linterExtends?.includes(requiredRuleset)) {
success = false;
errorOutput +=
"tspconfig.yaml must define the following property:\n" +
"\n" +
"linter:\n" +
" extends:\n" +
` - "${requiredRuleset}"`;
}
return {
success: success,
stdOutput: stdOutput,
errorOutput: errorOutput,
};
}