@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.cjs CHANGED
@@ -91,7 +91,7 @@ function toFilePath(name, caseLast = camelCase) {
91
91
  * JavaScript and Java reserved words.
92
92
  * @link https://github.com/jonschlinkert/reserved/blob/master/index.js
93
93
  */
94
- const reservedWords = new Set([
94
+ const reservedWords = /* @__PURE__ */ new Set([
95
95
  "abstract",
96
96
  "arguments",
97
97
  "boolean",
@@ -320,6 +320,23 @@ function caseParams(params, casing) {
320
320
  caseParamsCache.set(params, result);
321
321
  return result;
322
322
  }
323
+ /**
324
+ * Drops parameters that collapse to the same property identity once camelCased, keeping the first.
325
+ *
326
+ * Some specs declare the same parameter twice under different casings (for example AWS S3 lists both
327
+ * `max-uploads` and `MaxUploads`). Both resolve to one output property, so emitting both would yield
328
+ * an object type with a duplicate member, which TypeScript rejects. De-duplicate by the camelCased
329
+ * identity so the resulting group is collision-free regardless of the names each caller carries.
330
+ */
331
+ function dedupeByCasedName(params) {
332
+ const seen = /* @__PURE__ */ new Set();
333
+ return params.filter((param) => {
334
+ const key = camelCase(param.name);
335
+ if (seen.has(key)) return false;
336
+ seen.add(key);
337
+ return true;
338
+ });
339
+ }
323
340
  //#endregion
324
341
  //#region ../../internals/shared/src/operation.ts
325
342
  /**
@@ -358,11 +375,27 @@ function getContentTypeInfo(node) {
358
375
  hasFormData: contentTypes.some((ct) => ct === "multipart/form-data")
359
376
  };
360
377
  }
378
+ /**
379
+ * The request-body counterpart for the primary success response: the content types it documents and
380
+ * whether several are present, so the client can let a caller pick which one to accept.
381
+ */
382
+ function getResponseContentTypeInfo(node) {
383
+ const contentTypes = getPrimarySuccessResponse(node)?.content?.map((e) => e.contentType) ?? [];
384
+ const isMultipleContentTypes = contentTypes.length > 1;
385
+ return {
386
+ contentTypes,
387
+ isMultipleContentTypes,
388
+ contentTypeUnion: isMultipleContentTypes ? contentTypes.map((ct) => JSON.stringify(ct)).join(" | ") : "",
389
+ defaultContentType: contentTypes[0] ?? "application/json",
390
+ hasFormData: contentTypes.some((ct) => ct === "multipart/form-data")
391
+ };
392
+ }
361
393
  function buildRequestConfigType(node) {
362
- const { isMultipleContentTypes, contentTypeUnion } = getContentTypeInfo(node);
394
+ const request = getContentTypeInfo(node);
395
+ const response = getResponseContentTypeInfo(node);
363
396
  const configType = `Partial<Omit<RequestConfig, 'path' | 'query' | 'body' | 'headers' | 'url'>>`;
364
- const contentTypeProp = isMultipleContentTypes ? `contentType?: ${contentTypeUnion}` : null;
365
- return contentTypeProp ? `${configType} & { ${contentTypeProp} }` : configType;
397
+ const members = [request.isMultipleContentTypes ? `request?: ${request.contentTypeUnion}` : null, response.isMultipleContentTypes ? `response?: ${response.contentTypeUnion}` : null].filter(Boolean);
398
+ return members.length ? `${configType} & { contentType?: { ${members.join("; ")} } }` : configType;
366
399
  }
367
400
  /**
368
401
  * Builds the `client?:` option type shared by the generated query hooks (`useQuery`,
@@ -424,10 +457,10 @@ function buildOperationComments(node, options = {}) {
424
457
  function getOperationParameters(node, options = {}) {
425
458
  const params = caseParams(node.parameters, options.paramsCasing === "original" ? void 0 : "camelcase");
426
459
  return {
427
- path: params.filter((param) => param.in === "path"),
428
- query: params.filter((param) => param.in === "query"),
429
- header: params.filter((param) => param.in === "header"),
430
- cookie: params.filter((param) => param.in === "cookie")
460
+ path: dedupeByCasedName(params.filter((param) => param.in === "path")),
461
+ query: dedupeByCasedName(params.filter((param) => param.in === "query")),
462
+ header: dedupeByCasedName(params.filter((param) => param.in === "header")),
463
+ cookie: dedupeByCasedName(params.filter((param) => param.in === "cookie"))
431
464
  };
432
465
  }
433
466
  function getStatusCodeNumber(statusCode) {
@@ -442,6 +475,15 @@ function isErrorStatusCode(statusCode) {
442
475
  const code = getStatusCodeNumber(statusCode);
443
476
  return code !== null && code >= 400;
444
477
  }
478
+ function getSuccessResponses(responses) {
479
+ return responses.filter((response) => isSuccessStatusCode(response.statusCode));
480
+ }
481
+ function getOperationSuccessResponses(node) {
482
+ return getSuccessResponses(node.responses);
483
+ }
484
+ function getPrimarySuccessResponse(node) {
485
+ return getOperationSuccessResponses(node)[0] ?? null;
486
+ }
445
487
  function resolveErrorNames(node, resolver) {
446
488
  return node.responses.filter((response) => isErrorStatusCode(response.statusCode)).map((response) => resolver.resolveResponseStatusName(node, response.statusCode));
447
489
  }
@@ -515,14 +557,14 @@ function createGroupConfig(group) {
515
557
  };
516
558
  }
517
559
  //#endregion
518
- //#region ../../internals/client/src/builders/parser.ts
560
+ //#region ../../internals/client/src/builders/validatorOptions.ts
519
561
  /**
520
- * Returns `true` when any direction of the parser uses zod (used for dependency checks).
562
+ * Returns `true` when any direction of the validator uses zod (used for dependency checks).
521
563
  */
522
- function isParserEnabled(parser) {
523
- if (!parser) return false;
524
- if (parser === "zod") return true;
525
- return Boolean(parser.request || parser.response);
564
+ function isValidatorEnabled(validator) {
565
+ if (!validator) return false;
566
+ if (validator === "zod") return true;
567
+ return Boolean(validator.request || validator.response);
526
568
  }
527
569
  //#endregion
528
570
  //#region ../../internals/client/src/resolveClient.ts
@@ -650,12 +692,15 @@ function MutationKey({ name, node, transformer }) {
650
692
  * The grouped request options, ordered for both the destructured signature and the
651
693
  * call passed to the underlying client.
652
694
  */
653
- const requestGroupOrder = [
695
+ const requestGroupOrder$1 = [
654
696
  "path",
655
697
  "query",
656
698
  "body",
657
699
  "headers"
658
700
  ];
701
+ function maybeValueOrGetter(type) {
702
+ return `${type} | (() => ${type})`;
703
+ }
659
704
  /**
660
705
  * Builds the grouped `{ path, query, body, headers }` parameter that mirrors the client
661
706
  * function signature. Only the groups the operation carries are emitted, typed from the
@@ -668,7 +713,7 @@ const requestGroupOrder = [
668
713
  * `MaybeRefOrGetter` per group.
669
714
  */
670
715
  function buildGroupedRequestParam(node, options) {
671
- const { resolver, keys = requestGroupOrder, memberTypeWrapper } = options;
716
+ const { resolver, keys = requestGroupOrder$1, memberTypeWrapper } = options;
672
717
  const { groups, hasRequiredPath, hasRequiredQuery, hasRequiredHeader } = getRequestGroupOptionality(node);
673
718
  const names = keys.filter((key) => groups[key]);
674
719
  if (names.length === 0) return null;
@@ -680,7 +725,7 @@ function buildGroupedRequestParam(node, options) {
680
725
  };
681
726
  const isOptional = names.every((name) => !requiredByGroup[name]);
682
727
  const requestConfigName = resolver.resolveRequestConfigName(node);
683
- const omittedKeys = requestGroupOrder.filter((key) => !keys.includes(key));
728
+ const omittedKeys = requestGroupOrder$1.filter((key) => !keys.includes(key));
684
729
  const requestConfigType = omittedKeys.length > 0 ? `Omit<${requestConfigName}, ${omittedKeys.map((key) => `'${key}'`).join(" | ")}>` : requestConfigName;
685
730
  if (memberTypeWrapper) {
686
731
  const members = names.map((name) => ({
@@ -736,7 +781,7 @@ function buildClientCall(node, options) {
736
781
  const { groups } = getRequestGroupOptionality(node);
737
782
  return `${clientName}({ ${[
738
783
  "...config",
739
- ...requestGroupOrder.filter((key) => groups[key]),
784
+ ...requestGroupOrder$1.filter((key) => groups[key]),
740
785
  signal ? "signal: config.signal ?? signal" : null,
741
786
  "throwOnError: true"
742
787
  ].filter((part) => part !== null).join(", ")} })`;
@@ -963,6 +1008,30 @@ const customHookOptionsFileGenerator = (0, _kubb_core.defineGenerator)({
963
1008
  }
964
1009
  });
965
1010
  //#endregion
1011
+ //#region src/utils.ts
1012
+ const requestGroupOrder = [
1013
+ "path",
1014
+ "query",
1015
+ "body",
1016
+ "headers"
1017
+ ];
1018
+ /**
1019
+ * Builds the object literal that resolves each request group to a concrete value, unwrapping a getter
1020
+ * once before the value reaches the plain `queryKey`/`queryOptions` helpers. A getter must never reach a
1021
+ * React Query key, which is hashed structurally. Returns `null` when the operation carries no request group.
1022
+ *
1023
+ * @example
1024
+ * ```ts
1025
+ * buildResolvedRequestParams(node) // { path: typeof path === 'function' ? path() : path }
1026
+ * ```
1027
+ */
1028
+ function buildResolvedRequestParams(node) {
1029
+ const groups = getRequestGroups(node);
1030
+ const names = requestGroupOrder.filter((key) => groups[key]);
1031
+ if (names.length === 0) return null;
1032
+ return `{ ${names.map((name) => `${name}: typeof ${name} === 'function' ? ${name}() : ${name}`).join(", ")} }`;
1033
+ }
1034
+ //#endregion
966
1035
  //#region src/generators/hookOptionsGenerator.tsx
967
1036
  /**
968
1037
  * Emits the `HookOptions` type used by `customOptions`. Enabled when
@@ -975,8 +1044,8 @@ const hookOptionsGenerator = (0, _kubb_core.defineGenerator)({
975
1044
  renderer: _kubb_renderer_jsx.jsxRenderer,
976
1045
  operations(nodes, ctx) {
977
1046
  const { resolver, config, root } = ctx;
978
- const { output, customOptions, query, mutation, suspense, infinite, group, override } = ctx.options;
979
- if (!customOptions) return null;
1047
+ const { output, customOptions, query, mutation, suspense, infinite, group, override, hooks } = ctx.options;
1048
+ if (!customOptions || !hooks) return null;
980
1049
  const name = resolver.resolveHookOptionsName();
981
1050
  const resolvedFile = resolver.resolveFile({
982
1051
  name,
@@ -1120,51 +1189,8 @@ const hookOptionsGenerator = (0, _kubb_core.defineGenerator)({
1120
1189
  }
1121
1190
  });
1122
1191
  //#endregion
1123
- //#region src/components/QueryOptions.tsx
1124
- const declarationPrinter$8 = (0, _kubb_plugin_ts.functionPrinter)({ mode: "declaration" });
1125
- const callPrinter$8 = (0, _kubb_plugin_ts.functionPrinter)({ mode: "call" });
1126
- function getQueryOptionsParams(node, options) {
1127
- return buildQueryOptionsParams(node, options);
1128
- }
1129
- function QueryOptions({ name, clientName, node, tsResolver, queryKeyName }) {
1130
- const successNames = resolveSuccessNames(node, tsResolver);
1131
- const responseName = successNames.length > 0 ? successNames.join(" | ") : tsResolver.resolveResponseName(node);
1132
- const errorNames = resolveErrorNames(node, tsResolver);
1133
- const TData = responseName;
1134
- const TError = `ResponseErrorConfig<${errorNames.length > 0 ? errorNames.join(" | ") : "Error"}>`;
1135
- const queryKeyParamsNode = buildQueryKeyParams(node, { resolver: tsResolver });
1136
- const queryKeyParamsCall = callPrinter$8.print(queryKeyParamsNode) ?? "";
1137
- const paramsNode = getQueryOptionsParams(node, { resolver: tsResolver });
1138
- const paramsSignature = declarationPrinter$8.print(paramsNode) ?? "";
1139
- const queryFnBody = `const { data } = await ${buildClientCall(node, {
1140
- clientName,
1141
- signal: true
1142
- })}
1143
- return data`;
1144
- return /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Source, {
1145
- name,
1146
- isExportable: true,
1147
- isIndexable: true,
1148
- children: /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.Function, {
1149
- name,
1150
- export: true,
1151
- params: paramsSignature,
1152
- children: `
1153
- const queryKey = ${queryKeyName}(${queryKeyParamsCall})
1154
- return queryOptions<${TData}, ${TError}, ${TData}, typeof queryKey>({
1155
- queryKey,
1156
- queryFn: async ({ signal }) => {
1157
- ${queryFnBody}
1158
- },
1159
- })
1160
- `
1161
- })
1162
- });
1163
- }
1164
- //#endregion
1165
1192
  //#region src/components/InfiniteQuery.tsx
1166
- const declarationPrinter$7 = (0, _kubb_plugin_ts.functionPrinter)({ mode: "declaration" });
1167
- const callPrinter$7 = (0, _kubb_plugin_ts.functionPrinter)({ mode: "call" });
1193
+ const declarationPrinter$8 = (0, _kubb_plugin_ts.functionPrinter)({ mode: "declaration" });
1168
1194
  function buildInfiniteQueryParamsNode(node, options) {
1169
1195
  const { resolver, pageParamGeneric } = options;
1170
1196
  const optionsParam = (0, _kubb_plugin_ts.createFunctionParameter)({
@@ -1175,7 +1201,10 @@ function buildInfiniteQueryParamsNode(node, options) {
1175
1201
  }`,
1176
1202
  default: "{}"
1177
1203
  });
1178
- return (0, _kubb_plugin_ts.createFunctionParameters)({ params: [buildGroupedRequestParam(node, { resolver }), optionsParam].filter((param) => param !== null) });
1204
+ return (0, _kubb_plugin_ts.createFunctionParameters)({ params: [buildGroupedRequestParam(node, {
1205
+ resolver,
1206
+ memberTypeWrapper: maybeValueOrGetter
1207
+ }), optionsParam].filter((param) => param !== null) });
1179
1208
  }
1180
1209
  function InfiniteQuery({ name, queryKeyTypeName, queryOptionsName, queryKeyName, node, tsResolver, initialPageParam, queryParam, customOptions }) {
1181
1210
  const successNames = resolveSuccessNames(node, tsResolver);
@@ -1203,15 +1232,14 @@ function InfiniteQuery({ name, queryKeyTypeName, queryOptionsName, queryKeyName,
1203
1232
  `TQueryKey extends QueryKey = ${queryKeyTypeName}`,
1204
1233
  `TPageParam = ${pageParamType}`
1205
1234
  ];
1206
- const queryKeyParamsNode = buildQueryKeyParams(node, { resolver: tsResolver });
1207
- const queryKeyParamsCall = callPrinter$7.print(queryKeyParamsNode) ?? "";
1208
- const queryOptionsParamsNode = getQueryOptionsParams(node, { resolver: tsResolver });
1209
- const queryOptionsParamsCall = callPrinter$7.print(queryOptionsParamsNode) ?? "";
1235
+ const resolvedParams = buildResolvedRequestParams(node);
1236
+ const queryKeyArgs = resolvedParams ? "resolvedParams" : "";
1237
+ const queryOptionsArgs = resolvedParams ? "resolvedParams, config" : "config";
1210
1238
  const paramsNode = buildInfiniteQueryParamsNode(node, {
1211
1239
  resolver: tsResolver,
1212
1240
  pageParamGeneric: "TPageParam"
1213
1241
  });
1214
- const paramsSignature = declarationPrinter$7.print(paramsNode) ?? "";
1242
+ const paramsSignature = declarationPrinter$8.print(paramsNode) ?? "";
1215
1243
  return /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Source, {
1216
1244
  name,
1217
1245
  isExportable: true,
@@ -1225,11 +1253,11 @@ function InfiniteQuery({ name, queryKeyTypeName, queryOptionsName, queryKeyName,
1225
1253
  JSDoc: { comments: buildOperationComments(node) },
1226
1254
  children: `
1227
1255
  const { query: queryConfig = {}, client: config = {} } = options ?? {}
1228
- const { client: queryClient, ...resolvedOptions } = queryConfig
1229
- const queryKey = resolvedOptions?.queryKey ?? ${queryKeyName}(${queryKeyParamsCall})${customOptions ? `\n const customOptions = ${customOptions.name}({ hookName: '${name}', operationId: '${node.operationId}' })` : ""}
1256
+ const { client: queryClient, ...resolvedOptions } = queryConfig${resolvedParams ? `\n const resolvedParams = ${resolvedParams}` : ""}
1257
+ const queryKey = resolvedOptions?.queryKey ?? ${queryKeyName}(${queryKeyArgs})${customOptions ? `\n const customOptions = ${customOptions.name}({ hookName: '${name}', operationId: '${node.operationId}' })` : ""}
1230
1258
 
1231
1259
  const queryResult = useInfiniteQuery({
1232
- ...${queryOptionsName}(${queryOptionsParamsCall}),${customOptions ? "\n ...customOptions," : ""}
1260
+ ...${queryOptionsName}(${queryOptionsArgs}),${customOptions ? "\n ...customOptions," : ""}
1233
1261
  ...resolvedOptions,
1234
1262
  queryKey,
1235
1263
  } as unknown as InfiniteQueryObserverOptions<TQueryFnData, TError, TData, TQueryKey, TPageParam>, queryClient) as ${returnType}
@@ -1242,9 +1270,51 @@ function InfiniteQuery({ name, queryKeyTypeName, queryOptionsName, queryKeyName,
1242
1270
  });
1243
1271
  }
1244
1272
  //#endregion
1273
+ //#region src/components/QueryOptions.tsx
1274
+ const declarationPrinter$7 = (0, _kubb_plugin_ts.functionPrinter)({ mode: "declaration" });
1275
+ const callPrinter$4 = (0, _kubb_plugin_ts.functionPrinter)({ mode: "call" });
1276
+ function getQueryOptionsParams(node, options) {
1277
+ return buildQueryOptionsParams(node, options);
1278
+ }
1279
+ function QueryOptions({ name, clientName, node, tsResolver, queryKeyName }) {
1280
+ const successNames = resolveSuccessNames(node, tsResolver);
1281
+ const responseName = successNames.length > 0 ? successNames.join(" | ") : tsResolver.resolveResponseName(node);
1282
+ const errorNames = resolveErrorNames(node, tsResolver);
1283
+ const TData = responseName;
1284
+ const TError = `ResponseErrorConfig<${errorNames.length > 0 ? errorNames.join(" | ") : "Error"}>`;
1285
+ const queryKeyParamsNode = buildQueryKeyParams(node, { resolver: tsResolver });
1286
+ const queryKeyParamsCall = callPrinter$4.print(queryKeyParamsNode) ?? "";
1287
+ const paramsNode = getQueryOptionsParams(node, { resolver: tsResolver });
1288
+ const paramsSignature = declarationPrinter$7.print(paramsNode) ?? "";
1289
+ const queryFnBody = `const { data } = await ${buildClientCall(node, {
1290
+ clientName,
1291
+ signal: true
1292
+ })}
1293
+ return data`;
1294
+ return /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Source, {
1295
+ name,
1296
+ isExportable: true,
1297
+ isIndexable: true,
1298
+ children: /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.Function, {
1299
+ name,
1300
+ export: true,
1301
+ params: paramsSignature,
1302
+ children: `
1303
+ const queryKey = ${queryKeyName}(${queryKeyParamsCall})
1304
+ return queryOptions<${TData}, ${TError}, ${TData}, typeof queryKey>({
1305
+ queryKey,
1306
+ queryFn: async ({ signal }) => {
1307
+ ${queryFnBody}
1308
+ },
1309
+ })
1310
+ `
1311
+ })
1312
+ });
1313
+ }
1314
+ //#endregion
1245
1315
  //#region src/components/InfiniteQueryOptions.tsx
1246
1316
  const declarationPrinter$6 = (0, _kubb_plugin_ts.functionPrinter)({ mode: "declaration" });
1247
- const callPrinter$6 = (0, _kubb_plugin_ts.functionPrinter)({ mode: "call" });
1317
+ const callPrinter$3 = (0, _kubb_plugin_ts.functionPrinter)({ mode: "call" });
1248
1318
  function InfiniteQueryOptions({ name, clientName, initialPageParam, cursorParam, nextParam, previousParam, node, tsResolver, queryParam, queryKeyName }) {
1249
1319
  const successNames = resolveSuccessNames(node, tsResolver);
1250
1320
  const queryFnDataType = successNames.length > 0 ? successNames.join(" | ") : tsResolver.resolveResponseName(node);
@@ -1263,7 +1333,7 @@ function InfiniteQueryOptions({ name, clientName, initialPageParam, cursorParam,
1263
1333
  const queryParamType = queryParam && queryParamsTypeName ? `${queryParamsTypeName}['${queryParam}']` : null;
1264
1334
  const pageParamType = queryParamType ? isInitialPageParamDefined ? `NonNullable<${queryParamType}>` : queryParamType : fallbackPageParamType;
1265
1335
  const queryKeyParamsNode = buildQueryKeyParams(node, { resolver: tsResolver });
1266
- const queryKeyParamsCall = callPrinter$6.print(queryKeyParamsNode) ?? "";
1336
+ const queryKeyParamsCall = callPrinter$3.print(queryKeyParamsNode) ?? "";
1267
1337
  const paramsNode = getQueryOptionsParams(node, { resolver: tsResolver });
1268
1338
  const paramsSignature = declarationPrinter$6.print(paramsNode) ?? "";
1269
1339
  const queryFnBody = `const { data } = await ${buildClientCall(node, {
@@ -1335,7 +1405,7 @@ return infiniteQueryOptions<${queryFnDataType}, ${errorType}, InfiniteData<${que
1335
1405
  //#endregion
1336
1406
  //#region src/components/MutationOptions.tsx
1337
1407
  const declarationPrinter$5 = (0, _kubb_plugin_ts.functionPrinter)({ mode: "declaration" });
1338
- const callPrinter$5 = (0, _kubb_plugin_ts.functionPrinter)({ mode: "call" });
1408
+ const callPrinter$2 = (0, _kubb_plugin_ts.functionPrinter)({ mode: "call" });
1339
1409
  function buildMutationConfigParamsNode(node) {
1340
1410
  return (0, _kubb_plugin_ts.createFunctionParameters)({ params: [(0, _kubb_plugin_ts.createFunctionParameter)({
1341
1411
  name: "config",
@@ -1354,7 +1424,7 @@ function MutationOptions({ name, clientName, node, tsResolver, mutationKeyName }
1354
1424
  const hasMutationParams = groupedParam !== null;
1355
1425
  const groupedParamsNode = (0, _kubb_plugin_ts.createFunctionParameters)({ params: groupedParam ? [groupedParam] : [] });
1356
1426
  const TRequest = hasMutationParams ? tsResolver.resolveRequestConfigName(node) : "undefined";
1357
- const argBindingStr = hasMutationParams ? callPrinter$5.print(groupedParamsNode) ?? "" : "_";
1427
+ const argBindingStr = hasMutationParams ? callPrinter$2.print(groupedParamsNode) ?? "" : "_";
1358
1428
  const mutationFnBody = `const { data } = await ${buildClientCall(node, {
1359
1429
  clientName,
1360
1430
  signal: false
@@ -1384,7 +1454,7 @@ function MutationOptions({ name, clientName, node, tsResolver, mutationKeyName }
1384
1454
  //#endregion
1385
1455
  //#region src/components/Mutation.tsx
1386
1456
  const declarationPrinter$4 = (0, _kubb_plugin_ts.functionPrinter)({ mode: "declaration" });
1387
- const callPrinter$4 = (0, _kubb_plugin_ts.functionPrinter)({ mode: "call" });
1457
+ const callPrinter$1 = (0, _kubb_plugin_ts.functionPrinter)({ mode: "call" });
1388
1458
  function resolveMutationRequestType(node, resolver) {
1389
1459
  return buildGroupedRequestParam(node, { resolver }) ? resolver.resolveRequestConfigName(node) : "undefined";
1390
1460
  }
@@ -1419,7 +1489,7 @@ function Mutation({ name, mutationOptionsName, node, tsResolver, mutationKeyName
1419
1489
  ].join(", ");
1420
1490
  const returnType = `UseMutationResult<${generics}>`;
1421
1491
  const mutationOptionsConfigNode = buildMutationConfigParamsNode(node);
1422
- const mutationOptionsParamsCall = callPrinter$4.print(mutationOptionsConfigNode) ?? "";
1492
+ const mutationOptionsParamsCall = callPrinter$1.print(mutationOptionsConfigNode) ?? "";
1423
1493
  const paramsNode = buildMutationParamsNode(node, { resolver: tsResolver });
1424
1494
  const paramsSignature = declarationPrinter$4.print(paramsNode) ?? "";
1425
1495
  return /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Source, {
@@ -1451,7 +1521,6 @@ function Mutation({ name, mutationOptionsName, node, tsResolver, mutationKeyName
1451
1521
  //#endregion
1452
1522
  //#region src/components/Query.tsx
1453
1523
  const declarationPrinter$3 = (0, _kubb_plugin_ts.functionPrinter)({ mode: "declaration" });
1454
- const callPrinter$3 = (0, _kubb_plugin_ts.functionPrinter)({ mode: "call" });
1455
1524
  function buildQueryParamsNode(node, options) {
1456
1525
  const { resolver } = options;
1457
1526
  const successNames = resolveSuccessNames(node, resolver);
@@ -1471,7 +1540,10 @@ function buildQueryParamsNode(node, options) {
1471
1540
  }`,
1472
1541
  default: "{}"
1473
1542
  });
1474
- return (0, _kubb_plugin_ts.createFunctionParameters)({ params: [buildGroupedRequestParam(node, { resolver }), optionsParam].filter((param) => param !== null) });
1543
+ return (0, _kubb_plugin_ts.createFunctionParameters)({ params: [buildGroupedRequestParam(node, {
1544
+ resolver,
1545
+ memberTypeWrapper: maybeValueOrGetter
1546
+ }), optionsParam].filter((param) => param !== null) });
1475
1547
  }
1476
1548
  function Query({ name, queryKeyTypeName, queryOptionsName, queryKeyName, node, tsResolver, customOptions }) {
1477
1549
  const successNames = resolveSuccessNames(node, tsResolver);
@@ -1484,10 +1556,9 @@ function Query({ name, queryKeyTypeName, queryOptionsName, queryKeyName, node, t
1484
1556
  `TQueryData = ${TData}`,
1485
1557
  `TQueryKey extends QueryKey = ${queryKeyTypeName}`
1486
1558
  ];
1487
- const queryKeyParamsNode = buildQueryKeyParams(node, { resolver: tsResolver });
1488
- const queryKeyParamsCall = callPrinter$3.print(queryKeyParamsNode) ?? "";
1489
- const queryOptionsParamsNode = getQueryOptionsParams(node, { resolver: tsResolver });
1490
- const queryOptionsParamsCall = callPrinter$3.print(queryOptionsParamsNode) ?? "";
1559
+ const resolvedParams = buildResolvedRequestParams(node);
1560
+ const queryKeyArgs = resolvedParams ? "resolvedParams" : "";
1561
+ const queryOptionsArgs = resolvedParams ? "resolvedParams, config" : "config";
1491
1562
  const paramsNode = buildQueryParamsNode(node, { resolver: tsResolver });
1492
1563
  const paramsSignature = declarationPrinter$3.print(paramsNode) ?? "";
1493
1564
  return /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Source, {
@@ -1503,11 +1574,11 @@ function Query({ name, queryKeyTypeName, queryOptionsName, queryKeyName, node, t
1503
1574
  JSDoc: { comments: buildOperationComments(node) },
1504
1575
  children: `
1505
1576
  const { query: queryConfig = {}, client: config = {} } = options ?? {}
1506
- const { client: queryClient, ...resolvedOptions } = queryConfig
1507
- const queryKey = resolvedOptions?.queryKey ?? ${queryKeyName}(${queryKeyParamsCall})${customOptions ? `\n const customOptions = ${customOptions.name}({ hookName: '${name}', operationId: '${node.operationId}' })` : ""}
1577
+ const { client: queryClient, ...resolvedOptions } = queryConfig${resolvedParams ? `\n const resolvedParams = ${resolvedParams}` : ""}
1578
+ const queryKey = resolvedOptions?.queryKey ?? ${queryKeyName}(${queryKeyArgs})${customOptions ? `\n const customOptions = ${customOptions.name}({ hookName: '${name}', operationId: '${node.operationId}' })` : ""}
1508
1579
 
1509
1580
  const queryResult = useQuery({
1510
- ...${queryOptionsName}(${queryOptionsParamsCall}),${customOptions ? "\n ...customOptions," : ""}
1581
+ ...${queryOptionsName}(${queryOptionsArgs}),${customOptions ? "\n ...customOptions," : ""}
1511
1582
  ...resolvedOptions,
1512
1583
  queryKey,
1513
1584
  } as unknown as QueryObserverOptions, queryClient) as ${returnType}
@@ -1522,7 +1593,6 @@ function Query({ name, queryKeyTypeName, queryOptionsName, queryKeyName, node, t
1522
1593
  //#endregion
1523
1594
  //#region src/components/SuspenseInfiniteQuery.tsx
1524
1595
  const declarationPrinter$2 = (0, _kubb_plugin_ts.functionPrinter)({ mode: "declaration" });
1525
- const callPrinter$2 = (0, _kubb_plugin_ts.functionPrinter)({ mode: "call" });
1526
1596
  function buildSuspenseInfiniteQueryParamsNode(node, options) {
1527
1597
  const { resolver, pageParamGeneric } = options;
1528
1598
  const optionsParam = (0, _kubb_plugin_ts.createFunctionParameter)({
@@ -1533,7 +1603,10 @@ function buildSuspenseInfiniteQueryParamsNode(node, options) {
1533
1603
  }`,
1534
1604
  default: "{}"
1535
1605
  });
1536
- return (0, _kubb_plugin_ts.createFunctionParameters)({ params: [buildGroupedRequestParam(node, { resolver }), optionsParam].filter((param) => param !== null) });
1606
+ return (0, _kubb_plugin_ts.createFunctionParameters)({ params: [buildGroupedRequestParam(node, {
1607
+ resolver,
1608
+ memberTypeWrapper: maybeValueOrGetter
1609
+ }), optionsParam].filter((param) => param !== null) });
1537
1610
  }
1538
1611
  function SuspenseInfiniteQuery({ name, queryKeyTypeName, queryOptionsName, queryKeyName, node, tsResolver, customOptions, initialPageParam, queryParam }) {
1539
1612
  const successNames = resolveSuccessNames(node, tsResolver);
@@ -1561,10 +1634,9 @@ function SuspenseInfiniteQuery({ name, queryKeyTypeName, queryOptionsName, query
1561
1634
  `TQueryKey extends QueryKey = ${queryKeyTypeName}`,
1562
1635
  `TPageParam = ${pageParamType}`
1563
1636
  ];
1564
- const queryKeyParamsNode = buildQueryKeyParams(node, { resolver: tsResolver });
1565
- const queryKeyParamsCall = callPrinter$2.print(queryKeyParamsNode) ?? "";
1566
- const queryOptionsParamsNode = getQueryOptionsParams(node, { resolver: tsResolver });
1567
- const queryOptionsParamsCall = callPrinter$2.print(queryOptionsParamsNode) ?? "";
1637
+ const resolvedParams = buildResolvedRequestParams(node);
1638
+ const queryKeyArgs = resolvedParams ? "resolvedParams" : "";
1639
+ const queryOptionsArgs = resolvedParams ? "resolvedParams, config" : "config";
1568
1640
  const paramsNode = buildSuspenseInfiniteQueryParamsNode(node, {
1569
1641
  resolver: tsResolver,
1570
1642
  pageParamGeneric: "TPageParam"
@@ -1583,11 +1655,11 @@ function SuspenseInfiniteQuery({ name, queryKeyTypeName, queryOptionsName, query
1583
1655
  JSDoc: { comments: buildOperationComments(node) },
1584
1656
  children: `
1585
1657
  const { query: queryConfig = {}, client: config = {} } = options ?? {}
1586
- const { client: queryClient, ...resolvedOptions } = queryConfig
1587
- const queryKey = resolvedOptions?.queryKey ?? ${queryKeyName}(${queryKeyParamsCall})${customOptions ? `\n const customOptions = ${customOptions.name}({ hookName: '${name}', operationId: '${node.operationId}' })` : ""}
1658
+ const { client: queryClient, ...resolvedOptions } = queryConfig${resolvedParams ? `\n const resolvedParams = ${resolvedParams}` : ""}
1659
+ const queryKey = resolvedOptions?.queryKey ?? ${queryKeyName}(${queryKeyArgs})${customOptions ? `\n const customOptions = ${customOptions.name}({ hookName: '${name}', operationId: '${node.operationId}' })` : ""}
1588
1660
 
1589
1661
  const queryResult = useSuspenseInfiniteQuery({
1590
- ...${queryOptionsName}(${queryOptionsParamsCall}),${customOptions ? "\n ...customOptions," : ""}
1662
+ ...${queryOptionsName}(${queryOptionsArgs}),${customOptions ? "\n ...customOptions," : ""}
1591
1663
  ...resolvedOptions,
1592
1664
  queryKey,
1593
1665
  } as unknown as UseSuspenseInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryKey, TPageParam>, queryClient) as ${returnType}
@@ -1602,7 +1674,7 @@ function SuspenseInfiniteQuery({ name, queryKeyTypeName, queryOptionsName, query
1602
1674
  //#endregion
1603
1675
  //#region src/components/SuspenseInfiniteQueryOptions.tsx
1604
1676
  const declarationPrinter$1 = (0, _kubb_plugin_ts.functionPrinter)({ mode: "declaration" });
1605
- const callPrinter$1 = (0, _kubb_plugin_ts.functionPrinter)({ mode: "call" });
1677
+ const callPrinter = (0, _kubb_plugin_ts.functionPrinter)({ mode: "call" });
1606
1678
  function SuspenseInfiniteQueryOptions({ name, clientName, initialPageParam, cursorParam, nextParam, previousParam, node, tsResolver, queryParam, queryKeyName }) {
1607
1679
  const successNames = resolveSuccessNames(node, tsResolver);
1608
1680
  const queryFnDataType = successNames.length > 0 ? successNames.join(" | ") : tsResolver.resolveResponseName(node);
@@ -1628,7 +1700,7 @@ function SuspenseInfiniteQueryOptions({ name, clientName, initialPageParam, curs
1628
1700
  })}
1629
1701
  return data`;
1630
1702
  const queryKeyParamsNode = buildQueryKeyParams(node, { resolver: tsResolver });
1631
- const queryKeyParamsCall = callPrinter$1.print(queryKeyParamsNode) ?? "";
1703
+ const queryKeyParamsCall = callPrinter.print(queryKeyParamsNode) ?? "";
1632
1704
  const hasNewParams = nextParam != null || previousParam != null;
1633
1705
  const [getNextPageParamExpr, getPreviousPageParamExpr] = (() => {
1634
1706
  if (hasNewParams) {
@@ -1693,7 +1765,6 @@ return infiniteQueryOptions<${queryFnDataType}, ${errorType}, InfiniteData<${que
1693
1765
  //#endregion
1694
1766
  //#region src/components/SuspenseQuery.tsx
1695
1767
  const declarationPrinter = (0, _kubb_plugin_ts.functionPrinter)({ mode: "declaration" });
1696
- const callPrinter = (0, _kubb_plugin_ts.functionPrinter)({ mode: "call" });
1697
1768
  function buildSuspenseQueryParamsNode(node, options) {
1698
1769
  const { resolver } = options;
1699
1770
  const successNames = resolveSuccessNames(node, resolver);
@@ -1712,7 +1783,10 @@ function buildSuspenseQueryParamsNode(node, options) {
1712
1783
  }`,
1713
1784
  default: "{}"
1714
1785
  });
1715
- return (0, _kubb_plugin_ts.createFunctionParameters)({ params: [buildGroupedRequestParam(node, { resolver }), optionsParam].filter((param) => param !== null) });
1786
+ return (0, _kubb_plugin_ts.createFunctionParameters)({ params: [buildGroupedRequestParam(node, {
1787
+ resolver,
1788
+ memberTypeWrapper: maybeValueOrGetter
1789
+ }), optionsParam].filter((param) => param !== null) });
1716
1790
  }
1717
1791
  function SuspenseQuery({ name, queryKeyTypeName, queryOptionsName, queryKeyName, node, tsResolver, customOptions }) {
1718
1792
  const successNames = resolveSuccessNames(node, tsResolver);
@@ -1721,10 +1795,9 @@ function SuspenseQuery({ name, queryKeyTypeName, queryOptionsName, queryKeyName,
1721
1795
  const TData = responseName;
1722
1796
  const returnType = `UseSuspenseQueryResult<TData, ${`ResponseErrorConfig<${errorNames.length > 0 ? errorNames.join(" | ") : "Error"}>`}> & { queryKey: TQueryKey }`;
1723
1797
  const generics = [`TData = ${TData}`, `TQueryKey extends QueryKey = ${queryKeyTypeName}`];
1724
- const queryKeyParamsNode = buildQueryKeyParams(node, { resolver: tsResolver });
1725
- const queryKeyParamsCall = callPrinter.print(queryKeyParamsNode) ?? "";
1726
- const queryOptionsParamsNode = getQueryOptionsParams(node, { resolver: tsResolver });
1727
- const queryOptionsParamsCall = callPrinter.print(queryOptionsParamsNode) ?? "";
1798
+ const resolvedParams = buildResolvedRequestParams(node);
1799
+ const queryKeyArgs = resolvedParams ? "resolvedParams" : "";
1800
+ const queryOptionsArgs = resolvedParams ? "resolvedParams, config" : "config";
1728
1801
  const paramsNode = buildSuspenseQueryParamsNode(node, { resolver: tsResolver });
1729
1802
  const paramsSignature = declarationPrinter.print(paramsNode) ?? "";
1730
1803
  return /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Source, {
@@ -1740,11 +1813,11 @@ function SuspenseQuery({ name, queryKeyTypeName, queryOptionsName, queryKeyName,
1740
1813
  JSDoc: { comments: buildOperationComments(node) },
1741
1814
  children: `
1742
1815
  const { query: queryConfig = {}, client: config = {} } = options ?? {}
1743
- const { client: queryClient, ...resolvedOptions } = queryConfig
1744
- const queryKey = resolvedOptions?.queryKey ?? ${queryKeyName}(${queryKeyParamsCall})${customOptions ? `\n const customOptions = ${customOptions.name}({ hookName: '${name}', operationId: '${node.operationId}' })` : ""}
1816
+ const { client: queryClient, ...resolvedOptions } = queryConfig${resolvedParams ? `\n const resolvedParams = ${resolvedParams}` : ""}
1817
+ const queryKey = resolvedOptions?.queryKey ?? ${queryKeyName}(${queryKeyArgs})${customOptions ? `\n const customOptions = ${customOptions.name}({ hookName: '${name}', operationId: '${node.operationId}' })` : ""}
1745
1818
 
1746
1819
  const queryResult = useSuspenseQuery({
1747
- ...${queryOptionsName}(${queryOptionsParamsCall}),${customOptions ? "\n ...customOptions," : ""}
1820
+ ...${queryOptionsName}(${queryOptionsArgs}),${customOptions ? "\n ...customOptions," : ""}
1748
1821
  ...resolvedOptions,
1749
1822
  queryKey,
1750
1823
  } as unknown as UseSuspenseQueryOptions, queryClient) as ${returnType}
@@ -1770,7 +1843,7 @@ const infiniteQueryGenerator = (0, _kubb_core.defineGenerator)({
1770
1843
  operation(node, ctx) {
1771
1844
  if (!_kubb_core.ast.isHttpOperationNode(node)) return null;
1772
1845
  const { config, driver, resolver, root } = ctx;
1773
- const { output, query, mutation, infinite, parser, client, group, customOptions } = ctx.options;
1846
+ const { output, query, mutation, infinite, validator, client, group, customOptions, hooks } = ctx.options;
1774
1847
  const pluginTs = driver.getPlugin(_kubb_plugin_ts.pluginTsName);
1775
1848
  if (!pluginTs) return null;
1776
1849
  const tsResolver = driver.getResolver(_kubb_plugin_ts.pluginTsName);
@@ -1820,14 +1893,14 @@ const infiniteQueryGenerator = (0, _kubb_core.defineGenerator)({
1820
1893
  includeParams: false
1821
1894
  })
1822
1895
  ].filter((name) => Boolean(name));
1823
- const pluginZod = isParserEnabled(parser) ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : null;
1896
+ const pluginZod = isValidatorEnabled(validator) ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : null;
1824
1897
  const zodResolver = pluginZod ? driver.getResolver(_kubb_plugin_zod.pluginZodName) : null;
1825
1898
  const fileZod = zodResolver ? zodResolver.resolveFile(operationFileEntry(node, node.operationId), {
1826
1899
  root,
1827
1900
  output: pluginZod?.options?.output ?? output,
1828
1901
  group: pluginZod?.options?.group ?? void 0
1829
1902
  }) : null;
1830
- const zodSchemaNames = resolveZodSchemaNames(node, zodResolver, parser);
1903
+ const zodSchemaNames = resolveZodSchemaNames(node, zodResolver, validator);
1831
1904
  const calledClientName = contractOp.name;
1832
1905
  return /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx.File, {
1833
1906
  baseName: meta.file.baseName,
@@ -1904,31 +1977,33 @@ const infiniteQueryGenerator = (0, _kubb_core.defineGenerator)({
1904
1977
  initialPageParam: infiniteOptions.initialPageParam,
1905
1978
  queryParam: infiniteOptions.queryParam
1906
1979
  }),
1907
- /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1908
- name: ["useInfiniteQuery"],
1909
- path: importPath
1910
- }),
1911
- /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1912
- name: [
1913
- "QueryKey",
1914
- "QueryClient",
1915
- "InfiniteQueryObserverOptions",
1916
- "UseInfiniteQueryResult"
1917
- ],
1918
- path: importPath,
1919
- isTypeOnly: true
1920
- }),
1921
- /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(InfiniteQuery, {
1922
- name: queryName,
1923
- queryOptionsName,
1924
- queryKeyName,
1925
- queryKeyTypeName,
1926
- node,
1927
- tsResolver,
1928
- initialPageParam: infiniteOptions.initialPageParam,
1929
- queryParam: infiniteOptions.queryParam,
1930
- customOptions
1931
- })
1980
+ hooks && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
1981
+ /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1982
+ name: ["useInfiniteQuery"],
1983
+ path: importPath
1984
+ }),
1985
+ /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1986
+ name: [
1987
+ "QueryKey",
1988
+ "QueryClient",
1989
+ "InfiniteQueryObserverOptions",
1990
+ "UseInfiniteQueryResult"
1991
+ ],
1992
+ path: importPath,
1993
+ isTypeOnly: true
1994
+ }),
1995
+ /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(InfiniteQuery, {
1996
+ name: queryName,
1997
+ queryOptionsName,
1998
+ queryKeyName,
1999
+ queryKeyTypeName,
2000
+ node,
2001
+ tsResolver,
2002
+ initialPageParam: infiniteOptions.initialPageParam,
2003
+ queryParam: infiniteOptions.queryParam,
2004
+ customOptions
2005
+ })
2006
+ ] })
1932
2007
  ]
1933
2008
  });
1934
2009
  }
@@ -1946,7 +2021,7 @@ const mutationGenerator = (0, _kubb_core.defineGenerator)({
1946
2021
  operation(node, ctx) {
1947
2022
  if (!_kubb_core.ast.isHttpOperationNode(node)) return null;
1948
2023
  const { config, driver, resolver, root } = ctx;
1949
- const { output, query, mutation, parser, client, group, customOptions } = ctx.options;
2024
+ const { output, query, mutation, validator, client, group, customOptions, hooks } = ctx.options;
1950
2025
  const pluginTs = driver.getPlugin(_kubb_plugin_ts.pluginTsName);
1951
2026
  if (!pluginTs) return null;
1952
2027
  const tsResolver = driver.getResolver(_kubb_plugin_ts.pluginTsName);
@@ -1982,14 +2057,14 @@ const mutationGenerator = (0, _kubb_core.defineGenerator)({
1982
2057
  order: "body-response-first",
1983
2058
  includeParams: false
1984
2059
  })].filter((name) => Boolean(name));
1985
- const pluginZod = isParserEnabled(parser) ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : null;
2060
+ const pluginZod = isValidatorEnabled(validator) ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : null;
1986
2061
  const zodResolver = pluginZod ? driver.getResolver(_kubb_plugin_zod.pluginZodName) : null;
1987
2062
  const fileZod = zodResolver ? zodResolver.resolveFile(operationFileEntry(node, node.operationId), {
1988
2063
  root,
1989
2064
  output: pluginZod?.options?.output ?? output,
1990
2065
  group: pluginZod?.options?.group ?? void 0
1991
2066
  }) : null;
1992
- const zodSchemaNames = resolveZodSchemaNames(node, zodResolver, parser);
2067
+ const zodSchemaNames = resolveZodSchemaNames(node, zodResolver, validator);
1993
2068
  const calledClientName = contractOp.name;
1994
2069
  return /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx.File, {
1995
2070
  baseName: meta.file.baseName,
@@ -2054,7 +2129,7 @@ const mutationGenerator = (0, _kubb_core.defineGenerator)({
2054
2129
  node,
2055
2130
  tsResolver
2056
2131
  }),
2057
- mutation && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
2132
+ mutation && hooks && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
2058
2133
  /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
2059
2134
  name: ["useMutation"],
2060
2135
  path: importPath
@@ -2095,7 +2170,7 @@ const queryGenerator = (0, _kubb_core.defineGenerator)({
2095
2170
  operation(node, ctx) {
2096
2171
  if (!_kubb_core.ast.isHttpOperationNode(node)) return null;
2097
2172
  const { config, driver, resolver, root } = ctx;
2098
- const { output, query, mutation, parser, client, group, customOptions } = ctx.options;
2173
+ const { output, query, mutation, validator, client, group, customOptions, hooks } = ctx.options;
2099
2174
  const pluginTs = driver.getPlugin(_kubb_plugin_ts.pluginTsName);
2100
2175
  if (!pluginTs) return null;
2101
2176
  const tsResolver = driver.getResolver(_kubb_plugin_ts.pluginTsName);
@@ -2133,14 +2208,14 @@ const queryGenerator = (0, _kubb_core.defineGenerator)({
2133
2208
  order: "body-response-first",
2134
2209
  includeParams: false
2135
2210
  })].filter((name) => Boolean(name));
2136
- const pluginZod = isParserEnabled(parser) ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : null;
2211
+ const pluginZod = isValidatorEnabled(validator) ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : null;
2137
2212
  const zodResolver = pluginZod ? driver.getResolver(_kubb_plugin_zod.pluginZodName) : null;
2138
2213
  const fileZod = zodResolver ? zodResolver.resolveFile(operationFileEntry(node, node.operationId), {
2139
2214
  root,
2140
2215
  output: pluginZod?.options?.output ?? output,
2141
2216
  group: pluginZod?.options?.group ?? void 0
2142
2217
  }) : null;
2143
- const zodSchemaNames = resolveZodSchemaNames(node, zodResolver, parser);
2218
+ const zodSchemaNames = resolveZodSchemaNames(node, zodResolver, validator);
2144
2219
  const calledClientName = contractOp.name;
2145
2220
  return /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx.File, {
2146
2221
  baseName: meta.file.baseName,
@@ -2207,7 +2282,7 @@ const queryGenerator = (0, _kubb_core.defineGenerator)({
2207
2282
  node,
2208
2283
  tsResolver
2209
2284
  }),
2210
- query && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
2285
+ query && hooks && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
2211
2286
  /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
2212
2287
  name: ["useQuery"],
2213
2288
  path: importPath
@@ -2250,7 +2325,7 @@ const suspenseInfiniteQueryGenerator = (0, _kubb_core.defineGenerator)({
2250
2325
  operation(node, ctx) {
2251
2326
  if (!_kubb_core.ast.isHttpOperationNode(node)) return null;
2252
2327
  const { config, driver, resolver, root } = ctx;
2253
- const { output, query, mutation, infinite, suspense, parser, client, group, customOptions } = ctx.options;
2328
+ const { output, query, mutation, infinite, suspense, validator, client, group, customOptions, hooks } = ctx.options;
2254
2329
  const pluginTs = driver.getPlugin(_kubb_plugin_ts.pluginTsName);
2255
2330
  if (!pluginTs) return null;
2256
2331
  const tsResolver = driver.getResolver(_kubb_plugin_ts.pluginTsName);
@@ -2300,14 +2375,14 @@ const suspenseInfiniteQueryGenerator = (0, _kubb_core.defineGenerator)({
2300
2375
  includeParams: false
2301
2376
  })
2302
2377
  ].filter((name) => Boolean(name));
2303
- const pluginZod = isParserEnabled(parser) ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : null;
2378
+ const pluginZod = isValidatorEnabled(validator) ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : null;
2304
2379
  const zodResolver = pluginZod ? driver.getResolver(_kubb_plugin_zod.pluginZodName) : null;
2305
2380
  const fileZod = zodResolver ? zodResolver.resolveFile(operationFileEntry(node, node.operationId), {
2306
2381
  root,
2307
2382
  output: pluginZod?.options?.output ?? output,
2308
2383
  group: pluginZod?.options?.group ?? void 0
2309
2384
  }) : null;
2310
- const zodSchemaNames = resolveZodSchemaNames(node, zodResolver, parser);
2385
+ const zodSchemaNames = resolveZodSchemaNames(node, zodResolver, validator);
2311
2386
  const calledClientName = contractOp.name;
2312
2387
  return /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx.File, {
2313
2388
  baseName: meta.file.baseName,
@@ -2384,31 +2459,33 @@ const suspenseInfiniteQueryGenerator = (0, _kubb_core.defineGenerator)({
2384
2459
  initialPageParam: infiniteOptions.initialPageParam,
2385
2460
  queryParam: infiniteOptions.queryParam
2386
2461
  }),
2387
- /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
2388
- name: ["useSuspenseInfiniteQuery"],
2389
- path: importPath
2390
- }),
2391
- /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
2392
- name: [
2393
- "QueryKey",
2394
- "QueryClient",
2395
- "UseSuspenseInfiniteQueryOptions",
2396
- "UseSuspenseInfiniteQueryResult"
2397
- ],
2398
- path: importPath,
2399
- isTypeOnly: true
2400
- }),
2401
- /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(SuspenseInfiniteQuery, {
2402
- name: queryName,
2403
- queryOptionsName,
2404
- queryKeyName,
2405
- queryKeyTypeName,
2406
- node,
2407
- tsResolver,
2408
- initialPageParam: infiniteOptions.initialPageParam,
2409
- queryParam: infiniteOptions.queryParam,
2410
- customOptions
2411
- })
2462
+ hooks && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
2463
+ /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
2464
+ name: ["useSuspenseInfiniteQuery"],
2465
+ path: importPath
2466
+ }),
2467
+ /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
2468
+ name: [
2469
+ "QueryKey",
2470
+ "QueryClient",
2471
+ "UseSuspenseInfiniteQueryOptions",
2472
+ "UseSuspenseInfiniteQueryResult"
2473
+ ],
2474
+ path: importPath,
2475
+ isTypeOnly: true
2476
+ }),
2477
+ /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(SuspenseInfiniteQuery, {
2478
+ name: queryName,
2479
+ queryOptionsName,
2480
+ queryKeyName,
2481
+ queryKeyTypeName,
2482
+ node,
2483
+ tsResolver,
2484
+ initialPageParam: infiniteOptions.initialPageParam,
2485
+ queryParam: infiniteOptions.queryParam,
2486
+ customOptions
2487
+ })
2488
+ ] })
2412
2489
  ]
2413
2490
  });
2414
2491
  }
@@ -2427,7 +2504,7 @@ const suspenseQueryGenerator = (0, _kubb_core.defineGenerator)({
2427
2504
  operation(node, ctx) {
2428
2505
  if (!_kubb_core.ast.isHttpOperationNode(node)) return null;
2429
2506
  const { config, driver, resolver, root } = ctx;
2430
- const { output, query, mutation, suspense, parser, client, group, customOptions } = ctx.options;
2507
+ const { output, query, mutation, suspense, validator, client, group, customOptions, hooks } = ctx.options;
2431
2508
  const pluginTs = driver.getPlugin(_kubb_plugin_ts.pluginTsName);
2432
2509
  if (!pluginTs) return null;
2433
2510
  const tsResolver = driver.getResolver(_kubb_plugin_ts.pluginTsName);
@@ -2465,14 +2542,14 @@ const suspenseQueryGenerator = (0, _kubb_core.defineGenerator)({
2465
2542
  order: "body-response-first",
2466
2543
  includeParams: false
2467
2544
  })].filter((name) => Boolean(name));
2468
- const pluginZod = isParserEnabled(parser) ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : null;
2545
+ const pluginZod = isValidatorEnabled(validator) ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : null;
2469
2546
  const zodResolver = pluginZod ? driver.getResolver(_kubb_plugin_zod.pluginZodName) : null;
2470
2547
  const fileZod = zodResolver ? zodResolver.resolveFile(operationFileEntry(node, node.operationId), {
2471
2548
  root,
2472
2549
  output: pluginZod?.options?.output ?? output,
2473
2550
  group: pluginZod?.options?.group ?? void 0
2474
2551
  }) : null;
2475
- const zodSchemaNames = resolveZodSchemaNames(node, zodResolver, parser);
2552
+ const zodSchemaNames = resolveZodSchemaNames(node, zodResolver, validator);
2476
2553
  const calledClientName = contractOp.name;
2477
2554
  return /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx.File, {
2478
2555
  baseName: meta.file.baseName,
@@ -2539,7 +2616,7 @@ const suspenseQueryGenerator = (0, _kubb_core.defineGenerator)({
2539
2616
  node,
2540
2617
  tsResolver
2541
2618
  }),
2542
- suspense && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
2619
+ suspense && hooks && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
2543
2620
  /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
2544
2621
  name: ["useSuspenseQuery"],
2545
2622
  path: importPath
@@ -2719,7 +2796,7 @@ const pluginReactQuery = (0, _kubb_core.definePlugin)((options) => {
2719
2796
  const { output = {
2720
2797
  path: "hooks",
2721
2798
  barrel: { type: "named" }
2722
- }, group, exclude = [], include, override = [], parser = false, suspense = {}, infinite = false, mutation = {}, query = {}, mutationKey = mutationKeyTransformer, queryKey = queryKeyTransformer, customOptions, client, resolver: userResolver, macros: userMacros } = options;
2799
+ }, group, exclude = [], include, override = [], validator = false, suspense = {}, infinite = false, mutation = {}, query = {}, mutationKey = mutationKeyTransformer, queryKey = queryKeyTransformer, customOptions, hooks = false, client, resolver: userResolver, macros: userMacros } = options;
2723
2800
  const selectedGenerators = [
2724
2801
  queryGenerator,
2725
2802
  suspenseQueryGenerator,
@@ -2733,7 +2810,7 @@ const pluginReactQuery = (0, _kubb_core.definePlugin)((options) => {
2733
2810
  return {
2734
2811
  name: pluginReactQueryName,
2735
2812
  options,
2736
- dependencies: [_kubb_plugin_ts.pluginTsName, isParserEnabled(parser) ? _kubb_plugin_zod.pluginZodName : void 0].filter((dependency) => Boolean(dependency)),
2813
+ dependencies: [_kubb_plugin_ts.pluginTsName, isValidatorEnabled(validator) ? _kubb_plugin_zod.pluginZodName : void 0].filter((dependency) => Boolean(dependency)),
2737
2814
  hooks: { "kubb:plugin:setup"(ctx) {
2738
2815
  const resolver = userResolver ? {
2739
2816
  ...resolverReactQuery,
@@ -2781,7 +2858,8 @@ const pluginReactQuery = (0, _kubb_core.definePlugin)((options) => {
2781
2858
  name: "useCustomHookOptions",
2782
2859
  ...customOptions
2783
2860
  } : null,
2784
- parser,
2861
+ hooks,
2862
+ validator,
2785
2863
  group: groupConfig,
2786
2864
  exclude,
2787
2865
  include,