@sdk-it/typescript 0.39.0 → 0.41.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/dist/index.js +169 -59
  2. package/dist/index.js.map +3 -3
  3. package/dist/lib/client.d.ts.map +1 -1
  4. package/dist/lib/emitters/zod.d.ts.map +1 -1
  5. package/dist/lib/generate.d.ts +3 -1
  6. package/dist/lib/generate.d.ts.map +1 -1
  7. package/dist/lib/generator.d.ts.map +1 -1
  8. package/dist/lib/options.d.ts +1 -0
  9. package/dist/lib/options.d.ts.map +1 -1
  10. package/dist/lib/sdk.d.ts +1 -1
  11. package/dist/lib/sdk.d.ts.map +1 -1
  12. package/dist/lib/server-urls.d.ts +3 -0
  13. package/dist/lib/server-urls.d.ts.map +1 -0
  14. package/dist/lib/status-map.d.ts.map +1 -1
  15. package/dist/lib/typescript-snippet.d.ts.map +1 -1
  16. package/package.json +4 -4
  17. package/dist/connect.d.ts +0 -1
  18. package/dist/connect.d.ts.map +0 -1
  19. package/dist/global.d.js +0 -1
  20. package/dist/global.d.js.map +0 -7
  21. package/dist/lib/connect.d.ts +0 -162
  22. package/dist/lib/connect.d.ts.map +0 -1
  23. package/dist/lib/readme-generator.d.ts +0 -8
  24. package/dist/lib/readme-generator.d.ts.map +0 -1
  25. package/dist/lib/statusMap.d.ts +0 -2
  26. package/dist/lib/statusMap.d.ts.map +0 -1
  27. package/dist/lib/utils.d.ts +0 -17
  28. package/dist/lib/utils.d.ts.map +0 -1
  29. package/dist/lib/watcher.d.ts +0 -2
  30. package/dist/lib/watcher.d.ts.map +0 -1
  31. package/dist/src/index.js +0 -5
  32. package/dist/src/index.js.map +0 -7
  33. package/dist/src/lib/agent/ai-sdk.js +0 -60
  34. package/dist/src/lib/agent/ai-sdk.js.map +0 -7
  35. package/dist/src/lib/agent/openai-agents.js +0 -42
  36. package/dist/src/lib/agent/openai-agents.js.map +0 -7
  37. package/dist/src/lib/client.js +0 -152
  38. package/dist/src/lib/client.js.map +0 -7
  39. package/dist/src/lib/emitters/interface.js +0 -169
  40. package/dist/src/lib/emitters/interface.js.map +0 -7
  41. package/dist/src/lib/emitters/snippet.js +0 -191
  42. package/dist/src/lib/emitters/snippet.js.map +0 -7
  43. package/dist/src/lib/emitters/zod.js +0 -271
  44. package/dist/src/lib/emitters/zod.js.map +0 -7
  45. package/dist/src/lib/generate.js +0 -382
  46. package/dist/src/lib/generate.js.map +0 -7
  47. package/dist/src/lib/generator.js +0 -268
  48. package/dist/src/lib/generator.js.map +0 -7
  49. package/dist/src/lib/import-utilities.js +0 -56
  50. package/dist/src/lib/import-utilities.js.map +0 -7
  51. package/dist/src/lib/options.js +0 -3
  52. package/dist/src/lib/options.js.map +0 -7
  53. package/dist/src/lib/readme/prop.emitter.js +0 -283
  54. package/dist/src/lib/readme/prop.emitter.js.map +0 -7
  55. package/dist/src/lib/readme/readme.js +0 -105
  56. package/dist/src/lib/readme/readme.js.map +0 -7
  57. package/dist/src/lib/sdk.js +0 -236
  58. package/dist/src/lib/sdk.js.map +0 -7
  59. package/dist/src/lib/status-map.js +0 -28
  60. package/dist/src/lib/status-map.js.map +0 -7
  61. package/dist/src/lib/style.js +0 -1
  62. package/dist/src/lib/style.js.map +0 -7
  63. package/dist/src/lib/typescript-snippet.js +0 -738
  64. package/dist/src/lib/typescript-snippet.js.map +0 -7
