@kubb/plugin-vue-query 5.0.0-beta.77 → 5.0.0-beta.79

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.cjs CHANGED
@@ -89,7 +89,7 @@ function toFilePath(name, caseLast = camelCase) {
89
89
  * JavaScript and Java reserved words.
90
90
  * @link https://github.com/jonschlinkert/reserved/blob/master/index.js
91
91
  */
92
- const reservedWords = new Set([
92
+ const reservedWords = /* @__PURE__ */ new Set([
93
93
  "abstract",
94
94
  "arguments",
95
95
  "boolean",
@@ -318,6 +318,23 @@ function caseParams(params, casing) {
318
318
  caseParamsCache.set(params, result);
319
319
  return result;
320
320
  }
321
+ /**
322
+ * Drops parameters that collapse to the same property identity once camelCased, keeping the first.
323
+ *
324
+ * Some specs declare the same parameter twice under different casings (for example AWS S3 lists both
325
+ * `max-uploads` and `MaxUploads`). Both resolve to one output property, so emitting both would yield
326
+ * an object type with a duplicate member, which TypeScript rejects. De-duplicate by the camelCased
327
+ * identity so the resulting group is collision-free regardless of the names each caller carries.
328
+ */
329
+ function dedupeByCasedName(params) {
330
+ const seen = /* @__PURE__ */ new Set();
331
+ return params.filter((param) => {
332
+ const key = camelCase(param.name);
333
+ if (seen.has(key)) return false;
334
+ seen.add(key);
335
+ return true;
336
+ });
337
+ }
321
338
  //#endregion
322
339
  //#region ../../internals/shared/src/operation.ts
323
340
  /**
@@ -356,11 +373,27 @@ function getContentTypeInfo(node) {
356
373
  hasFormData: contentTypes.some((ct) => ct === "multipart/form-data")
357
374
  };
358
375
  }
376
+ /**
377
+ * The request-body counterpart for the primary success response: the content types it documents and
378
+ * whether several are present, so the client can let a caller pick which one to accept.
379
+ */
380
+ function getResponseContentTypeInfo(node) {
381
+ const contentTypes = getPrimarySuccessResponse(node)?.content?.map((e) => e.contentType) ?? [];
382
+ const isMultipleContentTypes = contentTypes.length > 1;
383
+ return {
384
+ contentTypes,
385
+ isMultipleContentTypes,
386
+ contentTypeUnion: isMultipleContentTypes ? contentTypes.map((ct) => JSON.stringify(ct)).join(" | ") : "",
387
+ defaultContentType: contentTypes[0] ?? "application/json",
388
+ hasFormData: contentTypes.some((ct) => ct === "multipart/form-data")
389
+ };
390
+ }
359
391
  function buildRequestConfigType(node) {
360
- const { isMultipleContentTypes, contentTypeUnion } = getContentTypeInfo(node);
392
+ const request = getContentTypeInfo(node);
393
+ const response = getResponseContentTypeInfo(node);
361
394
  const configType = `Partial<Omit<RequestConfig, 'path' | 'query' | 'body' | 'headers' | 'url'>>`;
362
- const contentTypeProp = isMultipleContentTypes ? `contentType?: ${contentTypeUnion}` : null;
363
- return contentTypeProp ? `${configType} & { ${contentTypeProp} }` : configType;
395
+ const members = [request.isMultipleContentTypes ? `request?: ${request.contentTypeUnion}` : null, response.isMultipleContentTypes ? `response?: ${response.contentTypeUnion}` : null].filter(Boolean);
396
+ return members.length ? `${configType} & { contentType?: { ${members.join("; ")} } }` : configType;
364
397
  }
365
398
  /**
366
399
  * Builds the `client?:` option type shared by the generated query hooks (`useQuery`,
@@ -422,10 +455,10 @@ function buildOperationComments(node, options = {}) {
422
455
  function getOperationParameters(node, options = {}) {
423
456
  const params = caseParams(node.parameters, options.paramsCasing === "original" ? void 0 : "camelcase");
424
457
  return {
425
- path: params.filter((param) => param.in === "path"),
426
- query: params.filter((param) => param.in === "query"),
427
- header: params.filter((param) => param.in === "header"),
428
- cookie: params.filter((param) => param.in === "cookie")
458
+ path: dedupeByCasedName(params.filter((param) => param.in === "path")),
459
+ query: dedupeByCasedName(params.filter((param) => param.in === "query")),
460
+ header: dedupeByCasedName(params.filter((param) => param.in === "header")),
461
+ cookie: dedupeByCasedName(params.filter((param) => param.in === "cookie"))
429
462
  };
430
463
  }
431
464
  function getStatusCodeNumber(statusCode) {
@@ -440,6 +473,15 @@ function isErrorStatusCode(statusCode) {
440
473
  const code = getStatusCodeNumber(statusCode);
441
474
  return code !== null && code >= 400;
442
475
  }
476
+ function getSuccessResponses(responses) {
477
+ return responses.filter((response) => isSuccessStatusCode(response.statusCode));
478
+ }
479
+ function getOperationSuccessResponses(node) {
480
+ return getSuccessResponses(node.responses);
481
+ }
482
+ function getPrimarySuccessResponse(node) {
483
+ return getOperationSuccessResponses(node)[0] ?? null;
484
+ }
443
485
  function resolveErrorNames(node, resolver) {
444
486
  return node.responses.filter((response) => isErrorStatusCode(response.statusCode)).map((response) => resolver.resolveResponseStatusName(node, response.statusCode));
445
487
  }
@@ -513,14 +555,14 @@ function createGroupConfig(group) {
513
555
  };
514
556
  }
515
557
  //#endregion
516
- //#region ../../internals/client/src/builders/parser.ts
558
+ //#region ../../internals/client/src/builders/validatorOptions.ts
517
559
  /**
518
- * Returns `true` when any direction of the parser uses zod (used for dependency checks).
560
+ * Returns `true` when any direction of the validator uses zod (used for dependency checks).
519
561
  */
520
- function isParserEnabled(parser) {
521
- if (!parser) return false;
522
- if (parser === "zod") return true;
523
- return Boolean(parser.request || parser.response);
562
+ function isValidatorEnabled(validator) {
563
+ if (!validator) return false;
564
+ if (validator === "zod") return true;
565
+ return Boolean(validator.request || validator.response);
524
566
  }
525
567
  //#endregion
526
568
  //#region ../../internals/client/src/resolveClient.ts
@@ -1225,7 +1267,7 @@ const infiniteQueryGenerator = (0, _kubb_core.defineGenerator)({
1225
1267
  operation(node, ctx) {
1226
1268
  if (!_kubb_core.ast.isHttpOperationNode(node)) return null;
1227
1269
  const { config, driver, resolver, root } = ctx;
1228
- const { output, query, mutation, infinite, parser, client, group } = ctx.options;
1270
+ const { output, query, mutation, infinite, validator, client, group } = ctx.options;
1229
1271
  const pluginTs = driver.getPlugin(_kubb_plugin_ts.pluginTsName);
1230
1272
  if (!pluginTs) return null;
1231
1273
  const tsResolver = driver.getResolver(_kubb_plugin_ts.pluginTsName);
@@ -1275,14 +1317,14 @@ const infiniteQueryGenerator = (0, _kubb_core.defineGenerator)({
1275
1317
  includeParams: false
1276
1318
  })
1277
1319
  ].filter((name) => Boolean(name));
1278
- const pluginZod = isParserEnabled(parser) ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : null;
1320
+ const pluginZod = isValidatorEnabled(validator) ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : null;
1279
1321
  const zodResolver = pluginZod ? driver.getResolver(_kubb_plugin_zod.pluginZodName) : null;
1280
1322
  const fileZod = zodResolver ? zodResolver.resolveFile(operationFileEntry(node, node.operationId), {
1281
1323
  root,
1282
1324
  output: pluginZod?.options?.output ?? output,
1283
1325
  group: pluginZod?.options?.group ?? void 0
1284
1326
  }) : null;
1285
- const zodSchemaNames = resolveZodSchemaNames(node, zodResolver, parser);
1327
+ const zodSchemaNames = resolveZodSchemaNames(node, zodResolver, validator);
1286
1328
  const calledClientName = contractOp.name;
1287
1329
  return /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx.File, {
1288
1330
  baseName: meta.file.baseName,
@@ -1405,7 +1447,7 @@ const mutationGenerator = (0, _kubb_core.defineGenerator)({
1405
1447
  operation(node, ctx) {
1406
1448
  if (!_kubb_core.ast.isHttpOperationNode(node)) return null;
1407
1449
  const { config, driver, resolver, root } = ctx;
1408
- const { output, query, mutation, parser, client, group } = ctx.options;
1450
+ const { output, query, mutation, validator, client, group } = ctx.options;
1409
1451
  const pluginTs = driver.getPlugin(_kubb_plugin_ts.pluginTsName);
1410
1452
  if (!pluginTs) return null;
1411
1453
  const tsResolver = driver.getResolver(_kubb_plugin_ts.pluginTsName);
@@ -1440,14 +1482,14 @@ const mutationGenerator = (0, _kubb_core.defineGenerator)({
1440
1482
  order: "body-response-first",
1441
1483
  includeParams: false
1442
1484
  })].filter((name) => Boolean(name));
1443
- const pluginZod = isParserEnabled(parser) ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : null;
1485
+ const pluginZod = isValidatorEnabled(validator) ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : null;
1444
1486
  const zodResolver = pluginZod ? driver.getResolver(_kubb_plugin_zod.pluginZodName) : null;
1445
1487
  const fileZod = zodResolver ? zodResolver.resolveFile(operationFileEntry(node, node.operationId), {
1446
1488
  root,
1447
1489
  output: pluginZod?.options?.output ?? output,
1448
1490
  group: pluginZod?.options?.group ?? void 0
1449
1491
  }) : null;
1450
- const zodSchemaNames = resolveZodSchemaNames(node, zodResolver, parser);
1492
+ const zodSchemaNames = resolveZodSchemaNames(node, zodResolver, validator);
1451
1493
  const calledClientName = contractOp.name;
1452
1494
  const groups = getRequestGroups(node);
1453
1495
  const hasRequestGroups = groups.path || groups.query || groups.body || groups.headers;
@@ -1544,7 +1586,7 @@ const queryGenerator = (0, _kubb_core.defineGenerator)({
1544
1586
  operation(node, ctx) {
1545
1587
  if (!_kubb_core.ast.isHttpOperationNode(node)) return null;
1546
1588
  const { config, driver, resolver, root } = ctx;
1547
- const { output, query, mutation, parser, client, group } = ctx.options;
1589
+ const { output, query, mutation, validator, client, group } = ctx.options;
1548
1590
  const pluginTs = driver.getPlugin(_kubb_plugin_ts.pluginTsName);
1549
1591
  if (!pluginTs) return null;
1550
1592
  const tsResolver = driver.getResolver(_kubb_plugin_ts.pluginTsName);
@@ -1582,14 +1624,14 @@ const queryGenerator = (0, _kubb_core.defineGenerator)({
1582
1624
  order: "body-response-first",
1583
1625
  includeParams: false
1584
1626
  })].filter((name) => Boolean(name));
1585
- const pluginZod = isParserEnabled(parser) ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : null;
1627
+ const pluginZod = isValidatorEnabled(validator) ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : null;
1586
1628
  const zodResolver = pluginZod ? driver.getResolver(_kubb_plugin_zod.pluginZodName) : null;
1587
1629
  const fileZod = zodResolver ? zodResolver.resolveFile(operationFileEntry(node, node.operationId), {
1588
1630
  root,
1589
1631
  output: pluginZod?.options?.output ?? output,
1590
1632
  group: pluginZod?.options?.group ?? void 0
1591
1633
  }) : null;
1592
- const zodSchemaNames = resolveZodSchemaNames(node, zodResolver, parser);
1634
+ const zodSchemaNames = resolveZodSchemaNames(node, zodResolver, validator);
1593
1635
  const calledClientName = contractOp.name;
1594
1636
  return /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx.File, {
1595
1637
  baseName: meta.file.baseName,
@@ -1797,7 +1839,7 @@ const pluginVueQuery = (0, _kubb_core.definePlugin)((options) => {
1797
1839
  const { output = {
1798
1840
  path: "hooks",
1799
1841
  barrel: { type: "named" }
1800
- }, group, exclude = [], include, override = [], parser = false, infinite = false, mutation = {}, query = {}, mutationKey = mutationKeyTransformer, queryKey = queryKeyTransformer, client, resolver: userResolver, macros: userMacros } = options;
1842
+ }, group, exclude = [], include, override = [], validator = false, infinite = false, mutation = {}, query = {}, mutationKey = mutationKeyTransformer, queryKey = queryKeyTransformer, client, resolver: userResolver, macros: userMacros } = options;
1801
1843
  const selectedGenerators = [
1802
1844
  queryGenerator,
1803
1845
  infiniteQueryGenerator,
@@ -1807,7 +1849,7 @@ const pluginVueQuery = (0, _kubb_core.definePlugin)((options) => {
1807
1849
  return {
1808
1850
  name: pluginVueQueryName,
1809
1851
  options,
1810
- dependencies: [_kubb_plugin_ts.pluginTsName, isParserEnabled(parser) ? _kubb_plugin_zod.pluginZodName : void 0].filter((dependency) => Boolean(dependency)),
1852
+ dependencies: [_kubb_plugin_ts.pluginTsName, isValidatorEnabled(validator) ? _kubb_plugin_zod.pluginZodName : void 0].filter((dependency) => Boolean(dependency)),
1811
1853
  hooks: { "kubb:plugin:setup"(ctx) {
1812
1854
  const resolver = userResolver ? {
1813
1855
  ...resolverVueQuery,
@@ -1850,7 +1892,7 @@ const pluginVueQuery = (0, _kubb_core.definePlugin)((options) => {
1850
1892
  previousParam: null,
1851
1893
  ...infinite
1852
1894
  } : false,
1853
- parser,
1895
+ validator,
1854
1896
  group: groupConfig,
1855
1897
  exclude,
1856
1898
  include,