@sebspark/openapi-typegen 5.0.9 → 5.0.11

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/index.ts"],"sourcesContent":[],"mappings":";;;cAQa,wCAEN,oBACJ;cAQU,8CAGV;AAdU,cAiGA,SAxFZ,EAAA,CAAA,IAPM,EAAA,MAAA,EAAA,GAAA,MACJ;AAQU,cA0FA,QAvFV,EAAA,CAAA,IAAO,EAAA,MAAA,EAAA,GAAA,MAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/index.ts"],"mappings":";;;cAQa,kBAAA,GACX,IAAA,UACA,GAAA,EAAK,eAAA,KACJ,OAAA;AAAA,cAQU,QAAA,GACX,KAAA,UACA,MAAA,cACC,OAAA;AAAA,cAmFU,SAAA,GAAa,IAAA;AAAA,cAIb,QAAA,GAAY,IAAA"}
package/dist/index.mjs CHANGED
@@ -173,7 +173,7 @@ const generateDiscriminator = (discriminator, name) => {
173
173
  const generateArray = (parsed) => {
174
174
  const lines = [];
175
175
  let items = generateType(parsed.items);
176
- if (parsed.items.type === "enum" || "oneOf" in parsed.items) items = `(${items})`;
176
+ if (parsed.items.type === "enum" || "oneOf" in parsed.items || "allOf" in parsed.items) items = `(${items})`;
177
177
  lines.push(`${preamble(parsed)}${items}[]`);
178
178
  return lines.join("\n");
179
179
  };
@@ -369,24 +369,24 @@ const generateComponents = (components) => {
369
369
  const tokens = [];
370
370
  for (const schema of components.schemas) tokens.push(generateType(schema));
371
371
  for (const header of components.headers) tokens.push(generateHeader(header));
372
- for (const param$1 of components.parameters) tokens.push(generateType({
372
+ for (const param of components.parameters) tokens.push(generateType({
373
373
  type: "object",
374
- name: param$1.name,
374
+ name: param.name,
375
375
  properties: [{
376
- name: param$1.parameterName,
377
- type: [param$1.type],
378
- optional: param$1.optional
376
+ name: param.parameterName,
377
+ type: [param.type],
378
+ optional: param.optional
379
379
  }]
380
380
  }));
381
381
  for (const req of components.requestBodies) tokens.push(generateType(req));
382
382
  for (const res of components.responseBodies) tokens.push(generateResponseBody(res));
383
- for (const param$1 of components.securitySchemes) tokens.push(generateType({
383
+ for (const param of components.securitySchemes) tokens.push(generateType({
384
384
  type: "object",
385
- name: param$1.name,
385
+ name: param.name,
386
386
  properties: [{
387
- name: param$1.parameterName,
388
- type: [param$1.type],
389
- optional: param$1.optional
387
+ name: param.parameterName,
388
+ type: [param.type],
389
+ optional: param.optional
390
390
  }]
391
391
  }));
392
392
  return tokens.join("\n\n");
@@ -416,12 +416,12 @@ const parseDocumentation = (source) => {
416
416
  //#endregion
417
417
  //#region src/parser/schema.ts
418
418
  const parseSchemas = (schemas = {}) => Object.entries(schemas || {}).map(([name, schema]) => parseSchema(name, schema));
419
- const marshall = (type, format$2) => {
419
+ const marshall = (type, format) => {
420
420
  if (type === "integer") return "number";
421
- if (type === "string" && (format$2 === "date" || format$2 === "date-time")) return "Date";
421
+ if (type === "string" && (format === "date" || format === "date-time")) return "Date";
422
422
  return type;
423
423
  };
424
- const parseSchema = (name, schemaOrRef, generateDocs$1 = true) => {
424
+ const parseSchema = (name, schemaOrRef, generateDocs = true) => {
425
425
  const ref = schemaOrRef.$ref;
426
426
  if (ref) return {
427
427
  name,
@@ -436,7 +436,7 @@ const parseSchema = (name, schemaOrRef, generateDocs$1 = true) => {
436
436
  case "string": return schema.enum ? parseEnumType(name, schema) : name ? {
437
437
  name,
438
438
  type: marshall(schema.type, schema.format)
439
- } : parsePropertyType(schema, generateDocs$1)[0];
439
+ } : parsePropertyType(schema, generateDocs)[0];
440
440
  default: return parseObjectSchema(name, schema);
441
441
  }
442
442
  };
@@ -447,7 +447,7 @@ const parseObjectSchema = (name, schema) => {
447
447
  properties: [],
448
448
  ...parseDocumentation(schema)
449
449
  };
450
- if (schema.properties) type.properties = Object.entries(schema.properties).map(([name$1, property]) => parseProperty(name$1, property, schema.required || []));
450
+ if (schema.properties) type.properties = Object.entries(schema.properties).map(([name, property]) => parseProperty(name, property, schema.required || []));
451
451
  if (schema.allOf) type.allOf = schema.allOf.flatMap((s) => parsePropertyType(s));
452
452
  if (schema.oneOf) type.oneOf = schema.oneOf.flatMap((s) => parsePropertyType(s));
453
453
  if (schema.anyOf) type.oneOf = schema.anyOf.flatMap((s) => parsePropertyType(s));
@@ -492,11 +492,11 @@ const parseProperty = (name, schema, required) => {
492
492
  ...parseDocumentation(schema)
493
493
  };
494
494
  };
495
- const parsePropertyType = (property, generateDocs$1 = true) => {
495
+ const parsePropertyType = (property, generateDocs = true) => {
496
496
  const ref = property.$ref;
497
497
  if (ref) return [{ type: parseRef(ref) }];
498
498
  const schemaObject = property;
499
- const docs = generateDocs$1 ? parseDocumentation(schemaObject) : {};
499
+ const docs = generateDocs ? parseDocumentation(schemaObject) : {};
500
500
  if (schemaObject.enum) return [{
501
501
  type: "enum",
502
502
  values: schemaObject.enum,
@@ -591,8 +591,8 @@ const joinArg = (arg1, arg2) => {
591
591
  const parseSecurity = (security = [], components = {}) => {
592
592
  const args = {};
593
593
  for (const secReq of security) for (const [name] of Object.entries(secReq)) {
594
- const param$1 = findRef(components, `#/components/securitySchemes/${name}`);
595
- const arg = args.header || createArgs({ ...parseDocumentation(param$1) });
594
+ const param = findRef(components, `#/components/securitySchemes/${name}`);
595
+ const arg = args.header || createArgs({ ...parseDocumentation(param) });
596
596
  arg.optional = false;
597
597
  if (!arg.allOf) arg.allOf = [];
598
598
  arg.allOf.push({ type: parseRef(name) });
@@ -606,12 +606,12 @@ const parseParameters = (parameters = [], components = {}) => {
606
606
  const ref = p.$ref;
607
607
  if (ref) switch (ref.split("/")[2]) {
608
608
  case "parameters": {
609
- const param$1 = findRef(components, ref);
610
- const arg = args[param$1.in] || createArgs({ ...parseDocumentation(param$1) });
611
- arg.optional = arg.optional && !param$1.required;
609
+ const param = findRef(components, ref);
610
+ const arg = args[param.in] || createArgs({ ...parseDocumentation(param) });
611
+ arg.optional = arg.optional && !param.required;
612
612
  if (!arg.allOf) arg.allOf = [];
613
613
  arg.allOf.push({ type: parseRef(ref) });
614
- args[param$1.in] = arg;
614
+ args[param.in] = arg;
615
615
  break;
616
616
  }
617
617
  case "headers": {
@@ -629,15 +629,15 @@ const parseParameters = (parameters = [], components = {}) => {
629
629
  }
630
630
  }
631
631
  else {
632
- const param$1 = p;
633
- const arg = args[param$1.in] || createArgs({ ...parseDocumentation(param$1) });
632
+ const param = p;
633
+ const arg = args[param.in] || createArgs({ ...parseDocumentation(param) });
634
634
  arg.properties.push({
635
- name: param$1.name,
636
- optional: !param$1.required,
637
- type: [parseSchema(void 0, param$1.schema)]
635
+ name: param.name,
636
+ optional: !param.required,
637
+ type: [parseSchema(void 0, param.schema)]
638
638
  });
639
- arg.optional = arg.optional && !param$1.required;
640
- args[param$1.in] = arg;
639
+ arg.optional = arg.optional && !param.required;
640
+ args[param.in] = arg;
641
641
  }
642
642
  }
643
643
  return args;
@@ -700,11 +700,11 @@ const parseResponseBody = (name, response) => {
700
700
  if (responseObject.headers) {
701
701
  body.headers = [];
702
702
  for (const [headerName, header] of Object.entries(responseObject.headers)) {
703
- const ref$1 = header.$ref;
704
- if (ref$1) body.headers.push({
703
+ const ref = header.$ref;
704
+ if (ref) body.headers.push({
705
705
  name: headerName,
706
706
  optional: false,
707
- type: { type: parseRef(ref$1) },
707
+ type: { type: parseRef(ref) },
708
708
  ...parseDocumentation(header)
709
709
  });
710
710
  else body.headers.push(parseHeader(headerName, header));
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["format","pFormat","generateResponses","generate","param","format","generateDocs","name","parseParameters","param","ref","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 (parsed.items.type === 'enum' || 'oneOf' in parsed.items) {\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 { ParsedComponents, ParsedOpenApiDocument } 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 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 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 { ParsedComponents, ParsedOpenApiDocument } 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 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 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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sebspark/openapi-typegen",
3
- "version": "5.0.9",
3
+ "version": "5.0.11",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "main": "dist/index.mjs",
@@ -24,17 +24,19 @@
24
24
  "typecheck": "vitest --typecheck.only --passWithNoTests"
25
25
  },
26
26
  "devDependencies": {
27
- "@sebspark/tsconfig": "3.0.5",
28
- "@types/yargs": "17.0.35",
29
- "vitest": "4.0.16"
27
+ "@types/yargs": "17.0.35"
30
28
  },
31
29
  "dependencies": {
32
- "@sebspark/openapi-core": "4.0.12",
30
+ "@sebspark/openapi-core": "4.0.13",
33
31
  "boxen": "8.0.1",
34
32
  "chalk": "5.6.2",
35
33
  "change-case": "5.4.4",
36
- "prettier": "3.7.4",
34
+ "prettier": "3.8.1",
37
35
  "yaml": "2.8.2",
38
36
  "yargs": "18.0.0"
37
+ },
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "https://github.com/seb-oss/Spark-packages.git"
39
41
  }
40
42
  }