@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/clients/axios.cjs +18 -3
- package/dist/clients/axios.cjs.map +1 -1
- package/dist/clients/axios.d.ts +8 -2
- package/dist/clients/axios.js +18 -3
- package/dist/clients/axios.js.map +1 -1
- package/dist/clients/fetch.cjs +17 -2
- package/dist/clients/fetch.cjs.map +1 -1
- package/dist/clients/fetch.d.ts +8 -2
- package/dist/clients/fetch.js +17 -2
- package/dist/clients/fetch.js.map +1 -1
- package/dist/index.cjs +108 -28
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +108 -28
- package/dist/index.js.map +1 -1
- package/dist/templates/clients/axios.source.cjs +1 -1
- package/dist/templates/clients/axios.source.js +1 -1
- package/dist/templates/clients/fetch.source.cjs +1 -1
- package/dist/templates/clients/fetch.source.js +1 -1
- package/extension.yaml +14 -14
- package/package.json +6 -6
- package/src/clients/axios.ts +28 -5
- package/src/clients/fetch.ts +26 -3
- package/src/components/ClassClient.tsx +1 -1
- package/src/components/Client.tsx +12 -4
- package/src/components/StaticClassClient.tsx +1 -1
- package/src/generators/classClientGenerator.tsx +6 -6
- package/src/generators/clientGenerator.tsx +4 -4
- package/src/generators/groupedClientGenerator.tsx +2 -2
- package/src/generators/operationsGenerator.tsx +2 -2
- package/src/generators/staticClassClientGenerator.tsx +4 -4
- package/src/resolvers/resolverClient.ts +6 -5
- package/src/utils.ts +3 -2
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
|
|
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 =
|
|
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
|
|
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
|
|
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 =
|
|
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: "
|
|
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: ["
|
|
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: "
|
|
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: ["
|
|
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 =
|
|
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: "
|
|
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: ["
|
|
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
|
-
|
|
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);
|