@kubb/plugin-react-query 5.0.0-beta.79 → 5.0.0-beta.81

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
@@ -2,7 +2,6 @@ import "./rolldown-runtime-C0LytTxp.js";
2
2
  import path from "node:path";
3
3
  import { ast, defineGenerator, definePlugin, defineResolver } from "@kubb/core";
4
4
  import { createFunctionParameter, createFunctionParameters, createObjectBindingPattern, createTypeLiteral, functionPrinter, pluginTsName } from "@kubb/plugin-ts";
5
- import { pluginZodName } from "@kubb/plugin-zod";
6
5
  import { File, Function, Type, jsxRenderer } from "@kubb/renderer-jsx";
7
6
  import { Fragment, jsx, jsxs } from "@kubb/renderer-jsx/jsx-runtime";
8
7
  import fs from "node:fs";
@@ -530,16 +529,6 @@ function createGroupConfig(group) {
530
529
  };
531
530
  }
532
531
  //#endregion
533
- //#region ../../internals/client/src/builders/validatorOptions.ts
534
- /**
535
- * Returns `true` when any direction of the validator uses zod (used for dependency checks).
536
- */
537
- function isValidatorEnabled(validator) {
538
- if (!validator) return false;
539
- if (validator === "zod") return true;
540
- return Boolean(validator.request || validator.response);
541
- }
542
- //#endregion
543
532
  //#region ../../internals/client/src/resolveClient.ts
544
533
  /**
545
534
  * Resolves which client plugin a consumer (react-query, vue-query, swr, mcp) should call for an
@@ -665,12 +654,15 @@ function MutationKey({ name, node, transformer }) {
665
654
  * The grouped request options, ordered for both the destructured signature and the
666
655
  * call passed to the underlying client.
667
656
  */
