@sebspark/openapi-typegen 5.0.15 → 5.0.17

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.mjs CHANGED
@@ -3,7 +3,6 @@ import { parse, resolve } from "node:path";
3
3
  import { constantCase, pascalCase } from "change-case";
4
4
  import * as YAML from "yaml";
5
5
  import { format } from "prettier";
6
-
7
6
  //#region src/generator/formatter.ts
8
7
  const options = {
9
8
  parser: "typescript",
@@ -12,7 +11,6 @@ const options = {
12
11
  trailingComma: "all"
13
12
  };
14
13
  const format$1 = async (code) => format(code, options);
15
-
16
14
  //#endregion
17
15
  //#region src/generator/document.ts
18
16
  const document = ({ title, description }) => {
@@ -54,7 +52,7 @@ const buildPath = (path, property) => rxProperVariable.test(property) ? `${path}
54
52
  const requestArgs = (args, name, title) => {
55
53
  if (!args) return [];
56
54
  const tokens = [];
57
- const type = (args.allOf || []).map((e) => e.type).join(AND) || "Object";
55
+ const type = (args.allOf || []).map((e) => e.type).join(" & ") || "Object";
58
56
  tokens.push(param(buildPath("args", name), type, args.optional, `${title} for the request.`));
59
57
  const properties = args.properties.flatMap((prop) => requestProperty(buildPath("args", name), prop));
60
58
  tokens.push(...properties);
@@ -62,7 +60,7 @@ const requestArgs = (args, name, title) => {
62
60
  };
63
61
  const requestProperty = (path, property) => {
64
62
  const tokens = [];
65
- const type = property.type.map((t) => t.type).join(OR);
63
+ const type = property.type.map((t) => t.type).join(" | ");
66
64
  tokens.push(param(buildPath(path, property.name), type, property.optional, property.title, property.description));
67
65
  return tokens;
68
66
  };
@@ -77,11 +75,6 @@ const param = (name, type, optional = false, title = "", description = "") => {
77
75
  }
78
76
  return tokens.join("");
79
77
  };
80
-
81
- //#endregion
82
- //#region src/generator/common.ts
83
- const OR = " | ";
84
- const AND = " & ";
85
78
  const generateType = (parsed) => {
86
79
  let type;
87
80
  switch (parsed.type) {
@@ -116,7 +109,7 @@ const generateType = (parsed) => {
116
109
  };
117
110
  const generateProperty = (property) => {
118
111
  const types = property.type.map(generateType);
119
- return `${document(property)}${propertyName(property.name)}${property.optional ? "?" : ""}: ${types.join(OR) || "unknown"}`;
112
+ return `${document(property)}${propertyName(property.name)}${property.optional ? "?" : ""}: ${types.join(" | ") || "unknown"}`;
120
113
  };
121
114
  const preamble = (type) => type.name ? `${document(type)}export type ${typeName(type.name)} = ` : "";
122
115
  const rxProperVariable = /^[a-zA-Z_<>$][a-zA-Z0-9_<>$]*$/;
@@ -148,7 +141,7 @@ const propertyName = (name) => {
148
141
  if (rxProperVariable.test(name.replace(/\./g, "_"))) return name.replace(/\./g, "_");
149
142
  return `'${name.replace(/\./g, "_")}'`;
150
143
  };
151
- const extensions = (type) => (type.allOf || []).map(generateType).concat("").join(AND) + (type.oneOf || []).map(generateType).concat("").join(OR);
144
+ const extensions = (type) => (type.allOf || []).map(generateType).concat("").join(" & ") + (type.oneOf || []).map(generateType).concat("").join(" | ");
152
145
  const generatePrimitive = (parsed) => `${preamble(parsed)}${parsed.type}`;
153
146
  const generateCustom = (parsed) => `${preamble(parsed)}${typeName(parsed.type)}`;
154
147
  const generateUnknown = (parsed) => `${preamble(parsed)}unknown`;
@@ -183,7 +176,7 @@ const generateEnum = (parsed) => {
183
176
  const valuesName = constantCase(`${parsed.name}_VALUES`);
184
177
  return [`export const ${valuesName} = [${values}] as const`, `${preamble(parsed)}typeof ${valuesName}[number]`].join("\n");
185
178
  }
186
- return `${preamble(parsed)}${parsed.values.map(serializeValue).join(OR)}`;
179
+ return `${preamble(parsed)}${parsed.values.map(serializeValue).join(" | ")}`;
187
180
  };
188
181
  const generateHeader = (header) => {
189
182
  return `${preamble(header)}{ ${propertyName(header.name)}${header.optional ? "?" : ""}: ${generateType(header.type)} }`;
@@ -241,7 +234,6 @@ const serializeValue = (value) => {
241
234
  if (typeof value === "string") return `'${value}'`;
242
235
  return value;
243
236
  };
244
-
245
237
  //#endregion
246
238
  //#region src/generator/args.ts
247
239
  const generateClientArgs = (args) => generateArgs(args, false);
@@ -273,7 +265,6 @@ const wrapArgs = (args, wrap) => {
273
265
  return `LowerCaseHeaders<${args}>`;
274
266
  };
275
267
  const argsOptional = (args) => parts.reduce((o, p) => o && (!args[p] || args[p].optional), true);
276
-
277
268
  //#endregion
278
269
  //#region src/generator/client.ts
279
270
  const generateClient = (name, paths) => {
@@ -283,7 +274,7 @@ const generateClient = (name, paths) => {
283
274
  groupedCalls[path.method]?.push(generateCall(path));
284
275
  }
285
276
  const client = [];
286
- const methods = Object.keys(groupedCalls).map(serializeValue).join(OR);
277
+ const methods = Object.keys(groupedCalls).map(serializeValue).join(" | ");
287
278
  client.push(`export type ${name}Client = Pick<BaseClient, ${methods}> & {`);
288
279
  Object.entries(groupedCalls).forEach(([method, calls]) => {
289
280
  client.push(`${method}: {`);
@@ -300,8 +291,7 @@ const generateCall = (path) => {
300
291
  url: '${path.url}', ${generateClientArgs(path.args)}opts?: RequestOptions,
301
292
  ): Promise<${responses}>`;
302
293
  };
303
- const generateResponses$1 = (path) => Object.entries(path.responses).filter(([code]) => Number.parseInt(code, 10) < 400).map(([, type]) => generateResponseBody(type, false)).join(OR);
304
-
294
+ const generateResponses$1 = (path) => Object.entries(path.responses).filter(([code]) => Number.parseInt(code, 10) < 400).map(([, type]) => generateResponseBody(type, false)).join(" | ");
305
295
  //#endregion
306
296
  //#region src/generator/server.ts
307
297
  const generateServer = (name, paths) => {
@@ -329,9 +319,8 @@ const generateMethod = (path) => {
329
319
  pre?: GenericRouteHandler | GenericRouteHandler[]
330
320
  }`;
331
321
  };
332
- const generateResponses = (responses) => Object.entries(responses).filter(([code]) => Number.parseInt(code, 10) < 500).map(([code, response]) => generateResponse(Number.parseInt(code, 10), response)).join(OR);
322
+ const generateResponses = (responses) => Object.entries(responses).filter(([code]) => Number.parseInt(code, 10) < 500).map(([code, response]) => generateResponse(Number.parseInt(code, 10), response)).join(" | ");
333
323
  const generateResponse = (code, response) => `[${code}, ${generateResponseBody(response)}]`;
334
-
335
324
  //#endregion
336
325
  //#region src/generator/generator.ts
337
326
  const generate$1 = (name, doc) => `
@@ -395,7 +384,6 @@ const generateComponents = (components) => {
395
384
  }));
396
385
  return tokens.join("\n\n");
397
386
  };
398
-
399
387
  //#endregion
400
388
  //#region src/parser/common.ts
401
389
  const parseRef = (ref) => ref.substring(ref.lastIndexOf("/") + 1);
@@ -416,7 +404,6 @@ const parseDocumentation = (source) => {
416
404
  if (source.description) documented.description = source.description;
417
405
  return documented;
418
406
  };
419
-
420
407
  //#endregion
421
408
  //#region src/parser/schema.ts
422
409
  const parseSchemas = (schemas = {}) => Object.entries(schemas || {}).map(([name, schema]) => parseSchema(name, schema));
@@ -527,7 +514,6 @@ const parsePropertyType = (property, generateDocs = true) => {
527
514
  }
528
515
  return [];
529
516
  };
530
-
531
517
  //#endregion
532
518
  //#region src/parser/headers.ts
533
519
  const parseHeaders = (schemas = {}) => Object.entries(schemas || {}).map(([name, schema]) => parseHeader(name, schema));
@@ -539,7 +525,6 @@ const parseHeader = (name, schema) => {
539
525
  ...parseDocumentation(schema)
540
526
  };
541
527
  };
542
-
543
528
  //#endregion
544
529
  //#region src/parser/parameters.ts
545
530
  const parseParameters$1 = (schemas = {}) => Object.entries(schemas || {}).map(([name, schema]) => parseParameter(name, schema));
@@ -553,7 +538,6 @@ const parseParameter = (name, schema) => {
553
538
  ...parseDocumentation(schema)
554
539
  };
555
540
  };
556
-
557
541
  //#endregion
558
542
  //#region src/parser/args.ts
559
543
  const parseArgs = (path, components) => {
@@ -679,7 +663,6 @@ const parseRequestBody = (requestBody, components = {}) => {
679
663
  }
680
664
  return args;
681
665
  };
682
-
683
666
  //#endregion
684
667
  //#region src/parser/responseBodies.ts
685
668
  const parseResponseBodies = (responses = {}) => {
@@ -716,7 +699,6 @@ const parseResponseBody = (name, response) => {
716
699
  }
717
700
  return body;
718
701
  };
719
-
720
702
  //#endregion
721
703
  //#region src/parser/paths.ts
722
704
  const parsePaths = (doc) => Object.entries(doc.paths || {}).flatMap(([name, path]) => parsePath(name, path, doc.components));
@@ -746,7 +728,6 @@ const parseResponses = (responses) => {
746
728
  return { [Number.parseInt(code, 10)]: parseResponseBody(void 0, response) };
747
729
  }));
748
730
  };
749
-
750
731
  //#endregion
751
732
  //#region src/parser/requestBodies.ts
