@kubb/plugin-react-query 5.0.0-beta.77 → 5.0.0-beta.80

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
@@ -64,7 +64,7 @@ function toFilePath(name, caseLast = camelCase) {
64
64
  * JavaScript and Java reserved words.
65
65
  * @link https://github.com/jonschlinkert/reserved/blob/master/index.js
66
66
  */
67
- const reservedWords = new Set([
67
+ const reservedWords = /* @__PURE__ */ new Set([
68
68
  "abstract",
69
69
  "arguments",
70
70
  "boolean",
@@ -293,6 +293,23 @@ function caseParams(params, casing) {
293
293
  caseParamsCache.set(params, result);
294
294
  return result;
295
295
  }
296
+ /**
297
+ * Drops parameters that collapse to the same property identity once camelCased, keeping the first.
298
+ *
299
+ * Some specs declare the same parameter twice under different casings (for example AWS S3 lists both
300
+ * `max-uploads` and `MaxUploads`). Both resolve to one output property, so emitting both would yield
301
+ * an object type with a duplicate member, which TypeScript rejects. De-duplicate by the camelCased
302
+ * identity so the resulting group is collision-free regardless of the names each caller carries.
303
+ */
304
+ function dedupeByCasedName(params) {
305
+ const seen = /* @__PURE__ */ new Set();
306
+ return params.filter((param) => {
307
+ const key = camelCase(param.name);
308
+ if (seen.has(key)) return false;
309
+ seen.add(key);
310
+ return true;
311
+ });
312
+ }
296
313
  //#endregion
297
314
  //#region ../../internals/shared/src/operation.ts
298
315
  /**
@@ -331,11 +348,27 @@ function getContentTypeInfo(node) {
331
348
  hasFormData: contentTypes.some((ct) => ct === "multipart/form-data")
332
349
  };
333
350
  }
351
+ /**
352
+ * The request-body counterpart for the primary success response: the content types it documents and
353
+ * whether several are present, so the client can let a caller pick which one to accept.
354
+ */
355
+ function getResponseContentTypeInfo(node) {
356
+ const contentTypes = getPrimarySuccessResponse(node)?.content?.map((e) => e.contentType) ?? [];
357
+ const isMultipleContentTypes = contentTypes.length > 1;
358
+ return {
359
+ contentTypes,
360
+ isMultipleContentTypes,
361
+ contentTypeUnion: isMultipleContentTypes ? contentTypes.map((ct) => JSON.stringify(ct)).join(" | ") : "",
362
+ defaultContentType: contentTypes[0] ?? "application/json",
363
+ hasFormData: contentTypes.some((ct) => ct === "multipart/form-data")
364
+ };
365
+ }
334
366
  function buildRequestConfigType(node) {
335
- const { isMultipleContentTypes, contentTypeUnion } = getContentTypeInfo(node);
367
+ const request = getContentTypeInfo(node);
368
+ const response = getResponseContentTypeInfo(node);
336
369
  const configType = `Partial<Omit<RequestConfig, 'path' | 'query' | 'body' | 'headers' | 'url'>>`;
337
- const contentTypeProp = isMultipleContentTypes ? `contentType?: ${contentTypeUnion}` : null;
338
- return contentTypeProp ? `${configType} & { ${contentTypeProp} }` : configType;
370
+ const members = [request.isMultipleContentTypes ? `request?: ${request.contentTypeUnion}` : null, response.isMultipleContentTypes ? `response?: ${response.contentTypeUnion}` : null].filter(Boolean);
371
+ return members.length ? `${configType} & { contentType?: { ${members.join("; ")} } }` : configType;
339
372
  }
340
373
  /**
341
374
  * Builds the `client?:` option type shared by the generated query hooks (`useQuery`,
@@ -397,10 +430,10 @@ function buildOperationComments(node, options = {}) {
397
430
  function getOperationParameters(node, options = {}) {
398
431
  const params = caseParams(node.parameters, options.paramsCasing === "original" ? void 0 : "camelcase");
399
432
  return {
400
- path: params.filter((param) => param.in === "path"),
401
- query: params.filter((param) => param.in === "query"),
402
- header: params.filter((param) => param.in === "header"),
403
- cookie: params.filter((param) => param.in === "cookie")
433
+ path: dedupeByCasedName(params.filter((param) => param.in === "path")),
434
+ query: dedupeByCasedName(params.filter((param) => param.in === "query")),
435
+ header: dedupeByCasedName(params.filter((param) => param.in === "header")),
436
+ cookie: dedupeByCasedName(params.filter((param) => param.in === "cookie"))
404
437
  };
405
438
  }
406
439
  function getStatusCodeNumber(statusCode) {
@@ -415,6 +448,15 @@ function isErrorStatusCode(statusCode) {
415
448
  const code = getStatusCodeNumber(statusCode);
416
449
  return code !== null && code >= 400;
417
450
  }
451
+ function getSuccessResponses(responses) {
452
+ return responses.filter((response) => isSuccessStatusCode(response.statusCode));
453
+ }
454
+ function getOperationSuccessResponses(node) {
455
+ return getSuccessResponses(node.responses);
456
+ }
457
+ function getPrimarySuccessResponse(node) {
458
+ return getOperationSuccessResponses(node)[0] ?? null;
459
+ }
418
460
  function resolveErrorNames(node, resolver) {
419
461
  return node.responses.filter((response) => isErrorStatusCode(response.statusCode)).map((response) => resolver.resolveResponseStatusName(node, response.statusCode));
420
462
  }
@@ -488,14 +530,14 @@ function createGroupConfig(group) {
488
530
  };
489
531
  }
490
532
  //#endregion
491
- //#region ../../internals/client/src/builders/parser.ts
533
+ //#region ../../internals/client/src/builders/validatorOptions.ts
492
534
  /**
493
- * Returns `true` when any direction of the parser uses zod (used for dependency checks).
535
+ * Returns `true` when any direction of the validator uses zod (used for dependency checks).
494
536
  */
495
- function isParserEnabled(parser) {
496
- if (!parser) return false;
497
- if (parser === "zod") return true;
498
- return Boolean(parser.request || parser.response);
537
+ function isValidatorEnabled(validator) {
538
+ if (!validator) return false;
539
+ if (validator === "zod") return true;
540
+ return Boolean(validator.request || validator.response);
499
541
  }
500
542
  //#endregion
501
543
  //#region ../../internals/client/src/resolveClient.ts
@@ -623,12 +665,15 @@ function MutationKey({ name, node, transformer }) {
623
665
  * The grouped request options, ordered for both the destructured signature and the
624
666
  * call passed to the underlying client.
625
667
  */
626
- const requestGroupOrder = [
668
+ const requestGroupOrder$1 = [
627
669
  "path",
628
670
  "query",
629
671
  "body",
630
672
  "headers"
631
673
  ];
674
+ function maybeValueOrGetter(type) {
675
+ return `${type} | (() => ${type})`;
676
+ }
632
677
  /**
633
678
  * Builds the grouped `{ path, query, body, headers }` parameter that mirrors the client
634
679
  * function signature. Only the groups the operation carries are emitted, typed from the
@@ -641,7 +686,7 @@ const requestGroupOrder = [
641
686
  * `MaybeRefOrGetter` per group.
642
687
  */
643
688
  function buildGroupedRequestParam(node, options) {
644
- const { resolver, keys = requestGroupOrder, memberTypeWrapper } = options;
689
+ const { resolver, keys = requestGroupOrder$1, memberTypeWrapper } = options;
645
690
  const { groups, hasRequiredPath, hasRequiredQuery, hasRequiredHeader } = getRequestGroupOptionality(node);
646
691
  const names = keys.filter((key) => groups[key]);
647
692
  if (names.length === 0) return null;
@@ -653,7 +698,7 @@ function buildGroupedRequestParam(node, options) {
653
698
  };
654
699
  const isOptional = names.every((name) => !requiredByGroup[name]);
655
700
  const requestConfigName = resolver.resolveRequestConfigName(node);
656
- const omittedKeys = requestGroupOrder.filter((key) => !keys.includes(key));
701
+ const omittedKeys = requestGroupOrder$1.filter((key) => !keys.includes(key));
657
702
  const requestConfigType = omittedKeys.length > 0 ? `Omit<${requestConfigName}, ${omittedKeys.map((key) => `'${key}'`).join(" | ")}>` : requestConfigName;
658
703
  if (memberTypeWrapper) {
659
704
  const members = names.map((name) => ({
@@ -709,7 +754,7 @@ function buildClientCall(node, options) {
709
754
  const { groups } = getRequestGroupOptionality(node);
710
755
  return `${clientName}({ ${[
711
756
  "...config",
712
- ...requestGroupOrder.filter((key) => groups[key]),
757
+ ...requestGroupOrder$1.filter((key) => groups[key]),
713
758
  signal ? "signal: config.signal ?? signal" : null,
714
759
  "throwOnError: true"
715
760
  ].filter((part) => part !== null).join(", ")} })`;
@@ -936,6 +981,30 @@ const customHookOptionsFileGenerator = defineGenerator({
936
981
  }
937
982
  });
938
983
  //#endregion
984
+ //#region src/utils.ts
985
+ const requestGroupOrder = [
986
+ "path",
987
+ "query",
988
+ "body",
989
+ "headers"
990
+ ];
991
+ /**
992
+ * Builds the object literal that resolves each request group to a concrete value, unwrapping a getter
993
+ * once before the value reaches the plain `queryKey`/`queryOptions` helpers. A getter must never reach a
994
+ * React Query key, which is hashed structurally. Returns `null` when the operation carries no request group.
995
+ *
996
+ * @example
997
+ * ```ts
998
+ * buildResolvedRequestParams(node) // { path: typeof path === 'function' ? path() : path }
999
+ * ```
1000
+ */
1001
+ function buildResolvedRequestParams(node) {
1002
+ const groups = getRequestGroups(node);
1003
+ const names = requestGroupOrder.filter((key) => groups[key]);
1004
+ if (names.length === 0) return null;
1005
+ return `{ ${names.map((name) => `${name}: typeof ${name} === 'function' ? ${name}() : ${name}`).join(", ")} }`;
1006
+ }
1007
+ //#endregion
939
1008
  //#region src/generators/hookOptionsGenerator.tsx
940
1009
  /**
941
1010
  * Emits the `HookOptions` type used by `customOptions`. Enabled when
@@ -948,8 +1017,8 @@ const hookOptionsGenerator = defineGenerator({
948
1017
  renderer: jsxRenderer,
949
1018
  operations(nodes, ctx) {
950
1019
  const { resolver, config, root } = ctx;
951
- const { output, customOptions, query, mutation, suspense, infinite, group, override } = ctx.options;
952
- if (!customOptions) return null;
1020
+ const { output, customOptions, query, mutation, suspense, infinite, group, override, hooks } = ctx.options;
1021
+ if (!customOptions || !hooks) return null;
953
1022
  const name = resolver.resolveHookOptionsName();
954
1023
  const resolvedFile = resolver.resolveFile({
955
1024
  name,
@@ -1093,51 +1162,8 @@ const hookOptionsGenerator = defineGenerator({
1093
1162
  }
1094
1163
  });
1095
1164
  //#endregion
1096
- //#region src/components/QueryOptions.tsx
1097
- const declarationPrinter$8 = functionPrinter({ mode: "declaration" });
1098
- const callPrinter$8 = functionPrinter({ mode: "call" });
1099
- function getQueryOptionsParams(node, options) {
1100
- return buildQueryOptionsParams(node, options);
1101
- }
1102
- function QueryOptions({ name, clientName, node, tsResolver, queryKeyName }) {
1103
- const successNames = resolveSuccessNames(node, tsResolver);
1104
- const responseName = successNames.length > 0 ? successNames.join(" | ") : tsResolver.resolveResponseName(node);
1105
- const errorNames = resolveErrorNames(node, tsResolver);
1106
- const TData = responseName;
1107
- const TError = `ResponseErrorConfig<${errorNames.length > 0 ? errorNames.join(" | ") : "Error"}>`;
1108
- const queryKeyParamsNode = buildQueryKeyParams(node, { resolver: tsResolver });
1109
- const queryKeyParamsCall = callPrinter$8.print(queryKeyParamsNode) ?? "";
1110
- const paramsNode = getQueryOptionsParams(node, { resolver: tsResolver });
1111
- const paramsSignature = declarationPrinter$8.print(paramsNode) ?? "";
1112
- const queryFnBody = `const { data } = await ${buildClientCall(node, {
1113
- clientName,
1114
- signal: true
1115
- })}
1116
- return data`;
1117
- return /* @__PURE__ */ jsx(File.Source, {
1118
- name,
1119
- isExportable: true,
1120
- isIndexable: true,
1121
- children: /* @__PURE__ */ jsx(Function, {
1122
- name,
1123
- export: true,
1124
- params: paramsSignature,
1125
- children: `
1126
- const queryKey = ${queryKeyName}(${queryKeyParamsCall})
1127
- return queryOptions<${TData}, ${TError}, ${TData}, typeof queryKey>({
1128
- queryKey,
1129
- queryFn: async ({ signal }) => {
1130
- ${queryFnBody}
1131
- },
1132
- })
1133
- `
1134
- })
1135
- });
1136
- }
1137
- //#endregion
1138
1165
  //#region src/components/InfiniteQuery.tsx
1139
- const declarationPrinter$7 = functionPrinter({ mode: "declaration" });
1140
- const callPrinter$7 = functionPrinter({ mode: "call" });
1166
+ const declarationPrinter$8 = functionPrinter({ mode: "declaration" });
1141
1167
  function buildInfiniteQueryParamsNode(node, options) {
1142
1168
  const { resolver, pageParamGeneric } = options;
1143
1169
  const optionsParam = createFunctionParameter({
@@ -1148,7 +1174,10 @@ function buildInfiniteQueryParamsNode(node, options) {
1148
1174
  }`,
1149
1175
  default: "{}"
1150
1176
  });
1151
- return createFunctionParameters({ params: [buildGroupedRequestParam(node, { resolver }), optionsParam].filter((param) => param !== null) });
1177
+ return createFunctionParameters({ params: [buildGroupedRequestParam(node, {
1178
+ resolver,
1179
+ memberTypeWrapper: maybeValueOrGetter
1180
+ }), optionsParam].filter((param) => param !== null) });
1152
1181
  }
1153
1182
  function InfiniteQuery({ name, queryKeyTypeName, queryOptionsName, queryKeyName, node, tsResolver, initialPageParam, queryParam, customOptions }) {
1154
1183
  const successNames = resolveSuccessNames(node, tsResolver);
@@ -1176,15 +1205,14 @@ function InfiniteQuery({ name, queryKeyTypeName, queryOptionsName, queryKeyName,
1176
1205
  `TQueryKey extends QueryKey = ${queryKeyTypeName}`,
1177
1206
  `TPageParam = ${pageParamType}`
1178
1207
  ];
1179
- const queryKeyParamsNode = buildQueryKeyParams(node, { resolver: tsResolver });
1180
- const queryKeyParamsCall = callPrinter$7.print(queryKeyParamsNode) ?? "";
1181
- const queryOptionsParamsNode = getQueryOptionsParams(node, { resolver: tsResolver });
1182
- const queryOptionsParamsCall = callPrinter$7.print(queryOptionsParamsNode) ?? "";
1208
+ const resolvedParams = buildResolvedRequestParams(node);
1209
+ const queryKeyArgs = resolvedParams ? "resolvedParams" : "";
1210
+ const queryOptionsArgs = resolvedParams ? "resolvedParams, config" : "config";
1183
1211
  const paramsNode = buildInfiniteQueryParamsNode(node, {
1184
1212
  resolver: tsResolver,
1185
1213
  pageParamGeneric: "TPageParam"
1186
1214
  });
1187
- const paramsSignature = declarationPrinter$7.print(paramsNode) ?? "";
1215
+ const paramsSignature = declarationPrinter$8.print(paramsNode) ?? "";
1188
1216
  return /* @__PURE__ */ jsx(File.Source, {
1189
1217
  name,
1190
1218
  isExportable: true,
@@ -1198,11 +1226,11 @@ function InfiniteQuery({ name, queryKeyTypeName, queryOptionsName, queryKeyName,
1198
1226
  JSDoc: { comments: buildOperationComments(node) },
1199
1227
  children: `
1200
1228
  const { query: queryConfig = {}, client: config = {} } = options ?? {}
1201
- const { client: queryClient, ...resolvedOptions } = queryConfig
1202
- const queryKey = resolvedOptions?.queryKey ?? ${queryKeyName}(${queryKeyParamsCall})${customOptions ? `\n const customOptions = ${customOptions.name}({ hookName: '${name}', operationId: '${node.operationId}' })` : ""}
1229
+ const { client: queryClient, ...resolvedOptions } = queryConfig${resolvedParams ? `\n const resolvedParams = ${resolvedParams}` : ""}
1230
+ const queryKey = resolvedOptions?.queryKey ?? ${queryKeyName}(${queryKeyArgs})${customOptions ? `\n const customOptions = ${customOptions.name}({ hookName: '${name}', operationId: '${node.operationId}' })` : ""}
1203
1231
 
1204
1232
  const queryResult = useInfiniteQuery({
1205
- ...${queryOptionsName}(${queryOptionsParamsCall}),${customOptions ? "\n ...customOptions," : ""}
1233
+ ...${queryOptionsName}(${queryOptionsArgs}),${customOptions ? "\n ...customOptions," : ""}
1206
1234
  ...resolvedOptions,
1207
1235
  queryKey,
1208
1236
  } as unknown as InfiniteQueryObserverOptions<TQueryFnData, TError, TData, TQueryKey, TPageParam>, queryClient) as ${returnType}
@@ -1215,9 +1243,51 @@ function InfiniteQuery({ name, queryKeyTypeName, queryOptionsName, queryKeyName,
1215
1243
  });
1216
1244
  }
1217
1245
  //#endregion
1246
+ //#region src/components/QueryOptions.tsx
1247
+ const declarationPrinter$7 = functionPrinter({ mode: "declaration" });
1248
+ const callPrinter$4 = functionPrinter({ mode: "call" });
1249
+ function getQueryOptionsParams(node, options) {
1250
+ return buildQueryOptionsParams(node, options);
1251
+ }
1252
+ function QueryOptions({ name, clientName, node, tsResolver, queryKeyName }) {
1253
+ const successNames = resolveSuccessNames(node, tsResolver);
1254
+ const responseName = successNames.length > 0 ? successNames.join(" | ") : tsResolver.resolveResponseName(node);
1255
+ const errorNames = resolveErrorNames(node, tsResolver);
1256
+ const TData = responseName;
1257
+ const TError = `ResponseErrorConfig<${errorNames.length > 0 ? errorNames.join(" | ") : "Error"}>`;
1258
+ const queryKeyParamsNode = buildQueryKeyParams(node, { resolver: tsResolver });
1259
+ const queryKeyParamsCall = callPrinter$4.print(queryKeyParamsNode) ?? "";
1260
+ const paramsNode = getQueryOptionsParams(node, { resolver: tsResolver });
1261
+ const paramsSignature = declarationPrinter$7.print(paramsNode) ?? "";
1262
+ const queryFnBody = `const { data } = await ${buildClientCall(node, {
1263
+ clientName,
1264
+ signal: true
1265
+ })}
1266
+ return data`;
1267
+ return /* @__PURE__ */ jsx(File.Source, {
1268
+ name,
1269
+ isExportable: true,
1270
+ isIndexable: true,
1271
+ children: /* @__PURE__ */ jsx(Function, {
1272
+ name,
1273
+ export: true,
1274
+ params: paramsSignature,
1275
+ children: `
1276
+ const queryKey = ${queryKeyName}(${queryKeyParamsCall})
1277
+ return queryOptions<${TData}, ${TError}, ${TData}, typeof queryKey>({
1278
+ queryKey,
1279
+ queryFn: async ({ signal }) => {
1280
+ ${queryFnBody}
1281
+ },
1282
+ })
1283
+ `
1284
+ })
1285
+ });
1286
+ }
1287
+ //#endregion
1218
1288
  //#region src/components/InfiniteQueryOptions.tsx
1219
1289
  const declarationPrinter$6 = functionPrinter({ mode: "declaration" });
1220
- const callPrinter$6 = functionPrinter({ mode: "call" });
1290
+ const callPrinter$3 = functionPrinter({ mode: "call" });
1221
1291
  function InfiniteQueryOptions({ name, clientName, initialPageParam, cursorParam, nextParam, previousParam, node, tsResolver, queryParam, queryKeyName }) {
1222
1292
  const successNames = resolveSuccessNames(node, tsResolver);
1223
1293
  const queryFnDataType = successNames.length > 0 ? successNames.join(" | ") : tsResolver.resolveResponseName(node);
@@ -1236,7 +1306,7 @@ function InfiniteQueryOptions({ name, clientName, initialPageParam, cursorParam,
1236
1306
  const queryParamType = queryParam && queryParamsTypeName ? `${queryParamsTypeName}['${queryParam}']` : null;
1237
1307
  const pageParamType = queryParamType ? isInitialPageParamDefined ? `NonNullable<${queryParamType}>` : queryParamType : fallbackPageParamType;
1238
1308
  const queryKeyParamsNode = buildQueryKeyParams(node, { resolver: tsResolver });
1239
- const queryKeyParamsCall = callPrinter$6.print(queryKeyParamsNode) ?? "";
1309
+ const queryKeyParamsCall = callPrinter$3.print(queryKeyParamsNode) ?? "";
1240
1310
  const paramsNode = getQueryOptionsParams(node, { resolver: tsResolver });
1241
1311
  const paramsSignature = declarationPrinter$6.print(paramsNode) ?? "";
1242
1312
  const queryFnBody = `const { data } = await ${buildClientCall(node, {
@@ -1308,7 +1378,7 @@ return infiniteQueryOptions<${queryFnDataType}, ${errorType}, InfiniteData<${que
1308
1378
  //#endregion
1309
1379
  //#region src/components/MutationOptions.tsx
1310
1380
  const declarationPrinter$5 = functionPrinter({ mode: "declaration" });
1311
- const callPrinter$5 = functionPrinter({ mode: "call" });
1381
+ const callPrinter$2 = functionPrinter({ mode: "call" });
1312
1382
  function buildMutationConfigParamsNode(node) {
1313
1383
  return createFunctionParameters({ params: [createFunctionParameter({
1314
1384
  name: "config",
@@ -1327,7 +1397,7 @@ function MutationOptions({ name, clientName, node, tsResolver, mutationKeyName }
1327
1397
  const hasMutationParams = groupedParam !== null;
1328
1398
  const groupedParamsNode = createFunctionParameters({ params: groupedParam ? [groupedParam] : [] });
1329
1399
  const TRequest = hasMutationParams ? tsResolver.resolveRequestConfigName(node) : "undefined";
1330
- const argBindingStr = hasMutationParams ? callPrinter$5.print(groupedParamsNode) ?? "" : "_";
1400
+ const argBindingStr = hasMutationParams ? callPrinter$2.print(groupedParamsNode) ?? "" : "_";
1331
1401
  const mutationFnBody = `const { data } = await ${buildClientCall(node, {
1332
1402
  clientName,
1333
1403
  signal: false
@@ -1357,7 +1427,7 @@ function MutationOptions({ name, clientName, node, tsResolver, mutationKeyName }
1357
1427
  //#endregion
1358
1428
  //#region src/components/Mutation.tsx
1359
1429
  const declarationPrinter$4 = functionPrinter({ mode: "declaration" });
1360
- const callPrinter$4 = functionPrinter({ mode: "call" });
1430
+ const callPrinter$1 = functionPrinter({ mode: "call" });
1361
1431
  function resolveMutationRequestType(node, resolver) {
1362
1432
  return buildGroupedRequestParam(node, { resolver }) ? resolver.resolveRequestConfigName(node) : "undefined";
1363
1433
  }
@@ -1392,7 +1462,7 @@ function Mutation({ name, mutationOptionsName, node, tsResolver, mutationKeyName
1392
1462
  ].join(", ");
1393
1463
  const returnType = `UseMutationResult<${generics}>`;
1394
1464
  const mutationOptionsConfigNode = buildMutationConfigParamsNode(node);
1395
- const mutationOptionsParamsCall = callPrinter$4.print(mutationOptionsConfigNode) ?? "";
1465
+ const mutationOptionsParamsCall = callPrinter$1.print(mutationOptionsConfigNode) ?? "";
1396
1466
  const paramsNode = buildMutationParamsNode(node, { resolver: tsResolver });
1397
1467
  const paramsSignature = declarationPrinter$4.print(paramsNode) ?? "";
1398
1468
  return /* @__PURE__ */ jsx(File.Source, {
@@ -1424,7 +1494,6 @@ function Mutation({ name, mutationOptionsName, node, tsResolver, mutationKeyName
1424
1494
  //#endregion
1425
1495
  //#region src/components/Query.tsx
1426
1496
  const declarationPrinter$3 = functionPrinter({ mode: "declaration" });
1427
- const callPrinter$3 = functionPrinter({ mode: "call" });
1428
1497
  function buildQueryParamsNode(node, options) {
1429
1498
  const { resolver } = options;
1430
1499
  const successNames = resolveSuccessNames(node, resolver);
@@ -1444,7 +1513,10 @@ function buildQueryParamsNode(node, options) {
1444
1513
  }`,
1445
1514
  default: "{}"
1446
1515
  });
1447
- return createFunctionParameters({ params: [buildGroupedRequestParam(node, { resolver }), optionsParam].filter((param) => param !== null) });
1516
+ return createFunctionParameters({ params: [buildGroupedRequestParam(node, {
1517
+ resolver,
1518
+ memberTypeWrapper: maybeValueOrGetter
1519
+ }), optionsParam].filter((param) => param !== null) });
1448
1520
  }
1449
1521
  function Query({ name, queryKeyTypeName, queryOptionsName, queryKeyName, node, tsResolver, customOptions }) {
1450
1522
  const successNames = resolveSuccessNames(node, tsResolver);
@@ -1457,10 +1529,9 @@ function Query({ name, queryKeyTypeName, queryOptionsName, queryKeyName, node, t
1457
1529
  `TQueryData = ${TData}`,
1458
1530
  `TQueryKey extends QueryKey = ${queryKeyTypeName}`
1459
1531
  ];
1460
- const queryKeyParamsNode = buildQueryKeyParams(node, { resolver: tsResolver });
1461
- const queryKeyParamsCall = callPrinter$3.print(queryKeyParamsNode) ?? "";
1462
- const queryOptionsParamsNode = getQueryOptionsParams(node, { resolver: tsResolver });
1463
- const queryOptionsParamsCall = callPrinter$3.print(queryOptionsParamsNode) ?? "";
1532
+ const resolvedParams = buildResolvedRequestParams(node);
1533
+ const queryKeyArgs = resolvedParams ? "resolvedParams" : "";
1534
+ const queryOptionsArgs = resolvedParams ? "resolvedParams, config" : "config";
1464
1535
  const paramsNode = buildQueryParamsNode(node, { resolver: tsResolver });
1465
1536
  const paramsSignature = declarationPrinter$3.print(paramsNode) ?? "";
1466
1537
  return /* @__PURE__ */ jsx(File.Source, {
@@ -1476,11 +1547,11 @@ function Query({ name, queryKeyTypeName, queryOptionsName, queryKeyName, node, t
1476
1547
  JSDoc: { comments: buildOperationComments(node) },
1477
1548
  children: `
1478
1549
  const { query: queryConfig = {}, client: config = {} } = options ?? {}
1479
- const { client: queryClient, ...resolvedOptions } = queryConfig
1480
- const queryKey = resolvedOptions?.queryKey ?? ${queryKeyName}(${queryKeyParamsCall})${customOptions ? `\n const customOptions = ${customOptions.name}({ hookName: '${name}', operationId: '${node.operationId}' })` : ""}
1550
+ const { client: queryClient, ...resolvedOptions } = queryConfig${resolvedParams ? `\n const resolvedParams = ${resolvedParams}` : ""}
1551
+ const queryKey = resolvedOptions?.queryKey ?? ${queryKeyName}(${queryKeyArgs})${customOptions ? `\n const customOptions = ${customOptions.name}({ hookName: '${name}', operationId: '${node.operationId}' })` : ""}
1481
1552
 
1482
1553
  const queryResult = useQuery({
1483
- ...${queryOptionsName}(${queryOptionsParamsCall}),${customOptions ? "\n ...customOptions," : ""}
1554
+ ...${queryOptionsName}(${queryOptionsArgs}),${customOptions ? "\n ...customOptions," : ""}
1484
1555
  ...resolvedOptions,
1485
1556
  queryKey,
1486
1557
  } as unknown as QueryObserverOptions, queryClient) as ${returnType}
@@ -1495,7 +1566,6 @@ function Query({ name, queryKeyTypeName, queryOptionsName, queryKeyName, node, t
1495
1566
  //#endregion
1496
1567
  //#region src/components/SuspenseInfiniteQuery.tsx
1497
1568
  const declarationPrinter$2 = functionPrinter({ mode: "declaration" });
1498
- const callPrinter$2 = functionPrinter({ mode: "call" });
1499
1569
  function buildSuspenseInfiniteQueryParamsNode(node, options) {
1500
1570
  const { resolver, pageParamGeneric } = options;
1501
1571
  const optionsParam = createFunctionParameter({
@@ -1506,7 +1576,10 @@ function buildSuspenseInfiniteQueryParamsNode(node, options) {
1506
1576
  }`,
1507
1577
  default: "{}"
1508
1578
  });
1509
- return createFunctionParameters({ params: [buildGroupedRequestParam(node, { resolver }), optionsParam].filter((param) => param !== null) });
1579
+ return createFunctionParameters({ params: [buildGroupedRequestParam(node, {
1580
+ resolver,
1581
+ memberTypeWrapper: maybeValueOrGetter
1582
+ }), optionsParam].filter((param) => param !== null) });
1510
1583
  }
1511
1584
  function SuspenseInfiniteQuery({ name, queryKeyTypeName, queryOptionsName, queryKeyName, node, tsResolver, customOptions, initialPageParam, queryParam }) {
1512
1585
  const successNames = resolveSuccessNames(node, tsResolver);
@@ -1534,10 +1607,9 @@ function SuspenseInfiniteQuery({ name, queryKeyTypeName, queryOptionsName, query
1534
1607
  `TQueryKey extends QueryKey = ${queryKeyTypeName}`,
1535
1608
  `TPageParam = ${pageParamType}`
1536
1609
  ];
1537
- const queryKeyParamsNode = buildQueryKeyParams(node, { resolver: tsResolver });
1538
- const queryKeyParamsCall = callPrinter$2.print(queryKeyParamsNode) ?? "";
1539
- const queryOptionsParamsNode = getQueryOptionsParams(node, { resolver: tsResolver });
1540
- const queryOptionsParamsCall = callPrinter$2.print(queryOptionsParamsNode) ?? "";
1610
+ const resolvedParams = buildResolvedRequestParams(node);
1611
+ const queryKeyArgs = resolvedParams ? "resolvedParams" : "";
1612
+ const queryOptionsArgs = resolvedParams ? "resolvedParams, config" : "config";
1541
1613
  const paramsNode = buildSuspenseInfiniteQueryParamsNode(node, {
1542
1614
  resolver: tsResolver,
1543
1615
  pageParamGeneric: "TPageParam"
@@ -1556,11 +1628,11 @@ function SuspenseInfiniteQuery({ name, queryKeyTypeName, queryOptionsName, query
1556
1628
  JSDoc: { comments: buildOperationComments(node) },
1557
1629
  children: `
1558
1630
  const { query: queryConfig = {}, client: config = {} } = options ?? {}
1559
- const { client: queryClient, ...resolvedOptions } = queryConfig
1560
- const queryKey = resolvedOptions?.queryKey ?? ${queryKeyName}(${queryKeyParamsCall})${customOptions ? `\n const customOptions = ${customOptions.name}({ hookName: '${name}', operationId: '${node.operationId}' })` : ""}
1631
+ const { client: queryClient, ...resolvedOptions } = queryConfig${resolvedParams ? `\n const resolvedParams = ${resolvedParams}` : ""}
1632
+ const queryKey = resolvedOptions?.queryKey ?? ${queryKeyName}(${queryKeyArgs})${customOptions ? `\n const customOptions = ${customOptions.name}({ hookName: '${name}', operationId: '${node.operationId}' })` : ""}
1561
1633
 
1562
1634
  const queryResult = useSuspenseInfiniteQuery({
1563
- ...${queryOptionsName}(${queryOptionsParamsCall}),${customOptions ? "\n ...customOptions," : ""}
1635
+ ...${queryOptionsName}(${queryOptionsArgs}),${customOptions ? "\n ...customOptions," : ""}
1564
1636
  ...resolvedOptions,
1565
1637
  queryKey,
1566
1638
  } as unknown as UseSuspenseInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryKey, TPageParam>, queryClient) as ${returnType}
@@ -1575,7 +1647,7 @@ function SuspenseInfiniteQuery({ name, queryKeyTypeName, queryOptionsName, query
1575
1647
  //#endregion
1576
1648
  //#region src/components/SuspenseInfiniteQueryOptions.tsx
1577
1649
  const declarationPrinter$1 = functionPrinter({ mode: "declaration" });
1578
- const callPrinter$1 = functionPrinter({ mode: "call" });
1650
+ const callPrinter = functionPrinter({ mode: "call" });
1579
1651
  function SuspenseInfiniteQueryOptions({ name, clientName, initialPageParam, cursorParam, nextParam, previousParam, node, tsResolver, queryParam, queryKeyName }) {
1580
1652
  const successNames = resolveSuccessNames(node, tsResolver);
1581
1653
  const queryFnDataType = successNames.length > 0 ? successNames.join(" | ") : tsResolver.resolveResponseName(node);
@@ -1601,7 +1673,7 @@ function SuspenseInfiniteQueryOptions({ name, clientName, initialPageParam, curs
1601
1673
  })}
1602
1674
  return data`;
1603
1675
  const queryKeyParamsNode = buildQueryKeyParams(node, { resolver: tsResolver });
1604
- const queryKeyParamsCall = callPrinter$1.print(queryKeyParamsNode) ?? "";
1676
+ const queryKeyParamsCall = callPrinter.print(queryKeyParamsNode) ?? "";
1605
1677
  const hasNewParams = nextParam != null || previousParam != null;
1606
1678
  const [getNextPageParamExpr, getPreviousPageParamExpr] = (() => {
1607
1679
  if (hasNewParams) {
@@ -1666,7 +1738,6 @@ return infiniteQueryOptions<${queryFnDataType}, ${errorType}, InfiniteData<${que
1666
1738
  //#endregion
1667
1739
  //#region src/components/SuspenseQuery.tsx
1668
1740
  const declarationPrinter = functionPrinter({ mode: "declaration" });
1669
- const callPrinter = functionPrinter({ mode: "call" });
1670
1741
  function buildSuspenseQueryParamsNode(node, options) {
1671
1742
  const { resolver } = options;
1672
1743
  const successNames = resolveSuccessNames(node, resolver);
@@ -1685,7 +1756,10 @@ function buildSuspenseQueryParamsNode(node, options) {
1685
1756
  }`,
1686
1757
  default: "{}"
1687
1758
  });
1688
- return createFunctionParameters({ params: [buildGroupedRequestParam(node, { resolver }), optionsParam].filter((param) => param !== null) });
1759
+ return createFunctionParameters({ params: [buildGroupedRequestParam(node, {
1760
+ resolver,
1761
+ memberTypeWrapper: maybeValueOrGetter
1762
+ }), optionsParam].filter((param) => param !== null) });
1689
1763
  }
1690
1764
  function SuspenseQuery({ name, queryKeyTypeName, queryOptionsName, queryKeyName, node, tsResolver, customOptions }) {
1691
1765
  const successNames = resolveSuccessNames(node, tsResolver);
@@ -1694,10 +1768,9 @@ function SuspenseQuery({ name, queryKeyTypeName, queryOptionsName, queryKeyName,
1694
1768
  const TData = responseName;
1695
1769
  const returnType = `UseSuspenseQueryResult<TData, ${`ResponseErrorConfig<${errorNames.length > 0 ? errorNames.join(" | ") : "Error"}>`}> & { queryKey: TQueryKey }`;
1696
1770
  const generics = [`TData = ${TData}`, `TQueryKey extends QueryKey = ${queryKeyTypeName}`];
1697
- const queryKeyParamsNode = buildQueryKeyParams(node, { resolver: tsResolver });
1698
- const queryKeyParamsCall = callPrinter.print(queryKeyParamsNode) ?? "";
1699
- const queryOptionsParamsNode = getQueryOptionsParams(node, { resolver: tsResolver });
1700
- const queryOptionsParamsCall = callPrinter.print(queryOptionsParamsNode) ?? "";
1771
+ const resolvedParams = buildResolvedRequestParams(node);
1772
+ const queryKeyArgs = resolvedParams ? "resolvedParams" : "";
1773
+ const queryOptionsArgs = resolvedParams ? "resolvedParams, config" : "config";
1701
1774
  const paramsNode = buildSuspenseQueryParamsNode(node, { resolver: tsResolver });
1702
1775
  const paramsSignature = declarationPrinter.print(paramsNode) ?? "";
1703
1776
  return /* @__PURE__ */ jsx(File.Source, {
@@ -1713,11 +1786,11 @@ function SuspenseQuery({ name, queryKeyTypeName, queryOptionsName, queryKeyName,
1713
1786
  JSDoc: { comments: buildOperationComments(node) },
1714
1787
  children: `
1715
1788
  const { query: queryConfig = {}, client: config = {} } = options ?? {}
1716
- const { client: queryClient, ...resolvedOptions } = queryConfig
1717
- const queryKey = resolvedOptions?.queryKey ?? ${queryKeyName}(${queryKeyParamsCall})${customOptions ? `\n const customOptions = ${customOptions.name}({ hookName: '${name}', operationId: '${node.operationId}' })` : ""}
1789
+ const { client: queryClient, ...resolvedOptions } = queryConfig${resolvedParams ? `\n const resolvedParams = ${resolvedParams}` : ""}
1790
+ const queryKey = resolvedOptions?.queryKey ?? ${queryKeyName}(${queryKeyArgs})${customOptions ? `\n const customOptions = ${customOptions.name}({ hookName: '${name}', operationId: '${node.operationId}' })` : ""}
1718
1791
 
1719
1792
  const queryResult = useSuspenseQuery({
1720
- ...${queryOptionsName}(${queryOptionsParamsCall}),${customOptions ? "\n ...customOptions," : ""}
1793
+ ...${queryOptionsName}(${queryOptionsArgs}),${customOptions ? "\n ...customOptions," : ""}
1721
1794
  ...resolvedOptions,
1722
1795
  queryKey,
1723
1796
  } as unknown as UseSuspenseQueryOptions, queryClient) as ${returnType}
@@ -1743,7 +1816,7 @@ const infiniteQueryGenerator = defineGenerator({
1743
1816
  operation(node, ctx) {
1744
1817
  if (!ast.isHttpOperationNode(node)) return null;
1745
1818
  const { config, driver, resolver, root } = ctx;
1746
- const { output, query, mutation, infinite, parser, client, group, customOptions } = ctx.options;
1819
+ const { output, query, mutation, infinite, validator, client, group, customOptions, hooks } = ctx.options;
1747
1820
  const pluginTs = driver.getPlugin(pluginTsName);
1748
1821
  if (!pluginTs) return null;
1749
1822
  const tsResolver = driver.getResolver(pluginTsName);
@@ -1793,14 +1866,14 @@ const infiniteQueryGenerator = defineGenerator({
1793
1866
  includeParams: false
1794
1867
  })
1795
1868
  ].filter((name) => Boolean(name));
1796
- const pluginZod = isParserEnabled(parser) ? driver.getPlugin(pluginZodName) : null;
1869
+ const pluginZod = isValidatorEnabled(validator) ? driver.getPlugin(pluginZodName) : null;
1797
1870
  const zodResolver = pluginZod ? driver.getResolver(pluginZodName) : null;
1798
1871
  const fileZod = zodResolver ? zodResolver.resolveFile(operationFileEntry(node, node.operationId), {
1799
1872
  root,
1800
1873
  output: pluginZod?.options?.output ?? output,
1801
1874
  group: pluginZod?.options?.group ?? void 0
1802
1875
  }) : null;
1803
- const zodSchemaNames = resolveZodSchemaNames(node, zodResolver, parser);
1876
+ const zodSchemaNames = resolveZodSchemaNames(node, zodResolver, validator);
1804
1877
  const calledClientName = contractOp.name;
1805
1878
  return /* @__PURE__ */ jsxs(File, {
1806
1879
  baseName: meta.file.baseName,
@@ -1877,31 +1950,33 @@ const infiniteQueryGenerator = defineGenerator({
1877
1950
  initialPageParam: infiniteOptions.initialPageParam,
1878
1951
  queryParam: infiniteOptions.queryParam
1879
1952
  }),
1880
- /* @__PURE__ */ jsx(File.Import, {
1881
- name: ["useInfiniteQuery"],
1882
- path: importPath
1883
- }),
1884
- /* @__PURE__ */ jsx(File.Import, {
1885
- name: [
1886
- "QueryKey",
1887
- "QueryClient",
1888
- "InfiniteQueryObserverOptions",
1889
- "UseInfiniteQueryResult"
1890
- ],
1891
- path: importPath,
1892
- isTypeOnly: true
1893
- }),
1894
- /* @__PURE__ */ jsx(InfiniteQuery, {
1895
- name: queryName,
1896
- queryOptionsName,
1897
- queryKeyName,
1898
- queryKeyTypeName,
1899
- node,
1900
- tsResolver,
1901
- initialPageParam: infiniteOptions.initialPageParam,
1902
- queryParam: infiniteOptions.queryParam,
1903
- customOptions
1904
- })
1953
+ hooks && /* @__PURE__ */ jsxs(Fragment, { children: [
1954
+ /* @__PURE__ */ jsx(File.Import, {
1955
+ name: ["useInfiniteQuery"],
1956
+ path: importPath
1957
+ }),
1958
+ /* @__PURE__ */ jsx(File.Import, {
1959
+ name: [
1960
+ "QueryKey",
1961
+ "QueryClient",
1962
+ "InfiniteQueryObserverOptions",
1963
+ "UseInfiniteQueryResult"
1964
+ ],
1965
+ path: importPath,
1966
+ isTypeOnly: true
1967
+ }),
1968
+ /* @__PURE__ */ jsx(InfiniteQuery, {
1969
+ name: queryName,
1970
+ queryOptionsName,
1971
+ queryKeyName,
1972
+ queryKeyTypeName,
1973
+ node,
1974
+ tsResolver,
1975
+ initialPageParam: infiniteOptions.initialPageParam,
1976
+ queryParam: infiniteOptions.queryParam,
1977
+ customOptions
1978
+ })
1979
+ ] })
1905
1980
  ]
1906
1981
  });
1907
1982
  }
@@ -1919,7 +1994,7 @@ const mutationGenerator = defineGenerator({
1919
1994
  operation(node, ctx) {
1920
1995
  if (!ast.isHttpOperationNode(node)) return null;
1921
1996
  const { config, driver, resolver, root } = ctx;
1922
- const { output, query, mutation, parser, client, group, customOptions } = ctx.options;
1997
+ const { output, query, mutation, validator, client, group, customOptions, hooks } = ctx.options;
1923
1998
  const pluginTs = driver.getPlugin(pluginTsName);
1924
1999
  if (!pluginTs) return null;
1925
2000
  const tsResolver = driver.getResolver(pluginTsName);
@@ -1955,14 +2030,14 @@ const mutationGenerator = defineGenerator({
1955
2030
  order: "body-response-first",
1956
2031
  includeParams: false
1957
2032
  })].filter((name) => Boolean(name));
1958
- const pluginZod = isParserEnabled(parser) ? driver.getPlugin(pluginZodName) : null;
2033
+ const pluginZod = isValidatorEnabled(validator) ? driver.getPlugin(pluginZodName) : null;
1959
2034
  const zodResolver = pluginZod ? driver.getResolver(pluginZodName) : null;
1960
2035
  const fileZod = zodResolver ? zodResolver.resolveFile(operationFileEntry(node, node.operationId), {
1961
2036
  root,
1962
2037
  output: pluginZod?.options?.output ?? output,
1963
2038
  group: pluginZod?.options?.group ?? void 0
1964
2039
  }) : null;
1965
- const zodSchemaNames = resolveZodSchemaNames(node, zodResolver, parser);
2040
+ const zodSchemaNames = resolveZodSchemaNames(node, zodResolver, validator);
1966
2041
  const calledClientName = contractOp.name;
1967
2042
  return /* @__PURE__ */ jsxs(File, {
1968
2043
  baseName: meta.file.baseName,
@@ -2027,7 +2102,7 @@ const mutationGenerator = defineGenerator({
2027
2102
  node,
2028
2103
  tsResolver
2029
2104
  }),
2030
- mutation && /* @__PURE__ */ jsxs(Fragment, { children: [
2105
+ mutation && hooks && /* @__PURE__ */ jsxs(Fragment, { children: [
2031
2106
  /* @__PURE__ */ jsx(File.Import, {
2032
2107
  name: ["useMutation"],
2033
2108
  path: importPath
@@ -2068,7 +2143,7 @@ const queryGenerator = defineGenerator({
2068
2143
  operation(node, ctx) {
2069
2144
  if (!ast.isHttpOperationNode(node)) return null;
2070
2145
  const { config, driver, resolver, root } = ctx;
2071
- const { output, query, mutation, parser, client, group, customOptions } = ctx.options;
2146
+ const { output, query, mutation, validator, client, group, customOptions, hooks } = ctx.options;
2072
2147
  const pluginTs = driver.getPlugin(pluginTsName);
2073
2148
  if (!pluginTs) return null;
2074
2149
  const tsResolver = driver.getResolver(pluginTsName);
@@ -2106,14 +2181,14 @@ const queryGenerator = defineGenerator({
2106
2181
  order: "body-response-first",
2107
2182
  includeParams: false
2108
2183
  })].filter((name) => Boolean(name));
2109
- const pluginZod = isParserEnabled(parser) ? driver.getPlugin(pluginZodName) : null;
2184
+ const pluginZod = isValidatorEnabled(validator) ? driver.getPlugin(pluginZodName) : null;
2110
2185
  const zodResolver = pluginZod ? driver.getResolver(pluginZodName) : null;
2111
2186
  const fileZod = zodResolver ? zodResolver.resolveFile(operationFileEntry(node, node.operationId), {
2112
2187
  root,
2113
2188
  output: pluginZod?.options?.output ?? output,
2114
2189
  group: pluginZod?.options?.group ?? void 0
2115
2190
  }) : null;
2116
- const zodSchemaNames = resolveZodSchemaNames(node, zodResolver, parser);
2191
+ const zodSchemaNames = resolveZodSchemaNames(node, zodResolver, validator);
2117
2192
  const calledClientName = contractOp.name;
2118
2193
  return /* @__PURE__ */ jsxs(File, {
2119
2194
  baseName: meta.file.baseName,
@@ -2180,7 +2255,7 @@ const queryGenerator = defineGenerator({
2180
2255
  node,
2181
2256
  tsResolver
2182
2257
  }),
2183
- query && /* @__PURE__ */ jsxs(Fragment, { children: [
2258
+ query && hooks && /* @__PURE__ */ jsxs(Fragment, { children: [
2184
2259
  /* @__PURE__ */ jsx(File.Import, {
2185
2260
  name: ["useQuery"],
2186
2261
  path: importPath
@@ -2223,7 +2298,7 @@ const suspenseInfiniteQueryGenerator = defineGenerator({
2223
2298
  operation(node, ctx) {
2224
2299
  if (!ast.isHttpOperationNode(node)) return null;
2225
2300
  const { config, driver, resolver, root } = ctx;
2226
- const { output, query, mutation, infinite, suspense, parser, client, group, customOptions } = ctx.options;
2301
+ const { output, query, mutation, infinite, suspense, validator, client, group, customOptions, hooks } = ctx.options;
2227
2302
  const pluginTs = driver.getPlugin(pluginTsName);
2228
2303
  if (!pluginTs) return null;
2229
2304
  const tsResolver = driver.getResolver(pluginTsName);
@@ -2273,14 +2348,14 @@ const suspenseInfiniteQueryGenerator = defineGenerator({
2273
2348
  includeParams: false
2274
2349
  })
2275
2350
  ].filter((name) => Boolean(name));
2276
- const pluginZod = isParserEnabled(parser) ? driver.getPlugin(pluginZodName) : null;
2351
+ const pluginZod = isValidatorEnabled(validator) ? driver.getPlugin(pluginZodName) : null;
2277
2352
  const zodResolver = pluginZod ? driver.getResolver(pluginZodName) : null;
2278
2353
  const fileZod = zodResolver ? zodResolver.resolveFile(operationFileEntry(node, node.operationId), {
2279
2354
  root,
2280
2355
  output: pluginZod?.options?.output ?? output,
2281
2356
  group: pluginZod?.options?.group ?? void 0
2282
2357
  }) : null;
2283
- const zodSchemaNames = resolveZodSchemaNames(node, zodResolver, parser);
2358
+ const zodSchemaNames = resolveZodSchemaNames(node, zodResolver, validator);
2284
2359
  const calledClientName = contractOp.name;
2285
2360
  return /* @__PURE__ */ jsxs(File, {
2286
2361
  baseName: meta.file.baseName,
@@ -2357,31 +2432,33 @@ const suspenseInfiniteQueryGenerator = defineGenerator({
2357
2432
  initialPageParam: infiniteOptions.initialPageParam,
2358
2433
  queryParam: infiniteOptions.queryParam
2359
2434
  }),
2360
- /* @__PURE__ */ jsx(File.Import, {
2361
- name: ["useSuspenseInfiniteQuery"],
2362
- path: importPath
2363
- }),
2364
- /* @__PURE__ */ jsx(File.Import, {
2365
- name: [
2366
- "QueryKey",
2367
- "QueryClient",
2368
- "UseSuspenseInfiniteQueryOptions",
2369
- "UseSuspenseInfiniteQueryResult"
2370
- ],
2371
- path: importPath,
2372
- isTypeOnly: true
2373
- }),
2374
- /* @__PURE__ */ jsx(SuspenseInfiniteQuery, {
2375
- name: queryName,
2376
- queryOptionsName,
2377
- queryKeyName,
2378
- queryKeyTypeName,
2379
- node,
2380
- tsResolver,
2381
- initialPageParam: infiniteOptions.initialPageParam,
2382
- queryParam: infiniteOptions.queryParam,
2383
- customOptions
2384
- })
2435
+ hooks && /* @__PURE__ */ jsxs(Fragment, { children: [
2436
+ /* @__PURE__ */ jsx(File.Import, {
2437
+ name: ["useSuspenseInfiniteQuery"],
2438
+ path: importPath
2439
+ }),
2440
+ /* @__PURE__ */ jsx(File.Import, {
2441
+ name: [
2442
+ "QueryKey",
2443
+ "QueryClient",
2444
+ "UseSuspenseInfiniteQueryOptions",
2445
+ "UseSuspenseInfiniteQueryResult"
2446
+ ],
2447
+ path: importPath,
2448
+ isTypeOnly: true
2449
+ }),
2450
+ /* @__PURE__ */ jsx(SuspenseInfiniteQuery, {
2451
+ name: queryName,
2452
+ queryOptionsName,
2453
+ queryKeyName,
2454
+ queryKeyTypeName,
2455
+ node,
2456
+ tsResolver,
2457
+ initialPageParam: infiniteOptions.initialPageParam,
2458
+ queryParam: infiniteOptions.queryParam,
2459
+ customOptions
2460
+ })
2461
+ ] })
2385
2462
  ]
2386
2463
  });
2387
2464
  }
@@ -2400,7 +2477,7 @@ const suspenseQueryGenerator = defineGenerator({
2400
2477
  operation(node, ctx) {
2401
2478
  if (!ast.isHttpOperationNode(node)) return null;
2402
2479
  const { config, driver, resolver, root } = ctx;
2403
- const { output, query, mutation, suspense, parser, client, group, customOptions } = ctx.options;
2480
+ const { output, query, mutation, suspense, validator, client, group, customOptions, hooks } = ctx.options;
2404
2481
  const pluginTs = driver.getPlugin(pluginTsName);
2405
2482
  if (!pluginTs) return null;
2406
2483
  const tsResolver = driver.getResolver(pluginTsName);
@@ -2438,14 +2515,14 @@ const suspenseQueryGenerator = defineGenerator({
2438
2515
  order: "body-response-first",
2439
2516
  includeParams: false
2440
2517
  })].filter((name) => Boolean(name));
2441
- const pluginZod = isParserEnabled(parser) ? driver.getPlugin(pluginZodName) : null;
2518
+ const pluginZod = isValidatorEnabled(validator) ? driver.getPlugin(pluginZodName) : null;
2442
2519
  const zodResolver = pluginZod ? driver.getResolver(pluginZodName) : null;
2443
2520
  const fileZod = zodResolver ? zodResolver.resolveFile(operationFileEntry(node, node.operationId), {
2444
2521
  root,
2445
2522
  output: pluginZod?.options?.output ?? output,
2446
2523
  group: pluginZod?.options?.group ?? void 0
2447
2524
  }) : null;
2448
- const zodSchemaNames = resolveZodSchemaNames(node, zodResolver, parser);
2525
+ const zodSchemaNames = resolveZodSchemaNames(node, zodResolver, validator);
2449
2526
  const calledClientName = contractOp.name;
2450
2527
  return /* @__PURE__ */ jsxs(File, {
2451
2528
  baseName: meta.file.baseName,
@@ -2512,7 +2589,7 @@ const suspenseQueryGenerator = defineGenerator({
2512
2589
  node,
2513
2590
  tsResolver
2514
2591
  }),
2515
- suspense && /* @__PURE__ */ jsxs(Fragment, { children: [
2592
+ suspense && hooks && /* @__PURE__ */ jsxs(Fragment, { children: [
2516
2593
  /* @__PURE__ */ jsx(File.Import, {
2517
2594
  name: ["useSuspenseQuery"],
2518
2595
  path: importPath
@@ -2692,7 +2769,7 @@ const pluginReactQuery = definePlugin((options) => {
2692
2769
  const { output = {
2693
2770
  path: "hooks",
2694
2771
  barrel: { type: "named" }
2695
- }, group, exclude = [], include, override = [], parser = false, suspense = {}, infinite = false, mutation = {}, query = {}, mutationKey = mutationKeyTransformer, queryKey = queryKeyTransformer, customOptions, client, resolver: userResolver, macros: userMacros } = options;
2772
+ }, group, exclude = [], include, override = [], validator = false, suspense = {}, infinite = false, mutation = {}, query = {}, mutationKey = mutationKeyTransformer, queryKey = queryKeyTransformer, customOptions, hooks = false, client, resolver: userResolver, macros: userMacros } = options;
2696
2773
  const selectedGenerators = [
2697
2774
  queryGenerator,
2698
2775
  suspenseQueryGenerator,
@@ -2706,7 +2783,7 @@ const pluginReactQuery = definePlugin((options) => {
2706
2783
  return {
2707
2784
  name: pluginReactQueryName,
2708
2785
  options,
2709
- dependencies: [pluginTsName, isParserEnabled(parser) ? pluginZodName : void 0].filter((dependency) => Boolean(dependency)),
2786
+ dependencies: [pluginTsName, isValidatorEnabled(validator) ? pluginZodName : void 0].filter((dependency) => Boolean(dependency)),
2710
2787
  hooks: { "kubb:plugin:setup"(ctx) {
2711
2788
  const resolver = userResolver ? {
2712
2789
  ...resolverReactQuery,
@@ -2754,7 +2831,8 @@ const pluginReactQuery = definePlugin((options) => {
2754
2831
  name: "useCustomHookOptions",
2755
2832
  ...customOptions
2756
2833
  } : null,
2757
- parser,
2834
+ hooks,
2835
+ validator,
2758
2836
  group: groupConfig,
2759
2837
  exclude,
2760
2838
  include,