668
- const requestGroupOrder = [
657
+ const requestGroupOrder$1 = [
669
658
  "path",
670
659
  "query",
671
660
  "body",
672
661
  "headers"
673
662
  ];
663
+ function maybeValueOrGetter(type) {
664
+ return `${type} | (() => ${type})`;
665
+ }
674
666
  /**
675
667
  * Builds the grouped `{ path, query, body, headers }` parameter that mirrors the client
676
668
  * function signature. Only the groups the operation carries are emitted, typed from the
@@ -683,7 +675,7 @@ const requestGroupOrder = [
683
675
  * `MaybeRefOrGetter` per group.
684
676
  */
685
677
  function buildGroupedRequestParam(node, options) {
686
- const { resolver, keys = requestGroupOrder, memberTypeWrapper } = options;
678
+ const { resolver, keys = requestGroupOrder$1, memberTypeWrapper } = options;
687
679
  const { groups, hasRequiredPath, hasRequiredQuery, hasRequiredHeader } = getRequestGroupOptionality(node);
688
680
  const names = keys.filter((key) => groups[key]);
689
681
  if (names.length === 0) return null;
@@ -695,7 +687,7 @@ function buildGroupedRequestParam(node, options) {
695
687
  };
696
688
  const isOptional = names.every((name) => !requiredByGroup[name]);
697
689
  const requestConfigName = resolver.resolveRequestConfigName(node);
698
- const omittedKeys = requestGroupOrder.filter((key) => !keys.includes(key));
690
+ const omittedKeys = requestGroupOrder$1.filter((key) => !keys.includes(key));
699
691
  const requestConfigType = omittedKeys.length > 0 ? `Omit<${requestConfigName}, ${omittedKeys.map((key) => `'${key}'`).join(" | ")}>` : requestConfigName;
700
692
  if (memberTypeWrapper) {
701
693
  const members = names.map((name) => ({
@@ -751,7 +743,7 @@ function buildClientCall(node, options) {
751
743
  const { groups } = getRequestGroupOptionality(node);
752
744
  return `${clientName}({ ${[
753
745
  "...config",
754
- ...requestGroupOrder.filter((key) => groups[key]),
746
+ ...requestGroupOrder$1.filter((key) => groups[key]),
755
747
  signal ? "signal: config.signal ?? signal" : null,
756
748
  "throwOnError: true"
757
749
  ].filter((part) => part !== null).join(", ")} })`;
@@ -779,51 +771,6 @@ function resolveOperationOverrides(node, override) {
779
771
  return override.find((ov) => matchesPattern(node, ov))?.options ?? {};
780
772
  }
781
773
  /**
782
- * Returns `'zod'` when response-direction parsing is enabled.
783
- * The string shorthand `'zod'` also enables response parsing.
784
- */
785
- function resolveResponseParser(parser) {
786
- if (!parser) return null;
787
- if (parser === "zod") return "zod";
788
- return parser.response ?? null;
789
- }
790
- /**
791
- * Returns `'zod'` when request body parsing is enabled.
792
- * The string shorthand `'zod'` also enables request body parsing (existing behavior).
793
- */
794
- function resolveRequestParser(parser) {
795
- if (!parser) return null;
796
- if (parser === "zod") return "zod";
797
- return parser.request ?? null;
798
- }
799
- /**
800
- * Returns `'zod'` when query-params parsing is enabled.
801
- * Only the object form `{ request: 'zod' }` enables this. `parser: 'zod'` does not.
802
- */
803
- function resolveQueryParamsParser(parser) {
804
- if (!parser || parser === "zod") return null;
805
- return parser.request ?? null;
806
- }
807
- /**
808
- * Collects the Zod schema import names for an operation based on the active parser directions.
809
- *
810
- * - `parser: 'zod'`: response and request body names (backward-compatible behavior).
811
- * - `parser: { request: 'zod' }`: request body and query params names.
812
- * - `parser: { response: 'zod' }`: response name only.
813
- * - `parser: { request: 'zod', response: 'zod' }`: all three.
814
- *
815
- * Returns an empty array when no resolver is provided or `parser` is falsy.
816
- */
817
- function resolveZodSchemaNames(node, zodResolver, parser) {
818
- if (!zodResolver || !parser) return [];
819
- const { query: queryParams } = getOperationParameters(node, { paramsCasing: "original" });
820
- return [
821
- resolveResponseParser(parser) === "zod" ? zodResolver.resolveResponseName?.(node) : null,
822
- resolveRequestParser(parser) === "zod" && node.requestBody?.content?.[0]?.schema ? zodResolver.resolveDataName?.(node) : null,
823
- resolveQueryParamsParser(parser) === "zod" && queryParams.length > 0 ? zodResolver.resolveQueryParamsName?.(node, queryParams[0]) : null
824
- ].filter((n) => Boolean(n));
825
- }
826
- /**
827
774
  * Build QueryKey params as the grouped `{ path, query, body }` object (NO headers, NO config),
828
775
  * typed from the operation's `RequestConfig` minus `url`. The query key transformer reads the
829
776
  * grouped `path`/`query`/`body` bindings.
@@ -978,6 +925,30 @@ const customHookOptionsFileGenerator = defineGenerator({
978
925
  }
979
926
  });
980
927
  //#endregion
928
+ //#region src/utils.ts
929
+ const requestGroupOrder = [
930
+ "path",
931
+ "query",
932
+ "body",
933
+ "headers"
934
+ ];
935
+ /**
936
+ * Builds the object literal that resolves each request group to a concrete value, unwrapping a getter
937
+ * once before the value reaches the plain `queryKey`/`queryOptions` helpers. A getter must never reach a
938
+ * React Query key, which is hashed structurally. Returns `null` when the operation carries no request group.
939
+ *
940
+ * @example
941
+ * ```ts
942
+ * buildResolvedRequestParams(node) // { path: typeof path === 'function' ? path() : path }
943
+ * ```
944
+ */
945
+ function buildResolvedRequestParams(node) {
946
+ const groups = getRequestGroups(node);
947
+ const names = requestGroupOrder.filter((key) => groups[key]);
948
+ if (names.length === 0) return null;
949
+ return `{ ${names.map((name) => `${name}: typeof ${name} === 'function' ? ${name}() : ${name}`).join(", ")} }`;
950
+ }
951
+ //#endregion
981
952
  //#region src/generators/hookOptionsGenerator.tsx
982
953
  /**
983
954
  * Emits the `HookOptions` type used by `customOptions`. Enabled when
@@ -990,8 +961,8 @@ const hookOptionsGenerator = defineGenerator({
990
961
  renderer: jsxRenderer,
991
962
  operations(nodes, ctx) {
992
963
  const { resolver, config, root } = ctx;
993
- const { output, customOptions, query, mutation, suspense, infinite, group, override } = ctx.options;
994
- if (!customOptions) return null;
964
+ const { output, customOptions, query, mutation, suspense, infinite, group, override, hooks } = ctx.options;
965
+ if (!customOptions || !hooks) return null;
995
966
  const name = resolver.resolveHookOptionsName();
996
967
  const resolvedFile = resolver.resolveFile({
997
968
  name,
@@ -1135,51 +1106,8 @@ const hookOptionsGenerator = defineGenerator({
1135
1106
  }
1136
1107
  });
1137
1108
  //#endregion
1138
- //#region src/components/QueryOptions.tsx
1139
- const declarationPrinter$8 = functionPrinter({ mode: "declaration" });
1140
- const callPrinter$8 = functionPrinter({ mode: "call" });
1141
- function getQueryOptionsParams(node, options) {
1142
- return buildQueryOptionsParams(node, options);
1143
- }
1144
- function QueryOptions({ name, clientName, node, tsResolver, queryKeyName }) {
1145
- const successNames = resolveSuccessNames(node, tsResolver);
1146
- const responseName = successNames.length > 0 ? successNames.join(" | ") : tsResolver.resolveResponseName(node);
1147
- const errorNames = resolveErrorNames(node, tsResolver);
1148
- const TData = responseName;
1149
- const TError = `ResponseErrorConfig<${errorNames.length > 0 ? errorNames.join(" | ") : "Error"}>`;
1150
- const queryKeyParamsNode = buildQueryKeyParams(node, { resolver: tsResolver });
1151
- const queryKeyParamsCall = callPrinter$8.print(queryKeyParamsNode) ?? "";
1152
- const paramsNode = getQueryOptionsParams(node, { resolver: tsResolver });
1153
- const paramsSignature = declarationPrinter$8.print(paramsNode) ?? "";
1154
- const queryFnBody = `const { data } = await ${buildClientCall(node, {
1155
- clientName,
1156
- signal: true
1157
- })}
1158
- return data`;
1159
- return /* @__PURE__ */ jsx(File.Source, {
1160
- name,
1161
- isExportable: true,
1162
- isIndexable: true,
1163
- children: /* @__PURE__ */ jsx(Function, {
1164
- name,
1165
- export: true,
1166
- params: paramsSignature,
1167
- children: `
1168
- const queryKey = ${queryKeyName}(${queryKeyParamsCall})
1169
- return queryOptions<${TData}, ${TError}, ${TData}, typeof queryKey>({
1170
- queryKey,
1171
- queryFn: async ({ signal }) => {
1172
- ${queryFnBody}
1173
- },
1174
- })
1175
- `
1176
- })
1177
- });
1178
- }
1179
- //#endregion
1180
1109
  //#region src/components/InfiniteQuery.tsx
1181
- const declarationPrinter$7 = functionPrinter({ mode: "declaration" });
1182
- const callPrinter$7 = functionPrinter({ mode: "call" });
1110
+ const declarationPrinter$8 = functionPrinter({ mode: "declaration" });
1183
1111
  function buildInfiniteQueryParamsNode(node, options) {
1184
1112
  const { resolver, pageParamGeneric } = options;
1185
1113
  const optionsParam = createFunctionParameter({
@@ -1190,7 +1118,10 @@ function buildInfiniteQueryParamsNode(node, options) {
1190
1118
  }`,
1191
1119
  default: "{}"
1192
1120
  });
1193
- return createFunctionParameters({ params: [buildGroupedRequestParam(node, { resolver }), optionsParam].filter((param) => param !== null) });
1121
+ return createFunctionParameters({ params: [buildGroupedRequestParam(node, {
1122
+ resolver,
1123
+ memberTypeWrapper: maybeValueOrGetter
1124
+ }), optionsParam].filter((param) => param !== null) });
1194
1125
  }
1195
1126
  function InfiniteQuery({ name, queryKeyTypeName, queryOptionsName, queryKeyName, node, tsResolver, initialPageParam, queryParam, customOptions }) {
1196
1127
  const successNames = resolveSuccessNames(node, tsResolver);
@@ -1218,15 +1149,14 @@ function InfiniteQuery({ name, queryKeyTypeName, queryOptionsName, queryKeyName,
1218
1149
  `TQueryKey extends QueryKey = ${queryKeyTypeName}`,
1219
1150
  `TPageParam = ${pageParamType}`
1220
1151
  ];
1221
- const queryKeyParamsNode = buildQueryKeyParams(node, { resolver: tsResolver });
1222
- const queryKeyParamsCall = callPrinter$7.print(queryKeyParamsNode) ?? "";
1223
- const queryOptionsParamsNode = getQueryOptionsParams(node, { resolver: tsResolver });
1224
- const queryOptionsParamsCall = callPrinter$7.print(queryOptionsParamsNode) ?? "";
1152
+ const resolvedParams = buildResolvedRequestParams(node);
1153
+ const queryKeyArgs = resolvedParams ? "resolvedParams" : "";
1154
+ const queryOptionsArgs = resolvedParams ? "resolvedParams, config" : "config";
1225
1155
  const paramsNode = buildInfiniteQueryParamsNode(node, {
1226
1156
  resolver: tsResolver,
1227
1157
  pageParamGeneric: "TPageParam"
1228
1158
  });
1229
- const paramsSignature = declarationPrinter$7.print(paramsNode) ?? "";
1159
+ const paramsSignature = declarationPrinter$8.print(paramsNode) ?? "";
1230
1160
  return /* @__PURE__ */ jsx(File.Source, {
1231
1161
  name,
1232
1162
  isExportable: true,
@@ -1240,11 +1170,11 @@ function InfiniteQuery({ name, queryKeyTypeName, queryOptionsName, queryKeyName,
1240
1170
  JSDoc: { comments: buildOperationComments(node) },
1241
1171
  children: `
1242
1172
  const { query: queryConfig = {}, client: config = {} } = options ?? {}
1243
- const { client: queryClient, ...resolvedOptions } = queryConfig
1244
- const queryKey = resolvedOptions?.queryKey ?? ${queryKeyName}(${queryKeyParamsCall})${customOptions ? `\n const customOptions = ${customOptions.name}({ hookName: '${name}', operationId: '${node.operationId}' })` : ""}
1173
+ const { client: queryClient, ...resolvedOptions } = queryConfig${resolvedParams ? `\n const resolvedParams = ${resolvedParams}` : ""}
1174
+ const queryKey = resolvedOptions?.queryKey ?? ${queryKeyName}(${queryKeyArgs})${customOptions ? `\n const customOptions = ${customOptions.name}({ hookName: '${name}', operationId: '${node.operationId}' })` : ""}
1245
1175
 
1246
1176
  const queryResult = useInfiniteQuery({
1247
- ...${queryOptionsName}(${queryOptionsParamsCall}),${customOptions ? "\n ...customOptions," : ""}
1177
+ ...${queryOptionsName}(${queryOptionsArgs}),${customOptions ? "\n ...customOptions," : ""}
1248
1178
  ...resolvedOptions,
1249
1179
  queryKey,
1250
1180
  } as unknown as InfiniteQueryObserverOptions<TQueryFnData, TError, TData, TQueryKey, TPageParam>, queryClient) as ${returnType}
@@ -1257,9 +1187,51 @@ function InfiniteQuery({ name, queryKeyTypeName, queryOptionsName, queryKeyName,
1257
1187
  });
1258
1188
  }
1259
1189
  //#endregion
1190
+ //#region src/components/QueryOptions.tsx
1191
+ const declarationPrinter$7 = functionPrinter({ mode: "declaration" });
1192
+ const callPrinter$4 = functionPrinter({ mode: "call" });
1193
+ function getQueryOptionsParams(node, options) {
1194
+ return buildQueryOptionsParams(node, options);
1195
+ }
1196
+ function QueryOptions({ name, clientName, node, tsResolver, queryKeyName }) {
1197
+ const successNames = resolveSuccessNames(node, tsResolver);
1198
+ const responseName = successNames.length > 0 ? successNames.join(" | ") : tsResolver.resolveResponseName(node);
1199
+ const errorNames = resolveErrorNames(node, tsResolver);
1200
+ const TData = responseName;
1201
+ const TError = `ResponseErrorConfig<${errorNames.length > 0 ? errorNames.join(" | ") : "Error"}>`;
1202
+ const queryKeyParamsNode = buildQueryKeyParams(node, { resolver: tsResolver });
1203
+ const queryKeyParamsCall = callPrinter$4.print(queryKeyParamsNode) ?? "";
1204
+ const paramsNode = getQueryOptionsParams(node, { resolver: tsResolver });
1205
+ const paramsSignature = declarationPrinter$7.print(paramsNode) ?? "";
1206
+ const queryFnBody = `const { data } = await ${buildClientCall(node, {
1207
+ clientName,
1208
+ signal: true
1209
+ })}
1210
+ return data`;
1211
+ return /* @__PURE__ */ jsx(File.Source, {
1212
+ name,
1213
+ isExportable: true,
1214
+ isIndexable: true,
1215
+ children: /* @__PURE__ */ jsx(Function, {
1216
+ name,
1217
+ export: true,
1218
+ params: paramsSignature,
1219
+ children: `
1220
+ const queryKey = ${queryKeyName}(${queryKeyParamsCall})
1221
+ return queryOptions<${TData}, ${TError}, ${TData}, typeof queryKey>({
1222
+ queryKey,
1223
+ queryFn: async ({ signal }) => {
1224
+ ${queryFnBody}
1225
+ },
1226
+ })
1227
+ `
1228
+ })
1229
+ });
1230
+ }
1231
+ //#endregion
1260
1232
  //#region src/components/InfiniteQueryOptions.tsx
1261
1233
  const declarationPrinter$6 = functionPrinter({ mode: "declaration" });
1262
- const callPrinter$6 = functionPrinter({ mode: "call" });
1234
+ const callPrinter$3 = functionPrinter({ mode: "call" });
1263
1235
  function InfiniteQueryOptions({ name, clientName, initialPageParam, cursorParam, nextParam, previousParam, node, tsResolver, queryParam, queryKeyName }) {
1264
1236
  const successNames = resolveSuccessNames(node, tsResolver);
1265
1237
  const queryFnDataType = successNames.length > 0 ? successNames.join(" | ") : tsResolver.resolveResponseName(node);
@@ -1278,7 +1250,7 @@ function InfiniteQueryOptions({ name, clientName, initialPageParam, cursorParam,
1278
1250
  const queryParamType = queryParam && queryParamsTypeName ? `${queryParamsTypeName}['${queryParam}']` : null;
1279
1251
  const pageParamType = queryParamType ? isInitialPageParamDefined ? `NonNullable<${queryParamType}>` : queryParamType : fallbackPageParamType;
1280
1252
  const queryKeyParamsNode = buildQueryKeyParams(node, { resolver: tsResolver });
1281
- const queryKeyParamsCall = callPrinter$6.print(queryKeyParamsNode) ?? "";
1253
+ const queryKeyParamsCall = callPrinter$3.print(queryKeyParamsNode) ?? "";
1282
1254
  const paramsNode = getQueryOptionsParams(node, { resolver: tsResolver });
1283
1255
  const paramsSignature = declarationPrinter$6.print(paramsNode) ?? "";
1284
1256
  const queryFnBody = `const { data } = await ${buildClientCall(node, {
@@ -1350,7 +1322,7 @@ return infiniteQueryOptions<${queryFnDataType}, ${errorType}, InfiniteData<${que
1350
1322
  //#endregion
1351
1323
  //#region src/components/MutationOptions.tsx
1352
1324
  const declarationPrinter$5 = functionPrinter({ mode: "declaration" });
1353
- const callPrinter$5 = functionPrinter({ mode: "call" });
1325
+ const callPrinter$2 = functionPrinter({ mode: "call" });
1354
1326
  function buildMutationConfigParamsNode(node) {
1355
1327
  return createFunctionParameters({ params: [createFunctionParameter({
1356
1328
  name: "config",
@@ -1369,7 +1341,7 @@ function MutationOptions({ name, clientName, node, tsResolver, mutationKeyName }
1369
1341
  const hasMutationParams = groupedParam !== null;
1370
1342
  const groupedParamsNode = createFunctionParameters({ params: groupedParam ? [groupedParam] : [] });
1371
1343
  const TRequest = hasMutationParams ? tsResolver.resolveRequestConfigName(node) : "undefined";
1372
- const argBindingStr = hasMutationParams ? callPrinter$5.print(groupedParamsNode) ?? "" : "_";
1344
+ const argBindingStr = hasMutationParams ? callPrinter$2.print(groupedParamsNode) ?? "" : "_";
1373
1345
  const mutationFnBody = `const { data } = await ${buildClientCall(node, {
1374
1346
  clientName,
1375
1347
  signal: false
@@ -1399,7 +1371,7 @@ function MutationOptions({ name, clientName, node, tsResolver, mutationKeyName }
1399
1371
  //#endregion
1400
1372
  //#region src/components/Mutation.tsx
1401
1373
  const declarationPrinter$4 = functionPrinter({ mode: "declaration" });
1402
- const callPrinter$4 = functionPrinter({ mode: "call" });
1374
+ const callPrinter$1 = functionPrinter({ mode: "call" });
1403
1375
  function resolveMutationRequestType(node, resolver) {
1404
1376
  return buildGroupedRequestParam(node, { resolver }) ? resolver.resolveRequestConfigName(node) : "undefined";
1405
1377
  }
@@ -1434,7 +1406,7 @@ function Mutation({ name, mutationOptionsName, node, tsResolver, mutationKeyName
1434
1406
  ].join(", ");
1435
1407
  const returnType = `UseMutationResult<${generics}>`;
1436
1408
  const mutationOptionsConfigNode = buildMutationConfigParamsNode(node);
1437
- const mutationOptionsParamsCall = callPrinter$4.print(mutationOptionsConfigNode) ?? "";
1409
+ const mutationOptionsParamsCall = callPrinter$1.print(mutationOptionsConfigNode) ?? "";
1438
1410
  const paramsNode = buildMutationParamsNode(node, { resolver: tsResolver });
1439
1411
  const paramsSignature = declarationPrinter$4.print(paramsNode) ?? "";
1440
1412
  return /* @__PURE__ */ jsx(File.Source, {
@@ -1466,7 +1438,6 @@ function Mutation({ name, mutationOptionsName, node, tsResolver, mutationKeyName
1466
1438
  //#endregion
1467
1439
  //#region src/components/Query.tsx
1468
1440
  const declarationPrinter$3 = functionPrinter({ mode: "declaration" });
1469
- const callPrinter$3 = functionPrinter({ mode: "call" });
1470
1441
  function buildQueryParamsNode(node, options) {
1471
1442
  const { resolver } = options;
1472
1443
  const successNames = resolveSuccessNames(node, resolver);
@@ -1486,7 +1457,10 @@ function buildQueryParamsNode(node, options) {
1486
1457
  }`,
1487
1458
  default: "{}"
1488
1459
  });
1489
- return createFunctionParameters({ params: [buildGroupedRequestParam(node, { resolver }), optionsParam].filter((param) => param !== null) });
1460
+ return createFunctionParameters({ params: [buildGroupedRequestParam(node, {
1461
+ resolver,
1462
+ memberTypeWrapper: maybeValueOrGetter
1463
+ }), optionsParam].filter((param) => param !== null) });
1490
1464
  }
1491
1465
  function Query({ name, queryKeyTypeName, queryOptionsName, queryKeyName, node, tsResolver, customOptions }) {
1492
1466
  const successNames = resolveSuccessNames(node, tsResolver);
@@ -1499,10 +1473,9 @@ function Query({ name, queryKeyTypeName, queryOptionsName, queryKeyName, node, t
1499
1473
  `TQueryData = ${TData}`,
1500
1474
  `TQueryKey extends QueryKey = ${queryKeyTypeName}`
1501
1475
  ];
1502
- const queryKeyParamsNode = buildQueryKeyParams(node, { resolver: tsResolver });
1503
- const queryKeyParamsCall = callPrinter$3.print(queryKeyParamsNode) ?? "";
1504
- const queryOptionsParamsNode = getQueryOptionsParams(node, { resolver: tsResolver });
1505
- const queryOptionsParamsCall = callPrinter$3.print(queryOptionsParamsNode) ?? "";
1476
+ const resolvedParams = buildResolvedRequestParams(node);
1477
+ const queryKeyArgs = resolvedParams ? "resolvedParams" : "";
1478
+ const queryOptionsArgs = resolvedParams ? "resolvedParams, config" : "config";
1506
1479
  const paramsNode = buildQueryParamsNode(node, { resolver: tsResolver });
1507
1480
  const paramsSignature = declarationPrinter$3.print(paramsNode) ?? "";
1508
1481
  return /* @__PURE__ */ jsx(File.Source, {
@@ -1518,11 +1491,11 @@ function Query({ name, queryKeyTypeName, queryOptionsName, queryKeyName, node, t
1518
1491
  JSDoc: { comments: buildOperationComments(node) },
1519
1492
  children: `
1520
1493
  const { query: queryConfig = {}, client: config = {} } = options ?? {}
1521
- const { client: queryClient, ...resolvedOptions } = queryConfig
1522
- const queryKey = resolvedOptions?.queryKey ?? ${queryKeyName}(${queryKeyParamsCall})${customOptions ? `\n const customOptions = ${customOptions.name}({ hookName: '${name}', operationId: '${node.operationId}' })` : ""}
1494
+ const { client: queryClient, ...resolvedOptions } = queryConfig${resolvedParams ? `\n const resolvedParams = ${resolvedParams}` : ""}
1495
+ const queryKey = resolvedOptions?.queryKey ?? ${queryKeyName}(${queryKeyArgs})${customOptions ? `\n const customOptions = ${customOptions.name}({ hookName: '${name}', operationId: '${node.operationId}' })` : ""}
1523
1496
 
1524
1497
  const queryResult = useQuery({
1525
- ...${queryOptionsName}(${queryOptionsParamsCall}),${customOptions ? "\n ...customOptions," : ""}
1498
+ ...${queryOptionsName}(${queryOptionsArgs}),${customOptions ? "\n ...customOptions," : ""}
1526
1499
  ...resolvedOptions,
1527
1500
  queryKey,
1528
1501
  } as unknown as QueryObserverOptions, queryClient) as ${returnType}
@@ -1537,7 +1510,6 @@ function Query({ name, queryKeyTypeName, queryOptionsName, queryKeyName, node, t
1537
1510
  //#endregion
1538
1511
  //#region src/components/SuspenseInfiniteQuery.tsx
1539
1512
  const declarationPrinter$2 = functionPrinter({ mode: "declaration" });
1540
- const callPrinter$2 = functionPrinter({ mode: "call" });
1541
1513
  function buildSuspenseInfiniteQueryParamsNode(node, options) {
1542
1514
  const { resolver, pageParamGeneric } = options;
1543
1515
  const optionsParam = createFunctionParameter({
@@ -1548,7 +1520,10 @@ function buildSuspenseInfiniteQueryParamsNode(node, options) {
1548
1520
  }`,
1549
1521
  default: "{}"
1550
1522
  });
1551
- return createFunctionParameters({ params: [buildGroupedRequestParam(node, { resolver }), optionsParam].filter((param) => param !== null) });
1523
+ return createFunctionParameters({ params: [buildGroupedRequestParam(node, {
1524
+ resolver,
1525
+ memberTypeWrapper: maybeValueOrGetter
1526
+ }), optionsParam].filter((param) => param !== null) });
1552
1527
  }
1553
1528
  function SuspenseInfiniteQuery({ name, queryKeyTypeName, queryOptionsName, queryKeyName, node, tsResolver, customOptions, initialPageParam, queryParam }) {
1554
1529
  const successNames = resolveSuccessNames(node, tsResolver);
@@ -1576,10 +1551,9 @@ function SuspenseInfiniteQuery({ name, queryKeyTypeName, queryOptionsName, query
1576
1551
  `TQueryKey extends QueryKey = ${queryKeyTypeName}`,
1577
1552
  `TPageParam = ${pageParamType}`
1578
1553
  ];
1579
- const queryKeyParamsNode = buildQueryKeyParams(node, { resolver: tsResolver });
1580
- const queryKeyParamsCall = callPrinter$2.print(queryKeyParamsNode) ?? "";
1581
- const queryOptionsParamsNode = getQueryOptionsParams(node, { resolver: tsResolver });
1582
- const queryOptionsParamsCall = callPrinter$2.print(queryOptionsParamsNode) ?? "";
1554
+ const resolvedParams = buildResolvedRequestParams(node);
1555
+ const queryKeyArgs = resolvedParams ? "resolvedParams" : "";
1556
+ const queryOptionsArgs = resolvedParams ? "resolvedParams, config" : "config";
1583
1557
  const paramsNode = buildSuspenseInfiniteQueryParamsNode(node, {
1584
1558
  resolver: tsResolver,
1585
1559
  pageParamGeneric: "TPageParam"
@@ -1598,11 +1572,11 @@ function SuspenseInfiniteQuery({ name, queryKeyTypeName, queryOptionsName, query
1598
1572
  JSDoc: { comments: buildOperationComments(node) },
1599
1573
  children: `
1600
1574
  const { query: queryConfig = {}, client: config = {} } = options ?? {}
1601
- const { client: queryClient, ...resolvedOptions } = queryConfig
1602
- const queryKey = resolvedOptions?.queryKey ?? ${queryKeyName}(${queryKeyParamsCall})${customOptions ? `\n const customOptions = ${customOptions.name}({ hookName: '${name}', operationId: '${node.operationId}' })` : ""}
1575
+ const { client: queryClient, ...resolvedOptions } = queryConfig${resolvedParams ? `\n const resolvedParams = ${resolvedParams}` : ""}
1576
+ const queryKey = resolvedOptions?.queryKey ?? ${queryKeyName}(${queryKeyArgs})${customOptions ? `\n const customOptions = ${customOptions.name}({ hookName: '${name}', operationId: '${node.operationId}' })` : ""}
1603
1577
 
1604
1578
  const queryResult = useSuspenseInfiniteQuery({
1605
- ...${queryOptionsName}(${queryOptionsParamsCall}),${customOptions ? "\n ...customOptions," : ""}
1579
+ ...${queryOptionsName}(${queryOptionsArgs}),${customOptions ? "\n ...customOptions," : ""}
1606
1580
  ...resolvedOptions,
1607
1581
  queryKey,
1608
1582
  } as unknown as UseSuspenseInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryKey, TPageParam>, queryClient) as ${returnType}
@@ -1617,7 +1591,7 @@ function SuspenseInfiniteQuery({ name, queryKeyTypeName, queryOptionsName, query
1617
1591
  //#endregion
1618
1592
  //#region src/components/SuspenseInfiniteQueryOptions.tsx
1619
1593
  const declarationPrinter$1 = functionPrinter({ mode: "declaration" });
1620
- const callPrinter$1 = functionPrinter({ mode: "call" });
1594
+ const callPrinter = functionPrinter({ mode: "call" });
1621
1595
  function SuspenseInfiniteQueryOptions({ name, clientName, initialPageParam, cursorParam, nextParam, previousParam, node, tsResolver, queryParam, queryKeyName }) {
1622
1596
  const successNames = resolveSuccessNames(node, tsResolver);
1623
1597
  const queryFnDataType = successNames.length > 0 ? successNames.join(" | ") : tsResolver.resolveResponseName(node);
@@ -1643,7 +1617,7 @@ function SuspenseInfiniteQueryOptions({ name, clientName, initialPageParam, curs
1643
1617
  })}
1644
1618
  return data`;
1645
1619
  const queryKeyParamsNode = buildQueryKeyParams(node, { resolver: tsResolver });
1646
- const queryKeyParamsCall = callPrinter$1.print(queryKeyParamsNode) ?? "";
1620
+ const queryKeyParamsCall = callPrinter.print(queryKeyParamsNode) ?? "";
1647
1621
  const hasNewParams = nextParam != null || previousParam != null;
1648
1622
  const [getNextPageParamExpr, getPreviousPageParamExpr] = (() => {
1649
1623
  if (hasNewParams) {
@@ -1708,7 +1682,6 @@ return infiniteQueryOptions<${queryFnDataType}, ${errorType}, InfiniteData<${que
1708
1682
  //#endregion
1709
1683
  //#region src/components/SuspenseQuery.tsx
1710
1684
  const declarationPrinter = functionPrinter({ mode: "declaration" });
1711
- const callPrinter = functionPrinter({ mode: "call" });
1712
1685
  function buildSuspenseQueryParamsNode(node, options) {
1713
1686
  const { resolver } = options;
1714
1687
  const successNames = resolveSuccessNames(node, resolver);
@@ -1727,7 +1700,10 @@ function buildSuspenseQueryParamsNode(node, options) {
1727
1700
  }`,
1728
1701
  default: "{}"
1729
1702
  });
1730
- return createFunctionParameters({ params: [buildGroupedRequestParam(node, { resolver }), optionsParam].filter((param) => param !== null) });
1703
+ return createFunctionParameters({ params: [buildGroupedRequestParam(node, {
1704
+ resolver,
1705
+ memberTypeWrapper: maybeValueOrGetter
1706
+ }), optionsParam].filter((param) => param !== null) });
1731
1707
  }
1732
1708
  function SuspenseQuery({ name, queryKeyTypeName, queryOptionsName, queryKeyName, node, tsResolver, customOptions }) {
1733
1709
  const successNames = resolveSuccessNames(node, tsResolver);
@@ -1736,10 +1712,9 @@ function SuspenseQuery({ name, queryKeyTypeName, queryOptionsName, queryKeyName,
1736
1712
  const TData = responseName;
1737
1713
  const returnType = `UseSuspenseQueryResult<TData, ${`ResponseErrorConfig<${errorNames.length > 0 ? errorNames.join(" | ") : "Error"}>`}> & { queryKey: TQueryKey }`;
1738
1714
  const generics = [`TData = ${TData}`, `TQueryKey extends QueryKey = ${queryKeyTypeName}`];
1739
- const queryKeyParamsNode = buildQueryKeyParams(node, { resolver: tsResolver });
1740
- const queryKeyParamsCall = callPrinter.print(queryKeyParamsNode) ?? "";
1741
- const queryOptionsParamsNode = getQueryOptionsParams(node, { resolver: tsResolver });
1742
- const queryOptionsParamsCall = callPrinter.print(queryOptionsParamsNode) ?? "";
1715
+ const resolvedParams = buildResolvedRequestParams(node);
1716
+ const queryKeyArgs = resolvedParams ? "resolvedParams" : "";
1717
+ const queryOptionsArgs = resolvedParams ? "resolvedParams, config" : "config";
1743
1718
  const paramsNode = buildSuspenseQueryParamsNode(node, { resolver: tsResolver });
1744
1719
  const paramsSignature = declarationPrinter.print(paramsNode) ?? "";
1745
1720
  return /* @__PURE__ */ jsx(File.Source, {
@@ -1755,11 +1730,11 @@ function SuspenseQuery({ name, queryKeyTypeName, queryOptionsName, queryKeyName,
1755
1730
  JSDoc: { comments: buildOperationComments(node) },
1756
1731
  children: `
1757
1732
  const { query: queryConfig = {}, client: config = {} } = options ?? {}
1758
- const { client: queryClient, ...resolvedOptions } = queryConfig
1759
- const queryKey = resolvedOptions?.queryKey ?? ${queryKeyName}(${queryKeyParamsCall})${customOptions ? `\n const customOptions = ${customOptions.name}({ hookName: '${name}', operationId: '${node.operationId}' })` : ""}
1733
+ const { client: queryClient, ...resolvedOptions } = queryConfig${resolvedParams ? `\n const resolvedParams = ${resolvedParams}` : ""}
1734
+ const queryKey = resolvedOptions?.queryKey ?? ${queryKeyName}(${queryKeyArgs})${customOptions ? `\n const customOptions = ${customOptions.name}({ hookName: '${name}', operationId: '${node.operationId}' })` : ""}
1760
1735
 
1761
1736
  const queryResult = useSuspenseQuery({
1762
- ...${queryOptionsName}(${queryOptionsParamsCall}),${customOptions ? "\n ...customOptions," : ""}
1737
+ ...${queryOptionsName}(${queryOptionsArgs}),${customOptions ? "\n ...customOptions," : ""}
1763
1738
  ...resolvedOptions,
1764
1739
  queryKey,
1765
1740
  } as unknown as UseSuspenseQueryOptions, queryClient) as ${returnType}
@@ -1785,7 +1760,7 @@ const infiniteQueryGenerator = defineGenerator({
1785
1760
  operation(node, ctx) {
1786
1761
  if (!ast.isHttpOperationNode(node)) return null;
1787
1762
  const { config, driver, resolver, root } = ctx;
1788
- const { output, query, mutation, infinite, validator, client, group, customOptions } = ctx.options;
1763
+ const { output, query, mutation, infinite, client, group, customOptions, hooks } = ctx.options;
1789
1764
  const pluginTs = driver.getPlugin(pluginTsName);
1790
1765
  if (!pluginTs) return null;
1791
1766
  const tsResolver = driver.getResolver(pluginTsName);
@@ -1835,14 +1810,6 @@ const infiniteQueryGenerator = defineGenerator({
1835
1810
  includeParams: false
1836
1811
  })
1837
1812
  ].filter((name) => Boolean(name));
1838
- const pluginZod = isValidatorEnabled(validator) ? driver.getPlugin(pluginZodName) : null;
1839
- const zodResolver = pluginZod ? driver.getResolver(pluginZodName) : null;
1840
- const fileZod = zodResolver ? zodResolver.resolveFile(operationFileEntry(node, node.operationId), {
1841
- root,
1842
- output: pluginZod?.options?.output ?? output,
1843
- group: pluginZod?.options?.group ?? void 0
1844
- }) : null;
1845
- const zodSchemaNames = resolveZodSchemaNames(node, zodResolver, validator);
1846
1813
  const calledClientName = contractOp.name;
1847
1814
  return /* @__PURE__ */ jsxs(File, {
1848
1815
  baseName: meta.file.baseName,
@@ -1865,11 +1832,6 @@ const infiniteQueryGenerator = defineGenerator({
1865
1832
  }
1866
1833
  }),
1867
1834
  children: [
1868
- fileZod && zodSchemaNames.length > 0 && /* @__PURE__ */ jsx(File.Import, {
1869
- name: zodSchemaNames,
1870
- root: meta.file.path,
1871
- path: fileZod.path
1872
- }),
1873
1835
  /* @__PURE__ */ jsx(File.Import, {
1874
1836
  name: [contractOp.name],
1875
1837
  root: meta.file.path,
@@ -1919,31 +1881,33 @@ const infiniteQueryGenerator = defineGenerator({
1919
1881
  initialPageParam: infiniteOptions.initialPageParam,
1920
1882
  queryParam: infiniteOptions.queryParam
1921
1883
  }),
1922
- /* @__PURE__ */ jsx(File.Import, {
1923
- name: ["useInfiniteQuery"],
1924
- path: importPath
1925
- }),
1926
- /* @__PURE__ */ jsx(File.Import, {
1927
- name: [
1928
- "QueryKey",
1929
- "QueryClient",
1930
- "InfiniteQueryObserverOptions",
1931
- "UseInfiniteQueryResult"
1932
- ],
1933
- path: importPath,
1934
- isTypeOnly: true
1935
- }),
1936
- /* @__PURE__ */ jsx(InfiniteQuery, {
1937
- name: queryName,
1938
- queryOptionsName,
1939
- queryKeyName,
1940
- queryKeyTypeName,
1941
- node,
1942
- tsResolver,
1943
- initialPageParam: infiniteOptions.initialPageParam,
1944
- queryParam: infiniteOptions.queryParam,
1945
- customOptions
1946
- })
1884
+ hooks && /* @__PURE__ */ jsxs(Fragment, { children: [
1885
+ /* @__PURE__ */ jsx(File.Import, {
1886
+ name: ["useInfiniteQuery"],
1887
+ path: importPath
1888
+ }),
1889
+ /* @__PURE__ */ jsx(File.Import, {
1890
+ name: [
1891
+ "QueryKey",
1892
+ "QueryClient",
1893
+ "InfiniteQueryObserverOptions",
1894
+ "UseInfiniteQueryResult"
1895
+ ],
1896
+ path: importPath,
1897
+ isTypeOnly: true
1898
+ }),
1899
+ /* @__PURE__ */ jsx(InfiniteQuery, {
1900
+ name: queryName,
1901
+ queryOptionsName,
1902
+ queryKeyName,
1903
+ queryKeyTypeName,
1904
+ node,
1905
+ tsResolver,
1906
+ initialPageParam: infiniteOptions.initialPageParam,
1907
+ queryParam: infiniteOptions.queryParam,
1908
+ customOptions
1909
+ })
1910
+ ] })
1947
1911
  ]
1948
1912
  });
1949
1913
  }
@@ -1961,7 +1925,7 @@ const mutationGenerator = defineGenerator({
1961
1925
  operation(node, ctx) {
1962
1926
  if (!ast.isHttpOperationNode(node)) return null;
1963
1927
  const { config, driver, resolver, root } = ctx;
1964
- const { output, query, mutation, validator, client, group, customOptions } = ctx.options;
1928
+ const { output, query, mutation, client, group, customOptions, hooks } = ctx.options;
1965
1929
  const pluginTs = driver.getPlugin(pluginTsName);
1966
1930
  if (!pluginTs) return null;
1967
1931
  const tsResolver = driver.getResolver(pluginTsName);
@@ -1997,14 +1961,6 @@ const mutationGenerator = defineGenerator({
1997
1961
  order: "body-response-first",
1998
1962
  includeParams: false
1999
1963
  })].filter((name) => Boolean(name));
2000
- const pluginZod = isValidatorEnabled(validator) ? driver.getPlugin(pluginZodName) : null;
2001
- const zodResolver = pluginZod ? driver.getResolver(pluginZodName) : null;
2002
- const fileZod = zodResolver ? zodResolver.resolveFile(operationFileEntry(node, node.operationId), {
2003
- root,
2004
- output: pluginZod?.options?.output ?? output,
2005
- group: pluginZod?.options?.group ?? void 0
2006
- }) : null;
2007
- const zodSchemaNames = resolveZodSchemaNames(node, zodResolver, validator);
2008
1964
  const calledClientName = contractOp.name;
2009
1965
  return /* @__PURE__ */ jsxs(File, {
2010
1966
  baseName: meta.file.baseName,
@@ -2027,11 +1983,6 @@ const mutationGenerator = defineGenerator({
2027
1983
  }
2028
1984
  }),
2029
1985
  children: [
2030
- fileZod && zodSchemaNames.length > 0 && /* @__PURE__ */ jsx(File.Import, {
2031
- name: zodSchemaNames,
2032
- root: meta.file.path,
2033
- path: fileZod.path
2034
- }),
2035
1986
  /* @__PURE__ */ jsx(File.Import, {
2036
1987
  name: [contractOp.name],
2037
1988
  root: meta.file.path,
@@ -2069,7 +2020,7 @@ const mutationGenerator = defineGenerator({
2069
2020
  node,
2070
2021
  tsResolver
2071
2022
  }),
2072
- mutation && /* @__PURE__ */ jsxs(Fragment, { children: [
2023
+ mutation && hooks && /* @__PURE__ */ jsxs(Fragment, { children: [
2073
2024
  /* @__PURE__ */ jsx(File.Import, {
2074
2025
  name: ["useMutation"],
2075
2026
  path: importPath
@@ -2110,7 +2061,7 @@ const queryGenerator = defineGenerator({
2110
2061
  operation(node, ctx) {
2111
2062
  if (!ast.isHttpOperationNode(node)) return null;
2112
2063
  const { config, driver, resolver, root } = ctx;
2113
- const { output, query, mutation, validator, client, group, customOptions } = ctx.options;
2064
+ const { output, query, mutation, client, group, customOptions, hooks } = ctx.options;
2114
2065
  const pluginTs = driver.getPlugin(pluginTsName);
2115
2066
  if (!pluginTs) return null;
2116
2067
  const tsResolver = driver.getResolver(pluginTsName);
@@ -2148,14 +2099,6 @@ const queryGenerator = defineGenerator({
2148
2099
  order: "body-response-first",
2149
2100
  includeParams: false
2150
2101
  })].filter((name) => Boolean(name));
2151
- const pluginZod = isValidatorEnabled(validator) ? driver.getPlugin(pluginZodName) : null;
2152
- const zodResolver = pluginZod ? driver.getResolver(pluginZodName) : null;
2153
- const fileZod = zodResolver ? zodResolver.resolveFile(operationFileEntry(node, node.operationId), {
2154
- root,
2155
- output: pluginZod?.options?.output ?? output,
2156
- group: pluginZod?.options?.group ?? void 0
2157
- }) : null;
2158
- const zodSchemaNames = resolveZodSchemaNames(node, zodResolver, validator);
2159
2102
  const calledClientName = contractOp.name;
2160
2103
  return /* @__PURE__ */ jsxs(File, {
2161
2104
  baseName: meta.file.baseName,
@@ -2178,11 +2121,6 @@ const queryGenerator = defineGenerator({
2178
2121
  }
2179
2122
  }),
2180
2123
  children: [
2181
- fileZod && zodSchemaNames.length > 0 && /* @__PURE__ */ jsx(File.Import, {
2182
- name: zodSchemaNames,
2183
- root: meta.file.path,
2184
- path: fileZod.path
2185
- }),
2186
2124
  /* @__PURE__ */ jsx(File.Import, {
2187
2125
  name: [contractOp.name],
2188
2126
  root: meta.file.path,
@@ -2222,7 +2160,7 @@ const queryGenerator = defineGenerator({
2222
2160
  node,
2223
2161
  tsResolver
2224
2162
  }),
2225
- query && /* @__PURE__ */ jsxs(Fragment, { children: [
2163
+ query && hooks && /* @__PURE__ */ jsxs(Fragment, { children: [
2226
2164
  /* @__PURE__ */ jsx(File.Import, {
2227
2165
  name: ["useQuery"],
2228
2166
  path: importPath
@@ -2256,7 +2194,7 @@ const queryGenerator = defineGenerator({
2256
2194
  /**
2257
2195
  * Built-in generator for `useSuspenseInfiniteQuery` hooks. Enabled when both
2258
2196
  * `suspense` and `infinite` are configured. Combines suspense semantics with
2259
- * cursor-based pagination — handlers throw promises while loading and pull
2197
+ * cursor-based pagination. Handlers throw promises while loading and pull
2260
2198
  * additional pages on demand.
2261
2199
  */
2262
2200
  const suspenseInfiniteQueryGenerator = defineGenerator({
@@ -2265,7 +2203,7 @@ const suspenseInfiniteQueryGenerator = defineGenerator({
2265
2203
  operation(node, ctx) {
2266
2204
  if (!ast.isHttpOperationNode(node)) return null;
2267
2205
  const { config, driver, resolver, root } = ctx;
2268
- const { output, query, mutation, infinite, suspense, validator, client, group, customOptions } = ctx.options;
2206
+ const { output, query, mutation, infinite, suspense, client, group, customOptions, hooks } = ctx.options;
2269
2207
  const pluginTs = driver.getPlugin(pluginTsName);
2270
2208
  if (!pluginTs) return null;
2271
2209
  const tsResolver = driver.getResolver(pluginTsName);
@@ -2315,14 +2253,6 @@ const suspenseInfiniteQueryGenerator = defineGenerator({
2315
2253
  includeParams: false
2316
2254
  })
2317
2255
  ].filter((name) => Boolean(name));
2318
- const pluginZod = isValidatorEnabled(validator) ? driver.getPlugin(pluginZodName) : null;
2319
- const zodResolver = pluginZod ? driver.getResolver(pluginZodName) : null;
2320
- const fileZod = zodResolver ? zodResolver.resolveFile(operationFileEntry(node, node.operationId), {
2321
- root,
2322
- output: pluginZod?.options?.output ?? output,
2323
- group: pluginZod?.options?.group ?? void 0
2324
- }) : null;
2325
- const zodSchemaNames = resolveZodSchemaNames(node, zodResolver, validator);
2326
2256
  const calledClientName = contractOp.name;
2327
2257
  return /* @__PURE__ */ jsxs(File, {
2328
2258
  baseName: meta.file.baseName,
@@ -2345,11 +2275,6 @@ const suspenseInfiniteQueryGenerator = defineGenerator({
2345
2275
  }
2346
2276
  }),
2347
2277
  children: [
2348
- fileZod && zodSchemaNames.length > 0 && /* @__PURE__ */ jsx(File.Import, {
2349
- name: zodSchemaNames,
2350
- root: meta.file.path,
2351
- path: fileZod.path
2352
- }),
2353
2278
  /* @__PURE__ */ jsx(File.Import, {
2354
2279
  name: [contractOp.name],
2355
2280
  root: meta.file.path,
@@ -2399,31 +2324,33 @@ const suspenseInfiniteQueryGenerator = defineGenerator({
2399
2324
  initialPageParam: infiniteOptions.initialPageParam,
2400
2325
  queryParam: infiniteOptions.queryParam
2401
2326
  }),
2402
- /* @__PURE__ */ jsx(File.Import, {
2403
- name: ["useSuspenseInfiniteQuery"],
2404
- path: importPath
2405
- }),
2406
- /* @__PURE__ */ jsx(File.Import, {
2407
- name: [
2408
- "QueryKey",
2409
- "QueryClient",
2410
- "UseSuspenseInfiniteQueryOptions",
2411
- "UseSuspenseInfiniteQueryResult"
2412
- ],
2413
- path: importPath,
2414
- isTypeOnly: true
2415
- }),
2416
- /* @__PURE__ */ jsx(SuspenseInfiniteQuery, {
2417
- name: queryName,
2418
- queryOptionsName,
2419
- queryKeyName,
2420
- queryKeyTypeName,
2421
- node,
2422
- tsResolver,
2423
- initialPageParam: infiniteOptions.initialPageParam,
2424
- queryParam: infiniteOptions.queryParam,
2425
- customOptions
2426
- })
2327
+ hooks && /* @__PURE__ */ jsxs(Fragment, { children: [
2328
+ /* @__PURE__ */ jsx(File.Import, {
2329
+ name: ["useSuspenseInfiniteQuery"],
2330
+ path: importPath
2331
+ }),
2332
+ /* @__PURE__ */ jsx(File.Import, {
2333
+ name: [
2334
+ "QueryKey",
2335
+ "QueryClient",
2336
+ "UseSuspenseInfiniteQueryOptions",
2337
+ "UseSuspenseInfiniteQueryResult"
2338
+ ],
2339
+ path: importPath,
2340
+ isTypeOnly: true
2341
+ }),
2342
+ /* @__PURE__ */ jsx(SuspenseInfiniteQuery, {
2343
+ name: queryName,
2344
+ queryOptionsName,
2345
+ queryKeyName,
2346
+ queryKeyTypeName,
2347
+ node,
2348
+ tsResolver,
2349
+ initialPageParam: infiniteOptions.initialPageParam,
2350
+ queryParam: infiniteOptions.queryParam,
2351
+ customOptions
2352
+ })
2353
+ ] })
2427
2354
  ]
2428
2355
  });
2429
2356
  }
@@ -2442,7 +2369,7 @@ const suspenseQueryGenerator = defineGenerator({
2442
2369
  operation(node, ctx) {
2443
2370
  if (!ast.isHttpOperationNode(node)) return null;
2444
2371
  const { config, driver, resolver, root } = ctx;
2445
- const { output, query, mutation, suspense, validator, client, group, customOptions } = ctx.options;
2372
+ const { output, query, mutation, suspense, client, group, customOptions, hooks } = ctx.options;
2446
2373
  const pluginTs = driver.getPlugin(pluginTsName);
2447
2374
  if (!pluginTs) return null;
2448
2375
  const tsResolver = driver.getResolver(pluginTsName);
@@ -2480,14 +2407,6 @@ const suspenseQueryGenerator = defineGenerator({
2480
2407
  order: "body-response-first",
2481
2408
  includeParams: false
2482
2409
  })].filter((name) => Boolean(name));
2483
- const pluginZod = isValidatorEnabled(validator) ? driver.getPlugin(pluginZodName) : null;
2484
- const zodResolver = pluginZod ? driver.getResolver(pluginZodName) : null;
2485
- const fileZod = zodResolver ? zodResolver.resolveFile(operationFileEntry(node, node.operationId), {
2486
- root,
2487
- output: pluginZod?.options?.output ?? output,
2488
- group: pluginZod?.options?.group ?? void 0
2489
- }) : null;
2490
- const zodSchemaNames = resolveZodSchemaNames(node, zodResolver, validator);
2491
2410
  const calledClientName = contractOp.name;
2492
2411
  return /* @__PURE__ */ jsxs(File, {
2493
2412
  baseName: meta.file.baseName,
@@ -2510,11 +2429,6 @@ const suspenseQueryGenerator = defineGenerator({
2510
2429
  }
2511
2430
  }),
2512
2431
  children: [
2513
- fileZod && zodSchemaNames.length > 0 && /* @__PURE__ */ jsx(File.Import, {
2514
- name: zodSchemaNames,
2515
- root: meta.file.path,
2516
- path: fileZod.path
2517
- }),
2518
2432
  /* @__PURE__ */ jsx(File.Import, {
2519
2433
  name: [contractOp.name],
2520
2434
  root: meta.file.path,
@@ -2554,7 +2468,7 @@ const suspenseQueryGenerator = defineGenerator({
2554
2468
  node,
2555
2469
  tsResolver
2556
2470
  }),
2557
- suspense && /* @__PURE__ */ jsxs(Fragment, { children: [
2471
+ suspense && hooks && /* @__PURE__ */ jsxs(Fragment, { children: [
2558
2472
  /* @__PURE__ */ jsx(File.Import, {
2559
2473
  name: ["useSuspenseQuery"],
2560
2474
  path: importPath
@@ -2707,8 +2621,8 @@ const resolverReactQuery = defineResolver(() => ({
2707
2621
  const pluginReactQueryName = "plugin-react-query";
2708
2622
  /**
2709
2623
  * Generates one TanStack Query hook per OpenAPI operation for React. Queries
2710
- * become `useFooQuery`/`useFooSuspenseQuery`/`useFooInfiniteQuery`; mutations
2711
- * become `useFooMutation`. Each hook is fully typed: query keys, input
2624
+ * become `useFoo`, with `useFooSuspense` and `useFooInfinite` variants.
2625
+ * Mutations become `useFoo`. Each hook is fully typed: query keys, input
2712
2626
  * variables, response data, and error shape all come from the spec.
2713
2627
  *
2714
2628
  * @example
@@ -2734,7 +2648,7 @@ const pluginReactQuery = definePlugin((options) => {
2734
2648
  const { output = {
2735
2649
  path: "hooks",
2736
2650
  barrel: { type: "named" }
2737
- }, group, exclude = [], include, override = [], validator = false, suspense = {}, infinite = false, mutation = {}, query = {}, mutationKey = mutationKeyTransformer, queryKey = queryKeyTransformer, customOptions, client, resolver: userResolver, macros: userMacros } = options;
2651
+ }, group, exclude = [], include, override = [], suspense = {}, infinite = false, mutation = {}, query = {}, mutationKey = mutationKeyTransformer, queryKey = queryKeyTransformer, customOptions, hooks = false, client, resolver: userResolver, macros: userMacros } = options;
2738
2652
  const selectedGenerators = [
2739
2653
  queryGenerator,
2740
2654
  suspenseQueryGenerator,
@@ -2748,7 +2662,7 @@ const pluginReactQuery = definePlugin((options) => {
2748
2662
  return {
2749
2663
  name: pluginReactQueryName,
2750
2664
  options,
2751
- dependencies: [pluginTsName, isValidatorEnabled(validator) ? pluginZodName : void 0].filter((dependency) => Boolean(dependency)),
2665
+ dependencies: [pluginTsName],
2752
2666
  hooks: { "kubb:plugin:setup"(ctx) {
2753
2667
  const resolver = userResolver ? {
2754
2668
  ...resolverReactQuery,
@@ -2796,7 +2710,7 @@ const pluginReactQuery = definePlugin((options) => {
2796
2710
  name: "useCustomHookOptions",
2797
2711
  ...customOptions
2798
2712
  } : null,
2799
- validator,
2713
+ hooks,
2800
2714
  group: groupConfig,
2801
2715
  exclude,
2802
2716
  include,