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

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;
@@ -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 [
@@ -1759,7 +1788,8 @@ const resolverClient = defineResolver(() => ({
1759
1788
  name: "default",
1760
1789
  pluginName: "plugin-client",
1761
1790
  default(name, type) {
1762
- return camelCase(name, { isFile: type === "file" });
1791
+ const resolved = camelCase(name, { isFile: type === "file" });
1792
+ return type === "file" ? resolved : ensureValidVarName(resolved);
1763
1793
  },
1764
1794
  resolveName(name) {
1765
1795
  return this.default(name, "function");
@@ -1768,13 +1798,13 @@ const resolverClient = defineResolver(() => ({
1768
1798
  return this.default(name, type);
1769
1799
  },
1770
1800
  resolveClassName(name) {
1771
- return pascalCase(name);
1801
+ return ensureValidVarName(pascalCase(name));
1772
1802
  },
1773
1803
  resolveGroupName(name) {
1774
- return pascalCase(name);
1804
+ return ensureValidVarName(pascalCase(name));
1775
1805
  },
1776
1806
  resolveClientPropertyName(name) {
1777
- return camelCase(name);
1807
+ return ensureValidVarName(camelCase(name));
1778
1808
  },
1779
1809
  resolveUrlName(node) {
1780
1810
  const name = this.resolveName(node.operationId);