From bb937d401aa0cead1dadba96e2f62c789283c858 Mon Sep 17 00:00:00 2001 From: Tim Petricola Date: Wed, 22 Nov 2023 09:42:30 +0100 Subject: [PATCH] fix: refer Schema namespace in generated body type --- .changeset/bright-coins-exist.md | 5 +++ packages/typed-openapi/src/generator.ts | 19 ++++++-- .../typed-openapi/tests/generator.test.ts | 12 +++--- .../tests/snapshots/docker.openapi.client.ts | 43 ++++++++++--------- .../tests/snapshots/petstore.client.ts | 12 +++--- 5 files changed, 55 insertions(+), 36 deletions(-) create mode 100644 .changeset/bright-coins-exist.md diff --git a/.changeset/bright-coins-exist.md b/.changeset/bright-coins-exist.md new file mode 100644 index 0000000..c0d6dbd --- /dev/null +++ b/.changeset/bright-coins-exist.md @@ -0,0 +1,5 @@ +--- +"typed-openapi": patch +--- + +fix: refer Schema namespace in generated body type diff --git a/packages/typed-openapi/src/generator.ts b/packages/typed-openapi/src/generator.ts index e51b149..c1a7e92 100644 --- a/packages/typed-openapi/src/generator.ts +++ b/packages/typed-openapi/src/generator.ts @@ -2,7 +2,7 @@ import { capitalize, groupBy } from "pastable/server"; import { Box } from "./box"; import { prettify } from "./format"; import { mapOpenApiEndpoints } from "./map-openapi-endpoints"; -import { AnyBox, BoxRef } from "./types"; +import { AnyBox, AnyBoxDef, BoxRef } from "./types"; import * as Codegen from "@sinclair/typebox-codegen"; import { match } from "ts-pattern"; import { type } from "arktype"; @@ -117,7 +117,7 @@ const generateSchemaList = ({ refs, runtime }: GeneratorContext) => { ); }; -const parameterObjectToString = (parameters: Box | Record) => { +const parameterObjectToString = (parameters: Box | Record) => { if (parameters instanceof Box) return parameters.value; let str = "{"; @@ -143,7 +143,20 @@ const generateEndpointSchemaList = (ctx: GeneratorContext) => { ${parameters.query ? `query: ${parameterObjectToString(parameters.query)},` : ""} ${parameters.path ? `path: ${parameterObjectToString(parameters.path)},` : ""} ${parameters.header ? `header: ${parameterObjectToString(parameters.header)},` : ""} - ${parameters.body ? `body: ${parameterObjectToString(parameters.body)},` : ""} + ${ + parameters.body + ? `body: ${parameterObjectToString( + ctx.runtime === "none" + ? parameters.body.recompute((box) => { + if (Box.isReference(box) && !box.params.generics) { + box.value = `Schemas.${box.value}`; + } + return box; + }) + : parameters.body, + )},` + : "" + } }` : "parameters: never," } diff --git a/packages/typed-openapi/tests/generator.test.ts b/packages/typed-openapi/tests/generator.test.ts index e1cdbce..a9505ba 100644 --- a/packages/typed-openapi/tests/generator.test.ts +++ b/packages/typed-openapi/tests/generator.test.ts @@ -52,7 +52,7 @@ describe("generator", () => { method: "PUT"; path: "/pet"; parameters: { - body: Pet; + body: Schemas.Pet; }; response: Schemas.Pet; }; @@ -60,7 +60,7 @@ describe("generator", () => { method: "POST"; path: "/pet"; parameters: { - body: Pet; + body: Schemas.Pet; }; response: Schemas.Pet; }; @@ -127,7 +127,7 @@ describe("generator", () => { method: "POST"; path: "/store/order"; parameters: { - body: Order; + body: Schemas.Order; }; response: Schemas.Order; }; @@ -151,7 +151,7 @@ describe("generator", () => { method: "POST"; path: "/user"; parameters: { - body: User; + body: Schemas.User; }; response: Schemas.User; }; @@ -159,7 +159,7 @@ describe("generator", () => { method: "POST"; path: "/user/createWithList"; parameters: { - body: Array; + body: Array; }; response: Schemas.User; }; @@ -191,7 +191,7 @@ describe("generator", () => { parameters: { path: { username: string }; - body: User; + body: Schemas.User; }; response: unknown; }; diff --git a/packages/typed-openapi/tests/snapshots/docker.openapi.client.ts b/packages/typed-openapi/tests/snapshots/docker.openapi.client.ts index feacf3e..bd38c40 100644 --- a/packages/typed-openapi/tests/snapshots/docker.openapi.client.ts +++ b/packages/typed-openapi/tests/snapshots/docker.openapi.client.ts @@ -864,7 +864,8 @@ export namespace Endpoints { parameters: { query: Partial<{ name: string; platform: string }>; - body: ContainerConfig & Partial<{ HostConfig: HostConfig; NetworkingConfig: NetworkingConfig }>; + body: Schemas.ContainerConfig & + Partial<{ HostConfig: Schemas.HostConfig; NetworkingConfig: Schemas.NetworkingConfig }>; }; response: Schemas.ContainerCreateResponse; }; @@ -1005,7 +1006,7 @@ export namespace Endpoints { parameters: { path: { id: string }; - body: Resources & Partial<{ RestartPolicy: RestartPolicy }>; + body: Schemas.Resources & Partial<{ RestartPolicy: Schemas.RestartPolicy }>; }; response: Partial<{ Warnings: Array }>; }; @@ -1265,7 +1266,7 @@ export namespace Endpoints { method: "POST"; path: "/auth"; parameters: { - body: AuthConfig; + body: Schemas.AuthConfig; }; response: unknown; }; @@ -1307,7 +1308,7 @@ export namespace Endpoints { changes: string; }>; - body: ContainerConfig; + body: Schemas.ContainerConfig; }; response: Schemas.IdResponse; }; @@ -1367,7 +1368,7 @@ export namespace Endpoints { AttachStdin: boolean; AttachStdout: boolean; AttachStderr: boolean; - ConsoleSize: Array | null; + ConsoleSize: Array | Schemas.null; DetachKeys: string; Tty: boolean; Env: Array; @@ -1385,7 +1386,7 @@ export namespace Endpoints { parameters: { path: { id: string }; - body: Partial<{ Detach: boolean; Tty: boolean; ConsoleSize: Array | null }>; + body: Partial<{ Detach: boolean; Tty: boolean; ConsoleSize: Array | Schemas.null }>; }; response: unknown; }; @@ -1430,7 +1431,7 @@ export namespace Endpoints { method: "POST"; path: "/volumes/create"; parameters: { - body: VolumeCreateOptions; + body: Schemas.VolumeCreateOptions; }; response: Schemas.Volume; }; @@ -1449,7 +1450,7 @@ export namespace Endpoints { query: { version: number }; path: { name: string }; - body: Partial<{ Spec: ClusterVolumeSpec }>; + body: Partial<{ Spec: Schemas.ClusterVolumeSpec }>; }; response: unknown; }; @@ -1506,7 +1507,7 @@ export namespace Endpoints { Internal?: boolean | undefined; Attachable?: boolean | undefined; Ingress?: boolean | undefined; - IPAM?: IPAM | undefined; + IPAM?: Schemas.IPAM | undefined; EnableIPv6?: boolean | undefined; Options?: unknown | undefined; Labels?: unknown | undefined; @@ -1520,7 +1521,7 @@ export namespace Endpoints { parameters: { path: { id: string }; - body: Partial<{ Container: string; EndpointConfig: EndpointSettings }>; + body: Partial<{ Container: string; EndpointConfig: Schemas.EndpointSettings }>; }; response: unknown; }; @@ -1565,7 +1566,7 @@ export namespace Endpoints { query: { remote: string; name: string }; header: Partial<{ "X-Registry-Auth": string }>; - body: Array; + body: Array; }; response: unknown; }; @@ -1611,7 +1612,7 @@ export namespace Endpoints { query: { remote: string }; path: { name: string }; header: Partial<{ "X-Registry-Auth": string }>; - body: Array; + body: Array; }; response: unknown; }; @@ -1673,7 +1674,7 @@ export namespace Endpoints { query: { version: number }; path: { id: string }; - body: NodeSpec; + body: Schemas.NodeSpec; }; response: unknown; }; @@ -1695,7 +1696,7 @@ export namespace Endpoints { DefaultAddrPool: Array; ForceNewCluster: boolean; SubnetSize: number; - Spec: SwarmSpec; + Spec: Schemas.SwarmSpec; }>; }; response: string; @@ -1733,7 +1734,7 @@ export namespace Endpoints { rotateManagerUnlockKey: boolean; }; - body: SwarmSpec; + body: Schemas.SwarmSpec; }; response: unknown; }; @@ -1764,7 +1765,7 @@ export namespace Endpoints { path: "/services/create"; parameters: { header: Partial<{ "X-Registry-Auth": string }>; - body: ServiceSpec & unknown; + body: Schemas.ServiceSpec & unknown; }; response: Partial<{ ID: string; Warning: string }>; }; @@ -1792,7 +1793,7 @@ export namespace Endpoints { query: { version: number; registryAuthFrom: "spec" | "previous-spec"; rollback: string }; path: { id: string }; header: Partial<{ "X-Registry-Auth": string }>; - body: ServiceSpec & unknown; + body: Schemas.ServiceSpec & unknown; }; response: Schemas.ServiceUpdateResponse; }; @@ -1858,7 +1859,7 @@ export namespace Endpoints { method: "POST"; path: "/secrets/create"; parameters: { - body: SecretSpec & unknown; + body: Schemas.SecretSpec & unknown; }; response: Schemas.IdResponse; }; @@ -1885,7 +1886,7 @@ export namespace Endpoints { query: { version: number }; path: { id: string }; - body: SecretSpec; + body: Schemas.SecretSpec; }; response: unknown; }; @@ -1901,7 +1902,7 @@ export namespace Endpoints { method: "POST"; path: "/configs/create"; parameters: { - body: ConfigSpec & unknown; + body: Schemas.ConfigSpec & unknown; }; response: Schemas.IdResponse; }; @@ -1928,7 +1929,7 @@ export namespace Endpoints { query: { version: number }; path: { id: string }; - body: ConfigSpec; + body: Schemas.ConfigSpec; }; response: unknown; }; diff --git a/packages/typed-openapi/tests/snapshots/petstore.client.ts b/packages/typed-openapi/tests/snapshots/petstore.client.ts index dc1ddd6..ecb43ee 100644 --- a/packages/typed-openapi/tests/snapshots/petstore.client.ts +++ b/packages/typed-openapi/tests/snapshots/petstore.client.ts @@ -42,7 +42,7 @@ export namespace Endpoints { method: "PUT"; path: "/pet"; parameters: { - body: Pet; + body: Schemas.Pet; }; response: Schemas.Pet; }; @@ -50,7 +50,7 @@ export namespace Endpoints { method: "POST"; path: "/pet"; parameters: { - body: Pet; + body: Schemas.Pet; }; response: Schemas.Pet; }; @@ -117,7 +117,7 @@ export namespace Endpoints { method: "POST"; path: "/store/order"; parameters: { - body: Order; + body: Schemas.Order; }; response: Schemas.Order; }; @@ -141,7 +141,7 @@ export namespace Endpoints { method: "POST"; path: "/user"; parameters: { - body: User; + body: Schemas.User; }; response: Schemas.User; }; @@ -149,7 +149,7 @@ export namespace Endpoints { method: "POST"; path: "/user/createWithList"; parameters: { - body: Array; + body: Array; }; response: Schemas.User; }; @@ -181,7 +181,7 @@ export namespace Endpoints { parameters: { path: { username: string }; - body: User; + body: Schemas.User; }; response: unknown; };