@kubb/plugin-client 5.0.0-beta.25 → 5.0.0-beta.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -185,6 +185,26 @@ function isValidVarName(name) {
185
185
  if (!name || reservedWords.has(name)) return false;
186
186
  return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name);
187
187
  }
188
+ /**
189
+ * Returns `name` when it's a syntactically valid JavaScript variable name,
190
+ * otherwise prefixes it with `_` so the result is a valid identifier.
191
+ *
192
+ * Useful for sanitizing OpenAPI schema names or operation IDs that start with
193
+ * a digit (e.g. `409`, `504AccountCancel`) before using them as exported
194
+ * variable, type, or function names.
195
+ *
196
+ * @example
197
+ * ```ts
198
+ * ensureValidVarName('409') // '_409'
199
+ * ensureValidVarName('504AccountCancel') // '_504AccountCancel'
200
+ * ensureValidVarName('Pet') // 'Pet'
201
+ * ensureValidVarName('class') // '_class'
202
+ * ```
203
+ */
204
+ function ensureValidVarName(name) {
205
+ if (!name || isValidVarName(name)) return name;
206
+ return `_${name}`;
207
+ }
188
208
  //#endregion
189
209
  //#region ../../internals/utils/src/urlPath.ts
190
210
  /**
@@ -386,6 +406,10 @@ function getStatusCodeNumber(statusCode) {
386
406
  const code = Number(statusCode);
387
407
  return Number.isNaN(code) ? null : code;
388
408
  }
409
+ function isSuccessStatusCode(statusCode) {
410
+ const code = getStatusCodeNumber(statusCode);
411
+ return code !== null && code >= 200 && code < 300;
412
+ }
389
413
  function isErrorStatusCode(statusCode) {
390
414
  const code = getStatusCodeNumber(statusCode);
391
415
  return code !== null && code >= 400;
@@ -393,6 +417,9 @@ function isErrorStatusCode(statusCode) {
393
417
  function resolveErrorNames(node, resolver) {
394
418
  return node.responses.filter((response) => isErrorStatusCode(response.statusCode)).map((response) => resolver.resolveResponseStatusName(node, response.statusCode));
395
419
  }
420
+ function resolveSuccessNames(node, resolver) {
421
+ return node.responses.filter((response) => isSuccessStatusCode(response.statusCode)).map((response) => resolver.resolveResponseStatusName(node, response.statusCode));
422
+ }
396
423
  function resolveStatusCodeNames(node, resolver) {
397
424
  return node.responses.map((response) => resolver.resolveResponseStatusName(node, response.statusCode));
398
425
  }
@@ -582,7 +609,8 @@ function Client({ name, isExportable = true, isIndexable = true, returnType, bas
582
609
  const queryParamsMapping = paramsCasing ? buildParamsMapping(originalQueryParams, casedQueryParams) : null;
583
610
  const headerParamsMapping = paramsCasing ? buildParamsMapping(originalHeaderParams, casedHeaderParams) : null;
584
611
  const requestName = node.requestBody?.content?.[0]?.schema ? tsResolver.resolveDataName(node) : null;
585
- const responseName = tsResolver.resolveResponseName(node);
612
+ const successNames = resolveSuccessNames(node, tsResolver);
613
+ const responseName = successNames.length > 0 ? successNames.join(" | ") : tsResolver.resolveResponseName(node);
586
614
  const queryParamsName = originalQueryParams.length > 0 ? tsResolver.resolveQueryParamsName(node, originalQueryParams[0]) : null;
587
615
  const headerParamsName = originalHeaderParams.length > 0 ? tsResolver.resolveHeaderParamsName(node, originalHeaderParams[0]) : null;
588
616
  const zodResponseName = zodResolver && parser === "zod" ? zodResolver.resolveResponseName?.(node) : null;
@@ -648,7 +676,7 @@ function Client({ name, isExportable = true, isIndexable = true, returnType, bas
648
676
  }) },
649
677
  returnType,
650
678
  children: [
651
- isConfigurable ? `const { client: request = fetch, ${isMultipleContentTypes ? `contentType = ${JSON.stringify(contentType)}, ` : ""}...requestConfig } = config` : "",
679
+ isConfigurable ? `const { client: request = client, ${isMultipleContentTypes ? `contentType = ${JSON.stringify(contentType)}, ` : ""}...requestConfig } = config` : "",
652
680
  /* @__PURE__ */ jsx("br", {}),
