diff --git a/.chronus/changes/dependabot-submodules-core-72d544c-2024-6-31-8-54-14.md b/.chronus/changes/dependabot-submodules-core-72d544c-2024-6-31-8-54-14.md new file mode 100644 index 0000000000..41e66e9020 --- /dev/null +++ b/.chronus/changes/dependabot-submodules-core-72d544c-2024-6-31-8-54-14.md @@ -0,0 +1,7 @@ +--- +changeKind: feature +packages: + - "@azure-tools/typespec-autorest" +--- + +Add support for encoding numeric types as string \ No newline at end of file diff --git a/.chronus/changes/dependabot-submodules-core-72d544c-2024-6-31-8-54-18.md b/.chronus/changes/dependabot-submodules-core-72d544c-2024-6-31-8-54-18.md new file mode 100644 index 0000000000..e33df47351 --- /dev/null +++ b/.chronus/changes/dependabot-submodules-core-72d544c-2024-6-31-8-54-18.md @@ -0,0 +1,6 @@ +--- +changeKind: internal +packages: + - "@azure-tools/typespec-azure-core" +--- + diff --git a/core b/core index edf272da71..fa70428314 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit edf272da71ab47e953201ceab10b78466484b06f +Subproject commit fa704283140eb278d4c66a6e350969bd418d0575 diff --git a/packages/typespec-autorest/src/openapi.ts b/packages/typespec-autorest/src/openapi.ts index c66b4ef4c9..12fe3a8dce 100644 --- a/packages/typespec-autorest/src/openapi.ts +++ b/packages/typespec-autorest/src/openapi.ts @@ -2180,12 +2180,12 @@ export async function getOpenAPIForService( } function mergeFormatAndEncoding( format: string | undefined, - encoding: string, + encoding: string | undefined, encodeAsFormat: string | undefined - ): string { + ): string | undefined { switch (format) { case undefined: - return encodeAsFormat ?? encoding; + return encodeAsFormat ?? encoding ?? format; case "date-time": switch (encoding) { case "rfc3339": @@ -2205,7 +2205,7 @@ export async function getOpenAPIForService( return encodeAsFormat ?? encoding; } default: - return encodeAsFormat ?? encoding; + return encodeAsFormat ?? encoding ?? format; } } diff --git a/packages/typespec-autorest/test/primitive-types.test.ts b/packages/typespec-autorest/test/primitive-types.test.ts index a8b1be7330..4a9bdf89c6 100644 --- a/packages/typespec-autorest/test/primitive-types.test.ts +++ b/packages/typespec-autorest/test/primitive-types.test.ts @@ -221,11 +221,16 @@ describe("typespec-autorest: primitives", () => { async function testEncode( scalar: string, expectedOpenApi: OpenAPI2Schema, - encoding?: string, + encoding?: string | null, encodeAs?: string ) { const encodeAsParam = encodeAs ? `, ${encodeAs}` : ""; - const encodeDecorator = encoding ? `@encode("${encoding}"${encodeAsParam})` : ""; + const encodeDecorator = + encoding === null + ? `@encode(${encodeAs})` + : encoding !== undefined + ? `@encode("${encoding}"${encodeAsParam})` + : ""; const res1 = await oapiForModel("s", `${encodeDecorator} scalar s extends ${scalar};`); deepStrictEqual(res1.defs.s, expectedOpenApi); const res2 = await oapiForModel("Test", `model Test {${encodeDecorator} prop: ${scalar}};`); @@ -287,5 +292,19 @@ describe("typespec-autorest: primitives", () => { it("set format to base64url when encoding bytes as base64url", () => testEncode("bytes", { type: "string", format: "base64url" }, "base64url")); }); + + describe("int64", () => { + it("set type: integer and format to 'int64' by default", () => + testEncode("int64", { type: "integer", format: "int64" })); + it("set type: string and format to int64 when @encode(string)", () => + testEncode("int64", { type: "string", format: "int64" }, null, "string")); + }); + + describe("decimal128", () => { + it("set type: integer and format to 'int64' by default", () => + testEncode("decimal128", { type: "number", format: "decimal" })); + it("set type: string and format to int64 when @encode(string)", () => + testEncode("decimal128", { type: "string", format: "decimal" }, null, "string")); + }); }); }); diff --git a/packages/typespec-azure-core/src/rules/known-encoding.ts b/packages/typespec-azure-core/src/rules/known-encoding.ts index 2aa4e9e68a..4bd3978987 100644 --- a/packages/typespec-azure-core/src/rules/known-encoding.ts +++ b/packages/typespec-azure-core/src/rules/known-encoding.ts @@ -22,7 +22,7 @@ export const knownEncodingRule = createRule({ create(context) { function checkEncoding(type: ModelProperty | Scalar) { const encode = getEncode(context.program, type); - if (encode) { + if (encode && encode.encoding) { if (!knownEncodings.has(encode.encoding)) { context.reportDiagnostic({ format: { diff --git a/packages/typespec-client-generator-core/test/types/general-decorators-list.test.ts b/packages/typespec-client-generator-core/test/types/general-decorators-list.test.ts index a11d50683f..57ad1517e4 100644 --- a/packages/typespec-client-generator-core/test/types/general-decorators-list.test.ts +++ b/packages/typespec-client-generator-core/test/types/general-decorators-list.test.ts @@ -75,9 +75,9 @@ describe("typespec-client-generator-core: general decorators list", () => { strictEqual(models.length, 1); strictEqual(models[0].properties[0].decorators[0].name, "TypeSpec.@encode"); const encodeInfo = models[0].properties[0].decorators[0].arguments[ - "encoding" + "encodingOrEncodeAs" ] as SdkEnumValueType; - strictEqual(encodeInfo.value, "base64url"); + strictEqual((encodeInfo.value as any).value, "base64url"); expectDiagnostics(runner.context.diagnostics, []); }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 47320e7fc1..62402179ab 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -570,6 +570,55 @@ importers: specifier: ^2.0.4 version: 2.0.4(@types/node@18.11.19)(@vitest/ui@2.0.4(vitest@2.0.4))(happy-dom@14.12.3)(jsdom@24.1.1)(terser@5.31.3) + core/packages/http-server-csharp: + dependencies: + '@typespec/versioning': + specifier: workspace:~ + version: link:../versioning + change-case: + specifier: ~5.4.4 + version: 5.4.4 + devDependencies: + '@types/node': + specifier: ~18.11.19 + version: 18.11.19 + '@typespec/compiler': + specifier: workspace:~ + version: link:../compiler + '@typespec/http': + specifier: workspace:~ + version: link:../http + '@typespec/library-linter': + specifier: workspace:~ + version: link:../library-linter + '@typespec/openapi': + specifier: workspace:~ + version: link:../openapi + '@typespec/rest': + specifier: workspace:~ + version: link:../rest + '@typespec/tspd': + specifier: workspace:~ + version: link:../tspd + '@vitest/coverage-v8': + specifier: ^2.0.4 + version: 2.0.4(vitest@2.0.4(@types/node@18.11.19)(@vitest/ui@2.0.4)(happy-dom@14.12.3)(jsdom@24.1.1)(terser@5.31.3)) + '@vitest/ui': + specifier: ^2.0.4 + version: 2.0.4(vitest@2.0.4) + c8: + specifier: ^10.1.2 + version: 10.1.2 + rimraf: + specifier: ~6.0.1 + version: 6.0.1 + typescript: + specifier: ~5.5.4 + version: 5.5.4 + vitest: + specifier: ^2.0.4 + version: 2.0.4(@types/node@18.11.19)(@vitest/ui@2.0.4(vitest@2.0.4))(happy-dom@14.12.3)(jsdom@24.1.1)(terser@5.31.3) + core/packages/http-server-javascript: dependencies: prettier: