From 7de1b35a2bdc14c3537ce13da7b287d0f14b5655 Mon Sep 17 00:00:00 2001 From: Mike Harder Date: Fri, 14 Nov 2025 21:22:36 +0000 Subject: [PATCH 01/15] [spec-gen-sdk-runner] Move SpecGenSdkArtifactInfo to .github/shared --- .github/shared/src/sdk-types.js | 35 +++++++- .github/shared/test/sdk-types.js | 21 +++++ .github/shared/test/sdk-types.test.js | 22 +++++ .../src/sdk-breaking-change-labels.js | 8 +- .github/workflows/src/spec-gen-sdk-status.js | 9 +- .../test/sdk-breaking-change-labels.test.js | 76 ++++++++-------- .../test/spec-gen-sdk-status.test.js | 87 +++++++++++-------- eng/tools/spec-gen-sdk-runner/package.json | 3 + .../src/command-helpers.ts | 10 +-- eng/tools/spec-gen-sdk-runner/src/commands.ts | 3 +- eng/tools/spec-gen-sdk-runner/src/types.ts | 21 ----- .../test/command-helpers.test.ts | 2 +- .../test/utils/extractServiceName.test.ts | 2 +- eng/tools/spec-gen-sdk-runner/tsconfig.json | 10 ++- package-lock.json | 3 + 15 files changed, 196 insertions(+), 116 deletions(-) create mode 100644 .github/shared/test/sdk-types.js create mode 100644 .github/shared/test/sdk-types.test.js diff --git a/.github/shared/src/sdk-types.js b/.github/shared/src/sdk-types.js index d1c0ebd9bebc..57c2884404d2 100644 --- a/.github/shared/src/sdk-types.js +++ b/.github/shared/src/sdk-types.js @@ -1,7 +1,38 @@ -/* v8 ignore start */ +import * as z from "zod"; +const SdkNameSchema = z.enum([ + "azure-sdk-for-go", + "azure-sdk-for-java", + "azure-sdk-for-js", + "azure-sdk-for-net", + "azure-sdk-for-python", +]); /** - * @typedef {'azure-sdk-for-go' | 'azure-sdk-for-java' | 'azure-sdk-for-js' | 'azure-sdk-for-net' | 'azure-sdk-for-python'} SdkName + * @typedef {import("zod").infer} SdkName + */ + +/* + * Data for the API view request. + */ +const APIViewRequestDataSchema = z.object({ packageName: z.string(), filePath: z.string() }); +/** + * @typedef {import("zod").infer} APIViewRequestData + */ + +/** + * Represents the result of the spec-gen-sdk generation process. + */ +export const SpecGenSdkArtifactInfoSchema = z.object({ + language: SdkNameSchema, + result: z.string(), + headSha: z.string(), + prNumber: z.string().optional(), + labelAction: z.boolean().optional(), + isSpecGenSdkCheckRequired: z.boolean(), + apiViewRequestData: z.array(APIViewRequestDataSchema), +}); +/** + * @typedef {import("zod").infer} SpecGenSdkArtifactInfo */ /** diff --git a/.github/shared/test/sdk-types.js b/.github/shared/test/sdk-types.js new file mode 100644 index 000000000000..cd48727b961d --- /dev/null +++ b/.github/shared/test/sdk-types.js @@ -0,0 +1,21 @@ +/** + * @typedef {import("../src/sdk-types.js").SpecGenSdkArtifactInfo} SpecGenSdkArtifactInfo + */ + +/** + * Create a mock SpecGenSdkArtifactInfo, filling unspecified properties with defaults. + * @param {Partial} [overrides] + * @returns {SpecGenSdkArtifactInfo} + */ +export function createMockSpecGenSdkArtifactInfo(overrides = {}) { + /** @type {SpecGenSdkArtifactInfo} */ + const defaults = { + apiViewRequestData: [], + headSha: "abc123", + isSpecGenSdkCheckRequired: true, + language: "azure-sdk-for-go", + result: "test result", + }; + + return { ...defaults, ...overrides }; +} diff --git a/.github/shared/test/sdk-types.test.js b/.github/shared/test/sdk-types.test.js new file mode 100644 index 000000000000..07cf14fea3ab --- /dev/null +++ b/.github/shared/test/sdk-types.test.js @@ -0,0 +1,22 @@ +import { describe, expect, it } from "vitest"; +import { sdkLabels, SpecGenSdkArtifactInfoSchema } from "../src/sdk-types.js"; +import { createMockSpecGenSdkArtifactInfo } from "./sdk-types.js"; + +describe("sdk-types", () => { + it("defines sdkLabels", () => { + // Ensures constant "sdkLabels" is considered "covered" by codecov + expect(sdkLabels).toBeDefined(); + }); + + it("parses SpecGetSdkArtifactInfo", () => { + const artifactInfo = createMockSpecGenSdkArtifactInfo(); + + const json = JSON.stringify(artifactInfo); + expect(json).toMatchInlineSnapshot( + `"{"apiViewRequestData":[],"headSha":"abc123","isSpecGenSdkCheckRequired":true,"language":"azure-sdk-for-go","result":"test result"}"`, + ); + + const parsed = SpecGenSdkArtifactInfoSchema.parse(JSON.parse(json)); + expect(parsed).toEqual(artifactInfo); + }); +}); diff --git a/.github/workflows/src/sdk-breaking-change-labels.js b/.github/workflows/src/sdk-breaking-change-labels.js index d36e721ece2a..66e2ef33768b 100644 --- a/.github/workflows/src/sdk-breaking-change-labels.js +++ b/.github/workflows/src/sdk-breaking-change-labels.js @@ -1,4 +1,4 @@ -import { sdkLabels } from "../../shared/src/sdk-types.js"; +import { SpecGenSdkArtifactInfoSchema, sdkLabels } from "../../shared/src/sdk-types.js"; import { getAdoBuildInfoFromUrl, getAzurePipelineArtifact } from "./artifacts.js"; import { extractInputs } from "./context.js"; import { LabelAction } from "./label.js"; @@ -72,12 +72,14 @@ export async function getLabelAndActionImpl({ details_url, core, retryOptions = } else { core.info(`Artifact content: ${result.artifactData}`); // Parse the JSON data - const specGenSdkArtifactInfo = JSON.parse(result.artifactData); + const specGenSdkArtifactInfo = SpecGenSdkArtifactInfoSchema.parse( + JSON.parse(result.artifactData), + ); const labelActionText = specGenSdkArtifactInfo.labelAction; head_sha = specGenSdkArtifactInfo.headSha; - issue_number = parseInt(specGenSdkArtifactInfo.prNumber, 10); + issue_number = parseInt(specGenSdkArtifactInfo.prNumber ?? "", 10); if (!issue_number) { core.warning( `No PR number found in the artifact '${artifactName}' with details_url:${details_url}.`, diff --git a/.github/workflows/src/spec-gen-sdk-status.js b/.github/workflows/src/spec-gen-sdk-status.js index 03c5de311c5d..a2a6b3f5a82e 100644 --- a/.github/workflows/src/spec-gen-sdk-status.js +++ b/.github/workflows/src/spec-gen-sdk-status.js @@ -1,4 +1,5 @@ import { CheckStatus, CommitStatusState, PER_PAGE_MAX } from "../../shared/src/github.js"; +import { SpecGenSdkArtifactInfoSchema } from "../../shared/src/sdk-types.js"; import { getAdoBuildInfoFromUrl, getAzurePipelineArtifact } from "./artifacts.js"; import { extractInputs } from "./context.js"; import { writeToActionsSummary } from "./github.js"; @@ -122,7 +123,7 @@ export async function setSpecGenSdkStatusImpl({ /** * @param {Object} params - * @param {Array} params.checkRuns + * @param {import("./github.js").CheckRuns} params.checkRuns * @param {typeof import("@actions/core")} params.core * @returns {Promise<{state: CommitStatusState, description: string}>} */ @@ -139,6 +140,9 @@ async function processResult({ checkRuns, core }) { for (const checkRun of checkRuns) { core.info(`Processing check run: ${checkRun.name} (${checkRun.conclusion})`); + if (checkRun.details_url === null) { + throw new Error(`'details_url' is null in Check Run '${checkRun.name}'`); + } const buildInfo = getAdoBuildInfoFromUrl(checkRun.details_url); const ado_project_url = buildInfo.projectUrl; const ado_build_id = buildInfo.buildId; @@ -159,7 +163,8 @@ async function processResult({ checkRuns, core }) { `Artifact '${artifactName}' not found in the build with details_url:${checkRun.details_url}`, ); } - const artifactJsonObj = JSON.parse(result.artifactData); + + const artifactJsonObj = SpecGenSdkArtifactInfoSchema.parse(JSON.parse(result.artifactData)); const language = artifactJsonObj.language; const shortLanguageName = language.split("-").pop(); const executionResult = artifactJsonObj.result; diff --git a/.github/workflows/test/sdk-breaking-change-labels.test.js b/.github/workflows/test/sdk-breaking-change-labels.test.js index 9b2e58cc9d49..bf4fa60ab106 100644 --- a/.github/workflows/test/sdk-breaking-change-labels.test.js +++ b/.github/workflows/test/sdk-breaking-change-labels.test.js @@ -1,5 +1,6 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; import { sdkLabels } from "../../shared/src/sdk-types.js"; +import { createMockSpecGenSdkArtifactInfo } from "../../shared/test/sdk-types.js"; import { LabelAction } from "../src/label.js"; import { getLabelAndActionImpl, @@ -12,9 +13,11 @@ vi.mock("../src/context.js", () => ({ extractInputs: vi.fn(), })); +/** @type {import('vitest').Mock<(url: string) => Promise>>} */ const mockFetch = vi.fn(); + // Mock global fetch -global.fetch = mockFetch; +global.fetch = /** @type {import('vitest').MockedFunction} */ (mockFetch); const mockGithub = createMockGithub(); const mockContext = createMockContext(); @@ -61,23 +64,26 @@ describe("sdk-breaking-change-labels", () => { // Second fetch - artifact content const language = "azure-sdk-for-js"; + const mockContentResponse = { ok: true, text: vi.fn().mockResolvedValue( - JSON.stringify({ - labelAction: true, - language, - prNumber: "123", - }), + JSON.stringify( + createMockSpecGenSdkArtifactInfo({ + labelAction: true, + language, + prNumber: "123", + }), + ), ), }; // Setup fetch to return different responses for each call mockFetch.mockImplementation((url) => { if (url.includes("artifacts?artifactName=")) { - return mockArtifactResponse; + return Promise.resolve(mockArtifactResponse); } else { - return mockContentResponse; + return Promise.resolve(mockContentResponse); } }); @@ -90,6 +96,7 @@ describe("sdk-breaking-change-labels", () => { // Verify result expect(result).toEqual({ + headSha: "abc123", labelName: sdkLabels[language].breakingChange, labelAction: LabelAction.Add, issueNumber: 123, @@ -117,23 +124,24 @@ describe("sdk-breaking-change-labels", () => { }; const language = "azure-sdk-for-js"; + const mockContentResponse = { ok: true, - text: vi.fn().mockResolvedValue( - JSON.stringify({ - labelAction: false, - language, - prNumber: "123", - }), - ), + text: vi + .fn() + .mockResolvedValue( + JSON.stringify( + createMockSpecGenSdkArtifactInfo({ labelAction: false, language, prNumber: "123" }), + ), + ), }; // Setup fetch to return different responses for each call mockFetch.mockImplementation((url) => { if (url.includes("artifacts?artifactName=")) { - return mockArtifactResponse; + return Promise.resolve(mockArtifactResponse); } else { - return mockContentResponse; + return Promise.resolve(mockContentResponse); } }); @@ -146,6 +154,7 @@ describe("sdk-breaking-change-labels", () => { // Verify result has Remove action expect(result).toEqual({ + headSha: "abc123", labelName: sdkLabels[language].breakingChange, labelAction: LabelAction.Remove, issueNumber: 123, @@ -176,20 +185,22 @@ describe("sdk-breaking-change-labels", () => { const mockContentResponse = { ok: true, text: vi.fn().mockResolvedValue( - JSON.stringify({ - labelAction: false, - language, - prNumber: "123", - }), + JSON.stringify( + createMockSpecGenSdkArtifactInfo({ + labelAction: false, + language, + prNumber: "123", + }), + ), ), }; // Setup fetch to return different responses for each call mockFetch.mockImplementation((url) => { if (url.includes("artifacts?artifactName=")) { - return mockArtifactResponse; + return Promise.resolve(mockArtifactResponse); } else { - return mockContentResponse; + return Promise.resolve(mockContentResponse); } }); @@ -202,6 +213,7 @@ describe("sdk-breaking-change-labels", () => { // Verify result has none action expect(result).toEqual({ + headSha: "abc123", labelName: sdkLabels[language].breakingChange, labelAction: LabelAction.None, issueNumber: 123, @@ -343,11 +355,7 @@ describe("sdk-breaking-change-labels", () => { }; // Setup fetch to return different responses for each call - mockFetch.mockImplementation((url) => { - if (url.includes("artifacts?artifactName=")) { - return mockArtifactResponse; - } - }); + mockFetch.mockResolvedValue(mockArtifactResponse); // Call function and expect it to throw await expect( @@ -374,11 +382,7 @@ describe("sdk-breaking-change-labels", () => { }; // Setup fetch to return different responses for each call - mockFetch.mockImplementation((url) => { - if (url.includes("artifacts?artifactName=")) { - return mockArtifactResponse; - } - }); + mockFetch.mockResolvedValue(mockArtifactResponse); // Call function and expect it to throw await expect( @@ -419,9 +423,9 @@ describe("sdk-breaking-change-labels", () => { // Setup fetch to return different responses for each call mockFetch.mockImplementation((url) => { if (url.includes("artifacts?artifactName=")) { - return mockArtifactResponse; + return Promise.resolve(mockArtifactResponse); } else { - return mockContentResponse; + return Promise.resolve(mockContentResponse); } }); diff --git a/.github/workflows/test/spec-gen-sdk-status.test.js b/.github/workflows/test/spec-gen-sdk-status.test.js index e9ae2eb107d0..48d653440ca8 100644 --- a/.github/workflows/test/spec-gen-sdk-status.test.js +++ b/.github/workflows/test/spec-gen-sdk-status.test.js @@ -1,5 +1,6 @@ import fs from "fs"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { createMockSpecGenSdkArtifactInfo } from "../../shared/test/sdk-types.js"; import * as artifacts from "../src/artifacts.js"; import * as github from "../src/github.js"; import { setSpecGenSdkStatusImpl } from "../src/spec-gen-sdk-status.js"; @@ -31,21 +32,23 @@ describe("spec-gen-sdk-status", () => { .spyOn(artifacts, "getAzurePipelineArtifact") // eslint-disable-next-line @typescript-eslint/no-unused-vars .mockImplementation(async ({ ado_build_id, ado_project_url, artifactName }) => { - return { - artifactData: JSON.stringify({ - language: "test-language", - result: "succeeded", - isSpecGenSdkCheckRequired: true, - }), - }; + return Promise.resolve({ + artifactData: JSON.stringify( + createMockSpecGenSdkArtifactInfo({ + language: "azure-sdk-for-go", + result: "succeeded", + isSpecGenSdkCheckRequired: true, + }), + ), + }); }); writeToActionsSummaryMock = vi .spyOn(github, "writeToActionsSummary") // eslint-disable-next-line @typescript-eslint/no-unused-vars - .mockImplementation(async (content, core) => { + .mockImplementation((content, core) => { // Implementation that just returns - return; + return Promise.resolve(); }); appendFileSyncMock = vi.spyOn(fs, "appendFileSync").mockImplementation(vi.fn()); @@ -122,11 +125,13 @@ describe("spec-gen-sdk-status", () => { // Mock getAzurePipelineArtifact to return success data getAzurePipelineArtifactMock.mockResolvedValue({ - artifactData: JSON.stringify({ - language: "test-language", - result: "succeeded", - isSpecGenSdkCheckRequired: true, - }), + artifactData: JSON.stringify( + createMockSpecGenSdkArtifactInfo({ + language: "azure-sdk-for-go", + result: "succeeded", + isSpecGenSdkCheckRequired: true, + }), + ), }); // Call the function @@ -176,22 +181,26 @@ describe("spec-gen-sdk-status", () => { }); // Mock getAzurePipelineArtifact to return mixed results - getAzurePipelineArtifactMock.mockImplementation(async ({ ado_build_id }) => { + getAzurePipelineArtifactMock.mockImplementation(({ ado_build_id }) => { if (ado_build_id === "123") { return { - artifactData: JSON.stringify({ - language: "test-language-1", - result: "succeeded", - isSpecGenSdkCheckRequired: true, - }), + artifactData: JSON.stringify( + createMockSpecGenSdkArtifactInfo({ + language: "azure-sdk-for-go", + result: "succeeded", + isSpecGenSdkCheckRequired: true, + }), + ), }; } else { return { - artifactData: JSON.stringify({ - language: "test-language-2", - result: "failed", - isSpecGenSdkCheckRequired: true, - }), + artifactData: JSON.stringify( + createMockSpecGenSdkArtifactInfo({ + language: "azure-sdk-for-java", + result: "failed", + isSpecGenSdkCheckRequired: true, + }), + ), }; } }); @@ -214,7 +223,7 @@ describe("spec-gen-sdk-status", () => { repo: "testRepo", sha: "testSha", state: "failure", - description: expect.stringContaining("failed for"), + description: /** @type {unknown} */ (expect.stringContaining("failed for")), }), ); }); @@ -308,22 +317,26 @@ describe("spec-gen-sdk-status", () => { }); // Mock getAzurePipelineArtifact to return mixed results - getAzurePipelineArtifactMock.mockImplementation(async ({ ado_build_id }) => { + getAzurePipelineArtifactMock.mockImplementation(({ ado_build_id }) => { if (ado_build_id === "123") { return { - artifactData: JSON.stringify({ - language: "test-language-1", - result: "succeeded", - isSpecGenSdkCheckRequired: true, - }), + artifactData: JSON.stringify( + createMockSpecGenSdkArtifactInfo({ + language: "azure-sdk-for-go", + result: "succeeded", + isSpecGenSdkCheckRequired: true, + }), + ), }; } else { return { - artifactData: JSON.stringify({ - language: "test-language-2", - result: "failed", - isSpecGenSdkCheckRequired: false, // Not required - }), + artifactData: JSON.stringify( + createMockSpecGenSdkArtifactInfo({ + language: "azure-sdk-for-java", + result: "failed", + isSpecGenSdkCheckRequired: false, // Not required + }), + ), }; } }); diff --git a/eng/tools/spec-gen-sdk-runner/package.json b/eng/tools/spec-gen-sdk-runner/package.json index 87bf60e2f5ba..0af7f14d807b 100644 --- a/eng/tools/spec-gen-sdk-runner/package.json +++ b/eng/tools/spec-gen-sdk-runner/package.json @@ -19,6 +19,9 @@ "engines": { "node": ">=20.0.0" }, + "dependencies": { + "@azure-tools/specs-shared": "file:../../../.github/shared" + }, "devDependencies": { "@types/node": "^20.0.0", "@vitest/coverage-v8": "^3.1.2", diff --git a/eng/tools/spec-gen-sdk-runner/src/command-helpers.ts b/eng/tools/spec-gen-sdk-runner/src/command-helpers.ts index fc42f69a1b4b..82898a6bf8e6 100644 --- a/eng/tools/spec-gen-sdk-runner/src/command-helpers.ts +++ b/eng/tools/spec-gen-sdk-runner/src/command-helpers.ts @@ -1,16 +1,10 @@ +import { APIViewRequestData, SpecGenSdkArtifactInfo } from "@azure-tools/specs-shared/sdk-types"; import fs from "node:fs"; import path from "node:path"; import { fileURLToPath } from "node:url"; import { LogIssueType, LogLevel, logMessage, setVsoVariable, vsoLogIssue } from "./log.js"; import { groupSpecConfigPaths } from "./spec-helpers.js"; -import { - APIViewRequestData, - SdkName, - SpecGenSdkArtifactInfo, - SpecGenSdkCmdInput, - SpecGenSdkRequiredSettings, - VsoLogs, -} from "./types.js"; +import { SdkName, SpecGenSdkCmdInput, SpecGenSdkRequiredSettings, VsoLogs } from "./types.js"; import { findReadmeFiles, getAllTypeSpecPaths, diff --git a/eng/tools/spec-gen-sdk-runner/src/commands.ts b/eng/tools/spec-gen-sdk-runner/src/commands.ts index 07ebe91feb45..6a897db36352 100644 --- a/eng/tools/spec-gen-sdk-runner/src/commands.ts +++ b/eng/tools/spec-gen-sdk-runner/src/commands.ts @@ -1,3 +1,4 @@ +import { APIViewRequestData } from "@azure-tools/specs-shared/sdk-types"; import fs from "node:fs"; import path from "node:path"; import { @@ -13,7 +14,7 @@ import { } from "./command-helpers.js"; import { LogLevel, logMessage, vsoAddAttachment, vsoLogIssue } from "./log.js"; import { detectChangedSpecConfigFiles } from "./spec-helpers.js"; -import { APIViewRequestData, SpecGenSdkCmdInput } from "./types.js"; +import { SpecGenSdkCmdInput } from "./types.js"; import { resetGitRepo, runSpecGenSdkCommand, SpecConfigs } from "./utils.js"; /** diff --git a/eng/tools/spec-gen-sdk-runner/src/types.ts b/eng/tools/spec-gen-sdk-runner/src/types.ts index 9a4c6aae7d8b..4c131aee7d81 100644 --- a/eng/tools/spec-gen-sdk-runner/src/types.ts +++ b/eng/tools/spec-gen-sdk-runner/src/types.ts @@ -19,14 +19,6 @@ export interface SpecGenSdkCmdInput { headBranch?: string; } -/** - * Data for the API view request. - */ -export interface APIViewRequestData { - packageName: string; - filePath: string; -} - /* * VsoLogs is a map of task names to log entries. Each log entry contains an array of errors and warnings. */ @@ -38,19 +30,6 @@ export type VsoLogs = Map< } >; -/** - * Represents the result of the spec-gen-sdk generation process. - */ -export interface SpecGenSdkArtifactInfo { - language: string; - result: string; - headSha: string; - prNumber?: string; - labelAction?: boolean; - isSpecGenSdkCheckRequired: boolean; - apiViewRequestData: APIViewRequestData[]; -} - /** * Represents supported SDK language identifiers. */ diff --git a/eng/tools/spec-gen-sdk-runner/test/command-helpers.test.ts b/eng/tools/spec-gen-sdk-runner/test/command-helpers.test.ts index 95f31c1943a2..b0ac2bf202b8 100644 --- a/eng/tools/spec-gen-sdk-runner/test/command-helpers.test.ts +++ b/eng/tools/spec-gen-sdk-runner/test/command-helpers.test.ts @@ -1,3 +1,4 @@ +import { APIViewRequestData } from "@azure-tools/specs-shared/sdk-types"; import fs from "node:fs"; import path from "node:path"; import { fileURLToPath } from "node:url"; @@ -15,7 +16,6 @@ import { import * as log from "../src/log.js"; import { LogLevel } from "../src/log.js"; import * as specHelpers from "../src/spec-helpers.js"; -import { APIViewRequestData } from "../src/types.js"; import * as utils from "../src/utils.js"; // Get the absolute path to the repo root diff --git a/eng/tools/spec-gen-sdk-runner/test/utils/extractServiceName.test.ts b/eng/tools/spec-gen-sdk-runner/test/utils/extractServiceName.test.ts index ca8ccdbf22ce..4873a46e0ab6 100644 --- a/eng/tools/spec-gen-sdk-runner/test/utils/extractServiceName.test.ts +++ b/eng/tools/spec-gen-sdk-runner/test/utils/extractServiceName.test.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from "vitest"; -import { extractServiceName } from "../../src/utils"; +import { extractServiceName } from "../../src/utils.js"; describe("extractServiceName", () => { test("extracts service name from valid path", () => { diff --git a/eng/tools/spec-gen-sdk-runner/tsconfig.json b/eng/tools/spec-gen-sdk-runner/tsconfig.json index ec85640f015c..065f67857f3c 100644 --- a/eng/tools/spec-gen-sdk-runner/tsconfig.json +++ b/eng/tools/spec-gen-sdk-runner/tsconfig.json @@ -3,9 +3,11 @@ "compilerOptions": { "outDir": "./dist", "rootDir": ".", - "module": "ESNext", - "target": "ESNext", - "moduleResolution": "node", + "allowJs": true, }, - "include": ["*.ts", "src/**/*.ts", "test/**/*.ts"], + "include": [ + "*.ts", + "src/**/*.ts", + "test/**/*.ts" + ], } diff --git a/package-lock.json b/package-lock.json index 714ca8d5d890..241185ed28ab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -387,6 +387,9 @@ "name": "@azure-tools/spec-gen-sdk-runner", "version": "0.0.1", "dev": true, + "dependencies": { + "@azure-tools/specs-shared": "file:../../../.github/shared" + }, "bin": { "spec-gen-sdk-runner": "cmd/spec-gen-sdk-runner.js" }, From ee447980ef173279452c338078bbdef21aa8fa85 Mon Sep 17 00:00:00 2001 From: Mike Harder Date: Fri, 14 Nov 2025 13:25:59 -0800 Subject: [PATCH 02/15] whitespace --- .github/shared/test/sdk-types.js | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/shared/test/sdk-types.js b/.github/shared/test/sdk-types.js index cd48727b961d..beeb62514191 100644 --- a/.github/shared/test/sdk-types.js +++ b/.github/shared/test/sdk-types.js @@ -4,6 +4,7 @@ /** * Create a mock SpecGenSdkArtifactInfo, filling unspecified properties with defaults. + * * @param {Partial} [overrides] * @returns {SpecGenSdkArtifactInfo} */ From 8e1749e312dec5e337f7cbe84107bfbdbbe96971 Mon Sep 17 00:00:00 2001 From: Mike Harder Date: Fri, 14 Nov 2025 13:29:13 -0800 Subject: [PATCH 03/15] whitespace --- .github/workflows/test/sdk-breaking-change-labels.test.js | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/test/sdk-breaking-change-labels.test.js b/.github/workflows/test/sdk-breaking-change-labels.test.js index bf4fa60ab106..0dfe0c8c4afa 100644 --- a/.github/workflows/test/sdk-breaking-change-labels.test.js +++ b/.github/workflows/test/sdk-breaking-change-labels.test.js @@ -64,7 +64,6 @@ describe("sdk-breaking-change-labels", () => { // Second fetch - artifact content const language = "azure-sdk-for-js"; - const mockContentResponse = { ok: true, text: vi.fn().mockResolvedValue( From 0524f9a6b66adbdbd5056ef835ca25ee2d1f335c Mon Sep 17 00:00:00 2001 From: Mike Harder Date: Fri, 14 Nov 2025 13:29:56 -0800 Subject: [PATCH 04/15] whitespace --- .github/workflows/test/sdk-breaking-change-labels.test.js | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/test/sdk-breaking-change-labels.test.js b/.github/workflows/test/sdk-breaking-change-labels.test.js index 0dfe0c8c4afa..96615e3875c5 100644 --- a/.github/workflows/test/sdk-breaking-change-labels.test.js +++ b/.github/workflows/test/sdk-breaking-change-labels.test.js @@ -123,7 +123,6 @@ describe("sdk-breaking-change-labels", () => { }; const language = "azure-sdk-for-js"; - const mockContentResponse = { ok: true, text: vi From 5a197a6bcd576928de6c402fd981b392eb35c438 Mon Sep 17 00:00:00 2001 From: Mike Harder Date: Fri, 14 Nov 2025 21:46:43 +0000 Subject: [PATCH 05/15] SpecGenSdkCmdInput.sdkLanguage should use type SdkName --- .github/shared/src/sdk-types.js | 3 +++ .../spec-gen-sdk-runner/src/command-helpers.ts | 8 ++++++-- eng/tools/spec-gen-sdk-runner/src/types.ts | 14 +++----------- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/.github/shared/src/sdk-types.js b/.github/shared/src/sdk-types.js index 57c2884404d2..fe1173fff1b2 100644 --- a/.github/shared/src/sdk-types.js +++ b/.github/shared/src/sdk-types.js @@ -1,5 +1,8 @@ import * as z from "zod"; +/* + * Represents supported SDK language identifiers. + */ const SdkNameSchema = z.enum([ "azure-sdk-for-go", "azure-sdk-for-java", diff --git a/eng/tools/spec-gen-sdk-runner/src/command-helpers.ts b/eng/tools/spec-gen-sdk-runner/src/command-helpers.ts index 82898a6bf8e6..500c89d33cfc 100644 --- a/eng/tools/spec-gen-sdk-runner/src/command-helpers.ts +++ b/eng/tools/spec-gen-sdk-runner/src/command-helpers.ts @@ -1,10 +1,14 @@ -import { APIViewRequestData, SpecGenSdkArtifactInfo } from "@azure-tools/specs-shared/sdk-types"; +import { + APIViewRequestData, + SdkName, + SpecGenSdkArtifactInfo, +} from "@azure-tools/specs-shared/sdk-types"; import fs from "node:fs"; import path from "node:path"; import { fileURLToPath } from "node:url"; import { LogIssueType, LogLevel, logMessage, setVsoVariable, vsoLogIssue } from "./log.js"; import { groupSpecConfigPaths } from "./spec-helpers.js"; -import { SdkName, SpecGenSdkCmdInput, SpecGenSdkRequiredSettings, VsoLogs } from "./types.js"; +import { SpecGenSdkCmdInput, SpecGenSdkRequiredSettings, VsoLogs } from "./types.js"; import { findReadmeFiles, getAllTypeSpecPaths, diff --git a/eng/tools/spec-gen-sdk-runner/src/types.ts b/eng/tools/spec-gen-sdk-runner/src/types.ts index 4c131aee7d81..8ba8eced66e6 100644 --- a/eng/tools/spec-gen-sdk-runner/src/types.ts +++ b/eng/tools/spec-gen-sdk-runner/src/types.ts @@ -1,3 +1,5 @@ +import { SdkName } from "@azure-tools/specs-shared/sdk-types"; + /** * Represents the input parameters required for spec-gen-sdk command execution. */ @@ -9,7 +11,7 @@ export interface SpecGenSdkCmdInput { tspConfigPath?: string; readmePath?: string; sdkRepoName: string; - sdkLanguage: string; + sdkLanguage: SdkName; apiVersion?: string; prNumber?: string; sdkReleaseType?: string; @@ -30,16 +32,6 @@ export type VsoLogs = Map< } >; -/** - * Represents supported SDK language identifiers. - */ -export type SdkName = - | "azure-sdk-for-go" - | "azure-sdk-for-java" - | "azure-sdk-for-js" - | "azure-sdk-for-net" - | "azure-sdk-for-python"; - /** * Represents the plane types for SDK generation settings */ From 3a44525b834295b7058124b806b41f5357a663f7 Mon Sep 17 00:00:00 2001 From: Mike Harder Date: Sat, 15 Nov 2025 01:53:12 +0000 Subject: [PATCH 06/15] export schemas --- .github/shared/src/sdk-types.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/shared/src/sdk-types.js b/.github/shared/src/sdk-types.js index fe1173fff1b2..bec9dc9d9b2c 100644 --- a/.github/shared/src/sdk-types.js +++ b/.github/shared/src/sdk-types.js @@ -3,7 +3,7 @@ import * as z from "zod"; /* * Represents supported SDK language identifiers. */ -const SdkNameSchema = z.enum([ +export const SdkNameSchema = z.enum([ "azure-sdk-for-go", "azure-sdk-for-java", "azure-sdk-for-js", @@ -17,7 +17,7 @@ const SdkNameSchema = z.enum([ /* * Data for the API view request. */ -const APIViewRequestDataSchema = z.object({ packageName: z.string(), filePath: z.string() }); +export const APIViewRequestDataSchema = z.object({ packageName: z.string(), filePath: z.string() }); /** * @typedef {import("zod").infer} APIViewRequestData */ From 5a789883126e2328f3b379918cc5062ad66e53a1 Mon Sep 17 00:00:00 2001 From: Mike Harder Date: Sat, 15 Nov 2025 01:53:24 +0000 Subject: [PATCH 07/15] use schema --- eng/tools/spec-gen-sdk-runner/src/command-helpers.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/eng/tools/spec-gen-sdk-runner/src/command-helpers.ts b/eng/tools/spec-gen-sdk-runner/src/command-helpers.ts index 500c89d33cfc..c18366ff10b4 100644 --- a/eng/tools/spec-gen-sdk-runner/src/command-helpers.ts +++ b/eng/tools/spec-gen-sdk-runner/src/command-helpers.ts @@ -1,6 +1,7 @@ import { APIViewRequestData, SdkName, + SdkNameSchema, SpecGenSdkArtifactInfo, } from "@azure-tools/specs-shared/sdk-types"; import fs from "node:fs"; @@ -91,7 +92,7 @@ export function parseArguments(): SpecGenSdkCmdInput { localSpecRepoPath, localSdkRepoPath, sdkRepoName, - sdkLanguage: sdkRepoName.replace("-pr", ""), + sdkLanguage: SdkNameSchema.parse(sdkRepoName.replace("-pr", "")), runMode, tspConfigPath: getArgumentValue(args, "--tsp-config-relative-path", ""), readmePath: getArgumentValue(args, "--readme-relative-path", ""), From 4190c8021560fb48d6cb15384a3377d3fe84734b Mon Sep 17 00:00:00 2001 From: Mike Harder Date: Tue, 18 Nov 2025 17:55:39 +0000 Subject: [PATCH 08/15] [sdk-types.js] Convert to runtime enum --- .github/shared/src/sdk-types.js | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/.github/shared/src/sdk-types.js b/.github/shared/src/sdk-types.js index bec9dc9d9b2c..2d85c9471e4f 100644 --- a/.github/shared/src/sdk-types.js +++ b/.github/shared/src/sdk-types.js @@ -1,18 +1,20 @@ import * as z from "zod"; -/* - * Represents supported SDK language identifiers. - */ -export const SdkNameSchema = z.enum([ - "azure-sdk-for-go", - "azure-sdk-for-java", - "azure-sdk-for-js", - "azure-sdk-for-net", - "azure-sdk-for-python", -]); /** - * @typedef {import("zod").infer} SdkName + * Represents supported SDK language identifiers. + * + * @readonly + * @enum {"azure-sdk-for-go" | "azure-sdk-for-java" | "azure-sdk-for-js" | "azure-sdk-for-net" | "azure-sdk-for-python"} */ +export const SdkName = Object.freeze({ + Go: "azure-sdk-for-go", + Java: "azure-sdk-for-java", + Js: "azure-sdk-for-js", + Net: "azure-sdk-for-net", + Python: "azure-sdk-for-python", +}); +/** @type {import("zod").ZodType} */ +export const SdkNameSchema = z.enum(Object.values(SdkName)); /* * Data for the API view request. From 36d8fb10d184402e33b2885f3c23be03120eeb8c Mon Sep 17 00:00:00 2001 From: Mike Harder Date: Tue, 18 Nov 2025 17:55:54 +0000 Subject: [PATCH 09/15] [command-helpers.test.js] Use runtime enum --- .../spec-gen-sdk-runner/test/command-helpers.test.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/eng/tools/spec-gen-sdk-runner/test/command-helpers.test.ts b/eng/tools/spec-gen-sdk-runner/test/command-helpers.test.ts index b0ac2bf202b8..fb17f03de1a5 100644 --- a/eng/tools/spec-gen-sdk-runner/test/command-helpers.test.ts +++ b/eng/tools/spec-gen-sdk-runner/test/command-helpers.test.ts @@ -1,4 +1,4 @@ -import { APIViewRequestData } from "@azure-tools/specs-shared/sdk-types"; +import { APIViewRequestData, SdkName } from "@azure-tools/specs-shared/sdk-types"; import fs from "node:fs"; import path from "node:path"; import { fileURLToPath } from "node:url"; @@ -152,7 +152,7 @@ describe("commands.ts", () => { headBranch: "main", apiVersion: "2021-01-01", sdkReleaseType: "beta", - sdkLanguage: "typescript", + sdkLanguage: SdkName.Js, }; const result = prepareSpecGenSdkCommand(commandInput); @@ -417,7 +417,7 @@ describe("commands.ts", () => { const mockCommandInput = { workingFolder: "/working/folder", - sdkLanguage: "azure-sdk-for-js", + sdkLanguage: SdkName.Js, runMode: "", localSpecRepoPath: "", localSdkRepoPath: "", @@ -498,7 +498,7 @@ describe("commands.ts", () => { const mockCommandInput = { workingFolder: "/working/folder", - sdkLanguage: "javascript", + sdkLanguage: SdkName.Js, runMode: "", localSpecRepoPath: "", localSdkRepoPath: "", @@ -545,7 +545,7 @@ describe("commands.ts", () => { const mockCommandInput = { workingFolder: "/working/folder", - sdkLanguage: "azure-sdk-for-go", + sdkLanguage: SdkName.Go, runMode: "", localSpecRepoPath: "", localSdkRepoPath: "", From 9269d890721ed5aa287ac8e8824eac19a89280c2 Mon Sep 17 00:00:00 2001 From: Mike Harder Date: Tue, 18 Nov 2025 18:04:28 +0000 Subject: [PATCH 10/15] commands.test.ts --- .../spec-gen-sdk-runner/test/commands.test.ts | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/eng/tools/spec-gen-sdk-runner/test/commands.test.ts b/eng/tools/spec-gen-sdk-runner/test/commands.test.ts index 0b55917251dc..146781aec710 100644 --- a/eng/tools/spec-gen-sdk-runner/test/commands.test.ts +++ b/eng/tools/spec-gen-sdk-runner/test/commands.test.ts @@ -1,3 +1,4 @@ +import { SdkName } from "@azure-tools/specs-shared/sdk-types"; import fs from "node:fs"; import path from "node:path"; import { beforeEach, describe, expect, test, vi, type Mock } from "vitest"; @@ -33,7 +34,7 @@ describe("generateSdkForSingleSpec", () => { runMode: "release", localSdkRepoPath: "/sdk/path", sdkRepoName: "azure-sdk-for-js", - sdkLanguage: "javascript", + sdkLanguage: SdkName.Js, specCommitSha: "", specRepoHttpsUrl: "", }; @@ -103,7 +104,7 @@ describe("generateSdkForSingleSpec", () => { runMode: "batch", localSdkRepoPath: "/sdk/path", sdkRepoName: "azure-sdk-for-js", - sdkLanguage: "javascript", + sdkLanguage: SdkName.Js, specCommitSha: "", specRepoHttpsUrl: "", }; @@ -142,7 +143,7 @@ describe("generateSdkForSingleSpec", () => { runMode: "batch", localSdkRepoPath: "/sdk/path", sdkRepoName: "azure-sdk-for-js", - sdkLanguage: "javascript", + sdkLanguage: SdkName.Js, specCommitSha: "", specRepoHttpsUrl: "", }; @@ -184,7 +185,7 @@ describe("generateSdkForSpecPr", () => { workingFolder: "/working/folder", runMode: "batch", sdkRepoName: "azure-sdk-for-js", - sdkLanguage: "javascript", + sdkLanguage: SdkName.Js, specCommitSha: "", specRepoHttpsUrl: "", }; @@ -256,7 +257,7 @@ describe("generateSdkForSpecPr", () => { workingFolder: "/working/folder", runMode: "spec-pull-request", sdkRepoName: "azure-sdk-for-js", - sdkLanguage: "javascript", + sdkLanguage: SdkName.Js, specCommitSha: "", specRepoHttpsUrl: "", }; @@ -298,7 +299,7 @@ describe("generateSdkForSpecPr", () => { workingFolder: "/working/folder", runMode: "batch", sdkRepoName: "azure-sdk-for-js", - sdkLanguage: "javascript", + sdkLanguage: SdkName.Js, specCommitSha: "", specRepoHttpsUrl: "", }; @@ -337,7 +338,7 @@ describe("generateSdkForSpecPr", () => { workingFolder: "/working/folder", runMode: "batch", sdkRepoName: "azure-sdk-for-js", - sdkLanguage: "javascript", + sdkLanguage: SdkName.Js, specCommitSha: "", specRepoHttpsUrl: "", }; @@ -384,7 +385,7 @@ describe("generateSdkForSpecPr", () => { workingFolder: "/working/folder", runMode: "batch", sdkRepoName: "azure-sdk-for-js", - sdkLanguage: "javascript", + sdkLanguage: SdkName.Js, specCommitSha: "", specRepoHttpsUrl: "", }; @@ -436,7 +437,7 @@ describe("generateSdkForBatchSpecs", () => { runMode: "batch", localSdkRepoPath: "/sdk/path", sdkRepoName: "azure-sdk-for-js", - sdkLanguage: "javascript", + sdkLanguage: SdkName.Js, specCommitSha: "", specRepoHttpsUrl: "", }; @@ -504,7 +505,7 @@ describe("generateSdkForBatchSpecs", () => { runMode: "batch", localSdkRepoPath: "/sdk/path", sdkRepoName: "azure-sdk-for-js", - sdkLanguage: "javascript", + sdkLanguage: SdkName.Js, specCommitSha: "", specRepoHttpsUrl: "", }; @@ -564,7 +565,7 @@ describe("generateSdkForBatchSpecs", () => { runMode: "batch", localSdkRepoPath: "/sdk/path", sdkRepoName: "azure-sdk-for-js", - sdkLanguage: "javascript", + sdkLanguage: SdkName.Js, specCommitSha: "", specRepoHttpsUrl: "", }; From 6b174fa86f13d607d4c51cbc82abbc3e4b9abe94 Mon Sep 17 00:00:00 2001 From: Mike Harder Date: Tue, 18 Nov 2025 18:08:09 +0000 Subject: [PATCH 11/15] spec-helpers.test.ts --- eng/tools/spec-gen-sdk-runner/test/spec-helpers.test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/eng/tools/spec-gen-sdk-runner/test/spec-helpers.test.ts b/eng/tools/spec-gen-sdk-runner/test/spec-helpers.test.ts index 696e3132ca4c..340506a8879f 100644 --- a/eng/tools/spec-gen-sdk-runner/test/spec-helpers.test.ts +++ b/eng/tools/spec-gen-sdk-runner/test/spec-helpers.test.ts @@ -1,3 +1,4 @@ +import { SdkName } from "@azure-tools/specs-shared/sdk-types"; import path from "node:path"; import { fileURLToPath } from "node:url"; import { beforeEach, describe, expect, test, vi } from "vitest"; @@ -55,7 +56,7 @@ describe("detectChangedSpecConfigFiles", () => { runMode: "", localSdkRepoPath: "", sdkRepoName: "", - sdkLanguage: "", + sdkLanguage: SdkName.Go, specCommitSha: "", specRepoHttpsUrl: "", }; From 82ff3ecbe962e0384e90aa7adf45cf92194e2e3a Mon Sep 17 00:00:00 2001 From: Mike Harder Date: Tue, 18 Nov 2025 18:13:31 +0000 Subject: [PATCH 12/15] format --- eng/tools/spec-gen-sdk-runner/tsconfig.json | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/eng/tools/spec-gen-sdk-runner/tsconfig.json b/eng/tools/spec-gen-sdk-runner/tsconfig.json index 065f67857f3c..5f48d4c6a5b5 100644 --- a/eng/tools/spec-gen-sdk-runner/tsconfig.json +++ b/eng/tools/spec-gen-sdk-runner/tsconfig.json @@ -5,9 +5,5 @@ "rootDir": ".", "allowJs": true, }, - "include": [ - "*.ts", - "src/**/*.ts", - "test/**/*.ts" - ], + "include": ["*.ts", "src/**/*.ts", "test/**/*.ts"], } From a79e05acef9d1701a42c897034d0d9c2d6130f57 Mon Sep 17 00:00:00 2001 From: Mike Harder Date: Tue, 18 Nov 2025 18:18:59 +0000 Subject: [PATCH 13/15] use enum in test --- .github/shared/test/sdk-types.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/shared/test/sdk-types.js b/.github/shared/test/sdk-types.js index beeb62514191..d8de91476e15 100644 --- a/.github/shared/test/sdk-types.js +++ b/.github/shared/test/sdk-types.js @@ -1,3 +1,5 @@ +import { SdkName } from "../src/sdk-types.js"; + /** * @typedef {import("../src/sdk-types.js").SpecGenSdkArtifactInfo} SpecGenSdkArtifactInfo */ @@ -14,7 +16,7 @@ export function createMockSpecGenSdkArtifactInfo(overrides = {}) { apiViewRequestData: [], headSha: "abc123", isSpecGenSdkCheckRequired: true, - language: "azure-sdk-for-go", + language: SdkName.Js, result: "test result", }; From b553ef0f78f681573bfb0bc92ae4347c9cd6ac02 Mon Sep 17 00:00:00 2001 From: Mike Harder Date: Tue, 18 Nov 2025 18:19:19 +0000 Subject: [PATCH 14/15] use go --- .github/shared/test/sdk-types.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/shared/test/sdk-types.js b/.github/shared/test/sdk-types.js index d8de91476e15..6027697d48a7 100644 --- a/.github/shared/test/sdk-types.js +++ b/.github/shared/test/sdk-types.js @@ -16,7 +16,7 @@ export function createMockSpecGenSdkArtifactInfo(overrides = {}) { apiViewRequestData: [], headSha: "abc123", isSpecGenSdkCheckRequired: true, - language: SdkName.Js, + language: SdkName.Go, result: "test result", }; From 8e1d539da364a85dd80f4911540352d72384e8d5 Mon Sep 17 00:00:00 2001 From: Mike Harder Date: Tue, 18 Nov 2025 18:21:48 +0000 Subject: [PATCH 15/15] more enums --- .github/workflows/test/spec-gen-sdk-status.test.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/test/spec-gen-sdk-status.test.js b/.github/workflows/test/spec-gen-sdk-status.test.js index 48d653440ca8..9e3c7e68744b 100644 --- a/.github/workflows/test/spec-gen-sdk-status.test.js +++ b/.github/workflows/test/spec-gen-sdk-status.test.js @@ -1,5 +1,6 @@ import fs from "fs"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { SdkName } from "../../shared/src/sdk-types.js"; import { createMockSpecGenSdkArtifactInfo } from "../../shared/test/sdk-types.js"; import * as artifacts from "../src/artifacts.js"; import * as github from "../src/github.js"; @@ -35,7 +36,7 @@ describe("spec-gen-sdk-status", () => { return Promise.resolve({ artifactData: JSON.stringify( createMockSpecGenSdkArtifactInfo({ - language: "azure-sdk-for-go", + language: SdkName.Go, result: "succeeded", isSpecGenSdkCheckRequired: true, }), @@ -127,7 +128,7 @@ describe("spec-gen-sdk-status", () => { getAzurePipelineArtifactMock.mockResolvedValue({ artifactData: JSON.stringify( createMockSpecGenSdkArtifactInfo({ - language: "azure-sdk-for-go", + language: SdkName.Go, result: "succeeded", isSpecGenSdkCheckRequired: true, }), @@ -186,7 +187,7 @@ describe("spec-gen-sdk-status", () => { return { artifactData: JSON.stringify( createMockSpecGenSdkArtifactInfo({ - language: "azure-sdk-for-go", + language: SdkName.Go, result: "succeeded", isSpecGenSdkCheckRequired: true, }), @@ -196,7 +197,7 @@ describe("spec-gen-sdk-status", () => { return { artifactData: JSON.stringify( createMockSpecGenSdkArtifactInfo({ - language: "azure-sdk-for-java", + language: SdkName.Java, result: "failed", isSpecGenSdkCheckRequired: true, }), @@ -322,7 +323,7 @@ describe("spec-gen-sdk-status", () => { return { artifactData: JSON.stringify( createMockSpecGenSdkArtifactInfo({ - language: "azure-sdk-for-go", + language: SdkName.Go, result: "succeeded", isSpecGenSdkCheckRequired: true, }), @@ -332,7 +333,7 @@ describe("spec-gen-sdk-status", () => { return { artifactData: JSON.stringify( createMockSpecGenSdkArtifactInfo({ - language: "azure-sdk-for-java", + language: SdkName.Java, result: "failed", isSpecGenSdkCheckRequired: false, // Not required }),