653
681
  /* @__PURE__ */ jsx("br", {}),
654
682
  pathParamsMapping && Object.entries(pathParamsMapping).filter(([originalName, camelCaseName]) => isValidVarName(originalName) && originalName !== camelCaseName).map(([originalName, camelCaseName]) => `const ${originalName} = ${camelCaseName}`).join("\n"),
@@ -667,7 +695,7 @@ function Client({ name, isExportable = true, isIndexable = true, returnType, bas
667
695
  /* @__PURE__ */ jsx("br", {}),
668
696
  (isFormData || isMultipleContentTypes && hasFormData) && requestName && "const formData = buildFormData(requestData)",
669
697
  /* @__PURE__ */ jsx("br", {}),
670
- isConfigurable ? `const res = await request<${generics.join(", ")}>(${clientParams.toCall()})` : `const res = await fetch<${generics.join(", ")}>(${clientParams.toCall()})`,
698
+ isConfigurable ? `const res = await request<${generics.join(", ")}>(${clientParams.toCall()})` : `const res = await client<${generics.join(", ")}>(${clientParams.toCall()})`,
671
699
  /* @__PURE__ */ jsx("br", {}),
672
700
  childrenElement
673
701
  ]
@@ -688,7 +716,8 @@ function buildHeaders(contentType, hasHeaderParams) {
688
716
  * Includes response type, error type, and optional request type.
689
717
  */
690
718
  function buildGenerics(node, tsResolver) {
691
- const responseName = tsResolver.resolveResponseName(node);
719
+ const successNames = resolveSuccessNames(node, tsResolver);
720
+ const responseName = successNames.length > 0 ? successNames.join(" | ") : tsResolver.resolveResponseName(node);
692
721
  const requestName = node.requestBody?.content?.[0]?.schema ? tsResolver.resolveDataName(node) : null;
693
722
  const errorNames = node.responses.filter((r) => Number.parseInt(r.statusCode, 10) >= 400).map((r) => tsResolver.resolveResponseStatusName(node, r.statusCode));
694
723
  return [
@@ -795,7 +824,7 @@ function generateMethod$1({ node, name, tsResolver, zodResolver, baseURL, dataRe
795
824
  zodResolver
796
825
  });
797
826
  return `${jsdoc}async ${name}(${paramsSignature}) {\n${[
798
- `const { client: request = fetch, ${isMultipleContentTypes ? `contentType = ${JSON.stringify(contentType)}, ` : ""}...requestConfig } = mergeConfig(this.#config, config)`,
827
+ `const { client: request = client, ${isMultipleContentTypes ? `contentType = ${JSON.stringify(contentType)}, ` : ""}...requestConfig } = mergeConfig(this.#config, config)`,
799
828
  "",
800
829
  requestDataLine,
801
830
  formDataLine,
@@ -1002,16 +1031,24 @@ const classClientGenerator = defineGenerator({
1002
1031
  meta: file.meta,
1003
1032
  banner: resolver.resolveBanner(ctx.meta, {
1004
1033
  output,
1005
- config
1034
+ config,
1035
+ file: {
1036
+ path: file.path,
1037
+ baseName: file.baseName
1038
+ }
1006
1039
  }),
1007
1040
  footer: resolver.resolveFooter(ctx.meta, {
1008
1041
  output,
1009
- config
1042
+ config,
1043
+ file: {
1044
+ path: file.path,
1045
+ baseName: file.baseName
1046
+ }
1010
1047
  }),
1011
1048
  children: [
1012
1049
  importPath ? /* @__PURE__ */ jsxs(Fragment, { children: [
1013
1050
  /* @__PURE__ */ jsx(File.Import, {
1014
- name: "fetch",
1051
+ name: "client",
1015
1052
  path: importPath
1016
1053
  }),
1017
1054
  /* @__PURE__ */ jsx(File.Import, {
@@ -1029,7 +1066,7 @@ const classClientGenerator = defineGenerator({
1029
1066
  })
1030
1067
  ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
1031
1068
  /* @__PURE__ */ jsx(File.Import, {
1032
- name: ["fetch"],
1069
+ name: ["client"],
1033
1070
  root: file.path,
1034
1071
  path: path.resolve(root, ".kubb/client.ts")
1035
1072
  }),
@@ -1105,11 +1142,19 @@ const classClientGenerator = defineGenerator({
1105
1142
  meta: sdkFile.meta,
1106
1143
  banner: resolver.resolveBanner(ctx.meta, {
1107
1144
  output,
1108
- config
1145
+ config,
1146
+ file: {
1147
+ path: sdkFile.path,
1148
+ baseName: sdkFile.baseName
1149
+ }
1109
1150
  }),
1110
1151
  footer: resolver.resolveFooter(ctx.meta, {
1111
1152
  output,
1112
- config
1153
+ config,
1154
+ file: {
1155
+ path: sdkFile.path,
1156
+ baseName: sdkFile.baseName
1157
+ }
1113
1158
  }),
1114
1159
  children: [
1115
1160
  importPath ? /* @__PURE__ */ jsx(File.Import, {
@@ -1202,15 +1247,23 @@ const clientGenerator = defineGenerator({
1202
1247
  meta: meta.file.meta,
1203
1248
  banner: resolver.resolveBanner(ctx.meta, {
1204
1249
  output,
1205
- config
1250
+ config,
1251
+ file: {
1252
+ path: meta.file.path,
1253
+ baseName: meta.file.baseName
1254
+ }
1206
1255
  }),
1207
1256
  footer: resolver.resolveFooter(ctx.meta, {
1208
1257
  output,
1209
- config
1258
+ config,
1259
+ file: {
1260
+ path: meta.file.path,
1261
+ baseName: meta.file.baseName
1262
+ }
1210
1263
  }),
1211
1264
  children: [
1212
1265
  importPath ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(File.Import, {
1213
- name: "fetch",
1266
+ name: "client",
1214
1267
  path: importPath
1215
1268
  }), /* @__PURE__ */ jsx(File.Import, {
1216
1269
  name: [
@@ -1221,7 +1274,7 @@ const clientGenerator = defineGenerator({
1221
1274
  path: importPath,
1222
1275
  isTypeOnly: true
1223
1276
  })] }) : /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(File.Import, {
1224
- name: ["fetch"],
1277
+ name: ["client"],
1225
1278
  root: meta.file.path,
1226
1279
  path: path.resolve(root, ".kubb/client.ts")
1227
1280
  }), /* @__PURE__ */ jsx(File.Import, {
@@ -1336,11 +1389,21 @@ const groupedClientGenerator = defineGenerator({
1336
1389
  meta: file.meta,
1337
1390
  banner: resolver.resolveBanner(ctx.meta, {
1338
1391
  output,
1339
- config
1392
+ config,
1393
+ file: {
1394
+ path: file.path,
1395
+ baseName: file.baseName,
1396
+ isAggregation: true
1397
+ }
1340
1398
  }),
1341
1399
  footer: resolver.resolveFooter(ctx.meta, {
1342
1400
  output,
1343
- config
1401
+ config,
1402
+ file: {
1403
+ path: file.path,
1404
+ baseName: file.baseName,
1405
+ isAggregation: true
1406
+ }
1344
1407
  }),
1345
1408
  children: [clients.map((client) => /* @__PURE__ */ jsx(File.Import, {
1346
1409
  name: [client.name],
@@ -1410,11 +1473,19 @@ const operationsGenerator = defineGenerator({
1410
1473
  meta: file.meta,
1411
1474
  banner: resolver.resolveBanner(ctx.meta, {
1412
1475
  output,
1413
- config
1476
+ config,
1477
+ file: {
1478
+ path: file.path,
1479
+ baseName: file.baseName
1480
+ }
1414
1481
  }),
1415
1482
  footer: resolver.resolveFooter(ctx.meta, {
1416
1483
  output,
1417
- config
1484
+ config,
1485
+ file: {
1486
+ path: file.path,
1487
+ baseName: file.baseName
1488
+ }
1418
1489
  }),
1419
1490
  children: /* @__PURE__ */ jsx(Operations, {
1420
1491
  name,
@@ -1471,7 +1542,7 @@ function generateMethod({ node, name, tsResolver, zodResolver, baseURL, dataRetu
1471
1542
  zodResolver
1472
1543
  });
1473
1544
  return `${jsdoc} static async ${name}(${paramsSignature}) {\n${[
1474
- `const { client: request = fetch, ${isMultipleContentTypes ? `contentType = ${JSON.stringify(contentType)}, ` : ""}...requestConfig } = mergeConfig(this.#config, config)`,
1545
+ `const { client: request = client, ${isMultipleContentTypes ? `contentType = ${JSON.stringify(contentType)}, ` : ""}...requestConfig } = mergeConfig(this.#config, config)`,
1475
1546
  "",
1476
1547
  requestDataLine,
1477
1548
  formDataLine,
@@ -1649,16 +1720,24 @@ const staticClassClientGenerator = defineGenerator({
1649
1720
  meta: file.meta,
1650
1721
  banner: resolver.resolveBanner(ctx.meta, {
1651
1722
  output,
1652
- config
1723
+ config,
1724
+ file: {
1725
+ path: file.path,
1726
+ baseName: file.baseName
1727
+ }
1653
1728
  }),
1654
1729
  footer: resolver.resolveFooter(ctx.meta, {
1655
1730
  output,
1656
- config
1731
+ config,
1732
+ file: {
1733
+ path: file.path,
1734
+ baseName: file.baseName
1735
+ }
1657
1736
  }),
1658
1737
  children: [
1659
1738
  importPath ? /* @__PURE__ */ jsxs(Fragment, { children: [
1660
1739
  /* @__PURE__ */ jsx(File.Import, {
1661
- name: "fetch",
1740
+ name: "client",
1662
1741
  path: importPath
1663
1742
  }),
1664
1743
  /* @__PURE__ */ jsx(File.Import, {
@@ -1676,7 +1755,7 @@ const staticClassClientGenerator = defineGenerator({
1676
1755
  })
1677
1756
  ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
1678
1757
  /* @__PURE__ */ jsx(File.Import, {
1679
- name: ["fetch"],
1758
+ name: ["client"],
1680
1759
  root: file.path,
1681
1760
  path: path.resolve(root, ".kubb/client.ts")
1682
1761
  }),
@@ -1759,7 +1838,8 @@ const resolverClient = defineResolver(() => ({
1759
1838
  name: "default",
1760
1839
  pluginName: "plugin-client",
1761
1840
  default(name, type) {
1762
- return camelCase(name, { isFile: type === "file" });
1841
+ const resolved = camelCase(name, { isFile: type === "file" });
1842
+ return type === "file" ? resolved : ensureValidVarName(resolved);
1763
1843
  },
1764
1844
  resolveName(name) {
1765
1845
  return this.default(name, "function");
@@ -1768,13 +1848,13 @@ const resolverClient = defineResolver(() => ({
1768
1848
  return this.default(name, type);
1769
1849
  },
1770
1850
  resolveClassName(name) {
1771
- return pascalCase(name);
1851
+ return ensureValidVarName(pascalCase(name));
1772
1852
  },
1773
1853
  resolveGroupName(name) {
1774
- return pascalCase(name);
1854
+ return ensureValidVarName(pascalCase(name));
1775
1855
  },
1776
1856
  resolveClientPropertyName(name) {
1777
- return camelCase(name);
1857
+ return ensureValidVarName(camelCase(name));
1778
1858
  },
1779
1859
  resolveUrlName(node) {
1780
1860
  const name = this.resolveName(node.operationId);