From 78ebdc1530221573e0ef1c9cc8e450080cc1a1f5 Mon Sep 17 00:00:00 2001 From: Ray Chen Date: Fri, 16 Jan 2026 16:07:06 -0800 Subject: [PATCH 1/4] Removed 'azure-resource-provider-folder' usage from TSV lint rule and v2 sample config --- .../src/rules/linter-ruleset.ts | 21 +++++-------------- .../data-plane/WidgetAnalytics/tspconfig.yaml | 2 -- .../Microsoft.Widget/Widget/tspconfig.yaml | 2 -- 3 files changed, 5 insertions(+), 20 deletions(-) diff --git a/eng/tools/typespec-validation/src/rules/linter-ruleset.ts b/eng/tools/typespec-validation/src/rules/linter-ruleset.ts index 9cb783603942..6bfab15ccb91 100644 --- a/eng/tools/typespec-validation/src/rules/linter-ruleset.ts +++ b/eng/tools/typespec-validation/src/rules/linter-ruleset.ts @@ -27,10 +27,6 @@ export class LinterRulesetRule implements Rule { const configText = await readTspConfig(folder); const config = parse(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")); const files = []; @@ -45,25 +41,18 @@ export class LinterRulesetRule implements Rule { const linterExtends = config?.linter?.extends; stdOutput += `linter.extends: ${JSON.stringify(linterExtends)}`; + // Normalize path separators + const normalizedFolder = folder.replace(/\\/g, "/"); + let requiredRuleset = ""; - if (rpFolder?.trim()?.endsWith("resource-manager")) { + if (normalizedFolder.includes("/resource-manager/") || normalizedFolder.includes(".Management/")) { 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'; + requiredRuleset = "@azure-tools/typespec-azure-rulesets/data-plane"; } if (linterExtends) { diff --git a/specification/widget/data-plane/WidgetAnalytics/tspconfig.yaml b/specification/widget/data-plane/WidgetAnalytics/tspconfig.yaml index 70b3aab03e5b..1b86a0e76f75 100644 --- a/specification/widget/data-plane/WidgetAnalytics/tspconfig.yaml +++ b/specification/widget/data-plane/WidgetAnalytics/tspconfig.yaml @@ -10,8 +10,6 @@ linter: - "@azure-tools/typespec-azure-rulesets/data-plane" options: "@azure-tools/typespec-autorest": - # TODO: Does anything need this set, if it's not used in output-file? - azure-resource-provider-folder: "data-plane" emit-lro-options: "none" emitter-output-dir: "{project-root}" output-file: "{version-status}/{version}/widgetanalytics.json" diff --git a/specification/widget/resource-manager/Microsoft.Widget/Widget/tspconfig.yaml b/specification/widget/resource-manager/Microsoft.Widget/Widget/tspconfig.yaml index 81c35056d002..9c97da201c09 100644 --- a/specification/widget/resource-manager/Microsoft.Widget/Widget/tspconfig.yaml +++ b/specification/widget/resource-manager/Microsoft.Widget/Widget/tspconfig.yaml @@ -7,8 +7,6 @@ options: "@azure-tools/typespec-autorest": use-read-only-status-schema: true emitter-output-dir: "{project-root}" - # TODO: Does anything need this set, if it's not used in output-file? Currently required by TSV. - azure-resource-provider-folder: "resource-manager" output-file: "{version-status}/{version}/widget.json" arm-types-dir: "{project-root}/../../../../common-types/resource-management" "@azure-typespec/http-client-csharp-mgmt": From af90ea87d26aeeed65cab0edafb0b82a85f4b23e Mon Sep 17 00:00:00 2001 From: Ray Chen Date: Fri, 16 Jan 2026 16:18:37 -0800 Subject: [PATCH 2/4] Fixed format --- eng/tools/typespec-validation/src/rules/linter-ruleset.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/eng/tools/typespec-validation/src/rules/linter-ruleset.ts b/eng/tools/typespec-validation/src/rules/linter-ruleset.ts index 6bfab15ccb91..6d05a198bbd2 100644 --- a/eng/tools/typespec-validation/src/rules/linter-ruleset.ts +++ b/eng/tools/typespec-validation/src/rules/linter-ruleset.ts @@ -45,7 +45,10 @@ export class LinterRulesetRule implements Rule { const normalizedFolder = folder.replace(/\\/g, "/"); let requiredRuleset = ""; - if (normalizedFolder.includes("/resource-manager/") || normalizedFolder.includes(".Management/")) { + if ( + normalizedFolder.includes("/resource-manager/") || + normalizedFolder.includes(".Management/") + ) { requiredRuleset = "@azure-tools/typespec-azure-rulesets/resource-manager"; } else if (clientTspExists && !mainTspExists) { // Assume folders with no autorest setting, containing only "client.tsp" but no "main.tsp", From 92caf584bf580dbf1122956fcd6faf842346f897 Mon Sep 17 00:00:00 2001 From: Ray Chen Date: Fri, 16 Jan 2026 17:00:57 -0800 Subject: [PATCH 3/4] Fixed tests --- .../test/linter-ruleset.test.ts | 40 ++++--------------- 1 file changed, 8 insertions(+), 32 deletions(-) diff --git a/eng/tools/typespec-validation/test/linter-ruleset.test.ts b/eng/tools/typespec-validation/test/linter-ruleset.test.ts index 90e995bdc843..357f2fc70f6b 100644 --- a/eng/tools/typespec-validation/test/linter-ruleset.test.ts +++ b/eng/tools/typespec-validation/test/linter-ruleset.test.ts @@ -29,30 +29,24 @@ describe("linter-ruleset", function () { it("succeeds with resource-manager/resource-manager", async function () { readTspConfigSpy.mockImplementation(() => Promise.resolve(` -options: - "@azure-tools/typespec-autorest": - azure-resource-provider-folder: "resource-manager" linter: extends: - "@azure-tools/typespec-azure-rulesets/resource-manager" `), ); - const result = await new LinterRulesetRule().execute(mockFolder); + const result = await new LinterRulesetRule().execute("specification/foo/resource-manager/Foo"); assert(result.success); }); it("succeeds with data-plane/data-plane", async function () { readTspConfigSpy.mockImplementation(() => Promise.resolve(` -options: - "@azure-tools/typespec-autorest": - azure-resource-provider-folder: "data-plane" linter: extends: - "@azure-tools/typespec-azure-rulesets/data-plane" `), ); - const result = await new LinterRulesetRule().execute(mockFolder); + const result = await new LinterRulesetRule().execute("specification/foo/data-plane/Foo"); assert(result.success); }); @@ -80,76 +74,58 @@ linter: }); it("fails with resource-manager/no-linter", async function () { - readTspConfigSpy.mockImplementation(() => - Promise.resolve(` -options: - "@azure-tools/typespec-autorest": - azure-resource-provider-folder: "resource-manager" -`), - ); - const result = await new LinterRulesetRule().execute(mockFolder); + readTspConfigSpy.mockImplementation(() => Promise.resolve(``)); + const result = await new LinterRulesetRule().execute("specification/foo/resource-manager/Foo"); assert(!result.success); }); it("fails with resource-manager/data-plane", async function () { readTspConfigSpy.mockImplementation(() => Promise.resolve(` -options: - "@azure-tools/typespec-autorest": - azure-resource-provider-folder: "resource-manager" linter: extends: - "@azure-tools/typespec-azure-rulesets/data-plane" `), ); - const result = await new LinterRulesetRule().execute(mockFolder); + const result = await new LinterRulesetRule().execute("specification/foo/Foo.Management/Foo"); assert(!result.success); }); it("fails with data-plane/resource-manager", async function () { readTspConfigSpy.mockImplementation(() => Promise.resolve(` -options: - "@azure-tools/typespec-autorest": - azure-resource-provider-folder: "data-plane" linter: extends: - "@azure-tools/typespec-azure-rulesets/resource-manager" `), ); - const result = await new LinterRulesetRule().execute(mockFolder); + const result = await new LinterRulesetRule().execute("specification/foo/data-plane/Foo"); assert(!result.success); }); it("fails with data-plane/old-and-new", async function () { readTspConfigSpy.mockImplementation(() => Promise.resolve(` -options: - "@azure-tools/typespec-autorest": - azure-resource-provider-folder: "data-plane" linter: extends: - "@azure-tools/typespec-azure-core/all" - "@azure-tools/typespec-azure-rulesets/data-plane" `), ); - const result = await new LinterRulesetRule().execute(mockFolder); + const result = await new LinterRulesetRule().execute("specification/foo/data-plane/Foo"); assert(!result.success); }); it("fails with resource-manager/old-and-new", async function () { readTspConfigSpy.mockImplementation(() => Promise.resolve(` -options: - "@azure-tools/typespec-autorest": - azure-resource-provider-folder: "resource-manager" linter: extends: - "@azure-tools/typespec-azure-resource-manager/all" - "@azure-tools/typespec-azure-rulesets/resource-manager" `), ); - const result = await new LinterRulesetRule().execute(mockFolder); + const result = await new LinterRulesetRule().execute("specification/foo/resource-manager/Foo"); assert(!result.success); }); From 1b4690b2f15ce5ef0e3be14f5f271273798b9add Mon Sep 17 00:00:00 2001 From: Ray Chen Date: Fri, 16 Jan 2026 17:32:54 -0800 Subject: [PATCH 4/4] Updated condition --- eng/tools/typespec-validation/src/rules/linter-ruleset.ts | 2 +- eng/tools/typespec-validation/test/linter-ruleset.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/eng/tools/typespec-validation/src/rules/linter-ruleset.ts b/eng/tools/typespec-validation/src/rules/linter-ruleset.ts index 6d05a198bbd2..b3e5b69aa258 100644 --- a/eng/tools/typespec-validation/src/rules/linter-ruleset.ts +++ b/eng/tools/typespec-validation/src/rules/linter-ruleset.ts @@ -47,7 +47,7 @@ export class LinterRulesetRule implements Rule { let requiredRuleset = ""; if ( normalizedFolder.includes("/resource-manager/") || - normalizedFolder.includes(".Management/") + normalizedFolder.trim().endsWith(".Management") ) { requiredRuleset = "@azure-tools/typespec-azure-rulesets/resource-manager"; } else if (clientTspExists && !mainTspExists) { diff --git a/eng/tools/typespec-validation/test/linter-ruleset.test.ts b/eng/tools/typespec-validation/test/linter-ruleset.test.ts index 357f2fc70f6b..ac8e4dae9a11 100644 --- a/eng/tools/typespec-validation/test/linter-ruleset.test.ts +++ b/eng/tools/typespec-validation/test/linter-ruleset.test.ts @@ -87,7 +87,7 @@ linter: - "@azure-tools/typespec-azure-rulesets/data-plane" `), ); - const result = await new LinterRulesetRule().execute("specification/foo/Foo.Management/Foo"); + const result = await new LinterRulesetRule().execute("specification/foo/Foo.Management"); assert(!result.success); });