@sdk-it/typescript 0.12.11 → 0.14.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.
- package/dist/index.js +94 -53
- package/dist/index.js.map +2 -2
- package/dist/lib/client.d.ts.map +1 -1
- package/dist/lib/emitters/interface.d.ts.map +1 -1
- package/dist/lib/emitters/zod.d.ts +6 -3
- package/dist/lib/emitters/zod.d.ts.map +1 -1
- package/dist/lib/generate.d.ts +1 -0
- package/dist/lib/generate.d.ts.map +1 -1
- package/dist/lib/generator.d.ts +1 -0
- package/dist/lib/generator.d.ts.map +1 -1
- package/dist/lib/sdk.d.ts +3 -1
- package/dist/lib/sdk.d.ts.map +1 -1
- package/dist/lib/utils.d.ts +1 -0
- package/dist/lib/utils.d.ts.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -39,14 +39,14 @@ var client_default = (spec) => {
|
|
|
39
39
|
}
|
|
40
40
|
};
|
|
41
41
|
return `
|
|
42
|
-
import { fetchType, sendRequest } from './http
|
|
42
|
+
import { fetchType, sendRequest } from './http/${spec.makeImport("send-request")}';
|
|
43
43
|
import z from 'zod';
|
|
44
|
-
import type { Endpoints } from '
|
|
45
|
-
import schemas from '
|
|
44
|
+
import type { Endpoints } from './${spec.makeImport("endpoints")}';
|
|
45
|
+
import schemas from './${spec.makeImport("schemas")}';
|
|
46
46
|
import {
|
|
47
47
|
createBaseUrlInterceptor,
|
|
48
|
-
|
|
49
|
-
} from './http
|
|
48
|
+
createHeadersInterceptor,
|
|
49
|
+
} from './http/${spec.makeImport("interceptors")}';
|
|
50
50
|
|
|
51
51
|
${spec.servers.length ? `export const servers = ${JSON.stringify(spec.servers, null, 2)} as const` : ""}
|
|
52
52
|
const optionsSchema = z.object(${toLitObject(specOptions, (x) => x.schema)});
|
|
@@ -63,14 +63,16 @@ export class ${spec.name} {
|
|
|
63
63
|
async request<E extends keyof Endpoints>(
|
|
64
64
|
endpoint: E,
|
|
65
65
|
input: Endpoints[E]['input'],
|
|
66
|
+
options?: { signal?: AbortSignal, headers?: HeadersInit },
|
|
66
67
|
): Promise<readonly [Endpoints[E]['output'], Endpoints[E]['error'] | null]> {
|
|
67
68
|
const route = schemas[endpoint];
|
|
68
69
|
return sendRequest(Object.assign(this.#defaultInputs, input), route, {
|
|
69
70
|
fetch: this.options.fetch,
|
|
70
71
|
interceptors: [
|
|
71
|
-
|
|
72
|
+
createHeadersInterceptor(() => this.defaultHeaders, options?.headers ?? {}),
|
|
72
73
|
createBaseUrlInterceptor(() => this.options.baseUrl),
|
|
73
74
|
],
|
|
75
|
+
signal: options?.signal,
|
|
74
76
|
});
|
|
75
77
|
}
|
|
76
78
|
|
|
@@ -96,13 +98,18 @@ export class ${spec.name} {
|
|
|
96
98
|
|
|
97
99
|
// packages/typescript/src/lib/sdk.ts
|
|
98
100
|
var SchemaEndpoint = class {
|
|
99
|
-
#
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
101
|
+
#makeImport;
|
|
102
|
+
#imports = [];
|
|
103
|
+
constructor(makeImport) {
|
|
104
|
+
this.#makeImport = makeImport;
|
|
105
|
+
this.#imports = [
|
|
106
|
+
`import z from 'zod';`,
|
|
107
|
+
`import type { Endpoints } from '${this.#makeImport("./endpoints")}';`,
|
|
108
|
+
`import { toRequest, json, urlencoded, nobody, formdata, createUrl } from '${this.#makeImport("./http/request")}';`,
|
|
109
|
+
`import type { ParseError } from '${this.#makeImport("./http/parser")}';`,
|
|
110
|
+
`import { chunked, buffered } from "${this.#makeImport("./http/parse-response")}";`
|
|
111
|
+
];
|
|
112
|
+
}
|
|
106
113
|
#endpoints = [];
|
|
107
114
|
addEndpoint(endpoint, operation) {
|
|
108
115
|
this.#endpoints.push(` "${endpoint}": ${operation},`);
|
|
@@ -118,10 +125,15 @@ ${this.#endpoints.join("\n")}
|
|
|
118
125
|
}
|
|
119
126
|
};
|
|
120
127
|
var Emitter = class {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
128
|
+
#makeImport;
|
|
129
|
+
imports = [];
|
|
130
|
+
constructor(makeImport) {
|
|
131
|
+
this.#makeImport = makeImport;
|
|
132
|
+
this.imports = [
|
|
133
|
+
`import type z from 'zod';`,
|
|
134
|
+
`import type { ParseError } from '${this.#makeImport("./http/parser")}';`
|
|
135
|
+
];
|
|
136
|
+
}
|
|
125
137
|
endpoints = [];
|
|
126
138
|
addEndpoint(endpoint, operation) {
|
|
127
139
|
this.endpoints.push(` "${endpoint}": ${operation};`);
|
|
@@ -136,7 +148,7 @@ ${this.endpoints.join("\n")}
|
|
|
136
148
|
}`;
|
|
137
149
|
}
|
|
138
150
|
};
|
|
139
|
-
function generateInputs(operationsSet, commonZod) {
|
|
151
|
+
function generateInputs(operationsSet, commonZod, makeImport) {
|
|
140
152
|
const commonImports = commonZod.keys().toArray();
|
|
141
153
|
const inputs = {};
|
|
142
154
|
for (const [name, operations] of Object.entries(operationsSet)) {
|
|
@@ -149,7 +161,7 @@ function generateInputs(operationsSet, commonZod) {
|
|
|
149
161
|
for (const schema2 of commonImports) {
|
|
150
162
|
if (inputContent.includes(schema2)) {
|
|
151
163
|
imports.add(
|
|
152
|
-
`import { ${schema2} } from './schemas/${spinalcase(schema2)}
|
|
164
|
+
`import { ${schema2} } from './schemas/${makeImport(spinalcase(schema2))}';`
|
|
153
165
|
);
|
|
154
166
|
}
|
|
155
167
|
}
|
|
@@ -164,7 +176,7 @@ function generateInputs(operationsSet, commonZod) {
|
|
|
164
176
|
const preciseMatch = new RegExp(`\\b${schema2}\\b`);
|
|
165
177
|
if (preciseMatch.test(content) && schema2 !== name) {
|
|
166
178
|
output.push(
|
|
167
|
-
`import { ${schema2} } from './${spinalcase(schema2)}
|
|
179
|
+
`import { ${schema2} } from './${makeImport(spinalcase(schema2))}';`
|
|
168
180
|
);
|
|
169
181
|
}
|
|
170
182
|
}
|
|
@@ -180,15 +192,15 @@ function generateInputs(operationsSet, commonZod) {
|
|
|
180
192
|
};
|
|
181
193
|
}
|
|
182
194
|
function generateSDK(spec) {
|
|
183
|
-
const emitter = new Emitter();
|
|
184
|
-
const schemaEndpoint = new SchemaEndpoint();
|
|
195
|
+
const emitter = new Emitter(spec.makeImport);
|
|
196
|
+
const schemaEndpoint = new SchemaEndpoint(spec.makeImport);
|
|
185
197
|
const errors = [];
|
|
186
198
|
for (const [name, operations] of Object.entries(spec.operations)) {
|
|
187
199
|
emitter.addImport(
|
|
188
|
-
`import type * as ${camelcase(name)} from './inputs/${spinalcase(name)}
|
|
200
|
+
`import type * as ${camelcase(name)} from './inputs/${spec.makeImport(spinalcase(name))}';`
|
|
189
201
|
);
|
|
190
202
|
schemaEndpoint.addImport(
|
|
191
|
-
`import * as ${camelcase(name)} from './inputs/${spinalcase(name)}
|
|
203
|
+
`import * as ${camelcase(name)} from './inputs/${spec.makeImport(spinalcase(name))}';`
|
|
192
204
|
);
|
|
193
205
|
for (const operation of operations) {
|
|
194
206
|
const schemaName = camelcase(`${operation.name} schema`);
|
|
@@ -218,7 +230,7 @@ function generateSDK(spec) {
|
|
|
218
230
|
}
|
|
219
231
|
}
|
|
220
232
|
emitter.addImport(
|
|
221
|
-
`import type {${output.import}} from './outputs/${spinalcase(operation.name)}
|
|
233
|
+
`import type {${output.import}} from './outputs/${spec.makeImport(spinalcase(operation.name))}';`
|
|
222
234
|
);
|
|
223
235
|
errors.push(...operation.errors ?? []);
|
|
224
236
|
const addTypeParser = Object.keys(operation.schemas).length > 1;
|
|
@@ -253,7 +265,7 @@ function generateSDK(spec) {
|
|
|
253
265
|
}
|
|
254
266
|
}
|
|
255
267
|
emitter.addImport(
|
|
256
|
-
`import type { ${removeDuplicates(errors, (it) => it).join(", ")} } from './http/response
|
|
268
|
+
`import type { ${removeDuplicates(errors, (it) => it).join(", ")} } from '${spec.makeImport("./http/response")}';`
|
|
257
269
|
);
|
|
258
270
|
return {
|
|
259
271
|
"client.ts": client_default(spec),
|
|
@@ -582,6 +594,9 @@ var TypeScriptDeserialzer = class {
|
|
|
582
594
|
}
|
|
583
595
|
const types = Array.isArray(schema.type) ? schema.type : schema.type ? [schema.type] : [];
|
|
584
596
|
if (!types.length) {
|
|
597
|
+
if ("properties" in schema) {
|
|
598
|
+
return this.object(schema, required);
|
|
599
|
+
}
|
|
585
600
|
return appendOptional("any", required);
|
|
586
601
|
}
|
|
587
602
|
if (types.length > 1) {
|
|
@@ -657,19 +672,24 @@ var ZodDeserialzer = class {
|
|
|
657
672
|
}
|
|
658
673
|
// oneOf() {}
|
|
659
674
|
// enum() {}
|
|
675
|
+
#suffixes = (defaultValue, required, nullable) => {
|
|
676
|
+
return `${nullable ? ".nullable()" : ""}${appendDefault(defaultValue)}${appendOptional2(required)}`;
|
|
677
|
+
};
|
|
660
678
|
/**
|
|
661
679
|
* Convert a basic type (string | number | boolean | object | array, etc.) to Zod.
|
|
662
680
|
* We'll also handle .optional() if needed.
|
|
663
681
|
*/
|
|
664
|
-
normal(type, schema, required = false) {
|
|
682
|
+
normal(type, schema, required = false, nullable = false) {
|
|
665
683
|
switch (type) {
|
|
666
684
|
case "string":
|
|
667
|
-
return this.string(schema, required)
|
|
685
|
+
return `${this.string(schema)}${this.#suffixes(schema.default, required, nullable)}`;
|
|
668
686
|
case "number":
|
|
669
|
-
case "integer":
|
|
670
|
-
|
|
687
|
+
case "integer": {
|
|
688
|
+
const { base, defaultValue } = this.number(schema);
|
|
689
|
+
return `${base}${this.#suffixes(defaultValue, required, nullable)}`;
|
|
690
|
+
}
|
|
671
691
|
case "boolean":
|
|
672
|
-
return `z.boolean()${
|
|
692
|
+
return `z.boolean()${this.#suffixes(schema.default, required, nullable)}`;
|
|
673
693
|
case "object":
|
|
674
694
|
return this.object(schema, required);
|
|
675
695
|
case "array":
|
|
@@ -745,7 +765,7 @@ var ZodDeserialzer = class {
|
|
|
745
765
|
/**
|
|
746
766
|
* Handle a `string` schema with possible format keywords (JSON Schema).
|
|
747
767
|
*/
|
|
748
|
-
string(schema
|
|
768
|
+
string(schema) {
|
|
749
769
|
let base = "z.string()";
|
|
750
770
|
switch (schema.format) {
|
|
751
771
|
case "date-time":
|
|
@@ -787,20 +807,20 @@ var ZodDeserialzer = class {
|
|
|
787
807
|
default:
|
|
788
808
|
break;
|
|
789
809
|
}
|
|
790
|
-
return
|
|
810
|
+
return base;
|
|
791
811
|
}
|
|
792
812
|
/**
|
|
793
813
|
* Handle number/integer constraints from OpenAPI/JSON Schema.
|
|
794
814
|
* In 3.1, exclusiveMinimum/Maximum hold the actual numeric threshold,
|
|
795
815
|
* rather than a boolean toggling `minimum`/`maximum`.
|
|
796
816
|
*/
|
|
797
|
-
number(schema
|
|
798
|
-
let defaultValue = schema.default
|
|
817
|
+
number(schema) {
|
|
818
|
+
let defaultValue = schema.default;
|
|
799
819
|
let base = "z.number()";
|
|
800
820
|
if (schema.format === "int64") {
|
|
801
821
|
base = "z.bigint()";
|
|
802
822
|
if (schema.default !== void 0) {
|
|
803
|
-
defaultValue =
|
|
823
|
+
defaultValue = `BigInt(${schema.default})`;
|
|
804
824
|
}
|
|
805
825
|
}
|
|
806
826
|
if (schema.format === "int32") {
|
|
@@ -821,7 +841,7 @@ var ZodDeserialzer = class {
|
|
|
821
841
|
if (typeof schema.multipleOf === "number") {
|
|
822
842
|
base += `.refine((val) => Number.isInteger(val / ${schema.multipleOf}), "Must be a multiple of ${schema.multipleOf}")`;
|
|
823
843
|
}
|
|
824
|
-
return
|
|
844
|
+
return { base, defaultValue };
|
|
825
845
|
}
|
|
826
846
|
handle(schema, required) {
|
|
827
847
|
if (isRef(schema)) {
|
|
@@ -843,16 +863,18 @@ var ZodDeserialzer = class {
|
|
|
843
863
|
if (!types.length) {
|
|
844
864
|
return `z.unknown()${appendOptional2(required)}`;
|
|
845
865
|
}
|
|
866
|
+
if ("nullable" in schema && schema.nullable) {
|
|
867
|
+
types.push("null");
|
|
868
|
+
}
|
|
846
869
|
if (types.length > 1) {
|
|
847
870
|
const realTypes = types.filter((t) => t !== "null");
|
|
848
871
|
if (realTypes.length === 1 && types.includes("null")) {
|
|
849
|
-
|
|
850
|
-
return `${typeZod}.nullable()${appendOptional2(required)}`;
|
|
872
|
+
return this.normal(realTypes[0], schema, false, true);
|
|
851
873
|
}
|
|
852
874
|
const subSchemas = types.map((t) => this.normal(t, schema, false));
|
|
853
875
|
return `z.union([${subSchemas.join(", ")}])${appendOptional2(required)}`;
|
|
854
876
|
}
|
|
855
|
-
return this.normal(types[0], schema, required);
|
|
877
|
+
return this.normal(types[0], schema, required, false);
|
|
856
878
|
}
|
|
857
879
|
};
|
|
858
880
|
function appendOptional2(isRequired) {
|
|
@@ -901,7 +923,7 @@ function generateCode(config) {
|
|
|
901
923
|
commonZodImports.push({
|
|
902
924
|
defaultImport: void 0,
|
|
903
925
|
isTypeOnly: true,
|
|
904
|
-
moduleSpecifier: `./${model}
|
|
926
|
+
moduleSpecifier: `./${config.makeImport(model)}`,
|
|
905
927
|
namedImports: [{ isTypeOnly: true, name: model }],
|
|
906
928
|
namespaceImport: void 0
|
|
907
929
|
});
|
|
@@ -1008,7 +1030,12 @@ function generateCode(config) {
|
|
|
1008
1030
|
const output = [`import z from 'zod';`];
|
|
1009
1031
|
let parser = "buffered";
|
|
1010
1032
|
for (const status in operation.responses) {
|
|
1011
|
-
const response =
|
|
1033
|
+
const response = isRef(
|
|
1034
|
+
operation.responses[status]
|
|
1035
|
+
) ? followRef(
|
|
1036
|
+
config.spec,
|
|
1037
|
+
operation.responses[status].$ref
|
|
1038
|
+
) : operation.responses[status];
|
|
1012
1039
|
const statusCode = +status;
|
|
1013
1040
|
if (statusCode >= 400) {
|
|
1014
1041
|
errors.push(responses[status] ?? "ProblematicResponse");
|
|
@@ -1028,7 +1055,7 @@ function generateCode(config) {
|
|
|
1028
1055
|
imports.push({
|
|
1029
1056
|
defaultImport: void 0,
|
|
1030
1057
|
isTypeOnly: true,
|
|
1031
|
-
moduleSpecifier: `../models/${schemaName}
|
|
1058
|
+
moduleSpecifier: `../models/${config.makeImport(schemaName)}`,
|
|
1032
1059
|
namedImports: [{ isTypeOnly: true, name: schemaName }],
|
|
1033
1060
|
namespaceImport: void 0
|
|
1034
1061
|
});
|
|
@@ -1103,7 +1130,7 @@ function bodyInputs(config, ctSchema) {
|
|
|
1103
1130
|
}
|
|
1104
1131
|
|
|
1105
1132
|
// packages/typescript/src/lib/http/interceptors.txt
|
|
1106
|
-
var interceptors_default = "export interface Interceptor {\n before?: (request: Request) => Promise<Request> | Request;\n after?: (response: Response) => Promise<Response> | Response;\n}\n\nexport const
|
|
1133
|
+
var interceptors_default = "export interface Interceptor {\n before?: (request: Request) => Promise<Request> | Request;\n after?: (response: Response) => Promise<Response> | Response;\n}\n\nexport const createHeadersInterceptor = (\n defaultHeaders: () => Record<string, string | undefined>,\n requestHeaders: HeadersInit,\n) => {\n return {\n before(request: Request) {\n // Priority Levels\n // 1. Headers Input\n // 2. Request Headers\n // 3. Default Headers\n const headers = defaultHeaders();\n\n for (const [key, value] of new Headers(requestHeaders)) {\n // Only set the header if it doesn't already exist and has a value\n // even though these headers are passed at operation level\n // still they are lower priority compared to the headers input\n if (value !== undefined && !request.headers.has(key)) {\n request.headers.set(key, value);\n }\n }\n\n for (const [key, value] of Object.entries(headers)) {\n // Only set the header if it doesn't already exist and has a value\n if (value !== undefined && !request.headers.has(key)) {\n request.headers.set(key, value);\n }\n }\n\n return request;\n },\n };\n};\n\nexport const createBaseUrlInterceptor = (getBaseUrl: () => string) => {\n return {\n before(request: Request) {\n const baseUrl = getBaseUrl();\n if (request.url.startsWith('local://')) {\n return new Request(request.url.replace('local://', baseUrl), request);\n }\n return request;\n },\n };\n};\n\nexport const logInterceptor = {\n before(request: Request) {\n console.log('Request', request);\n return request;\n },\n after(response: Response) {\n console.log('Response', response);\n return response;\n },\n};\n\n/**\n * Creates an interceptor that logs detailed information about requests and responses.\n * @param options Configuration options for the logger\n * @returns An interceptor object with before and after handlers\n */\nexport const createDetailedLogInterceptor = (options?: {\n logLevel?: 'debug' | 'info' | 'warn' | 'error';\n includeRequestBody?: boolean;\n includeResponseBody?: boolean;\n}) => {\n const logLevel = options?.logLevel || 'info';\n const includeRequestBody = options?.includeRequestBody || false;\n const includeResponseBody = options?.includeResponseBody || false;\n\n return {\n async before(request: Request) {\n const logData = {\n url: request.url,\n method: request.method,\n contentType: request.headers.get('Content-Type'),\n headers: Object.fromEntries([...request.headers.entries()]),\n };\n\n console[logLevel]('\u{1F680} Outgoing Request:', logData);\n\n if (includeRequestBody) {\n try {\n // Clone the request to avoid consuming the body stream\n const clonedRequest = request.clone();\n if (clonedRequest.headers.get('Content-Type')?.includes('application/json')) {\n const body = await clonedRequest.json().catch(() => null);\n console[logLevel]('Request Body:', body);\n } else {\n const body = await clonedRequest.text().catch(() => null);\n console[logLevel]('Request Body:', body);\n }\n } catch (error) {\n console.error('Could not log request body:', error);\n }\n }\n\n return request;\n },\n\n async after(response: Response) {\n const logData = {\n status: response.status,\n statusText: response.statusText,\n url: response.url,\n headers: Object.fromEntries([...response.headers.entries()]),\n };\n\n console[logLevel]('\u{1F4E5} Incoming Response:', logData);\n\n if (includeResponseBody && response.body) {\n try {\n // Clone the response to avoid consuming the body stream\n const clonedResponse = response.clone();\n if (clonedResponse.headers.get('Content-Type')?.includes('application/json')) {\n const body = await clonedResponse.json().catch(() => null);\n console[logLevel]('Response Body:', body);\n } else {\n const body = await clonedResponse.text().catch(() => null);\n if (body) {\n console[logLevel]('Response Body:', body.substring(0, 500) + (body.length > 500 ? '...' : ''));\n } else {\n console[logLevel]('No response body');\n }\n }\n } catch (error) {\n console.error('Could not log response body:', error);\n }\n }\n\n return response;\n },\n };\n};\n";
|
|
1107
1134
|
|
|
1108
1135
|
// packages/typescript/src/lib/http/parse-response.txt
|
|
1109
1136
|
var parse_response_default = 'import { parse } from "fast-content-type-parse";\n\nexport async function handleError(response: Response) {\n try {\n if (response.status >= 400 && response.status < 500) {\n const body = (await response.json()) as Record<string, any>;\n return {\n status: response.status,\n body: body,\n };\n }\n return new Error(\n `An error occurred while fetching the data. Status: ${response.status}`,\n );\n } catch (error) {\n return error as any;\n }\n}\n\nasync function handleChunkedResponse(response: Response, contentType: string) {\n const { type } = parse(contentType);\n\n switch (type) {\n case "application/json": {\n let buffer = "";\n const reader = response.body!.getReader();\n const decoder = new TextDecoder();\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value);\n }\n return JSON.parse(buffer);\n }\n case "text/html":\n case "text/plain": {\n let buffer = "";\n const reader = response.body!.getReader();\n const decoder = new TextDecoder();\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value);\n }\n return buffer;\n }\n default:\n return response.body;\n }\n}\n\nexport function chunked(response: Response) {\n return response.body;\n}\n\nexport async function buffered(response: Response) {\n const contentType = response.headers.get("Content-Type");\n if (!contentType) {\n throw new Error("Content-Type header is missing");\n }\n\n if (response.status === 204) {\n return null;\n }\n\n const { type } = parse(contentType);\n switch (type) {\n case "application/json":\n return response.json();\n case "text/plain":\n return response.text();\n case "text/html":\n return response.text();\n case "text/xml":\n case "application/xml":\n return response.text();\n case "application/x-www-form-urlencoded": {\n const text = await response.text();\n return Object.fromEntries(new URLSearchParams(text));\n }\n case "multipart/form-data":\n return response.formData();\n default:\n throw new Error(`Unsupported content type: ${contentType}`);\n }\n}\n';
|
|
@@ -1118,7 +1145,7 @@ var request_default = "export type Method = 'GET' | 'POST' | 'PUT' | 'PATCH' | '
|
|
|
1118
1145
|
var response_default = "export interface ApiResponse<Status extends number, Body extends unknown> {\n kind: 'response';\n status: Status;\n body: Body;\n}\n\n// 4xx Client Errors\nexport type BadRequest = ApiResponse<400, { message: string }>;\nexport type Unauthorized = ApiResponse<401, { message: string }>;\nexport type PaymentRequired = ApiResponse<402, { message: string }>;\nexport type Forbidden = ApiResponse<403, { message: string }>;\nexport type NotFound = ApiResponse<404, { message: string }>;\nexport type MethodNotAllowed = ApiResponse<405, { message: string }>;\nexport type NotAcceptable = ApiResponse<406, { message: string }>;\nexport type Conflict = ApiResponse<409, { message: string }>;\nexport type Gone = ApiResponse<410, { message: string }>;\nexport type UnprocessableEntity = ApiResponse<422, { message: string; errors?: Record<string, string[]> }>;\nexport type TooManyRequests = ApiResponse<429, { message: string; retryAfter?: string }>;\nexport type PayloadTooLarge = ApiResponse<413, { message: string; }>;\nexport type UnsupportedMediaType = ApiResponse<415, { message: string; }>;\n\n// 5xx Server Errors\nexport type InternalServerError = ApiResponse<500, { message: string }>;\nexport type NotImplemented = ApiResponse<501, { message: string }>;\nexport type BadGateway = ApiResponse<502, { message: string }>;\nexport type ServiceUnavailable = ApiResponse<503, { message: string; retryAfter?: string }>;\nexport type GatewayTimeout = ApiResponse<504, { message: string }>;\n\nexport type ClientError =\n | BadRequest\n | Unauthorized\n | PaymentRequired\n | Forbidden\n | NotFound\n | MethodNotAllowed\n | NotAcceptable\n | Conflict\n | Gone\n | UnprocessableEntity\n | TooManyRequests;\n\nexport type ServerError =\n | InternalServerError\n | NotImplemented\n | BadGateway\n | ServiceUnavailable\n | GatewayTimeout;\n\nexport type ProblematicResponse = ClientError | ServerError;\n";
|
|
1119
1146
|
|
|
1120
1147
|
// packages/typescript/src/lib/http/send-request.txt
|
|
1121
|
-
var send_request_default = "
|
|
1148
|
+
var send_request_default = "\nexport interface RequestSchema {\n schema: z.ZodType;\n toRequest: (input: any) => Request;\n deserializer: (response: Response) => Promise<unknown> | unknown;\n}\n\nexport const fetchType = z\n .function()\n .args(z.instanceof(Request))\n .returns(z.promise(z.instanceof(Response)))\n .optional();\n\nexport async function sendRequest(\n input: unknown,\n route: RequestSchema,\n options: {\n fetch?: z.infer<typeof fetchType>;\n interceptors?: Interceptor[];\n signal?: AbortSignal;\n },\n) {\n const { interceptors = [] } = options;\n const [parsedInput, parseError] = parse(route.schema, input);\n if (parseError) {\n return [null as never, { ...parseError, kind: 'parse' } as never] as const;\n }\n\n let request = route.toRequest(parsedInput as never);\n for (const interceptor of interceptors) {\n if (interceptor.before) {\n request = await interceptor.before(request);\n }\n }\n\n let response = await (options.fetch ?? fetch)(request, { signal: options.signal });\n\n for (let i = interceptors.length - 1; i >= 0; i--) {\n const interceptor = interceptors[i];\n if (interceptor.after) {\n response = await interceptor.after(response.clone());\n }\n }\n\n if (response.ok) {\n const data = await route.deserializer(response);\n return [data as never, null] as const;\n }\n const error = await handleError(response);\n return [null as never, { ...error, kind: 'response' }] as const;\n}\n";
|
|
1122
1149
|
|
|
1123
1150
|
// packages/typescript/src/lib/generate.ts
|
|
1124
1151
|
function security(spec) {
|
|
@@ -1142,10 +1169,15 @@ function security(spec) {
|
|
|
1142
1169
|
return options;
|
|
1143
1170
|
}
|
|
1144
1171
|
async function generate(spec, settings) {
|
|
1172
|
+
settings.useTsExtension ??= true;
|
|
1173
|
+
const makeImport = (moduleSpecifier) => {
|
|
1174
|
+
return settings.useTsExtension ? `${moduleSpecifier}.ts` : moduleSpecifier;
|
|
1175
|
+
};
|
|
1145
1176
|
const { commonSchemas, groups, outputs, commonZod } = generateCode({
|
|
1146
1177
|
spec,
|
|
1147
1178
|
style: "github",
|
|
1148
|
-
target: "javascript"
|
|
1179
|
+
target: "javascript",
|
|
1180
|
+
makeImport
|
|
1149
1181
|
});
|
|
1150
1182
|
const output = settings.mode === "full" ? join(settings.output, "src") : settings.output;
|
|
1151
1183
|
const options = security(spec);
|
|
@@ -1153,9 +1185,10 @@ async function generate(spec, settings) {
|
|
|
1153
1185
|
name: settings.name || "Client",
|
|
1154
1186
|
operations: groups,
|
|
1155
1187
|
servers: spec.servers?.map((server) => server.url) || [],
|
|
1156
|
-
options
|
|
1188
|
+
options,
|
|
1189
|
+
makeImport
|
|
1157
1190
|
});
|
|
1158
|
-
const inputFiles = generateInputs(groups, commonZod);
|
|
1191
|
+
const inputFiles = generateInputs(groups, commonZod, makeImport);
|
|
1159
1192
|
await writeFiles(output, {
|
|
1160
1193
|
"outputs/.gitkeep": "",
|
|
1161
1194
|
"inputs/.gitkeep": "",
|
|
@@ -1165,7 +1198,11 @@ async function generate(spec, settings) {
|
|
|
1165
1198
|
await writeFiles(join(output, "http"), {
|
|
1166
1199
|
"interceptors.ts": interceptors_default,
|
|
1167
1200
|
"parse-response.ts": parse_response_default,
|
|
1168
|
-
"send-request.ts":
|
|
1201
|
+
"send-request.ts": `import z from 'zod';
|
|
1202
|
+
import type { Interceptor } from './${makeImport("interceptors")}';
|
|
1203
|
+
import { handleError } from './${makeImport("parse-response")}';
|
|
1204
|
+
import { parse } from './${makeImport("parser")}';
|
|
1205
|
+
${send_request_default}`,
|
|
1169
1206
|
"response.ts": response_default,
|
|
1170
1207
|
"parser.ts": parser_default,
|
|
1171
1208
|
"request.ts": request_default
|
|
@@ -1189,17 +1226,20 @@ async function generate(spec, settings) {
|
|
|
1189
1226
|
)
|
|
1190
1227
|
});
|
|
1191
1228
|
const folders = [
|
|
1192
|
-
getFolderExports(output),
|
|
1193
|
-
getFolderExports(join(output, "outputs")),
|
|
1229
|
+
getFolderExports(output, settings.useTsExtension),
|
|
1230
|
+
getFolderExports(join(output, "outputs"), settings.useTsExtension),
|
|
1194
1231
|
getFolderExports(
|
|
1195
1232
|
join(output, "inputs"),
|
|
1233
|
+
settings.useTsExtension,
|
|
1196
1234
|
["ts"],
|
|
1197
1235
|
(dirent) => dirent.isDirectory() && dirent.name === "schemas"
|
|
1198
1236
|
),
|
|
1199
|
-
getFolderExports(join(output, "http"))
|
|
1237
|
+
getFolderExports(join(output, "http"), settings.useTsExtension)
|
|
1200
1238
|
];
|
|
1201
1239
|
if (modelsImports.length) {
|
|
1202
|
-
folders.push(
|
|
1240
|
+
folders.push(
|
|
1241
|
+
getFolderExports(join(output, "models"), settings.useTsExtension)
|
|
1242
|
+
);
|
|
1203
1243
|
}
|
|
1204
1244
|
const [index, outputIndex, inputsIndex, httpIndex, modelsIndex] = await Promise.all(folders);
|
|
1205
1245
|
await writeFiles(output, {
|
|
@@ -1237,6 +1277,7 @@ async function generate(spec, settings) {
|
|
|
1237
1277
|
target: "ESNext",
|
|
1238
1278
|
module: "ESNext",
|
|
1239
1279
|
noEmit: true,
|
|
1280
|
+
strict: true,
|
|
1240
1281
|
allowImportingTsExtensions: true,
|
|
1241
1282
|
verbatimModuleSyntax: true,
|
|
1242
1283
|
baseUrl: ".",
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/lib/generate.ts", "../src/lib/generator.ts", "../src/lib/utils.ts", "../src/lib/sdk.ts", "../src/lib/client.ts", "../src/lib/emitters/interface.ts", "../src/lib/emitters/zod.ts", "../src/lib/http/interceptors.txt", "../src/lib/http/parse-response.txt", "../src/lib/http/parser.txt", "../src/lib/http/request.txt", "../src/lib/http/response.txt", "../src/lib/http/send-request.txt", "../src/lib/watcher.ts"],
|
|
4
|
-
"sourcesContent": ["import { join } from 'node:path';\nimport { npmRunPathEnv } from 'npm-run-path';\nimport type { OpenAPIObject } from 'openapi3-ts/oas31';\n\nimport { getFolderExports, methods, writeFiles } from '@sdk-it/core';\n\nimport { generateCode } from './generator.ts';\nimport interceptors from './http/interceptors.txt';\nimport parseResponse from './http/parse-response.txt';\nimport parserTxt from './http/parser.txt';\nimport requestTxt from './http/request.txt';\nimport responseTxt from './http/response.txt';\nimport sendRequest from './http/send-request.txt';\nimport { generateInputs, generateSDK } from './sdk.ts';\nimport { exclude, securityToOptions } from './utils.ts';\n\nfunction security(spec: OpenAPIObject) {\n const security = spec.security || [];\n const components = spec.components || {};\n const securitySchemas = components.securitySchemes || {};\n const paths = Object.values(spec.paths ?? {});\n\n const options = securityToOptions(security, securitySchemas);\n\n for (const it of paths) {\n for (const method of methods) {\n const operation = it[method];\n if (!operation) {\n continue;\n }\n Object.assign(\n options,\n securityToOptions(operation.security || [], securitySchemas, 'input'),\n );\n }\n }\n return options;\n}\n\nexport async function generate(\n spec: OpenAPIObject,\n settings: {\n output: string;\n name?: string;\n /**\n * full: generate a full project including package.json and tsconfig.json. useful for monorepo/workspaces\n * minimal: generate only the client sdk\n */\n mode?: 'full' | 'minimal';\n formatCode?: (options: {\n output: string;\n env: ReturnType<typeof npmRunPathEnv>;\n }) => void | Promise<void>;\n },\n) {\n const { commonSchemas, groups, outputs, commonZod } = generateCode({\n spec,\n style: 'github',\n target: 'javascript',\n });\n const output =\n settings.mode === 'full' ? join(settings.output, 'src') : settings.output;\n\n const options = security(spec);\n\n const clientFiles = generateSDK({\n name: settings.name || 'Client',\n operations: groups,\n servers: spec.servers?.map((server) => server.url) || [],\n options: options,\n });\n\n // const readme = generateReadme(spec, {\n // name: settings.name || 'Client',\n // });\n\n const inputFiles = generateInputs(groups, commonZod);\n\n await writeFiles(output, {\n 'outputs/.gitkeep': '',\n 'inputs/.gitkeep': '',\n 'models/.getkeep': '',\n // 'README.md': readme,\n });\n\n await writeFiles(join(output, 'http'), {\n 'interceptors.ts': interceptors,\n 'parse-response.ts': parseResponse,\n 'send-request.ts': sendRequest,\n 'response.ts': responseTxt,\n 'parser.ts': parserTxt,\n 'request.ts': requestTxt,\n });\n\n await writeFiles(join(output, 'outputs'), outputs);\n const modelsImports = Object.entries(commonSchemas).map(([name]) => name);\n await writeFiles(output, {\n ...clientFiles,\n ...inputFiles,\n ...Object.fromEntries(\n Object.entries(commonSchemas).map(([name, schema]) => [\n `models/${name}.ts`,\n [\n `import { z } from 'zod';`,\n ...exclude(modelsImports, [name]).map(\n (it) => `import type { ${it} } from './${it}.ts';`,\n ),\n `export type ${name} = ${schema};`,\n ].join('\\n'),\n ]),\n ),\n });\n\n const folders = [\n getFolderExports(output),\n getFolderExports(join(output, 'outputs')),\n getFolderExports(\n join(output, 'inputs'),\n ['ts'],\n (dirent) => dirent.isDirectory() && dirent.name === 'schemas',\n ),\n getFolderExports(join(output, 'http')),\n ];\n if (modelsImports.length) {\n folders.push(getFolderExports(join(output, 'models')));\n }\n const [index, outputIndex, inputsIndex, httpIndex, modelsIndex] =\n await Promise.all(folders);\n await writeFiles(output, {\n 'index.ts': index,\n 'outputs/index.ts': outputIndex,\n 'inputs/index.ts': inputsIndex || null,\n 'http/index.ts': httpIndex,\n ...(modelsImports.length ? { 'models/index.ts': modelsIndex } : {}),\n });\n if (settings.mode === 'full') {\n await writeFiles(settings.output, {\n 'package.json': {\n ignoreIfExists: true,\n content: JSON.stringify(\n {\n name: 'sdk',\n type: 'module',\n main: './src/index.ts',\n dependencies: {\n 'fast-content-type-parse': '^3.0.0',\n zod: '^3.24.2',\n },\n },\n null,\n 2,\n ),\n },\n 'tsconfig.json': {\n ignoreIfExists: true,\n content: JSON.stringify(\n {\n compilerOptions: {\n skipLibCheck: true,\n skipDefaultLibCheck: true,\n target: 'ESNext',\n module: 'ESNext',\n noEmit: true,\n allowImportingTsExtensions: true,\n verbatimModuleSyntax: true,\n baseUrl: '.',\n moduleResolution: 'bundler',\n },\n include: ['**/*.ts'],\n },\n null,\n 2,\n ),\n },\n });\n }\n\n await settings.formatCode?.({\n output: output,\n env: npmRunPathEnv(),\n });\n}\n", "import { get, merge } from 'lodash-es';\nimport type {\n ContentObject,\n OpenAPIObject,\n OperationObject,\n ParameterLocation,\n ParameterObject,\n ReferenceObject,\n ResponseObject,\n SchemaObject,\n} from 'openapi3-ts/oas31';\nimport { camelcase, pascalcase, spinalcase } from 'stringcase';\n\nimport { TypeScriptDeserialzer } from './emitters/interface.ts';\nimport { ZodDeserialzer } from './emitters/zod.ts';\nimport {\n type Operation,\n type OperationInput,\n type Parser,\n type Spec,\n} from './sdk.ts';\nimport { followRef, isRef, securityToOptions, useImports } from './utils.ts';\n\nexport interface NamedImport {\n name: string;\n alias?: string;\n isTypeOnly: boolean;\n}\nexport interface Import {\n isTypeOnly: boolean;\n moduleSpecifier: string;\n defaultImport: string | undefined;\n namedImports: NamedImport[];\n namespaceImport: string | undefined;\n}\n\nconst responses: Record<string, string> = {\n '400': 'BadRequest',\n '401': 'Unauthorized',\n '402': 'PaymentRequired',\n '403': 'Forbidden',\n '404': 'NotFound',\n '405': 'MethodNotAllowed',\n '406': 'NotAcceptable',\n '409': 'Conflict',\n '413': 'PayloadTooLarge',\n '410': 'Gone',\n '422': 'UnprocessableEntity',\n '429': 'TooManyRequests',\n '500': 'InternalServerError',\n '501': 'NotImplemented',\n '502': 'BadGateway',\n '503': 'ServiceUnavailable',\n '504': 'GatewayTimeout',\n};\n\nexport interface GenerateSdkConfig {\n spec: OpenAPIObject;\n target?: 'javascript';\n /**\n * No support for jsdoc in vscode\n * @issue https://github.com/microsoft/TypeScript/issues/38106\n */\n style?: 'github';\n operationId?: (\n operation: OperationObject,\n path: string,\n method: string,\n ) => string;\n}\n\nexport const defaults: Partial<GenerateSdkConfig> &\n Required<Pick<GenerateSdkConfig, 'operationId'>> = {\n target: 'javascript',\n style: 'github',\n operationId: (operation, path, method) => {\n if (operation.operationId) {\n return spinalcase(operation.operationId);\n }\n return camelcase(`${method} ${path.replace(/[\\\\/\\\\{\\\\}]/g, ' ').trim()}`);\n },\n};\n\nexport function generateCode(config: GenerateSdkConfig) {\n const commonSchemas: Record<string, string> = {};\n const commonZod = new Map<string, string>();\n const commonZodImports: Import[] = [];\n const zodDeserialzer = new ZodDeserialzer(config.spec, (model, schema) => {\n commonZod.set(model, schema);\n commonZodImports.push({\n defaultImport: undefined,\n isTypeOnly: true,\n moduleSpecifier: `./${model}.ts`,\n namedImports: [{ isTypeOnly: true, name: model }],\n namespaceImport: undefined,\n });\n });\n\n const groups: Spec['operations'] = {};\n const outputs: Record<string, string> = {};\n\n for (const [path, methods] of Object.entries(config.spec.paths ?? {})) {\n for (const [method, operation] of Object.entries(methods) as [\n string,\n OperationObject,\n ][]) {\n const formatOperationId = config.operationId ?? defaults.operationId;\n const operationName = formatOperationId(operation, path, method);\n\n console.log(`Processing ${method} ${path}`);\n const [groupName] = Array.isArray(operation.tags)\n ? operation.tags\n : ['unknown'];\n groups[groupName] ??= [];\n const inputs: Operation['inputs'] = {};\n\n const additionalProperties: ParameterObject[] = [];\n for (const param of operation.parameters ?? []) {\n if (isRef(param)) {\n throw new Error(`Found reference in parameter ${param.$ref}`);\n }\n if (!param.schema) {\n throw new Error(`Schema not found for parameter ${param.name}`);\n }\n inputs[param.name] = {\n in: param.in,\n schema: '',\n };\n additionalProperties.push(param);\n }\n\n const security = operation.security ?? [];\n const securitySchemas = config.spec.components?.securitySchemes ?? {};\n\n const securityOptions = securityToOptions(security, securitySchemas);\n\n Object.assign(inputs, securityOptions);\n\n additionalProperties.push(\n ...Object.entries(securityOptions).map(\n ([name, value]) =>\n ({\n name: name,\n required: false,\n schema: {\n type: 'string',\n },\n in: value.in as ParameterLocation,\n }) satisfies ParameterObject,\n ),\n );\n\n const types: Record<string, string> = {};\n const shortContenTypeMap: Record<string, string> = {\n 'application/json': 'json',\n 'application/x-www-form-urlencoded': 'urlencoded',\n 'multipart/form-data': 'formdata',\n 'application/xml': 'xml',\n 'text/plain': 'text',\n };\n let outgoingContentType: string | undefined;\n if (operation.requestBody && Object.keys(operation.requestBody).length) {\n const content: ContentObject = isRef(operation.requestBody)\n ? get(followRef(config.spec, operation.requestBody.$ref), ['content'])\n : operation.requestBody.content;\n\n for (const type in content) {\n const ctSchema = isRef(content[type].schema)\n ? followRef(config.spec, content[type].schema.$ref)\n : content[type].schema;\n if (!ctSchema) {\n console.warn(`Schema not found for ${type}`);\n continue;\n }\n\n const schema = merge({}, ctSchema, {\n required: additionalProperties\n .filter((p) => p.required)\n .map((p) => p.name),\n properties: additionalProperties.reduce<Record<string, unknown>>(\n (acc, p) => ({\n ...acc,\n [p.name]: p.schema,\n }),\n {},\n ),\n });\n\n Object.assign(inputs, bodyInputs(config, ctSchema));\n types[shortContenTypeMap[type]] = zodDeserialzer.handle(schema, true);\n }\n\n if (content['application/json']) {\n outgoingContentType = 'json';\n } else if (content['application/x-www-form-urlencoded']) {\n outgoingContentType = 'urlencoded';\n } else if (content['multipart/form-data']) {\n outgoingContentType = 'formdata';\n } else {\n outgoingContentType = 'json';\n }\n } else {\n const properties = additionalProperties.reduce<Record<string, any>>(\n (acc, p) => ({\n ...acc,\n [p.name]: p.schema,\n }),\n {},\n );\n types[shortContenTypeMap['application/json']] = zodDeserialzer.handle(\n {\n type: 'object',\n required: additionalProperties\n .filter((p) => p.required)\n .map((p) => p.name),\n properties,\n },\n true,\n );\n }\n\n const errors: string[] = [];\n operation.responses ??= {};\n\n let foundResponse = false;\n const output = [`import z from 'zod';`];\n let parser: Parser = 'buffered';\n for (const status in operation.responses) {\n const response = operation.responses[status] as ResponseObject;\n const statusCode = +status;\n if (statusCode >= 400) {\n errors.push(responses[status] ?? 'ProblematicResponse');\n }\n if (statusCode >= 200 && statusCode < 300) {\n foundResponse = true;\n const responseContent = get(response, ['content']);\n const isJson = responseContent && responseContent['application/json'];\n if ((response.headers ?? {})['Transfer-Encoding']) {\n parser = 'chunked';\n }\n // TODO: how the user is going to handle multiple response types\n const imports: Import[] = [];\n const typeScriptDeserialzer = new TypeScriptDeserialzer(\n config.spec,\n (schemaName, zod) => {\n commonSchemas[schemaName] = zod;\n imports.push({\n defaultImport: undefined,\n isTypeOnly: true,\n moduleSpecifier: `../models/${schemaName}.ts`,\n namedImports: [{ isTypeOnly: true, name: schemaName }],\n namespaceImport: undefined,\n });\n },\n );\n const responseSchema = isJson\n ? typeScriptDeserialzer.handle(\n responseContent['application/json'].schema!,\n true,\n )\n : 'ReadableStream'; // non-json response treated as stream\n output.push(...useImports(responseSchema, imports));\n output.push(\n `export type ${pascalcase(operationName + ' output')} = ${responseSchema}`,\n );\n }\n }\n\n if (!foundResponse) {\n output.push(\n `export type ${pascalcase(operationName + ' output')} = void`,\n );\n }\n outputs[`${spinalcase(operationName)}.ts`] = output.join('\\n');\n groups[groupName].push({\n name: operationName,\n type: 'http',\n inputs,\n errors: errors.length ? errors : ['ServerError'],\n outgoingContentType,\n schemas: types,\n parser,\n formatOutput: () => ({\n import: pascalcase(operationName + ' output'),\n use: pascalcase(operationName + ' output'),\n }),\n trigger: {\n path,\n method,\n },\n });\n }\n }\n\n return { groups, commonSchemas, commonZod, outputs };\n}\n\n// TODO - USE CASES\n// 1. Some parameters conflicts with request body\n// 2. Generate 400 and 500 response variations // done\n// 3. Generate 200 response variations\n// 3. Doc Security\n// 4. Operation Security\n// 5. JsDocs\n// 5. test all different types of parameters\n// 6. cookies\n// 6. x-www-form-urlencoded // done\n// 7. multipart/form-data // done\n// 7. application/octet-stream // done\n// 7. chunked response // done\n\nfunction toProps(\n spec: OpenAPIObject,\n schemaOrRef: SchemaObject | ReferenceObject,\n aggregator: string[] = [],\n) {\n if (isRef(schemaOrRef)) {\n const schema = followRef(spec, schemaOrRef.$ref);\n return toProps(spec, schema, aggregator);\n } else if (schemaOrRef.type === 'object') {\n for (const [name] of Object.entries(schemaOrRef.properties ?? {})) {\n aggregator.push(name);\n }\n return void 0;\n } else if (schemaOrRef.allOf) {\n for (const it of schemaOrRef.allOf) {\n toProps(spec, it, aggregator);\n }\n return void 0;\n }\n}\n\nfunction bodyInputs(\n config: GenerateSdkConfig,\n ctSchema: SchemaObject | ReferenceObject,\n) {\n const props: string[] = [];\n toProps(config.spec, ctSchema, props);\n return props.reduce<Record<string, OperationInput>>(\n (acc, prop) => ({\n ...acc,\n [prop]: {\n in: 'body',\n schema: '',\n },\n }),\n {},\n );\n}\n", "import { get } from 'lodash-es';\nimport type {\n ComponentsObject,\n OpenAPIObject,\n ReferenceObject,\n SchemaObject,\n SecurityRequirementObject,\n} from 'openapi3-ts/oas31';\n\nimport { removeDuplicates } from '@sdk-it/core';\n\nimport { type Options } from './sdk.ts';\n\nexport function isRef(obj: any): obj is ReferenceObject {\n return '$ref' in obj;\n}\n\nexport function cleanRef(ref: string) {\n return ref.replace(/^#\\//, '');\n}\n\nexport function parseRef(ref: string) {\n const parts = ref.split('/');\n const [model] = parts.splice(-1);\n return { model, path: parts.join('/') };\n}\nexport function followRef(spec: OpenAPIObject, ref: string): SchemaObject {\n const pathParts = cleanRef(ref).split('/');\n const entry = get(spec, pathParts) as SchemaObject | ReferenceObject;\n if (entry && '$ref' in entry) {\n return followRef(spec, entry.$ref);\n }\n return entry;\n}\nexport function securityToOptions(\n security: SecurityRequirementObject[],\n securitySchemas: ComponentsObject['securitySchemes'],\n staticIn?: string,\n) {\n securitySchemas ??= {};\n const options: Options = {};\n for (const it of security) {\n const [name] = Object.keys(it);\n const schema = securitySchemas[name];\n if (isRef(schema)) {\n throw new Error(`Ref security schemas are not supported`);\n }\n if (schema.type === 'http') {\n options['authorization'] = {\n in: staticIn ?? 'header',\n schema:\n 'z.string().optional().transform((val) => (val ? `Bearer ${val}` : undefined))',\n optionName: 'token',\n };\n continue;\n }\n if (schema.type === 'apiKey') {\n if (!schema.in) {\n throw new Error(`apiKey security schema must have an \"in\" field`);\n }\n if (!schema.name) {\n throw new Error(`apiKey security schema must have a \"name\" field`);\n }\n options[schema.name] = {\n in: staticIn ?? schema.in,\n schema: 'z.string().optional()',\n };\n continue;\n }\n }\n return options;\n}\n\nexport function mergeImports(imports: Import[]) {\n const merged: Record<string, Import> = {};\n\n for (const i of imports) {\n merged[i.moduleSpecifier] = merged[i.moduleSpecifier] ?? {\n moduleSpecifier: i.moduleSpecifier,\n defaultImport: i.defaultImport,\n namespaceImport: i.namespaceImport,\n namedImports: [],\n };\n if (i.namedImports) {\n merged[i.moduleSpecifier].namedImports.push(...i.namedImports);\n }\n }\n\n return Object.values(merged);\n}\nexport interface Import {\n isTypeOnly: boolean;\n moduleSpecifier: string;\n defaultImport: string | undefined;\n namedImports: NamedImport[];\n namespaceImport: string | undefined;\n}\nexport interface NamedImport {\n name: string;\n alias?: string;\n isTypeOnly: boolean;\n}\n\nexport function importsToString(...imports: Import[]) {\n return imports.map((it) => {\n if (it.defaultImport) {\n return `import ${it.defaultImport} from '${it.moduleSpecifier}'`;\n }\n if (it.namespaceImport) {\n return `import * as ${it.namespaceImport} from '${it.moduleSpecifier}'`;\n }\n if (it.namedImports) {\n return `import {${removeDuplicates(it.namedImports, (it) => it.name)\n .map((n) => `${n.isTypeOnly ? 'type' : ''} ${n.name}`)\n .join(', ')}} from '${it.moduleSpecifier}'`;\n }\n throw new Error(`Invalid import ${JSON.stringify(it)}`);\n });\n}\n\nexport function exclude<T>(list: T[], exclude: T[]): T[] {\n return list.filter((it) => !exclude.includes(it));\n}\n\nexport function useImports(content: string, imports: Import[]) {\n const output: string[] = [];\n for (const it of mergeImports(imports)) {\n const singleImport = it.defaultImport ?? it.namespaceImport;\n if (singleImport && content.includes(singleImport)) {\n output.push(importsToString(it).join('\\n'));\n } else if (it.namedImports.length) {\n for (const namedImport of it.namedImports) {\n if (content.includes(namedImport.name)) {\n output.push(importsToString(it).join('\\n'));\n }\n }\n }\n }\n return output;\n}\n", "import { camelcase, spinalcase } from 'stringcase';\n\nimport { removeDuplicates, toLitObject } from '@sdk-it/core';\n\nimport backend from './client.ts';\n\nexport type Parser = 'chunked' | 'buffered';\nclass SchemaEndpoint {\n #imports: string[] = [\n `import z from 'zod';`,\n 'import type { Endpoints } from \"./endpoints.ts\";',\n `import { toRequest, json, urlencoded, nobody, formdata, createUrl } from './http/request.ts';`,\n `import type { ParseError } from './http/parser.ts';`,\n 'import { chunked, buffered } from \"./http/parse-response.ts\";',\n ];\n #endpoints: string[] = [];\n addEndpoint(endpoint: string, operation: any) {\n this.#endpoints.push(` \"${endpoint}\": ${operation},`);\n }\n addImport(value: string) {\n this.#imports.push(value);\n }\n complete() {\n return `${this.#imports.join('\\n')}\\nexport default {\\n${this.#endpoints.join('\\n')}\\n}`;\n }\n}\nclass Emitter {\n protected imports: string[] = [\n `import type z from 'zod';`,\n `import type { ParseError } from './http/parser.ts';`,\n ];\n protected endpoints: string[] = [];\n addEndpoint(endpoint: string, operation: any) {\n this.endpoints.push(` \"${endpoint}\": ${operation};`);\n }\n addImport(value: string) {\n this.imports.push(value);\n }\n complete() {\n return `${this.imports.join('\\n')}\\nexport interface Endpoints {\\n${this.endpoints.join('\\n')}\\n}`;\n }\n}\nclass StreamEmitter extends Emitter {\n override complete() {\n return `${this.imports.join('\\n')}\\nexport interface StreamEndpoints {\\n${this.endpoints.join('\\n')}\\n}`;\n }\n}\n\nexport interface SdkConfig {\n /**\n * The name of the sdk client\n */\n name: string;\n packageName?: string;\n options?: Record<string, any>;\n emptyBodyAsNull?: boolean;\n stripBodyFromGetAndHead?: boolean;\n output: string;\n}\n\nexport type Options = Record<\n string,\n {\n in: string;\n schema: string;\n optionName?: string;\n }\n>;\nexport interface Spec {\n operations: Record<string, Operation[]>;\n name: string;\n options: Options;\n servers: string[];\n}\n\nexport interface OperationInput {\n in: string;\n schema: string;\n}\nexport interface Operation {\n name: string;\n errors: string[];\n type: string;\n trigger: Record<string, any>;\n outgoingContentType?: string;\n parser: Parser;\n schemas: Record<string, string>;\n inputs: Record<string, OperationInput>;\n formatOutput: () => { import: string; use: string };\n}\n\nexport function generateInputs(\n operationsSet: Spec['operations'],\n commonZod: Map<string, string>,\n) {\n const commonImports = commonZod.keys().toArray();\n const inputs: Record<string, string> = {};\n for (const [name, operations] of Object.entries(operationsSet)) {\n const output: string[] = [];\n const imports = new Set(['import { z } from \"zod\";']);\n\n for (const operation of operations) {\n const schemaName = camelcase(`${operation.name} schema`);\n\n const schema = `export const ${schemaName} = ${\n Object.keys(operation.schemas).length === 1\n ? Object.values(operation.schemas)[0]\n : toLitObject(operation.schemas)\n };`;\n\n const inputContent = schema;\n\n for (const schema of commonImports) {\n if (inputContent.includes(schema)) {\n imports.add(\n `import { ${schema} } from './schemas/${spinalcase(schema)}.ts';`,\n );\n }\n }\n output.push(inputContent);\n }\n inputs[`inputs/${spinalcase(name)}.ts`] =\n [...imports, ...output].join('\\n') + '\\n';\n }\n\n const schemas = commonZod\n .entries()\n .reduce<string[][]>((acc, [name, schema]) => {\n const output = [`import { z } from 'zod';`];\n const content = `export const ${name} = ${schema};`;\n for (const schema of commonImports) {\n const preciseMatch = new RegExp(`\\\\b${schema}\\\\b`);\n if (preciseMatch.test(content) && schema !== name) {\n output.push(\n `import { ${schema} } from './${spinalcase(schema)}.ts';`,\n );\n }\n }\n\n output.push(content);\n return [\n [`inputs/schemas/${spinalcase(name)}.ts`, output.join('\\n')],\n ...acc,\n ];\n }, []);\n\n return {\n ...Object.fromEntries(schemas),\n ...inputs,\n };\n}\n\nexport function generateSDK(spec: Spec) {\n const emitter = new Emitter();\n const schemaEndpoint = new SchemaEndpoint();\n const errors: string[] = [];\n for (const [name, operations] of Object.entries(spec.operations)) {\n emitter.addImport(\n `import type * as ${camelcase(name)} from './inputs/${spinalcase(name)}.ts';`,\n );\n schemaEndpoint.addImport(\n `import * as ${camelcase(name)} from './inputs/${spinalcase(name)}.ts';`,\n );\n for (const operation of operations) {\n const schemaName = camelcase(`${operation.name} schema`);\n const schemaRef = `${camelcase(name)}.${schemaName}`;\n const output = operation.formatOutput();\n const inputHeaders: string[] = [];\n const inputQuery: string[] = [];\n const inputBody: string[] = [];\n const inputParams: string[] = [];\n for (const [name, prop] of Object.entries(operation.inputs)) {\n if (prop.in === 'headers' || prop.in === 'header') {\n inputHeaders.push(`\"${name}\"`);\n } else if (prop.in === 'query') {\n inputQuery.push(`\"${name}\"`);\n } else if (prop.in === 'body') {\n inputBody.push(`\"${name}\"`);\n } else if (prop.in === 'path') {\n inputParams.push(`\"${name}\"`);\n } else if (prop.in === 'internal') {\n // ignore internal sources\n continue;\n } else {\n throw new Error(\n `Unknown source ${prop.in} in ${name} ${JSON.stringify(\n prop,\n )} in ${operation.name}`,\n );\n }\n }\n emitter.addImport(\n `import type {${output.import}} from './outputs/${spinalcase(operation.name)}.ts';`,\n );\n errors.push(...(operation.errors ?? []));\n\n const addTypeParser = Object.keys(operation.schemas).length > 1;\n for (const type in operation.schemas ?? {}) {\n let typePrefix = '';\n if (addTypeParser && type !== 'json') {\n typePrefix = `${type} `;\n }\n const input = `typeof ${schemaRef}${addTypeParser ? `.${type}` : ''}`;\n\n const endpoint = `${typePrefix}${operation.trigger.method.toUpperCase()} ${operation.trigger.path}`;\n emitter.addEndpoint(\n endpoint,\n `{input: z.infer<${input}>; output: ${output.use}; error: ${(operation.errors ?? ['ServerError']).concat(`ParseError<${input}>`).join('|')}}`,\n );\n schemaEndpoint.addEndpoint(\n endpoint,\n `{\n schema: ${schemaRef}${addTypeParser ? `.${type}` : ''},\n deserializer: ${operation.parser === 'chunked' ? 'chunked' : 'buffered'},\n toRequest(input: Endpoints['${endpoint}']['input']) {\n const endpoint = '${endpoint}';\n return toRequest(endpoint, ${operation.outgoingContentType || 'nobody'}(input, {\n inputHeaders: [${inputHeaders}],\n inputQuery: [${inputQuery}],\n inputBody: [${inputBody}],\n inputParams: [${inputParams}],\n }));\n },\n }`,\n );\n }\n }\n }\n\n emitter.addImport(\n `import type { ${removeDuplicates(errors, (it) => it).join(', ')} } from './http/response.ts';`,\n );\n return {\n 'client.ts': backend(spec),\n 'schemas.ts': schemaEndpoint.complete(),\n 'endpoints.ts': emitter.complete(),\n };\n}\n", "import { toLitObject } from '@sdk-it/core';\n\nimport type { Spec } from './sdk.ts';\n\nexport default (spec: Spec) => {\n const optionsEntries = Object.entries(spec.options).map(\n ([key, value]) => [`'${key}'`, value] as const,\n );\n const defaultHeaders = `{${optionsEntries\n .filter(([, value]) => value.in === 'header')\n .map(\n ([key, value]) =>\n `${key}: this.options[${value.optionName ? `'${value.optionName}'` : key}]`,\n )\n .join(',\\n')}}`;\n const defaultInputs = `{${optionsEntries\n .filter(([, value]) => value.in === 'input')\n .map(\n ([key, value]) =>\n `${key}: this.options[${value.optionName ? `'${value.optionName}'` : key}]`,\n )\n .join(',\\n')}}`;\n const specOptions: Record<string, { schema: string }> = {\n ...Object.fromEntries(\n optionsEntries.map(([key, value]) => [value.optionName ?? key, value]),\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 };\n\n return `\nimport { fetchType, sendRequest } from './http/send-request.ts';\nimport z from 'zod';\nimport type { Endpoints } from './endpoints.ts';\nimport schemas from './schemas.ts';\nimport {\n createBaseUrlInterceptor,\n createDefaultHeadersInterceptor,\n} from './http/interceptors.ts';\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.infer<typeof optionsSchema>;\n\nexport class ${spec.name} {\n public options: ${spec.name}Options\n constructor(options: ${spec.name}Options) {\n this.options = optionsSchema.parse(options);\n }\n\n async request<E extends keyof Endpoints>(\n endpoint: E,\n input: Endpoints[E]['input'],\n ): Promise<readonly [Endpoints[E]['output'], Endpoints[E]['error'] | null]> {\n const route = schemas[endpoint];\n return sendRequest(Object.assign(this.#defaultInputs, input), route, {\n fetch: this.options.fetch,\n interceptors: [\n createDefaultHeadersInterceptor(() => this.defaultHeaders),\n createBaseUrlInterceptor(() => this.options.baseUrl),\n ],\n });\n }\n\n get defaultHeaders() {\n return ${defaultHeaders}\n }\n\n get #defaultInputs() {\n return ${defaultInputs}\n }\n\n setOptions(options: Partial<${spec.name}Options>) {\n const validated = optionsSchema.partial().parse(options);\n\n for (const key of Object.keys(validated) as (keyof ${spec.name}Options)[]) {\n if (validated[key] !== undefined) {\n (this.options[key] as typeof validated[typeof key]) = validated[key]!;\n }\n }\n }\n}`;\n};\n", "import type {\n OpenAPIObject,\n ReferenceObject,\n SchemaObject,\n} from 'openapi3-ts/oas31';\n\nimport { cleanRef, followRef, isRef, parseRef } from '../utils.ts';\n\ntype OnRefCallback = (ref: string, interfaceContent: string) => void;\n\n/**\n * Convert an OpenAPI (JSON Schema style) object into TypeScript interfaces,\n * following the same pattern as ZodDeserialzer for easy interchangeability.\n */\nexport class TypeScriptDeserialzer {\n circularRefTracker = new Set<string>();\n #spec: OpenAPIObject;\n #onRef: OnRefCallback;\n\n constructor(spec: OpenAPIObject, onRef: OnRefCallback) {\n this.#spec = spec;\n this.#onRef = onRef;\n }\n #stringifyKey = (key: string): string => {\n // List of JavaScript keywords and special object properties that should be quoted\n const reservedWords = [\n 'constructor',\n 'prototype',\n 'break',\n 'case',\n 'catch',\n 'class',\n 'const',\n 'continue',\n 'debugger',\n 'default',\n 'delete',\n 'do',\n 'else',\n 'export',\n 'extends',\n 'false',\n 'finally',\n 'for',\n 'function',\n 'if',\n 'import',\n 'in',\n 'instanceof',\n 'new',\n 'null',\n 'return',\n 'super',\n 'switch',\n 'this',\n 'throw',\n 'true',\n 'try',\n 'typeof',\n 'var',\n 'void',\n 'while',\n 'with',\n 'yield',\n ];\n\n // Check if key is a reserved word\n if (reservedWords.includes(key)) {\n return `'${key}'`;\n }\n\n // Check if key is empty or only whitespace\n if (key.trim() === '') {\n return `'${key}'`;\n }\n\n // Check if first character is valid for identifiers\n const firstChar = key.charAt(0);\n const validFirstChar =\n (firstChar >= 'a' && firstChar <= 'z') ||\n (firstChar >= 'A' && firstChar <= 'Z') ||\n firstChar === '_' ||\n firstChar === '$';\n\n if (!validFirstChar) {\n return `'${key.replace(/'/g, \"\\\\'\")}'`;\n }\n\n // Check if the rest of the characters are valid for identifiers\n for (let i = 1; i < key.length; i++) {\n const char = key.charAt(i);\n const validChar =\n (char >= 'a' && char <= 'z') ||\n (char >= 'A' && char <= 'Z') ||\n (char >= '0' && char <= '9') ||\n char === '_' ||\n char === '$';\n\n if (!validChar) {\n return `'${key.replace(/'/g, \"\\\\'\")}'`;\n }\n }\n\n return key;\n };\n #stringifyKeyV2 = (value: string): string => {\n return `'${value}'`;\n };\n\n /**\n * Handle objects (properties)\n */\n object(schema: SchemaObject, required = false): string {\n const properties = schema.properties || {};\n\n // Convert each property\n const propEntries = Object.entries(properties).map(([key, propSchema]) => {\n const isRequired = (schema.required ?? []).includes(key);\n const tsType = this.handle(propSchema, isRequired);\n // Add question mark for optional properties\n return `${this.#stringifyKeyV2(key)}: ${tsType}`;\n });\n\n // Handle additionalProperties\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.join('; ')} }`;\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}[]`;\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 // Unknown type -> fallback\n return appendOptional('any', required);\n }\n }\n\n ref($ref: string, required: boolean): string {\n const schemaName = cleanRef($ref).split('/').pop()!;\n\n if (this.circularRefTracker.has(schemaName)) {\n return schemaName;\n }\n\n this.circularRefTracker.add(schemaName);\n this.#onRef(schemaName, this.handle(followRef(this.#spec, $ref), true));\n this.circularRefTracker.delete(schemaName);\n\n return 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 anyOf(\n schemas: (SchemaObject | ReferenceObject)[],\n required: boolean,\n ): string {\n // For TypeScript we use union types for anyOf/oneOf\n const anyOfTypes = schemas.map((sub) => this.handle(sub, true));\n return appendOptional(\n anyOfTypes.length > 1 ? `${anyOfTypes.join(' | ')}` : anyOfTypes[0],\n required,\n );\n }\n\n oneOf(\n schemas: (SchemaObject | ReferenceObject)[],\n required: boolean,\n ): string {\n const oneOfTypes = schemas.map((sub) => {\n if (isRef(sub)) {\n const { model } = parseRef(sub.$ref);\n if (this.circularRefTracker.has(model)) {\n return model;\n }\n }\n return this.handle(sub, false);\n });\n return appendOptional(\n oneOfTypes.length > 1 ? `${oneOfTypes.join(' | ')}` : oneOfTypes[0],\n required,\n );\n }\n\n enum(values: any[], 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 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 // 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 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 /**\n * Generate an interface declaration\n */\n generateInterface(\n name: string,\n schema: SchemaObject | ReferenceObject,\n ): string {\n const content = this.handle(schema, true);\n return `interface ${name} ${content}`;\n }\n}\n\n/**\n * Append \"| undefined\" if not required\n */\nfunction appendOptional(type: string, isRequired?: boolean): string {\n return isRequired ? type : `${type} | undefined`;\n}\n", "import type {\n OpenAPIObject,\n ReferenceObject,\n SchemaObject,\n} from 'openapi3-ts/oas31';\n\nimport { cleanRef, followRef, isRef, parseRef } from '../utils.ts';\n\ntype OnRefCallback = (ref: string, zod: string) => void;\n\n/**\n * Convert an OpenAPI (JSON Schema style) object into a Zod schema string,\n * adapted for OpenAPI 3.1 (fully aligned with JSON Schema 2020-12).\n */\nexport class ZodDeserialzer {\n circularRefTracker = new Set<string>();\n #spec: OpenAPIObject;\n #onRef?: OnRefCallback;\n\n constructor(spec: OpenAPIObject, onRef?: OnRefCallback) {\n this.#spec = spec;\n this.#onRef = onRef;\n }\n /**\n * Handle objects (properties, additionalProperties).\n */\n object(schema: SchemaObject, required = false): string {\n const properties = schema.properties || {};\n\n // Convert each property\n const propEntries = Object.entries(properties).map(([key, propSchema]) => {\n const isRequired = (schema.required ?? []).includes(key);\n const zodPart = this.handle(propSchema, isRequired);\n return `'${key}': ${zodPart}`;\n });\n\n // additionalProperties\n let additionalProps = '';\n if (schema.additionalProperties) {\n if (typeof schema.additionalProperties === 'object') {\n // e.g. z.record() if it\u2019s an object schema\n const addPropZod = this.handle(schema.additionalProperties, true);\n additionalProps = `.catchall(${addPropZod})`;\n } else if (schema.additionalProperties === true) {\n // free-form additional props\n additionalProps = `.catchall(z.unknown())`;\n }\n }\n\n const objectSchema = `z.object({${propEntries.join(', ')}})${additionalProps}`;\n return `${objectSchema}${appendOptional(required)}`;\n }\n\n /**\n * Handle arrays (items could be a single schema or a tuple (array of schemas)).\n * In JSON Schema 2020-12, `items` can be an array \u2192 tuple style.\n */\n array(schema: SchemaObject, required = false): string {\n const { items } = schema;\n if (!items) {\n // No items => z.array(z.unknown())\n return `z.array(z.unknown())${appendOptional(required)}`;\n }\n\n // If items is an array => tuple\n if (Array.isArray(items)) {\n // Build a Zod tuple\n const tupleItems = items.map((sub) => this.handle(sub, true));\n const base = `z.tuple([${tupleItems.join(', ')}])`;\n // // If we have additionalItems: false => that\u2019s a fixed length\n // // If additionalItems is a schema => rest(...)\n // if (schema.additionalItems) {\n // if (typeof schema.additionalItems === 'object') {\n // const restSchema = jsonSchemaToZod(spec, schema.additionalItems, true);\n // base += `.rest(${restSchema})`;\n // }\n // // If `additionalItems: false`, no rest is allowed => do nothing\n // }\n return `${base}${appendOptional(required)}`;\n }\n\n // If items is a single schema => standard z.array(...)\n const itemsSchema = this.handle(items, true);\n return `z.array(${itemsSchema})${appendOptional(required)}`;\n }\n // oneOf() {}\n // enum() {}\n\n /**\n * Convert a basic type (string | number | boolean | object | array, etc.) to Zod.\n * We'll also handle .optional() if needed.\n */\n normal(type: string, schema: SchemaObject, required = false) {\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 `z.boolean()${appendDefault(schema.default)}${appendOptional(required)}`;\n case 'object':\n return this.object(schema, required);\n case 'array':\n return this.array(schema, required);\n case 'null':\n // If \"type\": \"null\" alone, this is basically z.null()\n return `z.null()${appendOptional(required)}`;\n default:\n // Unknown type -> fallback\n return `z.unknown()${appendOptional(required)}`;\n }\n }\n\n ref($ref: string, required: boolean) {\n const schemaName = cleanRef($ref).split('/').pop()!;\n\n if (this.circularRefTracker.has(schemaName)) {\n return schemaName;\n }\n\n this.circularRefTracker.add(schemaName);\n this.#onRef?.(\n schemaName,\n this.handle(followRef(this.#spec, $ref), required),\n );\n this.circularRefTracker.delete(schemaName);\n\n return schemaName;\n }\n allOf(schemas: (SchemaObject | ReferenceObject)[]) {\n const allOfSchemas = schemas.map((sub) => this.handle(sub, true));\n if (allOfSchemas.length === 0) {\n return `z.unknown()`;\n }\n if (allOfSchemas.length === 1) {\n return allOfSchemas[0];\n }\n return this.#toIntersection(allOfSchemas);\n }\n\n #toIntersection(schemas: string[]): string {\n const [left, ...right] = schemas;\n if (!right.length) {\n return left;\n }\n return `z.intersection(${left}, ${this.#toIntersection(right)})`;\n }\n\n anyOf(schemas: (SchemaObject | ReferenceObject)[], required: boolean) {\n const anyOfSchemas = schemas.map((sub) => this.handle(sub, false));\n if (anyOfSchemas.length === 1) {\n return anyOfSchemas[0];\n }\n return anyOfSchemas.length > 1\n ? `z.union([${anyOfSchemas.join(', ')}])${appendOptional(required)}`\n : // Handle an invalid anyOf with one schema\n anyOfSchemas[0];\n }\n\n oneOf(schemas: (SchemaObject | ReferenceObject)[], required: boolean) {\n const oneOfSchemas = schemas.map((sub) => {\n if ('$ref' in sub) {\n const { model } = parseRef(sub.$ref);\n if (this.circularRefTracker.has(model)) {\n return model;\n }\n }\n return this.handle(sub, false);\n });\n if (oneOfSchemas.length === 1) {\n return oneOfSchemas[0];\n }\n return oneOfSchemas.length > 1\n ? `z.union([${oneOfSchemas.join(', ')}])${appendOptional(required)}`\n : // Handle an invalid oneOf with one schema\n oneOfSchemas[0];\n }\n\n enum(values: any[], required: boolean) {\n const enumVals = values.map((val) => JSON.stringify(val)).join(', ');\n return `z.enum([${enumVals}])${appendOptional(required)}`;\n }\n\n /**\n * Handle a `string` schema with possible format keywords (JSON Schema).\n */\n string(schema: SchemaObject, required?: boolean): string {\n let base = 'z.string()';\n\n // 3.1 replaces `example` in the schema with `examples` (array).\n // We do not strictly need them for the Zod type, so they\u2019re optional\n // for validation. However, we could keep them as metadata if you want.\n\n switch (schema.format) {\n case 'date-time':\n case 'datetime':\n // parse to JS Date\n base = 'z.coerce.date()';\n break;\n case 'date':\n base =\n 'z.coerce.date() /* or z.string() if you want raw date strings */';\n break;\n case 'time':\n base =\n 'z.string() /* optionally add .regex(...) for HH:MM:SS format */';\n break;\n case 'email':\n base = 'z.string().email()';\n break;\n case 'uuid':\n base = 'z.string().uuid()';\n break;\n case 'url':\n case 'uri':\n base = 'z.string().url()';\n break;\n case 'ipv4':\n base = 'z.string().ip({version: \"v4\"})';\n break;\n case 'ipv6':\n base = 'z.string().ip({version: \"v6\"})';\n break;\n case 'phone':\n base = 'z.string() /* or add .regex(...) for phone formats */';\n break;\n case 'byte':\n case 'binary':\n base = 'z.instanceof(Blob) /* consider base64 check if needed */';\n break;\n case 'int64':\n // JS numbers can't reliably store int64, consider z.bigint() or keep as string\n base = 'z.string() /* or z.bigint() if your app can handle it */';\n break;\n default:\n // No special format\n break;\n }\n\n return `${base}${appendDefault(schema.default)}${appendOptional(required)}`;\n }\n\n /**\n * Handle number/integer constraints from OpenAPI/JSON Schema.\n * In 3.1, exclusiveMinimum/Maximum hold the actual numeric threshold,\n * rather than a boolean toggling `minimum`/`maximum`.\n */\n number(schema: SchemaObject, required?: boolean): string {\n let defaultValue =\n schema.default !== undefined ? `.default(${schema.default})` : ``;\n let base = 'z.number()';\n if (schema.format === 'int64') {\n base = 'z.bigint()';\n if (schema.default !== undefined) {\n defaultValue = `.default(BigInt(${schema.default}))`;\n }\n }\n\n if (schema.format === 'int32') {\n // 32-bit integer\n base += '.int()';\n }\n\n // If we see exclusiveMinimum as a number in 3.1:\n if (typeof schema.exclusiveMinimum === 'number') {\n // Zod doesn\u2019t have a direct \"exclusiveMinimum\" method, so we can do .gt()\n // If exclusiveMinimum=7 => .gt(7)\n base += `.gt(${schema.exclusiveMinimum})`;\n }\n // Similarly for exclusiveMaximum\n if (typeof schema.exclusiveMaximum === 'number') {\n // If exclusiveMaximum=10 => .lt(10)\n base += `.lt(${schema.exclusiveMaximum})`;\n }\n\n // If standard minimum/maximum\n if (typeof schema.minimum === 'number') {\n base +=\n schema.format === 'int64'\n ? `.min(BigInt(${schema.minimum}))`\n : `.min(${schema.minimum})`;\n }\n if (typeof schema.maximum === 'number') {\n base +=\n schema.format === 'int64'\n ? `.max(BigInt(${schema.maximum}))`\n : `.max(${schema.maximum})`;\n }\n\n // multipleOf\n if (typeof schema.multipleOf === 'number') {\n // There's no direct multipleOf in Zod. Some folks do a custom refine.\n // For example:\n base += `.refine((val) => Number.isInteger(val / ${schema.multipleOf}), \"Must be a multiple of ${schema.multipleOf}\")`;\n }\n\n return `${base}${defaultValue}${appendOptional(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 \u2192 intersection\n if (schema.allOf && Array.isArray(schema.allOf)) {\n return this.allOf(schema.allOf ?? []);\n }\n\n // anyOf \u2192 union\n if (schema.anyOf && Array.isArray(schema.anyOf)) {\n return this.anyOf(schema.anyOf ?? [], required);\n }\n\n // oneOf \u2192 union\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 // 3.1 can have type: string or type: string[] (e.g. [\"string\",\"null\"])\n // Let's parse that carefully.\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 unknown\n if (!types.length) {\n return `z.unknown()${appendOptional(required)}`;\n }\n\n // If it's a union type (like [\"string\", \"null\"]), we'll build a Zod union\n // or apply .nullable() if it's just \"type + null\".\n if (types.length > 1) {\n // If it\u2019s exactly one real type plus \"null\", we can do e.g. `z.string().nullable()`\n const realTypes = types.filter((t) => t !== 'null');\n if (realTypes.length === 1 && types.includes('null')) {\n // Single real type + \"null\"\n const typeZod = this.normal(realTypes[0], schema, false);\n return `${typeZod}.nullable()${appendOptional(required)}`;\n }\n // If multiple different types, build a union\n const subSchemas = types.map((t) => this.normal(t, schema, false));\n return `z.union([${subSchemas.join(', ')}])${appendOptional(required)}`;\n }\n return this.normal(types[0], schema, required);\n }\n}\n\n/**\n * Append .optional() if not required\n */\nfunction appendOptional(isRequired?: boolean) {\n return isRequired ? '' : '.optional()';\n}\nfunction appendDefault(defaultValue?: any) {\n return defaultValue !== undefined\n ? `.default(${JSON.stringify(defaultValue)})`\n : '';\n}\n\n// Todo: convert openapi 3.0 to 3.1 before proccesing\n", "export interface Interceptor {\n before?: (request: Request) => Promise<Request> | Request;\n after?: (response: Response) => Promise<Response> | Response;\n}\n\nexport const createDefaultHeadersInterceptor = (\n getHeaders: () => Record<string, string | undefined>,\n) => {\n return {\n before(request: Request) {\n const headers = getHeaders();\n\n for (const [key, value] of Object.entries(headers)) {\n // Only set the header if it doesn't already exist and has a value\n if (value !== undefined && !request.headers.has(key)) {\n request.headers.set(key, value);\n }\n }\n\n return request;\n },\n };\n};\n\nexport const createBaseUrlInterceptor = (getBaseUrl: () => string) => {\n return {\n before(request: Request) {\n const baseUrl = getBaseUrl();\n if (request.url.startsWith('local://')) {\n return new Request(request.url.replace('local://', baseUrl), request);\n }\n return request;\n },\n };\n};\n\nexport const logInterceptor = {\n before(request: Request) {\n console.log('Request', request);\n return request;\n },\n after(response: Response) {\n console.log('Response', response);\n return response;\n },\n};\n\n/**\n * Creates an interceptor that logs detailed information about requests and responses.\n * @param options Configuration options for the logger\n * @returns An interceptor object with before and after handlers\n */\nexport const createDetailedLogInterceptor = (options?: {\n logLevel?: 'debug' | 'info' | 'warn' | 'error';\n includeRequestBody?: boolean;\n includeResponseBody?: boolean;\n}) => {\n const logLevel = options?.logLevel || 'info';\n const includeRequestBody = options?.includeRequestBody || false;\n const includeResponseBody = options?.includeResponseBody || false;\n\n return {\n async before(request: Request) {\n const logData = {\n url: request.url,\n method: request.method,\n contentType: request.headers.get('Content-Type'),\n headers: Object.fromEntries([...request.headers.entries()]),\n };\n\n console[logLevel]('\uD83D\uDE80 Outgoing Request:', logData);\n\n if (includeRequestBody) {\n try {\n // Clone the request to avoid consuming the body stream\n const clonedRequest = request.clone();\n if (clonedRequest.headers.get('Content-Type')?.includes('application/json')) {\n const body = await clonedRequest.json().catch(() => null);\n console[logLevel]('Request Body:', body);\n } else {\n const body = await clonedRequest.text().catch(() => null);\n console[logLevel]('Request Body:', body);\n }\n } catch (error) {\n console.error('Could not log request body:', error);\n }\n }\n\n return request;\n },\n\n async after(response: Response) {\n const logData = {\n status: response.status,\n statusText: response.statusText,\n url: response.url,\n headers: Object.fromEntries([...response.headers.entries()]),\n };\n\n console[logLevel]('\uD83D\uDCE5 Incoming Response:', logData);\n\n if (includeResponseBody && response.body) {\n try {\n // Clone the response to avoid consuming the body stream\n const clonedResponse = response.clone();\n if (clonedResponse.headers.get('Content-Type')?.includes('application/json')) {\n const body = await clonedResponse.json().catch(() => null);\n console[logLevel]('Response Body:', body);\n } else {\n const body = await clonedResponse.text().catch(() => null);\n console[logLevel]('Response Body:', body.substring(0, 500) + (body.length > 500 ? '...' : ''));\n }\n } catch (error) {\n console.error('Could not log response body:', error);\n }\n }\n\n return response;\n },\n };\n};\n", "import { parse } from \"fast-content-type-parse\";\n\nexport async function handleError(response: Response) {\n\ttry {\n\t\tif (response.status >= 400 && response.status < 500) {\n\t\t\tconst body = (await response.json()) as Record<string, any>;\n\t\t\treturn {\n\t\t\t\tstatus: response.status,\n\t\t\t\tbody: body,\n\t\t\t};\n\t\t}\n\t\treturn new Error(\n\t\t\t`An error occurred while fetching the data. Status: ${response.status}`,\n\t\t);\n\t} catch (error) {\n\t\treturn error as any;\n\t}\n}\n\nasync function handleChunkedResponse(response: Response, contentType: string) {\n\tconst { type } = parse(contentType);\n\n\tswitch (type) {\n\t\tcase \"application/json\": {\n\t\t\tlet buffer = \"\";\n\t\t\tconst reader = response.body!.getReader();\n\t\t\tconst decoder = new TextDecoder();\n\t\t\twhile (true) {\n\t\t\t\tconst { value, done } = await reader.read();\n\t\t\t\tif (done) break;\n\t\t\t\tbuffer += decoder.decode(value);\n\t\t\t}\n\t\t\treturn JSON.parse(buffer);\n\t\t}\n\t\tcase \"text/html\":\n\t\tcase \"text/plain\": {\n\t\t\tlet buffer = \"\";\n\t\t\tconst reader = response.body!.getReader();\n\t\t\tconst decoder = new TextDecoder();\n\t\t\twhile (true) {\n\t\t\t\tconst { value, done } = await reader.read();\n\t\t\t\tif (done) break;\n\t\t\t\tbuffer += decoder.decode(value);\n\t\t\t}\n\t\t\treturn buffer;\n\t\t}\n\t\tdefault:\n\t\t\treturn response.body;\n\t}\n}\n\nexport function chunked(response: Response) {\n\treturn response.body;\n}\n\nexport async function buffered(response: Response) {\n\tconst contentType = response.headers.get(\"Content-Type\");\n\tif (!contentType) {\n\t\tthrow new Error(\"Content-Type header is missing\");\n\t}\n\n\tif (response.status === 204) {\n\t\treturn null;\n\t}\n\n\tconst { type } = parse(contentType);\n\tswitch (type) {\n\t\tcase \"application/json\":\n\t\t\treturn response.json();\n\t\tcase \"text/plain\":\n\t\t\treturn response.text();\n\t\tcase \"text/html\":\n\t\t\treturn response.text();\n\t\tcase \"text/xml\":\n\t\tcase \"application/xml\":\n\t\t\treturn response.text();\n\t\tcase \"application/x-www-form-urlencoded\": {\n\t\t\tconst text = await response.text();\n\t\t\treturn Object.fromEntries(new URLSearchParams(text));\n\t\t}\n\t\tcase \"multipart/form-data\":\n\t\t\treturn response.formData();\n\t\tdefault:\n\t\t\tthrow new Error(`Unsupported content type: ${contentType}`);\n\t}\n}\n", "import { z } from 'zod';\n\nexport type ParseError<T extends z.ZodType<any, any, any>> = {\n kind: 'parse';\n} & z.inferFlattenedErrors<T>;\n\nexport function parse<T extends z.ZodType>(\n schema: T,\n input: unknown,\n) {\n const result = schema.safeParse(input);\n if (!result.success) {\n const errors = result.error.flatten((issue) => issue);\n return [null, errors];\n }\n return [result.data as z.infer<T>, null];\n}\n", "export type Method = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\nexport type ContentType = 'xml' | 'json' | 'urlencoded' | 'multipart';\nexport type Endpoint =\n | `${ContentType} ${Method} ${string}`\n | `${Method} ${string}`;\n\nexport type BodyInit =\n | ArrayBuffer\n | Blob\n | FormData\n | URLSearchParams\n | null\n | string;\n\nexport function createUrl(path: string, query: URLSearchParams) {\n const url = new URL(path, `local://`);\n url.search = query.toString();\n return url;\n}\n\nfunction template(\n templateString: string,\n templateVariables: Record<string, any>,\n): string {\n const nargs = /{([0-9a-zA-Z_]+)}/g;\n return templateString.replace(nargs, (match, key: string, index: number) => {\n // Handle escaped double braces\n if (\n templateString[index - 1] === '{' &&\n templateString[index + match.length] === '}'\n ) {\n return key;\n }\n\n const result = key in templateVariables ? templateVariables[key] : null;\n return result === null || result === undefined ? '' : String(result);\n });\n}\n\ntype Input = Record<string, any>;\ntype Props = {\n inputHeaders: string[];\n inputQuery: string[];\n inputBody: string[];\n inputParams: string[];\n};\n\nabstract class Serializer {\n protected input: Input;\n protected props: Props;\n\n constructor(\n input: Input,\n props: Props,\n ) {\n this.input = input;\n this.props = props;\n }\n\n abstract getBody(): BodyInit | null;\n abstract getHeaders(): Record<string, string>;\n serialize(): Serialized {\n const headers = new Headers({});\n for (const header of this.props.inputHeaders) {\n headers.set(header, this.input[header]);\n }\n\n const query = new URLSearchParams();\n for (const key of this.props.inputQuery) {\n const value = this.input[key];\n if (value !== undefined) {\n query.set(key, String(value));\n }\n }\n\n const params = this.props.inputParams.reduce<Record<string, any>>(\n (acc, key) => {\n acc[key] = this.input[key];\n return acc;\n },\n {},\n );\n\n return {\n body: this.getBody(),\n query,\n params,\n headers: this.getHeaders(),\n };\n }\n}\n\ninterface Serialized {\n body: BodyInit | null;\n query: URLSearchParams;\n params: Record<string, any>;\n headers: Record<string, string>;\n}\n\nclass JsonSerializer extends Serializer {\n getBody(): BodyInit | null {\n const body: Record<string, any> = {};\n for (const prop of this.props.inputBody) {\n body[prop] = this.input[prop];\n }\n return JSON.stringify(body);\n }\n getHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n };\n }\n}\n\nclass UrlencodedSerializer extends Serializer {\n getBody(): BodyInit | null {\n const body = new URLSearchParams();\n for (const prop of this.props.inputBody) {\n body.set(prop, this.input[prop]);\n }\n return body;\n }\n getHeaders(): Record<string, string> {\n return {};\n }\n}\n\nclass NoBodySerializer extends Serializer {\n getBody(): BodyInit | null {\n return null;\n }\n getHeaders(): Record<string, string> {\n return {};\n }\n}\n\nclass FormDataSerializer extends Serializer {\n getBody(): BodyInit | null {\n const body = new FormData();\n for (const prop of this.props.inputBody) {\n body.append(prop, this.input[prop]);\n }\n return body;\n }\n getHeaders(): Record<string, string> {\n return {};\n }\n}\n\nexport function json(input: Input, props: Props) {\n return new JsonSerializer(input, props).serialize();\n}\nexport function urlencoded(input: Input, props: Props) {\n return new UrlencodedSerializer(input, props).serialize();\n}\nexport function nobody(input: Input, props: Props) {\n return new NoBodySerializer(input, props).serialize();\n}\nexport function formdata(input: Input, props: Props) {\n return new FormDataSerializer(input, props).serialize();\n}\n\nexport function toRequest<T extends Endpoint>(\n endpoint: T,\n input: Serialized,\n): Request {\n const [method, path] = endpoint.split(' ');\n const pathVariable = template(path, input.params);\n\n const url = createUrl(pathVariable, input.query);\n return new Request(url, {\n method: method,\n headers: input.headers,\n body: method === 'GET' ? undefined : input.body,\n });\n}\n", "export interface ApiResponse<Status extends number, Body extends unknown> {\n kind: 'response';\n status: Status;\n body: Body;\n}\n\n// 4xx Client Errors\nexport type BadRequest = ApiResponse<400, { message: string }>;\nexport type Unauthorized = ApiResponse<401, { message: string }>;\nexport type PaymentRequired = ApiResponse<402, { message: string }>;\nexport type Forbidden = ApiResponse<403, { message: string }>;\nexport type NotFound = ApiResponse<404, { message: string }>;\nexport type MethodNotAllowed = ApiResponse<405, { message: string }>;\nexport type NotAcceptable = ApiResponse<406, { message: string }>;\nexport type Conflict = ApiResponse<409, { message: string }>;\nexport type Gone = ApiResponse<410, { message: string }>;\nexport type UnprocessableEntity = ApiResponse<422, { message: string; errors?: Record<string, string[]> }>;\nexport type TooManyRequests = ApiResponse<429, { message: string; retryAfter?: string }>;\nexport type PayloadTooLarge = ApiResponse<413, { message: string; }>;\nexport type UnsupportedMediaType = ApiResponse<415, { message: string; }>;\n\n// 5xx Server Errors\nexport type InternalServerError = ApiResponse<500, { message: string }>;\nexport type NotImplemented = ApiResponse<501, { message: string }>;\nexport type BadGateway = ApiResponse<502, { message: string }>;\nexport type ServiceUnavailable = ApiResponse<503, { message: string; retryAfter?: string }>;\nexport type GatewayTimeout = ApiResponse<504, { message: string }>;\n\nexport type ClientError =\n | BadRequest\n | Unauthorized\n | PaymentRequired\n | Forbidden\n | NotFound\n | MethodNotAllowed\n | NotAcceptable\n | Conflict\n | Gone\n | UnprocessableEntity\n | TooManyRequests;\n\nexport type ServerError =\n | InternalServerError\n | NotImplemented\n | BadGateway\n | ServiceUnavailable\n | GatewayTimeout;\n\nexport type ProblematicResponse = ClientError | ServerError;\n", "import z from 'zod';\n\nimport type { Interceptor } from './interceptors.ts';\nimport { handleError } from './parse-response.ts';\nimport { parse } from './parser.ts';\n\nexport interface RequestSchema {\n schema: z.ZodType;\n toRequest: (input: unknown) => Request;\n deserializer: (response: Response) => Promise<unknown> | unknown;\n}\n\nexport const fetchType = z\n .function()\n .args(z.instanceof(Request))\n .returns(z.promise(z.instanceof(Response)))\n .optional();\n\nexport async function sendRequest(\n input: unknown,\n route: RequestSchema,\n options: {\n fetch?: z.infer<typeof fetchType>;\n interceptors?: Interceptor[];\n },\n) {\n const { interceptors = [] } = options;\n const [parsedInput, parseError] = parse(route.schema, input);\n if (parseError) {\n return [null as never, { ...parseError, kind: 'parse' } as never] as const;\n }\n\n let request = route.toRequest(parsedInput as never);\n for (const interceptor of interceptors) {\n if (interceptor.before) {\n request = await interceptor.before(request);\n }\n }\n\n let response = await (options.fetch ?? fetch)(request);\n\n for (let i = interceptors.length - 1; i >= 0; i--) {\n const interceptor = interceptors[i];\n if (interceptor.after) {\n response = await interceptor.after(response.clone());\n }\n }\n\n if (response.ok) {\n const data = await route.deserializer(response);\n return [data as never, null] as const;\n }\n const error = await handleError(response);\n return [null as never, { ...error, kind: 'response' }] as const;\n}\n", "import { watch as nodeWatch } from 'node:fs/promises';\nimport { debounceTime, from } from 'rxjs';\n\nexport function watch(path: string) {\n return from(\n nodeWatch(path, {\n persistent: true,\n recursive: true,\n }),\n ).pipe(debounceTime(400));\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { join } from 'node:path';\nimport { npmRunPathEnv } from 'npm-run-path';\nimport type { OpenAPIObject } from 'openapi3-ts/oas31';\n\nimport { getFolderExports, methods, writeFiles } from '@sdk-it/core';\n\nimport { generateCode } from './generator.ts';\nimport interceptors from './http/interceptors.txt';\nimport parseResponse from './http/parse-response.txt';\nimport parserTxt from './http/parser.txt';\nimport requestTxt from './http/request.txt';\nimport responseTxt from './http/response.txt';\nimport sendRequest from './http/send-request.txt';\nimport { generateInputs, generateSDK } from './sdk.ts';\nimport { exclude, securityToOptions } from './utils.ts';\n\nfunction security(spec: OpenAPIObject) {\n const security = spec.security || [];\n const components = spec.components || {};\n const securitySchemas = components.securitySchemes || {};\n const paths = Object.values(spec.paths ?? {});\n\n const options = securityToOptions(security, securitySchemas);\n\n for (const it of paths) {\n for (const method of methods) {\n const operation = it[method];\n if (!operation) {\n continue;\n }\n Object.assign(\n options,\n securityToOptions(operation.security || [], securitySchemas, 'input'),\n );\n }\n }\n return options;\n}\n\nexport async function generate(\n spec: OpenAPIObject,\n settings: {\n output: string;\n useTsExtension?: boolean;\n name?: string;\n /**\n * full: generate a full project including package.json and tsconfig.json. useful for monorepo/workspaces\n * minimal: generate only the client sdk\n */\n mode?: 'full' | 'minimal';\n formatCode?: (options: {\n output: string;\n env: ReturnType<typeof npmRunPathEnv>;\n }) => void | Promise<void>;\n },\n) {\n settings.useTsExtension ??= true;\n const makeImport = (moduleSpecifier: string) => {\n return settings.useTsExtension ? `${moduleSpecifier}.ts` : moduleSpecifier;\n };\n const { commonSchemas, groups, outputs, commonZod } = generateCode({\n spec,\n style: 'github',\n target: 'javascript',\n makeImport,\n });\n const output =\n settings.mode === 'full' ? join(settings.output, 'src') : settings.output;\n\n const options = security(spec);\n\n const clientFiles = generateSDK({\n name: settings.name || 'Client',\n operations: groups,\n servers: spec.servers?.map((server) => server.url) || [],\n options: options,\n makeImport,\n });\n\n // const readme = generateReadme(spec, {\n // name: settings.name || 'Client',\n // });\n\n const inputFiles = generateInputs(groups, commonZod, makeImport);\n\n await writeFiles(output, {\n 'outputs/.gitkeep': '',\n 'inputs/.gitkeep': '',\n 'models/.getkeep': '',\n // 'README.md': readme,\n });\n\n await writeFiles(join(output, 'http'), {\n 'interceptors.ts': interceptors,\n 'parse-response.ts': parseResponse,\n 'send-request.ts': `import z from 'zod';\nimport type { Interceptor } from './${makeImport('interceptors')}';\nimport { handleError } from './${makeImport('parse-response')}';\nimport { parse } from './${makeImport('parser')}';\n${sendRequest}`,\n 'response.ts': responseTxt,\n 'parser.ts': parserTxt,\n 'request.ts': requestTxt,\n });\n\n await writeFiles(join(output, 'outputs'), outputs);\n const modelsImports = Object.entries(commonSchemas).map(([name]) => name);\n await writeFiles(output, {\n ...clientFiles,\n ...inputFiles,\n ...Object.fromEntries(\n Object.entries(commonSchemas).map(([name, schema]) => [\n `models/${name}.ts`,\n [\n `import { z } from 'zod';`,\n ...exclude(modelsImports, [name]).map(\n (it) => `import type { ${it} } from './${it}.ts';`,\n ),\n `export type ${name} = ${schema};`,\n ].join('\\n'),\n ]),\n ),\n });\n\n const folders = [\n getFolderExports(output, settings.useTsExtension),\n getFolderExports(join(output, 'outputs'), settings.useTsExtension),\n getFolderExports(\n join(output, 'inputs'),\n settings.useTsExtension,\n ['ts'],\n (dirent) => dirent.isDirectory() && dirent.name === 'schemas',\n ),\n getFolderExports(join(output, 'http'), settings.useTsExtension),\n ];\n if (modelsImports.length) {\n folders.push(\n getFolderExports(join(output, 'models'), settings.useTsExtension),\n );\n }\n const [index, outputIndex, inputsIndex, httpIndex, modelsIndex] =\n await Promise.all(folders);\n await writeFiles(output, {\n 'index.ts': index,\n 'outputs/index.ts': outputIndex,\n 'inputs/index.ts': inputsIndex || null,\n 'http/index.ts': httpIndex,\n ...(modelsImports.length ? { 'models/index.ts': modelsIndex } : {}),\n });\n if (settings.mode === 'full') {\n await writeFiles(settings.output, {\n 'package.json': {\n ignoreIfExists: true,\n content: JSON.stringify(\n {\n name: 'sdk',\n type: 'module',\n main: './src/index.ts',\n dependencies: {\n 'fast-content-type-parse': '^3.0.0',\n zod: '^3.24.2',\n },\n },\n null,\n 2,\n ),\n },\n 'tsconfig.json': {\n ignoreIfExists: true,\n content: JSON.stringify(\n {\n compilerOptions: {\n skipLibCheck: true,\n skipDefaultLibCheck: true,\n target: 'ESNext',\n module: 'ESNext',\n noEmit: true,\n strict: true,\n allowImportingTsExtensions: true,\n verbatimModuleSyntax: true,\n baseUrl: '.',\n moduleResolution: 'bundler',\n },\n include: ['**/*.ts'],\n },\n null,\n 2,\n ),\n },\n });\n }\n\n await settings.formatCode?.({\n output: output,\n env: npmRunPathEnv(),\n });\n}\n", "import { get, merge } from 'lodash-es';\nimport type {\n ContentObject,\n OpenAPIObject,\n OperationObject,\n ParameterLocation,\n ParameterObject,\n ReferenceObject,\n ResponseObject,\n SchemaObject,\n} from 'openapi3-ts/oas31';\nimport { camelcase, pascalcase, spinalcase } from 'stringcase';\n\nimport { TypeScriptDeserialzer } from './emitters/interface.ts';\nimport { ZodDeserialzer } from './emitters/zod.ts';\nimport {\n type Operation,\n type OperationInput,\n type Parser,\n type Spec,\n} from './sdk.ts';\nimport { followRef, isRef, securityToOptions, useImports } from './utils.ts';\n\nexport interface NamedImport {\n name: string;\n alias?: string;\n isTypeOnly: boolean;\n}\nexport interface Import {\n isTypeOnly: boolean;\n moduleSpecifier: string;\n defaultImport: string | undefined;\n namedImports: NamedImport[];\n namespaceImport: string | undefined;\n}\n\nconst responses: Record<string, string> = {\n '400': 'BadRequest',\n '401': 'Unauthorized',\n '402': 'PaymentRequired',\n '403': 'Forbidden',\n '404': 'NotFound',\n '405': 'MethodNotAllowed',\n '406': 'NotAcceptable',\n '409': 'Conflict',\n '413': 'PayloadTooLarge',\n '410': 'Gone',\n '422': 'UnprocessableEntity',\n '429': 'TooManyRequests',\n '500': 'InternalServerError',\n '501': 'NotImplemented',\n '502': 'BadGateway',\n '503': 'ServiceUnavailable',\n '504': 'GatewayTimeout',\n};\n\nexport interface GenerateSdkConfig {\n spec: OpenAPIObject;\n target?: 'javascript';\n /**\n * No support for jsdoc in vscode\n * @issue https://github.com/microsoft/TypeScript/issues/38106\n */\n style?: 'github';\n operationId?: (\n operation: OperationObject,\n path: string,\n method: string,\n ) => string;\n makeImport: (module: string) => string;\n}\n\nexport const defaults: Partial<GenerateSdkConfig> &\n Required<Pick<GenerateSdkConfig, 'operationId'>> = {\n target: 'javascript',\n style: 'github',\n operationId: (operation, path, method) => {\n if (operation.operationId) {\n return spinalcase(operation.operationId);\n }\n return camelcase(`${method} ${path.replace(/[\\\\/\\\\{\\\\}]/g, ' ').trim()}`);\n },\n};\n\nexport function generateCode(config: GenerateSdkConfig) {\n const commonSchemas: Record<string, string> = {};\n const commonZod = new Map<string, string>();\n const commonZodImports: Import[] = [];\n const zodDeserialzer = new ZodDeserialzer(config.spec, (model, schema) => {\n commonZod.set(model, schema);\n commonZodImports.push({\n defaultImport: undefined,\n isTypeOnly: true,\n moduleSpecifier: `./${config.makeImport(model)}`,\n namedImports: [{ isTypeOnly: true, name: model }],\n namespaceImport: undefined,\n });\n });\n\n const groups: Spec['operations'] = {};\n const outputs: Record<string, string> = {};\n\n for (const [path, methods] of Object.entries(config.spec.paths ?? {})) {\n for (const [method, operation] of Object.entries(methods) as [\n string,\n OperationObject,\n ][]) {\n const formatOperationId = config.operationId ?? defaults.operationId;\n const operationName = formatOperationId(operation, path, method);\n\n console.log(`Processing ${method} ${path}`);\n const [groupName] = Array.isArray(operation.tags)\n ? operation.tags\n : ['unknown'];\n groups[groupName] ??= [];\n const inputs: Operation['inputs'] = {};\n\n const additionalProperties: ParameterObject[] = [];\n for (const param of operation.parameters ?? []) {\n if (isRef(param)) {\n throw new Error(`Found reference in parameter ${param.$ref}`);\n }\n if (!param.schema) {\n throw new Error(`Schema not found for parameter ${param.name}`);\n }\n inputs[param.name] = {\n in: param.in,\n schema: '',\n };\n additionalProperties.push(param);\n }\n\n const security = operation.security ?? [];\n const securitySchemas = config.spec.components?.securitySchemes ?? {};\n\n const securityOptions = securityToOptions(security, securitySchemas);\n\n Object.assign(inputs, securityOptions);\n\n additionalProperties.push(\n ...Object.entries(securityOptions).map(\n ([name, value]) =>\n ({\n name: name,\n required: false,\n schema: {\n type: 'string',\n },\n in: value.in as ParameterLocation,\n }) satisfies ParameterObject,\n ),\n );\n\n const types: Record<string, string> = {};\n const shortContenTypeMap: Record<string, string> = {\n 'application/json': 'json',\n 'application/x-www-form-urlencoded': 'urlencoded',\n 'multipart/form-data': 'formdata',\n 'application/xml': 'xml',\n 'text/plain': 'text',\n };\n let outgoingContentType: string | undefined;\n if (operation.requestBody && Object.keys(operation.requestBody).length) {\n const content: ContentObject = isRef(operation.requestBody)\n ? get(followRef(config.spec, operation.requestBody.$ref), ['content'])\n : operation.requestBody.content;\n\n for (const type in content) {\n const ctSchema = isRef(content[type].schema)\n ? followRef(config.spec, content[type].schema.$ref)\n : content[type].schema;\n if (!ctSchema) {\n console.warn(`Schema not found for ${type}`);\n continue;\n }\n\n const schema = merge({}, ctSchema, {\n required: additionalProperties\n .filter((p) => p.required)\n .map((p) => p.name),\n properties: additionalProperties.reduce<Record<string, unknown>>(\n (acc, p) => ({\n ...acc,\n [p.name]: p.schema,\n }),\n {},\n ),\n });\n\n Object.assign(inputs, bodyInputs(config, ctSchema));\n types[shortContenTypeMap[type]] = zodDeserialzer.handle(schema, true);\n }\n\n if (content['application/json']) {\n outgoingContentType = 'json';\n } else if (content['application/x-www-form-urlencoded']) {\n outgoingContentType = 'urlencoded';\n } else if (content['multipart/form-data']) {\n outgoingContentType = 'formdata';\n } else {\n outgoingContentType = 'json';\n }\n } else {\n const properties = additionalProperties.reduce<Record<string, any>>(\n (acc, p) => ({\n ...acc,\n [p.name]: p.schema,\n }),\n {},\n );\n types[shortContenTypeMap['application/json']] = zodDeserialzer.handle(\n {\n type: 'object',\n required: additionalProperties\n .filter((p) => p.required)\n .map((p) => p.name),\n properties,\n },\n true,\n );\n }\n\n const errors: string[] = [];\n operation.responses ??= {};\n\n let foundResponse = false;\n const output = [`import z from 'zod';`];\n let parser: Parser = 'buffered';\n for (const status in operation.responses) {\n const response = isRef(\n operation.responses[status] as ResponseObject | ReferenceObject,\n )\n ? (followRef(\n config.spec,\n operation.responses[status].$ref,\n ) as ResponseObject)\n : (operation.responses[status] as ResponseObject);\n const statusCode = +status;\n if (statusCode >= 400) {\n errors.push(responses[status] ?? 'ProblematicResponse');\n }\n if (statusCode >= 200 && statusCode < 300) {\n foundResponse = true;\n const responseContent = get(response, ['content']);\n const isJson = responseContent && responseContent['application/json'];\n if ((response.headers ?? {})['Transfer-Encoding']) {\n parser = 'chunked';\n }\n // TODO: how the user is going to handle multiple response types\n const imports: Import[] = [];\n const typeScriptDeserialzer = new TypeScriptDeserialzer(\n config.spec,\n (schemaName, zod) => {\n commonSchemas[schemaName] = zod;\n imports.push({\n defaultImport: undefined,\n isTypeOnly: true,\n moduleSpecifier: `../models/${config.makeImport(schemaName)}`,\n namedImports: [{ isTypeOnly: true, name: schemaName }],\n namespaceImport: undefined,\n });\n },\n );\n const responseSchema = isJson\n ? typeScriptDeserialzer.handle(\n responseContent['application/json'].schema!,\n true,\n )\n : 'ReadableStream'; // non-json response treated as stream\n output.push(...useImports(responseSchema, imports));\n output.push(\n `export type ${pascalcase(operationName + ' output')} = ${responseSchema}`,\n );\n }\n }\n\n if (!foundResponse) {\n output.push(\n `export type ${pascalcase(operationName + ' output')} = void`,\n );\n }\n outputs[`${spinalcase(operationName)}.ts`] = output.join('\\n');\n groups[groupName].push({\n name: operationName,\n type: 'http',\n inputs,\n errors: errors.length ? errors : ['ServerError'],\n outgoingContentType,\n schemas: types,\n parser,\n formatOutput: () => ({\n import: pascalcase(operationName + ' output'),\n use: pascalcase(operationName + ' output'),\n }),\n trigger: {\n path,\n method,\n },\n });\n }\n }\n\n return { groups, commonSchemas, commonZod, outputs };\n}\n\n// TODO - USE CASES\n// 1. Some parameters conflicts with request body\n// 2. Generate 400 and 500 response variations // done\n// 3. Generate 200 response variations\n// 3. Doc Security\n// 4. Operation Security\n// 5. JsDocs\n// 5. test all different types of parameters\n// 6. cookies\n// 6. x-www-form-urlencoded // done\n// 7. multipart/form-data // done\n// 7. application/octet-stream // done\n// 7. chunked response // done\n\nfunction toProps(\n spec: OpenAPIObject,\n schemaOrRef: SchemaObject | ReferenceObject,\n aggregator: string[] = [],\n) {\n if (isRef(schemaOrRef)) {\n const schema = followRef(spec, schemaOrRef.$ref);\n return toProps(spec, schema, aggregator);\n } else if (schemaOrRef.type === 'object') {\n for (const [name] of Object.entries(schemaOrRef.properties ?? {})) {\n aggregator.push(name);\n }\n return void 0;\n } else if (schemaOrRef.allOf) {\n for (const it of schemaOrRef.allOf) {\n toProps(spec, it, aggregator);\n }\n return void 0;\n }\n}\n\nfunction bodyInputs(\n config: GenerateSdkConfig,\n ctSchema: SchemaObject | ReferenceObject,\n) {\n const props: string[] = [];\n toProps(config.spec, ctSchema, props);\n return props.reduce<Record<string, OperationInput>>(\n (acc, prop) => ({\n ...acc,\n [prop]: {\n in: 'body',\n schema: '',\n },\n }),\n {},\n );\n}\n", "import { get } from 'lodash-es';\nimport type {\n ComponentsObject,\n OpenAPIObject,\n ReferenceObject,\n SchemaObject,\n SecurityRequirementObject,\n} from 'openapi3-ts/oas31';\n\nimport { removeDuplicates } from '@sdk-it/core';\n\nimport { type Options } from './sdk.ts';\n\nexport function isRef(obj: any): obj is ReferenceObject {\n return '$ref' in obj;\n}\n\nexport function cleanRef(ref: string) {\n return ref.replace(/^#\\//, '');\n}\n\nexport function parseRef(ref: string) {\n const parts = ref.split('/');\n const [model] = parts.splice(-1);\n return { model, path: parts.join('/') };\n}\nexport function followRef(spec: OpenAPIObject, ref: string): SchemaObject {\n const pathParts = cleanRef(ref).split('/');\n const entry = get(spec, pathParts) as SchemaObject | ReferenceObject;\n if (entry && '$ref' in entry) {\n return followRef(spec, entry.$ref);\n }\n return entry;\n}\nexport function securityToOptions(\n security: SecurityRequirementObject[],\n securitySchemas: ComponentsObject['securitySchemes'],\n staticIn?: string,\n) {\n securitySchemas ??= {};\n const options: Options = {};\n for (const it of security) {\n const [name] = Object.keys(it);\n const schema = securitySchemas[name];\n if (isRef(schema)) {\n throw new Error(`Ref security schemas are not supported`);\n }\n if (schema.type === 'http') {\n options['authorization'] = {\n in: staticIn ?? 'header',\n schema:\n 'z.string().optional().transform((val) => (val ? `Bearer ${val}` : undefined))',\n optionName: 'token',\n };\n continue;\n }\n if (schema.type === 'apiKey') {\n if (!schema.in) {\n throw new Error(`apiKey security schema must have an \"in\" field`);\n }\n if (!schema.name) {\n throw new Error(`apiKey security schema must have a \"name\" field`);\n }\n options[schema.name] = {\n in: staticIn ?? schema.in,\n schema: 'z.string().optional()',\n };\n continue;\n }\n }\n return options;\n}\n\nexport function mergeImports(imports: Import[]) {\n const merged: Record<string, Import> = {};\n\n for (const i of imports) {\n merged[i.moduleSpecifier] = merged[i.moduleSpecifier] ?? {\n moduleSpecifier: i.moduleSpecifier,\n defaultImport: i.defaultImport,\n namespaceImport: i.namespaceImport,\n namedImports: [],\n };\n if (i.namedImports) {\n merged[i.moduleSpecifier].namedImports.push(...i.namedImports);\n }\n }\n\n return Object.values(merged);\n}\nexport interface Import {\n isTypeOnly: boolean;\n moduleSpecifier: string;\n defaultImport: string | undefined;\n namedImports: NamedImport[];\n namespaceImport: string | undefined;\n}\nexport interface NamedImport {\n name: string;\n alias?: string;\n isTypeOnly: boolean;\n}\n\nexport function importsToString(...imports: Import[]) {\n return imports.map((it) => {\n if (it.defaultImport) {\n return `import ${it.defaultImport} from '${it.moduleSpecifier}'`;\n }\n if (it.namespaceImport) {\n return `import * as ${it.namespaceImport} from '${it.moduleSpecifier}'`;\n }\n if (it.namedImports) {\n return `import {${removeDuplicates(it.namedImports, (it) => it.name)\n .map((n) => `${n.isTypeOnly ? 'type' : ''} ${n.name}`)\n .join(', ')}} from '${it.moduleSpecifier}'`;\n }\n throw new Error(`Invalid import ${JSON.stringify(it)}`);\n });\n}\n\nexport function exclude<T>(list: T[], exclude: T[]): T[] {\n return list.filter((it) => !exclude.includes(it));\n}\n\nexport function useImports(content: string, imports: Import[]) {\n const output: string[] = [];\n for (const it of mergeImports(imports)) {\n const singleImport = it.defaultImport ?? it.namespaceImport;\n if (singleImport && content.includes(singleImport)) {\n output.push(importsToString(it).join('\\n'));\n } else if (it.namedImports.length) {\n for (const namedImport of it.namedImports) {\n if (content.includes(namedImport.name)) {\n output.push(importsToString(it).join('\\n'));\n }\n }\n }\n }\n return output;\n}\n\nexport type MakeImportFn = (moduleSpecifier: string) => string;\n", "import { camelcase, spinalcase } from 'stringcase';\n\nimport { removeDuplicates, toLitObject } from '@sdk-it/core';\n\nimport backend from './client.ts';\nimport type { MakeImportFn } from './utils.ts';\n\nexport type Parser = 'chunked' | 'buffered';\nclass SchemaEndpoint {\n #makeImport: MakeImportFn;\n #imports: string[] = [];\n constructor(makeImport: MakeImportFn) {\n this.#makeImport = makeImport;\n this.#imports = [\n `import z from 'zod';`,\n `import type { Endpoints } from '${this.#makeImport('./endpoints')}';`,\n `import { toRequest, json, urlencoded, nobody, formdata, createUrl } from '${this.#makeImport('./http/request')}';`,\n `import type { ParseError } from '${this.#makeImport('./http/parser')}';`,\n `import { chunked, buffered } from \"${this.#makeImport('./http/parse-response')}\";`,\n ];\n }\n\n #endpoints: string[] = [];\n\n addEndpoint(endpoint: string, operation: string) {\n this.#endpoints.push(` \"${endpoint}\": ${operation},`);\n }\n\n addImport(value: string) {\n this.#imports.push(value);\n }\n\n complete() {\n return `${this.#imports.join('\\n')}\\nexport default {\\n${this.#endpoints.join('\\n')}\\n}`;\n }\n}\nclass Emitter {\n #makeImport: MakeImportFn;\n protected imports: string[] = [];\n constructor(makeImport: MakeImportFn) {\n this.#makeImport = makeImport;\n this.imports = [\n `import type z from 'zod';`,\n `import type { ParseError } from '${this.#makeImport('./http/parser')}';`,\n ];\n }\n protected endpoints: string[] = [];\n addEndpoint(endpoint: string, operation: string) {\n this.endpoints.push(` \"${endpoint}\": ${operation};`);\n }\n addImport(value: string) {\n this.imports.push(value);\n }\n complete() {\n return `${this.imports.join('\\n')}\\nexport interface Endpoints {\\n${this.endpoints.join('\\n')}\\n}`;\n }\n}\n\nexport interface SdkConfig {\n /**\n * The name of the sdk client\n */\n name: string;\n packageName?: string;\n options?: Record<string, any>;\n emptyBodyAsNull?: boolean;\n stripBodyFromGetAndHead?: boolean;\n output: string;\n}\n\nexport type Options = Record<\n string,\n {\n in: string;\n schema: string;\n optionName?: string;\n }\n>;\nexport interface Spec {\n operations: Record<string, Operation[]>;\n name: string;\n options: Options;\n servers: string[];\n makeImport: MakeImportFn;\n}\n\nexport interface OperationInput {\n in: string;\n schema: string;\n}\nexport interface Operation {\n name: string;\n errors: string[];\n type: string;\n trigger: Record<string, any>;\n outgoingContentType?: string;\n parser: Parser;\n schemas: Record<string, string>;\n inputs: Record<string, OperationInput>;\n formatOutput: () => { import: string; use: string };\n}\n\nexport function generateInputs(\n operationsSet: Spec['operations'],\n commonZod: Map<string, string>,\n makeImport: MakeImportFn,\n) {\n const commonImports = commonZod.keys().toArray();\n const inputs: Record<string, string> = {};\n for (const [name, operations] of Object.entries(operationsSet)) {\n const output: string[] = [];\n const imports = new Set(['import { z } from \"zod\";']);\n\n for (const operation of operations) {\n const schemaName = camelcase(`${operation.name} schema`);\n\n const schema = `export const ${schemaName} = ${\n Object.keys(operation.schemas).length === 1\n ? Object.values(operation.schemas)[0]\n : toLitObject(operation.schemas)\n };`;\n\n const inputContent = schema;\n\n for (const schema of commonImports) {\n if (inputContent.includes(schema)) {\n imports.add(\n `import { ${schema} } from './schemas/${makeImport(spinalcase(schema))}';`,\n );\n }\n }\n output.push(inputContent);\n }\n inputs[`inputs/${spinalcase(name)}.ts`] =\n [...imports, ...output].join('\\n') + '\\n';\n }\n\n const schemas = commonZod\n .entries()\n .reduce<string[][]>((acc, [name, schema]) => {\n const output = [`import { z } from 'zod';`];\n const content = `export const ${name} = ${schema};`;\n for (const schema of commonImports) {\n const preciseMatch = new RegExp(`\\\\b${schema}\\\\b`);\n if (preciseMatch.test(content) && schema !== name) {\n output.push(\n `import { ${schema} } from './${makeImport(spinalcase(schema))}';`,\n );\n }\n }\n\n output.push(content);\n return [\n [`inputs/schemas/${spinalcase(name)}.ts`, output.join('\\n')],\n ...acc,\n ];\n }, []);\n\n return {\n ...Object.fromEntries(schemas),\n ...inputs,\n };\n}\n\nexport function generateSDK(spec: Spec) {\n const emitter = new Emitter(spec.makeImport);\n const schemaEndpoint = new SchemaEndpoint(spec.makeImport);\n const errors: string[] = [];\n for (const [name, operations] of Object.entries(spec.operations)) {\n emitter.addImport(\n `import type * as ${camelcase(name)} from './inputs/${spec.makeImport(spinalcase(name))}';`,\n );\n schemaEndpoint.addImport(\n `import * as ${camelcase(name)} from './inputs/${spec.makeImport(spinalcase(name))}';`,\n );\n for (const operation of operations) {\n const schemaName = camelcase(`${operation.name} schema`);\n const schemaRef = `${camelcase(name)}.${schemaName}`;\n const output = operation.formatOutput();\n const inputHeaders: string[] = [];\n const inputQuery: string[] = [];\n const inputBody: string[] = [];\n const inputParams: string[] = [];\n for (const [name, prop] of Object.entries(operation.inputs)) {\n if (prop.in === 'headers' || prop.in === 'header') {\n inputHeaders.push(`\"${name}\"`);\n } else if (prop.in === 'query') {\n inputQuery.push(`\"${name}\"`);\n } else if (prop.in === 'body') {\n inputBody.push(`\"${name}\"`);\n } else if (prop.in === 'path') {\n inputParams.push(`\"${name}\"`);\n } else if (prop.in === 'internal') {\n // ignore internal sources\n continue;\n } else {\n throw new Error(\n `Unknown source ${prop.in} in ${name} ${JSON.stringify(\n prop,\n )} in ${operation.name}`,\n );\n }\n }\n emitter.addImport(\n `import type {${output.import}} from './outputs/${spec.makeImport(spinalcase(operation.name))}';`,\n );\n errors.push(...(operation.errors ?? []));\n\n const addTypeParser = Object.keys(operation.schemas).length > 1;\n for (const type in operation.schemas ?? {}) {\n let typePrefix = '';\n if (addTypeParser && type !== 'json') {\n typePrefix = `${type} `;\n }\n const input = `typeof ${schemaRef}${addTypeParser ? `.${type}` : ''}`;\n\n const endpoint = `${typePrefix}${operation.trigger.method.toUpperCase()} ${operation.trigger.path}`;\n emitter.addEndpoint(\n endpoint,\n `{input: z.infer<${input}>; output: ${output.use}; error: ${(operation.errors ?? ['ServerError']).concat(`ParseError<${input}>`).join('|')}}`,\n );\n schemaEndpoint.addEndpoint(\n endpoint,\n `{\n schema: ${schemaRef}${addTypeParser ? `.${type}` : ''},\n deserializer: ${operation.parser === 'chunked' ? 'chunked' : 'buffered'},\n toRequest(input: Endpoints['${endpoint}']['input']) {\n const endpoint = '${endpoint}';\n return toRequest(endpoint, ${operation.outgoingContentType || 'nobody'}(input, {\n inputHeaders: [${inputHeaders}],\n inputQuery: [${inputQuery}],\n inputBody: [${inputBody}],\n inputParams: [${inputParams}],\n }));\n },\n }`,\n );\n }\n }\n }\n\n emitter.addImport(\n `import type { ${removeDuplicates(errors, (it) => it).join(', ')} } from '${spec.makeImport('./http/response')}';`,\n );\n return {\n 'client.ts': backend(spec),\n 'schemas.ts': schemaEndpoint.complete(),\n 'endpoints.ts': emitter.complete(),\n };\n}\n", "import { toLitObject } from '@sdk-it/core';\n\nimport type { Spec } from './sdk.ts';\n\nexport default (spec: Spec) => {\n const optionsEntries = Object.entries(spec.options).map(\n ([key, value]) => [`'${key}'`, value] as const,\n );\n const defaultHeaders = `{${optionsEntries\n .filter(([, value]) => value.in === 'header')\n .map(\n ([key, value]) =>\n `${key}: this.options[${value.optionName ? `'${value.optionName}'` : key}]`,\n )\n .join(',\\n')}}`;\n const defaultInputs = `{${optionsEntries\n .filter(([, value]) => value.in === 'input')\n .map(\n ([key, value]) =>\n `${key}: this.options[${value.optionName ? `'${value.optionName}'` : key}]`,\n )\n .join(',\\n')}}`;\n const specOptions: Record<string, { schema: string }> = {\n ...Object.fromEntries(\n optionsEntries.map(([key, value]) => [value.optionName ?? key, value]),\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 };\n\n return `\nimport { fetchType, sendRequest } from './http/${spec.makeImport('send-request')}';\nimport z from 'zod';\nimport type { Endpoints } from './${spec.makeImport('endpoints')}';\nimport schemas from './${spec.makeImport('schemas')}';\nimport {\n createBaseUrlInterceptor,\n createHeadersInterceptor,\n} from './http/${spec.makeImport('interceptors')}';\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.infer<typeof optionsSchema>;\n\nexport class ${spec.name} {\n public options: ${spec.name}Options\n constructor(options: ${spec.name}Options) {\n this.options = optionsSchema.parse(options);\n }\n\n async request<E extends keyof Endpoints>(\n endpoint: E,\n input: Endpoints[E]['input'],\n options?: { signal?: AbortSignal, headers?: HeadersInit },\n ): Promise<readonly [Endpoints[E]['output'], Endpoints[E]['error'] | null]> {\n const route = schemas[endpoint];\n return sendRequest(Object.assign(this.#defaultInputs, input), route, {\n fetch: this.options.fetch,\n interceptors: [\n createHeadersInterceptor(() => this.defaultHeaders, options?.headers ?? {}),\n createBaseUrlInterceptor(() => this.options.baseUrl),\n ],\n signal: options?.signal,\n });\n }\n\n get defaultHeaders() {\n return ${defaultHeaders}\n }\n\n get #defaultInputs() {\n return ${defaultInputs}\n }\n\n setOptions(options: Partial<${spec.name}Options>) {\n const validated = optionsSchema.partial().parse(options);\n\n for (const key of Object.keys(validated) as (keyof ${spec.name}Options)[]) {\n if (validated[key] !== undefined) {\n (this.options[key] as typeof validated[typeof key]) = validated[key]!;\n }\n }\n }\n}`;\n};\n", "import type {\n OpenAPIObject,\n ReferenceObject,\n SchemaObject,\n} from 'openapi3-ts/oas31';\n\nimport { cleanRef, followRef, isRef, parseRef } from '../utils.ts';\n\ntype OnRefCallback = (ref: string, interfaceContent: string) => void;\n\n/**\n * Convert an OpenAPI (JSON Schema style) object into TypeScript interfaces,\n * following the same pattern as ZodDeserialzer for easy interchangeability.\n */\nexport class TypeScriptDeserialzer {\n circularRefTracker = new Set<string>();\n #spec: OpenAPIObject;\n #onRef: OnRefCallback;\n\n constructor(spec: OpenAPIObject, onRef: OnRefCallback) {\n this.#spec = spec;\n this.#onRef = onRef;\n }\n #stringifyKey = (key: string): string => {\n // List of JavaScript keywords and special object properties that should be quoted\n const reservedWords = [\n 'constructor',\n 'prototype',\n 'break',\n 'case',\n 'catch',\n 'class',\n 'const',\n 'continue',\n 'debugger',\n 'default',\n 'delete',\n 'do',\n 'else',\n 'export',\n 'extends',\n 'false',\n 'finally',\n 'for',\n 'function',\n 'if',\n 'import',\n 'in',\n 'instanceof',\n 'new',\n 'null',\n 'return',\n 'super',\n 'switch',\n 'this',\n 'throw',\n 'true',\n 'try',\n 'typeof',\n 'var',\n 'void',\n 'while',\n 'with',\n 'yield',\n ];\n\n // Check if key is a reserved word\n if (reservedWords.includes(key)) {\n return `'${key}'`;\n }\n\n // Check if key is empty or only whitespace\n if (key.trim() === '') {\n return `'${key}'`;\n }\n\n // Check if first character is valid for identifiers\n const firstChar = key.charAt(0);\n const validFirstChar =\n (firstChar >= 'a' && firstChar <= 'z') ||\n (firstChar >= 'A' && firstChar <= 'Z') ||\n firstChar === '_' ||\n firstChar === '$';\n\n if (!validFirstChar) {\n return `'${key.replace(/'/g, \"\\\\'\")}'`;\n }\n\n // Check if the rest of the characters are valid for identifiers\n for (let i = 1; i < key.length; i++) {\n const char = key.charAt(i);\n const validChar =\n (char >= 'a' && char <= 'z') ||\n (char >= 'A' && char <= 'Z') ||\n (char >= '0' && char <= '9') ||\n char === '_' ||\n char === '$';\n\n if (!validChar) {\n return `'${key.replace(/'/g, \"\\\\'\")}'`;\n }\n }\n\n return key;\n };\n #stringifyKeyV2 = (value: string): string => {\n return `'${value}'`;\n };\n\n /**\n * Handle objects (properties)\n */\n object(schema: SchemaObject, required = false): string {\n const properties = schema.properties || {};\n\n // Convert each property\n const propEntries = Object.entries(properties).map(([key, propSchema]) => {\n const isRequired = (schema.required ?? []).includes(key);\n const tsType = this.handle(propSchema, isRequired);\n // Add question mark for optional properties\n return `${this.#stringifyKeyV2(key)}: ${tsType}`;\n });\n\n // Handle additionalProperties\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.join('; ')} }`;\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}[]`;\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 // Unknown type -> fallback\n return appendOptional('any', required);\n }\n }\n\n ref($ref: string, required: boolean): string {\n const schemaName = cleanRef($ref).split('/').pop()!;\n\n if (this.circularRefTracker.has(schemaName)) {\n return schemaName;\n }\n\n this.circularRefTracker.add(schemaName);\n this.#onRef(schemaName, this.handle(followRef(this.#spec, $ref), true));\n this.circularRefTracker.delete(schemaName);\n\n return 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 anyOf(\n schemas: (SchemaObject | ReferenceObject)[],\n required: boolean,\n ): string {\n // For TypeScript we use union types for anyOf/oneOf\n const anyOfTypes = schemas.map((sub) => this.handle(sub, true));\n return appendOptional(\n anyOfTypes.length > 1 ? `${anyOfTypes.join(' | ')}` : anyOfTypes[0],\n required,\n );\n }\n\n oneOf(\n schemas: (SchemaObject | ReferenceObject)[],\n required: boolean,\n ): string {\n const oneOfTypes = schemas.map((sub) => {\n if (isRef(sub)) {\n const { model } = parseRef(sub.$ref);\n if (this.circularRefTracker.has(model)) {\n return model;\n }\n }\n return this.handle(sub, false);\n });\n return appendOptional(\n oneOfTypes.length > 1 ? `${oneOfTypes.join(' | ')}` : oneOfTypes[0],\n required,\n );\n }\n\n enum(values: any[], 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 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 // 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 /**\n * Generate an interface declaration\n */\n generateInterface(\n name: string,\n schema: SchemaObject | ReferenceObject,\n ): string {\n const content = this.handle(schema, true);\n return `interface ${name} ${content}`;\n }\n}\n\n/**\n * Append \"| undefined\" if not required\n */\nfunction appendOptional(type: string, isRequired?: boolean): string {\n return isRequired ? type : `${type} | undefined`;\n}\n", "import type {\n OpenAPIObject,\n ReferenceObject,\n SchemaObject,\n} from 'openapi3-ts/oas31';\n\nimport { cleanRef, followRef, isRef, parseRef } from '../utils.ts';\n\ntype OnRefCallback = (ref: string, zod: string) => void;\n\n/**\n * Convert an OpenAPI (JSON Schema style) object into a Zod schema string,\n * adapted for OpenAPI 3.1 (fully aligned with JSON Schema 2020-12).\n */\nexport class ZodDeserialzer {\n circularRefTracker = new Set<string>();\n #spec: OpenAPIObject;\n #onRef?: OnRefCallback;\n\n constructor(spec: OpenAPIObject, onRef?: OnRefCallback) {\n this.#spec = spec;\n this.#onRef = onRef;\n }\n /**\n * Handle objects (properties, additionalProperties).\n */\n object(schema: SchemaObject, required = false): string {\n const properties = schema.properties || {};\n\n // Convert each property\n const propEntries = Object.entries(properties).map(([key, propSchema]) => {\n const isRequired = (schema.required ?? []).includes(key);\n const zodPart = this.handle(propSchema, isRequired);\n return `'${key}': ${zodPart}`;\n });\n\n // additionalProperties\n let additionalProps = '';\n if (schema.additionalProperties) {\n if (typeof schema.additionalProperties === 'object') {\n // e.g. z.record() if it\u2019s an object schema\n const addPropZod = this.handle(schema.additionalProperties, true);\n additionalProps = `.catchall(${addPropZod})`;\n } else if (schema.additionalProperties === true) {\n // free-form additional props\n additionalProps = `.catchall(z.unknown())`;\n }\n }\n\n const objectSchema = `z.object({${propEntries.join(', ')}})${additionalProps}`;\n return `${objectSchema}${appendOptional(required)}`;\n }\n\n /**\n * Handle arrays (items could be a single schema or a tuple (array of schemas)).\n * In JSON Schema 2020-12, `items` can be an array \u2192 tuple style.\n */\n array(schema: SchemaObject, required = false): string {\n const { items } = schema;\n if (!items) {\n // No items => z.array(z.unknown())\n return `z.array(z.unknown())${appendOptional(required)}`;\n }\n\n // If items is an array => tuple\n if (Array.isArray(items)) {\n // Build a Zod tuple\n const tupleItems = items.map((sub) => this.handle(sub, true));\n const base = `z.tuple([${tupleItems.join(', ')}])`;\n // // If we have additionalItems: false => that\u2019s a fixed length\n // // If additionalItems is a schema => rest(...)\n // if (schema.additionalItems) {\n // if (typeof schema.additionalItems === 'object') {\n // const restSchema = jsonSchemaToZod(spec, schema.additionalItems, true);\n // base += `.rest(${restSchema})`;\n // }\n // // If `additionalItems: false`, no rest is allowed => do nothing\n // }\n return `${base}${appendOptional(required)}`;\n }\n\n // If items is a single schema => standard z.array(...)\n const itemsSchema = this.handle(items, true);\n return `z.array(${itemsSchema})${appendOptional(required)}`;\n }\n // oneOf() {}\n // enum() {}\n\n #suffixes = (defaultValue: unknown, required: boolean, nullable: boolean) => {\n return `${nullable ? '.nullable()' : ''}${appendDefault(defaultValue)}${appendOptional(required)}`;\n };\n\n /**\n * Convert a basic type (string | number | boolean | object | array, etc.) to Zod.\n * We'll also handle .optional() if needed.\n */\n normal(\n type: string,\n schema: SchemaObject,\n required = false,\n nullable = false,\n ): string {\n switch (type) {\n case 'string':\n return `${this.string(schema)}${this.#suffixes(schema.default, required, nullable)}`;\n case 'number':\n case 'integer': {\n const { base, defaultValue } = this.number(schema);\n return `${base}${this.#suffixes(defaultValue, required, nullable)}`;\n }\n case 'boolean':\n return `z.boolean()${this.#suffixes(schema.default, required, nullable)}`;\n case 'object':\n return this.object(schema, required);\n case 'array':\n return this.array(schema, required);\n case 'null':\n // If \"type\": \"null\" alone, this is basically z.null()\n return `z.null()${appendOptional(required)}`;\n default:\n // Unknown type -> fallback\n return `z.unknown()${appendOptional(required)}`;\n }\n }\n\n ref($ref: string, required: boolean) {\n const schemaName = cleanRef($ref).split('/').pop()!;\n\n if (this.circularRefTracker.has(schemaName)) {\n return schemaName;\n }\n\n this.circularRefTracker.add(schemaName);\n this.#onRef?.(\n schemaName,\n this.handle(followRef(this.#spec, $ref), required),\n );\n this.circularRefTracker.delete(schemaName);\n\n return schemaName;\n }\n allOf(schemas: (SchemaObject | ReferenceObject)[]) {\n const allOfSchemas = schemas.map((sub) => this.handle(sub, true));\n if (allOfSchemas.length === 0) {\n return `z.unknown()`;\n }\n if (allOfSchemas.length === 1) {\n return allOfSchemas[0];\n }\n return this.#toIntersection(allOfSchemas);\n }\n\n #toIntersection(schemas: string[]): string {\n const [left, ...right] = schemas;\n if (!right.length) {\n return left;\n }\n return `z.intersection(${left}, ${this.#toIntersection(right)})`;\n }\n\n anyOf(schemas: (SchemaObject | ReferenceObject)[], required: boolean) {\n const anyOfSchemas = schemas.map((sub) => this.handle(sub, false));\n if (anyOfSchemas.length === 1) {\n return anyOfSchemas[0];\n }\n return anyOfSchemas.length > 1\n ? `z.union([${anyOfSchemas.join(', ')}])${appendOptional(required)}`\n : // Handle an invalid anyOf with one schema\n anyOfSchemas[0];\n }\n\n oneOf(schemas: (SchemaObject | ReferenceObject)[], required: boolean) {\n const oneOfSchemas = schemas.map((sub) => {\n if ('$ref' in sub) {\n const { model } = parseRef(sub.$ref);\n if (this.circularRefTracker.has(model)) {\n return model;\n }\n }\n return this.handle(sub, false);\n });\n if (oneOfSchemas.length === 1) {\n return oneOfSchemas[0];\n }\n return oneOfSchemas.length > 1\n ? `z.union([${oneOfSchemas.join(', ')}])${appendOptional(required)}`\n : // Handle an invalid oneOf with one schema\n oneOfSchemas[0];\n }\n\n enum(values: any[], required: boolean) {\n const enumVals = values.map((val) => JSON.stringify(val)).join(', ');\n return `z.enum([${enumVals}])${appendOptional(required)}`;\n }\n\n /**\n * Handle a `string` schema with possible format keywords (JSON Schema).\n */\n string(schema: SchemaObject): string {\n let base = 'z.string()';\n\n // 3.1 replaces `example` in the schema with `examples` (array).\n // We do not strictly need them for the Zod type, so they\u2019re optional\n // for validation. However, we could keep them as metadata if you want.\n\n switch (schema.format) {\n case 'date-time':\n case 'datetime':\n // parse to JS Date\n base = 'z.coerce.date()';\n break;\n case 'date':\n base =\n 'z.coerce.date() /* or z.string() if you want raw date strings */';\n break;\n case 'time':\n base =\n 'z.string() /* optionally add .regex(...) for HH:MM:SS format */';\n break;\n case 'email':\n base = 'z.string().email()';\n break;\n case 'uuid':\n base = 'z.string().uuid()';\n break;\n case 'url':\n case 'uri':\n base = 'z.string().url()';\n break;\n case 'ipv4':\n base = 'z.string().ip({version: \"v4\"})';\n break;\n case 'ipv6':\n base = 'z.string().ip({version: \"v6\"})';\n break;\n case 'phone':\n base = 'z.string() /* or add .regex(...) for phone formats */';\n break;\n case 'byte':\n case 'binary':\n base = 'z.instanceof(Blob) /* consider base64 check if needed */';\n break;\n case 'int64':\n // JS numbers can't reliably store int64, consider z.bigint() or keep as string\n base = 'z.string() /* or z.bigint() if your app can handle it */';\n break;\n default:\n // No special format\n break;\n }\n\n return base;\n }\n\n /**\n * Handle number/integer constraints from OpenAPI/JSON Schema.\n * In 3.1, exclusiveMinimum/Maximum hold the actual numeric threshold,\n * rather than a boolean toggling `minimum`/`maximum`.\n */\n number(schema: SchemaObject) {\n let defaultValue = schema.default;\n let base = 'z.number()';\n if (schema.format === 'int64') {\n base = 'z.bigint()';\n if (schema.default !== undefined) {\n defaultValue = `BigInt(${schema.default})`;\n }\n }\n\n if (schema.format === 'int32') {\n // 32-bit integer\n base += '.int()';\n }\n\n // If we see exclusiveMinimum as a number in 3.1:\n if (typeof schema.exclusiveMinimum === 'number') {\n // Zod doesn\u2019t have a direct \"exclusiveMinimum\" method, so we can do .gt()\n // If exclusiveMinimum=7 => .gt(7)\n base += `.gt(${schema.exclusiveMinimum})`;\n }\n // Similarly for exclusiveMaximum\n if (typeof schema.exclusiveMaximum === 'number') {\n // If exclusiveMaximum=10 => .lt(10)\n base += `.lt(${schema.exclusiveMaximum})`;\n }\n\n // If standard minimum/maximum\n if (typeof schema.minimum === 'number') {\n base +=\n schema.format === 'int64'\n ? `.min(BigInt(${schema.minimum}))`\n : `.min(${schema.minimum})`;\n }\n if (typeof schema.maximum === 'number') {\n base +=\n schema.format === 'int64'\n ? `.max(BigInt(${schema.maximum}))`\n : `.max(${schema.maximum})`;\n }\n\n // multipleOf\n if (typeof schema.multipleOf === 'number') {\n // There's no direct multipleOf in Zod. Some folks do a custom refine.\n // For example:\n base += `.refine((val) => Number.isInteger(val / ${schema.multipleOf}), \"Must be a multiple of ${schema.multipleOf}\")`;\n }\n\n return { base, defaultValue };\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 \u2192 intersection\n if (schema.allOf && Array.isArray(schema.allOf)) {\n return this.allOf(schema.allOf ?? []);\n }\n\n // anyOf \u2192 union\n if (schema.anyOf && Array.isArray(schema.anyOf)) {\n return this.anyOf(schema.anyOf ?? [], required);\n }\n\n // oneOf \u2192 union\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 // 3.1 can have type: string or type: string[] (e.g. [\"string\",\"null\"])\n // Let's parse that carefully.\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 unknown\n if (!types.length) {\n return `z.unknown()${appendOptional(required)}`;\n }\n\n // If it's a union type (like [\"string\", \"null\"]), we'll build a Zod union\n // or apply .nullable() if it's just \"type + null\".\n\n // backward compatibility with openapi 3.0\n if ('nullable' in schema && schema.nullable) {\n types.push('null');\n }\n\n if (types.length > 1) {\n // If it\u2019s exactly one real type plus \"null\", we can do e.g. `z.string().nullable()`\n const realTypes = types.filter((t) => t !== 'null');\n if (realTypes.length === 1 && types.includes('null')) {\n // Single real type + \"null\"\n return this.normal(realTypes[0], schema, false, true);\n }\n // If multiple different types, build a union\n const subSchemas = types.map((t) => this.normal(t, schema, false));\n return `z.union([${subSchemas.join(', ')}])${appendOptional(required)}`;\n }\n return this.normal(types[0], schema, required, false);\n }\n}\n\n/**\n * Append .optional() if not required\n */\nfunction appendOptional(isRequired?: boolean) {\n return isRequired ? '' : '.optional()';\n}\nfunction appendDefault(defaultValue?: any) {\n return defaultValue !== undefined\n ? `.default(${JSON.stringify(defaultValue)})`\n : '';\n}\n\n// Todo: convert openapi 3.0 to 3.1 before proccesing\n", "export interface Interceptor {\n before?: (request: Request) => Promise<Request> | Request;\n after?: (response: Response) => Promise<Response> | Response;\n}\n\nexport const createHeadersInterceptor = (\n defaultHeaders: () => Record<string, string | undefined>,\n requestHeaders: HeadersInit,\n) => {\n return {\n before(request: Request) {\n // Priority Levels\n // 1. Headers Input\n // 2. Request Headers\n // 3. Default Headers\n const headers = defaultHeaders();\n\n for (const [key, value] of new Headers(requestHeaders)) {\n // Only set the header if it doesn't already exist and has a value\n // even though these headers are passed at operation level\n // still they are lower priority compared to the headers input\n if (value !== undefined && !request.headers.has(key)) {\n request.headers.set(key, value);\n }\n }\n\n for (const [key, value] of Object.entries(headers)) {\n // Only set the header if it doesn't already exist and has a value\n if (value !== undefined && !request.headers.has(key)) {\n request.headers.set(key, value);\n }\n }\n\n return request;\n },\n };\n};\n\nexport const createBaseUrlInterceptor = (getBaseUrl: () => string) => {\n return {\n before(request: Request) {\n const baseUrl = getBaseUrl();\n if (request.url.startsWith('local://')) {\n return new Request(request.url.replace('local://', baseUrl), request);\n }\n return request;\n },\n };\n};\n\nexport const logInterceptor = {\n before(request: Request) {\n console.log('Request', request);\n return request;\n },\n after(response: Response) {\n console.log('Response', response);\n return response;\n },\n};\n\n/**\n * Creates an interceptor that logs detailed information about requests and responses.\n * @param options Configuration options for the logger\n * @returns An interceptor object with before and after handlers\n */\nexport const createDetailedLogInterceptor = (options?: {\n logLevel?: 'debug' | 'info' | 'warn' | 'error';\n includeRequestBody?: boolean;\n includeResponseBody?: boolean;\n}) => {\n const logLevel = options?.logLevel || 'info';\n const includeRequestBody = options?.includeRequestBody || false;\n const includeResponseBody = options?.includeResponseBody || false;\n\n return {\n async before(request: Request) {\n const logData = {\n url: request.url,\n method: request.method,\n contentType: request.headers.get('Content-Type'),\n headers: Object.fromEntries([...request.headers.entries()]),\n };\n\n console[logLevel]('\uD83D\uDE80 Outgoing Request:', logData);\n\n if (includeRequestBody) {\n try {\n // Clone the request to avoid consuming the body stream\n const clonedRequest = request.clone();\n if (clonedRequest.headers.get('Content-Type')?.includes('application/json')) {\n const body = await clonedRequest.json().catch(() => null);\n console[logLevel]('Request Body:', body);\n } else {\n const body = await clonedRequest.text().catch(() => null);\n console[logLevel]('Request Body:', body);\n }\n } catch (error) {\n console.error('Could not log request body:', error);\n }\n }\n\n return request;\n },\n\n async after(response: Response) {\n const logData = {\n status: response.status,\n statusText: response.statusText,\n url: response.url,\n headers: Object.fromEntries([...response.headers.entries()]),\n };\n\n console[logLevel]('\uD83D\uDCE5 Incoming Response:', logData);\n\n if (includeResponseBody && response.body) {\n try {\n // Clone the response to avoid consuming the body stream\n const clonedResponse = response.clone();\n if (clonedResponse.headers.get('Content-Type')?.includes('application/json')) {\n const body = await clonedResponse.json().catch(() => null);\n console[logLevel]('Response Body:', body);\n } else {\n const body = await clonedResponse.text().catch(() => null);\n if (body) {\n console[logLevel]('Response Body:', body.substring(0, 500) + (body.length > 500 ? '...' : ''));\n } else {\n console[logLevel]('No response body');\n }\n }\n } catch (error) {\n console.error('Could not log response body:', error);\n }\n }\n\n return response;\n },\n };\n};\n", "import { parse } from \"fast-content-type-parse\";\n\nexport async function handleError(response: Response) {\n\ttry {\n\t\tif (response.status >= 400 && response.status < 500) {\n\t\t\tconst body = (await response.json()) as Record<string, any>;\n\t\t\treturn {\n\t\t\t\tstatus: response.status,\n\t\t\t\tbody: body,\n\t\t\t};\n\t\t}\n\t\treturn new Error(\n\t\t\t`An error occurred while fetching the data. Status: ${response.status}`,\n\t\t);\n\t} catch (error) {\n\t\treturn error as any;\n\t}\n}\n\nasync function handleChunkedResponse(response: Response, contentType: string) {\n\tconst { type } = parse(contentType);\n\n\tswitch (type) {\n\t\tcase \"application/json\": {\n\t\t\tlet buffer = \"\";\n\t\t\tconst reader = response.body!.getReader();\n\t\t\tconst decoder = new TextDecoder();\n\t\t\twhile (true) {\n\t\t\t\tconst { value, done } = await reader.read();\n\t\t\t\tif (done) break;\n\t\t\t\tbuffer += decoder.decode(value);\n\t\t\t}\n\t\t\treturn JSON.parse(buffer);\n\t\t}\n\t\tcase \"text/html\":\n\t\tcase \"text/plain\": {\n\t\t\tlet buffer = \"\";\n\t\t\tconst reader = response.body!.getReader();\n\t\t\tconst decoder = new TextDecoder();\n\t\t\twhile (true) {\n\t\t\t\tconst { value, done } = await reader.read();\n\t\t\t\tif (done) break;\n\t\t\t\tbuffer += decoder.decode(value);\n\t\t\t}\n\t\t\treturn buffer;\n\t\t}\n\t\tdefault:\n\t\t\treturn response.body;\n\t}\n}\n\nexport function chunked(response: Response) {\n\treturn response.body;\n}\n\nexport async function buffered(response: Response) {\n\tconst contentType = response.headers.get(\"Content-Type\");\n\tif (!contentType) {\n\t\tthrow new Error(\"Content-Type header is missing\");\n\t}\n\n\tif (response.status === 204) {\n\t\treturn null;\n\t}\n\n\tconst { type } = parse(contentType);\n\tswitch (type) {\n\t\tcase \"application/json\":\n\t\t\treturn response.json();\n\t\tcase \"text/plain\":\n\t\t\treturn response.text();\n\t\tcase \"text/html\":\n\t\t\treturn response.text();\n\t\tcase \"text/xml\":\n\t\tcase \"application/xml\":\n\t\t\treturn response.text();\n\t\tcase \"application/x-www-form-urlencoded\": {\n\t\t\tconst text = await response.text();\n\t\t\treturn Object.fromEntries(new URLSearchParams(text));\n\t\t}\n\t\tcase \"multipart/form-data\":\n\t\t\treturn response.formData();\n\t\tdefault:\n\t\t\tthrow new Error(`Unsupported content type: ${contentType}`);\n\t}\n}\n", "import { z } from 'zod';\n\nexport type ParseError<T extends z.ZodType<any, any, any>> = {\n kind: 'parse';\n} & z.inferFlattenedErrors<T>;\n\nexport function parse<T extends z.ZodType>(\n schema: T,\n input: unknown,\n) {\n const result = schema.safeParse(input);\n if (!result.success) {\n const errors = result.error.flatten((issue) => issue);\n return [null, errors];\n }\n return [result.data as z.infer<T>, null];\n}\n", "export type Method = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\nexport type ContentType = 'xml' | 'json' | 'urlencoded' | 'multipart';\nexport type Endpoint =\n | `${ContentType} ${Method} ${string}`\n | `${Method} ${string}`;\n\nexport type BodyInit =\n | ArrayBuffer\n | Blob\n | FormData\n | URLSearchParams\n | null\n | string;\n\nexport function createUrl(path: string, query: URLSearchParams) {\n const url = new URL(path, `local://`);\n url.search = query.toString();\n return url;\n}\n\nfunction template(\n templateString: string,\n templateVariables: Record<string, any>,\n): string {\n const nargs = /{([0-9a-zA-Z_]+)}/g;\n return templateString.replace(nargs, (match, key: string, index: number) => {\n // Handle escaped double braces\n if (\n templateString[index - 1] === '{' &&\n templateString[index + match.length] === '}'\n ) {\n return key;\n }\n\n const result = key in templateVariables ? templateVariables[key] : null;\n return result === null || result === undefined ? '' : String(result);\n });\n}\n\ntype Input = Record<string, any>;\ntype Props = {\n inputHeaders: string[];\n inputQuery: string[];\n inputBody: string[];\n inputParams: string[];\n};\n\nabstract class Serializer {\n protected input: Input;\n protected props: Props;\n\n constructor(\n input: Input,\n props: Props,\n ) {\n this.input = input;\n this.props = props;\n }\n\n abstract getBody(): BodyInit | null;\n abstract getHeaders(): Record<string, string>;\n serialize(): Serialized {\n const headers = new Headers({});\n for (const header of this.props.inputHeaders) {\n headers.set(header, this.input[header]);\n }\n\n const query = new URLSearchParams();\n for (const key of this.props.inputQuery) {\n const value = this.input[key];\n if (value !== undefined) {\n query.set(key, String(value));\n }\n }\n\n const params = this.props.inputParams.reduce<Record<string, any>>(\n (acc, key) => {\n acc[key] = this.input[key];\n return acc;\n },\n {},\n );\n\n return {\n body: this.getBody(),\n query,\n params,\n headers: this.getHeaders(),\n };\n }\n}\n\ninterface Serialized {\n body: BodyInit | null;\n query: URLSearchParams;\n params: Record<string, any>;\n headers: Record<string, string>;\n}\n\nclass JsonSerializer extends Serializer {\n getBody(): BodyInit | null {\n const body: Record<string, any> = {};\n for (const prop of this.props.inputBody) {\n body[prop] = this.input[prop];\n }\n return JSON.stringify(body);\n }\n getHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n };\n }\n}\n\nclass UrlencodedSerializer extends Serializer {\n getBody(): BodyInit | null {\n const body = new URLSearchParams();\n for (const prop of this.props.inputBody) {\n body.set(prop, this.input[prop]);\n }\n return body;\n }\n getHeaders(): Record<string, string> {\n return {};\n }\n}\n\nclass NoBodySerializer extends Serializer {\n getBody(): BodyInit | null {\n return null;\n }\n getHeaders(): Record<string, string> {\n return {};\n }\n}\n\nclass FormDataSerializer extends Serializer {\n getBody(): BodyInit | null {\n const body = new FormData();\n for (const prop of this.props.inputBody) {\n body.append(prop, this.input[prop]);\n }\n return body;\n }\n getHeaders(): Record<string, string> {\n return {};\n }\n}\n\nexport function json(input: Input, props: Props) {\n return new JsonSerializer(input, props).serialize();\n}\nexport function urlencoded(input: Input, props: Props) {\n return new UrlencodedSerializer(input, props).serialize();\n}\nexport function nobody(input: Input, props: Props) {\n return new NoBodySerializer(input, props).serialize();\n}\nexport function formdata(input: Input, props: Props) {\n return new FormDataSerializer(input, props).serialize();\n}\n\nexport function toRequest<T extends Endpoint>(\n endpoint: T,\n input: Serialized,\n): Request {\n const [method, path] = endpoint.split(' ');\n const pathVariable = template(path, input.params);\n\n const url = createUrl(pathVariable, input.query);\n return new Request(url, {\n method: method,\n headers: input.headers,\n body: method === 'GET' ? undefined : input.body,\n });\n}\n", "export interface ApiResponse<Status extends number, Body extends unknown> {\n kind: 'response';\n status: Status;\n body: Body;\n}\n\n// 4xx Client Errors\nexport type BadRequest = ApiResponse<400, { message: string }>;\nexport type Unauthorized = ApiResponse<401, { message: string }>;\nexport type PaymentRequired = ApiResponse<402, { message: string }>;\nexport type Forbidden = ApiResponse<403, { message: string }>;\nexport type NotFound = ApiResponse<404, { message: string }>;\nexport type MethodNotAllowed = ApiResponse<405, { message: string }>;\nexport type NotAcceptable = ApiResponse<406, { message: string }>;\nexport type Conflict = ApiResponse<409, { message: string }>;\nexport type Gone = ApiResponse<410, { message: string }>;\nexport type UnprocessableEntity = ApiResponse<422, { message: string; errors?: Record<string, string[]> }>;\nexport type TooManyRequests = ApiResponse<429, { message: string; retryAfter?: string }>;\nexport type PayloadTooLarge = ApiResponse<413, { message: string; }>;\nexport type UnsupportedMediaType = ApiResponse<415, { message: string; }>;\n\n// 5xx Server Errors\nexport type InternalServerError = ApiResponse<500, { message: string }>;\nexport type NotImplemented = ApiResponse<501, { message: string }>;\nexport type BadGateway = ApiResponse<502, { message: string }>;\nexport type ServiceUnavailable = ApiResponse<503, { message: string; retryAfter?: string }>;\nexport type GatewayTimeout = ApiResponse<504, { message: string }>;\n\nexport type ClientError =\n | BadRequest\n | Unauthorized\n | PaymentRequired\n | Forbidden\n | NotFound\n | MethodNotAllowed\n | NotAcceptable\n | Conflict\n | Gone\n | UnprocessableEntity\n | TooManyRequests;\n\nexport type ServerError =\n | InternalServerError\n | NotImplemented\n | BadGateway\n | ServiceUnavailable\n | GatewayTimeout;\n\nexport type ProblematicResponse = ClientError | ServerError;\n", "\nexport interface RequestSchema {\n schema: z.ZodType;\n toRequest: (input: any) => Request;\n deserializer: (response: Response) => Promise<unknown> | unknown;\n}\n\nexport const fetchType = z\n .function()\n .args(z.instanceof(Request))\n .returns(z.promise(z.instanceof(Response)))\n .optional();\n\nexport async function sendRequest(\n input: unknown,\n route: RequestSchema,\n options: {\n fetch?: z.infer<typeof fetchType>;\n interceptors?: Interceptor[];\n signal?: AbortSignal;\n },\n) {\n const { interceptors = [] } = options;\n const [parsedInput, parseError] = parse(route.schema, input);\n if (parseError) {\n return [null as never, { ...parseError, kind: 'parse' } as never] as const;\n }\n\n let request = route.toRequest(parsedInput as never);\n for (const interceptor of interceptors) {\n if (interceptor.before) {\n request = await interceptor.before(request);\n }\n }\n\n let response = await (options.fetch ?? fetch)(request, { signal: options.signal });\n\n for (let i = interceptors.length - 1; i >= 0; i--) {\n const interceptor = interceptors[i];\n if (interceptor.after) {\n response = await interceptor.after(response.clone());\n }\n }\n\n if (response.ok) {\n const data = await route.deserializer(response);\n return [data as never, null] as const;\n }\n const error = await handleError(response);\n return [null as never, { ...error, kind: 'response' }] as const;\n}\n", "import { watch as nodeWatch } from 'node:fs/promises';\nimport { debounceTime, from } from 'rxjs';\n\nexport function watch(path: string) {\n return from(\n nodeWatch(path, {\n persistent: true,\n recursive: true,\n }),\n ).pipe(debounceTime(400));\n}\n"],
|
|
5
|
+
"mappings": ";AAAA,SAAS,YAAY;AACrB,SAAS,qBAAqB;AAG9B,SAAS,kBAAkB,SAAS,kBAAkB;;;ACJtD,SAAS,OAAAA,MAAK,aAAa;AAW3B,SAAS,aAAAC,YAAW,YAAY,cAAAC,mBAAkB;;;ACXlD,SAAS,WAAW;AASpB,SAAS,oBAAAC,yBAAwB;;;ACTjC,SAAS,WAAW,kBAAkB;AAEtC,SAAS,kBAAkB,eAAAC,oBAAmB;;;ACF9C,SAAS,mBAAmB;AAI5B,IAAO,iBAAQ,CAAC,SAAe;AAC7B,QAAM,iBAAiB,OAAO,QAAQ,KAAK,OAAO,EAAE;AAAA,IAClD,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,IAAI,GAAG,KAAK,KAAK;AAAA,EACtC;AACA,QAAM,iBAAiB,IAAI,eACxB,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,MAAM,OAAO,QAAQ,EAC3C;AAAA,IACC,CAAC,CAAC,KAAK,KAAK,MACV,GAAG,GAAG,kBAAkB,MAAM,aAAa,IAAI,MAAM,UAAU,MAAM,GAAG;AAAA,EAC5E,EACC,KAAK,KAAK,CAAC;AACd,QAAM,gBAAgB,IAAI,eACvB,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,MAAM,OAAO,OAAO,EAC1C;AAAA,IACC,CAAC,CAAC,KAAK,KAAK,MACV,GAAG,GAAG,kBAAkB,MAAM,aAAa,IAAI,MAAM,UAAU,MAAM,GAAG;AAAA,EAC5E,EACC,KAAK,KAAK,CAAC;AACd,QAAM,cAAkD;AAAA,IACtD,GAAG,OAAO;AAAA,MACR,eAAe,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,MAAM,cAAc,KAAK,KAAK,CAAC;AAAA,IACvE;AAAA,IACA,OAAO;AAAA,MACL,QAAQ;AAAA,IACV;AAAA,IACA,SAAS;AAAA,MACP,QAAQ,KAAK,QAAQ,SACjB,wCACA;AAAA,IACN;AAAA,EACF;AAEA,SAAO;AAAA,iDACwC,KAAK,WAAW,cAAc,CAAC;AAAA;AAAA,oCAE5C,KAAK,WAAW,WAAW,CAAC;AAAA,yBACvC,KAAK,WAAW,SAAS,CAAC;AAAA;AAAA;AAAA;AAAA,iBAIlC,KAAK,WAAW,cAAc,CAAC;AAAA;AAAA,EAE9C,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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAqBrB,cAAc;AAAA;AAAA;AAAA;AAAA,aAId,aAAa;AAAA;AAAA;AAAA,gCAGM,KAAK,IAAI;AAAA;AAAA;AAAA,yDAGgB,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOlE;;;ADpFA,IAAM,iBAAN,MAAqB;AAAA,EACnB;AAAA,EACA,WAAqB,CAAC;AAAA,EACtB,YAAY,YAA0B;AACpC,SAAK,cAAc;AACnB,SAAK,WAAW;AAAA,MACd;AAAA,MACA,mCAAmC,KAAK,YAAY,aAAa,CAAC;AAAA,MAClE,6EAA6E,KAAK,YAAY,gBAAgB,CAAC;AAAA,MAC/G,oCAAoC,KAAK,YAAY,eAAe,CAAC;AAAA,MACrE,sCAAsC,KAAK,YAAY,uBAAuB,CAAC;AAAA,IACjF;AAAA,EACF;AAAA,EAEA,aAAuB,CAAC;AAAA,EAExB,YAAY,UAAkB,WAAmB;AAC/C,SAAK,WAAW,KAAK,MAAM,QAAQ,MAAM,SAAS,GAAG;AAAA,EACvD;AAAA,EAEA,UAAU,OAAe;AACvB,SAAK,SAAS,KAAK,KAAK;AAAA,EAC1B;AAAA,EAEA,WAAW;AACT,WAAO,GAAG,KAAK,SAAS,KAAK,IAAI,CAAC;AAAA;AAAA,EAAuB,KAAK,WAAW,KAAK,IAAI,CAAC;AAAA;AAAA,EACrF;AACF;AACA,IAAM,UAAN,MAAc;AAAA,EACZ;AAAA,EACU,UAAoB,CAAC;AAAA,EAC/B,YAAY,YAA0B;AACpC,SAAK,cAAc;AACnB,SAAK,UAAU;AAAA,MACb;AAAA,MACA,oCAAoC,KAAK,YAAY,eAAe,CAAC;AAAA,IACvE;AAAA,EACF;AAAA,EACU,YAAsB,CAAC;AAAA,EACjC,YAAY,UAAkB,WAAmB;AAC/C,SAAK,UAAU,KAAK,MAAM,QAAQ,MAAM,SAAS,GAAG;AAAA,EACtD;AAAA,EACA,UAAU,OAAe;AACvB,SAAK,QAAQ,KAAK,KAAK;AAAA,EACzB;AAAA,EACA,WAAW;AACT,WAAO,GAAG,KAAK,QAAQ,KAAK,IAAI,CAAC;AAAA;AAAA,EAAmC,KAAK,UAAU,KAAK,IAAI,CAAC;AAAA;AAAA,EAC/F;AACF;AA8CO,SAAS,eACd,eACA,WACA,YACA;AACA,QAAM,gBAAgB,UAAU,KAAK,EAAE,QAAQ;AAC/C,QAAM,SAAiC,CAAC;AACxC,aAAW,CAAC,MAAM,UAAU,KAAK,OAAO,QAAQ,aAAa,GAAG;AAC9D,UAAM,SAAmB,CAAC;AAC1B,UAAM,UAAU,oBAAI,IAAI,CAAC,0BAA0B,CAAC;AAEpD,eAAW,aAAa,YAAY;AAClC,YAAM,aAAa,UAAU,GAAG,UAAU,IAAI,SAAS;AAEvD,YAAM,SAAS,gBAAgB,UAAU,MACvC,OAAO,KAAK,UAAU,OAAO,EAAE,WAAW,IACtC,OAAO,OAAO,UAAU,OAAO,EAAE,CAAC,IAClCC,aAAY,UAAU,OAAO,CACnC;AAEA,YAAM,eAAe;AAErB,iBAAWC,WAAU,eAAe;AAClC,YAAI,aAAa,SAASA,OAAM,GAAG;AACjC,kBAAQ;AAAA,YACN,YAAYA,OAAM,sBAAsB,WAAW,WAAWA,OAAM,CAAC,CAAC;AAAA,UACxE;AAAA,QACF;AAAA,MACF;AACA,aAAO,KAAK,YAAY;AAAA,IAC1B;AACA,WAAO,UAAU,WAAW,IAAI,CAAC,KAAK,IACpC,CAAC,GAAG,SAAS,GAAG,MAAM,EAAE,KAAK,IAAI,IAAI;AAAA,EACzC;AAEA,QAAM,UAAU,UACb,QAAQ,EACR,OAAmB,CAAC,KAAK,CAAC,MAAM,MAAM,MAAM;AAC3C,UAAM,SAAS,CAAC,0BAA0B;AAC1C,UAAM,UAAU,gBAAgB,IAAI,MAAM,MAAM;AAChD,eAAWA,WAAU,eAAe;AAClC,YAAM,eAAe,IAAI,OAAO,MAAMA,OAAM,KAAK;AACjD,UAAI,aAAa,KAAK,OAAO,KAAKA,YAAW,MAAM;AACjD,eAAO;AAAA,UACL,YAAYA,OAAM,cAAc,WAAW,WAAWA,OAAM,CAAC,CAAC;AAAA,QAChE;AAAA,MACF;AAAA,IACF;AAEA,WAAO,KAAK,OAAO;AACnB,WAAO;AAAA,MACL,CAAC,kBAAkB,WAAW,IAAI,CAAC,OAAO,OAAO,KAAK,IAAI,CAAC;AAAA,MAC3D,GAAG;AAAA,IACL;AAAA,EACF,GAAG,CAAC,CAAC;AAEP,SAAO;AAAA,IACL,GAAG,OAAO,YAAY,OAAO;AAAA,IAC7B,GAAG;AAAA,EACL;AACF;AAEO,SAAS,YAAY,MAAY;AACtC,QAAM,UAAU,IAAI,QAAQ,KAAK,UAAU;AAC3C,QAAM,iBAAiB,IAAI,eAAe,KAAK,UAAU;AACzD,QAAM,SAAmB,CAAC;AAC1B,aAAW,CAAC,MAAM,UAAU,KAAK,OAAO,QAAQ,KAAK,UAAU,GAAG;AAChE,YAAQ;AAAA,MACN,oBAAoB,UAAU,IAAI,CAAC,mBAAmB,KAAK,WAAW,WAAW,IAAI,CAAC,CAAC;AAAA,IACzF;AACA,mBAAe;AAAA,MACb,eAAe,UAAU,IAAI,CAAC,mBAAmB,KAAK,WAAW,WAAW,IAAI,CAAC,CAAC;AAAA,IACpF;AACA,eAAW,aAAa,YAAY;AAClC,YAAM,aAAa,UAAU,GAAG,UAAU,IAAI,SAAS;AACvD,YAAM,YAAY,GAAG,UAAU,IAAI,CAAC,IAAI,UAAU;AAClD,YAAM,SAAS,UAAU,aAAa;AACtC,YAAM,eAAyB,CAAC;AAChC,YAAM,aAAuB,CAAC;AAC9B,YAAM,YAAsB,CAAC;AAC7B,YAAM,cAAwB,CAAC;AAC/B,iBAAW,CAACC,OAAM,IAAI,KAAK,OAAO,QAAQ,UAAU,MAAM,GAAG;AAC3D,YAAI,KAAK,OAAO,aAAa,KAAK,OAAO,UAAU;AACjD,uBAAa,KAAK,IAAIA,KAAI,GAAG;AAAA,QAC/B,WAAW,KAAK,OAAO,SAAS;AAC9B,qBAAW,KAAK,IAAIA,KAAI,GAAG;AAAA,QAC7B,WAAW,KAAK,OAAO,QAAQ;AAC7B,oBAAU,KAAK,IAAIA,KAAI,GAAG;AAAA,QAC5B,WAAW,KAAK,OAAO,QAAQ;AAC7B,sBAAY,KAAK,IAAIA,KAAI,GAAG;AAAA,QAC9B,WAAW,KAAK,OAAO,YAAY;AAEjC;AAAA,QACF,OAAO;AACL,gBAAM,IAAI;AAAA,YACR,kBAAkB,KAAK,EAAE,OAAOA,KAAI,IAAI,KAAK;AAAA,cAC3C;AAAA,YACF,CAAC,OAAO,UAAU,IAAI;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AACA,cAAQ;AAAA,QACN,gBAAgB,OAAO,MAAM,qBAAqB,KAAK,WAAW,WAAW,UAAU,IAAI,CAAC,CAAC;AAAA,MAC/F;AACA,aAAO,KAAK,GAAI,UAAU,UAAU,CAAC,CAAE;AAEvC,YAAM,gBAAgB,OAAO,KAAK,UAAU,OAAO,EAAE,SAAS;AAC9D,iBAAW,QAAQ,UAAU,WAAW,CAAC,GAAG;AAC1C,YAAI,aAAa;AACjB,YAAI,iBAAiB,SAAS,QAAQ;AACpC,uBAAa,GAAG,IAAI;AAAA,QACtB;AACA,cAAM,QAAQ,UAAU,SAAS,GAAG,gBAAgB,IAAI,IAAI,KAAK,EAAE;AAEnE,cAAM,WAAW,GAAG,UAAU,GAAG,UAAU,QAAQ,OAAO,YAAY,CAAC,IAAI,UAAU,QAAQ,IAAI;AACjG,gBAAQ;AAAA,UACN;AAAA,UACA,mBAAmB,KAAK,cAAc,OAAO,GAAG,aAAa,UAAU,UAAU,CAAC,aAAa,GAAG,OAAO,cAAc,KAAK,GAAG,EAAE,KAAK,GAAG,CAAC;AAAA,QAC5I;AACA,uBAAe;AAAA,UACb;AAAA,UACA;AAAA,oBACU,SAAS,GAAG,gBAAgB,IAAI,IAAI,KAAK,EAAE;AAAA,0BACrC,UAAU,WAAW,YAAY,YAAY,UAAU;AAAA,wCACzC,QAAQ;AAAA,gCAChB,QAAQ;AAAA,6CACK,UAAU,uBAAuB,QAAQ;AAAA,iCACrD,YAAY;AAAA,+BACd,UAAU;AAAA,8BACX,SAAS;AAAA,gCACP,WAAW;AAAA;AAAA;AAAA;AAAA,QAInC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,UAAQ;AAAA,IACN,iBAAiB,iBAAiB,QAAQ,CAAC,OAAO,EAAE,EAAE,KAAK,IAAI,CAAC,YAAY,KAAK,WAAW,iBAAiB,CAAC;AAAA,EAChH;AACA,SAAO;AAAA,IACL,aAAa,eAAQ,IAAI;AAAA,IACzB,cAAc,eAAe,SAAS;AAAA,IACtC,gBAAgB,QAAQ,SAAS;AAAA,EACnC;AACF;;;AD5OO,SAAS,MAAM,KAAkC;AACtD,SAAO,UAAU;AACnB;AAEO,SAAS,SAAS,KAAa;AACpC,SAAO,IAAI,QAAQ,QAAQ,EAAE;AAC/B;AAEO,SAAS,SAAS,KAAa;AACpC,QAAM,QAAQ,IAAI,MAAM,GAAG;AAC3B,QAAM,CAAC,KAAK,IAAI,MAAM,OAAO,EAAE;AAC/B,SAAO,EAAE,OAAO,MAAM,MAAM,KAAK,GAAG,EAAE;AACxC;AACO,SAAS,UAAU,MAAqB,KAA2B;AACxE,QAAM,YAAY,SAAS,GAAG,EAAE,MAAM,GAAG;AACzC,QAAM,QAAQ,IAAI,MAAM,SAAS;AACjC,MAAI,SAAS,UAAU,OAAO;AAC5B,WAAO,UAAU,MAAM,MAAM,IAAI;AAAA,EACnC;AACA,SAAO;AACT;AACO,SAAS,kBACdC,WACA,iBACA,UACA;AACA,sBAAoB,CAAC;AACrB,QAAM,UAAmB,CAAC;AAC1B,aAAW,MAAMA,WAAU;AACzB,UAAM,CAAC,IAAI,IAAI,OAAO,KAAK,EAAE;AAC7B,UAAM,SAAS,gBAAgB,IAAI;AACnC,QAAI,MAAM,MAAM,GAAG;AACjB,YAAM,IAAI,MAAM,wCAAwC;AAAA,IAC1D;AACA,QAAI,OAAO,SAAS,QAAQ;AAC1B,cAAQ,eAAe,IAAI;AAAA,QACzB,IAAI,YAAY;AAAA,QAChB,QACE;AAAA,QACF,YAAY;AAAA,MACd;AACA;AAAA,IACF;AACA,QAAI,OAAO,SAAS,UAAU;AAC5B,UAAI,CAAC,OAAO,IAAI;AACd,cAAM,IAAI,MAAM,gDAAgD;AAAA,MAClE;AACA,UAAI,CAAC,OAAO,MAAM;AAChB,cAAM,IAAI,MAAM,iDAAiD;AAAA,MACnE;AACA,cAAQ,OAAO,IAAI,IAAI;AAAA,QACrB,IAAI,YAAY,OAAO;AAAA,QACvB,QAAQ;AAAA,MACV;AACA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,aAAa,SAAmB;AAC9C,QAAM,SAAiC,CAAC;AAExC,aAAW,KAAK,SAAS;AACvB,WAAO,EAAE,eAAe,IAAI,OAAO,EAAE,eAAe,KAAK;AAAA,MACvD,iBAAiB,EAAE;AAAA,MACnB,eAAe,EAAE;AAAA,MACjB,iBAAiB,EAAE;AAAA,MACnB,cAAc,CAAC;AAAA,IACjB;AACA,QAAI,EAAE,cAAc;AAClB,aAAO,EAAE,eAAe,EAAE,aAAa,KAAK,GAAG,EAAE,YAAY;AAAA,IAC/D;AAAA,EACF;AAEA,SAAO,OAAO,OAAO,MAAM;AAC7B;AAcO,SAAS,mBAAmB,SAAmB;AACpD,SAAO,QAAQ,IAAI,CAAC,OAAO;AACzB,QAAI,GAAG,eAAe;AACpB,aAAO,UAAU,GAAG,aAAa,UAAU,GAAG,eAAe;AAAA,IAC/D;AACA,QAAI,GAAG,iBAAiB;AACtB,aAAO,eAAe,GAAG,eAAe,UAAU,GAAG,eAAe;AAAA,IACtE;AACA,QAAI,GAAG,cAAc;AACnB,aAAO,WAAWC,kBAAiB,GAAG,cAAc,CAACC,QAAOA,IAAG,IAAI,EAChE,IAAI,CAAC,MAAM,GAAG,EAAE,aAAa,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,EACpD,KAAK,IAAI,CAAC,WAAW,GAAG,eAAe;AAAA,IAC5C;AACA,UAAM,IAAI,MAAM,kBAAkB,KAAK,UAAU,EAAE,CAAC,EAAE;AAAA,EACxD,CAAC;AACH;AAEO,SAAS,QAAW,MAAWC,UAAmB;AACvD,SAAO,KAAK,OAAO,CAAC,OAAO,CAACA,SAAQ,SAAS,EAAE,CAAC;AAClD;AAEO,SAAS,WAAW,SAAiB,SAAmB;AAC7D,QAAM,SAAmB,CAAC;AAC1B,aAAW,MAAM,aAAa,OAAO,GAAG;AACtC,UAAM,eAAe,GAAG,iBAAiB,GAAG;AAC5C,QAAI,gBAAgB,QAAQ,SAAS,YAAY,GAAG;AAClD,aAAO,KAAK,gBAAgB,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,IAC5C,WAAW,GAAG,aAAa,QAAQ;AACjC,iBAAW,eAAe,GAAG,cAAc;AACzC,YAAI,QAAQ,SAAS,YAAY,IAAI,GAAG;AACtC,iBAAO,KAAK,gBAAgB,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,QAC5C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;;;AG7HO,IAAM,wBAAN,MAA4B;AAAA,EACjC,qBAAqB,oBAAI,IAAY;AAAA,EACrC;AAAA,EACA;AAAA,EAEA,YAAY,MAAqB,OAAsB;AACrD,SAAK,QAAQ;AACb,SAAK,SAAS;AAAA,EAChB;AAAA,EACA,gBAAgB,CAAC,QAAwB;AAEvC,UAAM,gBAAgB;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAGA,QAAI,cAAc,SAAS,GAAG,GAAG;AAC/B,aAAO,IAAI,GAAG;AAAA,IAChB;AAGA,QAAI,IAAI,KAAK,MAAM,IAAI;AACrB,aAAO,IAAI,GAAG;AAAA,IAChB;AAGA,UAAM,YAAY,IAAI,OAAO,CAAC;AAC9B,UAAM,iBACH,aAAa,OAAO,aAAa,OACjC,aAAa,OAAO,aAAa,OAClC,cAAc,OACd,cAAc;AAEhB,QAAI,CAAC,gBAAgB;AACnB,aAAO,IAAI,IAAI,QAAQ,MAAM,KAAK,CAAC;AAAA,IACrC;AAGA,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,YAAM,OAAO,IAAI,OAAO,CAAC;AACzB,YAAM,YACH,QAAQ,OAAO,QAAQ,OACvB,QAAQ,OAAO,QAAQ,OACvB,QAAQ,OAAO,QAAQ,OACxB,SAAS,OACT,SAAS;AAEX,UAAI,CAAC,WAAW;AACd,eAAO,IAAI,IAAI,QAAQ,MAAM,KAAK,CAAC;AAAA,MACrC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EACA,kBAAkB,CAAC,UAA0B;AAC3C,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,QAAsB,WAAW,OAAe;AACrD,UAAM,aAAa,OAAO,cAAc,CAAC;AAGzC,UAAM,cAAc,OAAO,QAAQ,UAAU,EAAE,IAAI,CAAC,CAAC,KAAK,UAAU,MAAM;AACxE,YAAM,cAAc,OAAO,YAAY,CAAC,GAAG,SAAS,GAAG;AACvD,YAAM,SAAS,KAAK,OAAO,YAAY,UAAU;AAEjD,aAAO,GAAG,KAAK,gBAAgB,GAAG,CAAC,KAAK,MAAM;AAAA,IAChD,CAAC;AAGD,QAAI,OAAO,sBAAsB;AAC/B,UAAI,OAAO,OAAO,yBAAyB,UAAU;AACnD,cAAM,YAAY,KAAK,OAAO,OAAO,sBAAsB,IAAI;AAC/D,oBAAY,KAAK,kBAAkB,SAAS,EAAE;AAAA,MAChD,WAAW,OAAO,yBAAyB,MAAM;AAC/C,oBAAY,KAAK,oBAAoB;AAAA,MACvC;AAAA,IACF;AAEA,WAAO,KAAK,YAAY,KAAK,IAAI,CAAC;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAsB,WAAW,OAAe;AACpD,UAAM,EAAE,MAAM,IAAI;AAClB,QAAI,CAAC,OAAO;AAEV,aAAO;AAAA,IACT;AAGA,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,YAAM,aAAa,MAAM,IAAI,CAAC,QAAQ,KAAK,OAAO,KAAK,IAAI,CAAC;AAC5D,aAAO,IAAI,WAAW,KAAK,IAAI,CAAC;AAAA,IAClC;AAGA,UAAM,YAAY,KAAK,OAAO,OAAO,IAAI;AACzC,WAAO,GAAG,SAAS;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,MAAc,QAAsB,WAAW,OAAe;AACnE,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO,KAAK,OAAO,QAAQ,QAAQ;AAAA,MACrC,KAAK;AAAA,MACL,KAAK;AACH,eAAO,KAAK,OAAO,QAAQ,QAAQ;AAAA,MACrC,KAAK;AACH,eAAO,eAAe,WAAW,QAAQ;AAAA,MAC3C,KAAK;AACH,eAAO,KAAK,OAAO,QAAQ,QAAQ;AAAA,MACrC,KAAK;AACH,eAAO,KAAK,MAAM,QAAQ,QAAQ;AAAA,MACpC,KAAK;AACH,eAAO;AAAA,MACT;AAEE,eAAO,eAAe,OAAO,QAAQ;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,IAAI,MAAc,UAA2B;AAC3C,UAAM,aAAa,SAAS,IAAI,EAAE,MAAM,GAAG,EAAE,IAAI;AAEjD,QAAI,KAAK,mBAAmB,IAAI,UAAU,GAAG;AAC3C,aAAO;AAAA,IACT;AAEA,SAAK,mBAAmB,IAAI,UAAU;AACtC,SAAK,OAAO,YAAY,KAAK,OAAO,UAAU,KAAK,OAAO,IAAI,GAAG,IAAI,CAAC;AACtE,SAAK,mBAAmB,OAAO,UAAU;AAEzC,WAAO,eAAe,YAAY,QAAQ;AAAA,EAC5C;AAAA,EAEA,MAAM,SAAqD;AAEzD,UAAM,aAAa,QAAQ,IAAI,CAAC,QAAQ,KAAK,OAAO,KAAK,IAAI,CAAC;AAC9D,WAAO,WAAW,SAAS,IAAI,GAAG,WAAW,KAAK,KAAK,CAAC,KAAK,WAAW,CAAC;AAAA,EAC3E;AAAA,EAEA,MACE,SACA,UACQ;AAER,UAAM,aAAa,QAAQ,IAAI,CAAC,QAAQ,KAAK,OAAO,KAAK,IAAI,CAAC;AAC9D,WAAO;AAAA,MACL,WAAW,SAAS,IAAI,GAAG,WAAW,KAAK,KAAK,CAAC,KAAK,WAAW,CAAC;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MACE,SACA,UACQ;AACR,UAAM,aAAa,QAAQ,IAAI,CAAC,QAAQ;AACtC,UAAI,MAAM,GAAG,GAAG;AACd,cAAM,EAAE,MAAM,IAAI,SAAS,IAAI,IAAI;AACnC,YAAI,KAAK,mBAAmB,IAAI,KAAK,GAAG;AACtC,iBAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO,KAAK,OAAO,KAAK,KAAK;AAAA,IAC/B,CAAC;AACD,WAAO;AAAA,MACL,WAAW,SAAS,IAAI,GAAG,WAAW,KAAK,KAAK,CAAC,KAAK,WAAW,CAAC;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,KAAK,QAAe,UAA2B;AAE7C,UAAM,aAAa,OAChB,IAAI,CAAC,QAAS,OAAO,QAAQ,WAAW,IAAI,GAAG,MAAM,GAAG,GAAG,EAAG,EAC9D,KAAK,KAAK;AACb,WAAO,eAAe,YAAY,QAAQ;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,QAAsB,UAA4B;AACvD,QAAI;AAEJ,YAAQ,OAAO,QAAQ;AAAA,MACrB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AACP;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AACP;AAAA,MACF,KAAK;AACH,eAAO;AACP;AAAA,MACF;AACE,eAAO;AAAA,IACX;AAEA,WAAO,eAAe,MAAM,QAAQ;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,QAAsB,UAA4B;AACvD,UAAM,OAAO,OAAO,WAAW,UAAU,WAAW;AACpD,WAAO,eAAe,MAAM,QAAQ;AAAA,EACtC;AAAA,EAEA,OAAO,QAAwC,UAA2B;AACxE,QAAI,MAAM,MAAM,GAAG;AACjB,aAAO,KAAK,IAAI,OAAO,MAAM,QAAQ;AAAA,IACvC;AAGA,QAAI,OAAO,SAAS,MAAM,QAAQ,OAAO,KAAK,GAAG;AAC/C,aAAO,KAAK,MAAM,OAAO,KAAK;AAAA,IAChC;AAGA,QAAI,OAAO,SAAS,MAAM,QAAQ,OAAO,KAAK,GAAG;AAC/C,aAAO,KAAK,MAAM,OAAO,OAAO,QAAQ;AAAA,IAC1C;AAGA,QAAI,OAAO,SAAS,MAAM,QAAQ,OAAO,KAAK,GAAG;AAC/C,aAAO,KAAK,MAAM,OAAO,OAAO,QAAQ;AAAA,IAC1C;AAGA,QAAI,OAAO,QAAQ,MAAM,QAAQ,OAAO,IAAI,GAAG;AAC7C,aAAO,KAAK,KAAK,OAAO,MAAM,QAAQ;AAAA,IACxC;AAGA,UAAM,QAAQ,MAAM,QAAQ,OAAO,IAAI,IACnC,OAAO,OACP,OAAO,OACL,CAAC,OAAO,IAAI,IACZ,CAAC;AAGP,QAAI,CAAC,MAAM,QAAQ;AAEjB,UAAI,gBAAgB,QAAQ;AAC1B,eAAO,KAAK,OAAO,QAAQ,QAAQ;AAAA,MACrC;AACA,aAAO,eAAe,OAAO,QAAQ;AAAA,IACvC;AAGA,QAAI,MAAM,SAAS,GAAG;AACpB,YAAM,YAAY,MAAM,OAAO,CAAC,MAAM,MAAM,MAAM;AAClD,UAAI,UAAU,WAAW,KAAK,MAAM,SAAS,MAAM,GAAG;AAEpD,cAAM,SAAS,KAAK,OAAO,UAAU,CAAC,GAAG,QAAQ,KAAK;AACtD,eAAO,eAAe,GAAG,MAAM,WAAW,QAAQ;AAAA,MACpD;AAGA,YAAM,cAAc,MAAM,IAAI,CAAC,MAAM,KAAK,OAAO,GAAG,QAAQ,KAAK,CAAC;AAClE,aAAO,eAAe,YAAY,KAAK,KAAK,GAAG,QAAQ;AAAA,IACzD;AAGA,WAAO,KAAK,OAAO,MAAM,CAAC,GAAG,QAAQ,QAAQ;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,kBACE,MACA,QACQ;AACR,UAAM,UAAU,KAAK,OAAO,QAAQ,IAAI;AACxC,WAAO,aAAa,IAAI,IAAI,OAAO;AAAA,EACrC;AACF;AAKA,SAAS,eAAe,MAAc,YAA8B;AAClE,SAAO,aAAa,OAAO,GAAG,IAAI;AACpC;;;AChVO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,qBAAqB,oBAAI,IAAY;AAAA,EACrC;AAAA,EACA;AAAA,EAEA,YAAY,MAAqB,OAAuB;AACtD,SAAK,QAAQ;AACb,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAIA,OAAO,QAAsB,WAAW,OAAe;AACrD,UAAM,aAAa,OAAO,cAAc,CAAC;AAGzC,UAAM,cAAc,OAAO,QAAQ,UAAU,EAAE,IAAI,CAAC,CAAC,KAAK,UAAU,MAAM;AACxE,YAAM,cAAc,OAAO,YAAY,CAAC,GAAG,SAAS,GAAG;AACvD,YAAM,UAAU,KAAK,OAAO,YAAY,UAAU;AAClD,aAAO,IAAI,GAAG,MAAM,OAAO;AAAA,IAC7B,CAAC;AAGD,QAAI,kBAAkB;AACtB,QAAI,OAAO,sBAAsB;AAC/B,UAAI,OAAO,OAAO,yBAAyB,UAAU;AAEnD,cAAM,aAAa,KAAK,OAAO,OAAO,sBAAsB,IAAI;AAChE,0BAAkB,aAAa,UAAU;AAAA,MAC3C,WAAW,OAAO,yBAAyB,MAAM;AAE/C,0BAAkB;AAAA,MACpB;AAAA,IACF;AAEA,UAAM,eAAe,aAAa,YAAY,KAAK,IAAI,CAAC,KAAK,eAAe;AAC5E,WAAO,GAAG,YAAY,GAAGC,gBAAe,QAAQ,CAAC;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAsB,WAAW,OAAe;AACpD,UAAM,EAAE,MAAM,IAAI;AAClB,QAAI,CAAC,OAAO;AAEV,aAAO,uBAAuBA,gBAAe,QAAQ,CAAC;AAAA,IACxD;AAGA,QAAI,MAAM,QAAQ,KAAK,GAAG;AAExB,YAAM,aAAa,MAAM,IAAI,CAAC,QAAQ,KAAK,OAAO,KAAK,IAAI,CAAC;AAC5D,YAAM,OAAO,YAAY,WAAW,KAAK,IAAI,CAAC;AAU9C,aAAO,GAAG,IAAI,GAAGA,gBAAe,QAAQ,CAAC;AAAA,IAC3C;AAGA,UAAM,cAAc,KAAK,OAAO,OAAO,IAAI;AAC3C,WAAO,WAAW,WAAW,IAAIA,gBAAe,QAAQ,CAAC;AAAA,EAC3D;AAAA;AAAA;AAAA,EAIA,YAAY,CAAC,cAAuB,UAAmB,aAAsB;AAC3E,WAAO,GAAG,WAAW,gBAAgB,EAAE,GAAG,cAAc,YAAY,CAAC,GAAGA,gBAAe,QAAQ,CAAC;AAAA,EAClG;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OACE,MACA,QACA,WAAW,OACX,WAAW,OACH;AACR,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO,GAAG,KAAK,OAAO,MAAM,CAAC,GAAG,KAAK,UAAU,OAAO,SAAS,UAAU,QAAQ,CAAC;AAAA,MACpF,KAAK;AAAA,MACL,KAAK,WAAW;AACd,cAAM,EAAE,MAAM,aAAa,IAAI,KAAK,OAAO,MAAM;AACjD,eAAO,GAAG,IAAI,GAAG,KAAK,UAAU,cAAc,UAAU,QAAQ,CAAC;AAAA,MACnE;AAAA,MACA,KAAK;AACH,eAAO,cAAc,KAAK,UAAU,OAAO,SAAS,UAAU,QAAQ,CAAC;AAAA,MACzE,KAAK;AACH,eAAO,KAAK,OAAO,QAAQ,QAAQ;AAAA,MACrC,KAAK;AACH,eAAO,KAAK,MAAM,QAAQ,QAAQ;AAAA,MACpC,KAAK;AAEH,eAAO,WAAWA,gBAAe,QAAQ,CAAC;AAAA,MAC5C;AAEE,eAAO,cAAcA,gBAAe,QAAQ,CAAC;AAAA,IACjD;AAAA,EACF;AAAA,EAEA,IAAI,MAAc,UAAmB;AACnC,UAAM,aAAa,SAAS,IAAI,EAAE,MAAM,GAAG,EAAE,IAAI;AAEjD,QAAI,KAAK,mBAAmB,IAAI,UAAU,GAAG;AAC3C,aAAO;AAAA,IACT;AAEA,SAAK,mBAAmB,IAAI,UAAU;AACtC,SAAK;AAAA,MACH;AAAA,MACA,KAAK,OAAO,UAAU,KAAK,OAAO,IAAI,GAAG,QAAQ;AAAA,IACnD;AACA,SAAK,mBAAmB,OAAO,UAAU;AAEzC,WAAO;AAAA,EACT;AAAA,EACA,MAAM,SAA6C;AACjD,UAAM,eAAe,QAAQ,IAAI,CAAC,QAAQ,KAAK,OAAO,KAAK,IAAI,CAAC;AAChE,QAAI,aAAa,WAAW,GAAG;AAC7B,aAAO;AAAA,IACT;AACA,QAAI,aAAa,WAAW,GAAG;AAC7B,aAAO,aAAa,CAAC;AAAA,IACvB;AACA,WAAO,KAAK,gBAAgB,YAAY;AAAA,EAC1C;AAAA,EAEA,gBAAgB,SAA2B;AACzC,UAAM,CAAC,MAAM,GAAG,KAAK,IAAI;AACzB,QAAI,CAAC,MAAM,QAAQ;AACjB,aAAO;AAAA,IACT;AACA,WAAO,kBAAkB,IAAI,KAAK,KAAK,gBAAgB,KAAK,CAAC;AAAA,EAC/D;AAAA,EAEA,MAAM,SAA6C,UAAmB;AACpE,UAAM,eAAe,QAAQ,IAAI,CAAC,QAAQ,KAAK,OAAO,KAAK,KAAK,CAAC;AACjE,QAAI,aAAa,WAAW,GAAG;AAC7B,aAAO,aAAa,CAAC;AAAA,IACvB;AACA,WAAO,aAAa,SAAS,IACzB,YAAY,aAAa,KAAK,IAAI,CAAC,KAAKA,gBAAe,QAAQ,CAAC;AAAA;AAAA,MAEhE,aAAa,CAAC;AAAA;AAAA,EACpB;AAAA,EAEA,MAAM,SAA6C,UAAmB;AACpE,UAAM,eAAe,QAAQ,IAAI,CAAC,QAAQ;AACxC,UAAI,UAAU,KAAK;AACjB,cAAM,EAAE,MAAM,IAAI,SAAS,IAAI,IAAI;AACnC,YAAI,KAAK,mBAAmB,IAAI,KAAK,GAAG;AACtC,iBAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO,KAAK,OAAO,KAAK,KAAK;AAAA,IAC/B,CAAC;AACD,QAAI,aAAa,WAAW,GAAG;AAC7B,aAAO,aAAa,CAAC;AAAA,IACvB;AACA,WAAO,aAAa,SAAS,IACzB,YAAY,aAAa,KAAK,IAAI,CAAC,KAAKA,gBAAe,QAAQ,CAAC;AAAA;AAAA,MAEhE,aAAa,CAAC;AAAA;AAAA,EACpB;AAAA,EAEA,KAAK,QAAe,UAAmB;AACrC,UAAM,WAAW,OAAO,IAAI,CAAC,QAAQ,KAAK,UAAU,GAAG,CAAC,EAAE,KAAK,IAAI;AACnE,WAAO,WAAW,QAAQ,KAAKA,gBAAe,QAAQ,CAAC;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,QAA8B;AACnC,QAAI,OAAO;AAMX,YAAQ,OAAO,QAAQ;AAAA,MACrB,KAAK;AAAA,MACL,KAAK;AAEH,eAAO;AACP;AAAA,MACF,KAAK;AACH,eACE;AACF;AAAA,MACF,KAAK;AACH,eACE;AACF;AAAA,MACF,KAAK;AACH,eAAO;AACP;AAAA,MACF,KAAK;AACH,eAAO;AACP;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AACP;AAAA,MACF,KAAK;AACH,eAAO;AACP;AAAA,MACF,KAAK;AACH,eAAO;AACP;AAAA,MACF,KAAK;AACH,eAAO;AACP;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AACP;AAAA,MACF,KAAK;AAEH,eAAO;AACP;AAAA,MACF;AAEE;AAAA,IACJ;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,QAAsB;AAC3B,QAAI,eAAe,OAAO;AAC1B,QAAI,OAAO;AACX,QAAI,OAAO,WAAW,SAAS;AAC7B,aAAO;AACP,UAAI,OAAO,YAAY,QAAW;AAChC,uBAAe,UAAU,OAAO,OAAO;AAAA,MACzC;AAAA,IACF;AAEA,QAAI,OAAO,WAAW,SAAS;AAE7B,cAAQ;AAAA,IACV;AAGA,QAAI,OAAO,OAAO,qBAAqB,UAAU;AAG/C,cAAQ,OAAO,OAAO,gBAAgB;AAAA,IACxC;AAEA,QAAI,OAAO,OAAO,qBAAqB,UAAU;AAE/C,cAAQ,OAAO,OAAO,gBAAgB;AAAA,IACxC;AAGA,QAAI,OAAO,OAAO,YAAY,UAAU;AACtC,cACE,OAAO,WAAW,UACd,eAAe,OAAO,OAAO,OAC7B,QAAQ,OAAO,OAAO;AAAA,IAC9B;AACA,QAAI,OAAO,OAAO,YAAY,UAAU;AACtC,cACE,OAAO,WAAW,UACd,eAAe,OAAO,OAAO,OAC7B,QAAQ,OAAO,OAAO;AAAA,IAC9B;AAGA,QAAI,OAAO,OAAO,eAAe,UAAU;AAGzC,cAAQ,2CAA2C,OAAO,UAAU,6BAA6B,OAAO,UAAU;AAAA,IACpH;AAEA,WAAO,EAAE,MAAM,aAAa;AAAA,EAC9B;AAAA,EAEA,OAAO,QAAwC,UAA2B;AACxE,QAAI,MAAM,MAAM,GAAG;AACjB,aAAO,KAAK,IAAI,OAAO,MAAM,QAAQ;AAAA,IACvC;AAGA,QAAI,OAAO,SAAS,MAAM,QAAQ,OAAO,KAAK,GAAG;AAC/C,aAAO,KAAK,MAAM,OAAO,SAAS,CAAC,CAAC;AAAA,IACtC;AAGA,QAAI,OAAO,SAAS,MAAM,QAAQ,OAAO,KAAK,GAAG;AAC/C,aAAO,KAAK,MAAM,OAAO,SAAS,CAAC,GAAG,QAAQ;AAAA,IAChD;AAGA,QAAI,OAAO,SAAS,MAAM,QAAQ,OAAO,KAAK,GAAG;AAC/C,aAAO,KAAK,MAAM,OAAO,SAAS,CAAC,GAAG,QAAQ;AAAA,IAChD;AAGA,QAAI,OAAO,QAAQ,MAAM,QAAQ,OAAO,IAAI,GAAG;AAC7C,aAAO,KAAK,KAAK,OAAO,MAAM,QAAQ;AAAA,IACxC;AAIA,UAAM,QAAQ,MAAM,QAAQ,OAAO,IAAI,IACnC,OAAO,OACP,OAAO,OACL,CAAC,OAAO,IAAI,IACZ,CAAC;AAGP,QAAI,CAAC,MAAM,QAAQ;AACjB,aAAO,cAAcA,gBAAe,QAAQ,CAAC;AAAA,IAC/C;AAMA,QAAI,cAAc,UAAU,OAAO,UAAU;AAC3C,YAAM,KAAK,MAAM;AAAA,IACnB;AAEA,QAAI,MAAM,SAAS,GAAG;AAEpB,YAAM,YAAY,MAAM,OAAO,CAAC,MAAM,MAAM,MAAM;AAClD,UAAI,UAAU,WAAW,KAAK,MAAM,SAAS,MAAM,GAAG;AAEpD,eAAO,KAAK,OAAO,UAAU,CAAC,GAAG,QAAQ,OAAO,IAAI;AAAA,MACtD;AAEA,YAAM,aAAa,MAAM,IAAI,CAAC,MAAM,KAAK,OAAO,GAAG,QAAQ,KAAK,CAAC;AACjE,aAAO,YAAY,WAAW,KAAK,IAAI,CAAC,KAAKA,gBAAe,QAAQ,CAAC;AAAA,IACvE;AACA,WAAO,KAAK,OAAO,MAAM,CAAC,GAAG,QAAQ,UAAU,KAAK;AAAA,EACtD;AACF;AAKA,SAASA,gBAAe,YAAsB;AAC5C,SAAO,aAAa,KAAK;AAC3B;AACA,SAAS,cAAc,cAAoB;AACzC,SAAO,iBAAiB,SACpB,YAAY,KAAK,UAAU,YAAY,CAAC,MACxC;AACN;;;ALzVA,IAAM,YAAoC;AAAA,EACxC,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AACT;AAkBO,IAAM,WACwC;AAAA,EACnD,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,aAAa,CAAC,WAAW,MAAM,WAAW;AACxC,QAAI,UAAU,aAAa;AACzB,aAAOC,YAAW,UAAU,WAAW;AAAA,IACzC;AACA,WAAOC,WAAU,GAAG,MAAM,IAAI,KAAK,QAAQ,gBAAgB,GAAG,EAAE,KAAK,CAAC,EAAE;AAAA,EAC1E;AACF;AAEO,SAAS,aAAa,QAA2B;AACtD,QAAM,gBAAwC,CAAC;AAC/C,QAAM,YAAY,oBAAI,IAAoB;AAC1C,QAAM,mBAA6B,CAAC;AACpC,QAAM,iBAAiB,IAAI,eAAe,OAAO,MAAM,CAAC,OAAO,WAAW;AACxE,cAAU,IAAI,OAAO,MAAM;AAC3B,qBAAiB,KAAK;AAAA,MACpB,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,iBAAiB,KAAK,OAAO,WAAW,KAAK,CAAC;AAAA,MAC9C,cAAc,CAAC,EAAE,YAAY,MAAM,MAAM,MAAM,CAAC;AAAA,MAChD,iBAAiB;AAAA,IACnB,CAAC;AAAA,EACH,CAAC;AAED,QAAM,SAA6B,CAAC;AACpC,QAAM,UAAkC,CAAC;AAEzC,aAAW,CAAC,MAAMC,QAAO,KAAK,OAAO,QAAQ,OAAO,KAAK,SAAS,CAAC,CAAC,GAAG;AACrE,eAAW,CAAC,QAAQ,SAAS,KAAK,OAAO,QAAQA,QAAO,GAGnD;AACH,YAAM,oBAAoB,OAAO,eAAe,SAAS;AACzD,YAAM,gBAAgB,kBAAkB,WAAW,MAAM,MAAM;AAE/D,cAAQ,IAAI,cAAc,MAAM,IAAI,IAAI,EAAE;AAC1C,YAAM,CAAC,SAAS,IAAI,MAAM,QAAQ,UAAU,IAAI,IAC5C,UAAU,OACV,CAAC,SAAS;AACd,aAAO,SAAS,MAAM,CAAC;AACvB,YAAM,SAA8B,CAAC;AAErC,YAAM,uBAA0C,CAAC;AACjD,iBAAW,SAAS,UAAU,cAAc,CAAC,GAAG;AAC9C,YAAI,MAAM,KAAK,GAAG;AAChB,gBAAM,IAAI,MAAM,gCAAgC,MAAM,IAAI,EAAE;AAAA,QAC9D;AACA,YAAI,CAAC,MAAM,QAAQ;AACjB,gBAAM,IAAI,MAAM,kCAAkC,MAAM,IAAI,EAAE;AAAA,QAChE;AACA,eAAO,MAAM,IAAI,IAAI;AAAA,UACnB,IAAI,MAAM;AAAA,UACV,QAAQ;AAAA,QACV;AACA,6BAAqB,KAAK,KAAK;AAAA,MACjC;AAEA,YAAMC,YAAW,UAAU,YAAY,CAAC;AACxC,YAAM,kBAAkB,OAAO,KAAK,YAAY,mBAAmB,CAAC;AAEpE,YAAM,kBAAkB,kBAAkBA,WAAU,eAAe;AAEnE,aAAO,OAAO,QAAQ,eAAe;AAErC,2BAAqB;AAAA,QACnB,GAAG,OAAO,QAAQ,eAAe,EAAE;AAAA,UACjC,CAAC,CAAC,MAAM,KAAK,OACV;AAAA,YACC;AAAA,YACA,UAAU;AAAA,YACV,QAAQ;AAAA,cACN,MAAM;AAAA,YACR;AAAA,YACA,IAAI,MAAM;AAAA,UACZ;AAAA,QACJ;AAAA,MACF;AAEA,YAAM,QAAgC,CAAC;AACvC,YAAM,qBAA6C;AAAA,QACjD,oBAAoB;AAAA,QACpB,qCAAqC;AAAA,QACrC,uBAAuB;AAAA,QACvB,mBAAmB;AAAA,QACnB,cAAc;AAAA,MAChB;AACA,UAAI;AACJ,UAAI,UAAU,eAAe,OAAO,KAAK,UAAU,WAAW,EAAE,QAAQ;AACtE,cAAM,UAAyB,MAAM,UAAU,WAAW,IACtDC,KAAI,UAAU,OAAO,MAAM,UAAU,YAAY,IAAI,GAAG,CAAC,SAAS,CAAC,IACnE,UAAU,YAAY;AAE1B,mBAAW,QAAQ,SAAS;AAC1B,gBAAM,WAAW,MAAM,QAAQ,IAAI,EAAE,MAAM,IACvC,UAAU,OAAO,MAAM,QAAQ,IAAI,EAAE,OAAO,IAAI,IAChD,QAAQ,IAAI,EAAE;AAClB,cAAI,CAAC,UAAU;AACb,oBAAQ,KAAK,wBAAwB,IAAI,EAAE;AAC3C;AAAA,UACF;AAEA,gBAAM,SAAS,MAAM,CAAC,GAAG,UAAU;AAAA,YACjC,UAAU,qBACP,OAAO,CAAC,MAAM,EAAE,QAAQ,EACxB,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,YACpB,YAAY,qBAAqB;AAAA,cAC/B,CAAC,KAAK,OAAO;AAAA,gBACX,GAAG;AAAA,gBACH,CAAC,EAAE,IAAI,GAAG,EAAE;AAAA,cACd;AAAA,cACA,CAAC;AAAA,YACH;AAAA,UACF,CAAC;AAED,iBAAO,OAAO,QAAQ,WAAW,QAAQ,QAAQ,CAAC;AAClD,gBAAM,mBAAmB,IAAI,CAAC,IAAI,eAAe,OAAO,QAAQ,IAAI;AAAA,QACtE;AAEA,YAAI,QAAQ,kBAAkB,GAAG;AAC/B,gCAAsB;AAAA,QACxB,WAAW,QAAQ,mCAAmC,GAAG;AACvD,gCAAsB;AAAA,QACxB,WAAW,QAAQ,qBAAqB,GAAG;AACzC,gCAAsB;AAAA,QACxB,OAAO;AACL,gCAAsB;AAAA,QACxB;AAAA,MACF,OAAO;AACL,cAAM,aAAa,qBAAqB;AAAA,UACtC,CAAC,KAAK,OAAO;AAAA,YACX,GAAG;AAAA,YACH,CAAC,EAAE,IAAI,GAAG,EAAE;AAAA,UACd;AAAA,UACA,CAAC;AAAA,QACH;AACA,cAAM,mBAAmB,kBAAkB,CAAC,IAAI,eAAe;AAAA,UAC7D;AAAA,YACE,MAAM;AAAA,YACN,UAAU,qBACP,OAAO,CAAC,MAAM,EAAE,QAAQ,EACxB,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,YACpB;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,YAAM,SAAmB,CAAC;AAC1B,gBAAU,cAAc,CAAC;AAEzB,UAAI,gBAAgB;AACpB,YAAM,SAAS,CAAC,sBAAsB;AACtC,UAAI,SAAiB;AACrB,iBAAW,UAAU,UAAU,WAAW;AACxC,cAAM,WAAW;AAAA,UACf,UAAU,UAAU,MAAM;AAAA,QAC5B,IACK;AAAA,UACC,OAAO;AAAA,UACP,UAAU,UAAU,MAAM,EAAE;AAAA,QAC9B,IACC,UAAU,UAAU,MAAM;AAC/B,cAAM,aAAa,CAAC;AACpB,YAAI,cAAc,KAAK;AACrB,iBAAO,KAAK,UAAU,MAAM,KAAK,qBAAqB;AAAA,QACxD;AACA,YAAI,cAAc,OAAO,aAAa,KAAK;AACzC,0BAAgB;AAChB,gBAAM,kBAAkBA,KAAI,UAAU,CAAC,SAAS,CAAC;AACjD,gBAAM,SAAS,mBAAmB,gBAAgB,kBAAkB;AACpE,eAAK,SAAS,WAAW,CAAC,GAAG,mBAAmB,GAAG;AACjD,qBAAS;AAAA,UACX;AAEA,gBAAM,UAAoB,CAAC;AAC3B,gBAAM,wBAAwB,IAAI;AAAA,YAChC,OAAO;AAAA,YACP,CAAC,YAAY,QAAQ;AACnB,4BAAc,UAAU,IAAI;AAC5B,sBAAQ,KAAK;AAAA,gBACX,eAAe;AAAA,gBACf,YAAY;AAAA,gBACZ,iBAAiB,aAAa,OAAO,WAAW,UAAU,CAAC;AAAA,gBAC3D,cAAc,CAAC,EAAE,YAAY,MAAM,MAAM,WAAW,CAAC;AAAA,gBACrD,iBAAiB;AAAA,cACnB,CAAC;AAAA,YACH;AAAA,UACF;AACA,gBAAM,iBAAiB,SACnB,sBAAsB;AAAA,YACpB,gBAAgB,kBAAkB,EAAE;AAAA,YACpC;AAAA,UACF,IACA;AACJ,iBAAO,KAAK,GAAG,WAAW,gBAAgB,OAAO,CAAC;AAClD,iBAAO;AAAA,YACL,eAAe,WAAW,gBAAgB,SAAS,CAAC,MAAM,cAAc;AAAA,UAC1E;AAAA,QACF;AAAA,MACF;AAEA,UAAI,CAAC,eAAe;AAClB,eAAO;AAAA,UACL,eAAe,WAAW,gBAAgB,SAAS,CAAC;AAAA,QACtD;AAAA,MACF;AACA,cAAQ,GAAGJ,YAAW,aAAa,CAAC,KAAK,IAAI,OAAO,KAAK,IAAI;AAC7D,aAAO,SAAS,EAAE,KAAK;AAAA,QACrB,MAAM;AAAA,QACN,MAAM;AAAA,QACN;AAAA,QACA,QAAQ,OAAO,SAAS,SAAS,CAAC,aAAa;AAAA,QAC/C;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA,cAAc,OAAO;AAAA,UACnB,QAAQ,WAAW,gBAAgB,SAAS;AAAA,UAC5C,KAAK,WAAW,gBAAgB,SAAS;AAAA,QAC3C;AAAA,QACA,SAAS;AAAA,UACP;AAAA,UACA;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,eAAe,WAAW,QAAQ;AACrD;AAgBA,SAAS,QACP,MACA,aACA,aAAuB,CAAC,GACxB;AACA,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,SAAS,UAAU,MAAM,YAAY,IAAI;AAC/C,WAAO,QAAQ,MAAM,QAAQ,UAAU;AAAA,EACzC,WAAW,YAAY,SAAS,UAAU;AACxC,eAAW,CAAC,IAAI,KAAK,OAAO,QAAQ,YAAY,cAAc,CAAC,CAAC,GAAG;AACjE,iBAAW,KAAK,IAAI;AAAA,IACtB;AACA,WAAO;AAAA,EACT,WAAW,YAAY,OAAO;AAC5B,eAAW,MAAM,YAAY,OAAO;AAClC,cAAQ,MAAM,IAAI,UAAU;AAAA,IAC9B;AACA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,WACP,QACA,UACA;AACA,QAAM,QAAkB,CAAC;AACzB,UAAQ,OAAO,MAAM,UAAU,KAAK;AACpC,SAAO,MAAM;AAAA,IACX,CAAC,KAAK,UAAU;AAAA,MACd,GAAG;AAAA,MACH,CAAC,IAAI,GAAG;AAAA,QACN,IAAI;AAAA,QACJ,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,CAAC;AAAA,EACH;AACF;;;AMpWA;;;ACAA;;;ACAA;;;ACAA;;;ACAA;;;ACAA;;;AZgBA,SAAS,SAAS,MAAqB;AACrC,QAAMK,YAAW,KAAK,YAAY,CAAC;AACnC,QAAM,aAAa,KAAK,cAAc,CAAC;AACvC,QAAM,kBAAkB,WAAW,mBAAmB,CAAC;AACvD,QAAM,QAAQ,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC;AAE5C,QAAM,UAAU,kBAAkBA,WAAU,eAAe;AAE3D,aAAW,MAAM,OAAO;AACtB,eAAW,UAAU,SAAS;AAC5B,YAAM,YAAY,GAAG,MAAM;AAC3B,UAAI,CAAC,WAAW;AACd;AAAA,MACF;AACA,aAAO;AAAA,QACL;AAAA,QACA,kBAAkB,UAAU,YAAY,CAAC,GAAG,iBAAiB,OAAO;AAAA,MACtE;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,SACpB,MACA,UAcA;AACA,WAAS,mBAAmB;AAC5B,QAAM,aAAa,CAAC,oBAA4B;AAC9C,WAAO,SAAS,iBAAiB,GAAG,eAAe,QAAQ;AAAA,EAC7D;AACA,QAAM,EAAE,eAAe,QAAQ,SAAS,UAAU,IAAI,aAAa;AAAA,IACjE;AAAA,IACA,OAAO;AAAA,IACP,QAAQ;AAAA,IACR;AAAA,EACF,CAAC;AACD,QAAM,SACJ,SAAS,SAAS,SAAS,KAAK,SAAS,QAAQ,KAAK,IAAI,SAAS;AAErE,QAAM,UAAU,SAAS,IAAI;AAE7B,QAAM,cAAc,YAAY;AAAA,IAC9B,MAAM,SAAS,QAAQ;AAAA,IACvB,YAAY;AAAA,IACZ,SAAS,KAAK,SAAS,IAAI,CAAC,WAAW,OAAO,GAAG,KAAK,CAAC;AAAA,IACvD;AAAA,IACA;AAAA,EACF,CAAC;AAMD,QAAM,aAAa,eAAe,QAAQ,WAAW,UAAU;AAE/D,QAAM,WAAW,QAAQ;AAAA,IACvB,oBAAoB;AAAA,IACpB,mBAAmB;AAAA,IACnB,mBAAmB;AAAA;AAAA,EAErB,CAAC;AAED,QAAM,WAAW,KAAK,QAAQ,MAAM,GAAG;AAAA,IACrC,mBAAmB;AAAA,IACnB,qBAAqB;AAAA,IACrB,mBAAmB;AAAA,sCACe,WAAW,cAAc,CAAC;AAAA,iCAC/B,WAAW,gBAAgB,CAAC;AAAA,2BAClC,WAAW,QAAQ,CAAC;AAAA,EAC7C,oBAAW;AAAA,IACT,eAAe;AAAA,IACf,aAAa;AAAA,IACb,cAAc;AAAA,EAChB,CAAC;AAED,QAAM,WAAW,KAAK,QAAQ,SAAS,GAAG,OAAO;AACjD,QAAM,gBAAgB,OAAO,QAAQ,aAAa,EAAE,IAAI,CAAC,CAAC,IAAI,MAAM,IAAI;AACxE,QAAM,WAAW,QAAQ;AAAA,IACvB,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG,OAAO;AAAA,MACR,OAAO,QAAQ,aAAa,EAAE,IAAI,CAAC,CAAC,MAAM,MAAM,MAAM;AAAA,QACpD,UAAU,IAAI;AAAA,QACd;AAAA,UACE;AAAA,UACA,GAAG,QAAQ,eAAe,CAAC,IAAI,CAAC,EAAE;AAAA,YAChC,CAAC,OAAO,iBAAiB,EAAE,cAAc,EAAE;AAAA,UAC7C;AAAA,UACA,eAAe,IAAI,MAAM,MAAM;AAAA,QACjC,EAAE,KAAK,IAAI;AAAA,MACb,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,QAAM,UAAU;AAAA,IACd,iBAAiB,QAAQ,SAAS,cAAc;AAAA,IAChD,iBAAiB,KAAK,QAAQ,SAAS,GAAG,SAAS,cAAc;AAAA,IACjE;AAAA,MACE,KAAK,QAAQ,QAAQ;AAAA,MACrB,SAAS;AAAA,MACT,CAAC,IAAI;AAAA,MACL,CAAC,WAAW,OAAO,YAAY,KAAK,OAAO,SAAS;AAAA,IACtD;AAAA,IACA,iBAAiB,KAAK,QAAQ,MAAM,GAAG,SAAS,cAAc;AAAA,EAChE;AACA,MAAI,cAAc,QAAQ;AACxB,YAAQ;AAAA,MACN,iBAAiB,KAAK,QAAQ,QAAQ,GAAG,SAAS,cAAc;AAAA,IAClE;AAAA,EACF;AACA,QAAM,CAAC,OAAO,aAAa,aAAa,WAAW,WAAW,IAC5D,MAAM,QAAQ,IAAI,OAAO;AAC3B,QAAM,WAAW,QAAQ;AAAA,IACvB,YAAY;AAAA,IACZ,oBAAoB;AAAA,IACpB,mBAAmB,eAAe;AAAA,IAClC,iBAAiB;AAAA,IACjB,GAAI,cAAc,SAAS,EAAE,mBAAmB,YAAY,IAAI,CAAC;AAAA,EACnE,CAAC;AACD,MAAI,SAAS,SAAS,QAAQ;AAC5B,UAAM,WAAW,SAAS,QAAQ;AAAA,MAChC,gBAAgB;AAAA,QACd,gBAAgB;AAAA,QAChB,SAAS,KAAK;AAAA,UACZ;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAM;AAAA,YACN,cAAc;AAAA,cACZ,2BAA2B;AAAA,cAC3B,KAAK;AAAA,YACP;AAAA,UACF;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA,iBAAiB;AAAA,QACf,gBAAgB;AAAA,QAChB,SAAS,KAAK;AAAA,UACZ;AAAA,YACE,iBAAiB;AAAA,cACf,cAAc;AAAA,cACd,qBAAqB;AAAA,cACrB,QAAQ;AAAA,cACR,QAAQ;AAAA,cACR,QAAQ;AAAA,cACR,QAAQ;AAAA,cACR,4BAA4B;AAAA,cAC5B,sBAAsB;AAAA,cACtB,SAAS;AAAA,cACT,kBAAkB;AAAA,YACpB;AAAA,YACA,SAAS,CAAC,SAAS;AAAA,UACrB;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,SAAS,aAAa;AAAA,IAC1B;AAAA,IACA,KAAK,cAAc;AAAA,EACrB,CAAC;AACH;;;AapMA,SAAS,SAAS,iBAAiB;AACnC,SAAS,cAAc,YAAY;AAE5B,SAAS,MAAM,MAAc;AAClC,SAAO;AAAA,IACL,UAAU,MAAM;AAAA,MACd,YAAY;AAAA,MACZ,WAAW;AAAA,IACb,CAAC;AAAA,EACH,EAAE,KAAK,aAAa,GAAG,CAAC;AAC1B;",
|
|
6
6
|
"names": ["get", "camelcase", "spinalcase", "removeDuplicates", "toLitObject", "toLitObject", "schema", "name", "security", "removeDuplicates", "it", "exclude", "appendOptional", "spinalcase", "camelcase", "methods", "security", "get", "security"]
|
|
7
7
|
}
|
package/dist/lib/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;+BAEf,IAAI;AAA1B,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;+BAEf,IAAI;AAA1B,wBAwFE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/lib/emitters/interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,YAAY,EACb,MAAM,mBAAmB,CAAC;AAI3B,KAAK,aAAa,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,KAAK,IAAI,CAAC;AAErE;;;GAGG;AACH,qBAAa,qBAAqB;;IAChC,kBAAkB,cAAqB;gBAI3B,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa;IA0FrD;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,UAAQ,GAAG,MAAM;IAwBtD;;OAEG;IACH,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,UAAQ,GAAG,MAAM;IAkBrD;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,UAAQ,GAAG,MAAM;IAqBpE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM;IAc5C,KAAK,CAAC,OAAO,EAAE,CAAC,YAAY,GAAG,eAAe,CAAC,EAAE,GAAG,MAAM;IAM1D,KAAK,CACH,OAAO,EAAE,CAAC,YAAY,GAAG,eAAe,CAAC,EAAE,EAC3C,QAAQ,EAAE,OAAO,GAChB,MAAM;IAST,KAAK,CACH,OAAO,EAAE,CAAC,YAAY,GAAG,eAAe,CAAC,EAAE,EAC3C,QAAQ,EAAE,OAAO,GAChB,MAAM;IAgBT,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM;IAQ9C;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM;IAuBxD;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM;IAKxD,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,eAAe,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM;
|
|
1
|
+
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/lib/emitters/interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,YAAY,EACb,MAAM,mBAAmB,CAAC;AAI3B,KAAK,aAAa,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,KAAK,IAAI,CAAC;AAErE;;;GAGG;AACH,qBAAa,qBAAqB;;IAChC,kBAAkB,cAAqB;gBAI3B,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa;IA0FrD;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,UAAQ,GAAG,MAAM;IAwBtD;;OAEG;IACH,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,UAAQ,GAAG,MAAM;IAkBrD;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,UAAQ,GAAG,MAAM;IAqBpE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM;IAc5C,KAAK,CAAC,OAAO,EAAE,CAAC,YAAY,GAAG,eAAe,CAAC,EAAE,GAAG,MAAM;IAM1D,KAAK,CACH,OAAO,EAAE,CAAC,YAAY,GAAG,eAAe,CAAC,EAAE,EAC3C,QAAQ,EAAE,OAAO,GAChB,MAAM;IAST,KAAK,CACH,OAAO,EAAE,CAAC,YAAY,GAAG,eAAe,CAAC,EAAE,EAC3C,QAAQ,EAAE,OAAO,GAChB,MAAM;IAgBT,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM;IAQ9C;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM;IAuBxD;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM;IAKxD,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,eAAe,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM;IA2DzE;;OAEG;IACH,iBAAiB,CACf,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,YAAY,GAAG,eAAe,GACrC,MAAM;CAIV"}
|
|
@@ -21,7 +21,7 @@ export declare class ZodDeserialzer {
|
|
|
21
21
|
* Convert a basic type (string | number | boolean | object | array, etc.) to Zod.
|
|
22
22
|
* We'll also handle .optional() if needed.
|
|
23
23
|
*/
|
|
24
|
-
normal(type: string, schema: SchemaObject, required?: boolean): string;
|
|
24
|
+
normal(type: string, schema: SchemaObject, required?: boolean, nullable?: boolean): string;
|
|
25
25
|
ref($ref: string, required: boolean): string;
|
|
26
26
|
allOf(schemas: (SchemaObject | ReferenceObject)[]): string;
|
|
27
27
|
anyOf(schemas: (SchemaObject | ReferenceObject)[], required: boolean): string;
|
|
@@ -30,13 +30,16 @@ export declare class ZodDeserialzer {
|
|
|
30
30
|
/**
|
|
31
31
|
* Handle a `string` schema with possible format keywords (JSON Schema).
|
|
32
32
|
*/
|
|
33
|
-
string(schema: SchemaObject
|
|
33
|
+
string(schema: SchemaObject): string;
|
|
34
34
|
/**
|
|
35
35
|
* Handle number/integer constraints from OpenAPI/JSON Schema.
|
|
36
36
|
* In 3.1, exclusiveMinimum/Maximum hold the actual numeric threshold,
|
|
37
37
|
* rather than a boolean toggling `minimum`/`maximum`.
|
|
38
38
|
*/
|
|
39
|
-
number(schema: SchemaObject
|
|
39
|
+
number(schema: SchemaObject): {
|
|
40
|
+
base: string;
|
|
41
|
+
defaultValue: any;
|
|
42
|
+
};
|
|
40
43
|
handle(schema: SchemaObject | ReferenceObject, required: boolean): string;
|
|
41
44
|
}
|
|
42
45
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zod.d.ts","sourceRoot":"","sources":["../../../src/lib/emitters/zod.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,YAAY,EACb,MAAM,mBAAmB,CAAC;AAI3B,KAAK,aAAa,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;AAExD;;;GAGG;AACH,qBAAa,cAAc;;IACzB,kBAAkB,cAAqB;gBAI3B,IAAI,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,aAAa;IAItD;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,UAAQ,GAAG,MAAM;IA2BtD;;;OAGG;IACH,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,UAAQ,GAAG,MAAM;
|
|
1
|
+
{"version":3,"file":"zod.d.ts","sourceRoot":"","sources":["../../../src/lib/emitters/zod.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,YAAY,EACb,MAAM,mBAAmB,CAAC;AAI3B,KAAK,aAAa,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;AAExD;;;GAGG;AACH,qBAAa,cAAc;;IACzB,kBAAkB,cAAqB;gBAI3B,IAAI,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,aAAa;IAItD;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,UAAQ,GAAG,MAAM;IA2BtD;;;OAGG;IACH,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,UAAQ,GAAG,MAAM;IAmCrD;;;OAGG;IACH,MAAM,CACJ,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,YAAY,EACpB,QAAQ,UAAQ,EAChB,QAAQ,UAAQ,GACf,MAAM;IAwBT,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO;IAgBnC,KAAK,CAAC,OAAO,EAAE,CAAC,YAAY,GAAG,eAAe,CAAC,EAAE;IAmBjD,KAAK,CAAC,OAAO,EAAE,CAAC,YAAY,GAAG,eAAe,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO;IAWpE,KAAK,CAAC,OAAO,EAAE,CAAC,YAAY,GAAG,eAAe,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO;IAmBpE,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,OAAO;IAKrC;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM;IAwDpC;;;;OAIG;IACH,MAAM,CAAC,MAAM,EAAE,YAAY;;;;IAmD3B,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,eAAe,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM;CA2D1E"}
|
package/dist/lib/generate.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { npmRunPathEnv } from 'npm-run-path';
|
|
|
2
2
|
import type { OpenAPIObject } from 'openapi3-ts/oas31';
|
|
3
3
|
export declare function generate(spec: OpenAPIObject, settings: {
|
|
4
4
|
output: string;
|
|
5
|
+
useTsExtension?: boolean;
|
|
5
6
|
name?: string;
|
|
6
7
|
/**
|
|
7
8
|
* full: generate a full project including package.json and tsconfig.json. useful for monorepo/workspaces
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/lib/generate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAqCvD,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,aAAa,EACnB,QAAQ,EAAE;IACR,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;KACvC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B,
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/lib/generate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAqCvD,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,aAAa,EACnB,QAAQ,EAAE;IACR,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;KACvC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B,iBA8IF"}
|
package/dist/lib/generator.d.ts
CHANGED
|
@@ -21,6 +21,7 @@ export interface GenerateSdkConfig {
|
|
|
21
21
|
*/
|
|
22
22
|
style?: 'github';
|
|
23
23
|
operationId?: (operation: OperationObject, path: string, method: string) => string;
|
|
24
|
+
makeImport: (module: string) => string;
|
|
24
25
|
}
|
|
25
26
|
export declare const defaults: Partial<GenerateSdkConfig> & Required<Pick<GenerateSdkConfig, 'operationId'>>;
|
|
26
27
|
export declare function generateCode(config: GenerateSdkConfig): {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/lib/generator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,aAAa,EACb,eAAe,EAMhB,MAAM,mBAAmB,CAAC;AAK3B,OAAO,EACL,KAAK,SAAS,EAIf,MAAM,UAAU,CAAC;AAGlB,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;CACrB;AACD,MAAM,WAAW,MAAM;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAsBD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB;;;OAGG;IACH,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,WAAW,CAAC,EAAE,CACZ,SAAS,EAAE,eAAe,EAC1B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,KACX,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/lib/generator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,aAAa,EACb,eAAe,EAMhB,MAAM,mBAAmB,CAAC;AAK3B,OAAO,EACL,KAAK,SAAS,EAIf,MAAM,UAAU,CAAC;AAGlB,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;CACrB;AACD,MAAM,WAAW,MAAM;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAsBD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB;;;OAGG;IACH,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,WAAW,CAAC,EAAE,CACZ,SAAS,EAAE,eAAe,EAC1B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,KACX,MAAM,CAAC;IACZ,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;CACxC;AAED,eAAO,MAAM,QAAQ,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAC/C,QAAQ,CAAC,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAShD,CAAC;AAEF,wBAAgB,YAAY,CAAC,MAAM,EAAE,iBAAiB;;;;;EA2NrD"}
|
package/dist/lib/sdk.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { MakeImportFn } from './utils.ts';
|
|
1
2
|
export type Parser = 'chunked' | 'buffered';
|
|
2
3
|
export interface SdkConfig {
|
|
3
4
|
/**
|
|
@@ -20,6 +21,7 @@ export interface Spec {
|
|
|
20
21
|
name: string;
|
|
21
22
|
options: Options;
|
|
22
23
|
servers: string[];
|
|
24
|
+
makeImport: MakeImportFn;
|
|
23
25
|
}
|
|
24
26
|
export interface OperationInput {
|
|
25
27
|
in: string;
|
|
@@ -39,7 +41,7 @@ export interface Operation {
|
|
|
39
41
|
use: string;
|
|
40
42
|
};
|
|
41
43
|
}
|
|
42
|
-
export declare function generateInputs(operationsSet: Spec['operations'], commonZod: Map<string, string
|
|
44
|
+
export declare function generateInputs(operationsSet: Spec['operations'], commonZod: Map<string, string>, makeImport: MakeImportFn): any;
|
|
43
45
|
export declare function generateSDK(spec: Spec): {
|
|
44
46
|
'client.ts': string;
|
|
45
47
|
'schemas.ts': string;
|
package/dist/lib/sdk.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../src/lib/sdk.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../src/lib/sdk.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,MAAM,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;AAmD5C,MAAM,WAAW,SAAS;IACxB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,OAAO,GAAG,MAAM,CAC1B,MAAM,EACN;IACE,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CACF,CAAC;AACF,MAAM,WAAW,IAAI;IACnB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,YAAY,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;CAChB;AACD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACvC,YAAY,EAAE,MAAM;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CACrD;AAED,wBAAgB,cAAc,CAC5B,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,EACjC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,UAAU,EAAE,YAAY,OAyDzB;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI;;;;EAqFrC"}
|
package/dist/lib/utils.d.ts
CHANGED
|
@@ -24,4 +24,5 @@ export interface NamedImport {
|
|
|
24
24
|
export declare function importsToString(...imports: Import[]): string[];
|
|
25
25
|
export declare function exclude<T>(list: T[], exclude: T[]): T[];
|
|
26
26
|
export declare function useImports(content: string, imports: Import[]): string[];
|
|
27
|
+
export type MakeImportFn = (moduleSpecifier: string) => string;
|
|
27
28
|
//# sourceMappingURL=utils.d.ts.map
|
package/dist/lib/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,YAAY,EACZ,yBAAyB,EAC1B,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,UAAU,CAAC;AAExC,wBAAgB,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,eAAe,CAEtD;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,UAEnC;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM;;;EAInC;AACD,wBAAgB,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,CAOxE;AACD,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,yBAAyB,EAAE,EACrC,eAAe,EAAE,gBAAgB,CAAC,iBAAiB,CAAC,EACpD,QAAQ,CAAC,EAAE,MAAM,WAkClB;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,YAgB7C;AACD,MAAM,WAAW,MAAM;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AACD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,eAAe,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,YAenD;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAEvD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAe5D"}
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,YAAY,EACZ,yBAAyB,EAC1B,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,UAAU,CAAC;AAExC,wBAAgB,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,eAAe,CAEtD;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,UAEnC;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM;;;EAInC;AACD,wBAAgB,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,CAOxE;AACD,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,yBAAyB,EAAE,EACrC,eAAe,EAAE,gBAAgB,CAAC,iBAAiB,CAAC,EACpD,QAAQ,CAAC,EAAE,MAAM,WAkClB;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,YAgB7C;AACD,MAAM,WAAW,MAAM;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AACD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,eAAe,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,YAenD;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAEvD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAe5D;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,eAAe,EAAE,MAAM,KAAK,MAAM,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sdk-it/typescript",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"!**/*.tsbuildinfo"
|
|
22
22
|
],
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@sdk-it/core": "0.
|
|
24
|
+
"@sdk-it/core": "0.14.0",
|
|
25
25
|
"openapi3-ts": "^4.4.0",
|
|
26
26
|
"stringcase": "^4.3.1",
|
|
27
27
|
"lodash-es": "^4.17.21",
|