@ps-aux/api-client-gen 0.7.0-rc.6 → 0.7.0-rc.7

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,10 +1,12 @@
1
1
  import Path$1 from 'path';
2
2
  import * as fs from 'fs';
3
+ import { existsSync } from 'node:fs';
3
4
  import Path from 'node:path';
5
+ import 'c12';
6
+ import { generate } from 'ts-to-zod';
7
+ import fs$1, { mkdir, writeFile, readFile } from 'node:fs/promises';
4
8
  import { generateApi } from 'swagger-typescript-api';
5
9
  import { fileURLToPath } from 'node:url';
6
- import fs$1, { readFile, mkdir, writeFile } from 'node:fs/promises';
7
- import { generate } from 'ts-to-zod';
8
10
 
9
11
  /** A special constant with type `never` */
10
12
  function $constructor(name, initializer, params) {
@@ -4216,7 +4218,7 @@ const vNextOasGeneratorSchema = strictObject({
4216
4218
  }).prefault({}),
4217
4219
  codegen: strictObject({
4218
4220
  unwrap: boolean().default(true),
4219
- withRequestParams: boolean().default(false),
4221
+ withRequestParams: boolean().default(true),
4220
4222
  pathParamsStyle: _enum(["object", "positional"]).default("positional"),
4221
4223
  enumStyle: _enum(["enum", "union"]).default("enum"),
4222
4224
  comments: strictObject({
@@ -11261,9 +11263,82 @@ class CodeFormatter {
11261
11263
  }
11262
11264
  }
11263
11265
 
11264
- const splitIdentifierWords$1 = (str) => str.replace(/([a-z0-9])([A-Z])/g, "$1 $2").split(/[^a-zA-Z0-9]+/).filter(Boolean);
11265
- const toPascalCaseIdentifier = (str) => splitIdentifierWords$1(str).map((word) => word[0].toUpperCase() + word.substring(1)).join("");
11266
- const toKebabCaseIdentifier = (str) => splitIdentifierWords$1(str).map((word) => word.toLowerCase()).join("-");
11266
+ const removeGenericTypes = (code) => {
11267
+ const declarations = [];
11268
+ const declarationStartRegex = /^export\s+(interface|enum|type)\s+[A-Za-z0-9_]+(?:<[^>\n]+>)?/gm;
11269
+ let match;
11270
+ while ((match = declarationStartRegex.exec(code)) !== null) {
11271
+ const declaration = extractDeclaration(code, match);
11272
+ if (!declaration) continue;
11273
+ declarations.push(declaration);
11274
+ declarationStartRegex.lastIndex = match.index + declaration.length;
11275
+ }
11276
+ return declarations.join("\n\n");
11277
+ };
11278
+ const extractDeclaration = (code, match) => {
11279
+ const header = match[0];
11280
+ if (header.includes("<")) return null;
11281
+ const kind = match[1];
11282
+ let cursor = match.index + header.length;
11283
+ if (kind === "type") {
11284
+ cursor = skipWhitespace(code, cursor);
11285
+ if (code[cursor] !== "=") return null;
11286
+ cursor = skipWhitespace(code, cursor + 1);
11287
+ if (code[cursor] !== "{") return null;
11288
+ } else {
11289
+ cursor = code.indexOf("{", cursor);
11290
+ if (cursor === -1) return null;
11291
+ }
11292
+ const end = findMatchingBrace(code, cursor);
11293
+ if (end === -1) return null;
11294
+ return code.slice(match.index, end + 1);
11295
+ };
11296
+ const skipWhitespace = (code, cursor) => {
11297
+ while (/\s/.test(code[cursor] ?? "")) {
11298
+ cursor += 1;
11299
+ }
11300
+ return cursor;
11301
+ };
11302
+ const findMatchingBrace = (code, openBraceIndex) => {
11303
+ let depth = 0;
11304
+ for (let i = openBraceIndex; i < code.length; i += 1) {
11305
+ if (code[i] === "{") depth += 1;
11306
+ if (code[i] === "}") {
11307
+ depth -= 1;
11308
+ if (depth === 0) return i;
11309
+ }
11310
+ }
11311
+ return -1;
11312
+ };
11313
+
11314
+ var __defProp$b = Object.defineProperty;
11315
+ var __defNormalProp$b = (obj, key, value) => key in obj ? __defProp$b(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
11316
+ var __publicField$b = (obj, key, value) => __defNormalProp$b(obj, key + "" , value);
11317
+ class ZodSchemaGenerator {
11318
+ constructor(codeFormatter) {
11319
+ this.codeFormatter = codeFormatter;
11320
+ __publicField$b(this, "generate", async ({
11321
+ sourceText,
11322
+ moduleImportPath,
11323
+ options = {}
11324
+ }) => {
11325
+ const { getZodSchemasFile } = generate({
11326
+ sourceText: removeGenericTypes(sourceText)
11327
+ });
11328
+ let generated = getZodSchemasFile(moduleImportPath);
11329
+ generated = generated.replaceAll(".optional()", ".nullable()");
11330
+ generated = generated.replaceAll(".int64()", ".int()");
11331
+ if (options.localDateTimes) {
11332
+ generated = generated.replaceAll(
11333
+ "z.string().datetime()",
11334
+ "z.string().datetime({local: true})"
11335
+ );
11336
+ }
11337
+ return this.codeFormatter.format(generated);
11338
+ });
11339
+ }
11340
+ }
11341
+
11267
11342
  const findRelativePath = (src, dst) => {
11268
11343
  const relativePath = Path$1.relative(Path$1.dirname(src), dst);
11269
11344
  const withoutExtension = relativePath.replace(/\.ts$/u, "");
@@ -11271,6 +11346,62 @@ const findRelativePath = (src, dst) => {
11271
11346
  return normalizedPath.startsWith(".") ? normalizedPath : `./${normalizedPath}`;
11272
11347
  };
11273
11348
 
11349
+ const splitIdentifierWords$1 = (str) => str.replace(/([a-z0-9])([A-Z])/g, "$1 $2").split(/[^a-zA-Z0-9]+/).filter(Boolean);
11350
+ const toPascalCaseIdentifier = (str) => splitIdentifierWords$1(str).map((word) => word[0].toUpperCase() + word.substring(1)).join("");
11351
+ const toKebabCaseIdentifier = (str) => splitIdentifierWords$1(str).map((word) => word.toLowerCase()).join("-");
11352
+
11353
+ var __defProp$a = Object.defineProperty;
11354
+ var __defNormalProp$a = (obj, key, value) => key in obj ? __defProp$a(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
11355
+ var __publicField$a = (obj, key, value) => __defNormalProp$a(obj, typeof key !== "symbol" ? key + "" : key, value);
11356
+ class FileWriter {
11357
+ constructor(outputDir, opts = {}) {
11358
+ this.outputDir = outputDir;
11359
+ this.opts = opts;
11360
+ __publicField$a(this, "resolveName", (req, opts) => {
11361
+ let name = opts?.preserveCase ? req.name : this.setNameCase(req.name);
11362
+ if (this.opts.suffix && opts?.noSuffix !== true) {
11363
+ name = name + "." + this.opts.suffix;
11364
+ }
11365
+ if (this.opts.mapFileName)
11366
+ name = this.opts.mapFileName({
11367
+ name,
11368
+ ext: req.ext
11369
+ });
11370
+ return name;
11371
+ });
11372
+ __publicField$a(this, "resolvePath", (req, opts) => this.getResolvedPath(req, opts));
11373
+ __publicField$a(this, "write", async ({ content, ...req }, opts) => {
11374
+ const resolvedPath = this.getResolvedPath(req, opts);
11375
+ await mkdir(Path.dirname(resolvedPath), { recursive: true });
11376
+ await writeFile(resolvedPath, content, "utf8");
11377
+ return resolvedPath;
11378
+ });
11379
+ __publicField$a(this, "getResolvedPath", ({ path, ext, ...req }, opts) => Path.resolve(
11380
+ this.outputDir,
11381
+ ...path ?? [],
11382
+ `${this.resolveName(
11383
+ {
11384
+ ext,
11385
+ ...req
11386
+ },
11387
+ opts
11388
+ )}.${ext}`
11389
+ ));
11390
+ __publicField$a(this, "setNameCase", (name) => {
11391
+ const [first, ...rest] = name.split(".");
11392
+ const converted = this.transformCase(first);
11393
+ return [converted, ...rest].join(".");
11394
+ });
11395
+ __publicField$a(this, "transformCase", (value) => {
11396
+ const nameCase = this.opts.case ?? "pascal";
11397
+ if (nameCase === "kebab") {
11398
+ return toKebabCaseIdentifier(value);
11399
+ }
11400
+ return toPascalCaseIdentifier(value);
11401
+ });
11402
+ }
11403
+ }
11404
+
11274
11405
  const generateOpenApiClient = async (inputFile, {
11275
11406
  name,
11276
11407
  outputDir,
@@ -11323,7 +11454,7 @@ const generateOpenApiClient = async (inputFile, {
11323
11454
  if (responseWrapper) {
11324
11455
  await modifyHttpClientAsyncWrapper([dstFile], responseWrapper, log);
11325
11456
  }
11326
- return { types: dstFile, promiseWrapper: [dstFile] };
11457
+ return dstFile;
11327
11458
  };
11328
11459
  const modifyHttpClientAsyncWrapper = async (filePaths, responseWrapper, log) => {
11329
11460
  log(
@@ -11359,8 +11490,17 @@ const getThisScriptDirname = () => {
11359
11490
  };
11360
11491
  const getTemplatesDir = () => {
11361
11492
  const currentDir = getThisScriptDirname();
11362
- const templatesRelativePath = Path$1.basename(currentDir) === "dist" ? "../templates" : "../../../templates";
11363
- return Path$1.resolve(currentDir, templatesRelativePath);
11493
+ const templateDirCandidates = [
11494
+ Path$1.resolve(currentDir, "../../templates/legacy"),
11495
+ Path$1.resolve(currentDir, "../templates/legacy")
11496
+ ];
11497
+ const templateDir = templateDirCandidates.find(existsSync);
11498
+ if (!templateDir) {
11499
+ throw new Error(
11500
+ `Legacy swagger-ts-api templates not found. Tried: ${templateDirCandidates.join(", ")}`
11501
+ );
11502
+ }
11503
+ return templateDir;
11364
11504
  };
11365
11505
 
11366
11506
  const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
@@ -11417,9 +11557,9 @@ const resolveLocalRef = (root, ref) => {
11417
11557
  return current;
11418
11558
  };
11419
11559
 
11420
- var __defProp$b = Object.defineProperty;
11421
- var __defNormalProp$b = (obj, key, value) => key in obj ? __defProp$b(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
11422
- var __publicField$b = (obj, key, value) => __defNormalProp$b(obj, key + "" , value);
11560
+ var __defProp$9 = Object.defineProperty;
11561
+ var __defNormalProp$9 = (obj, key, value) => key in obj ? __defProp$9(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
11562
+ var __publicField$9 = (obj, key, value) => __defNormalProp$9(obj, key + "" , value);
11423
11563
  const PARAMETER_LOCATIONS = [
11424
11564
  "path",
11425
11565
  "query",
@@ -11445,7 +11585,7 @@ const mergeParameters = (base, override) => {
11445
11585
  class OpenApiNormalizer {
11446
11586
  constructor(doc) {
11447
11587
  this.doc = doc;
11448
- __publicField$b(this, "problems", []);
11588
+ __publicField$9(this, "problems", []);
11449
11589
  }
11450
11590
  load() {
11451
11591
  const info = readRecord(this.doc, "info");
@@ -11788,24 +11928,24 @@ const syntheticOperationId = (method, path) => {
11788
11928
  return `_${compact}`;
11789
11929
  };
11790
11930
 
11791
- var __defProp$a = Object.defineProperty;
11792
- var __defNormalProp$a = (obj, key, value) => key in obj ? __defProp$a(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
11793
- var __publicField$a = (obj, key, value) => __defNormalProp$a(obj, typeof key !== "symbol" ? key + "" : key, value);
11931
+ var __defProp$8 = Object.defineProperty;
11932
+ var __defNormalProp$8 = (obj, key, value) => key in obj ? __defProp$8(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
11933
+ var __publicField$8 = (obj, key, value) => __defNormalProp$8(obj, typeof key !== "symbol" ? key + "" : key, value);
11794
11934
  class TsCodegen {
11795
11935
  constructor(typeExprCodegen, docRenderer) {
11796
11936
  this.typeExprCodegen = typeExprCodegen;
11797
- __publicField$a(this, "usedTypeRefs", []);
11798
- __publicField$a(this, "usedTypeRefKeys", /* @__PURE__ */ new Set());
11799
- __publicField$a(this, "docRenderer");
11800
- __publicField$a(this, "typeExpr", (typeExpr) => {
11937
+ __publicField$8(this, "usedTypeRefs", []);
11938
+ __publicField$8(this, "usedTypeRefKeys", /* @__PURE__ */ new Set());
11939
+ __publicField$8(this, "docRenderer");
11940
+ __publicField$8(this, "typeExpr", (typeExpr) => {
11801
11941
  this.collectTypeRefsFromExpr(typeExpr);
11802
11942
  return this.typeExprCodegen.toCode(typeExpr).code;
11803
11943
  });
11804
- __publicField$a(this, "declaration", (name, declaration, options = {}) => {
11944
+ __publicField$8(this, "declaration", (name, declaration, options = {}) => {
11805
11945
  this.collectTypeRefsFromDeclaration(declaration);
11806
11946
  return this.toDeclarationCode(name, declaration, options);
11807
11947
  });
11808
- __publicField$a(this, "toChunk", (name, code, exports$1, imports = []) => {
11948
+ __publicField$8(this, "toChunk", (name, code, exports$1, imports = []) => {
11809
11949
  const exportedSymbols = new Set(exports$1);
11810
11950
  const refs = this.getTypeRefs().filter((ref) => {
11811
11951
  return ref.kind !== "internal" || !exportedSymbols.has(ref.name);
@@ -11818,17 +11958,17 @@ class TsCodegen {
11818
11958
  imports
11819
11959
  };
11820
11960
  });
11821
- __publicField$a(this, "getTypeRefs", () => {
11961
+ __publicField$8(this, "getTypeRefs", () => {
11822
11962
  return this.usedTypeRefs.map((ref) => ({ ...ref }));
11823
11963
  });
11824
- __publicField$a(this, "toDeclarationCode", (name, d, o) => {
11964
+ __publicField$8(this, "toDeclarationCode", (name, d, o) => {
11825
11965
  let code = this.toDeclarationBodyCode(name, d);
11826
11966
  if (o.exported) {
11827
11967
  code = `export ${code}`;
11828
11968
  }
11829
11969
  return this.addDoc(code, d.doc);
11830
11970
  });
11831
- __publicField$a(this, "toDeclarationBodyCode", (name, declaration) => {
11971
+ __publicField$8(this, "toDeclarationBodyCode", (name, declaration) => {
11832
11972
  switch (declaration.kind) {
11833
11973
  case "typeAlias":
11834
11974
  return `type ${name} = ${this.typeExprCodegen.toCode(declaration.typeExpr).code}`;
@@ -11849,7 +11989,7 @@ ${members}
11849
11989
  }
11850
11990
  }
11851
11991
  });
11852
- __publicField$a(this, "addDoc", (code, doc) => {
11992
+ __publicField$8(this, "addDoc", (code, doc) => {
11853
11993
  if (!doc) return code;
11854
11994
  const rendered = this.docRenderer.render(doc);
11855
11995
  return rendered ? `${rendered}
@@ -11981,13 +12121,13 @@ const toTsPropertyKey = (value) => {
11981
12121
  return isTsIdentifier(value) ? value : JSON.stringify(value);
11982
12122
  };
11983
12123
 
11984
- var __defProp$9 = Object.defineProperty;
11985
- var __defNormalProp$9 = (obj, key, value) => key in obj ? __defProp$9(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
11986
- var __publicField$9 = (obj, key, value) => __defNormalProp$9(obj, typeof key !== "symbol" ? key + "" : key, value);
12124
+ var __defProp$7 = Object.defineProperty;
12125
+ var __defNormalProp$7 = (obj, key, value) => key in obj ? __defProp$7(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
12126
+ var __publicField$7 = (obj, key, value) => __defNormalProp$7(obj, typeof key !== "symbol" ? key + "" : key, value);
11987
12127
  class TypeExprCodegen {
11988
12128
  constructor(docRenderer) {
11989
- __publicField$9(this, "docRenderer");
11990
- __publicField$9(this, "toCode", (typeExpr) => {
12129
+ __publicField$7(this, "docRenderer");
12130
+ __publicField$7(this, "toCode", (typeExpr) => {
11991
12131
  switch (typeExpr.kind) {
11992
12132
  case "reference":
11993
12133
  return this.toReferenceCode(typeExpr);
@@ -12003,7 +12143,7 @@ class TypeExprCodegen {
12003
12143
  }
12004
12144
  }
12005
12145
  });
12006
- __publicField$9(this, "toReferenceCode", (typeExpr) => {
12146
+ __publicField$7(this, "toReferenceCode", (typeExpr) => {
12007
12147
  if (!typeExpr.typeArgs?.length) {
12008
12148
  return {
12009
12149
  code: typeExpr.ref.name,
@@ -12016,7 +12156,7 @@ class TypeExprCodegen {
12016
12156
  ref: typeExpr.ref
12017
12157
  };
12018
12158
  });
12019
- __publicField$9(this, "toInlineCode", (expr) => {
12159
+ __publicField$7(this, "toInlineCode", (expr) => {
12020
12160
  switch (expr.node) {
12021
12161
  case "scalar":
12022
12162
  return expr.name === "integer" ? "number" : expr.name;
@@ -12041,25 +12181,25 @@ class TypeExprCodegen {
12041
12181
  }
12042
12182
  }
12043
12183
  });
12044
- __publicField$9(this, "toIntersectionMemberCode", (typeExpr) => {
12184
+ __publicField$7(this, "toIntersectionMemberCode", (typeExpr) => {
12045
12185
  const rendered = this.toCode(typeExpr).code;
12046
12186
  return this.isUnion(typeExpr) ? `(${rendered})` : rendered;
12047
12187
  });
12048
- __publicField$9(this, "toArrayElementCode", (typeExpr) => {
12188
+ __publicField$7(this, "toArrayElementCode", (typeExpr) => {
12049
12189
  const rendered = this.toCode(typeExpr).code;
12050
12190
  return this.needsGroupingForArrayElement(typeExpr) ? `(${rendered})` : rendered;
12051
12191
  });
12052
- __publicField$9(this, "isUnion", (typeExpr) => {
12192
+ __publicField$7(this, "isUnion", (typeExpr) => {
12053
12193
  return typeExpr.kind === "inline" && typeExpr.expr.node === "union";
12054
12194
  });
12055
- __publicField$9(this, "needsGroupingForArrayElement", (typeExpr) => {
12195
+ __publicField$7(this, "needsGroupingForArrayElement", (typeExpr) => {
12056
12196
  return typeExpr.kind === "inline" && (typeExpr.expr.node === "union" || typeExpr.expr.node === "intersection");
12057
12197
  });
12058
- __publicField$9(this, "toLiteralCode", (value) => {
12198
+ __publicField$7(this, "toLiteralCode", (value) => {
12059
12199
  if (value === null) return "null";
12060
12200
  return JSON.stringify(value);
12061
12201
  });
12062
- __publicField$9(this, "toObjectCode", (properties, additionalProperties) => {
12202
+ __publicField$7(this, "toObjectCode", (properties, additionalProperties) => {
12063
12203
  const members = properties.map(
12064
12204
  (property) => this.toPropertyCode(property)
12065
12205
  );
@@ -12074,7 +12214,7 @@ class TypeExprCodegen {
12074
12214
  ${members.join("\n")}
12075
12215
  }`;
12076
12216
  });
12077
- __publicField$9(this, "toPropertyCode", (property) => {
12217
+ __publicField$7(this, "toPropertyCode", (property) => {
12078
12218
  const name = toTsPropertyKey(property.name);
12079
12219
  const optional = property.required ? "" : "?";
12080
12220
  const propertyCode = `${name}${optional}: ${this.toCode(property.typeExpr).code}`;
@@ -12089,14 +12229,14 @@ ${renderedProperty}` : renderedProperty;
12089
12229
  }
12090
12230
  }
12091
12231
 
12092
- var __defProp$8 = Object.defineProperty;
12093
- var __defNormalProp$8 = (obj, key, value) => key in obj ? __defProp$8(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
12094
- var __publicField$8 = (obj, key, value) => __defNormalProp$8(obj, typeof key !== "symbol" ? key + "" : key, value);
12232
+ var __defProp$6 = Object.defineProperty;
12233
+ var __defNormalProp$6 = (obj, key, value) => key in obj ? __defProp$6(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
12234
+ var __publicField$6 = (obj, key, value) => __defNormalProp$6(obj, typeof key !== "symbol" ? key + "" : key, value);
12095
12235
  class TsCodegenFactory {
12096
12236
  constructor(docRenderer) {
12097
- __publicField$8(this, "typeExprCodegen");
12098
- __publicField$8(this, "docRenderer");
12099
- __publicField$8(this, "forNewChunk", () => {
12237
+ __publicField$6(this, "typeExprCodegen");
12238
+ __publicField$6(this, "docRenderer");
12239
+ __publicField$6(this, "forNewChunk", () => {
12100
12240
  return new TsCodegen(this.typeExprCodegen, this.docRenderer);
12101
12241
  });
12102
12242
  this.docRenderer = docRenderer;
@@ -12149,13 +12289,13 @@ const isReservedWord = (value) => {
12149
12289
  return RESERVED_WORDS.has(value);
12150
12290
  };
12151
12291
 
12152
- var __defProp$7 = Object.defineProperty;
12153
- var __defNormalProp$7 = (obj, key, value) => key in obj ? __defProp$7(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
12154
- var __publicField$7 = (obj, key, value) => __defNormalProp$7(obj, typeof key !== "symbol" ? key + "" : key, value);
12292
+ var __defProp$5 = Object.defineProperty;
12293
+ var __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
12294
+ var __publicField$5 = (obj, key, value) => __defNormalProp$5(obj, typeof key !== "symbol" ? key + "" : key, value);
12155
12295
  class ParamsConstructor {
12156
12296
  constructor(options) {
12157
12297
  this.options = options;
12158
- __publicField$7(this, "process", (params, httpPath) => {
12298
+ __publicField$5(this, "process", (params, httpPath) => {
12159
12299
  const pathParamSpec = validatePathParams(params, httpPath);
12160
12300
  const pathParamBindings = pathParamSpec?.bindings;
12161
12301
  const funParams = params.flatMap(
@@ -12175,7 +12315,7 @@ class ParamsConstructor {
12175
12315
  hasQuery
12176
12316
  };
12177
12317
  });
12178
- __publicField$7(this, "renderOperationParams", (param, pathParamSpec) => {
12318
+ __publicField$5(this, "renderOperationParams", (param, pathParamSpec) => {
12179
12319
  if (param.kind !== "path" || !pathParamSpec) {
12180
12320
  return [
12181
12321
  {
@@ -12199,7 +12339,7 @@ class ParamsConstructor {
12199
12339
  }
12200
12340
  ];
12201
12341
  });
12202
- __publicField$7(this, "renderPathTemplateLiteral", (path, pathParamVarName, pathParamBindings) => {
12342
+ __publicField$5(this, "renderPathTemplateLiteral", (path, pathParamVarName, pathParamBindings) => {
12203
12343
  const escapedPath = path.replace(/\\/g, "\\\\").replace(/`/g, "\\`").replace(/\$\{/g, "\\${");
12204
12344
  const pathWithParams = escapedPath.replace(
12205
12345
  /\{([^}]+)\}/g,
@@ -12213,7 +12353,7 @@ class ParamsConstructor {
12213
12353
  );
12214
12354
  return `\`${pathWithParams}\``;
12215
12355
  });
12216
- __publicField$7(this, "renderPathParamDestructuring", (pathParamBindings) => {
12356
+ __publicField$5(this, "renderPathParamDestructuring", (pathParamBindings) => {
12217
12357
  const members = Object.entries(pathParamBindings).map(
12218
12358
  ([paramName, binding]) => {
12219
12359
  const key = toTsPropertyKey(paramName);
@@ -12222,7 +12362,7 @@ class ParamsConstructor {
12222
12362
  );
12223
12363
  return `{ ${members.join(", ")} }`;
12224
12364
  });
12225
- __publicField$7(this, "paramName", (p) => {
12365
+ __publicField$5(this, "paramName", (p) => {
12226
12366
  switch (p.kind) {
12227
12367
  case "body":
12228
12368
  return this.options.paramNames.body;
@@ -12343,9 +12483,9 @@ const indentBlock = (value, indent) => {
12343
12483
 
12344
12484
  const consolidateObjectShorthandProperties = (code) => code.replace(/\b([A-Za-z_$][A-Za-z0-9_$]*)\s*:\s*\1\b/g, "$1");
12345
12485
 
12346
- var __defProp$6 = Object.defineProperty;
12347
- var __defNormalProp$6 = (obj, key, value) => key in obj ? __defProp$6(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
12348
- var __publicField$6 = (obj, key, value) => __defNormalProp$6(obj, typeof key !== "symbol" ? key + "" : key, value);
12486
+ var __defProp$4 = Object.defineProperty;
12487
+ var __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
12488
+ var __publicField$4 = (obj, key, value) => __defNormalProp$4(obj, typeof key !== "symbol" ? key + "" : key, value);
12349
12489
  const REQUEST_PARAMS_TYPE = "RequestParams";
12350
12490
  const REQUEST_PARAMS_DEFAULT = "never";
12351
12491
  const REQUEST_PARAMS_ARG = "params";
@@ -12356,7 +12496,7 @@ class ApiClientCodegen {
12356
12496
  this.opts = opts;
12357
12497
  this.tsCodegenFactory = tsCodegenFactory;
12358
12498
  this.docRenderer = docRenderer;
12359
- __publicField$6(this, "generate", (apiName, operations, doc) => {
12499
+ __publicField$4(this, "generate", (apiName, operations, doc) => {
12360
12500
  const tsCodegen = this.tsCodegenFactory.forNewChunk();
12361
12501
  let httpClientType = tsCodegen.typeExpr({
12362
12502
  kind: "reference",
@@ -12381,7 +12521,7 @@ ${code}`;
12381
12521
  }
12382
12522
  return tsCodegen.toChunk("api", code, [apiName], methodsCode.imports);
12383
12523
  });
12384
- __publicField$6(this, "groupsOpsCode", (codegen, groupedOps) => combineRenderedCode(
12524
+ __publicField$4(this, "groupsOpsCode", (codegen, groupedOps) => combineRenderedCode(
12385
12525
  Object.entries(groupedOps).map(([groupName, ops]) => {
12386
12526
  const methodsCode = this.opsCode(codegen, ops, "object");
12387
12527
  return {
@@ -12395,7 +12535,7 @@ ${code}`;
12395
12535
  }),
12396
12536
  "\n\n"
12397
12537
  ));
12398
- __publicField$6(this, "opsCode", (codegen, operations, target = "class") => {
12538
+ __publicField$4(this, "opsCode", (codegen, operations, target = "class") => {
12399
12539
  const separator = target === "object" ? `,
12400
12540
  ${EMPTY_LINE_MARKER}
12401
12541
  ` : "\n\n";
@@ -12404,7 +12544,7 @@ ${EMPTY_LINE_MARKER}
12404
12544
  separator
12405
12545
  );
12406
12546
  });
12407
- __publicField$6(this, "renderOp", (op, tsCodegen, target) => {
12547
+ __publicField$4(this, "renderOp", (op, tsCodegen, target) => {
12408
12548
  const { signature: sig, http } = op;
12409
12549
  const paramNames = {
12410
12550
  path: "path",
@@ -12446,14 +12586,14 @@ ${EMPTY_LINE_MARKER}
12446
12586
  target
12447
12587
  });
12448
12588
  });
12449
- __publicField$6(this, "wrapInResponseWrapper", (typeExpr, tsCodegen) => {
12589
+ __publicField$4(this, "wrapInResponseWrapper", (typeExpr, tsCodegen) => {
12450
12590
  return tsCodegen.typeExpr({
12451
12591
  kind: "reference",
12452
12592
  ref: this.opts.httpClient.responseWrapper,
12453
12593
  typeArgs: [typeExpr]
12454
12594
  });
12455
12595
  });
12456
- __publicField$6(this, "renderFunctionCode", ({
12596
+ __publicField$4(this, "renderFunctionCode", ({
12457
12597
  doc,
12458
12598
  funName,
12459
12599
  responseType,
@@ -12502,11 +12642,11 @@ ${functionCode}` : functionCode,
12502
12642
  imports
12503
12643
  };
12504
12644
  });
12505
- __publicField$6(this, "renderOperationDoc", (doc, indent = "") => {
12645
+ __publicField$4(this, "renderOperationDoc", (doc, indent = "") => {
12506
12646
  if (!doc) return null;
12507
12647
  return indentBlock(this.docRenderer.render(this.toTsDoc(doc)), indent);
12508
12648
  });
12509
- __publicField$6(this, "renderApiClientDoc", (doc) => {
12649
+ __publicField$4(this, "renderApiClientDoc", (doc) => {
12510
12650
  if (!doc) return null;
12511
12651
  return this.docRenderer.render({
12512
12652
  nodes: [
@@ -12522,7 +12662,7 @@ ${functionCode}` : functionCode,
12522
12662
  ]
12523
12663
  });
12524
12664
  });
12525
- __publicField$6(this, "toTsDoc", (doc) => {
12665
+ __publicField$4(this, "toTsDoc", (doc) => {
12526
12666
  const nodes = [
12527
12667
  {
12528
12668
  key: "id",
@@ -12564,7 +12704,7 @@ const combineRenderedCode = (fragments, separator) => ({
12564
12704
  imports: fragments.flatMap((fragment) => fragment.imports)
12565
12705
  });
12566
12706
 
12567
- var httpClientPromiseTypesSource = "import type { HttpResponse, Request } from './common-types'\n\nexport type HttpClient<RequestParams = never> = {\n request: <Data>(\n req: Request,\n params?: RequestParams\n ) => Promise<HttpResponse<Data>>\n}\n";
12707
+ var httpClientPromiseTypesSource = "import type { HttpRequest, HttpResponse } from './common-types'\n\nexport type HttpClient<RequestParams = never> = {\n request: <Data>(\n req: HttpRequest,\n params?: RequestParams\n ) => Promise<HttpResponse<Data>>\n}\n";
12568
12708
 
12569
12709
  const promiseHttpClientRenderSpec = () => ({
12570
12710
  typeName: {
@@ -12606,7 +12746,7 @@ ${requestParamsVar}` : ""})${unwrap ? `.then(res => res.body)` : ""}
12606
12746
  }
12607
12747
  });
12608
12748
 
12609
- var httpClientObservableTypesSource = "import { Observable } from 'rxjs'\nimport type { HttpResponse, Request } from './common-types'\n\nexport type HttpClient<RequestParams = never> = {\n request: <Data>(\n req: Request,\n params?: RequestParams\n ) => Observable<HttpResponse<Data>>\n}\n";
12749
+ var httpClientObservableTypesSource = "import { Observable } from 'rxjs'\nimport type { HttpRequest, HttpResponse } from './common-types'\n\nexport type HttpClient<RequestParams = never> = {\n request: <Data>(\n req: HttpRequest,\n params?: RequestParams\n ) => Observable<HttpResponse<Data>>\n}\n";
12610
12750
 
12611
12751
  const rxJsHttpClientRenderSpec = () => ({
12612
12752
  typeName: {
@@ -12779,7 +12919,7 @@ const runtimeImportKey = (runtimeImport) => [
12779
12919
  runtimeImport.typeOnly === true ? "type" : "value"
12780
12920
  ].join("|");
12781
12921
 
12782
- var httpClientCommonTypesSource = "export type KnownRequestContentType =\n | 'application/json'\n | 'multipart/form-data'\n | 'application/x-www-form-urlencoded'\n\nexport type RequestContentType = KnownRequestContentType | string\n\nexport type QueryValue =\n | string\n | number\n | boolean\n | null\n | undefined\n | QueryValue[]\n | Record<string, any>\n // Empty schema support\n | unknown\n\nexport type QueryParams = Record<string, QueryValue>\n\nexport type Request = {\n path: string\n method: 'GET' | 'POST' | 'PUT' | 'DELETE'\n responseFormat?: 'json' | 'document'\n headers?: Record<string, string>\n query?: QueryParams\n body?: any\n contentType?: RequestContentType\n}\n\nexport type HttpResponse<Data> = {\n body: Data\n headers: Record<string, string | string[]>\n status: number\n}\n\nexport type QuerySerializer = (params: QueryParams) => string\n";
12922
+ var httpClientCommonTypesSource = "export type KnownRequestContentType =\n | 'application/json'\n | 'multipart/form-data'\n | 'application/x-www-form-urlencoded'\n\nexport type RequestContentType = KnownRequestContentType | string\n\nexport type QueryValue =\n | string\n | number\n | boolean\n | null\n | undefined\n | QueryValue[]\n | Record<string, any>\n // Empty schema support\n | unknown\n\nexport type QueryParams = Record<string, QueryValue>\n\nexport type HttpRequest = {\n path: string\n method: 'GET' | 'POST' | 'PUT' | 'DELETE'\n responseFormat?: 'json' | 'document'\n headers?: Record<string, string>\n query?: QueryParams\n body?: any\n contentType?: RequestContentType\n}\n\nexport type HttpResponse<Data> = {\n body: Data\n headers: Record<string, string | string[]>\n status: number\n}\n\nexport type QuerySerializer = (params: QueryParams) => string\n";
12783
12923
 
12784
12924
  const commonTypesCode = httpClientCommonTypesSource;
12785
12925
  const stripImports = (code) => code.replace(/^import[\s\S]*?from\s+['"][^'"]+['"]\s*;?\n?/gm, "").trim();
@@ -12801,13 +12941,13 @@ const provideHttpClientCode = (gen, opts) => {
12801
12941
  );
12802
12942
  };
12803
12943
 
12804
- var __defProp$5 = Object.defineProperty;
12805
- var __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
12806
- var __publicField$5 = (obj, key, value) => __defNormalProp$5(obj, typeof key !== "symbol" ? key + "" : key, value);
12944
+ var __defProp$3 = Object.defineProperty;
12945
+ var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
12946
+ var __publicField$3 = (obj, key, value) => __defNormalProp$3(obj, typeof key !== "symbol" ? key + "" : key, value);
12807
12947
  class TsDocRenderer {
12808
12948
  constructor(options) {
12809
12949
  this.options = options;
12810
- __publicField$5(this, "render", (doc, options = {}) => {
12950
+ __publicField$3(this, "render", (doc, options = {}) => {
12811
12951
  if (!this.options.enabled) return "";
12812
12952
  const lines = [];
12813
12953
  this.appendNodes(lines, doc.nodes, options);
@@ -12816,7 +12956,7 @@ class TsDocRenderer {
12816
12956
  }
12817
12957
  return this.renderComment(lines);
12818
12958
  });
12819
- __publicField$5(this, "renderComment", (lines) => {
12959
+ __publicField$3(this, "renderComment", (lines) => {
12820
12960
  if (!this.options.enabled) return "";
12821
12961
  if (!lines.length) return "";
12822
12962
  if (lines.length === 1) {
@@ -12827,7 +12967,7 @@ class TsDocRenderer {
12827
12967
  ${body}
12828
12968
  */`;
12829
12969
  });
12830
- __publicField$5(this, "appendDocText", (lines, value) => {
12970
+ __publicField$3(this, "appendDocText", (lines, value) => {
12831
12971
  const normalized = this.normalizeLines(value);
12832
12972
  if (!normalized.length) return;
12833
12973
  if (lines.length > 0) {
@@ -12835,19 +12975,19 @@ ${body}
12835
12975
  }
12836
12976
  lines.push(...normalized);
12837
12977
  });
12838
- __publicField$5(this, "appendField", (lines, key, value) => {
12978
+ __publicField$3(this, "appendField", (lines, key, value) => {
12839
12979
  const normalized = this.normalizeLines(value);
12840
12980
  if (!normalized.length) return;
12841
12981
  lines.push(`@${key} ${normalized[0]}`.trimEnd());
12842
12982
  lines.push(...normalized.slice(1));
12843
12983
  });
12844
- __publicField$5(this, "appendDeprecated", (lines, options) => {
12984
+ __publicField$3(this, "appendDeprecated", (lines, options) => {
12845
12985
  if (options.separate) {
12846
12986
  lines.push("");
12847
12987
  }
12848
12988
  lines.push("@deprecated");
12849
12989
  });
12850
- __publicField$5(this, "appendNodes", (lines, nodes = [], options = {}) => {
12990
+ __publicField$3(this, "appendNodes", (lines, nodes = [], options = {}) => {
12851
12991
  nodes.forEach((node) => {
12852
12992
  if (typeof node === "string") {
12853
12993
  if (options.compactText) {
@@ -12860,21 +13000,21 @@ ${body}
12860
13000
  this.appendField(lines, node.key, node.value);
12861
13001
  });
12862
13002
  });
12863
- __publicField$5(this, "normalizeLines", (value) => {
13003
+ __publicField$3(this, "normalizeLines", (value) => {
12864
13004
  const trimmed = value?.trim();
12865
13005
  if (!trimmed) return [];
12866
13006
  return trimmed.split(/\r?\n/u).map((line) => line.trimEnd().replaceAll("*/", "*\\/"));
12867
13007
  });
12868
- __publicField$5(this, "normalizeNonEmptyLines", (value) => this.normalizeLines(value).filter((line) => line.length > 0));
13008
+ __publicField$3(this, "normalizeNonEmptyLines", (value) => this.normalizeLines(value).filter((line) => line.length > 0));
12869
13009
  }
12870
13010
  }
12871
13011
 
12872
- const generateTsCode = (clientName, projectResult, opts) => {
13012
+ const generateOpenApiClientFiles = (clientName, input, opts) => {
12873
13013
  const docRenderer = new TsDocRenderer({
12874
13014
  enabled: opts.comments.enabled
12875
13015
  });
12876
13016
  const tsCodegenFac = new TsCodegenFactory(docRenderer);
12877
- const { schemaDefinitions } = projectResult;
13017
+ const { schemaDefinitions } = input;
12878
13018
  const types = [...schemaDefinitions].sort((a, b) => a.name.localeCompare(b.name)).map((def) => {
12879
13019
  const cg = tsCodegenFac.forNewChunk();
12880
13020
  const code = cg.declaration(def.name, def.declaration, {
@@ -12897,8 +13037,8 @@ const generateTsCode = (clientName, projectResult, opts) => {
12897
13037
  );
12898
13038
  const generated = clientCodegen.generate(
12899
13039
  clientName,
12900
- groupsOpsByTag(projectResult.operations),
12901
- projectResult.api
13040
+ input.operations,
13041
+ input.api
12902
13042
  );
12903
13043
  const clientModuleName = `${clientName}.client`;
12904
13044
  const typesModuleName = `${clientName}.types`;
@@ -12925,8 +13065,7 @@ const generateTsCode = (clientName, projectResult, opts) => {
12925
13065
  const all = [typesChunk, httpClientChunk, clientChunk, indexChunk];
12926
13066
  return {
12927
13067
  all,
12928
- typesName: typesChunk.name,
12929
- promiseWrappersNames: [httpClientChunk.name, clientChunk.name]
13068
+ typesName: typesChunk.name
12930
13069
  };
12931
13070
  };
12932
13071
  const createIndexFile = (moduleNames) => ({
@@ -12948,55 +13087,27 @@ const createIndexFile = (moduleNames) => ({
12948
13087
  }
12949
13088
  ]
12950
13089
  });
12951
- const groupsOpsByTag = (operations) => {
12952
- const groupedOps = {};
12953
- const rawTagsByNormalizedName = /* @__PURE__ */ new Map();
12954
- operations.forEach((operation) => {
12955
- const rawTag = operation.tags.find((tag) => tag.trim())?.trim() || "root";
12956
- let groupName;
12957
- try {
12958
- groupName = toTsCamelIdentifier(rawTag, {
12959
- leadingDigitPrefix: "tag"
12960
- });
12961
- } catch {
12962
- throw new Error(
12963
- `Invalid OpenAPI tag "${rawTag}": could not derive a client group name.`
12964
- );
12965
- }
12966
- const existingRawTag = rawTagsByNormalizedName.get(groupName);
12967
- if (existingRawTag && existingRawTag !== rawTag) {
12968
- throw new Error(
12969
- `Tag naming collision: "${existingRawTag}" and "${rawTag}" both normalize to "${groupName}". Rename one of these OpenAPI tags to continue.`
12970
- );
12971
- }
12972
- rawTagsByNormalizedName.set(groupName, rawTag);
12973
- const bucket = groupedOps[groupName] ?? [];
12974
- bucket.push(operation.op);
12975
- groupedOps[groupName] = bucket;
12976
- });
12977
- return groupedOps;
12978
- };
12979
13090
 
12980
- var __defProp$4 = Object.defineProperty;
12981
- var __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
12982
- var __publicField$4 = (obj, key, value) => __defNormalProp$4(obj, typeof key !== "symbol" ? key + "" : key, value);
13091
+ var __defProp$2 = Object.defineProperty;
13092
+ var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
13093
+ var __publicField$2 = (obj, key, value) => __defNormalProp$2(obj, typeof key !== "symbol" ? key + "" : key, value);
12983
13094
  const TS_IDENTIFIER_PATTERN = /^[$A-Z_][0-9A-Z_$]*$/i;
12984
13095
  class ToTypeExprConverter {
12985
13096
  constructor(schemas = {}, options) {
12986
13097
  this.schemas = schemas;
12987
13098
  this.options = options;
12988
- __publicField$4(this, "schemaCache", /* @__PURE__ */ new WeakMap());
12989
- __publicField$4(this, "refCache", /* @__PURE__ */ new Map());
12990
- __publicField$4(this, "schemaDefinitions", []);
12991
- __publicField$4(this, "schemaDefinitionsById", /* @__PURE__ */ new Map());
12992
- __publicField$4(this, "schemaDefinitionsInProgress", /* @__PURE__ */ new Set());
12993
- __publicField$4(this, "getSchemaDefinitions", () => this.schemaDefinitions);
12994
- __publicField$4(this, "registerAllSchemaDefinitions", () => {
13099
+ __publicField$2(this, "schemaCache", /* @__PURE__ */ new WeakMap());
13100
+ __publicField$2(this, "refCache", /* @__PURE__ */ new Map());
13101
+ __publicField$2(this, "schemaDefinitions", []);
13102
+ __publicField$2(this, "schemaDefinitionsById", /* @__PURE__ */ new Map());
13103
+ __publicField$2(this, "schemaDefinitionsInProgress", /* @__PURE__ */ new Set());
13104
+ __publicField$2(this, "getSchemaDefinitions", () => this.schemaDefinitions);
13105
+ __publicField$2(this, "registerAllSchemaDefinitions", () => {
12995
13106
  Object.keys(this.schemas).forEach((schemaName) => {
12996
13107
  this.ensureSchemaDefinition(`#/components/schemas/${schemaName}`);
12997
13108
  });
12998
13109
  });
12999
- __publicField$4(this, "fromTypeExpr", (schema) => {
13110
+ __publicField$2(this, "fromTypeExpr", (schema) => {
13000
13111
  if (!schema) {
13001
13112
  return this.scalar("unknown");
13002
13113
  }
@@ -13019,14 +13130,14 @@ class ToTypeExprConverter {
13019
13130
  }
13020
13131
  return result;
13021
13132
  });
13022
- __publicField$4(this, "scalar", (name) => ({
13133
+ __publicField$2(this, "scalar", (name) => ({
13023
13134
  kind: "inline",
13024
13135
  expr: {
13025
13136
  node: "scalar",
13026
13137
  name
13027
13138
  }
13028
13139
  }));
13029
- __publicField$4(this, "union", (members) => {
13140
+ __publicField$2(this, "union", (members) => {
13030
13141
  const flatMembers = [];
13031
13142
  for (const member of members) {
13032
13143
  if (member.kind === "inline" && member.expr.node === "union") {
@@ -13046,14 +13157,14 @@ class ToTypeExprConverter {
13046
13157
  }
13047
13158
  };
13048
13159
  });
13049
- __publicField$4(this, "literal", (value) => ({
13160
+ __publicField$2(this, "literal", (value) => ({
13050
13161
  kind: "inline",
13051
13162
  expr: {
13052
13163
  node: "literal",
13053
13164
  value
13054
13165
  }
13055
13166
  }));
13056
- __publicField$4(this, "ref", (id) => {
13167
+ __publicField$2(this, "ref", (id) => {
13057
13168
  const name = this.refNameFromPath(id);
13058
13169
  return {
13059
13170
  kind: "reference",
@@ -13063,14 +13174,14 @@ class ToTypeExprConverter {
13063
13174
  }
13064
13175
  };
13065
13176
  });
13066
- __publicField$4(this, "builtinRef", (name) => ({
13177
+ __publicField$2(this, "builtinRef", (name) => ({
13067
13178
  kind: "reference",
13068
13179
  ref: {
13069
13180
  kind: "builtin",
13070
13181
  name
13071
13182
  }
13072
13183
  }));
13073
- __publicField$4(this, "refNameFromPath", (ref) => {
13184
+ __publicField$2(this, "refNameFromPath", (ref) => {
13074
13185
  const parts = ref.split("/");
13075
13186
  const name = parts[parts.length - 1];
13076
13187
  if (!name) {
@@ -13078,16 +13189,16 @@ class ToTypeExprConverter {
13078
13189
  }
13079
13190
  return name;
13080
13191
  });
13081
- __publicField$4(this, "refCacheKey", (schema) => {
13192
+ __publicField$2(this, "refCacheKey", (schema) => {
13082
13193
  return `${schema.$ref}|nullable:${schema.nullable === true}`;
13083
13194
  });
13084
- __publicField$4(this, "isUnconstrainedSchema", (schema) => {
13195
+ __publicField$2(this, "isUnconstrainedSchema", (schema) => {
13085
13196
  const meaningfulKeys = Object.keys(schema).filter(
13086
13197
  (key) => key !== "nullable"
13087
13198
  );
13088
13199
  return meaningfulKeys.length === 0;
13089
13200
  });
13090
- __publicField$4(this, "ensureSchemaDefinition", (refId) => {
13201
+ __publicField$2(this, "ensureSchemaDefinition", (refId) => {
13091
13202
  if (this.schemaDefinitionsById.has(refId) || this.schemaDefinitionsInProgress.has(refId)) {
13092
13203
  return;
13093
13204
  }
@@ -13108,18 +13219,18 @@ class ToTypeExprConverter {
13108
13219
  this.schemaDefinitionsInProgress.delete(refId);
13109
13220
  }
13110
13221
  });
13111
- __publicField$4(this, "isSchemaNode", (value) => {
13222
+ __publicField$2(this, "isSchemaNode", (value) => {
13112
13223
  return Boolean(
13113
13224
  value && typeof value === "object" && !Array.isArray(value)
13114
13225
  );
13115
13226
  });
13116
- __publicField$4(this, "toLiteralValue", (value) => {
13227
+ __publicField$2(this, "toLiteralValue", (value) => {
13117
13228
  if (value === null || typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
13118
13229
  return value;
13119
13230
  }
13120
13231
  throw new Error(`Unsupported literal value: ${String(value)}`);
13121
13232
  });
13122
- __publicField$4(this, "toDeclaration", (schema) => {
13233
+ __publicField$2(this, "toDeclaration", (schema) => {
13123
13234
  const enumDeclaration = this.toEnumDeclaration(schema);
13124
13235
  if (enumDeclaration) {
13125
13236
  return enumDeclaration;
@@ -13130,7 +13241,7 @@ class ToTypeExprConverter {
13130
13241
  typeExpr: this.fromTypeExpr(schema)
13131
13242
  };
13132
13243
  });
13133
- __publicField$4(this, "toEnumDeclaration", (schema) => {
13244
+ __publicField$2(this, "toEnumDeclaration", (schema) => {
13134
13245
  if (this.options.enumStyle !== "enum" || !Array.isArray(schema.enum)) {
13135
13246
  return void 0;
13136
13247
  }
@@ -13145,7 +13256,7 @@ class ToTypeExprConverter {
13145
13256
  members: this.toEnumMembers(schema.enum)
13146
13257
  };
13147
13258
  });
13148
- __publicField$4(this, "getEnumValueType", (values) => {
13259
+ __publicField$2(this, "getEnumValueType", (values) => {
13149
13260
  if (!values.length) {
13150
13261
  return void 0;
13151
13262
  }
@@ -13157,7 +13268,7 @@ class ToTypeExprConverter {
13157
13268
  }
13158
13269
  return void 0;
13159
13270
  });
13160
- __publicField$4(this, "toEnumMembers", (values) => {
13271
+ __publicField$2(this, "toEnumMembers", (values) => {
13161
13272
  const usedNames = /* @__PURE__ */ new Map();
13162
13273
  return values.map((value, index) => {
13163
13274
  const enumValue = value;
@@ -13170,7 +13281,7 @@ class ToTypeExprConverter {
13170
13281
  };
13171
13282
  });
13172
13283
  });
13173
- __publicField$4(this, "toEnumMemberBaseName", (value, index) => {
13284
+ __publicField$2(this, "toEnumMemberBaseName", (value, index) => {
13174
13285
  if (typeof value === "string" && this.options.uppercaseEnumKeys) {
13175
13286
  const compatName = this.toCompatEnumMemberName(value);
13176
13287
  if (compatName) {
@@ -13186,14 +13297,14 @@ class ToTypeExprConverter {
13186
13297
  const pascalName = toPascalCaseIdentifier(String(value));
13187
13298
  return pascalName === "Api" ? `Value${index + 1}` : pascalName;
13188
13299
  });
13189
- __publicField$4(this, "toCompatEnumMemberName", (value) => {
13300
+ __publicField$2(this, "toCompatEnumMemberName", (value) => {
13190
13301
  if (/^([A-Z_]{1,})$/g.test(value)) {
13191
13302
  return value;
13192
13303
  }
13193
13304
  const pascalName = toPascalCaseIdentifier(value);
13194
13305
  return pascalName === "Api" ? void 0 : pascalName;
13195
13306
  });
13196
- __publicField$4(this, "isScalarName", (value) => {
13307
+ __publicField$2(this, "isScalarName", (value) => {
13197
13308
  switch (value) {
13198
13309
  case "string":
13199
13310
  case "number":
@@ -13209,7 +13320,7 @@ class ToTypeExprConverter {
13209
13320
  return false;
13210
13321
  }
13211
13322
  });
13212
- __publicField$4(this, "hasNullMember", (expr) => {
13323
+ __publicField$2(this, "hasNullMember", (expr) => {
13213
13324
  if (expr.kind !== "inline") return false;
13214
13325
  if (expr.expr.node === "scalar") {
13215
13326
  return expr.expr.name === "null";
@@ -13219,13 +13330,13 @@ class ToTypeExprConverter {
13219
13330
  }
13220
13331
  return false;
13221
13332
  });
13222
- __publicField$4(this, "withNullable", (expr) => {
13333
+ __publicField$2(this, "withNullable", (expr) => {
13223
13334
  if (this.hasNullMember(expr)) {
13224
13335
  return expr;
13225
13336
  }
13226
13337
  return this.union([expr, this.scalar("null")]);
13227
13338
  });
13228
- __publicField$4(this, "projectObjectType", (schema) => {
13339
+ __publicField$2(this, "projectObjectType", (schema) => {
13229
13340
  const requiredRaw = schema.required;
13230
13341
  if (requiredRaw !== void 0 && !Array.isArray(requiredRaw)) {
13231
13342
  throw new Error(
@@ -13290,7 +13401,7 @@ class ToTypeExprConverter {
13290
13401
  }
13291
13402
  };
13292
13403
  });
13293
- __publicField$4(this, "isRequiredProperty", (name, required, propertySchema) => {
13404
+ __publicField$2(this, "isRequiredProperty", (name, required, propertySchema) => {
13294
13405
  if (required.has(name)) {
13295
13406
  return true;
13296
13407
  }
@@ -13299,7 +13410,7 @@ class ToTypeExprConverter {
13299
13410
  }
13300
13411
  return propertySchema.required === true;
13301
13412
  });
13302
- __publicField$4(this, "mapSchemaArrayMembers", (value, kind) => {
13413
+ __publicField$2(this, "mapSchemaArrayMembers", (value, kind) => {
13303
13414
  if (!Array.isArray(value) || !value.length) {
13304
13415
  throw new Error(
13305
13416
  `Unsupported schema: ${kind} must be a non-empty array`
@@ -13314,10 +13425,10 @@ class ToTypeExprConverter {
13314
13425
  return this.fromTypeExpr(entry);
13315
13426
  });
13316
13427
  });
13317
- __publicField$4(this, "isBinaryFileSchema", (schema) => {
13428
+ __publicField$2(this, "isBinaryFileSchema", (schema) => {
13318
13429
  return schema.type === "string" && schema.format === "binary";
13319
13430
  });
13320
- __publicField$4(this, "getSchemaDoc", (schema) => {
13431
+ __publicField$2(this, "getSchemaDoc", (schema) => {
13321
13432
  const summary = typeof schema.summary === "string" ? schema.summary : void 0;
13322
13433
  const description = typeof schema.description === "string" ? schema.description : void 0;
13323
13434
  const deprecated = typeof schema.deprecated === "boolean" ? schema.deprecated : void 0;
@@ -13338,7 +13449,7 @@ class ToTypeExprConverter {
13338
13449
  nodes
13339
13450
  };
13340
13451
  });
13341
- __publicField$4(this, "getSchemaAnnotations", (schema) => {
13452
+ __publicField$2(this, "getSchemaAnnotations", (schema) => {
13342
13453
  if (this.options.comments?.metadata === false) return [];
13343
13454
  return [
13344
13455
  this.annotationNode("format", schema.format),
@@ -13365,14 +13476,14 @@ class ToTypeExprConverter {
13365
13476
  (value) => value !== void 0
13366
13477
  );
13367
13478
  });
13368
- __publicField$4(this, "annotationNode", (name, value) => {
13479
+ __publicField$2(this, "annotationNode", (name, value) => {
13369
13480
  if (value === void 0) return void 0;
13370
13481
  return {
13371
13482
  key: name,
13372
13483
  value: String(value)
13373
13484
  };
13374
13485
  });
13375
- __publicField$4(this, "stringifyAnnotationValue", (value) => {
13486
+ __publicField$2(this, "stringifyAnnotationValue", (value) => {
13376
13487
  if (value === void 0) return void 0;
13377
13488
  if (value && typeof value === "object") {
13378
13489
  return JSON.stringify(value);
@@ -13382,7 +13493,7 @@ class ToTypeExprConverter {
13382
13493
  }
13383
13494
  return String(value);
13384
13495
  });
13385
- __publicField$4(this, "fromSchemaCore", (schema) => {
13496
+ __publicField$2(this, "fromSchemaCore", (schema) => {
13386
13497
  if (this.isUnconstrainedSchema(schema)) {
13387
13498
  return this.scalar("unknown");
13388
13499
  }
@@ -13462,9 +13573,9 @@ class ToTypeExprConverter {
13462
13573
  }
13463
13574
  }
13464
13575
 
13465
- var __defProp$3 = Object.defineProperty;
13466
- var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
13467
- var __publicField$3 = (obj, key, value) => __defNormalProp$3(obj, typeof key !== "symbol" ? key + "" : key, value);
13576
+ var __defProp$1 = Object.defineProperty;
13577
+ var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
13578
+ var __publicField$1 = (obj, key, value) => __defNormalProp$1(obj, typeof key !== "symbol" ? key + "" : key, value);
13468
13579
  const pickPreferredMediaType = (mediaTypes) => {
13469
13580
  if (!mediaTypes.length) return void 0;
13470
13581
  const exactJson = mediaTypes.find((media) => media === "application/json");
@@ -13544,9 +13655,9 @@ const toHttpMethodUpper = (method) => {
13544
13655
  class OperationProjector {
13545
13656
  constructor(options) {
13546
13657
  this.options = options;
13547
- __publicField$3(this, "seenOperationIds", /* @__PURE__ */ new Set());
13548
- __publicField$3(this, "typeExprConverter");
13549
- __publicField$3(this, "project", (openApi) => {
13658
+ __publicField$1(this, "seenOperationIds", /* @__PURE__ */ new Set());
13659
+ __publicField$1(this, "typeExprConverter");
13660
+ __publicField$1(this, "project", (openApi) => {
13550
13661
  this.seenOperationIds.clear();
13551
13662
  this.typeExprConverter = new ToTypeExprConverter(
13552
13663
  openApi.schemas,
@@ -13577,7 +13688,7 @@ class OperationProjector {
13577
13688
  schemaDefinitions: this.typeExprConverter.getSchemaDefinitions()
13578
13689
  };
13579
13690
  });
13580
- __publicField$3(this, "projectOne", (operationName, operation) => {
13691
+ __publicField$1(this, "projectOne", (operationName, operation) => {
13581
13692
  this.seenOperationIds.add(operationName);
13582
13693
  const parameters = [];
13583
13694
  const pathParameter = this.projectPathParameter(operation);
@@ -13606,7 +13717,7 @@ class OperationProjector {
13606
13717
  tags: [...operation.tags]
13607
13718
  };
13608
13719
  });
13609
- __publicField$3(this, "projectRequestContentType", (requestBody) => {
13720
+ __publicField$1(this, "projectRequestContentType", (requestBody) => {
13610
13721
  const { mediaType } = getPreferredMediaTypeEntry(
13611
13722
  requestBody?.content ?? {}
13612
13723
  );
@@ -13619,7 +13730,7 @@ class OperationProjector {
13619
13730
  return void 0;
13620
13731
  }
13621
13732
  });
13622
- __publicField$3(this, "projectResponseFormat", (operation) => {
13733
+ __publicField$1(this, "projectResponseFormat", (operation) => {
13623
13734
  const selectedResponses = selectReturnResponses(operation.responses);
13624
13735
  if (!selectedResponses.length) {
13625
13736
  return void 0;
@@ -13636,7 +13747,7 @@ class OperationProjector {
13636
13747
  }
13637
13748
  return void 0;
13638
13749
  });
13639
- __publicField$3(this, "projectParameterGroupTypeExpr", (params) => {
13750
+ __publicField$1(this, "projectParameterGroupTypeExpr", (params) => {
13640
13751
  const properties = Object.entries(params).map(([name, parameter]) => ({
13641
13752
  doc: this.toParameterDoc(parameter),
13642
13753
  name,
@@ -13653,7 +13764,7 @@ class OperationProjector {
13653
13764
  }
13654
13765
  };
13655
13766
  });
13656
- __publicField$3(this, "projectPathParameter", (operation) => {
13767
+ __publicField$1(this, "projectPathParameter", (operation) => {
13657
13768
  const params = operation.parameters.path;
13658
13769
  const entries = Object.values(params);
13659
13770
  if (!entries.length) return null;
@@ -13666,7 +13777,7 @@ class OperationProjector {
13666
13777
  typeExpr: this.projectParameterGroupTypeExpr(params)
13667
13778
  };
13668
13779
  });
13669
- __publicField$3(this, "projectQueryParameter", (operation) => {
13780
+ __publicField$1(this, "projectQueryParameter", (operation) => {
13670
13781
  const params = operation.parameters.query;
13671
13782
  const entries = Object.values(params);
13672
13783
  if (!entries.length) return null;
@@ -13676,7 +13787,7 @@ class OperationProjector {
13676
13787
  typeExpr: this.projectParameterGroupTypeExpr(params)
13677
13788
  };
13678
13789
  });
13679
- __publicField$3(this, "projectBodyParameter", (operation) => {
13790
+ __publicField$1(this, "projectBodyParameter", (operation) => {
13680
13791
  const requestBody = operation.requestBody;
13681
13792
  if (!requestBody) return null;
13682
13793
  return {
@@ -13687,7 +13798,7 @@ class OperationProjector {
13687
13798
  )
13688
13799
  };
13689
13800
  });
13690
- __publicField$3(this, "projectReturnType", (operation) => {
13801
+ __publicField$1(this, "projectReturnType", (operation) => {
13691
13802
  const selectedResponses = selectReturnResponses(operation.responses);
13692
13803
  if (!selectedResponses.length) {
13693
13804
  return this.typeExprConverter.scalar("void");
@@ -13701,17 +13812,17 @@ class OperationProjector {
13701
13812
  });
13702
13813
  return this.typeExprConverter.union(responseTypes);
13703
13814
  });
13704
- __publicField$3(this, "selectParameterSchema", (parameter) => {
13815
+ __publicField$1(this, "selectParameterSchema", (parameter) => {
13705
13816
  if (parameter.schema) return parameter.schema;
13706
13817
  return getPreferredMediaTypeEntry(parameter.content).media?.schema;
13707
13818
  });
13708
- __publicField$3(this, "selectRequestBodySchema", (requestBody) => {
13819
+ __publicField$1(this, "selectRequestBodySchema", (requestBody) => {
13709
13820
  return getPreferredMediaTypeEntry(requestBody.content).media?.schema;
13710
13821
  });
13711
- __publicField$3(this, "selectResponseSchema", (response) => {
13822
+ __publicField$1(this, "selectResponseSchema", (response) => {
13712
13823
  return getPreferredMediaTypeEntry(response.content).media?.schema;
13713
13824
  });
13714
- __publicField$3(this, "toParameterDoc", (parameter) => {
13825
+ __publicField$1(this, "toParameterDoc", (parameter) => {
13715
13826
  if (!parameter.description && !parameter.deprecated) {
13716
13827
  return void 0;
13717
13828
  }
@@ -13720,7 +13831,7 @@ class OperationProjector {
13720
13831
  nodes: parameter.description ? [parameter.description] : []
13721
13832
  };
13722
13833
  });
13723
- __publicField$3(this, "toOperationDoc", (operationName, operation) => {
13834
+ __publicField$1(this, "toOperationDoc", (operationName, operation) => {
13724
13835
  return {
13725
13836
  id: operationName,
13726
13837
  request: `${toHttpMethodUpper(operation.method)}:${operation.path}`,
@@ -13780,21 +13891,21 @@ const renderImportedSymbol = (importedSymbol, importKind) => [
13780
13891
  importedSymbol.alias ? `as ${importedSymbol.alias}` : void 0
13781
13892
  ].filter(Boolean).join(" ");
13782
13893
 
13783
- var __defProp$2 = Object.defineProperty;
13784
- var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
13785
- var __publicField$2 = (obj, key, value) => __defNormalProp$2(obj, typeof key !== "symbol" ? key + "" : key, value);
13894
+ var __defProp = Object.defineProperty;
13895
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
13896
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
13786
13897
  class CodeWriter {
13787
13898
  constructor(formatter, fw) {
13788
13899
  this.formatter = formatter;
13789
13900
  this.fw = fw;
13790
- __publicField$2(this, "symbolChunkMap", /* @__PURE__ */ new Map());
13791
- __publicField$2(this, "resolveModuleName", (chunkName) => {
13901
+ __publicField(this, "symbolChunkMap", /* @__PURE__ */ new Map());
13902
+ __publicField(this, "resolveModuleName", (chunkName) => {
13792
13903
  return this.fw.resolveName({
13793
13904
  name: chunkName,
13794
13905
  ext: "ts"
13795
13906
  });
13796
13907
  });
13797
- __publicField$2(this, "write", async (files) => {
13908
+ __publicField(this, "write", async (files) => {
13798
13909
  this.symbolChunkMap = this.createSymbolChunkMap(files);
13799
13910
  const writtenPaths = {};
13800
13911
  for (const file of files) {
@@ -13812,7 +13923,7 @@ class CodeWriter {
13812
13923
  }
13813
13924
  return writtenPaths;
13814
13925
  });
13815
- __publicField$2(this, "createSymbolChunkMap", (files) => {
13926
+ __publicField(this, "createSymbolChunkMap", (files) => {
13816
13927
  const map = /* @__PURE__ */ new Map();
13817
13928
  for (const chunk of files) {
13818
13929
  if (isTsBarrelFile(chunk)) continue;
@@ -13827,7 +13938,7 @@ class CodeWriter {
13827
13938
  }
13828
13939
  return map;
13829
13940
  });
13830
- __publicField$2(this, "renderCodeChunk", (chunk) => {
13941
+ __publicField(this, "renderCodeChunk", (chunk) => {
13831
13942
  const imports = this.collectImports(chunk).map(
13832
13943
  this.toImportStatementSymbol
13833
13944
  );
@@ -13837,10 +13948,10 @@ class CodeWriter {
13837
13948
  ` : "";
13838
13949
  return importCode + chunk.code;
13839
13950
  });
13840
- __publicField$2(this, "renderBarrelFile", (file) => file.exports.map(
13951
+ __publicField(this, "renderBarrelFile", (file) => file.exports.map(
13841
13952
  (exportStatement) => this.renderBarrelExportStatement(exportStatement)
13842
13953
  ).join("\n"));
13843
- __publicField$2(this, "renderBarrelExportStatement", (exportStatement) => {
13954
+ __publicField(this, "renderBarrelExportStatement", (exportStatement) => {
13844
13955
  const from = `./${this.resolveModuleName(exportStatement.from)}`;
13845
13956
  if (exportStatement.kind === "all") {
13846
13957
  return exportStatement.typeOnly ? `export type * from '${from}'` : `export * from '${from}'`;
@@ -13851,7 +13962,7 @@ class CodeWriter {
13851
13962
  }).join(", ");
13852
13963
  return `export { ${names} } from '${from}'`;
13853
13964
  });
13854
- __publicField$2(this, "collectImports", (chunk) => {
13965
+ __publicField(this, "collectImports", (chunk) => {
13855
13966
  const imports = [];
13856
13967
  for (const ref of chunk.refs) {
13857
13968
  if (ref.kind === "builtin") continue;
@@ -13884,13 +13995,13 @@ class CodeWriter {
13884
13995
  }
13885
13996
  return imports;
13886
13997
  });
13887
- __publicField$2(this, "toImportStatementSymbol", (importedSymbol) => ({
13998
+ __publicField(this, "toImportStatementSymbol", (importedSymbol) => ({
13888
13999
  name: importedSymbol.name,
13889
14000
  alias: importedSymbol.alias,
13890
14001
  source: this.importSourceToString(importedSymbol.source),
13891
14002
  typeOnly: importedSymbol.typeOnly
13892
14003
  }));
13893
- __publicField$2(this, "importSourceToString", (src) => {
14004
+ __publicField(this, "importSourceToString", (src) => {
13894
14005
  return "module" in src ? src.module : (
13895
14006
  // TODO generalize later when we have different paths
13896
14007
  `./${this.resolveModuleName(src.name)}`
@@ -13905,7 +14016,7 @@ const getWriteOpts = (file) => ({
13905
14016
  noSuffix: isTsBarrelFile(file)
13906
14017
  });
13907
14018
 
13908
- class VNextOasClientGenerator {
14019
+ class OpenApiClientGenerator {
13909
14020
  constructor(options, log) {
13910
14021
  this.options = options;
13911
14022
  this.log = log;
@@ -13927,17 +14038,17 @@ class VNextOasClientGenerator {
13927
14038
  }).project(openApiIr);
13928
14039
  const writer = new CodeWriter(formatter, fw);
13929
14040
  const clientName = toPascalCaseIdentifier(apiName);
13930
- const chunks = generateTsCode(clientName, projectResult, {
14041
+ const input = {
14042
+ api: projectResult.api,
14043
+ operations: this.groupOpsByTag(projectResult.operations),
14044
+ schemaDefinitions: projectResult.schemaDefinitions
14045
+ };
14046
+ const chunks = generateOpenApiClientFiles(clientName, input, {
13931
14047
  ...this.options.codegen,
13932
14048
  httpClient: this.options.httpClient
13933
14049
  });
13934
14050
  const writtenPaths = await writer.write(chunks.all);
13935
- return {
13936
- promiseWrapper: chunks.promiseWrappersNames.map(
13937
- (name) => writtenPaths[name]
13938
- ),
13939
- types: writtenPaths[chunks.typesName]
13940
- };
14051
+ return writtenPaths[chunks.typesName];
13941
14052
  }
13942
14053
  filterOperations(openApiIr) {
13943
14054
  const ignoreTags = new Set(
@@ -13957,6 +14068,34 @@ class VNextOasClientGenerator {
13957
14068
  })
13958
14069
  };
13959
14070
  }
14071
+ groupOpsByTag(operations) {
14072
+ const groupedOps = {};
14073
+ const rawTagsByNormalizedName = /* @__PURE__ */ new Map();
14074
+ operations.forEach((operation) => {
14075
+ const rawTag = operation.tags.find((tag) => tag.trim())?.trim() || "root";
14076
+ let groupName;
14077
+ try {
14078
+ groupName = toTsCamelIdentifier(rawTag, {
14079
+ leadingDigitPrefix: "tag"
14080
+ });
14081
+ } catch {
14082
+ throw new Error(
14083
+ `Invalid OpenAPI tag "${rawTag}": could not derive a client group name.`
14084
+ );
14085
+ }
14086
+ const existingRawTag = rawTagsByNormalizedName.get(groupName);
14087
+ if (existingRawTag && existingRawTag !== rawTag) {
14088
+ throw new Error(
14089
+ `Tag naming collision: "${existingRawTag}" and "${rawTag}" both normalize to "${groupName}". Rename one of these OpenAPI tags to continue.`
14090
+ );
14091
+ }
14092
+ rawTagsByNormalizedName.set(groupName, rawTag);
14093
+ const bucket = groupedOps[groupName] ?? [];
14094
+ bucket.push(operation.op);
14095
+ groupedOps[groupName] = bucket;
14096
+ });
14097
+ return groupedOps;
14098
+ }
13960
14099
  normalizeSchema(rawSchema, inputFile) {
13961
14100
  const { result, problems } = new OpenApiNormalizer(rawSchema).load();
13962
14101
  problems.forEach((problem) => {
@@ -13999,11 +14138,11 @@ const toErrorMessage = (error) => {
13999
14138
  return error instanceof Error ? error.message : String(error);
14000
14139
  };
14001
14140
 
14002
- const generateOpenApiModel = async (spectPath, config, log, codeFormatter, fw) => {
14003
- let outFiles;
14141
+ const generateOasModel = async (spectPath, config, log, codeFormatter, fw) => {
14142
+ let typesFilePath;
14004
14143
  const { openApiGenerator } = config;
14005
14144
  if ("legacy" in openApiGenerator) {
14006
- outFiles = await generateOpenApiClient(
14145
+ typesFilePath = await generateOpenApiClient(
14007
14146
  spectPath,
14008
14147
  {
14009
14148
  ...openApiGenerator.legacy,
@@ -14013,7 +14152,7 @@ const generateOpenApiModel = async (spectPath, config, log, codeFormatter, fw) =
14013
14152
  log
14014
14153
  );
14015
14154
  } else {
14016
- outFiles = await new VNextOasClientGenerator(
14155
+ typesFilePath = await new OpenApiClientGenerator(
14017
14156
  openApiGenerator,
14018
14157
  log
14019
14158
  ).generate(
@@ -14026,136 +14165,8 @@ const generateOpenApiModel = async (spectPath, config, log, codeFormatter, fw) =
14026
14165
  fw
14027
14166
  );
14028
14167
  }
14029
- return { typesFilePath: outFiles.types };
14030
- };
14031
-
14032
- const removeGenericTypes = (code) => {
14033
- const declarations = [];
14034
- const declarationStartRegex = /^export\s+(interface|enum|type)\s+[A-Za-z0-9_]+(?:<[^>\n]+>)?/gm;
14035
- let match;
14036
- while ((match = declarationStartRegex.exec(code)) !== null) {
14037
- const declaration = extractDeclaration(code, match);
14038
- if (!declaration) continue;
14039
- declarations.push(declaration);
14040
- declarationStartRegex.lastIndex = match.index + declaration.length;
14041
- }
14042
- return declarations.join("\n\n");
14043
- };
14044
- const extractDeclaration = (code, match) => {
14045
- const header = match[0];
14046
- if (header.includes("<")) return null;
14047
- const kind = match[1];
14048
- let cursor = match.index + header.length;
14049
- if (kind === "type") {
14050
- cursor = skipWhitespace(code, cursor);
14051
- if (code[cursor] !== "=") return null;
14052
- cursor = skipWhitespace(code, cursor + 1);
14053
- if (code[cursor] !== "{") return null;
14054
- } else {
14055
- cursor = code.indexOf("{", cursor);
14056
- if (cursor === -1) return null;
14057
- }
14058
- const end = findMatchingBrace(code, cursor);
14059
- if (end === -1) return null;
14060
- return code.slice(match.index, end + 1);
14061
- };
14062
- const skipWhitespace = (code, cursor) => {
14063
- while (/\s/.test(code[cursor] ?? "")) {
14064
- cursor += 1;
14065
- }
14066
- return cursor;
14168
+ return { typesFilePath };
14067
14169
  };
14068
- const findMatchingBrace = (code, openBraceIndex) => {
14069
- let depth = 0;
14070
- for (let i = openBraceIndex; i < code.length; i += 1) {
14071
- if (code[i] === "{") depth += 1;
14072
- if (code[i] === "}") {
14073
- depth -= 1;
14074
- if (depth === 0) return i;
14075
- }
14076
- }
14077
- return -1;
14078
- };
14079
-
14080
- var __defProp$1 = Object.defineProperty;
14081
- var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
14082
- var __publicField$1 = (obj, key, value) => __defNormalProp$1(obj, key + "" , value);
14083
- class ZodSchemaGenerator {
14084
- constructor(codeFormatter) {
14085
- this.codeFormatter = codeFormatter;
14086
- __publicField$1(this, "generate", async ({
14087
- sourceText,
14088
- moduleImportPath,
14089
- options = {}
14090
- }) => {
14091
- const { getZodSchemasFile } = generate({
14092
- sourceText: removeGenericTypes(sourceText)
14093
- });
14094
- let generated = getZodSchemasFile(moduleImportPath);
14095
- generated = generated.replaceAll(".optional()", ".nullable()");
14096
- generated = generated.replaceAll(".int64()", ".int()");
14097
- if (options.localDateTimes) {
14098
- generated = generated.replaceAll(
14099
- "z.string().datetime()",
14100
- "z.string().datetime({local: true})"
14101
- );
14102
- }
14103
- return this.codeFormatter.format(generated);
14104
- });
14105
- }
14106
- }
14107
-
14108
- var __defProp = Object.defineProperty;
14109
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
14110
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
14111
- class FileWriter {
14112
- constructor(outputDir, opts = {}) {
14113
- this.outputDir = outputDir;
14114
- this.opts = opts;
14115
- __publicField(this, "resolveName", (req, opts) => {
14116
- let name = opts?.preserveCase ? req.name : this.setNameCase(req.name);
14117
- if (this.opts.suffix && opts?.noSuffix !== true) {
14118
- name = name + "." + this.opts.suffix;
14119
- }
14120
- if (this.opts.mapFileName)
14121
- name = this.opts.mapFileName({
14122
- name,
14123
- ext: req.ext
14124
- });
14125
- return name;
14126
- });
14127
- __publicField(this, "resolvePath", (req, opts) => this.getResolvedPath(req, opts));
14128
- __publicField(this, "write", async ({ content, ...req }, opts) => {
14129
- const resolvedPath = this.getResolvedPath(req, opts);
14130
- await mkdir(Path.dirname(resolvedPath), { recursive: true });
14131
- await writeFile(resolvedPath, content, "utf8");
14132
- return resolvedPath;
14133
- });
14134
- __publicField(this, "getResolvedPath", ({ path, ext, ...req }, opts) => Path.resolve(
14135
- this.outputDir,
14136
- ...path ?? [],
14137
- `${this.resolveName(
14138
- {
14139
- ext,
14140
- ...req
14141
- },
14142
- opts
14143
- )}.${ext}`
14144
- ));
14145
- __publicField(this, "setNameCase", (name) => {
14146
- const [first, ...rest] = name.split(".");
14147
- const converted = this.transformCase(first);
14148
- return [converted, ...rest].join(".");
14149
- });
14150
- __publicField(this, "transformCase", (value) => {
14151
- const nameCase = this.opts.case ?? "pascal";
14152
- if (nameCase === "kebab") {
14153
- return toKebabCaseIdentifier(value);
14154
- }
14155
- return toPascalCaseIdentifier(value);
14156
- });
14157
- }
14158
- }
14159
14170
 
14160
14171
  const generateApiClient = async (params, configFilePath, log = console.log) => {
14161
14172
  const config = parseProfileConfig(params, configFilePath);
@@ -14190,7 +14201,7 @@ const generateApiClientFromConfig = async (config, log = console.log) => {
14190
14201
  fs.mkdirSync(clientDir, {
14191
14202
  recursive: true
14192
14203
  });
14193
- const { typesFilePath } = await generateOpenApiModel(
14204
+ const { typesFilePath } = await generateOasModel(
14194
14205
  specPath,
14195
14206
  {
14196
14207
  ...config,