@@ -1,152 +0,0 @@
1
- import { toLitObject } from "@sdk-it/core";
2
- import { toZod } from "./emitters/zod.ts";
3
- var client_default = (spec, style) => {
4
- const defaultHeaders = `{${spec.options.filter((value) => value.in === "header").map(
5
- (value) => `'${value.name}': options['${value["x-optionName"] ?? value.name}']`
6
- ).join(",\n")}}`;
7
- const defaultInputs = `{${spec.options.filter((value) => value.in === "input").map(
8
- (value) => `'${value.name}': options['${value["x-optionName"] ?? value.name}']`
9
- ).join(",\n")}}`;
10
- const globalOptions = Object.fromEntries(
11
- spec.options.map((value) => [
12
- `'${value["x-optionName"] ?? value.name}'`,
13
- { schema: toZod(value.schema, value.required) }
14
- ])
15
- );
16
- const specOptions = {
17
- ...globalOptions,
18
- ...globalOptions["'token'"] ? {
19
- "'token'": {
20
- schema: `z.union([z.string(),z.function().returns(z.union([z.string(), z.promise(z.string())])),]).optional()
21
- .transform(async (token) => {
22
- if (!token) return undefined;
23
- if (typeof token === 'function') {
24
- token = await Promise.resolve(token());
25
- }
26
- return \`Bearer \${token}\`;
27
- })`
28
- }
29
- } : {},
30
- fetch: {
31
- schema: "fetchType"
32
- },
33
- baseUrl: {
34
- schema: spec.servers.length ? `z.enum(servers).default(servers[0])` : "z.string()"
35
- },
36
- headers: {
37
- schema: "z.record(z.string()).optional()"
38
- }
39
- };
40
- return `import z from 'zod';
41
- import type { HeadersInit, RequestConfig } from './http/${spec.makeImport("request")}';
42
- import { fetchType, parse } from './http/${spec.makeImport("dispatcher")}';
43
- import schemas from './api/${spec.makeImport("schemas")}';
44
- import {
45
- createBaseUrlInterceptor,
46
- createHeadersInterceptor,
47
- } from './http/${spec.makeImport("interceptors")}';
48
-
49
- import { type ParseError, parseInput } from './http/${spec.makeImport("parser")}';
50
-
51
- ${spec.servers.length ? `export const servers = ${JSON.stringify(spec.servers, null, 2)} as const` : ""}
52
- const optionsSchema = z.object(${toLitObject(specOptions, (x) => x.schema)});
53
- ${spec.servers.length ? `export type Servers = typeof servers[number];` : ""}
54
-
55
- type ${spec.name}Options = z.input<typeof optionsSchema>;
56
-
57
- export class ${spec.name} {
58
- public options: ${spec.name}Options;
59
- constructor(options: ${spec.name}Options) {
60
- this.options = options;
61
- }
62
-
63
- async request<const E extends keyof typeof schemas>(
64
- endpoint: E,
65
- input: z.input<(typeof schemas)[E]['schema']>,
66
- options?: { signal?: AbortSignal, headers?: HeadersInit },
67
- ) ${style.errorAsValue ? `: Promise<Awaited<ReturnType<(typeof schemas)[E]['dispatch']>>| [never, ParseError<(typeof schemas)[E]['schema']>]>` : `: Promise<Awaited<ReturnType<(typeof schemas)[E]['dispatch']>>>`} {
68
- const route = schemas[endpoint];
69
- const withDefaultInputs = Object.assign({}, await this.#defaultInputs(), input);
70
- const [parsedInput, parseError] = parseInput(route.schema, withDefaultInputs);
71
- if (parseError) {
72
- ${style.errorAsValue ? "return [null as never, parseError as never] as const;" : "throw parseError;"}
73
- }
74
- const clientOptions = await optionsSchema.parseAsync(this.options);
75
- const result = await route.dispatch(parsedInput as never, {
76
- fetch: clientOptions.fetch,
77
- interceptors: [
78
- createHeadersInterceptor(
79
- await this.#defaultHeaders(),
80
- options?.headers ?? {},
81
- ),
82
- createBaseUrlInterceptor(clientOptions.baseUrl),
83
- ],
84
- signal: options?.signal,
85
- });
86
- return result as Awaited<ReturnType<(typeof schemas)[E]['dispatch']>>;
87
- }
88
-
89
- async prepare<const E extends keyof typeof schemas>(
90
- endpoint: E,
91
- input: z.input<(typeof schemas)[E]['schema']>,
92
- options?: { headers?: HeadersInit },
93
- ): ${style.errorAsValue ? `Promise<
94
- readonly [
95
- RequestConfig & {
96
- parse: (response: Response) => ReturnType<typeof parse>;
97
- },
98
- ParseError<(typeof schemas)[E]['schema']> | null,
99
- ]
100
- >` : `Promise<RequestConfig & {
101
- parse: (response: Response) => ReturnType<typeof parse>;
102
- }>`} {
103
- const clientOptions = await optionsSchema.parseAsync(this.options);
104
- const route = schemas[endpoint];
105
- const interceptors = [
106
- createHeadersInterceptor(
107
- await this.#defaultHeaders(),
108
- options?.headers ?? {},
109
- ),
110
- createBaseUrlInterceptor(clientOptions.baseUrl),
111
- ];
112
- const [parsedInput, parseError] = parseInput(route.schema, input);
113
- if (parseError) {
114
- ${style.errorAsValue ? "return [null as never, parseError as never] as const;" : "throw parseError;"}
115
- }
116
-
117
- let config = route.toRequest(parsedInput as never);
118
- for (const interceptor of interceptors) {
119
- if (interceptor.before) {
120
- config = await interceptor.before(config);
121
- }
122
- }
123
- const prepared = { ...config, parse: (response: Response) => parse(route.output, response) as never };
124
- return ${style.errorAsValue ? "[prepared, null as never] as const;" : "prepared as any"}
125
- }
126
-
127
- async #defaultHeaders() {
128
- const options = await optionsSchema.parseAsync(this.options);
129
- return {
130
- ...${defaultHeaders},
131
- ...options.headers,
132
- };
133
- }
134
-
135
- async #defaultInputs() {
136
- const options = await optionsSchema.parseAsync(this.options);
137
- return ${defaultInputs}
138
- }
139
-
140
- setOptions(options: Partial<${spec.name}Options>) {
141
- this.options = {
142
- ...this.options,
143
- ...options,
144
- };
145
- }
146
-
147
- }`;
148
- };
149
- export {
150
- client_default as default
151
- };
152
- //# sourceMappingURL=client.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/lib/client.ts"],
4
- "sourcesContent": ["import { toLitObject } from '@sdk-it/core';\n\nimport { toZod } from './emitters/zod.ts';\nimport type { Spec } from './sdk.ts';\nimport type { Style } from './style.ts';\n\nexport default (spec: Omit<Spec, 'operations'>, style: Style) => {\n const defaultHeaders = `{${spec.options\n .filter((value) => value.in === 'header')\n .map(\n (value) =>\n `'${value.name}': options['${value['x-optionName'] ?? value.name}']`,\n )\n .join(',\\n')}}`;\n const defaultInputs = `{${spec.options\n .filter((value) => value.in === 'input')\n .map(\n (value) =>\n `'${value.name}': options['${value['x-optionName'] ?? value.name}']`,\n )\n .join(',\\n')}}`;\n\n /**\n * Map of option name to zod schema (as string)\n * Usually stuff like token, apiKey and so on.\n */\n const globalOptions = Object.fromEntries(\n spec.options.map((value) => [\n `'${value['x-optionName'] ?? value.name}'`,\n { schema: toZod(value.schema, value.required) },\n ]),\n );\n\n const specOptions: Record<string, { schema: string }> = {\n ...globalOptions,\n ...(globalOptions[\"'token'\"]\n ? {\n \"'token'\": {\n schema: `z.union([z.string(),z.function().returns(z.union([z.string(), z.promise(z.string())])),]).optional()\n .transform(async (token) => {\n if (!token) return undefined;\n if (typeof token === 'function') {\n token = await Promise.resolve(token());\n }\n return \\`Bearer \\${token}\\`;\n })`,\n },\n }\n : {}),\n fetch: {\n schema: 'fetchType',\n },\n baseUrl: {\n schema: spec.servers.length\n ? `z.enum(servers).default(servers[0])`\n : 'z.string()',\n },\n headers: {\n schema: 'z.record(z.string()).optional()',\n },\n };\n\n return `import z from 'zod';\nimport type { HeadersInit, RequestConfig } from './http/${spec.makeImport('request')}';\nimport { fetchType, parse } from './http/${spec.makeImport('dispatcher')}';\nimport schemas from './api/${spec.makeImport('schemas')}';\nimport {\n createBaseUrlInterceptor,\n createHeadersInterceptor,\n} from './http/${spec.makeImport('interceptors')}';\n\nimport { type ParseError, parseInput } from './http/${spec.makeImport('parser')}';\n\n${spec.servers.length ? `export const servers = ${JSON.stringify(spec.servers, null, 2)} as const` : ''}\nconst optionsSchema = z.object(${toLitObject(specOptions, (x) => x.schema)});\n${spec.servers.length ? `export type Servers = typeof servers[number];` : ''}\n\ntype ${spec.name}Options = z.input<typeof optionsSchema>;\n\nexport class ${spec.name} {\n public options: ${spec.name}Options;\n constructor(options: ${spec.name}Options) {\n this.options = options;\n }\n\n async request<const E extends keyof typeof schemas>(\n endpoint: E,\n input: z.input<(typeof schemas)[E]['schema']>,\n options?: { signal?: AbortSignal, headers?: HeadersInit },\n ) ${style.errorAsValue ? `: Promise<Awaited<ReturnType<(typeof schemas)[E]['dispatch']>>| [never, ParseError<(typeof schemas)[E]['schema']>]>` : `: Promise<Awaited<ReturnType<(typeof schemas)[E]['dispatch']>>>`} {\n const route = schemas[endpoint];\n const withDefaultInputs = Object.assign({}, await this.#defaultInputs(), input);\n const [parsedInput, parseError] = parseInput(route.schema, withDefaultInputs);\n if (parseError) {\n ${style.errorAsValue ? 'return [null as never, parseError as never] as const;' : 'throw parseError;'}\n }\n const clientOptions = await optionsSchema.parseAsync(this.options);\n const result = await route.dispatch(parsedInput as never, {\n fetch: clientOptions.fetch,\n interceptors: [\n createHeadersInterceptor(\n await this.#defaultHeaders(),\n options?.headers ?? {},\n ),\n createBaseUrlInterceptor(clientOptions.baseUrl),\n ],\n signal: options?.signal,\n });\n return result as Awaited<ReturnType<(typeof schemas)[E]['dispatch']>>;\n }\n\n async prepare<const E extends keyof typeof schemas>(\n endpoint: E,\n input: z.input<(typeof schemas)[E]['schema']>,\n options?: { headers?: HeadersInit },\n ): ${\n style.errorAsValue\n ? `Promise<\n readonly [\n RequestConfig & {\n parse: (response: Response) => ReturnType<typeof parse>;\n },\n ParseError<(typeof schemas)[E]['schema']> | null,\n ]\n >`\n : `Promise<RequestConfig & {\n parse: (response: Response) => ReturnType<typeof parse>;\n }>`\n } {\n const clientOptions = await optionsSchema.parseAsync(this.options);\n const route = schemas[endpoint];\n const interceptors = [\n createHeadersInterceptor(\n await this.#defaultHeaders(),\n options?.headers ?? {},\n ),\n createBaseUrlInterceptor(clientOptions.baseUrl),\n ];\n const [parsedInput, parseError] = parseInput(route.schema, input);\n if (parseError) {\n ${style.errorAsValue ? 'return [null as never, parseError as never] as const;' : 'throw parseError;'}\n }\n\n let config = route.toRequest(parsedInput as never);\n for (const interceptor of interceptors) {\n if (interceptor.before) {\n config = await interceptor.before(config);\n }\n }\n const prepared = { ...config, parse: (response: Response) => parse(route.output, response) as never };\n return ${style.errorAsValue ? '[prepared, null as never] as const;' : 'prepared as any'}\n }\n\n async #defaultHeaders() {\n const options = await optionsSchema.parseAsync(this.options);\n return {\n ...${defaultHeaders},\n ...options.headers,\n };\n }\n\n async #defaultInputs() {\n const options = await optionsSchema.parseAsync(this.options);\n return ${defaultInputs}\n }\n\n setOptions(options: Partial<${spec.name}Options>) {\n this.options = {\n ...this.options,\n ...options,\n };\n }\n\n}`;\n};\n"],
5
- "mappings": "AAAA,SAAS,mBAAmB;AAE5B,SAAS,aAAa;AAItB,IAAO,iBAAQ,CAAC,MAAgC,UAAiB;AAC/D,QAAM,iBAAiB,IAAI,KAAK,QAC7B,OAAO,CAAC,UAAU,MAAM,OAAO,QAAQ,EACvC;AAAA,IACC,CAAC,UACC,IAAI,MAAM,IAAI,eAAe,MAAM,cAAc,KAAK,MAAM,IAAI;AAAA,EACpE,EACC,KAAK,KAAK,CAAC;AACd,QAAM,gBAAgB,IAAI,KAAK,QAC5B,OAAO,CAAC,UAAU,MAAM,OAAO,OAAO,EACtC;AAAA,IACC,CAAC,UACC,IAAI,MAAM,IAAI,eAAe,MAAM,cAAc,KAAK,MAAM,IAAI;AAAA,EACpE,EACC,KAAK,KAAK,CAAC;AAMd,QAAM,gBAAgB,OAAO;AAAA,IAC3B,KAAK,QAAQ,IAAI,CAAC,UAAU;AAAA,MAC1B,IAAI,MAAM,cAAc,KAAK,MAAM,IAAI;AAAA,MACvC,EAAE,QAAQ,MAAM,MAAM,QAAQ,MAAM,QAAQ,EAAE;AAAA,IAChD,CAAC;AAAA,EACH;AAEA,QAAM,cAAkD;AAAA,IACtD,GAAG;AAAA,IACH,GAAI,cAAc,SAAS,IACvB;AAAA,MACE,WAAW;AAAA,QACT,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQV;AAAA,IACF,IACA,CAAC;AAAA,IACL,OAAO;AAAA,MACL,QAAQ;AAAA,IACV;AAAA,IACA,SAAS;AAAA,MACP,QAAQ,KAAK,QAAQ,SACjB,wCACA;AAAA,IACN;AAAA,IACA,SAAS;AAAA,MACP,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,SAAO;AAAA,0DACiD,KAAK,WAAW,SAAS,CAAC;AAAA,2CACzC,KAAK,WAAW,YAAY,CAAC;AAAA,6BAC3C,KAAK,WAAW,SAAS,CAAC;AAAA;AAAA;AAAA;AAAA,iBAItC,KAAK,WAAW,cAAc,CAAC;AAAA;AAAA,sDAEM,KAAK,WAAW,QAAQ,CAAC;AAAA;AAAA,EAE7E,KAAK,QAAQ,SAAS,0BAA0B,KAAK,UAAU,KAAK,SAAS,MAAM,CAAC,CAAC,cAAc,EAAE;AAAA,iCACtE,YAAY,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC;AAAA,EACxE,KAAK,QAAQ,SAAS,kDAAkD,EAAE;AAAA;AAAA,OAErE,KAAK,IAAI;AAAA;AAAA,eAED,KAAK,IAAI;AAAA,oBACJ,KAAK,IAAI;AAAA,yBACJ,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQ5B,MAAM,eAAe,wHAAwH,iEAAiE;AAAA;AAAA;AAAA;AAAA;AAAA,QAK5M,MAAM,eAAe,0DAA0D,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAsBtG,MAAM,eACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAQA;AAAA;AAAA,SAGN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAYM,MAAM,eAAe,0DAA0D,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAU7F,MAAM,eAAe,wCAAwC,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAMhF,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAOZ,aAAa;AAAA;AAAA;AAAA,gCAGM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQzC;",
6
- "names": []
7
- }
@@ -1,169 +0,0 @@
1
- import { followRef, isRef, parseRef, pascalcase } from "@sdk-it/core";
2
- import { isPrimitiveSchema, sanitizeTag } from "@sdk-it/spec";
3
- class TypeScriptEmitter {
4
- #spec;
5
- constructor(spec) {
6
- this.#spec = spec;
7
- }
8
- #stringifyKey = (value) => {
9
- return `'${value}'`;
10
- };
11
- object(schema, required = false) {
12
- const properties = schema.properties || {};
13
- const propEntries = Object.entries(properties).map(([key, propSchema]) => {
14
- const isRequired = (schema.required ?? []).includes(key);
15
- const tsType = this.handle(propSchema, isRequired);
16
- return `${this.#stringifyKey(key)}: ${tsType}`;
17
- });
18
- if (schema.additionalProperties) {
19
- if (typeof schema.additionalProperties === "object") {
20
- const indexType = this.handle(schema.additionalProperties, true);
21
- propEntries.push(`[key: string]: ${indexType}`);
22
- } else if (schema.additionalProperties === true) {
23
- propEntries.push("[key: string]: any");
24
- }
25
- }
26
- return `${propEntries.length ? `{ ${propEntries.join("; ")} }` : "unknown"}`;
27
- }
28
- /**
29
- * Handle arrays (items could be a single schema or a tuple)
30
- */
31
- #array(schema, required = false) {
32
- const { items } = schema;
33
- if (!items) {
34
- return "any[]";
35
- }
36
- if (Array.isArray(items)) {
37
- const tupleItems = items.map((sub) => this.handle(sub, true));
38
- return `[${tupleItems.join(", ")}]`;
39
- }
40
- const itemsType = this.handle(items, true);
41
- return itemsType.length > 1 ? `(${itemsType})[]` : `${itemsType}[]`;
42
- }
43
- /**
44
- * Convert a basic type (string | number | boolean | object | array, etc.) to TypeScript
45
- */
46
- normal(type, schema, required = false) {
47
- switch (type) {
48
- case "string":
49
- return this.string(schema, required);
50
- case "number":
51
- case "integer":
52
- return this.number(schema, required);
53
- case "boolean":
54
- return appendOptional("boolean", required);
55
- case "object":
56
- return this.object(schema, required);
57
- case "array":
58
- return this.#array(schema, required);
59
- case "null":
60
- return "null";
61
- default:
62
- console.warn(`Unknown type: ${type}`);
63
- return appendOptional("any", required);
64
- }
65
- }
66
- #ref($ref, required) {
67
- const schemaName = pascalcase(sanitizeTag(parseRef($ref).model));
68
- const schema = followRef(this.#spec, $ref);
69
- if (isPrimitiveSchema(schema)) {
70
- return this.handle(schema, required);
71
- }
72
- return `models.${appendOptional(schemaName, required)}`;
73
- }
74
- allOf(schemas) {
75
- const allOfTypes = schemas.map((sub) => this.handle(sub, true));
76
- return allOfTypes.length > 1 ? `${allOfTypes.join(" & ")}` : allOfTypes[0];
77
- }
78
- oneOf(schemas, required) {
79
- const oneOfTypes = schemas.map((sub) => this.handle(sub, true));
80
- return appendOptional(
81
- oneOfTypes.length > 1 ? `${oneOfTypes.join(" | ")}` : oneOfTypes[0],
82
- required
83
- );
84
- }
85
- anyOf(schemas, required) {
86
- return this.oneOf(schemas, required);
87
- }
88
- enum(values, required) {
89
- const enumValues = values.map((val) => typeof val === "string" ? `'${val}'` : `${val}`).join(" | ");
90
- return appendOptional(enumValues, required);
91
- }
92
- /**
93
- * Handle string type with formats
94
- */
95
- string(schema, required) {
96
- let type;
97
- if (schema.contentEncoding === "binary") {
98
- return appendOptional("Blob", required);
99
- }
100
- switch (schema.format) {
101
- case "date-time":
102
- case "datetime":
103
- case "date":
104
- type = "Date";
105
- break;
106
- case "binary":
107
- case "byte":
108
- type = "Blob";
109
- break;
110
- case "int64":
111
- type = "bigint";
112
- break;
113
- default:
114
- type = "string";
115
- }
116
- return appendOptional(type, required);
117
- }
118
- /**
119
- * Handle number/integer types with formats
120
- */
121
- number(schema, required) {
122
- const type = schema.format === "int64" ? "bigint" : "number";
123
- return appendOptional(type, required);
124
- }
125
- handle(schema, required) {
126
- if (isRef(schema)) {
127
- return this.#ref(schema.$ref, required);
128
- }
129
- if (schema.allOf && Array.isArray(schema.allOf)) {
130
- return this.allOf(schema.allOf);
131
- }
132
- if (schema.anyOf && Array.isArray(schema.anyOf)) {
133
- return this.anyOf(schema.anyOf, required);
134
- }
135
- if (schema.oneOf && Array.isArray(schema.oneOf)) {
136
- return this.oneOf(schema.oneOf, required);
137
- }
138
- if (schema.enum && Array.isArray(schema.enum)) {
139
- return this.enum(schema.enum, required);
140
- }
141
- if (schema.const) {
142
- return this.enum([schema.const], true);
143
- }
144
- const types = Array.isArray(schema.type) ? schema.type : schema.type ? [schema.type] : [];
145
- if (!types.length) {
146
- if ("properties" in schema) {
147
- return this.object(schema, required);
148
- }
149
- return appendOptional("any", required);
150
- }
151
- if (types.length > 1) {
152
- const realTypes = types.filter((t) => t !== "null");
153
- if (realTypes.length === 1 && types.includes("null")) {
154
- const tsType = this.normal(realTypes[0], schema, false);
155
- return appendOptional(`${tsType} | null`, required);
156
- }
157
- const typeResults = types.map((t) => this.normal(t, schema, false));
158
- return appendOptional(typeResults.join(" | "), required);
159
- }
160
- return this.normal(types[0], schema, required);
161
- }
162
- }
163
- function appendOptional(type, isRequired) {
164
- return isRequired ? type : `${type} | undefined`;
165
- }
166
- export {
167
- TypeScriptEmitter
168
- };
169
- //# sourceMappingURL=interface.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/lib/emitters/interface.ts"],
4
- "sourcesContent": ["import type {\n ReferenceObject,\n SchemaObject\n} from 'openapi3-ts/oas31';\n\nimport { followRef, isRef, parseRef, pascalcase } from '@sdk-it/core';\nimport { type IR, isPrimitiveSchema, sanitizeTag } from '@sdk-it/spec';\n\nexport class TypeScriptEmitter {\n #spec: IR;\n\n constructor(spec: IR) {\n this.#spec = spec;\n }\n #stringifyKey = (value: string): string => {\n return `'${value}'`;\n };\n\n object(schema: SchemaObject, required = false): string {\n const properties = schema.properties || {};\n\n const propEntries = Object.entries(properties).map(([key, propSchema]) => {\n const isRequired = (schema.required ?? []).includes(key);\n const tsType = this.handle(propSchema, isRequired);\n return `${this.#stringifyKey(key)}: ${tsType}`;\n });\n\n if (schema.additionalProperties) {\n if (typeof schema.additionalProperties === 'object') {\n const indexType = this.handle(schema.additionalProperties, true);\n propEntries.push(`[key: string]: ${indexType}`);\n } else if (schema.additionalProperties === true) {\n propEntries.push('[key: string]: any');\n }\n }\n\n return `${propEntries.length ? `{ ${propEntries.join('; ')} }` : 'unknown'}`;\n }\n\n /**\n * Handle arrays (items could be a single schema or a tuple)\n */\n #array(schema: SchemaObject, required = false): string {\n const { items } = schema;\n if (!items) {\n // No items => any[]\n return 'any[]';\n }\n\n // If items is an array => tuple\n if (Array.isArray(items)) {\n const tupleItems = items.map((sub) => this.handle(sub, true));\n return `[${tupleItems.join(', ')}]`;\n }\n\n // If items is a single schema => standard array\n const itemsType = this.handle(items, true);\n return itemsType.length > 1 ? `(${itemsType})[]` : `${itemsType}[]`;\n }\n\n /**\n * Convert a basic type (string | number | boolean | object | array, etc.) to TypeScript\n */\n normal(type: string, schema: SchemaObject, required = false): string {\n switch (type) {\n case 'string':\n return this.string(schema, required);\n case 'number':\n case 'integer':\n return this.number(schema, required);\n case 'boolean':\n return appendOptional('boolean', required);\n case 'object':\n return this.object(schema, required);\n case 'array':\n return this.#array(schema, required);\n case 'null':\n return 'null';\n default:\n console.warn(`Unknown type: ${type}`);\n // Unknown type -> fallback\n return appendOptional('any', required);\n }\n }\n\n #ref($ref: string, required: boolean): string {\n const schemaName = pascalcase(sanitizeTag(parseRef($ref).model));\n const schema = followRef(this.#spec, $ref);\n if (isPrimitiveSchema(schema)) {\n return this.handle(schema, required);\n }\n\n return `models.${appendOptional(schemaName, required)}`;\n }\n\n allOf(schemas: (SchemaObject | ReferenceObject)[]): string {\n // For TypeScript we use intersection types for allOf\n const allOfTypes = schemas.map((sub) => this.handle(sub, true));\n return allOfTypes.length > 1 ? `${allOfTypes.join(' & ')}` : allOfTypes[0];\n }\n\n oneOf(\n schemas: (SchemaObject | ReferenceObject)[],\n required: boolean,\n ): string {\n // For TypeScript we use union types for anyOf/oneOf\n const oneOfTypes = schemas.map((sub) => this.handle(sub, true));\n return appendOptional(\n oneOfTypes.length > 1 ? `${oneOfTypes.join(' | ')}` : oneOfTypes[0],\n required,\n );\n }\n anyOf(\n schemas: (SchemaObject | ReferenceObject)[],\n required: boolean,\n ): string {\n return this.oneOf(schemas, required);\n }\n\n enum(values: unknown[], required: boolean): string {\n // For TypeScript enums as union of literals\n const enumValues = values\n .map((val) => (typeof val === 'string' ? `'${val}'` : `${val}`))\n .join(' | ');\n return appendOptional(enumValues, required);\n }\n\n /**\n * Handle string type with formats\n */\n string(schema: SchemaObject, required?: boolean): string {\n let type: string;\n\n if (schema.contentEncoding === 'binary') {\n return appendOptional('Blob', required);\n }\n\n switch (schema.format) {\n case 'date-time':\n case 'datetime':\n case 'date':\n type = 'Date';\n break;\n case 'binary':\n case 'byte':\n type = 'Blob';\n break;\n case 'int64':\n type = 'bigint';\n break;\n default:\n type = 'string';\n }\n\n return appendOptional(type, required);\n }\n\n /**\n * Handle number/integer types with formats\n */\n number(schema: SchemaObject, required?: boolean): string {\n const type = schema.format === 'int64' ? 'bigint' : 'number';\n return appendOptional(type, required);\n }\n\n handle(schema: SchemaObject | ReferenceObject, required: boolean): string {\n if (isRef(schema)) {\n return this.#ref(schema.$ref, required);\n }\n\n // Handle allOf (intersection in TypeScript)\n if (schema.allOf && Array.isArray(schema.allOf)) {\n return this.allOf(schema.allOf);\n }\n\n // anyOf (union in TypeScript)\n if (schema.anyOf && Array.isArray(schema.anyOf)) {\n return this.anyOf(schema.anyOf, required);\n }\n\n // oneOf (union in TypeScript)\n if (schema.oneOf && Array.isArray(schema.oneOf)) {\n return this.oneOf(schema.oneOf, required);\n }\n\n // enum\n if (schema.enum && Array.isArray(schema.enum)) {\n return this.enum(schema.enum, required);\n }\n\n if (schema.const) {\n return this.enum([schema.const], true);\n }\n\n // Handle types, in TypeScript we can have union types directly\n const types = Array.isArray(schema.type)\n ? schema.type\n : schema.type\n ? [schema.type]\n : [];\n\n // If no explicit \"type\", fallback to any\n if (!types.length) {\n // unless properties are defined then assume object\n if ('properties' in schema) {\n return this.object(schema, required);\n }\n return appendOptional('any', required);\n }\n\n // Handle union types (multiple types)\n if (types.length > 1) {\n const realTypes = types.filter((t) => t !== 'null');\n if (realTypes.length === 1 && types.includes('null')) {\n // Single real type + \"null\"\n const tsType = this.normal(realTypes[0], schema, false);\n return appendOptional(`${tsType} | null`, required);\n }\n\n // Multiple different types\n const typeResults = types.map((t) => this.normal(t, schema, false));\n return appendOptional(typeResults.join(' | '), required);\n }\n\n // Single type\n return this.normal(types[0], schema, required);\n }\n}\n\nfunction appendOptional(type: string, isRequired?: boolean): string {\n return isRequired ? type : `${type} | undefined`;\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,191 +0,0 @@
1
- import { followRef, isRef, resolveRef } from "@sdk-it/core";
2
- class SnippetEmitter {
3
- spec;
4
- generatedRefs = /* @__PURE__ */ new Set();
5
- cache = /* @__PURE__ */ new Map();
6
- constructor(spec) {
7
- this.spec = spec;
8
- }
9
- object(schema) {
10
- const schemaObj = resolveRef(this.spec, schema);
11
- const result = {};
12
- const properties = schemaObj.properties || {};
13
- for (const [propName, propSchema] of Object.entries(properties)) {
14
- const isRequired = (schemaObj.required ?? []).includes(propName);
15
- const resolvedProp = resolveRef(this.spec, propSchema);
16
- if (isRequired || resolvedProp.example !== void 0 || resolvedProp.default !== void 0) {
17
- result[propName] = this.handle(propSchema);
18
- }
19
- }
20
- if (schemaObj.additionalProperties && typeof schemaObj.additionalProperties === "object") {
21
- result["additionalPropExample"] = this.handle(
22
- schemaObj.additionalProperties
23
- );
24
- }
25
- return result;
26
- }
27
- array(schema) {
28
- const schemaObj = resolveRef(this.spec, schema);
29
- const itemsSchema = schemaObj.items;
30
- if (!itemsSchema) {
31
- return [];
32
- }
33
- const count = Math.min(schemaObj.minItems ?? 1, 2);
34
- const result = [];
35
- for (let i = 0; i < count; i++) {
36
- result.push(this.handle(itemsSchema));
37
- }
38
- return result;
39
- }
40
- string(schema) {
41
- if (schema.example !== void 0) return String(schema.example);
42
- if (schema.default !== void 0) return String(schema.default);
43
- switch (schema.format) {
44
- case "date-time":
45
- case "datetime":
46
- return `2025-07-17T09:08:00.097Z`;
47
- case "date":
48
- return `2025-07-17`;
49
- case "time":
50
- return `09:08:00.097Z`;
51
- case "email":
52
- return "user@example.com";
53
- case "uuid":
54
- return "123e4567-e89b-12d3-a456-426614174000";
55
- case "uri":
56
- case "url":
57
- return "https://example.com";
58
- case "ipv4":
59
- return "192.168.1.1";
60
- case "ipv6":
61
- return "2001:0db8:85a3:0000:0000:8a2e:0370:7334";
62
- case "hostname":
63
- return "example.com";
64
- case "binary":
65
- case "byte":
66
- return `new Blob(['example'], { type: 'text/plain' })`;
67
- default:
68
- if (schema.enum && schema.enum.length > 0) {
69
- return String(schema.enum[0]);
70
- }
71
- return schema.pattern ? `string matching ${schema.pattern}` : "example";
72
- }
73
- }
74
- number(schema) {
75
- if (schema.example !== void 0) return Number(schema.example);
76
- if (schema.default !== void 0) return Number(schema.default);
77
- let value;
78
- if (typeof schema.exclusiveMinimum === "number") {
79
- value = schema.exclusiveMinimum + 1;
80
- } else if (typeof schema.minimum === "number") {
81
- value = schema.minimum;
82
- } else {
83
- value = schema.type === "integer" ? 42 : 42.42;
84
- }
85
- if (typeof schema.exclusiveMaximum === "number" && value >= schema.exclusiveMaximum) {
86
- value = schema.exclusiveMaximum - 1;
87
- } else if (typeof schema.maximum === "number" && value > schema.maximum) {
88
- value = schema.maximum;
89
- }
90
- if (typeof schema.multipleOf === "number" && value % schema.multipleOf !== 0) {
91
- value = Math.floor(value / schema.multipleOf) * schema.multipleOf;
92
- }
93
- return schema.type === "integer" ? Math.floor(value) : value;
94
- }
95
- boolean(schema) {
96
- if (schema.example !== void 0) return Boolean(schema.example);
97
- if (schema.default !== void 0) return Boolean(schema.default);
98
- return true;
99
- }
100
- null() {
101
- return null;
102
- }
103
- ref($ref) {
104
- const parts = $ref.split("/");
105
- const refKey = parts[parts.length - 1] || "";
106
- if (this.cache.has($ref)) {
107
- return this.cache.get($ref);
108
- }
109
- this.cache.set($ref, { _ref: refKey });
110
- const resolved = followRef(this.spec, $ref);
111
- const result = this.handle(resolved);
112
- this.cache.set($ref, result);
113
- return result;
114
- }
115
- allOf(schemas) {
116
- const initial = {};
117
- return schemas.reduce((result, schema) => {
118
- const example = this.handle(schema);
119
- if (typeof example === "object" && example !== null) {
120
- return { ...result, ...example };
121
- }
122
- return result;
123
- }, initial);
124
- }
125
- anyOf(schemas) {
126
- if (schemas.length === 0) return {};
127
- return this.handle(schemas[0]);
128
- }
129
- oneOf(schemas) {
130
- if (schemas.length === 0) return {};
131
- return this.handle(schemas[0]);
132
- }
133
- enum(schema) {
134
- return Array.isArray(schema.enum) && schema.enum.length > 0 ? schema.enum[0] : void 0;
135
- }
136
- handle(schemaOrRef) {
137
- if (isRef(schemaOrRef)) {
138
- return this.ref(schemaOrRef.$ref);
139
- }
140
- const schema = resolveRef(this.spec, schemaOrRef);
141
- if (schema.example !== void 0) {
142
- return schema.example;
143
- }
144
- if (schema.default !== void 0) {
145
- return schema.default;
146
- }
147
- if (schema.allOf && Array.isArray(schema.allOf)) {
148
- return this.allOf(schema.allOf);
149
- }
150
- if (schema.anyOf && Array.isArray(schema.anyOf)) {
151
- return this.anyOf(schema.anyOf);
152
- }
153
- if (schema.oneOf && Array.isArray(schema.oneOf)) {
154
- return this.oneOf(schema.oneOf);
155
- }
156
- if (schema.enum && Array.isArray(schema.enum) && schema.enum.length > 0) {
157
- return this.enum(schema);
158
- }
159
- const types = Array.isArray(schema.type) ? schema.type : schema.type ? [schema.type] : [];
160
- if (types.length === 0) {
161
- if (schema.properties || schema.additionalProperties) {
162
- return this.object(schema);
163
- } else if (schema.items) {
164
- return this.array(schema);
165
- }
166
- return "example";
167
- }
168
- const primaryType = types.find((t) => t !== "null") || types[0];
169
- switch (primaryType) {
170
- case "string":
171
- return this.string(schema);
172
- case "number":
173
- case "integer":
174
- return this.number(schema);
175
- case "boolean":
176
- return this.boolean(schema);
177
- case "object":
178
- return this.object(schema);
179
- case "array":
180
- return this.array(schema);
181
- case "null":
182
- return this.null();
183
- default:
184
- return "unknown";
185
- }
186
- }
187
- }
188
- export {
189
- SnippetEmitter
190
- };
191
- //# sourceMappingURL=snippet.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/lib/emitters/snippet.ts"],
4
- "sourcesContent": ["import type { ReferenceObject, SchemaObject } from 'openapi3-ts/oas31';\n\nimport { followRef, isRef, resolveRef } from '@sdk-it/core';\nimport type { IR } from '@sdk-it/spec';\n\n/**\n * Generate example values for OpenAPI schemas\n * This emitter creates sample input payloads for API documentation and code snippets\n */\nexport class SnippetEmitter {\n private spec: IR;\n public generatedRefs = new Set<string>();\n private cache = new Map<string, unknown>();\n\n constructor(spec: IR) {\n this.spec = spec;\n }\n\n public object(\n schema: SchemaObject | ReferenceObject,\n ): Record<string, unknown> {\n const schemaObj = resolveRef(this.spec, schema) as SchemaObject;\n const result: Record<string, unknown> = {};\n const properties = schemaObj.properties || {};\n\n for (const [propName, propSchema] of Object.entries(properties)) {\n const isRequired = (schemaObj.required ?? []).includes(propName);\n const resolvedProp = resolveRef(this.spec, propSchema);\n\n if (\n isRequired ||\n resolvedProp.example !== undefined ||\n resolvedProp.default !== undefined\n ) {\n result[propName] = this.handle(propSchema);\n }\n }\n\n if (\n schemaObj.additionalProperties &&\n typeof schemaObj.additionalProperties === 'object'\n ) {\n result['additionalPropExample'] = this.handle(\n schemaObj.additionalProperties,\n );\n }\n\n return result;\n }\n\n public array(schema: SchemaObject | ReferenceObject): unknown[] {\n const schemaObj = resolveRef(this.spec, schema);\n const itemsSchema = schemaObj.items;\n if (!itemsSchema) {\n return [];\n }\n\n const count = Math.min(schemaObj.minItems ?? 1, 2);\n const result: unknown[] = [];\n\n for (let i = 0; i < count; i++) {\n result.push(this.handle(itemsSchema));\n }\n\n return result;\n }\n\n public string(schema: SchemaObject): string {\n if (schema.example !== undefined) return String(schema.example);\n if (schema.default !== undefined) return String(schema.default);\n\n switch (schema.format) {\n case 'date-time':\n case 'datetime':\n return `2025-07-17T09:08:00.097Z`;\n case 'date':\n return `2025-07-17`;\n case 'time':\n return `09:08:00.097Z`;\n case 'email':\n return 'user@example.com';\n case 'uuid':\n return '123e4567-e89b-12d3-a456-426614174000';\n case 'uri':\n case 'url':\n return 'https://example.com';\n case 'ipv4':\n return '192.168.1.1';\n case 'ipv6':\n return '2001:0db8:85a3:0000:0000:8a2e:0370:7334';\n case 'hostname':\n return 'example.com';\n case 'binary':\n case 'byte':\n return `new Blob(['example'], { type: 'text/plain' })`;\n default:\n if (schema.enum && schema.enum.length > 0) {\n return String(schema.enum[0]);\n }\n return schema.pattern ? `string matching ${schema.pattern}` : 'example';\n }\n }\n\n public number(schema: SchemaObject): number {\n if (schema.example !== undefined) return Number(schema.example);\n if (schema.default !== undefined) return Number(schema.default);\n\n let value: number;\n if (typeof schema.exclusiveMinimum === 'number') {\n value = schema.exclusiveMinimum + 1;\n } else if (typeof schema.minimum === 'number') {\n value = schema.minimum;\n } else {\n value = schema.type === 'integer' ? 42 : 42.42;\n }\n\n if (\n typeof schema.exclusiveMaximum === 'number' &&\n value >= schema.exclusiveMaximum\n ) {\n value = schema.exclusiveMaximum - 1;\n } else if (typeof schema.maximum === 'number' && value > schema.maximum) {\n value = schema.maximum;\n }\n\n if (\n typeof schema.multipleOf === 'number' &&\n value % schema.multipleOf !== 0\n ) {\n value = Math.floor(value / schema.multipleOf) * schema.multipleOf;\n }\n\n return schema.type === 'integer' ? Math.floor(value) : value;\n }\n\n public boolean(schema: SchemaObject): boolean {\n if (schema.example !== undefined) return Boolean(schema.example);\n if (schema.default !== undefined) return Boolean(schema.default);\n return true;\n }\n\n public null(): null {\n return null;\n }\n\n public ref($ref: string): unknown {\n const parts = $ref.split('/');\n const refKey = parts[parts.length - 1] || '';\n\n if (this.cache.has($ref)) {\n return this.cache.get($ref) as unknown;\n }\n\n this.cache.set($ref, { _ref: refKey });\n\n const resolved = followRef<SchemaObject>(this.spec, $ref);\n const result = this.handle(resolved);\n\n this.cache.set($ref, result);\n return result;\n }\n\n public allOf(schemas: (SchemaObject | ReferenceObject)[]): unknown {\n const initial: Record<string, unknown> = {};\n return schemas.reduce<Record<string, unknown>>((result, schema) => {\n const example = this.handle(schema);\n if (typeof example === 'object' && example !== null) {\n return { ...result, ...example };\n }\n return result;\n }, initial);\n }\n\n public anyOf(schemas: (SchemaObject | ReferenceObject)[]): unknown {\n if (schemas.length === 0) return {};\n return this.handle(schemas[0]);\n }\n\n public oneOf(schemas: (SchemaObject | ReferenceObject)[]): unknown {\n if (schemas.length === 0) return {};\n return this.handle(schemas[0]);\n }\n\n public enum(schema: SchemaObject): unknown {\n return Array.isArray(schema.enum) && schema.enum.length > 0\n ? schema.enum[0]\n : undefined;\n }\n\n public handle(schemaOrRef: SchemaObject | ReferenceObject): unknown {\n if (isRef(schemaOrRef)) {\n return this.ref(schemaOrRef.$ref);\n }\n\n const schema = resolveRef(this.spec, schemaOrRef);\n\n if (schema.example !== undefined) {\n return schema.example;\n }\n\n if (schema.default !== undefined) {\n return schema.default;\n }\n\n if (schema.allOf && Array.isArray(schema.allOf)) {\n return this.allOf(schema.allOf);\n }\n if (schema.anyOf && Array.isArray(schema.anyOf)) {\n return this.anyOf(schema.anyOf);\n }\n if (schema.oneOf && Array.isArray(schema.oneOf)) {\n return this.oneOf(schema.oneOf);\n }\n\n if (schema.enum && Array.isArray(schema.enum) && schema.enum.length > 0) {\n return this.enum(schema);\n }\n\n const types = Array.isArray(schema.type)\n ? schema.type\n : schema.type\n ? [schema.type]\n : [];\n\n if (types.length === 0) {\n if (schema.properties || schema.additionalProperties) {\n return this.object(schema);\n } else if (schema.items) {\n return this.array(schema);\n }\n return 'example';\n }\n\n const primaryType = types.find((t) => t !== 'null') || types[0];\n\n switch (primaryType) {\n case 'string':\n return this.string(schema);\n case 'number':\n case 'integer':\n return this.number(schema);\n case 'boolean':\n return this.boolean(schema);\n case 'object':\n return this.object(schema);\n case 'array':\n return this.array(schema);\n case 'null':\n return this.null();\n default:\n return 'unknown';\n }\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }