@sdk-it/typescript 0.12.11 → 0.13.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 CHANGED
@@ -39,14 +39,14 @@ var client_default = (spec) => {
39
39
  }
40
40
  };
41
41
  return `
42
- import { fetchType, sendRequest } from './http/send-request.ts';
42
+ import { fetchType, sendRequest } from './http/${spec.makeImport("send-request")}';
43
43
  import z from 'zod';
44
- import type { Endpoints } from './endpoints.ts';
45
- import schemas from './schemas.ts';
44
+ import type { Endpoints } from './${spec.makeImport("endpoints")}';
45
+ import schemas from './${spec.makeImport("schemas")}';
46
46
  import {
47
47
  createBaseUrlInterceptor,
48
48
  createDefaultHeadersInterceptor,
49
- } from './http/interceptors.ts';
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)});
@@ -96,13 +96,18 @@ export class ${spec.name} {
96
96
 
97
97
  // packages/typescript/src/lib/sdk.ts
98
98
  var SchemaEndpoint = class {
99
- #imports = [
100
- `import z from 'zod';`,
101
- 'import type { Endpoints } from "./endpoints.ts";',
102
- `import { toRequest, json, urlencoded, nobody, formdata, createUrl } from './http/request.ts';`,
103
- `import type { ParseError } from './http/parser.ts';`,
104
- 'import { chunked, buffered } from "./http/parse-response.ts";'
105
- ];
99
+ #makeImport;
100
+ #imports = [];
101
+ constructor(makeImport) {
102
+ this.#makeImport = makeImport;
103
+ this.#imports = [
104
+ `import z from 'zod';`,
105
+ `import type { Endpoints } from '${this.#makeImport("./endpoints")}';`,
106
+ `import { toRequest, json, urlencoded, nobody, formdata, createUrl } from '${this.#makeImport("./http/request")}';`,
107
+ `import type { ParseError } from '${this.#makeImport("./http/parser")}';`,
108
+ `import { chunked, buffered } from "${this.#makeImport("./http/parse-response")}";`
109
+ ];
110
+ }
106
111
  #endpoints = [];
107
112
  addEndpoint(endpoint, operation) {
108
113
  this.#endpoints.push(` "${endpoint}": ${operation},`);
@@ -118,10 +123,15 @@ ${this.#endpoints.join("\n")}
118
123
  }
119
124
  };
120
125
  var Emitter = class {
121
- imports = [
122
- `import type z from 'zod';`,
123
- `import type { ParseError } from './http/parser.ts';`
124
- ];
126
+ #makeImport;
127
+ imports = [];
128
+ constructor(makeImport) {
129
+ this.#makeImport = makeImport;
130
+ this.imports = [
131
+ `import type z from 'zod';`,
132
+ `import type { ParseError } from '${this.#makeImport("./http/parser")}';`
133
+ ];
134
+ }
125
135
  endpoints = [];
126
136
  addEndpoint(endpoint, operation) {
127
137
  this.endpoints.push(` "${endpoint}": ${operation};`);
@@ -136,7 +146,7 @@ ${this.endpoints.join("\n")}
136
146
  }`;
137
147
  }
138
148
  };