752
733
  const parseRequestBodies = (requestBodies = {}) => {
@@ -754,7 +735,6 @@ const parseRequestBodies = (requestBodies = {}) => {
754
735
  for (const [name, requestBody] of Object.entries(requestBodies)) if (requestBody.content["application/json"].schema) definitions.push(parseSchema(name, requestBody.content["application/json"].schema));
755
736
  return definitions;
756
737
  };
757
-
758
738
  //#endregion
759
739
  //#region src/parser/securitySchemes.ts
760
740
  const parseSecuritySchemes = (schemes = {}) => {
@@ -802,7 +782,6 @@ const parseOpenIdConnect = (name, _scheme) => ({
802
782
  optional: false,
803
783
  type: { type: "string" }
804
784
  });
805
-
806
785
  //#endregion
807
786
  //#region src/parser/index.ts
808
787
  const parseDocument = (schema) => ({
@@ -817,7 +796,6 @@ const parseComponents = (components = {}) => ({
817
796
  responseBodies: parseResponseBodies(components.responses),
818
797
  securitySchemes: parseSecuritySchemes(components.securitySchemes)
819
798
  });
820
-
821
799
  //#endregion
822
800
  //#region src/index.ts
823
801
  const generateTypescript = async (name, doc) => {
@@ -891,7 +869,7 @@ const classname = (name) => {
891
869
  const filename = (name) => {
892
870
  return name.replace(/\./g, "_");
893
871
  };
894
-
895
872
  //#endregion
896
873
  export { classname, filename, generate, generateTypescript };
874
+
897
875
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["format","pFormat","generateResponses","generate","parseParameters","parseParameters","format","_generate"],"sources":["../src/generator/formatter.ts","../src/generator/document.ts","../src/generator/common.ts","../src/generator/args.ts","../src/generator/client.ts","../src/generator/server.ts","../src/generator/generator.ts","../src/parser/common.ts","../src/parser/schema.ts","../src/parser/headers.ts","../src/parser/parameters.ts","../src/parser/args.ts","../src/parser/responseBodies.ts","../src/parser/paths.ts","../src/parser/requestBodies.ts","../src/parser/securitySchemes.ts","../src/parser/index.ts","../src/index.ts"],"sourcesContent":["import { type Options, format as pFormat } from 'prettier'\n\nconst options: Options = {\n parser: 'typescript',\n singleQuote: true,\n semi: false,\n trailingComma: 'all',\n}\n\nexport const format = async (code: string): Promise<string> =>\n pFormat(code, options)\n","import type {\n Args,\n DocumentableType,\n Path,\n Property,\n RequestArgs,\n} from '../types'\nimport { argsOptional } from './args'\nimport { AND, OR, rxProperVariable } from './common'\n\nexport const document = ({ title, description }: DocumentableType): string => {\n if (title || description) {\n const tokens: string[] = []\n tokens.push('/**')\n if (title) tokens.push(` * ${title}`)\n if (description) tokens.push(` * ${description}`)\n tokens.push(' */\\n')\n return tokens.join('\\n')\n }\n return ''\n}\n\nexport const documentClientPath = (path: Path, responses: string): string =>\n documentPath(\n path,\n responses,\n [param('url', 'string')],\n [param('opts', 'RequestOptions', true)]\n )\n\nexport const documentServerPath = (path: Path, responses: string): string =>\n documentPath(path, responses)\n\nconst documentPath = (\n path: Path,\n responses: string,\n argsBefore: string[] = [],\n argsAfter: string[] = []\n): string => {\n const tokens: string[] = []\n\n tokens.push('/**')\n if (path.title) tokens.push(` * ${path.title}`)\n if (path.description) tokens.push(` * ${path.description}`)\n tokens.push(' *')\n tokens.push(...argsBefore)\n if (path.args) tokens.push(...documentArgs(path.args))\n tokens.push(...argsAfter)\n tokens.push(` * @returns {Promise<${responses}>}`)\n tokens.push(' */')\n\n return tokens.join('\\n')\n}\n\nconst documentArgs = (args: RequestArgs): string[] => {\n const tokens: string[] = []\n\n tokens.push(\n param(\n 'args',\n 'Object',\n argsOptional(args),\n 'The arguments for the request.'\n )\n )\n\n // Path params\n tokens.push(...requestArgs(args.path, 'params', 'Path parameters'))\n // Query params\n tokens.push(...requestArgs(args.query, 'query', 'Query parameters'))\n // Headers\n tokens.push(...requestArgs(args.header, 'headers', 'Headers'))\n // Request body\n tokens.push(...requestArgs(args.body, 'body', 'Request body'))\n\n return tokens\n}\n\nconst buildPath = (path: string, property: string): string =>\n rxProperVariable.test(property)\n ? `${path}.${property}`\n : `${path}[\"${property}\"]`\n\nconst requestArgs = (\n args: Args | undefined,\n name: string,\n title: string\n): string[] => {\n if (!args) return []\n\n const tokens: string[] = []\n const type = (args.allOf || []).map((e) => e.type).join(AND) || 'Object'\n tokens.push(\n param(\n buildPath('args', name),\n type,\n args.optional,\n `${title} for the request.`\n )\n )\n const properties = args.properties.flatMap((prop) =>\n requestProperty(buildPath('args', name), prop)\n )\n tokens.push(...properties)\n return tokens\n}\n\nconst requestProperty = (path: string, property: Property): string[] => {\n const tokens: string[] = []\n\n const type = property.type.map((t) => t.type).join(OR)\n tokens.push(\n param(\n buildPath(path, property.name),\n type,\n property.optional,\n property.title,\n property.description\n )\n )\n\n return tokens\n}\n\nconst param = (\n name: string,\n type: string,\n optional = false,\n title = '',\n description = ''\n): string => {\n const tokens: string[] = []\n\n tokens.push(\n ` * @param {${type}} ${optional ? '[' : ''}${name}${optional ? ']' : ''}`\n )\n if (optional || title || description) {\n tokens.push(' -')\n if (optional) tokens.push(' Optional.')\n if (title) tokens.push(` ${title}`)\n if (description) tokens.push(` ${description}`)\n }\n\n return tokens.join('')\n}\n","import { constantCase, pascalCase } from 'change-case'\nimport type {\n ArrayType,\n CustomType,\n Discriminator,\n DocumentableType,\n EnumType,\n Header,\n ObjectType,\n PrimitiveType,\n Property,\n RecordType,\n ResponseBody,\n TypeDefinition,\n UnknownType,\n} from '../types'\nimport { document } from './document'\n\nexport const OR = ' | '\nexport const AND = ' & '\n\nexport const generateType = (parsed: TypeDefinition): string => {\n let type: string\n switch (parsed.type) {\n case 'enum': {\n type = generateEnum(parsed as EnumType)\n break\n }\n case 'array': {\n type = generateArray(parsed as ArrayType)\n break\n }\n case 'object': {\n type = generateObject(parsed as ObjectType)\n break\n }\n case 'record': {\n type = generateRecord(parsed as RecordType)\n break\n }\n case 'unknown': {\n type = generateUnknown(parsed as UnknownType)\n break\n }\n case 'Date':\n case 'bigint':\n case 'boolean':\n case 'null':\n case 'number':\n case 'string':\n case 'symbol':\n case 'undefined':\n type = generatePrimitive(parsed as PrimitiveType)\n break\n default: {\n type = generateCustom(parsed as CustomType)\n }\n }\n return type.replace(/ [&|] \\{\\s*\\}/g, '')\n}\n\nexport const generateProperty = (property: Property): string => {\n const types = property.type.map(generateType)\n return `${document(property)}${propertyName(property.name)}${\n property.optional ? '?' : ''\n }: ${types.join(OR) || 'unknown'}`\n}\n\nexport const preamble = (type: DocumentableType): string =>\n type.name ? `${document(type)}export type ${typeName(type.name)} = ` : ''\n\nexport const rxProperVariable = /^[a-zA-Z_<>$][a-zA-Z0-9_<>$]*$/\n\nconst isValidName = (name: string): boolean => {\n const namingConventionRegex =\n /^([A-Z_]\\w*)([a-z_]\\w*)(<([a-z_]\\w*(,\\s*)?)+>)?$/\n const hasCapitalLetterRegex = /[A-Z]/\n\n // Check if the name follows the basic structural rules\n if (!namingConventionRegex.test(name)) return false\n\n if (!hasCapitalLetterRegex.test(name)) {\n return false\n }\n\n // Further check for starting lowercase without underscore in the rest of the name\n if (name[0] !== name[0].toUpperCase() && !name.includes('_')) {\n return false\n }\n\n return true\n}\n\nexport const typeName = (name: string): string => {\n // Check if the name already conforms to the naming rules\n if (isValidName(name)) {\n return name // Return the name untouched if it conforms\n }\n // Handle generics separately by processing the content within <>\n if (name.includes('<')) {\n return name.replace(\n /<([^>]+)>/,\n (_match, genericContent) => `<${typeName(genericContent)}>`\n )\n }\n\n // Directly transform domain-style names, preserving underscores for segments\n const domainStyleTransformed = name\n .split('.')\n .map((part, index, array) => {\n // Apply pascal case only to the last segment\n if (index === array.length - 1) {\n return pascalCase(part) // Using external pascalCase\n }\n return part\n })\n .join('_')\n\n // Handle names starting with numbers\n const prefixedIfNumberStart = domainStyleTransformed.match(/^\\d/)\n ? `_${domainStyleTransformed}`\n : domainStyleTransformed\n\n // For other transformations, apply pascalCase if not already handled by domain style transformation\n const finalName = prefixedIfNumberStart.includes('_')\n ? prefixedIfNumberStart\n : pascalCase(prefixedIfNumberStart)\n\n // Ensure capitalization of the first character, in case pascalCase did not apply (e.g., underscores present)\n // Modification: Check if the finalName includes '_', indicating a domain-style name or a number prefix,\n // and avoid changing the case of the entire string\n if (finalName.includes('_')) {\n // Only capitalize the segment after the last underscore if it's a domain-style name\n const lastUnderscoreIndex = finalName.lastIndexOf('_')\n if (\n lastUnderscoreIndex !== -1 &&\n lastUnderscoreIndex < finalName.length - 1\n ) {\n return (\n finalName.substring(0, lastUnderscoreIndex + 1) +\n finalName.charAt(lastUnderscoreIndex + 1).toUpperCase() +\n finalName.slice(lastUnderscoreIndex + 2)\n )\n }\n return finalName\n }\n // Apply capitalization for non-domain style names\n return finalName.charAt(0).toUpperCase() + finalName.slice(1)\n}\n\nexport const propertyName = (name: string): string => {\n if (rxProperVariable.test(name.replace(/\\./g, '_')))\n return name.replace(/\\./g, '_')\n return `'${name.replace(/\\./g, '_')}'`\n}\n\nexport const extensions = (type: ObjectType): string =>\n (type.allOf || []).map(generateType).concat('').join(AND) +\n (type.oneOf || []).map(generateType).concat('').join(OR)\n\nexport const generatePrimitive = (parsed: PrimitiveType): string =>\n `${preamble(parsed)}${parsed.type}`\n\nexport const generateCustom = (parsed: CustomType): string =>\n `${preamble(parsed)}${typeName(parsed.type)}`\n\nexport const generateUnknown = (parsed: UnknownType): string =>\n `${preamble(parsed)}unknown`\n\nexport const generateObject = (parsed: ObjectType): string => {\n const lines: string[] = []\n lines.push(`${preamble(parsed)}${extensions(parsed)}{`)\n lines.push(...parsed.properties.map(generateProperty))\n lines.push('}')\n\n if (parsed.discriminator && parsed.name) {\n lines.push(generateDiscriminator(parsed.discriminator, parsed.name))\n }\n\n return lines.join('\\n')\n}\n\nexport const generateRecord = (parsed: RecordType): string => {\n const itemType =\n parsed.items.type === 'undefined' ? 'unknown' : generateType(parsed.items)\n return `Record<string, ${itemType}>`\n}\n\nconst generateDiscriminator = (\n discriminator: Discriminator,\n name: string\n): string => {\n const lines: string[] = ['']\n lines.push(`export type ${name}Discriminator = {`)\n for (const [key, type] of Object.entries(discriminator.mapping)) {\n lines.push(`${key}: ${type.type}`)\n }\n lines.push('}')\n return lines.join('\\n')\n}\n\nexport const generateArray = (parsed: ArrayType): string => {\n const lines: string[] = []\n let items = generateType(parsed.items)\n if (\n parsed.items.type === 'enum' ||\n 'oneOf' in parsed.items ||\n 'allOf' in parsed.items\n ) {\n items = `(${items})`\n }\n lines.push(`${preamble(parsed)}${items}[]`)\n return lines.join('\\n')\n}\n\nexport const generateEnum = (parsed: EnumType): string => {\n if (parsed.name) {\n const values = parsed.values.map(serializeValue).join(', ')\n const valuesName = constantCase(`${parsed.name}_VALUES`)\n return [\n `export const ${valuesName} = [${values}] as const`,\n `${preamble(parsed)}typeof ${valuesName}[number]`,\n ].join('\\n')\n }\n\n return `${preamble(parsed)}${parsed.values.map(serializeValue).join(OR)}`\n}\n\nexport const generateHeader = (header: Header): string => {\n return `${preamble(header)}{ ${propertyName(header.name)}${\n header.optional ? '?' : ''\n }: ${generateType(header.type)} }`\n}\n\nexport const generateResponseBody = (\n type: ResponseBody | CustomType,\n optional = true\n): string => {\n const customType = (type as CustomType).type\n if (customType) return typeName(customType)\n\n const body = type as ResponseBody\n if (!body.data && !body.headers) return 'undefined'\n\n const tokens: string[] = []\n tokens.push(preamble(body))\n tokens.push('APIResponse<')\n tokens.push(\n body.data ? generateType(serialized(body.data, optional)) : 'undefined'\n )\n if (body.headers) {\n tokens.push(', ')\n tokens.push(body.headers ? generateHeaders(body.headers) : 'undefined')\n }\n tokens.push('>')\n return tokens.join('')\n}\n\nconst serialized = (orig: TypeDefinition, optional = true): TypeDefinition => {\n switch (orig.type) {\n case 'bigint':\n case 'boolean':\n case 'enum':\n case 'null':\n case 'number':\n case 'string':\n case 'symbol':\n case 'undefined': {\n return orig\n }\n case 'Date': {\n return { ...orig, type: 'string' }\n }\n case 'array': {\n return {\n ...orig,\n items: serialized((orig as ArrayType).items, optional),\n } as ArrayType\n }\n case 'object': {\n return orig\n }\n default: {\n const wrapper = optional ? 'PartiallySerialized' : 'Serialized'\n return { ...orig, type: `${wrapper}<${typeName(orig.type)}>` }\n }\n }\n}\n\nexport const generateHeaders = (headers: Header[]): string => {\n const tokens: string[] = []\n\n for (const header of headers) {\n tokens.push(\n `${propertyName(header.name)}${\n header.optional ? '?' : ''\n }: ${generateType(header.type)}`\n )\n }\n\n return `{${tokens.join(', ')}}`\n}\n\nexport const serializeValue = (value: unknown): unknown => {\n if (typeof value === 'string') return `'${value}'`\n return value\n}\n","import type { RequestArgs } from '../types'\nimport { generateType } from './common'\n\nexport const generateClientArgs = (args: RequestArgs | undefined): string =>\n generateArgs(args, false)\n\nexport const generateServerArgs = (args: RequestArgs | undefined): string =>\n args ? generateArgs(args, true) : 'args: Req'\n\nconst parts: (keyof RequestArgs)[] = ['body', 'header', 'path', 'query']\n\nconst generateArgs = (\n args: RequestArgs | undefined,\n isServer: boolean\n): string => {\n if (args) {\n const tokens: string[] = []\n for (const part of parts) {\n const arg = args[part]\n if (arg) {\n const partName =\n part === 'path' ? 'params' : part === 'header' ? 'headers' : part\n\n if (partName === 'query' && isServer) {\n tokens.push(\n `${partName}${arg.optional ? '?' : ''}: QueryParams<${generateType(arg)}>`\n )\n } else {\n tokens.push(\n `${partName}${arg.optional ? '?' : ''}: ${wrapArgs(\n generateType(arg),\n isServer && part === 'header'\n )}`\n )\n }\n }\n }\n\n if (!tokens.length) return ''\n\n const optional = argsOptional(args)\n return `args${optional ? '?' : ''}: ${\n isServer ? 'Req & ' : ''\n }{ ${tokens.join(', ')} }, `\n }\n // No params - no args\n return ''\n}\n\nconst wrapArgs = (args: string, wrap: boolean): string => {\n if (!wrap) return args\n return `LowerCaseHeaders<${args}>`\n}\n\nexport const argsOptional = (args: RequestArgs) =>\n // biome-ignore lint/style/noNonNullAssertion: will never be null\n parts.reduce((o, p) => o && (!args[p] || args[p]!.optional), true)\n","import type { Verb } from '@sebspark/openapi-core'\nimport type { Path } from '../types'\nimport { generateClientArgs } from './args'\nimport { generateResponseBody, OR, serializeValue } from './common'\nimport { documentClientPath } from './document'\n\nexport const generateClient = (name: string, paths: Path[]): string => {\n const groupedCalls: Partial<Record<Verb, string[]>> = {}\n for (const path of paths) {\n if (!groupedCalls[path.method]) {\n groupedCalls[path.method] = []\n }\n groupedCalls[path.method]?.push(generateCall(path))\n }\n const client: string[] = []\n\n const methods = Object.keys(groupedCalls).map(serializeValue).join(OR)\n client.push(`export type ${name}Client = Pick<BaseClient, ${methods}> & {`)\n\n Object.entries(groupedCalls).forEach(([method, calls]) => {\n client.push(`${method}: {`)\n client.push(...calls)\n client.push('}')\n })\n\n client.push('}')\n\n return client.join('\\n')\n}\n\nconst generateCall = (path: Path): string => {\n const responses = generateResponses(path)\n return `${documentClientPath(path, responses)}\n (\n url: '${path.url}', ${generateClientArgs(path.args)}opts?: RequestOptions,\n ): Promise<${responses}>`\n}\n\nconst generateResponses = (path: Path): string =>\n Object.entries(path.responses)\n .filter(([code]) => Number.parseInt(code, 10) < 400)\n .map(([, type]) => generateResponseBody(type, false))\n .join(OR)\n","import type { CustomType, Path, ResponseBody } from '../types'\nimport { generateServerArgs } from './args'\nimport { generateResponseBody, OR } from './common'\nimport { documentServerPath } from './document'\n\nexport const generateServer = (name: string, paths: Path[]): string => {\n const tokens: string[] = []\n\n tokens.push(`export type ${name}ServerPaths = {`)\n\n for (const [url, methods] of Object.entries(groupPathsByUrl(paths))) {\n tokens.push(generatePath(url, methods))\n }\n\n tokens.push('}')\n tokens.push('\\n')\n tokens.push(\n `export type ${name}Server = APIServerDefinition & ${name}ServerPaths`\n )\n\n return tokens.join('\\n')\n}\n\nconst groupPathsByUrl = (paths: Path[]): Record<string, Path[]> =>\n paths.reduce(\n (group, path) => {\n if (!group[path.url]) group[path.url] = []\n group[path.url].push(path)\n return group\n },\n {} as Record<string, Path[]>\n )\n\nconst generatePath = (url: string, methods: Path[]): string => `'${url}': {\n ${methods.map(generateMethod).join('\\n')}\n }`\n\nconst generateMethod = (path: Path): string => {\n const responses = generateResponses(path.responses)\n return `${path.method}: {\n ${documentServerPath(path, responses)}\n handler: (${generateServerArgs(path.args)}) => Promise<${responses}>\n pre?: GenericRouteHandler | GenericRouteHandler[]\n }`\n}\n\nconst generateResponses = (\n responses: Record<number, ResponseBody | CustomType>\n): string =>\n Object.entries(responses)\n .filter(([code]) => Number.parseInt(code, 10) < 500)\n .map(([code, response]) =>\n generateResponse(Number.parseInt(code, 10), response)\n )\n .join(OR)\n\nconst generateResponse = (code: number, response: ResponseBody): string =>\n `[${code}, ${generateResponseBody(response)}]`\n","import type {\n ArrayType,\n ParsedComponents,\n ParsedOpenApiDocument,\n} from '../types'\nimport { generateClient } from './client'\nimport { generateHeader, generateResponseBody, generateType } from './common'\nimport { generateServer } from './server'\n\nexport { generateClient } from './client'\nexport { generateType } from './common'\nexport { generateServer } from './server'\n\nexport const generate = (name: string, doc: ParsedOpenApiDocument): string => `\n /**\n * This file was auto-generated.\n * Do not make direct changes to the file.\n */\n\n import type {\n APIResponse,\n APIServerDefinition,\n BaseClient,\n ExpressRequest,\n GenericRouteHandler,\n LowerCaseHeaders,\n PartiallySerialized,\n QueryParams,\n RequestOptions,\n Serialized,\n } from '@sebspark/openapi-core'\n\n type Req = Pick<ExpressRequest, 'url' | 'baseUrl' | 'cookies' | 'hostname'>\n\n /* tslint:disable */\n /* eslint-disable */\n\n ${generateComponents(doc.components)}\n\n ${doc.paths.length ? generateServer(name, doc.paths) : ''}\n\n ${doc.paths.length ? generateClient(name, doc.paths) : ''}\n\n`\n\nconst generateComponents = (components: ParsedComponents): string => {\n const tokens: string[] = []\n\n for (const schema of components.schemas) {\n tokens.push(generateType(schema))\n }\n\n for (const header of components.headers) {\n tokens.push(generateHeader(header))\n }\n\n for (const param of components.parameters) {\n const type = [param.type]\n if (param.type.type === 'array') {\n type.push((param.type as ArrayType).items)\n }\n tokens.push(\n generateType({\n type: 'object',\n name: param.name,\n properties: [\n {\n name: param.parameterName,\n type,\n optional: param.optional,\n },\n ],\n })\n )\n }\n\n for (const req of components.requestBodies) {\n tokens.push(generateType(req))\n }\n\n for (const res of components.responseBodies) {\n tokens.push(generateResponseBody(res))\n }\n\n for (const param of components.securitySchemes) {\n tokens.push(\n generateType({\n type: 'object',\n name: param.name,\n properties: [\n {\n name: param.parameterName,\n type: [param.type],\n optional: param.optional,\n },\n ],\n })\n )\n }\n\n return tokens.join('\\n\\n')\n}\n","import type {\n ComponentsObject,\n HeaderObject,\n ParameterObject,\n RequestBodyObject,\n SchemaObject,\n SecuritySchemeObject,\n} from '@sebspark/openapi-core'\nimport type { EnumType } from '../types'\n\nexport const parseRef = (ref: string): string =>\n ref.substring(ref.lastIndexOf('/') + 1)\n\nexport const parseEnumType = (\n name: string | undefined,\n schema: SchemaObject\n): EnumType => ({ name, type: 'enum', values: schema.enum || [] })\n\ntype SchemaPath =\n | 'schemas'\n | 'parameters'\n | 'headers'\n | 'requestBodies'\n | 'securitySchemes'\ntype SchemaType =\n | SchemaObject\n | ParameterObject\n | HeaderObject\n | RequestBodyObject\n | SecuritySchemeObject\nexport const findRef = <T extends SchemaType>(\n components: ComponentsObject,\n ref: string\n): T => {\n const [, , path, name] = ref.split('/')\n const schemaPath = components[path as SchemaPath]\n if (!schemaPath || !schemaPath[name])\n throw new Error(`Cannot find ref ${ref}`)\n return schemaPath[name] as T\n}\n\ntype Documented = {\n title?: string\n description?: string\n}\nexport const parseDocumentation = (\n source: Partial<Documented>\n): Partial<Documented> => {\n const documented: Documented = {}\n if (source.title) documented.title = source.title\n if (source.description) documented.description = source.description\n return documented\n}\n","import type {\n ReferenceObject,\n SchemaObject,\n SchemaType,\n} from '@sebspark/openapi-core'\nimport type {\n ArrayType,\n CustomType,\n EnumType,\n ObjectType,\n Primitive,\n PrimitiveType,\n Property,\n RecordType,\n TypeDefinition,\n} from '../types'\nimport { parseDocumentation, parseEnumType, parseRef } from './common'\n\nexport const parseSchemas = (\n schemas: Record<string, SchemaObject> = {}\n): TypeDefinition[] =>\n Object.entries(schemas || {}).map(([name, schema]) =>\n parseSchema(name, schema)\n )\n\nconst marshall = (\n type: Omit<SchemaType, 'object' | 'array'>,\n format: string | undefined\n): Primitive => {\n if (type === 'integer') {\n return 'number'\n }\n if (type === 'string' && (format === 'date' || format === 'date-time')) {\n return 'Date'\n }\n return type as Primitive\n}\n\nexport const parseSchema = (\n name: string | undefined,\n schemaOrRef: SchemaObject | ReferenceObject,\n generateDocs = true\n): TypeDefinition => {\n const ref = (schemaOrRef as ReferenceObject).$ref\n if (ref) {\n return { name, type: parseRef(ref) }\n }\n\n const schema = schemaOrRef as SchemaObject\n switch (schema.type) {\n case 'array':\n return parseArraySchema(name, schema)\n case 'boolean':\n case 'integer':\n case 'number':\n case 'string':\n return schema.enum\n ? parseEnumType(name, schema)\n : name\n ? { name, type: marshall(schema.type, schema.format) }\n : parsePropertyType(schema, generateDocs)[0]\n default:\n return parseObjectSchema(name, schema)\n }\n}\n\nconst parseObjectSchema = (\n name: string | undefined,\n schema: SchemaObject\n): ObjectType => {\n const type: ObjectType = {\n name,\n type: 'object',\n properties: [],\n ...parseDocumentation(schema),\n }\n if (schema.properties) {\n type.properties = Object.entries(schema.properties).map(\n ([name, property]) => parseProperty(name, property, schema.required || [])\n )\n }\n if (schema.allOf) {\n type.allOf = schema.allOf.flatMap((s) => parsePropertyType(s))\n }\n if (schema.oneOf) {\n type.oneOf = schema.oneOf.flatMap((s) => parsePropertyType(s))\n }\n if (schema.anyOf) {\n type.oneOf = schema.anyOf.flatMap((s) => parsePropertyType(s))\n }\n if (schema.discriminator?.mapping) {\n const mapping: Record<string, CustomType> = {}\n for (const [prop, ref] of Object.entries(schema.discriminator.mapping)) {\n mapping[prop] = { type: parseRef(ref) }\n }\n type.discriminator = {\n propertyName: schema.discriminator.propertyName,\n mapping,\n }\n }\n if (schema.additionalProperties) {\n const record = parseAdditionalProperties(schema.additionalProperties)\n if (!type.allOf) {\n type.allOf = []\n }\n type.allOf.push(record)\n }\n return type\n}\n\nconst parseAdditionalProperties = (\n schema: true | SchemaObject | ReferenceObject\n): RecordType => {\n let items: TypeDefinition\n if (schema === true) {\n items = { type: 'undefined' } as PrimitiveType\n } else {\n items = parseSchema(undefined, schema)\n }\n return {\n type: 'record',\n items,\n } as RecordType\n}\n\nconst parseArraySchema = (\n name: string | undefined,\n schema: SchemaObject\n): ArrayType => {\n if (schema.type !== 'array') throw new Error('Not an array')\n return {\n name,\n type: 'array',\n items: schema.items\n ? parseSchema(undefined, schema.items, false)\n : { type: 'unknown' },\n ...parseDocumentation(schema),\n }\n}\n\nexport const parseProperty = (\n name: string,\n schema: SchemaObject | ReferenceObject,\n required: string[]\n): Property => {\n const property: Property = {\n name,\n optional: !required.includes(name),\n type: parsePropertyType(schema),\n ...parseDocumentation(schema as SchemaObject),\n }\n\n return property\n}\n\nconst parsePropertyType = (\n property: SchemaObject | ReferenceObject,\n generateDocs = true\n): TypeDefinition[] => {\n const ref = (property as ReferenceObject).$ref\n\n if (ref) {\n return [{ type: parseRef(ref) }]\n }\n const schemaObject = property as SchemaObject\n const docs = generateDocs ? parseDocumentation(schemaObject) : {}\n if (schemaObject.enum) {\n const enumType: EnumType = {\n type: 'enum',\n values: schemaObject.enum,\n ...docs,\n }\n return [enumType]\n }\n if (schemaObject.type) {\n return (\n Array.isArray(schemaObject.type) ? schemaObject.type : [schemaObject.type]\n ).map((type) => {\n switch (type) {\n case 'array': {\n return parseArraySchema(undefined, schemaObject)\n }\n case 'object': {\n return parseObjectSchema(undefined, schemaObject)\n }\n default: {\n return {\n type: marshall(type, schemaObject.format),\n ...docs,\n }\n }\n }\n })\n }\n if (schemaObject.allOf) {\n const types: TypeDefinition[] = []\n for (const allOf of schemaObject.allOf) {\n const type = parseSchema(undefined, allOf)\n delete type.name\n types.push(type)\n }\n return types\n }\n\n return []\n}\n","import type { HeaderObject } from '@sebspark/openapi-core'\nimport type { Header } from '../types'\nimport { parseDocumentation } from './common'\nimport { parseSchema } from './schema'\n\nexport const parseHeaders = (\n schemas: Record<string, HeaderObject> = {}\n): Header[] =>\n Object.entries(schemas || {}).map(([name, schema]) =>\n parseHeader(name, schema)\n )\n\nexport const parseHeader = (name: string, schema: HeaderObject): Header => {\n const header: Header = {\n name,\n optional: !schema.required,\n // biome-ignore lint/style/noNonNullAssertion: here it is always defined\n type: parseSchema(undefined, schema.schema!),\n ...parseDocumentation(schema),\n }\n\n return header\n}\n","import type { ParameterObject } from '@sebspark/openapi-core'\nimport type { Parameter } from '../types'\nimport { parseDocumentation } from './common'\nimport { parseSchema } from './schema'\n\nexport const parseParameters = (\n schemas: Record<string, ParameterObject> = {}\n): Parameter[] =>\n Object.entries(schemas || {}).map(([name, schema]) =>\n parseParameter(name, schema)\n )\n\nexport const parseParameter = (\n name: string | undefined,\n schema: ParameterObject\n): Parameter => {\n const param: Parameter = {\n name,\n in: schema.in,\n parameterName: schema.name,\n optional: !schema.required,\n // biome-ignore lint/style/noNonNullAssertion: schema is always defined here\n type: parseSchema(undefined, schema.schema!),\n ...parseDocumentation(schema),\n }\n\n return param\n}\n","import type {\n ComponentsObject,\n HeaderObject,\n OperationObject,\n ParameterObject,\n ReferenceObject,\n RequestBodyObject,\n SchemaObject,\n SecurityRequirementObject,\n SecuritySchemeObject,\n} from '@sebspark/openapi-core'\nimport type { Args, ObjectType, RequestArgs } from '../types'\nimport { findRef, parseDocumentation, parseRef } from './common'\nimport { parseSchema } from './schema'\n\nexport const parseArgs = (\n path: OperationObject,\n components?: ComponentsObject\n): RequestArgs | undefined => {\n // No parameters and no requestBody - no args\n if (!path.parameters?.length && !path.security?.length && !path.requestBody)\n return undefined\n\n const args: RequestArgs = joinArgs([\n parseParameters(path.parameters, components),\n parseSecurity(path.security, components),\n parseRequestBody(path.requestBody, components),\n ])\n\n return args\n}\n\nconst createArgs = (initializer: Partial<Args> = {}): Args => ({\n type: 'object',\n properties: [],\n optional: true,\n ...initializer,\n})\n\nconst joinArgs = (args: RequestArgs[]): RequestArgs => {\n const reqArg: RequestArgs = {}\n for (const arg of args) {\n for (const [prop, val] of Object.entries(arg)) {\n const key = prop as keyof RequestArgs\n if (reqArg[key]) {\n reqArg[key] = joinArg(reqArg[key] as Args, val)\n } else {\n reqArg[key] = val\n }\n }\n }\n return reqArg\n}\n\nconst joinArg = (arg1: Args, arg2: Args): Args => {\n const arg: Args = {\n type: 'object',\n optional: arg1.optional && arg2.optional,\n properties: arg1.properties.concat(arg2.properties),\n }\n if (arg1.allOf || arg2.allOf)\n arg.allOf = (arg1.allOf || []).concat(arg2.allOf || [])\n if (arg1.anyOf || arg2.anyOf)\n arg.anyOf = (arg1.anyOf || []).concat(arg2.anyOf || [])\n if (arg1.oneOf || arg2.oneOf)\n arg.oneOf = (arg1.oneOf || []).concat(arg2.oneOf || [])\n\n if (arg1.description || arg2.description)\n arg.description = arg1.description || arg2.description\n if (arg1.title || arg2.title) arg.title = arg1.title || arg2.title\n\n return arg\n}\n\nconst parseSecurity = (\n security: SecurityRequirementObject[] = [],\n components: ComponentsObject = {}\n): RequestArgs => {\n const args: RequestArgs = {}\n for (const secReq of security) {\n for (const [name] of Object.entries(secReq)) {\n const param = findRef<SecuritySchemeObject>(\n components,\n `#/components/securitySchemes/${name}`\n )\n const arg = args.header || createArgs({ ...parseDocumentation(param) })\n arg.optional = false\n if (!arg.allOf) arg.allOf = []\n arg.allOf.push({ type: parseRef(name) })\n args.header = arg\n }\n }\n return args\n}\n\nconst parseParameters = (\n parameters: (ParameterObject | ReferenceObject)[] = [],\n components: ComponentsObject = {}\n): RequestArgs => {\n const args: RequestArgs = {}\n\n for (const p of parameters) {\n const ref = (p as ReferenceObject).$ref\n if (ref) {\n const part = ref.split('/')[2] as keyof ComponentsObject\n switch (part) {\n case 'parameters': {\n const param = findRef<ParameterObject>(components, ref)\n const arg =\n args[param.in] || createArgs({ ...parseDocumentation(param) })\n arg.optional = arg.optional && !param.required\n\n if (!arg.allOf) arg.allOf = []\n arg.allOf.push({ type: parseRef(ref) })\n\n args[param.in] = arg\n break\n }\n case 'headers': {\n const header = findRef<HeaderObject>(components, ref)\n const arg = args.header || createArgs()\n const name = parseRef(ref)\n arg.properties.push({\n name,\n optional: !header.required,\n // biome-ignore lint/style/noNonNullAssertion: schema is never null here\n type: [{ type: parseSchema(undefined, header.schema!).type }],\n ...parseDocumentation((header.schema || {}) as SchemaObject),\n })\n args.header = arg\n break\n }\n }\n } else {\n const param = p as ParameterObject\n const arg = args[param.in] || createArgs({ ...parseDocumentation(param) })\n\n arg.properties.push({\n name: param.name,\n optional: !param.required,\n type: [parseSchema(undefined, param.schema as SchemaObject)],\n })\n\n arg.optional = arg.optional && !param.required\n\n args[param.in] = arg\n }\n }\n\n return args\n}\n\nconst parseRequestBody = (\n requestBody: ReferenceObject | RequestBodyObject | undefined,\n components: ComponentsObject = {}\n): RequestArgs => {\n const args: RequestArgs = {}\n if (!requestBody) return args\n\n const ref = (requestBody as ReferenceObject).$ref\n if (ref) {\n const refBody = findRef<RequestBodyObject>(components, ref)\n args.body = createArgs({\n optional: !refBody.required,\n allOf: [{ type: parseRef(ref) }],\n })\n } else {\n // Inline request body properties\n const body = requestBody as RequestBodyObject\n const bodyArgs: Args =\n args.body ||\n createArgs({ optional: !body.required, ...parseDocumentation(body) })\n\n if (body.content['application/json']) {\n const schema = body.content['application/json'].schema\n if (schema) {\n const parsed = parseSchema(undefined, schema)\n if (parsed.type === 'object') {\n args.body = {\n ...(parsed as ObjectType),\n optional: !body.required,\n }\n } else if (parsed.type) {\n args.body = createArgs({\n optional: !body.required,\n allOf: [parsed],\n ...parseDocumentation(body),\n })\n }\n }\n }\n if (\n bodyArgs.allOf?.length ||\n bodyArgs.oneOf?.length ||\n bodyArgs.properties.length\n ) {\n args.body = bodyArgs\n }\n }\n\n return args\n}\n","import type {\n HeaderObject,\n ReferenceObject,\n ResponseObject,\n} from '@sebspark/openapi-core'\nimport type { CustomType, ResponseBody } from '../types'\nimport { parseDocumentation, parseRef } from './common'\nimport { parseHeader } from './headers'\nimport { parseSchema } from './schema'\n\nexport const parseResponseBodies = (\n responses: Record<string, ResponseObject | ReferenceObject> = {}\n): ResponseBody[] => {\n const bodies: ResponseBody[] = []\n\n for (const [name, b] of Object.entries(responses)) {\n const body = parseResponseBody(name, b)\n bodies.push(body)\n }\n\n return bodies\n}\n\nexport const parseResponseBody = (\n name: string | undefined,\n response: ResponseObject | ReferenceObject\n): ResponseBody | CustomType => {\n const ref = (response as ReferenceObject).$ref\n if (ref) return { type: parseRef(ref) }\n\n const responseObject = response as ResponseObject\n const body: ResponseBody = {}\n if (name) body.name = name\n if (responseObject.description) body.description = responseObject.description\n\n if (responseObject.content?.['application/json']?.schema) {\n const schema = responseObject.content['application/json'].schema\n body.data = parseSchema(undefined, schema)\n }\n if (responseObject.headers) {\n body.headers = []\n for (const [headerName, header] of Object.entries(responseObject.headers)) {\n const ref = (header as ReferenceObject).$ref\n if (ref)\n body.headers.push({\n name: headerName,\n optional: false,\n type: { type: parseRef(ref) },\n ...parseDocumentation(header as HeaderObject),\n })\n else body.headers.push(parseHeader(headerName, header as HeaderObject))\n }\n }\n return body\n}\n","import type {\n ComponentsObject,\n OpenApiDocument,\n OperationObject,\n PathItemObject,\n ResponsesObject,\n Verb,\n} from '@sebspark/openapi-core'\nimport type { Path, TypeDefinition } from '../types'\nimport { parseArgs } from './args'\nimport { parseDocumentation } from './common'\nimport { parseResponseBody } from './responseBodies'\n\nexport const parsePaths = (doc: OpenApiDocument): Path[] =>\n Object.entries(doc.paths || {}).flatMap(([name, path]) =>\n parsePath(name, path as PathItemObject, doc.components)\n )\n\nexport const parsePath = (\n url: string,\n path: PathItemObject,\n components?: ComponentsObject\n): Path[] => {\n const paths: Path[] = []\n const methods: Verb[] = ['delete', 'get', 'patch', 'post', 'put']\n\n for (const method of methods) {\n if (path[method]) {\n paths.push(\n parseMethod(url, method, path[method] as OperationObject, components)\n )\n }\n }\n\n return paths\n}\n\nconst parseMethod = (\n url: string,\n method: Verb,\n operation: OperationObject,\n components?: ComponentsObject\n): Path => {\n return {\n method,\n url: parseUrl(url),\n responses: parseResponses(operation.responses),\n args: parseArgs(operation, components),\n ...parseDocumentation(operation),\n }\n}\n\nconst parseUrl = (url: string): string => url.replace(/{([^}]+)}/g, ':$1')\n\nconst parseResponses = (\n responses: ResponsesObject\n): Record<number, TypeDefinition> => {\n return Object.assign(\n {},\n ...Object.entries(responses).map(([code, response]) => {\n return {\n [Number.parseInt(code, 10)]: parseResponseBody(undefined, response),\n } as Record<number, TypeDefinition>\n })\n )\n}\n","import type { RequestBodyObject } from '@sebspark/openapi-core'\nimport type { TypeDefinition } from '../types'\nimport { parseSchema } from './schema'\n\nexport const parseRequestBodies = (\n requestBodies: Record<string, RequestBodyObject> = {}\n): TypeDefinition[] => {\n const definitions: TypeDefinition[] = []\n for (const [name, requestBody] of Object.entries(requestBodies)) {\n if (requestBody.content['application/json'].schema) {\n definitions.push(\n parseSchema(name, requestBody.content['application/json'].schema)\n )\n }\n }\n return definitions\n}\n","import type { SecuritySchemeObject } from '@sebspark/openapi-core'\nimport type { Parameter } from '../types'\n\nexport const parseSecuritySchemes = (\n schemes: Record<string, SecuritySchemeObject> = {}\n): Parameter[] => {\n const parameters: Parameter[] = []\n for (const [name, scheme] of Object.entries(schemes)) {\n parameters.push(parseSecurityScheme(name, scheme))\n }\n return parameters\n}\n\nexport const parseSecurityScheme = (\n name: string,\n scheme: SecuritySchemeObject\n): Parameter => {\n switch (scheme.type) {\n case 'apiKey':\n return parseApiKey(name, scheme)\n case 'http':\n return parseHttpSecurity(name, scheme)\n case 'oauth2':\n return parseOAuth(name, scheme)\n case 'openIdConnect':\n return parseOpenIdConnect(name, scheme)\n }\n throw new Error(`Unknown security scheme '${scheme.type}'`)\n}\n\nconst parseApiKey = (name: string, scheme: SecuritySchemeObject): Parameter => {\n const _in = scheme.in || 'header'\n const parameterName = scheme.name as string\n return {\n name,\n parameterName,\n in: _in,\n optional: false,\n type: { type: 'string' },\n }\n}\n\nconst parseHttpSecurity = (\n name: string,\n _scheme: SecuritySchemeObject\n): Parameter => ({\n name,\n in: 'header',\n parameterName: 'Authorization',\n optional: false,\n type: { type: 'string' },\n})\n\nconst parseOAuth = (\n name: string,\n _scheme: SecuritySchemeObject\n): Parameter => ({\n name,\n in: 'header',\n parameterName: 'Authorization',\n optional: false,\n type: { type: 'string' },\n})\n\nconst parseOpenIdConnect = (\n name: string,\n _scheme: SecuritySchemeObject\n): Parameter => ({\n name,\n in: 'header',\n parameterName: 'Authorization',\n optional: false,\n type: { type: 'string' },\n})\n","import type { ComponentsObject, OpenApiDocument } from '@sebspark/openapi-core'\nimport type { ParsedComponents, ParsedOpenApiDocument } from '../types'\nimport { parseHeaders } from './headers'\nimport { parseParameters } from './parameters'\nimport { parsePaths } from './paths'\nimport { parseRequestBodies } from './requestBodies'\nimport { parseResponseBodies } from './responseBodies'\nimport { parseSchemas } from './schema'\nimport { parseSecuritySchemes } from './securitySchemes'\n\nexport const parseDocument = (\n schema: OpenApiDocument\n): ParsedOpenApiDocument => ({\n paths: parsePaths(schema),\n components: parseComponents(schema.components),\n})\n\nexport const parseComponents = (\n components: ComponentsObject = {}\n): ParsedComponents => ({\n schemas: parseSchemas(components.schemas),\n headers: parseHeaders(components.headers),\n parameters: parseParameters(components.parameters),\n requestBodies: parseRequestBodies(components.requestBodies),\n responseBodies: parseResponseBodies(components.responses),\n securitySchemes: parseSecuritySchemes(components.securitySchemes),\n})\n","import { mkdir, readdir, readFile, stat, writeFile } from 'node:fs/promises'\nimport { parse, resolve } from 'node:path'\nimport type { OpenApiDocument } from '@sebspark/openapi-core'\nimport { pascalCase } from 'change-case'\nimport * as YAML from 'yaml'\nimport { generate as _generate, format } from './generator/index'\nimport { parseDocument } from './parser/index'\n\nexport const generateTypescript = async (\n name: string,\n doc: OpenApiDocument\n): Promise<string> => {\n const parsed = parseDocument(doc)\n const generated = _generate(name, parsed)\n const formatted = await format(generated)\n\n return formatted\n}\n\nexport const generate = async (\n input: string,\n output?: string\n): Promise<string | undefined> => {\n const docs = await readDocs(input)\n const generated = await generateDocs(docs)\n\n if (!output) return generated.map((d) => d.ts).join('\\n\\n')\n await saveDocs(output, generated)\n}\n\ntype Doc = {\n name: string\n doc: OpenApiDocument\n}\ntype GeneratedDoc = Doc & {\n ts: string\n}\nconst readDocs = async (input: string): Promise<Doc[]> => {\n const path = resolve(input)\n const stats = await stat(path)\n\n const filePaths: string[] = []\n\n if (stats.isFile()) filePaths.push(path)\n if (stats.isDirectory()) {\n const files = await readdir(path)\n filePaths.push(...files.map((f) => resolve(path, f)))\n }\n\n const readFiles: Doc[] = []\n for (const p of filePaths) {\n const { name, ext } = parse(p)\n let doc: OpenApiDocument\n switch (ext) {\n case '.json': {\n console.log(`Reading ${p}`)\n const txt = await readFile(p, 'utf8')\n doc = JSON.parse(txt) as OpenApiDocument\n break\n }\n case '.yml':\n case '.yaml': {\n console.log(`Reading ${p}`)\n const txt = await readFile(p, 'utf8')\n doc = YAML.parse(txt) as OpenApiDocument\n break\n }\n default:\n continue\n }\n readFiles.push({\n doc,\n name,\n })\n }\n return readFiles\n}\n\nconst generateDocs = async (files: Doc[]): Promise<GeneratedDoc[]> => {\n const generated: GeneratedDoc[] = []\n for (const doc of files) {\n console.log(`Generating ${doc.name}`)\n const ts = await generateTypescript(classname(doc.name), doc.doc)\n generated.push({\n ...doc,\n ts,\n })\n }\n return generated\n}\n\nconst saveDocs = async (\n output: string,\n docs: GeneratedDoc[]\n): Promise<void> => {\n const stats = await stat(output)\n const dir = stats.isDirectory() ? output : parse(output).dir\n await mkdir(dir, { recursive: true })\n for (const doc of docs) {\n const path = resolve(dir, `${filename(doc.name)}.ts`)\n console.log(`Writing ${path}`)\n await writeFile(path, doc.ts, 'utf8')\n }\n}\n\nexport const classname = (name: string): string => {\n return pascalCase(name.replace(/\\d+/g, ''))\n}\n\nexport const filename = (name: string): string => {\n return name.replace(/\\./g, '_')\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["format","pFormat","generateResponses","generate","parseParameters","parseParameters","format","_generate"],"sources":["../src/generator/formatter.ts","../src/generator/document.ts","../src/generator/common.ts","../src/generator/args.ts","../src/generator/client.ts","../src/generator/server.ts","../src/generator/generator.ts","../src/parser/common.ts","../src/parser/schema.ts","../src/parser/headers.ts","../src/parser/parameters.ts","../src/parser/args.ts","../src/parser/responseBodies.ts","../src/parser/paths.ts","../src/parser/requestBodies.ts","../src/parser/securitySchemes.ts","../src/parser/index.ts","../src/index.ts"],"sourcesContent":["import { type Options, format as pFormat } from 'prettier'\n\nconst options: Options = {\n parser: 'typescript',\n singleQuote: true,\n semi: false,\n trailingComma: 'all',\n}\n\nexport const format = async (code: string): Promise<string> =>\n pFormat(code, options)\n","import type {\n Args,\n DocumentableType,\n Path,\n Property,\n RequestArgs,\n} from '../types'\nimport { argsOptional } from './args'\nimport { AND, OR, rxProperVariable } from './common'\n\nexport const document = ({ title, description }: DocumentableType): string => {\n if (title || description) {\n const tokens: string[] = []\n tokens.push('/**')\n if (title) tokens.push(` * ${title}`)\n if (description) tokens.push(` * ${description}`)\n tokens.push(' */\\n')\n return tokens.join('\\n')\n }\n return ''\n}\n\nexport const documentClientPath = (path: Path, responses: string): string =>\n documentPath(\n path,\n responses,\n [param('url', 'string')],\n [param('opts', 'RequestOptions', true)]\n )\n\nexport const documentServerPath = (path: Path, responses: string): string =>\n documentPath(path, responses)\n\nconst documentPath = (\n path: Path,\n responses: string,\n argsBefore: string[] = [],\n argsAfter: string[] = []\n): string => {\n const tokens: string[] = []\n\n tokens.push('/**')\n if (path.title) tokens.push(` * ${path.title}`)\n if (path.description) tokens.push(` * ${path.description}`)\n tokens.push(' *')\n tokens.push(...argsBefore)\n if (path.args) tokens.push(...documentArgs(path.args))\n tokens.push(...argsAfter)\n tokens.push(` * @returns {Promise<${responses}>}`)\n tokens.push(' */')\n\n return tokens.join('\\n')\n}\n\nconst documentArgs = (args: RequestArgs): string[] => {\n const tokens: string[] = []\n\n tokens.push(\n param(\n 'args',\n 'Object',\n argsOptional(args),\n 'The arguments for the request.'\n )\n )\n\n // Path params\n tokens.push(...requestArgs(args.path, 'params', 'Path parameters'))\n // Query params\n tokens.push(...requestArgs(args.query, 'query', 'Query parameters'))\n // Headers\n tokens.push(...requestArgs(args.header, 'headers', 'Headers'))\n // Request body\n tokens.push(...requestArgs(args.body, 'body', 'Request body'))\n\n return tokens\n}\n\nconst buildPath = (path: string, property: string): string =>\n rxProperVariable.test(property)\n ? `${path}.${property}`\n : `${path}[\"${property}\"]`\n\nconst requestArgs = (\n args: Args | undefined,\n name: string,\n title: string\n): string[] => {\n if (!args) return []\n\n const tokens: string[] = []\n const type = (args.allOf || []).map((e) => e.type).join(AND) || 'Object'\n tokens.push(\n param(\n buildPath('args', name),\n type,\n args.optional,\n `${title} for the request.`\n )\n )\n const properties = args.properties.flatMap((prop) =>\n requestProperty(buildPath('args', name), prop)\n )\n tokens.push(...properties)\n return tokens\n}\n\nconst requestProperty = (path: string, property: Property): string[] => {\n const tokens: string[] = []\n\n const type = property.type.map((t) => t.type).join(OR)\n tokens.push(\n param(\n buildPath(path, property.name),\n type,\n property.optional,\n property.title,\n property.description\n )\n )\n\n return tokens\n}\n\nconst param = (\n name: string,\n type: string,\n optional = false,\n title = '',\n description = ''\n): string => {\n const tokens: string[] = []\n\n tokens.push(\n ` * @param {${type}} ${optional ? '[' : ''}${name}${optional ? ']' : ''}`\n )\n if (optional || title || description) {\n tokens.push(' -')\n if (optional) tokens.push(' Optional.')\n if (title) tokens.push(` ${title}`)\n if (description) tokens.push(` ${description}`)\n }\n\n return tokens.join('')\n}\n","import { constantCase, pascalCase } from 'change-case'\nimport type {\n ArrayType,\n CustomType,\n Discriminator,\n DocumentableType,\n EnumType,\n Header,\n ObjectType,\n PrimitiveType,\n Property,\n RecordType,\n ResponseBody,\n TypeDefinition,\n UnknownType,\n} from '../types'\nimport { document } from './document'\n\nexport const OR = ' | '\nexport const AND = ' & '\n\nexport const generateType = (parsed: TypeDefinition): string => {\n let type: string\n switch (parsed.type) {\n case 'enum': {\n type = generateEnum(parsed as EnumType)\n break\n }\n case 'array': {\n type = generateArray(parsed as ArrayType)\n break\n }\n case 'object': {\n type = generateObject(parsed as ObjectType)\n break\n }\n case 'record': {\n type = generateRecord(parsed as RecordType)\n break\n }\n case 'unknown': {\n type = generateUnknown(parsed as UnknownType)\n break\n }\n case 'Date':\n case 'bigint':\n case 'boolean':\n case 'null':\n case 'number':\n case 'string':\n case 'symbol':\n case 'undefined':\n type = generatePrimitive(parsed as PrimitiveType)\n break\n default: {\n type = generateCustom(parsed as CustomType)\n }\n }\n return type.replace(/ [&|] \\{\\s*\\}/g, '')\n}\n\nexport const generateProperty = (property: Property): string => {\n const types = property.type.map(generateType)\n return `${document(property)}${propertyName(property.name)}${\n property.optional ? '?' : ''\n }: ${types.join(OR) || 'unknown'}`\n}\n\nexport const preamble = (type: DocumentableType): string =>\n type.name ? `${document(type)}export type ${typeName(type.name)} = ` : ''\n\nexport const rxProperVariable = /^[a-zA-Z_<>$][a-zA-Z0-9_<>$]*$/\n\nconst isValidName = (name: string): boolean => {\n const namingConventionRegex =\n /^([A-Z_]\\w*)([a-z_]\\w*)(<([a-z_]\\w*(,\\s*)?)+>)?$/\n const hasCapitalLetterRegex = /[A-Z]/\n\n // Check if the name follows the basic structural rules\n if (!namingConventionRegex.test(name)) return false\n\n if (!hasCapitalLetterRegex.test(name)) {\n return false\n }\n\n // Further check for starting lowercase without underscore in the rest of the name\n if (name[0] !== name[0].toUpperCase() && !name.includes('_')) {\n return false\n }\n\n return true\n}\n\nexport const typeName = (name: string): string => {\n // Check if the name already conforms to the naming rules\n if (isValidName(name)) {\n return name // Return the name untouched if it conforms\n }\n // Handle generics separately by processing the content within <>\n if (name.includes('<')) {\n return name.replace(\n /<([^>]+)>/,\n (_match, genericContent) => `<${typeName(genericContent)}>`\n )\n }\n\n // Directly transform domain-style names, preserving underscores for segments\n const domainStyleTransformed = name\n .split('.')\n .map((part, index, array) => {\n // Apply pascal case only to the last segment\n if (index === array.length - 1) {\n return pascalCase(part) // Using external pascalCase\n }\n return part\n })\n .join('_')\n\n // Handle names starting with numbers\n const prefixedIfNumberStart = domainStyleTransformed.match(/^\\d/)\n ? `_${domainStyleTransformed}`\n : domainStyleTransformed\n\n // For other transformations, apply pascalCase if not already handled by domain style transformation\n const finalName = prefixedIfNumberStart.includes('_')\n ? prefixedIfNumberStart\n : pascalCase(prefixedIfNumberStart)\n\n // Ensure capitalization of the first character, in case pascalCase did not apply (e.g., underscores present)\n // Modification: Check if the finalName includes '_', indicating a domain-style name or a number prefix,\n // and avoid changing the case of the entire string\n if (finalName.includes('_')) {\n // Only capitalize the segment after the last underscore if it's a domain-style name\n const lastUnderscoreIndex = finalName.lastIndexOf('_')\n if (\n lastUnderscoreIndex !== -1 &&\n lastUnderscoreIndex < finalName.length - 1\n ) {\n return (\n finalName.substring(0, lastUnderscoreIndex + 1) +\n finalName.charAt(lastUnderscoreIndex + 1).toUpperCase() +\n finalName.slice(lastUnderscoreIndex + 2)\n )\n }\n return finalName\n }\n // Apply capitalization for non-domain style names\n return finalName.charAt(0).toUpperCase() + finalName.slice(1)\n}\n\nexport const propertyName = (name: string): string => {\n if (rxProperVariable.test(name.replace(/\\./g, '_')))\n return name.replace(/\\./g, '_')\n return `'${name.replace(/\\./g, '_')}'`\n}\n\nexport const extensions = (type: ObjectType): string =>\n (type.allOf || []).map(generateType).concat('').join(AND) +\n (type.oneOf || []).map(generateType).concat('').join(OR)\n\nexport const generatePrimitive = (parsed: PrimitiveType): string =>\n `${preamble(parsed)}${parsed.type}`\n\nexport const generateCustom = (parsed: CustomType): string =>\n `${preamble(parsed)}${typeName(parsed.type)}`\n\nexport const generateUnknown = (parsed: UnknownType): string =>\n `${preamble(parsed)}unknown`\n\nexport const generateObject = (parsed: ObjectType): string => {\n const lines: string[] = []\n lines.push(`${preamble(parsed)}${extensions(parsed)}{`)\n lines.push(...parsed.properties.map(generateProperty))\n lines.push('}')\n\n if (parsed.discriminator && parsed.name) {\n lines.push(generateDiscriminator(parsed.discriminator, parsed.name))\n }\n\n return lines.join('\\n')\n}\n\nexport const generateRecord = (parsed: RecordType): string => {\n const itemType =\n parsed.items.type === 'undefined' ? 'unknown' : generateType(parsed.items)\n return `Record<string, ${itemType}>`\n}\n\nconst generateDiscriminator = (\n discriminator: Discriminator,\n name: string\n): string => {\n const lines: string[] = ['']\n lines.push(`export type ${name}Discriminator = {`)\n for (const [key, type] of Object.entries(discriminator.mapping)) {\n lines.push(`${key}: ${type.type}`)\n }\n lines.push('}')\n return lines.join('\\n')\n}\n\nexport const generateArray = (parsed: ArrayType): string => {\n const lines: string[] = []\n let items = generateType(parsed.items)\n if (\n parsed.items.type === 'enum' ||\n 'oneOf' in parsed.items ||\n 'allOf' in parsed.items\n ) {\n items = `(${items})`\n }\n lines.push(`${preamble(parsed)}${items}[]`)\n return lines.join('\\n')\n}\n\nexport const generateEnum = (parsed: EnumType): string => {\n if (parsed.name) {\n const values = parsed.values.map(serializeValue).join(', ')\n const valuesName = constantCase(`${parsed.name}_VALUES`)\n return [\n `export const ${valuesName} = [${values}] as const`,\n `${preamble(parsed)}typeof ${valuesName}[number]`,\n ].join('\\n')\n }\n\n return `${preamble(parsed)}${parsed.values.map(serializeValue).join(OR)}`\n}\n\nexport const generateHeader = (header: Header): string => {\n return `${preamble(header)}{ ${propertyName(header.name)}${\n header.optional ? '?' : ''\n }: ${generateType(header.type)} }`\n}\n\nexport const generateResponseBody = (\n type: ResponseBody | CustomType,\n optional = true\n): string => {\n const customType = (type as CustomType).type\n if (customType) return typeName(customType)\n\n const body = type as ResponseBody\n if (!body.data && !body.headers) return 'undefined'\n\n const tokens: string[] = []\n tokens.push(preamble(body))\n tokens.push('APIResponse<')\n tokens.push(\n body.data ? generateType(serialized(body.data, optional)) : 'undefined'\n )\n if (body.headers) {\n tokens.push(', ')\n tokens.push(body.headers ? generateHeaders(body.headers) : 'undefined')\n }\n tokens.push('>')\n return tokens.join('')\n}\n\nconst serialized = (orig: TypeDefinition, optional = true): TypeDefinition => {\n switch (orig.type) {\n case 'bigint':\n case 'boolean':\n case 'enum':\n case 'null':\n case 'number':\n case 'string':\n case 'symbol':\n case 'undefined': {\n return orig\n }\n case 'Date': {\n return { ...orig, type: 'string' }\n }\n case 'array': {\n return {\n ...orig,\n items: serialized((orig as ArrayType).items, optional),\n } as ArrayType\n }\n case 'object': {\n return orig\n }\n default: {\n const wrapper = optional ? 'PartiallySerialized' : 'Serialized'\n return { ...orig, type: `${wrapper}<${typeName(orig.type)}>` }\n }\n }\n}\n\nexport const generateHeaders = (headers: Header[]): string => {\n const tokens: string[] = []\n\n for (const header of headers) {\n tokens.push(\n `${propertyName(header.name)}${\n header.optional ? '?' : ''\n }: ${generateType(header.type)}`\n )\n }\n\n return `{${tokens.join(', ')}}`\n}\n\nexport const serializeValue = (value: unknown): unknown => {\n if (typeof value === 'string') return `'${value}'`\n return value\n}\n","import type { RequestArgs } from '../types'\nimport { generateType } from './common'\n\nexport const generateClientArgs = (args: RequestArgs | undefined): string =>\n generateArgs(args, false)\n\nexport const generateServerArgs = (args: RequestArgs | undefined): string =>\n args ? generateArgs(args, true) : 'args: Req'\n\nconst parts: (keyof RequestArgs)[] = ['body', 'header', 'path', 'query']\n\nconst generateArgs = (\n args: RequestArgs | undefined,\n isServer: boolean\n): string => {\n if (args) {\n const tokens: string[] = []\n for (const part of parts) {\n const arg = args[part]\n if (arg) {\n const partName =\n part === 'path' ? 'params' : part === 'header' ? 'headers' : part\n\n if (partName === 'query' && isServer) {\n tokens.push(\n `${partName}${arg.optional ? '?' : ''}: QueryParams<${generateType(arg)}>`\n )\n } else {\n tokens.push(\n `${partName}${arg.optional ? '?' : ''}: ${wrapArgs(\n generateType(arg),\n isServer && part === 'header'\n )}`\n )\n }\n }\n }\n\n if (!tokens.length) return ''\n\n const optional = argsOptional(args)\n return `args${optional ? '?' : ''}: ${\n isServer ? 'Req & ' : ''\n }{ ${tokens.join(', ')} }, `\n }\n // No params - no args\n return ''\n}\n\nconst wrapArgs = (args: string, wrap: boolean): string => {\n if (!wrap) return args\n return `LowerCaseHeaders<${args}>`\n}\n\nexport const argsOptional = (args: RequestArgs) =>\n // biome-ignore lint/style/noNonNullAssertion: will never be null\n parts.reduce((o, p) => o && (!args[p] || args[p]!.optional), true)\n","import type { Verb } from '@sebspark/openapi-core'\nimport type { Path } from '../types'\nimport { generateClientArgs } from './args'\nimport { generateResponseBody, OR, serializeValue } from './common'\nimport { documentClientPath } from './document'\n\nexport const generateClient = (name: string, paths: Path[]): string => {\n const groupedCalls: Partial<Record<Verb, string[]>> = {}\n for (const path of paths) {\n if (!groupedCalls[path.method]) {\n groupedCalls[path.method] = []\n }\n groupedCalls[path.method]?.push(generateCall(path))\n }\n const client: string[] = []\n\n const methods = Object.keys(groupedCalls).map(serializeValue).join(OR)\n client.push(`export type ${name}Client = Pick<BaseClient, ${methods}> & {`)\n\n Object.entries(groupedCalls).forEach(([method, calls]) => {\n client.push(`${method}: {`)\n client.push(...calls)\n client.push('}')\n })\n\n client.push('}')\n\n return client.join('\\n')\n}\n\nconst generateCall = (path: Path): string => {\n const responses = generateResponses(path)\n return `${documentClientPath(path, responses)}\n (\n url: '${path.url}', ${generateClientArgs(path.args)}opts?: RequestOptions,\n ): Promise<${responses}>`\n}\n\nconst generateResponses = (path: Path): string =>\n Object.entries(path.responses)\n .filter(([code]) => Number.parseInt(code, 10) < 400)\n .map(([, type]) => generateResponseBody(type, false))\n .join(OR)\n","import type { CustomType, Path, ResponseBody } from '../types'\nimport { generateServerArgs } from './args'\nimport { generateResponseBody, OR } from './common'\nimport { documentServerPath } from './document'\n\nexport const generateServer = (name: string, paths: Path[]): string => {\n const tokens: string[] = []\n\n tokens.push(`export type ${name}ServerPaths = {`)\n\n for (const [url, methods] of Object.entries(groupPathsByUrl(paths))) {\n tokens.push(generatePath(url, methods))\n }\n\n tokens.push('}')\n tokens.push('\\n')\n tokens.push(\n `export type ${name}Server = APIServerDefinition & ${name}ServerPaths`\n )\n\n return tokens.join('\\n')\n}\n\nconst groupPathsByUrl = (paths: Path[]): Record<string, Path[]> =>\n paths.reduce(\n (group, path) => {\n if (!group[path.url]) group[path.url] = []\n group[path.url].push(path)\n return group\n },\n {} as Record<string, Path[]>\n )\n\nconst generatePath = (url: string, methods: Path[]): string => `'${url}': {\n ${methods.map(generateMethod).join('\\n')}\n }`\n\nconst generateMethod = (path: Path): string => {\n const responses = generateResponses(path.responses)\n return `${path.method}: {\n ${documentServerPath(path, responses)}\n handler: (${generateServerArgs(path.args)}) => Promise<${responses}>\n pre?: GenericRouteHandler | GenericRouteHandler[]\n }`\n}\n\nconst generateResponses = (\n responses: Record<number, ResponseBody | CustomType>\n): string =>\n Object.entries(responses)\n .filter(([code]) => Number.parseInt(code, 10) < 500)\n .map(([code, response]) =>\n generateResponse(Number.parseInt(code, 10), response)\n )\n .join(OR)\n\nconst generateResponse = (code: number, response: ResponseBody): string =>\n `[${code}, ${generateResponseBody(response)}]`\n","import type {\n ArrayType,\n ParsedComponents,\n ParsedOpenApiDocument,\n} from '../types'\nimport { generateClient } from './client'\nimport { generateHeader, generateResponseBody, generateType } from './common'\nimport { generateServer } from './server'\n\nexport { generateClient } from './client'\nexport { generateType } from './common'\nexport { generateServer } from './server'\n\nexport const generate = (name: string, doc: ParsedOpenApiDocument): string => `\n /**\n * This file was auto-generated.\n * Do not make direct changes to the file.\n */\n\n import type {\n APIResponse,\n APIServerDefinition,\n BaseClient,\n ExpressRequest,\n GenericRouteHandler,\n LowerCaseHeaders,\n PartiallySerialized,\n QueryParams,\n RequestOptions,\n Serialized,\n } from '@sebspark/openapi-core'\n\n type Req = Pick<ExpressRequest, 'url' | 'baseUrl' | 'cookies' | 'hostname'>\n\n /* tslint:disable */\n /* eslint-disable */\n\n ${generateComponents(doc.components)}\n\n ${doc.paths.length ? generateServer(name, doc.paths) : ''}\n\n ${doc.paths.length ? generateClient(name, doc.paths) : ''}\n\n`\n\nconst generateComponents = (components: ParsedComponents): string => {\n const tokens: string[] = []\n\n for (const schema of components.schemas) {\n tokens.push(generateType(schema))\n }\n\n for (const header of components.headers) {\n tokens.push(generateHeader(header))\n }\n\n for (const param of components.parameters) {\n const type = [param.type]\n if (param.type.type === 'array') {\n type.push((param.type as ArrayType).items)\n }\n tokens.push(\n generateType({\n type: 'object',\n name: param.name,\n properties: [\n {\n name: param.parameterName,\n type,\n optional: param.optional,\n },\n ],\n })\n )\n }\n\n for (const req of components.requestBodies) {\n tokens.push(generateType(req))\n }\n\n for (const res of components.responseBodies) {\n tokens.push(generateResponseBody(res))\n }\n\n for (const param of components.securitySchemes) {\n tokens.push(\n generateType({\n type: 'object',\n name: param.name,\n properties: [\n {\n name: param.parameterName,\n type: [param.type],\n optional: param.optional,\n },\n ],\n })\n )\n }\n\n return tokens.join('\\n\\n')\n}\n","import type {\n ComponentsObject,\n HeaderObject,\n ParameterObject,\n RequestBodyObject,\n SchemaObject,\n SecuritySchemeObject,\n} from '@sebspark/openapi-core'\nimport type { EnumType } from '../types'\n\nexport const parseRef = (ref: string): string =>\n ref.substring(ref.lastIndexOf('/') + 1)\n\nexport const parseEnumType = (\n name: string | undefined,\n schema: SchemaObject\n): EnumType => ({ name, type: 'enum', values: schema.enum || [] })\n\ntype SchemaPath =\n | 'schemas'\n | 'parameters'\n | 'headers'\n | 'requestBodies'\n | 'securitySchemes'\ntype SchemaType =\n | SchemaObject\n | ParameterObject\n | HeaderObject\n | RequestBodyObject\n | SecuritySchemeObject\nexport const findRef = <T extends SchemaType>(\n components: ComponentsObject,\n ref: string\n): T => {\n const [, , path, name] = ref.split('/')\n const schemaPath = components[path as SchemaPath]\n if (!schemaPath || !schemaPath[name])\n throw new Error(`Cannot find ref ${ref}`)\n return schemaPath[name] as T\n}\n\ntype Documented = {\n title?: string\n description?: string\n}\nexport const parseDocumentation = (\n source: Partial<Documented>\n): Partial<Documented> => {\n const documented: Documented = {}\n if (source.title) documented.title = source.title\n if (source.description) documented.description = source.description\n return documented\n}\n","import type {\n ReferenceObject,\n SchemaObject,\n SchemaType,\n} from '@sebspark/openapi-core'\nimport type {\n ArrayType,\n CustomType,\n EnumType,\n ObjectType,\n Primitive,\n PrimitiveType,\n Property,\n RecordType,\n TypeDefinition,\n} from '../types'\nimport { parseDocumentation, parseEnumType, parseRef } from './common'\n\nexport const parseSchemas = (\n schemas: Record<string, SchemaObject> = {}\n): TypeDefinition[] =>\n Object.entries(schemas || {}).map(([name, schema]) =>\n parseSchema(name, schema)\n )\n\nconst marshall = (\n type: Omit<SchemaType, 'object' | 'array'>,\n format: string | undefined\n): Primitive => {\n if (type === 'integer') {\n return 'number'\n }\n if (type === 'string' && (format === 'date' || format === 'date-time')) {\n return 'Date'\n }\n return type as Primitive\n}\n\nexport const parseSchema = (\n name: string | undefined,\n schemaOrRef: SchemaObject | ReferenceObject,\n generateDocs = true\n): TypeDefinition => {\n const ref = (schemaOrRef as ReferenceObject).$ref\n if (ref) {\n return { name, type: parseRef(ref) }\n }\n\n const schema = schemaOrRef as SchemaObject\n switch (schema.type) {\n case 'array':\n return parseArraySchema(name, schema)\n case 'boolean':\n case 'integer':\n case 'number':\n case 'string':\n return schema.enum\n ? parseEnumType(name, schema)\n : name\n ? { name, type: marshall(schema.type, schema.format) }\n : parsePropertyType(schema, generateDocs)[0]\n default:\n return parseObjectSchema(name, schema)\n }\n}\n\nconst parseObjectSchema = (\n name: string | undefined,\n schema: SchemaObject\n): ObjectType => {\n const type: ObjectType = {\n name,\n type: 'object',\n properties: [],\n ...parseDocumentation(schema),\n }\n if (schema.properties) {\n type.properties = Object.entries(schema.properties).map(\n ([name, property]) => parseProperty(name, property, schema.required || [])\n )\n }\n if (schema.allOf) {\n type.allOf = schema.allOf.flatMap((s) => parsePropertyType(s))\n }\n if (schema.oneOf) {\n type.oneOf = schema.oneOf.flatMap((s) => parsePropertyType(s))\n }\n if (schema.anyOf) {\n type.oneOf = schema.anyOf.flatMap((s) => parsePropertyType(s))\n }\n if (schema.discriminator?.mapping) {\n const mapping: Record<string, CustomType> = {}\n for (const [prop, ref] of Object.entries(schema.discriminator.mapping)) {\n mapping[prop] = { type: parseRef(ref) }\n }\n type.discriminator = {\n propertyName: schema.discriminator.propertyName,\n mapping,\n }\n }\n if (schema.additionalProperties) {\n const record = parseAdditionalProperties(schema.additionalProperties)\n if (!type.allOf) {\n type.allOf = []\n }\n type.allOf.push(record)\n }\n return type\n}\n\nconst parseAdditionalProperties = (\n schema: true | SchemaObject | ReferenceObject\n): RecordType => {\n let items: TypeDefinition\n if (schema === true) {\n items = { type: 'undefined' } as PrimitiveType\n } else {\n items = parseSchema(undefined, schema)\n }\n return {\n type: 'record',\n items,\n } as RecordType\n}\n\nconst parseArraySchema = (\n name: string | undefined,\n schema: SchemaObject\n): ArrayType => {\n if (schema.type !== 'array') throw new Error('Not an array')\n return {\n name,\n type: 'array',\n items: schema.items\n ? parseSchema(undefined, schema.items, false)\n : { type: 'unknown' },\n ...parseDocumentation(schema),\n }\n}\n\nexport const parseProperty = (\n name: string,\n schema: SchemaObject | ReferenceObject,\n required: string[]\n): Property => {\n const property: Property = {\n name,\n optional: !required.includes(name),\n type: parsePropertyType(schema),\n ...parseDocumentation(schema as SchemaObject),\n }\n\n return property\n}\n\nconst parsePropertyType = (\n property: SchemaObject | ReferenceObject,\n generateDocs = true\n): TypeDefinition[] => {\n const ref = (property as ReferenceObject).$ref\n\n if (ref) {\n return [{ type: parseRef(ref) }]\n }\n const schemaObject = property as SchemaObject\n const docs = generateDocs ? parseDocumentation(schemaObject) : {}\n if (schemaObject.enum) {\n const enumType: EnumType = {\n type: 'enum',\n values: schemaObject.enum,\n ...docs,\n }\n return [enumType]\n }\n if (schemaObject.type) {\n return (\n Array.isArray(schemaObject.type) ? schemaObject.type : [schemaObject.type]\n ).map((type) => {\n switch (type) {\n case 'array': {\n return parseArraySchema(undefined, schemaObject)\n }\n case 'object': {\n return parseObjectSchema(undefined, schemaObject)\n }\n default: {\n return {\n type: marshall(type, schemaObject.format),\n ...docs,\n }\n }\n }\n })\n }\n if (schemaObject.allOf) {\n const types: TypeDefinition[] = []\n for (const allOf of schemaObject.allOf) {\n const type = parseSchema(undefined, allOf)\n delete type.name\n types.push(type)\n }\n return types\n }\n\n return []\n}\n","import type { HeaderObject } from '@sebspark/openapi-core'\nimport type { Header } from '../types'\nimport { parseDocumentation } from './common'\nimport { parseSchema } from './schema'\n\nexport const parseHeaders = (\n schemas: Record<string, HeaderObject> = {}\n): Header[] =>\n Object.entries(schemas || {}).map(([name, schema]) =>\n parseHeader(name, schema)\n )\n\nexport const parseHeader = (name: string, schema: HeaderObject): Header => {\n const header: Header = {\n name,\n optional: !schema.required,\n // biome-ignore lint/style/noNonNullAssertion: here it is always defined\n type: parseSchema(undefined, schema.schema!),\n ...parseDocumentation(schema),\n }\n\n return header\n}\n","import type { ParameterObject } from '@sebspark/openapi-core'\nimport type { Parameter } from '../types'\nimport { parseDocumentation } from './common'\nimport { parseSchema } from './schema'\n\nexport const parseParameters = (\n schemas: Record<string, ParameterObject> = {}\n): Parameter[] =>\n Object.entries(schemas || {}).map(([name, schema]) =>\n parseParameter(name, schema)\n )\n\nexport const parseParameter = (\n name: string | undefined,\n schema: ParameterObject\n): Parameter => {\n const param: Parameter = {\n name,\n in: schema.in,\n parameterName: schema.name,\n optional: !schema.required,\n // biome-ignore lint/style/noNonNullAssertion: schema is always defined here\n type: parseSchema(undefined, schema.schema!),\n ...parseDocumentation(schema),\n }\n\n return param\n}\n","import type {\n ComponentsObject,\n HeaderObject,\n OperationObject,\n ParameterObject,\n ReferenceObject,\n RequestBodyObject,\n SchemaObject,\n SecurityRequirementObject,\n SecuritySchemeObject,\n} from '@sebspark/openapi-core'\nimport type { Args, ObjectType, RequestArgs } from '../types'\nimport { findRef, parseDocumentation, parseRef } from './common'\nimport { parseSchema } from './schema'\n\nexport const parseArgs = (\n path: OperationObject,\n components?: ComponentsObject\n): RequestArgs | undefined => {\n // No parameters and no requestBody - no args\n if (!path.parameters?.length && !path.security?.length && !path.requestBody)\n return undefined\n\n const args: RequestArgs = joinArgs([\n parseParameters(path.parameters, components),\n parseSecurity(path.security, components),\n parseRequestBody(path.requestBody, components),\n ])\n\n return args\n}\n\nconst createArgs = (initializer: Partial<Args> = {}): Args => ({\n type: 'object',\n properties: [],\n optional: true,\n ...initializer,\n})\n\nconst joinArgs = (args: RequestArgs[]): RequestArgs => {\n const reqArg: RequestArgs = {}\n for (const arg of args) {\n for (const [prop, val] of Object.entries(arg)) {\n const key = prop as keyof RequestArgs\n if (reqArg[key]) {\n reqArg[key] = joinArg(reqArg[key] as Args, val)\n } else {\n reqArg[key] = val\n }\n }\n }\n return reqArg\n}\n\nconst joinArg = (arg1: Args, arg2: Args): Args => {\n const arg: Args = {\n type: 'object',\n optional: arg1.optional && arg2.optional,\n properties: arg1.properties.concat(arg2.properties),\n }\n if (arg1.allOf || arg2.allOf)\n arg.allOf = (arg1.allOf || []).concat(arg2.allOf || [])\n if (arg1.anyOf || arg2.anyOf)\n arg.anyOf = (arg1.anyOf || []).concat(arg2.anyOf || [])\n if (arg1.oneOf || arg2.oneOf)\n arg.oneOf = (arg1.oneOf || []).concat(arg2.oneOf || [])\n\n if (arg1.description || arg2.description)\n arg.description = arg1.description || arg2.description\n if (arg1.title || arg2.title) arg.title = arg1.title || arg2.title\n\n return arg\n}\n\nconst parseSecurity = (\n security: SecurityRequirementObject[] = [],\n components: ComponentsObject = {}\n): RequestArgs => {\n const args: RequestArgs = {}\n for (const secReq of security) {\n for (const [name] of Object.entries(secReq)) {\n const param = findRef<SecuritySchemeObject>(\n components,\n `#/components/securitySchemes/${name}`\n )\n const arg = args.header || createArgs({ ...parseDocumentation(param) })\n arg.optional = false\n if (!arg.allOf) arg.allOf = []\n arg.allOf.push({ type: parseRef(name) })\n args.header = arg\n }\n }\n return args\n}\n\nconst parseParameters = (\n parameters: (ParameterObject | ReferenceObject)[] = [],\n components: ComponentsObject = {}\n): RequestArgs => {\n const args: RequestArgs = {}\n\n for (const p of parameters) {\n const ref = (p as ReferenceObject).$ref\n if (ref) {\n const part = ref.split('/')[2] as keyof ComponentsObject\n switch (part) {\n case 'parameters': {\n const param = findRef<ParameterObject>(components, ref)\n const arg =\n args[param.in] || createArgs({ ...parseDocumentation(param) })\n arg.optional = arg.optional && !param.required\n\n if (!arg.allOf) arg.allOf = []\n arg.allOf.push({ type: parseRef(ref) })\n\n args[param.in] = arg\n break\n }\n case 'headers': {\n const header = findRef<HeaderObject>(components, ref)\n const arg = args.header || createArgs()\n const name = parseRef(ref)\n arg.properties.push({\n name,\n optional: !header.required,\n // biome-ignore lint/style/noNonNullAssertion: schema is never null here\n type: [{ type: parseSchema(undefined, header.schema!).type }],\n ...parseDocumentation((header.schema || {}) as SchemaObject),\n })\n args.header = arg\n break\n }\n }\n } else {\n const param = p as ParameterObject\n const arg = args[param.in] || createArgs({ ...parseDocumentation(param) })\n\n arg.properties.push({\n name: param.name,\n optional: !param.required,\n type: [parseSchema(undefined, param.schema as SchemaObject)],\n })\n\n arg.optional = arg.optional && !param.required\n\n args[param.in] = arg\n }\n }\n\n return args\n}\n\nconst parseRequestBody = (\n requestBody: ReferenceObject | RequestBodyObject | undefined,\n components: ComponentsObject = {}\n): RequestArgs => {\n const args: RequestArgs = {}\n if (!requestBody) return args\n\n const ref = (requestBody as ReferenceObject).$ref\n if (ref) {\n const refBody = findRef<RequestBodyObject>(components, ref)\n args.body = createArgs({\n optional: !refBody.required,\n allOf: [{ type: parseRef(ref) }],\n })\n } else {\n // Inline request body properties\n const body = requestBody as RequestBodyObject\n const bodyArgs: Args =\n args.body ||\n createArgs({ optional: !body.required, ...parseDocumentation(body) })\n\n if (body.content['application/json']) {\n const schema = body.content['application/json'].schema\n if (schema) {\n const parsed = parseSchema(undefined, schema)\n if (parsed.type === 'object') {\n args.body = {\n ...(parsed as ObjectType),\n optional: !body.required,\n }\n } else if (parsed.type) {\n args.body = createArgs({\n optional: !body.required,\n allOf: [parsed],\n ...parseDocumentation(body),\n })\n }\n }\n }\n if (\n bodyArgs.allOf?.length ||\n bodyArgs.oneOf?.length ||\n bodyArgs.properties.length\n ) {\n args.body = bodyArgs\n }\n }\n\n return args\n}\n","import type {\n HeaderObject,\n ReferenceObject,\n ResponseObject,\n} from '@sebspark/openapi-core'\nimport type { CustomType, ResponseBody } from '../types'\nimport { parseDocumentation, parseRef } from './common'\nimport { parseHeader } from './headers'\nimport { parseSchema } from './schema'\n\nexport const parseResponseBodies = (\n responses: Record<string, ResponseObject | ReferenceObject> = {}\n): ResponseBody[] => {\n const bodies: ResponseBody[] = []\n\n for (const [name, b] of Object.entries(responses)) {\n const body = parseResponseBody(name, b)\n bodies.push(body)\n }\n\n return bodies\n}\n\nexport const parseResponseBody = (\n name: string | undefined,\n response: ResponseObject | ReferenceObject\n): ResponseBody | CustomType => {\n const ref = (response as ReferenceObject).$ref\n if (ref) return { type: parseRef(ref) }\n\n const responseObject = response as ResponseObject\n const body: ResponseBody = {}\n if (name) body.name = name\n if (responseObject.description) body.description = responseObject.description\n\n if (responseObject.content?.['application/json']?.schema) {\n const schema = responseObject.content['application/json'].schema\n body.data = parseSchema(undefined, schema)\n }\n if (responseObject.headers) {\n body.headers = []\n for (const [headerName, header] of Object.entries(responseObject.headers)) {\n const ref = (header as ReferenceObject).$ref\n if (ref)\n body.headers.push({\n name: headerName,\n optional: false,\n type: { type: parseRef(ref) },\n ...parseDocumentation(header as HeaderObject),\n })\n else body.headers.push(parseHeader(headerName, header as HeaderObject))\n }\n }\n return body\n}\n","import type {\n ComponentsObject,\n OpenApiDocument,\n OperationObject,\n PathItemObject,\n ResponsesObject,\n Verb,\n} from '@sebspark/openapi-core'\nimport type { Path, TypeDefinition } from '../types'\nimport { parseArgs } from './args'\nimport { parseDocumentation } from './common'\nimport { parseResponseBody } from './responseBodies'\n\nexport const parsePaths = (doc: OpenApiDocument): Path[] =>\n Object.entries(doc.paths || {}).flatMap(([name, path]) =>\n parsePath(name, path as PathItemObject, doc.components)\n )\n\nexport const parsePath = (\n url: string,\n path: PathItemObject,\n components?: ComponentsObject\n): Path[] => {\n const paths: Path[] = []\n const methods: Verb[] = ['delete', 'get', 'patch', 'post', 'put']\n\n for (const method of methods) {\n if (path[method]) {\n paths.push(\n parseMethod(url, method, path[method] as OperationObject, components)\n )\n }\n }\n\n return paths\n}\n\nconst parseMethod = (\n url: string,\n method: Verb,\n operation: OperationObject,\n components?: ComponentsObject\n): Path => {\n return {\n method,\n url: parseUrl(url),\n responses: parseResponses(operation.responses),\n args: parseArgs(operation, components),\n ...parseDocumentation(operation),\n }\n}\n\nconst parseUrl = (url: string): string => url.replace(/{([^}]+)}/g, ':$1')\n\nconst parseResponses = (\n responses: ResponsesObject\n): Record<number, TypeDefinition> => {\n return Object.assign(\n {},\n ...Object.entries(responses).map(([code, response]) => {\n return {\n [Number.parseInt(code, 10)]: parseResponseBody(undefined, response),\n } as Record<number, TypeDefinition>\n })\n )\n}\n","import type { RequestBodyObject } from '@sebspark/openapi-core'\nimport type { TypeDefinition } from '../types'\nimport { parseSchema } from './schema'\n\nexport const parseRequestBodies = (\n requestBodies: Record<string, RequestBodyObject> = {}\n): TypeDefinition[] => {\n const definitions: TypeDefinition[] = []\n for (const [name, requestBody] of Object.entries(requestBodies)) {\n if (requestBody.content['application/json'].schema) {\n definitions.push(\n parseSchema(name, requestBody.content['application/json'].schema)\n )\n }\n }\n return definitions\n}\n","import type { SecuritySchemeObject } from '@sebspark/openapi-core'\nimport type { Parameter } from '../types'\n\nexport const parseSecuritySchemes = (\n schemes: Record<string, SecuritySchemeObject> = {}\n): Parameter[] => {\n const parameters: Parameter[] = []\n for (const [name, scheme] of Object.entries(schemes)) {\n parameters.push(parseSecurityScheme(name, scheme))\n }\n return parameters\n}\n\nexport const parseSecurityScheme = (\n name: string,\n scheme: SecuritySchemeObject\n): Parameter => {\n switch (scheme.type) {\n case 'apiKey':\n return parseApiKey(name, scheme)\n case 'http':\n return parseHttpSecurity(name, scheme)\n case 'oauth2':\n return parseOAuth(name, scheme)\n case 'openIdConnect':\n return parseOpenIdConnect(name, scheme)\n }\n throw new Error(`Unknown security scheme '${scheme.type}'`)\n}\n\nconst parseApiKey = (name: string, scheme: SecuritySchemeObject): Parameter => {\n const _in = scheme.in || 'header'\n const parameterName = scheme.name as string\n return {\n name,\n parameterName,\n in: _in,\n optional: false,\n type: { type: 'string' },\n }\n}\n\nconst parseHttpSecurity = (\n name: string,\n _scheme: SecuritySchemeObject\n): Parameter => ({\n name,\n in: 'header',\n parameterName: 'Authorization',\n optional: false,\n type: { type: 'string' },\n})\n\nconst parseOAuth = (\n name: string,\n _scheme: SecuritySchemeObject\n): Parameter => ({\n name,\n in: 'header',\n parameterName: 'Authorization',\n optional: false,\n type: { type: 'string' },\n})\n\nconst parseOpenIdConnect = (\n name: string,\n _scheme: SecuritySchemeObject\n): Parameter => ({\n name,\n in: 'header',\n parameterName: 'Authorization',\n optional: false,\n type: { type: 'string' },\n})\n","import type { ComponentsObject, OpenApiDocument } from '@sebspark/openapi-core'\nimport type { ParsedComponents, ParsedOpenApiDocument } from '../types'\nimport { parseHeaders } from './headers'\nimport { parseParameters } from './parameters'\nimport { parsePaths } from './paths'\nimport { parseRequestBodies } from './requestBodies'\nimport { parseResponseBodies } from './responseBodies'\nimport { parseSchemas } from './schema'\nimport { parseSecuritySchemes } from './securitySchemes'\n\nexport const parseDocument = (\n schema: OpenApiDocument\n): ParsedOpenApiDocument => ({\n paths: parsePaths(schema),\n components: parseComponents(schema.components),\n})\n\nexport const parseComponents = (\n components: ComponentsObject = {}\n): ParsedComponents => ({\n schemas: parseSchemas(components.schemas),\n headers: parseHeaders(components.headers),\n parameters: parseParameters(components.parameters),\n requestBodies: parseRequestBodies(components.requestBodies),\n responseBodies: parseResponseBodies(components.responses),\n securitySchemes: parseSecuritySchemes(components.securitySchemes),\n})\n","import { mkdir, readdir, readFile, stat, writeFile } from 'node:fs/promises'\nimport { parse, resolve } from 'node:path'\nimport type { OpenApiDocument } from '@sebspark/openapi-core'\nimport { pascalCase } from 'change-case'\nimport * as YAML from 'yaml'\nimport { generate as _generate, format } from './generator/index'\nimport { parseDocument } from './parser/index'\n\nexport const generateTypescript = async (\n name: string,\n doc: OpenApiDocument\n): Promise<string> => {\n const parsed = parseDocument(doc)\n const generated = _generate(name, parsed)\n const formatted = await format(generated)\n\n return formatted\n}\n\nexport const generate = async (\n input: string,\n output?: string\n): Promise<string | undefined> => {\n const docs = await readDocs(input)\n const generated = await generateDocs(docs)\n\n if (!output) return generated.map((d) => d.ts).join('\\n\\n')\n await saveDocs(output, generated)\n}\n\ntype Doc = {\n name: string\n doc: OpenApiDocument\n}\ntype GeneratedDoc = Doc & {\n ts: string\n}\nconst readDocs = async (input: string): Promise<Doc[]> => {\n const path = resolve(input)\n const stats = await stat(path)\n\n const filePaths: string[] = []\n\n if (stats.isFile()) filePaths.push(path)\n if (stats.isDirectory()) {\n const files = await readdir(path)\n filePaths.push(...files.map((f) => resolve(path, f)))\n }\n\n const readFiles: Doc[] = []\n for (const p of filePaths) {\n const { name, ext } = parse(p)\n let doc: OpenApiDocument\n switch (ext) {\n case '.json': {\n console.log(`Reading ${p}`)\n const txt = await readFile(p, 'utf8')\n doc = JSON.parse(txt) as OpenApiDocument\n break\n }\n case '.yml':\n case '.yaml': {\n console.log(`Reading ${p}`)\n const txt = await readFile(p, 'utf8')\n doc = YAML.parse(txt) as OpenApiDocument\n break\n }\n default:\n continue\n }\n readFiles.push({\n doc,\n name,\n })\n }\n return readFiles\n}\n\nconst generateDocs = async (files: Doc[]): Promise<GeneratedDoc[]> => {\n const generated: GeneratedDoc[] = []\n for (const doc of files) {\n console.log(`Generating ${doc.name}`)\n const ts = await generateTypescript(classname(doc.name), doc.doc)\n generated.push({\n ...doc,\n ts,\n })\n }\n return generated\n}\n\nconst saveDocs = async (\n output: string,\n docs: GeneratedDoc[]\n): Promise<void> => {\n const stats = await stat(output)\n const dir = stats.isDirectory() ? output : parse(output).dir\n await mkdir(dir, { recursive: true })\n for (const doc of docs) {\n const path = resolve(dir, `${filename(doc.name)}.ts`)\n console.log(`Writing ${path}`)\n await writeFile(path, doc.ts, 'utf8')\n }\n}\n\nexport const classname = (name: string): string => {\n return pascalCase(name.replace(/\\d+/g, ''))\n}\n\nexport const filename = (name: string): string => {\n return name.replace(/\\./g, '_')\n}\n"],"mappings":";;;;;;AAEA,MAAM,UAAmB;CACvB,QAAQ;CACR,aAAa;CACb,MAAM;CACN,eAAe;CAChB;AAED,MAAaA,WAAS,OAAO,SAC3BC,OAAQ,MAAM,QAAQ;;;ACAxB,MAAa,YAAY,EAAE,OAAO,kBAA4C;AAC5E,KAAI,SAAS,aAAa;EACxB,MAAM,SAAmB,EAAE;AAC3B,SAAO,KAAK,MAAM;AAClB,MAAI,MAAO,QAAO,KAAK,MAAM,QAAQ;AACrC,MAAI,YAAa,QAAO,KAAK,MAAM,cAAc;AACjD,SAAO,KAAK,QAAQ;AACpB,SAAO,OAAO,KAAK,KAAK;;AAE1B,QAAO;;AAGT,MAAa,sBAAsB,MAAY,cAC7C,aACE,MACA,WACA,CAAC,MAAM,OAAO,SAAS,CAAC,EACxB,CAAC,MAAM,QAAQ,kBAAkB,KAAK,CAAC,CACxC;AAEH,MAAa,sBAAsB,MAAY,cAC7C,aAAa,MAAM,UAAU;AAE/B,MAAM,gBACJ,MACA,WACA,aAAuB,EAAE,EACzB,YAAsB,EAAE,KACb;CACX,MAAM,SAAmB,EAAE;AAE3B,QAAO,KAAK,MAAM;AAClB,KAAI,KAAK,MAAO,QAAO,KAAK,MAAM,KAAK,QAAQ;AAC/C,KAAI,KAAK,YAAa,QAAO,KAAK,MAAM,KAAK,cAAc;AAC3D,QAAO,KAAK,KAAK;AACjB,QAAO,KAAK,GAAG,WAAW;AAC1B,KAAI,KAAK,KAAM,QAAO,KAAK,GAAG,aAAa,KAAK,KAAK,CAAC;AACtD,QAAO,KAAK,GAAG,UAAU;AACzB,QAAO,KAAK,wBAAwB,UAAU,IAAI;AAClD,QAAO,KAAK,MAAM;AAElB,QAAO,OAAO,KAAK,KAAK;;AAG1B,MAAM,gBAAgB,SAAgC;CACpD,MAAM,SAAmB,EAAE;AAE3B,QAAO,KACL,MACE,QACA,UACA,aAAa,KAAK,EAClB,iCACD,CACF;AAGD,QAAO,KAAK,GAAG,YAAY,KAAK,MAAM,UAAU,kBAAkB,CAAC;AAEnE,QAAO,KAAK,GAAG,YAAY,KAAK,OAAO,SAAS,mBAAmB,CAAC;AAEpE,QAAO,KAAK,GAAG,YAAY,KAAK,QAAQ,WAAW,UAAU,CAAC;AAE9D,QAAO,KAAK,GAAG,YAAY,KAAK,MAAM,QAAQ,eAAe,CAAC;AAE9D,QAAO;;AAGT,MAAM,aAAa,MAAc,aAC/B,iBAAiB,KAAK,SAAS,GAC3B,GAAG,KAAK,GAAG,aACX,GAAG,KAAK,IAAI,SAAS;AAE3B,MAAM,eACJ,MACA,MACA,UACa;AACb,KAAI,CAAC,KAAM,QAAO,EAAE;CAEpB,MAAM,SAAmB,EAAE;CAC3B,MAAM,QAAQ,KAAK,SAAS,EAAE,EAAE,KAAK,MAAM,EAAE,KAAK,CAAC,KAAA,MAAS,IAAI;AAChE,QAAO,KACL,MACE,UAAU,QAAQ,KAAK,EACvB,MACA,KAAK,UACL,GAAG,MAAM,mBACV,CACF;CACD,MAAM,aAAa,KAAK,WAAW,SAAS,SAC1C,gBAAgB,UAAU,QAAQ,KAAK,EAAE,KAAK,CAC/C;AACD,QAAO,KAAK,GAAG,WAAW;AAC1B,QAAO;;AAGT,MAAM,mBAAmB,MAAc,aAAiC;CACtE,MAAM,SAAmB,EAAE;CAE3B,MAAM,OAAO,SAAS,KAAK,KAAK,MAAM,EAAE,KAAK,CAAC,KAAA,MAAQ;AACtD,QAAO,KACL,MACE,UAAU,MAAM,SAAS,KAAK,EAC9B,MACA,SAAS,UACT,SAAS,OACT,SAAS,YACV,CACF;AAED,QAAO;;AAGT,MAAM,SACJ,MACA,MACA,WAAW,OACX,QAAQ,IACR,cAAc,OACH;CACX,MAAM,SAAmB,EAAE;AAE3B,QAAO,KACL,cAAc,KAAK,IAAI,WAAW,MAAM,KAAK,OAAO,WAAW,MAAM,KACtE;AACD,KAAI,YAAY,SAAS,aAAa;AACpC,SAAO,KAAK,KAAK;AACjB,MAAI,SAAU,QAAO,KAAK,aAAa;AACvC,MAAI,MAAO,QAAO,KAAK,IAAI,QAAQ;AACnC,MAAI,YAAa,QAAO,KAAK,IAAI,cAAc;;AAGjD,QAAO,OAAO,KAAK,GAAG;;AC1HxB,MAAa,gBAAgB,WAAmC;CAC9D,IAAI;AACJ,SAAQ,OAAO,MAAf;EACE,KAAK;AACH,UAAO,aAAa,OAAmB;AACvC;EAEF,KAAK;AACH,UAAO,cAAc,OAAoB;AACzC;EAEF,KAAK;AACH,UAAO,eAAe,OAAqB;AAC3C;EAEF,KAAK;AACH,UAAO,eAAe,OAAqB;AAC3C;EAEF,KAAK;AACH,UAAO,gBAAgB,OAAsB;AAC7C;EAEF,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;AACH,UAAO,kBAAkB,OAAwB;AACjD;EACF,QACE,QAAO,eAAe,OAAqB;;AAG/C,QAAO,KAAK,QAAQ,kBAAkB,GAAG;;AAG3C,MAAa,oBAAoB,aAA+B;CAC9D,MAAM,QAAQ,SAAS,KAAK,IAAI,aAAa;AAC7C,QAAO,GAAG,SAAS,SAAS,GAAG,aAAa,SAAS,KAAK,GACxD,SAAS,WAAW,MAAM,GAC3B,IAAI,MAAM,KAAA,MAAQ,IAAI;;AAGzB,MAAa,YAAY,SACvB,KAAK,OAAO,GAAG,SAAS,KAAK,CAAC,cAAc,SAAS,KAAK,KAAK,CAAC,OAAO;AAEzE,MAAa,mBAAmB;AAEhC,MAAM,eAAe,SAA0B;CAC7C,MAAM,wBACJ;CACF,MAAM,wBAAwB;AAG9B,KAAI,CAAC,sBAAsB,KAAK,KAAK,CAAE,QAAO;AAE9C,KAAI,CAAC,sBAAsB,KAAK,KAAK,CACnC,QAAO;AAIT,KAAI,KAAK,OAAO,KAAK,GAAG,aAAa,IAAI,CAAC,KAAK,SAAS,IAAI,CAC1D,QAAO;AAGT,QAAO;;AAGT,MAAa,YAAY,SAAyB;AAEhD,KAAI,YAAY,KAAK,CACnB,QAAO;AAGT,KAAI,KAAK,SAAS,IAAI,CACpB,QAAO,KAAK,QACV,cACC,QAAQ,mBAAmB,IAAI,SAAS,eAAe,CAAC,GAC1D;CAIH,MAAM,yBAAyB,KAC5B,MAAM,IAAI,CACV,KAAK,MAAM,OAAO,UAAU;AAE3B,MAAI,UAAU,MAAM,SAAS,EAC3B,QAAO,WAAW,KAAK;AAEzB,SAAO;GACP,CACD,KAAK,IAAI;CAGZ,MAAM,wBAAwB,uBAAuB,MAAM,MAAM,GAC7D,IAAI,2BACJ;CAGJ,MAAM,YAAY,sBAAsB,SAAS,IAAI,GACjD,wBACA,WAAW,sBAAsB;AAKrC,KAAI,UAAU,SAAS,IAAI,EAAE;EAE3B,MAAM,sBAAsB,UAAU,YAAY,IAAI;AACtD,MACE,wBAAwB,MACxB,sBAAsB,UAAU,SAAS,EAEzC,QACE,UAAU,UAAU,GAAG,sBAAsB,EAAE,GAC/C,UAAU,OAAO,sBAAsB,EAAE,CAAC,aAAa,GACvD,UAAU,MAAM,sBAAsB,EAAE;AAG5C,SAAO;;AAGT,QAAO,UAAU,OAAO,EAAE,CAAC,aAAa,GAAG,UAAU,MAAM,EAAE;;AAG/D,MAAa,gBAAgB,SAAyB;AACpD,KAAI,iBAAiB,KAAK,KAAK,QAAQ,OAAO,IAAI,CAAC,CACjD,QAAO,KAAK,QAAQ,OAAO,IAAI;AACjC,QAAO,IAAI,KAAK,QAAQ,OAAO,IAAI,CAAC;;AAGtC,MAAa,cAAc,UACxB,KAAK,SAAS,EAAE,EAAE,IAAI,aAAa,CAAC,OAAO,GAAG,CAAC,KAAA,MAAS,IACxD,KAAK,SAAS,EAAE,EAAE,IAAI,aAAa,CAAC,OAAO,GAAG,CAAC,KAAA,MAAQ;AAE1D,MAAa,qBAAqB,WAChC,GAAG,SAAS,OAAO,GAAG,OAAO;AAE/B,MAAa,kBAAkB,WAC7B,GAAG,SAAS,OAAO,GAAG,SAAS,OAAO,KAAK;AAE7C,MAAa,mBAAmB,WAC9B,GAAG,SAAS,OAAO,CAAC;AAEtB,MAAa,kBAAkB,WAA+B;CAC5D,MAAM,QAAkB,EAAE;AAC1B,OAAM,KAAK,GAAG,SAAS,OAAO,GAAG,WAAW,OAAO,CAAC,GAAG;AACvD,OAAM,KAAK,GAAG,OAAO,WAAW,IAAI,iBAAiB,CAAC;AACtD,OAAM,KAAK,IAAI;AAEf,KAAI,OAAO,iBAAiB,OAAO,KACjC,OAAM,KAAK,sBAAsB,OAAO,eAAe,OAAO,KAAK,CAAC;AAGtE,QAAO,MAAM,KAAK,KAAK;;AAGzB,MAAa,kBAAkB,WAA+B;AAG5D,QAAO,kBADL,OAAO,MAAM,SAAS,cAAc,YAAY,aAAa,OAAO,MAAM,CAC1C;;AAGpC,MAAM,yBACJ,eACA,SACW;CACX,MAAM,QAAkB,CAAC,GAAG;AAC5B,OAAM,KAAK,eAAe,KAAK,mBAAmB;AAClD,MAAK,MAAM,CAAC,KAAK,SAAS,OAAO,QAAQ,cAAc,QAAQ,CAC7D,OAAM,KAAK,GAAG,IAAI,IAAI,KAAK,OAAO;AAEpC,OAAM,KAAK,IAAI;AACf,QAAO,MAAM,KAAK,KAAK;;AAGzB,MAAa,iBAAiB,WAA8B;CAC1D,MAAM,QAAkB,EAAE;CAC1B,IAAI,QAAQ,aAAa,OAAO,MAAM;AACtC,KACE,OAAO,MAAM,SAAS,UACtB,WAAW,OAAO,SAClB,WAAW,OAAO,MAElB,SAAQ,IAAI,MAAM;AAEpB,OAAM,KAAK,GAAG,SAAS,OAAO,GAAG,MAAM,IAAI;AAC3C,QAAO,MAAM,KAAK,KAAK;;AAGzB,MAAa,gBAAgB,WAA6B;AACxD,KAAI,OAAO,MAAM;EACf,MAAM,SAAS,OAAO,OAAO,IAAI,eAAe,CAAC,KAAK,KAAK;EAC3D,MAAM,aAAa,aAAa,GAAG,OAAO,KAAK,SAAS;AACxD,SAAO,CACL,gBAAgB,WAAW,MAAM,OAAO,aACxC,GAAG,SAAS,OAAO,CAAC,SAAS,WAAW,UACzC,CAAC,KAAK,KAAK;;AAGd,QAAO,GAAG,SAAS,OAAO,GAAG,OAAO,OAAO,IAAI,eAAe,CAAC,KAAA,MAAQ;;AAGzE,MAAa,kBAAkB,WAA2B;AACxD,QAAO,GAAG,SAAS,OAAO,CAAC,IAAI,aAAa,OAAO,KAAK,GACtD,OAAO,WAAW,MAAM,GACzB,IAAI,aAAa,OAAO,KAAK,CAAC;;AAGjC,MAAa,wBACX,MACA,WAAW,SACA;CACX,MAAM,aAAc,KAAoB;AACxC,KAAI,WAAY,QAAO,SAAS,WAAW;CAE3C,MAAM,OAAO;AACb,KAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,QAAS,QAAO;CAExC,MAAM,SAAmB,EAAE;AAC3B,QAAO,KAAK,SAAS,KAAK,CAAC;AAC3B,QAAO,KAAK,eAAe;AAC3B,QAAO,KACL,KAAK,OAAO,aAAa,WAAW,KAAK,MAAM,SAAS,CAAC,GAAG,YAC7D;AACD,KAAI,KAAK,SAAS;AAChB,SAAO,KAAK,KAAK;AACjB,SAAO,KAAK,KAAK,UAAU,gBAAgB,KAAK,QAAQ,GAAG,YAAY;;AAEzE,QAAO,KAAK,IAAI;AAChB,QAAO,OAAO,KAAK,GAAG;;AAGxB,MAAM,cAAc,MAAsB,WAAW,SAAyB;AAC5E,SAAQ,KAAK,MAAb;EACE,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,YACH,QAAO;EAET,KAAK,OACH,QAAO;GAAE,GAAG;GAAM,MAAM;GAAU;EAEpC,KAAK,QACH,QAAO;GACL,GAAG;GACH,OAAO,WAAY,KAAmB,OAAO,SAAS;GACvD;EAEH,KAAK,SACH,QAAO;EAET,SAAS;GACP,MAAM,UAAU,WAAW,wBAAwB;AACnD,UAAO;IAAE,GAAG;IAAM,MAAM,GAAG,QAAQ,GAAG,SAAS,KAAK,KAAK,CAAC;IAAI;;;;AAKpE,MAAa,mBAAmB,YAA8B;CAC5D,MAAM,SAAmB,EAAE;AAE3B,MAAK,MAAM,UAAU,QACnB,QAAO,KACL,GAAG,aAAa,OAAO,KAAK,GAC1B,OAAO,WAAW,MAAM,GACzB,IAAI,aAAa,OAAO,KAAK,GAC/B;AAGH,QAAO,IAAI,OAAO,KAAK,KAAK,CAAC;;AAG/B,MAAa,kBAAkB,UAA4B;AACzD,KAAI,OAAO,UAAU,SAAU,QAAO,IAAI,MAAM;AAChD,QAAO;;;;AC9ST,MAAa,sBAAsB,SACjC,aAAa,MAAM,MAAM;AAE3B,MAAa,sBAAsB,SACjC,OAAO,aAAa,MAAM,KAAK,GAAG;AAEpC,MAAM,QAA+B;CAAC;CAAQ;CAAU;CAAQ;CAAQ;AAExE,MAAM,gBACJ,MACA,aACW;AACX,KAAI,MAAM;EACR,MAAM,SAAmB,EAAE;AAC3B,OAAK,MAAM,QAAQ,OAAO;GACxB,MAAM,MAAM,KAAK;AACjB,OAAI,KAAK;IACP,MAAM,WACJ,SAAS,SAAS,WAAW,SAAS,WAAW,YAAY;AAE/D,QAAI,aAAa,WAAW,SAC1B,QAAO,KACL,GAAG,WAAW,IAAI,WAAW,MAAM,GAAG,gBAAgB,aAAa,IAAI,CAAC,GACzE;QAED,QAAO,KACL,GAAG,WAAW,IAAI,WAAW,MAAM,GAAG,IAAI,SACxC,aAAa,IAAI,EACjB,YAAY,SAAS,SACtB,GACF;;;AAKP,MAAI,CAAC,OAAO,OAAQ,QAAO;AAG3B,SAAO,OADU,aAAa,KAAK,GACV,MAAM,GAAG,IAChC,WAAW,WAAW,GACvB,IAAI,OAAO,KAAK,KAAK,CAAC;;AAGzB,QAAO;;AAGT,MAAM,YAAY,MAAc,SAA0B;AACxD,KAAI,CAAC,KAAM,QAAO;AAClB,QAAO,oBAAoB,KAAK;;AAGlC,MAAa,gBAAgB,SAE3B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,MAAM,KAAK,GAAI,WAAW,KAAK;;;AClDpE,MAAa,kBAAkB,MAAc,UAA0B;CACrE,MAAM,eAAgD,EAAE;AACxD,MAAK,MAAM,QAAQ,OAAO;AACxB,MAAI,CAAC,aAAa,KAAK,QACrB,cAAa,KAAK,UAAU,EAAE;AAEhC,eAAa,KAAK,SAAS,KAAK,aAAa,KAAK,CAAC;;CAErD,MAAM,SAAmB,EAAE;CAE3B,MAAM,UAAU,OAAO,KAAK,aAAa,CAAC,IAAI,eAAe,CAAC,KAAA,MAAQ;AACtE,QAAO,KAAK,eAAe,KAAK,4BAA4B,QAAQ,OAAO;AAE3E,QAAO,QAAQ,aAAa,CAAC,SAAS,CAAC,QAAQ,WAAW;AACxD,SAAO,KAAK,GAAG,OAAO,KAAK;AAC3B,SAAO,KAAK,GAAG,MAAM;AACrB,SAAO,KAAK,IAAI;GAChB;AAEF,QAAO,KAAK,IAAI;AAEhB,QAAO,OAAO,KAAK,KAAK;;AAG1B,MAAM,gBAAgB,SAAuB;CAC3C,MAAM,YAAYC,oBAAkB,KAAK;AACzC,QAAO,GAAG,mBAAmB,MAAM,UAAU,CAAC;;YAEpC,KAAK,IAAI,KAAK,mBAAmB,KAAK,KAAK,CAAC;eACzC,UAAU;;AAGzB,MAAMA,uBAAqB,SACzB,OAAO,QAAQ,KAAK,UAAU,CAC3B,QAAQ,CAAC,UAAU,OAAO,SAAS,MAAM,GAAG,GAAG,IAAI,CACnD,KAAK,GAAG,UAAU,qBAAqB,MAAM,MAAM,CAAC,CACpD,KAAA,MAAQ;;;ACrCb,MAAa,kBAAkB,MAAc,UAA0B;CACrE,MAAM,SAAmB,EAAE;AAE3B,QAAO,KAAK,eAAe,KAAK,iBAAiB;AAEjD,MAAK,MAAM,CAAC,KAAK,YAAY,OAAO,QAAQ,gBAAgB,MAAM,CAAC,CACjE,QAAO,KAAK,aAAa,KAAK,QAAQ,CAAC;AAGzC,QAAO,KAAK,IAAI;AAChB,QAAO,KAAK,KAAK;AACjB,QAAO,KACL,eAAe,KAAK,iCAAiC,KAAK,aAC3D;AAED,QAAO,OAAO,KAAK,KAAK;;AAG1B,MAAM,mBAAmB,UACvB,MAAM,QACH,OAAO,SAAS;AACf,KAAI,CAAC,MAAM,KAAK,KAAM,OAAM,KAAK,OAAO,EAAE;AAC1C,OAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,QAAO;GAET,EAAE,CACH;AAEH,MAAM,gBAAgB,KAAa,YAA4B,IAAI,IAAI;MACjE,QAAQ,IAAI,eAAe,CAAC,KAAK,KAAK,CAAC;;AAG7C,MAAM,kBAAkB,SAAuB;CAC7C,MAAM,YAAY,kBAAkB,KAAK,UAAU;AACnD,QAAO,GAAG,KAAK,OAAO;QAChB,mBAAmB,MAAM,UAAU,CAAC;kBAC1B,mBAAmB,KAAK,KAAK,CAAC,eAAe,UAAU;;;;AAKzE,MAAM,qBACJ,cAEA,OAAO,QAAQ,UAAU,CACtB,QAAQ,CAAC,UAAU,OAAO,SAAS,MAAM,GAAG,GAAG,IAAI,CACnD,KAAK,CAAC,MAAM,cACX,iBAAiB,OAAO,SAAS,MAAM,GAAG,EAAE,SAAS,CACtD,CACA,KAAA,MAAQ;AAEb,MAAM,oBAAoB,MAAc,aACtC,IAAI,KAAK,IAAI,qBAAqB,SAAS,CAAC;;;AC5C9C,MAAaC,cAAY,MAAc,QAAuC;;;;;;;;;;;;;;;;;;;;;;;;GAwB3E,mBAAmB,IAAI,WAAW,CAAC;;GAEnC,IAAI,MAAM,SAAS,eAAe,MAAM,IAAI,MAAM,GAAG,GAAG;;GAExD,IAAI,MAAM,SAAS,eAAe,MAAM,IAAI,MAAM,GAAG,GAAG;;;AAI3D,MAAM,sBAAsB,eAAyC;CACnE,MAAM,SAAmB,EAAE;AAE3B,MAAK,MAAM,UAAU,WAAW,QAC9B,QAAO,KAAK,aAAa,OAAO,CAAC;AAGnC,MAAK,MAAM,UAAU,WAAW,QAC9B,QAAO,KAAK,eAAe,OAAO,CAAC;AAGrC,MAAK,MAAM,SAAS,WAAW,YAAY;EACzC,MAAM,OAAO,CAAC,MAAM,KAAK;AACzB,MAAI,MAAM,KAAK,SAAS,QACtB,MAAK,KAAM,MAAM,KAAmB,MAAM;AAE5C,SAAO,KACL,aAAa;GACX,MAAM;GACN,MAAM,MAAM;GACZ,YAAY,CACV;IACE,MAAM,MAAM;IACZ;IACA,UAAU,MAAM;IACjB,CACF;GACF,CAAC,CACH;;AAGH,MAAK,MAAM,OAAO,WAAW,cAC3B,QAAO,KAAK,aAAa,IAAI,CAAC;AAGhC,MAAK,MAAM,OAAO,WAAW,eAC3B,QAAO,KAAK,qBAAqB,IAAI,CAAC;AAGxC,MAAK,MAAM,SAAS,WAAW,gBAC7B,QAAO,KACL,aAAa;EACX,MAAM;EACN,MAAM,MAAM;EACZ,YAAY,CACV;GACE,MAAM,MAAM;GACZ,MAAM,CAAC,MAAM,KAAK;GAClB,UAAU,MAAM;GACjB,CACF;EACF,CAAC,CACH;AAGH,QAAO,OAAO,KAAK,OAAO;;;;AC1F5B,MAAa,YAAY,QACvB,IAAI,UAAU,IAAI,YAAY,IAAI,GAAG,EAAE;AAEzC,MAAa,iBACX,MACA,YACc;CAAE;CAAM,MAAM;CAAQ,QAAQ,OAAO,QAAQ,EAAE;CAAE;AAcjE,MAAa,WACX,YACA,QACM;CACN,MAAM,KAAK,MAAM,QAAQ,IAAI,MAAM,IAAI;CACvC,MAAM,aAAa,WAAW;AAC9B,KAAI,CAAC,cAAc,CAAC,WAAW,MAC7B,OAAM,IAAI,MAAM,mBAAmB,MAAM;AAC3C,QAAO,WAAW;;AAOpB,MAAa,sBACX,WACwB;CACxB,MAAM,aAAyB,EAAE;AACjC,KAAI,OAAO,MAAO,YAAW,QAAQ,OAAO;AAC5C,KAAI,OAAO,YAAa,YAAW,cAAc,OAAO;AACxD,QAAO;;;;ACjCT,MAAa,gBACX,UAAwC,EAAE,KAE1C,OAAO,QAAQ,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,YACxC,YAAY,MAAM,OAAO,CAC1B;AAEH,MAAM,YACJ,MACA,WACc;AACd,KAAI,SAAS,UACX,QAAO;AAET,KAAI,SAAS,aAAa,WAAW,UAAU,WAAW,aACxD,QAAO;AAET,QAAO;;AAGT,MAAa,eACX,MACA,aACA,eAAe,SACI;CACnB,MAAM,MAAO,YAAgC;AAC7C,KAAI,IACF,QAAO;EAAE;EAAM,MAAM,SAAS,IAAI;EAAE;CAGtC,MAAM,SAAS;AACf,SAAQ,OAAO,MAAf;EACE,KAAK,QACH,QAAO,iBAAiB,MAAM,OAAO;EACvC,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,SACH,QAAO,OAAO,OACV,cAAc,MAAM,OAAO,GAC3B,OACE;GAAE;GAAM,MAAM,SAAS,OAAO,MAAM,OAAO,OAAO;GAAE,GACpD,kBAAkB,QAAQ,aAAa,CAAC;EAChD,QACE,QAAO,kBAAkB,MAAM,OAAO;;;AAI5C,MAAM,qBACJ,MACA,WACe;CACf,MAAM,OAAmB;EACvB;EACA,MAAM;EACN,YAAY,EAAE;EACd,GAAG,mBAAmB,OAAO;EAC9B;AACD,KAAI,OAAO,WACT,MAAK,aAAa,OAAO,QAAQ,OAAO,WAAW,CAAC,KACjD,CAAC,MAAM,cAAc,cAAc,MAAM,UAAU,OAAO,YAAY,EAAE,CAAC,CAC3E;AAEH,KAAI,OAAO,MACT,MAAK,QAAQ,OAAO,MAAM,SAAS,MAAM,kBAAkB,EAAE,CAAC;AAEhE,KAAI,OAAO,MACT,MAAK,QAAQ,OAAO,MAAM,SAAS,MAAM,kBAAkB,EAAE,CAAC;AAEhE,KAAI,OAAO,MACT,MAAK,QAAQ,OAAO,MAAM,SAAS,MAAM,kBAAkB,EAAE,CAAC;AAEhE,KAAI,OAAO,eAAe,SAAS;EACjC,MAAM,UAAsC,EAAE;AAC9C,OAAK,MAAM,CAAC,MAAM,QAAQ,OAAO,QAAQ,OAAO,cAAc,QAAQ,CACpE,SAAQ,QAAQ,EAAE,MAAM,SAAS,IAAI,EAAE;AAEzC,OAAK,gBAAgB;GACnB,cAAc,OAAO,cAAc;GACnC;GACD;;AAEH,KAAI,OAAO,sBAAsB;EAC/B,MAAM,SAAS,0BAA0B,OAAO,qBAAqB;AACrE,MAAI,CAAC,KAAK,MACR,MAAK,QAAQ,EAAE;AAEjB,OAAK,MAAM,KAAK,OAAO;;AAEzB,QAAO;;AAGT,MAAM,6BACJ,WACe;CACf,IAAI;AACJ,KAAI,WAAW,KACb,SAAQ,EAAE,MAAM,aAAa;KAE7B,SAAQ,YAAY,KAAA,GAAW,OAAO;AAExC,QAAO;EACL,MAAM;EACN;EACD;;AAGH,MAAM,oBACJ,MACA,WACc;AACd,KAAI,OAAO,SAAS,QAAS,OAAM,IAAI,MAAM,eAAe;AAC5D,QAAO;EACL;EACA,MAAM;EACN,OAAO,OAAO,QACV,YAAY,KAAA,GAAW,OAAO,OAAO,MAAM,GAC3C,EAAE,MAAM,WAAW;EACvB,GAAG,mBAAmB,OAAO;EAC9B;;AAGH,MAAa,iBACX,MACA,QACA,aACa;AAQb,QAP2B;EACzB;EACA,UAAU,CAAC,SAAS,SAAS,KAAK;EAClC,MAAM,kBAAkB,OAAO;EAC/B,GAAG,mBAAmB,OAAuB;EAC9C;;AAKH,MAAM,qBACJ,UACA,eAAe,SACM;CACrB,MAAM,MAAO,SAA6B;AAE1C,KAAI,IACF,QAAO,CAAC,EAAE,MAAM,SAAS,IAAI,EAAE,CAAC;CAElC,MAAM,eAAe;CACrB,MAAM,OAAO,eAAe,mBAAmB,aAAa,GAAG,EAAE;AACjE,KAAI,aAAa,KAMf,QAAO,CALoB;EACzB,MAAM;EACN,QAAQ,aAAa;EACrB,GAAG;EACJ,CACgB;AAEnB,KAAI,aAAa,KACf,SACE,MAAM,QAAQ,aAAa,KAAK,GAAG,aAAa,OAAO,CAAC,aAAa,KAAK,EAC1E,KAAK,SAAS;AACd,UAAQ,MAAR;GACE,KAAK,QACH,QAAO,iBAAiB,KAAA,GAAW,aAAa;GAElD,KAAK,SACH,QAAO,kBAAkB,KAAA,GAAW,aAAa;GAEnD,QACE,QAAO;IACL,MAAM,SAAS,MAAM,aAAa,OAAO;IACzC,GAAG;IACJ;;GAGL;AAEJ,KAAI,aAAa,OAAO;EACtB,MAAM,QAA0B,EAAE;AAClC,OAAK,MAAM,SAAS,aAAa,OAAO;GACtC,MAAM,OAAO,YAAY,KAAA,GAAW,MAAM;AAC1C,UAAO,KAAK;AACZ,SAAM,KAAK,KAAK;;AAElB,SAAO;;AAGT,QAAO,EAAE;;;;ACvMX,MAAa,gBACX,UAAwC,EAAE,KAE1C,OAAO,QAAQ,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,YACxC,YAAY,MAAM,OAAO,CAC1B;AAEH,MAAa,eAAe,MAAc,WAAiC;AASzE,QARuB;EACrB;EACA,UAAU,CAAC,OAAO;EAElB,MAAM,YAAY,KAAA,GAAW,OAAO,OAAQ;EAC5C,GAAG,mBAAmB,OAAO;EAC9B;;;;ACdH,MAAaC,qBACX,UAA2C,EAAE,KAE7C,OAAO,QAAQ,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,YACxC,eAAe,MAAM,OAAO,CAC7B;AAEH,MAAa,kBACX,MACA,WACc;AAWd,QAVyB;EACvB;EACA,IAAI,OAAO;EACX,eAAe,OAAO;EACtB,UAAU,CAAC,OAAO;EAElB,MAAM,YAAY,KAAA,GAAW,OAAO,OAAQ;EAC5C,GAAG,mBAAmB,OAAO;EAC9B;;;;ACTH,MAAa,aACX,MACA,eAC4B;AAE5B,KAAI,CAAC,KAAK,YAAY,UAAU,CAAC,KAAK,UAAU,UAAU,CAAC,KAAK,YAC9D,QAAO,KAAA;AAQT,QAN0B,SAAS;EACjC,gBAAgB,KAAK,YAAY,WAAW;EAC5C,cAAc,KAAK,UAAU,WAAW;EACxC,iBAAiB,KAAK,aAAa,WAAW;EAC/C,CAAC;;AAKJ,MAAM,cAAc,cAA6B,EAAE,MAAY;CAC7D,MAAM;CACN,YAAY,EAAE;CACd,UAAU;CACV,GAAG;CACJ;AAED,MAAM,YAAY,SAAqC;CACrD,MAAM,SAAsB,EAAE;AAC9B,MAAK,MAAM,OAAO,KAChB,MAAK,MAAM,CAAC,MAAM,QAAQ,OAAO,QAAQ,IAAI,EAAE;EAC7C,MAAM,MAAM;AACZ,MAAI,OAAO,KACT,QAAO,OAAO,QAAQ,OAAO,MAAc,IAAI;MAE/C,QAAO,OAAO;;AAIpB,QAAO;;AAGT,MAAM,WAAW,MAAY,SAAqB;CAChD,MAAM,MAAY;EAChB,MAAM;EACN,UAAU,KAAK,YAAY,KAAK;EAChC,YAAY,KAAK,WAAW,OAAO,KAAK,WAAW;EACpD;AACD,KAAI,KAAK,SAAS,KAAK,MACrB,KAAI,SAAS,KAAK,SAAS,EAAE,EAAE,OAAO,KAAK,SAAS,EAAE,CAAC;AACzD,KAAI,KAAK,SAAS,KAAK,MACrB,KAAI,SAAS,KAAK,SAAS,EAAE,EAAE,OAAO,KAAK,SAAS,EAAE,CAAC;AACzD,KAAI,KAAK,SAAS,KAAK,MACrB,KAAI,SAAS,KAAK,SAAS,EAAE,EAAE,OAAO,KAAK,SAAS,EAAE,CAAC;AAEzD,KAAI,KAAK,eAAe,KAAK,YAC3B,KAAI,cAAc,KAAK,eAAe,KAAK;AAC7C,KAAI,KAAK,SAAS,KAAK,MAAO,KAAI,QAAQ,KAAK,SAAS,KAAK;AAE7D,QAAO;;AAGT,MAAM,iBACJ,WAAwC,EAAE,EAC1C,aAA+B,EAAE,KACjB;CAChB,MAAM,OAAoB,EAAE;AAC5B,MAAK,MAAM,UAAU,SACnB,MAAK,MAAM,CAAC,SAAS,OAAO,QAAQ,OAAO,EAAE;EAC3C,MAAM,QAAQ,QACZ,YACA,gCAAgC,OACjC;EACD,MAAM,MAAM,KAAK,UAAU,WAAW,EAAE,GAAG,mBAAmB,MAAM,EAAE,CAAC;AACvE,MAAI,WAAW;AACf,MAAI,CAAC,IAAI,MAAO,KAAI,QAAQ,EAAE;AAC9B,MAAI,MAAM,KAAK,EAAE,MAAM,SAAS,KAAK,EAAE,CAAC;AACxC,OAAK,SAAS;;AAGlB,QAAO;;AAGT,MAAM,mBACJ,aAAoD,EAAE,EACtD,aAA+B,EAAE,KACjB;CAChB,MAAM,OAAoB,EAAE;AAE5B,MAAK,MAAM,KAAK,YAAY;EAC1B,MAAM,MAAO,EAAsB;AACnC,MAAI,IAEF,SADa,IAAI,MAAM,IAAI,CAAC,IAC5B;GACE,KAAK,cAAc;IACjB,MAAM,QAAQ,QAAyB,YAAY,IAAI;IACvD,MAAM,MACJ,KAAK,MAAM,OAAO,WAAW,EAAE,GAAG,mBAAmB,MAAM,EAAE,CAAC;AAChE,QAAI,WAAW,IAAI,YAAY,CAAC,MAAM;AAEtC,QAAI,CAAC,IAAI,MAAO,KAAI,QAAQ,EAAE;AAC9B,QAAI,MAAM,KAAK,EAAE,MAAM,SAAS,IAAI,EAAE,CAAC;AAEvC,SAAK,MAAM,MAAM;AACjB;;GAEF,KAAK,WAAW;IACd,MAAM,SAAS,QAAsB,YAAY,IAAI;IACrD,MAAM,MAAM,KAAK,UAAU,YAAY;IACvC,MAAM,OAAO,SAAS,IAAI;AAC1B,QAAI,WAAW,KAAK;KAClB;KACA,UAAU,CAAC,OAAO;KAElB,MAAM,CAAC,EAAE,MAAM,YAAY,KAAA,GAAW,OAAO,OAAQ,CAAC,MAAM,CAAC;KAC7D,GAAG,mBAAoB,OAAO,UAAU,EAAE,CAAkB;KAC7D,CAAC;AACF,SAAK,SAAS;AACd;;;OAGC;GACL,MAAM,QAAQ;GACd,MAAM,MAAM,KAAK,MAAM,OAAO,WAAW,EAAE,GAAG,mBAAmB,MAAM,EAAE,CAAC;AAE1E,OAAI,WAAW,KAAK;IAClB,MAAM,MAAM;IACZ,UAAU,CAAC,MAAM;IACjB,MAAM,CAAC,YAAY,KAAA,GAAW,MAAM,OAAuB,CAAC;IAC7D,CAAC;AAEF,OAAI,WAAW,IAAI,YAAY,CAAC,MAAM;AAEtC,QAAK,MAAM,MAAM;;;AAIrB,QAAO;;AAGT,MAAM,oBACJ,aACA,aAA+B,EAAE,KACjB;CAChB,MAAM,OAAoB,EAAE;AAC5B,KAAI,CAAC,YAAa,QAAO;CAEzB,MAAM,MAAO,YAAgC;AAC7C,KAAI,IAEF,MAAK,OAAO,WAAW;EACrB,UAAU,CAFI,QAA2B,YAAY,IAAI,CAEtC;EACnB,OAAO,CAAC,EAAE,MAAM,SAAS,IAAI,EAAE,CAAC;EACjC,CAAC;MACG;EAEL,MAAM,OAAO;EACb,MAAM,WACJ,KAAK,QACL,WAAW;GAAE,UAAU,CAAC,KAAK;GAAU,GAAG,mBAAmB,KAAK;GAAE,CAAC;AAEvE,MAAI,KAAK,QAAQ,qBAAqB;GACpC,MAAM,SAAS,KAAK,QAAQ,oBAAoB;AAChD,OAAI,QAAQ;IACV,MAAM,SAAS,YAAY,KAAA,GAAW,OAAO;AAC7C,QAAI,OAAO,SAAS,SAClB,MAAK,OAAO;KACV,GAAI;KACJ,UAAU,CAAC,KAAK;KACjB;aACQ,OAAO,KAChB,MAAK,OAAO,WAAW;KACrB,UAAU,CAAC,KAAK;KAChB,OAAO,CAAC,OAAO;KACf,GAAG,mBAAmB,KAAK;KAC5B,CAAC;;;AAIR,MACE,SAAS,OAAO,UAChB,SAAS,OAAO,UAChB,SAAS,WAAW,OAEpB,MAAK,OAAO;;AAIhB,QAAO;;;;AC9LT,MAAa,uBACX,YAA8D,EAAE,KAC7C;CACnB,MAAM,SAAyB,EAAE;AAEjC,MAAK,MAAM,CAAC,MAAM,MAAM,OAAO,QAAQ,UAAU,EAAE;EACjD,MAAM,OAAO,kBAAkB,MAAM,EAAE;AACvC,SAAO,KAAK,KAAK;;AAGnB,QAAO;;AAGT,MAAa,qBACX,MACA,aAC8B;CAC9B,MAAM,MAAO,SAA6B;AAC1C,KAAI,IAAK,QAAO,EAAE,MAAM,SAAS,IAAI,EAAE;CAEvC,MAAM,iBAAiB;CACvB,MAAM,OAAqB,EAAE;AAC7B,KAAI,KAAM,MAAK,OAAO;AACtB,KAAI,eAAe,YAAa,MAAK,cAAc,eAAe;AAElE,KAAI,eAAe,UAAU,qBAAqB,QAAQ;EACxD,MAAM,SAAS,eAAe,QAAQ,oBAAoB;AAC1D,OAAK,OAAO,YAAY,KAAA,GAAW,OAAO;;AAE5C,KAAI,eAAe,SAAS;AAC1B,OAAK,UAAU,EAAE;AACjB,OAAK,MAAM,CAAC,YAAY,WAAW,OAAO,QAAQ,eAAe,QAAQ,EAAE;GACzE,MAAM,MAAO,OAA2B;AACxC,OAAI,IACF,MAAK,QAAQ,KAAK;IAChB,MAAM;IACN,UAAU;IACV,MAAM,EAAE,MAAM,SAAS,IAAI,EAAE;IAC7B,GAAG,mBAAmB,OAAuB;IAC9C,CAAC;OACC,MAAK,QAAQ,KAAK,YAAY,YAAY,OAAuB,CAAC;;;AAG3E,QAAO;;;;ACxCT,MAAa,cAAc,QACzB,OAAO,QAAQ,IAAI,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,UAC9C,UAAU,MAAM,MAAwB,IAAI,WAAW,CACxD;AAEH,MAAa,aACX,KACA,MACA,eACW;CACX,MAAM,QAAgB,EAAE;AAGxB,MAAK,MAAM,UAFa;EAAC;EAAU;EAAO;EAAS;EAAQ;EAAM,CAG/D,KAAI,KAAK,QACP,OAAM,KACJ,YAAY,KAAK,QAAQ,KAAK,SAA4B,WAAW,CACtE;AAIL,QAAO;;AAGT,MAAM,eACJ,KACA,QACA,WACA,eACS;AACT,QAAO;EACL;EACA,KAAK,SAAS,IAAI;EAClB,WAAW,eAAe,UAAU,UAAU;EAC9C,MAAM,UAAU,WAAW,WAAW;EACtC,GAAG,mBAAmB,UAAU;EACjC;;AAGH,MAAM,YAAY,QAAwB,IAAI,QAAQ,cAAc,MAAM;AAE1E,MAAM,kBACJ,cACmC;AACnC,QAAO,OAAO,OACZ,EAAE,EACF,GAAG,OAAO,QAAQ,UAAU,CAAC,KAAK,CAAC,MAAM,cAAc;AACrD,SAAO,GACJ,OAAO,SAAS,MAAM,GAAG,GAAG,kBAAkB,KAAA,GAAW,SAAS,EACpE;GACD,CACH;;;;AC5DH,MAAa,sBACX,gBAAmD,EAAE,KAChC;CACrB,MAAM,cAAgC,EAAE;AACxC,MAAK,MAAM,CAAC,MAAM,gBAAgB,OAAO,QAAQ,cAAc,CAC7D,KAAI,YAAY,QAAQ,oBAAoB,OAC1C,aAAY,KACV,YAAY,MAAM,YAAY,QAAQ,oBAAoB,OAAO,CAClE;AAGL,QAAO;;;;ACZT,MAAa,wBACX,UAAgD,EAAE,KAClC;CAChB,MAAM,aAA0B,EAAE;AAClC,MAAK,MAAM,CAAC,MAAM,WAAW,OAAO,QAAQ,QAAQ,CAClD,YAAW,KAAK,oBAAoB,MAAM,OAAO,CAAC;AAEpD,QAAO;;AAGT,MAAa,uBACX,MACA,WACc;AACd,SAAQ,OAAO,MAAf;EACE,KAAK,SACH,QAAO,YAAY,MAAM,OAAO;EAClC,KAAK,OACH,QAAO,kBAAkB,MAAM,OAAO;EACxC,KAAK,SACH,QAAO,WAAW,MAAM,OAAO;EACjC,KAAK,gBACH,QAAO,mBAAmB,MAAM,OAAO;;AAE3C,OAAM,IAAI,MAAM,4BAA4B,OAAO,KAAK,GAAG;;AAG7D,MAAM,eAAe,MAAc,WAA4C;CAC7E,MAAM,MAAM,OAAO,MAAM;AAEzB,QAAO;EACL;EACA,eAHoB,OAAO;EAI3B,IAAI;EACJ,UAAU;EACV,MAAM,EAAE,MAAM,UAAU;EACzB;;AAGH,MAAM,qBACJ,MACA,aACe;CACf;CACA,IAAI;CACJ,eAAe;CACf,UAAU;CACV,MAAM,EAAE,MAAM,UAAU;CACzB;AAED,MAAM,cACJ,MACA,aACe;CACf;CACA,IAAI;CACJ,eAAe;CACf,UAAU;CACV,MAAM,EAAE,MAAM,UAAU;CACzB;AAED,MAAM,sBACJ,MACA,aACe;CACf;CACA,IAAI;CACJ,eAAe;CACf,UAAU;CACV,MAAM,EAAE,MAAM,UAAU;CACzB;;;AC/DD,MAAa,iBACX,YAC2B;CAC3B,OAAO,WAAW,OAAO;CACzB,YAAY,gBAAgB,OAAO,WAAW;CAC/C;AAED,MAAa,mBACX,aAA+B,EAAE,MACX;CACtB,SAAS,aAAa,WAAW,QAAQ;CACzC,SAAS,aAAa,WAAW,QAAQ;CACzC,YAAYC,kBAAgB,WAAW,WAAW;CAClD,eAAe,mBAAmB,WAAW,cAAc;CAC3D,gBAAgB,oBAAoB,WAAW,UAAU;CACzD,iBAAiB,qBAAqB,WAAW,gBAAgB;CAClE;;;AClBD,MAAa,qBAAqB,OAChC,MACA,QACoB;AAKpB,QAFkB,MAAMC,SADNC,WAAU,MADb,cAAc,IAAI,CACQ,CACA;;AAK3C,MAAa,WAAW,OACtB,OACA,WACgC;CAEhC,MAAM,YAAY,MAAM,aADX,MAAM,SAAS,MAAM,CACQ;AAE1C,KAAI,CAAC,OAAQ,QAAO,UAAU,KAAK,MAAM,EAAE,GAAG,CAAC,KAAK,OAAO;AAC3D,OAAM,SAAS,QAAQ,UAAU;;AAUnC,MAAM,WAAW,OAAO,UAAkC;CACxD,MAAM,OAAO,QAAQ,MAAM;CAC3B,MAAM,QAAQ,MAAM,KAAK,KAAK;CAE9B,MAAM,YAAsB,EAAE;AAE9B,KAAI,MAAM,QAAQ,CAAE,WAAU,KAAK,KAAK;AACxC,KAAI,MAAM,aAAa,EAAE;EACvB,MAAM,QAAQ,MAAM,QAAQ,KAAK;AACjC,YAAU,KAAK,GAAG,MAAM,KAAK,MAAM,QAAQ,MAAM,EAAE,CAAC,CAAC;;CAGvD,MAAM,YAAmB,EAAE;AAC3B,MAAK,MAAM,KAAK,WAAW;EACzB,MAAM,EAAE,MAAM,QAAQ,MAAM,EAAE;EAC9B,IAAI;AACJ,UAAQ,KAAR;GACE,KAAK,SAAS;AACZ,YAAQ,IAAI,WAAW,IAAI;IAC3B,MAAM,MAAM,MAAM,SAAS,GAAG,OAAO;AACrC,UAAM,KAAK,MAAM,IAAI;AACrB;;GAEF,KAAK;GACL,KAAK,SAAS;AACZ,YAAQ,IAAI,WAAW,IAAI;IAC3B,MAAM,MAAM,MAAM,SAAS,GAAG,OAAO;AACrC,UAAM,KAAK,MAAM,IAAI;AACrB;;GAEF,QACE;;AAEJ,YAAU,KAAK;GACb;GACA;GACD,CAAC;;AAEJ,QAAO;;AAGT,MAAM,eAAe,OAAO,UAA0C;CACpE,MAAM,YAA4B,EAAE;AACpC,MAAK,MAAM,OAAO,OAAO;AACvB,UAAQ,IAAI,cAAc,IAAI,OAAO;EACrC,MAAM,KAAK,MAAM,mBAAmB,UAAU,IAAI,KAAK,EAAE,IAAI,IAAI;AACjE,YAAU,KAAK;GACb,GAAG;GACH;GACD,CAAC;;AAEJ,QAAO;;AAGT,MAAM,WAAW,OACf,QACA,SACkB;CAElB,MAAM,OADQ,MAAM,KAAK,OAAO,EACd,aAAa,GAAG,SAAS,MAAM,OAAO,CAAC;AACzD,OAAM,MAAM,KAAK,EAAE,WAAW,MAAM,CAAC;AACrC,MAAK,MAAM,OAAO,MAAM;EACtB,MAAM,OAAO,QAAQ,KAAK,GAAG,SAAS,IAAI,KAAK,CAAC,KAAK;AACrD,UAAQ,IAAI,WAAW,OAAO;AAC9B,QAAM,UAAU,MAAM,IAAI,IAAI,OAAO;;;AAIzC,MAAa,aAAa,SAAyB;AACjD,QAAO,WAAW,KAAK,QAAQ,QAAQ,GAAG,CAAC;;AAG7C,MAAa,YAAY,SAAyB;AAChD,QAAO,KAAK,QAAQ,OAAO,IAAI"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sebspark/openapi-typegen",
3
- "version": "5.0.15",
3
+ "version": "5.0.17",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "main": "dist/index.mjs",
@@ -27,7 +27,7 @@
27
27
  "@types/yargs": "17.0.35"
28
28
  },
29
29
  "dependencies": {
30
- "@sebspark/openapi-core": "4.1.1",
30
+ "@sebspark/openapi-core": "4.1.3",
31
31
  "boxen": "8.0.1",
32
32
  "chalk": "5.6.2",
33
33
  "change-case": "5.4.4",