139
- function generateInputs(operationsSet, commonZod) {
149
+ function generateInputs(operationsSet, commonZod, makeImport) {
140
150
  const commonImports = commonZod.keys().toArray();
141
151
  const inputs = {};
142
152
  for (const [name, operations] of Object.entries(operationsSet)) {
@@ -149,7 +159,7 @@ function generateInputs(operationsSet, commonZod) {
149
159
  for (const schema2 of commonImports) {
150
160
  if (inputContent.includes(schema2)) {
151
161
  imports.add(
152
- `import { ${schema2} } from './schemas/${spinalcase(schema2)}.ts';`
162
+ `import { ${schema2} } from './schemas/${makeImport(spinalcase(schema2))}';`
153
163
  );
154
164
  }
155
165
  }
@@ -164,7 +174,7 @@ function generateInputs(operationsSet, commonZod) {
164
174
  const preciseMatch = new RegExp(`\\b${schema2}\\b`);
165
175
  if (preciseMatch.test(content) && schema2 !== name) {
166
176
  output.push(
167
- `import { ${schema2} } from './${spinalcase(schema2)}.ts';`
177
+ `import { ${schema2} } from './${makeImport(spinalcase(schema2))}';`
168
178
  );
169
179
  }
170
180
  }
@@ -180,15 +190,15 @@ function generateInputs(operationsSet, commonZod) {
180
190
  };
181
191
  }
182
192
  function generateSDK(spec) {
183
- const emitter = new Emitter();
184
- const schemaEndpoint = new SchemaEndpoint();
193
+ const emitter = new Emitter(spec.makeImport);
194
+ const schemaEndpoint = new SchemaEndpoint(spec.makeImport);
185
195
  const errors = [];
186
196
  for (const [name, operations] of Object.entries(spec.operations)) {
187
197
  emitter.addImport(
188
- `import type * as ${camelcase(name)} from './inputs/${spinalcase(name)}.ts';`
198
+ `import type * as ${camelcase(name)} from './inputs/${spec.makeImport(spinalcase(name))}';`
189
199
  );
190
200
  schemaEndpoint.addImport(
191
- `import * as ${camelcase(name)} from './inputs/${spinalcase(name)}.ts';`
201
+ `import * as ${camelcase(name)} from './inputs/${spec.makeImport(spinalcase(name))}';`
192
202
  );
193
203
  for (const operation of operations) {
194
204
  const schemaName = camelcase(`${operation.name} schema`);
@@ -218,7 +228,7 @@ function generateSDK(spec) {
218
228
  }
219
229
  }
220
230
  emitter.addImport(
221
- `import type {${output.import}} from './outputs/${spinalcase(operation.name)}.ts';`
231
+ `import type {${output.import}} from './outputs/${spec.makeImport(spinalcase(operation.name))}';`
222
232
  );
223
233
  errors.push(...operation.errors ?? []);
224
234
  const addTypeParser = Object.keys(operation.schemas).length > 1;
@@ -253,7 +263,7 @@ function generateSDK(spec) {
253
263
  }
254
264
  }
255
265
  emitter.addImport(
256
- `import type { ${removeDuplicates(errors, (it) => it).join(", ")} } from './http/response.ts';`
266
+ `import type { ${removeDuplicates(errors, (it) => it).join(", ")} } from '${spec.makeImport("./http/response")}';`
257
267
  );
258
268
  return {
259
269
  "client.ts": client_default(spec),
@@ -582,6 +592,9 @@ var TypeScriptDeserialzer = class {
582
592
  }
583
593
  const types = Array.isArray(schema.type) ? schema.type : schema.type ? [schema.type] : [];
584
594
  if (!types.length) {
595
+ if ("properties" in schema) {
596
+ return this.object(schema, required);
597
+ }
585
598
  return appendOptional("any", required);
586
599
  }
587
600
  if (types.length > 1) {
@@ -657,19 +670,24 @@ var ZodDeserialzer = class {
657
670
  }
658
671
  // oneOf() {}
659
672
  // enum() {}
673
+ #suffixes = (defaultValue, required, nullable) => {
674
+ return `${nullable ? ".nullable()" : ""}${appendDefault(defaultValue)}${appendOptional2(required)}`;
675
+ };
660
676
  /**
661
677
  * Convert a basic type (string | number | boolean | object | array, etc.) to Zod.
662
678
  * We'll also handle .optional() if needed.
663
679
  */
664
- normal(type, schema, required = false) {
680
+ normal(type, schema, required = false, nullable = false) {
665
681
  switch (type) {
666
682
  case "string":
667
- return this.string(schema, required);
683
+ return `${this.string(schema)}${this.#suffixes(schema.default, required, nullable)}`;
668
684
  case "number":
669
- case "integer":
670
- return this.number(schema, required);
685
+ case "integer": {
686
+ const { base, defaultValue } = this.number(schema);
687
+ return `${base}${this.#suffixes(defaultValue, required, nullable)}`;
688
+ }
671
689
  case "boolean":
672
- return `z.boolean()${appendDefault(schema.default)}${appendOptional2(required)}`;
690
+ return `z.boolean()${this.#suffixes(schema.default, required, nullable)}`;
673
691
  case "object":
674
692
  return this.object(schema, required);
675
693
  case "array":
@@ -745,7 +763,7 @@ var ZodDeserialzer = class {
745
763
  /**
746
764
  * Handle a `string` schema with possible format keywords (JSON Schema).
747
765
  */
748
- string(schema, required) {
766
+ string(schema) {
749
767
  let base = "z.string()";
750
768
  switch (schema.format) {
751
769
  case "date-time":
@@ -787,20 +805,20 @@ var ZodDeserialzer = class {
787
805
  default:
788
806
  break;
789
807
  }
790
- return `${base}${appendDefault(schema.default)}${appendOptional2(required)}`;
808
+ return base;
791
809
  }
792
810
  /**
793
811
  * Handle number/integer constraints from OpenAPI/JSON Schema.
794
812
  * In 3.1, exclusiveMinimum/Maximum hold the actual numeric threshold,
795
813
  * rather than a boolean toggling `minimum`/`maximum`.
796
814
  */
797
- number(schema, required) {
798
- let defaultValue = schema.default !== void 0 ? `.default(${schema.default})` : ``;
815
+ number(schema) {
816
+ let defaultValue = schema.default;
799
817
  let base = "z.number()";
800
818
  if (schema.format === "int64") {
801
819
  base = "z.bigint()";
802
820
  if (schema.default !== void 0) {
803
- defaultValue = `.default(BigInt(${schema.default}))`;
821
+ defaultValue = `BigInt(${schema.default})`;
804
822
  }
805
823
  }
806
824
  if (schema.format === "int32") {
@@ -821,7 +839,7 @@ var ZodDeserialzer = class {
821
839
  if (typeof schema.multipleOf === "number") {
822
840
  base += `.refine((val) => Number.isInteger(val / ${schema.multipleOf}), "Must be a multiple of ${schema.multipleOf}")`;
823
841
  }
824
- return `${base}${defaultValue}${appendOptional2(required)}`;
842
+ return { base, defaultValue };
825
843
  }
826
844
  handle(schema, required) {
827
845
  if (isRef(schema)) {
@@ -843,16 +861,18 @@ var ZodDeserialzer = class {
843
861
  if (!types.length) {
844
862
  return `z.unknown()${appendOptional2(required)}`;
845
863
  }
864
+ if ("nullable" in schema && schema.nullable) {
865
+ types.push("null");
866
+ }
846
867
  if (types.length > 1) {
847
868
  const realTypes = types.filter((t) => t !== "null");
848
869
  if (realTypes.length === 1 && types.includes("null")) {
849
- const typeZod = this.normal(realTypes[0], schema, false);
850
- return `${typeZod}.nullable()${appendOptional2(required)}`;
870
+ return this.normal(realTypes[0], schema, false, true);
851
871
  }
852
872
  const subSchemas = types.map((t) => this.normal(t, schema, false));
853
873
  return `z.union([${subSchemas.join(", ")}])${appendOptional2(required)}`;
854
874
  }
855
- return this.normal(types[0], schema, required);
875
+ return this.normal(types[0], schema, required, false);
856
876
  }
857
877
  };
858
878
  function appendOptional2(isRequired) {
@@ -901,7 +921,7 @@ function generateCode(config) {
901
921
  commonZodImports.push({
902
922
  defaultImport: void 0,
903
923
  isTypeOnly: true,
904
- moduleSpecifier: `./${model}.ts`,
924
+ moduleSpecifier: `./${config.makeImport(model)}`,
905
925
  namedImports: [{ isTypeOnly: true, name: model }],
906
926
  namespaceImport: void 0
907
927
  });
@@ -1008,7 +1028,12 @@ function generateCode(config) {
1008
1028
  const output = [`import z from 'zod';`];
1009
1029
  let parser = "buffered";
1010
1030
  for (const status in operation.responses) {
1011
- const response = operation.responses[status];
1031
+ const response = isRef(
1032
+ operation.responses[status]
1033
+ ) ? followRef(
1034
+ config.spec,
1035
+ operation.responses[status].$ref
1036
+ ) : operation.responses[status];
1012
1037
  const statusCode = +status;
1013
1038
  if (statusCode >= 400) {
1014
1039
  errors.push(responses[status] ?? "ProblematicResponse");
@@ -1028,7 +1053,7 @@ function generateCode(config) {
1028
1053
  imports.push({
1029
1054
  defaultImport: void 0,
1030
1055
  isTypeOnly: true,
1031
- moduleSpecifier: `../models/${schemaName}.ts`,
1056
+ moduleSpecifier: `../models/${config.makeImport(schemaName)}`,
1032
1057
  namedImports: [{ isTypeOnly: true, name: schemaName }],
1033
1058
  namespaceImport: void 0
1034
1059
  });
@@ -1103,7 +1128,7 @@ function bodyInputs(config, ctSchema) {
1103
1128
  }
1104
1129
 
1105
1130
  // 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 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]('\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 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";
1131
+ var interceptors_default = "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]('\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
1132
 
1108
1133
  // packages/typescript/src/lib/http/parse-response.txt
1109
1134
  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 +1143,7 @@ var request_default = "export type Method = 'GET' | 'POST' | 'PUT' | 'PATCH' | '
1118
1143
  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
1144
 
1120
1145
  // packages/typescript/src/lib/http/send-request.txt
1121
- var send_request_default = "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";
1146
+ 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 },\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";
1122
1147
 
1123
1148
  // packages/typescript/src/lib/generate.ts
1124
1149
  function security(spec) {
@@ -1142,10 +1167,15 @@ function security(spec) {
1142
1167
  return options;
1143
1168
  }
1144
1169
  async function generate(spec, settings) {
1170
+ settings.useTsExtension ??= true;
1171
+ const makeImport = (moduleSpecifier) => {
1172
+ return settings.useTsExtension ? `${moduleSpecifier}.ts` : moduleSpecifier;
1173
+ };
1145
1174
  const { commonSchemas, groups, outputs, commonZod } = generateCode({
1146
1175
  spec,
1147
1176
  style: "github",
1148
- target: "javascript"
1177
+ target: "javascript",
1178
+ makeImport
1149
1179
  });
1150
1180
  const output = settings.mode === "full" ? join(settings.output, "src") : settings.output;
1151
1181
  const options = security(spec);
@@ -1153,9 +1183,10 @@ async function generate(spec, settings) {
1153
1183
  name: settings.name || "Client",
1154
1184
  operations: groups,
1155
1185
  servers: spec.servers?.map((server) => server.url) || [],
1156
- options
1186
+ options,
1187
+ makeImport
1157
1188
  });
1158
- const inputFiles = generateInputs(groups, commonZod);
1189
+ const inputFiles = generateInputs(groups, commonZod, makeImport);
1159
1190
  await writeFiles(output, {
1160
1191
  "outputs/.gitkeep": "",
1161
1192
  "inputs/.gitkeep": "",
@@ -1165,7 +1196,11 @@ async function generate(spec, settings) {
1165
1196
  await writeFiles(join(output, "http"), {
1166
1197
  "interceptors.ts": interceptors_default,
1167
1198
  "parse-response.ts": parse_response_default,
1168
- "send-request.ts": send_request_default,
1199
+ "send-request.ts": `import z from 'zod';
1200
+ import type { Interceptor } from './${makeImport("interceptors")}';
1201
+ import { handleError } from './${makeImport("parse-response")}';
1202
+ import { parse } from './${makeImport("parser")}';
1203
+ ${send_request_default}`,
1169
1204
  "response.ts": response_default,
1170
1205
  "parser.ts": parser_default,
1171
1206
  "request.ts": request_default
@@ -1189,17 +1224,20 @@ async function generate(spec, settings) {
1189
1224
  )
1190
1225
  });
1191
1226
  const folders = [
1192
- getFolderExports(output),
1193
- getFolderExports(join(output, "outputs")),
1227
+ getFolderExports(output, settings.useTsExtension),
1228
+ getFolderExports(join(output, "outputs"), settings.useTsExtension),
1194
1229
  getFolderExports(
1195
1230
  join(output, "inputs"),
1231
+ settings.useTsExtension,
1196
1232
  ["ts"],
1197
1233
  (dirent) => dirent.isDirectory() && dirent.name === "schemas"
1198
1234
  ),
1199
- getFolderExports(join(output, "http"))
1235
+ getFolderExports(join(output, "http"), settings.useTsExtension)
1200
1236
  ];
1201
1237
  if (modelsImports.length) {
1202
- folders.push(getFolderExports(join(output, "models")));
1238
+ folders.push(
1239
+ getFolderExports(join(output, "models"), settings.useTsExtension)
1240
+ );
1203
1241
  }
1204
1242
  const [index, outputIndex, inputsIndex, httpIndex, modelsIndex] = await Promise.all(folders);
1205
1243
  await writeFiles(output, {
@@ -1237,6 +1275,7 @@ async function generate(spec, settings) {
1237
1275
  target: "ESNext",
1238
1276
  module: "ESNext",
1239
1277
  noEmit: true,
1278
+ strict: true,
1240
1279
  allowImportingTsExtensions: true,
1241
1280
  verbatimModuleSyntax: true,
1242
1281
  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": ";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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUP,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,aAmBrB,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;;;ADnFA,IAAM,iBAAN,MAAqB;AAAA,EACnB,WAAqB;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,aAAuB,CAAC;AAAA,EACxB,YAAY,UAAkB,WAAgB;AAC5C,SAAK,WAAW,KAAK,MAAM,QAAQ,MAAM,SAAS,GAAG;AAAA,EACvD;AAAA,EACA,UAAU,OAAe;AACvB,SAAK,SAAS,KAAK,KAAK;AAAA,EAC1B;AAAA,EACA,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,EACF,UAAoB;AAAA,IAC5B;AAAA,IACA;AAAA,EACF;AAAA,EACU,YAAsB,CAAC;AAAA,EACjC,YAAY,UAAkB,WAAgB;AAC5C,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;AAkDO,SAAS,eACd,eACA,WACA;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,WAAWA,OAAM,CAAC;AAAA,UAC5D;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,WAAWA,OAAM,CAAC;AAAA,QACpD;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;AAC5B,QAAM,iBAAiB,IAAI,eAAe;AAC1C,QAAM,SAAmB,CAAC;AAC1B,aAAW,CAAC,MAAM,UAAU,KAAK,OAAO,QAAQ,KAAK,UAAU,GAAG;AAChE,YAAQ;AAAA,MACN,oBAAoB,UAAU,IAAI,CAAC,mBAAmB,WAAW,IAAI,CAAC;AAAA,IACxE;AACA,mBAAe;AAAA,MACb,eAAe,UAAU,IAAI,CAAC,mBAAmB,WAAW,IAAI,CAAC;AAAA,IACnE;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,WAAW,UAAU,IAAI,CAAC;AAAA,MAC9E;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;AAAA,EAClE;AACA,SAAO;AAAA,IACL,aAAa,eAAQ,IAAI;AAAA,IACzB,cAAc,eAAe,SAAS;AAAA,IACtC,gBAAgB,QAAQ,SAAS;AAAA,EACnC;AACF;;;ADhOO,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;AACjB,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;;;AC5UO,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;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,MAAc,QAAsB,WAAW,OAAO;AAC3D,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,cAAc,cAAc,OAAO,OAAO,CAAC,GAAGA,gBAAe,QAAQ,CAAC;AAAA,MAC/E,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,QAAsB,UAA4B;AACvD,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,GAAG,IAAI,GAAG,cAAc,OAAO,OAAO,CAAC,GAAGA,gBAAe,QAAQ,CAAC;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,QAAsB,UAA4B;AACvD,QAAI,eACF,OAAO,YAAY,SAAY,YAAY,OAAO,OAAO,MAAM;AACjE,QAAI,OAAO;AACX,QAAI,OAAO,WAAW,SAAS;AAC7B,aAAO;AACP,UAAI,OAAO,YAAY,QAAW;AAChC,uBAAe,mBAAmB,OAAO,OAAO;AAAA,MAClD;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,GAAG,IAAI,GAAG,YAAY,GAAGA,gBAAe,QAAQ,CAAC;AAAA,EAC1D;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;AAIA,QAAI,MAAM,SAAS,GAAG;AAEpB,YAAM,YAAY,MAAM,OAAO,CAAC,MAAM,MAAM,MAAM;AAClD,UAAI,UAAU,WAAW,KAAK,MAAM,SAAS,MAAM,GAAG;AAEpD,cAAM,UAAU,KAAK,OAAO,UAAU,CAAC,GAAG,QAAQ,KAAK;AACvD,eAAO,GAAG,OAAO,cAAcA,gBAAe,QAAQ,CAAC;AAAA,MACzD;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,QAAQ;AAAA,EAC/C;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;;;AL1UA,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;AAiBO,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,KAAK;AAAA,MAC3B,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,UAAU,UAAU,MAAM;AAC3C,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,UAAU;AAAA,gBACxC,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;;;AM5VA;;;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,UAaA;AACA,QAAM,EAAE,eAAe,QAAQ,SAAS,UAAU,IAAI,aAAa;AAAA,IACjE;AAAA,IACA,OAAO;AAAA,IACP,QAAQ;AAAA,EACV,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,EACF,CAAC;AAMD,QAAM,aAAa,eAAe,QAAQ,SAAS;AAEnD,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,IACnB,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,MAAM;AAAA,IACvB,iBAAiB,KAAK,QAAQ,SAAS,CAAC;AAAA,IACxC;AAAA,MACE,KAAK,QAAQ,QAAQ;AAAA,MACrB,CAAC,IAAI;AAAA,MACL,CAAC,WAAW,OAAO,YAAY,KAAK,OAAO,SAAS;AAAA,IACtD;AAAA,IACA,iBAAiB,KAAK,QAAQ,MAAM,CAAC;AAAA,EACvC;AACA,MAAI,cAAc,QAAQ;AACxB,YAAQ,KAAK,iBAAiB,KAAK,QAAQ,QAAQ,CAAC,CAAC;AAAA,EACvD;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,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;;;AarLA,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;",
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 createDefaultHeadersInterceptor,\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 ): 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 // 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 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 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 },\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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",
6
6
  "names": ["get", "camelcase", "spinalcase", "removeDuplicates", "toLitObject", "toLitObject", "schema", "name", "security", "removeDuplicates", "it", "exclude", "appendOptional", "spinalcase", "camelcase", "methods", "security", "get", "security"]
7
7
  }
@@ -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;IAuDzE;;OAEG;IACH,iBAAiB,CACf,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,YAAY,GAAG,eAAe,GACrC,MAAM;CAIV"}
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, required?: boolean): string;
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, required?: boolean): string;
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;IA+BrD;;;OAGG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,UAAQ;IAsB3D,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,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM;IAwDxD;;;;OAIG;IACH,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM;IAoDxD,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,eAAe,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM;CAsD1E"}
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"}
@@ -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,iBAgIF"}
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"}
@@ -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;CACb;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;;;;;EAoNrD"}
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>): any;
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;
@@ -1 +1 @@
1
- {"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../src/lib/sdk.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;AA0C5C,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;CACnB;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,OAyD/B;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI;;;;EAqFrC"}
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"}
@@ -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
@@ -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.12.11",
3
+ "version": "0.13.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.12.11",
24
+ "@sdk-it/core": "0.13.0",
25
25
  "openapi3-ts": "^4.4.0",
26
26
  "stringcase": "^4.3.1",
27
27
  "lodash-es": "^4.17.21",