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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -665,12 +665,15 @@ function MutationKey({ name, node, transformer }) {
665
665
  * The grouped request options, ordered for both the destructured signature and the
666
666
  * call passed to the underlying client.
667
667
  */
668
- const requestGroupOrder = [
668
+ const requestGroupOrder$1 = [
669
669
  "path",
670
670
  "query",
671
671
  "body",
672
672
  "headers"
673
673
  ];
674
+ function maybeValueOrGetter(type) {
675
+ return `${type} | (() => ${type})`;
676
+ }
674
677
  /**
675
678
  * Builds the grouped `{ path, query, body, headers }` parameter that mirrors the client
676
679
  * function signature. Only the groups the operation carries are emitted, typed from the
@@ -683,7 +686,7 @@ const requestGroupOrder = [
683
686
  * `MaybeRefOrGetter` per group.
684
687
  */
685
688
  function buildGroupedRequestParam(node, options) {
686
- const { resolver, keys = requestGroupOrder, memberTypeWrapper } = options;
689
+ const { resolver, keys = requestGroupOrder$1, memberTypeWrapper } = options;
687
690
  const { groups, hasRequiredPath, hasRequiredQuery, hasRequiredHeader } = getRequestGroupOptionality(node);
688
691
  const names = keys.filter((key) => groups[key]);
689
692
  if (names.length === 0) return null;
@@ -695,7 +698,7 @@ function buildGroupedRequestParam(node, options) {
695
698
  };
696
699
  const isOptional = names.every((name) => !requiredByGroup[name]);
697
700
  const requestConfigName = resolver.resolveRequestConfigName(node);
698
- const omittedKeys = requestGroupOrder.filter((key) => !keys.includes(key));
701
+ const omittedKeys = requestGroupOrder$1.filter((key) => !keys.includes(key));
699
702
  const requestConfigType = omittedKeys.length > 0 ? `Omit<${requestConfigName}, ${omittedKeys.map((key) => `'${key}'`).join(" | ")}>` : requestConfigName;
700
703
  if (memberTypeWrapper) {
701
704
  const members = names.map((name) => ({
@@ -751,7 +754,7 @@ function buildClientCall(node, options) {
751
754
  const { groups } = getRequestGroupOptionality(node);
752
755
  return `${clientName}({ ${[
753
756
  "...config",
754
- ...requestGroupOrder.filter((key) => groups[key]),
757
+ ...requestGroupOrder$1.filter((key) => groups[key]),
755
758
  signal ? "signal: config.signal ?? signal" : null,
756
759
  "throwOnError: true"
757
760
  ].filter((part) => part !== null).join(", ")} })`;
@@ -978,6 +981,30 @@ const customHookOptionsFileGenerator = defineGenerator({
978
981
  }
979
982
  });
980
983
  //#endregion
984
+ //#region src/utils.ts
985
+ const requestGroupOrder = [
986
+ "path",
987
+ "query",
988
+ "body",
989
+ "headers"
990
+ ];
991
+ /**
992
+ * Builds the object literal that resolves each request group to a concrete value, unwrapping a getter
993
+ * once before the value reaches the plain `queryKey`/`queryOptions` helpers. A getter must never reach a
994
+ * React Query key, which is hashed structurally. Returns `null` when the operation carries no request group.
995
+ *
996
+ * @example
997
+ * ```ts
998
+ * buildResolvedRequestParams(node) // { path: typeof path === 'function' ? path() : path }
999
+ * ```
1000
+ */
1001
+ function buildResolvedRequestParams(node) {
1002
+ const groups = getRequestGroups(node);
1003
+ const names = requestGroupOrder.filter((key) => groups[key]);
1004
+ if (names.length === 0) return null;
1005
+ return `{ ${names.map((name) => `${name}: typeof ${name} === 'function' ? ${name}() : ${name}`).join(", ")} }`;
1006
+ }
1007
+ //#endregion
981
1008
  //#region src/generators/hookOptionsGenerator.tsx
982
1009
  /**
983
1010
  * Emits the `HookOptions` type used by `customOptions`. Enabled when
@@ -990,8 +1017,8 @@ const hookOptionsGenerator = defineGenerator({
990
1017
  renderer: jsxRenderer,
991
1018
  operations(nodes, ctx) {
992
1019
  const { resolver, config, root } = ctx;
993
- const { output, customOptions, query, mutation, suspense, infinite, group, override } = ctx.options;
994
- if (!customOptions) return null;
1020
+ const { output, customOptions, query, mutation, suspense, infinite, group, override, hooks } = ctx.options;
1021
+ if (!customOptions || !hooks) return null;
995
1022
  const name = resolver.resolveHookOptionsName();
996
1023
  const resolvedFile = resolver.resolveFile({
997
1024
  name,
@@ -1135,51 +1162,8 @@ const hookOptionsGenerator = defineGenerator({
1135
1162
  }
1136
1163
  });
1137
1164
  //#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
1165
  //#region src/components/InfiniteQuery.tsx
1181
- const declarationPrinter$7 = functionPrinter({ mode: "declaration" });
1182
- const callPrinter$7 = functionPrinter({ mode: "call" });
1166
+ const declarationPrinter$8 = functionPrinter({ mode: "declaration" });
1183
1167
  function buildInfiniteQueryParamsNode(node, options) {
1184
1168
  const { resolver, pageParamGeneric } = options;
1185
1169
  const optionsParam = createFunctionParameter({
@@ -1190,7 +1174,10 @@ function buildInfiniteQueryParamsNode(node, options) {
1190
1174
  }`,
1191
1175
  default: "{}"
1192
1176
  });
1193
- return createFunctionParameters({ params: [buildGroupedRequestParam(node, { resolver }), optionsParam].filter((param) => param !== null) });
1177
+ return createFunctionParameters({ params: [buildGroupedRequestParam(node, {
1178
+ resolver,
1179
+ memberTypeWrapper: maybeValueOrGetter
1180
+ }), optionsParam].filter((param) => param !== null) });
1194
1181
  }
1195
1182
  function InfiniteQuery({ name, queryKeyTypeName, queryOptionsName, queryKeyName, node, tsResolver, initialPageParam, queryParam, customOptions }) {
1196
1183
  const successNames = resolveSuccessNames(node, tsResolver);
@@ -1218,15 +1205,14 @@ function InfiniteQuery({ name, queryKeyTypeName, queryOptionsName, queryKeyName,
1218
1205
  `TQueryKey extends QueryKey = ${queryKeyTypeName}`,
1219
1206
  `TPageParam = ${pageParamType}`
1220
1207
  ];
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) ?? "";
1208
+ const resolvedParams = buildResolvedRequestParams(node);
1209
+ const queryKeyArgs = resolvedParams ? "resolvedParams" : "";
1210
+ const queryOptionsArgs = resolvedParams ? "resolvedParams, config" : "config";
1225
1211
  const paramsNode = buildInfiniteQueryParamsNode(node, {
1226
1212
  resolver: tsResolver,
1227
1213
  pageParamGeneric: "TPageParam"
1228
1214
  });
1229
- const paramsSignature = declarationPrinter$7.print(paramsNode) ?? "";
1215
+ const paramsSignature = declarationPrinter$8.print(paramsNode) ?? "";
1230
1216
  return /* @__PURE__ */ jsx(File.Source, {
1231
1217
  name,
1232
1218
  isExportable: true,
@@ -1240,11 +1226,11 @@ function InfiniteQuery({ name, queryKeyTypeName, queryOptionsName, queryKeyName,
1240
1226
  JSDoc: { comments: buildOperationComments(node) },
1241
1227
  children: `
1242
1228
  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}' })` : ""}
1229
+ const { client: queryClient, ...resolvedOptions } = queryConfig${resolvedParams ? `\n const resolvedParams = ${resolvedParams}` : ""}
1230
+ const queryKey = resolvedOptions?.queryKey ?? ${queryKeyName}(${queryKeyArgs})${customOptions ? `\n const customOptions = ${customOptions.name}({ hookName: '${name}', operationId: '${node.operationId}' })` : ""}
1245
1231
 
1246
1232
  const queryResult = useInfiniteQuery({
1247
- ...${queryOptionsName}(${queryOptionsParamsCall}),${customOptions ? "\n ...customOptions," : ""}
1233
+ ...${queryOptionsName}(${queryOptionsArgs}),${customOptions ? "\n ...customOptions," : ""}
1248
1234
  ...resolvedOptions,
1249
1235
  queryKey,
1250
1236
  } as unknown as InfiniteQueryObserverOptions<TQueryFnData, TError, TData, TQueryKey, TPageParam>, queryClient) as ${returnType}
@@ -1257,9 +1243,51 @@ function InfiniteQuery({ name, queryKeyTypeName, queryOptionsName, queryKeyName,
1257
1243
  });
1258
1244
  }
1259
1245
  //#endregion
1246
+ //#region src/components/QueryOptions.tsx
1247
+ const declarationPrinter$7 = functionPrinter({ mode: "declaration" });
1248
+ const callPrinter$4 = functionPrinter({ mode: "call" });
1249
+ function getQueryOptionsParams(node, options) {
1250
+ return buildQueryOptionsParams(node, options);
1251
+ }
1252
+ function QueryOptions({ name, clientName, node, tsResolver, queryKeyName }) {
1253
+ const successNames = resolveSuccessNames(node, tsResolver);
1254
+ const responseName = successNames.length > 0 ? successNames.join(" | ") : tsResolver.resolveResponseName(node);
1255
+ const errorNames = resolveErrorNames(node, tsResolver);
1256
+ const TData = responseName;
1257
+ const TError = `ResponseErrorConfig<${errorNames.length > 0 ? errorNames.join(" | ") : "Error"}>`;
1258
+ const queryKeyParamsNode = buildQueryKeyParams(node, { resolver: tsResolver });
1259
+ const queryKeyParamsCall = callPrinter$4.print(queryKeyParamsNode) ?? "";
1260
+ const paramsNode = getQueryOptionsParams(node, { resolver: tsResolver });
1261
+ const paramsSignature = declarationPrinter$7.print(paramsNode) ?? "";
1262
+ const queryFnBody = `const { data } = await ${buildClientCall(node, {
1263
+ clientName,
1264
+ signal: true
1265
+ })}
1266
+ return data`;
1267
+ return /* @__PURE__ */ jsx(File.Source, {
1268
+ name,
1269
+ isExportable: true,
1270
+ isIndexable: true,
1271
+ children: /* @__PURE__ */ jsx(Function, {
1272
+ name,
1273
+ export: true,
1274
+ params: paramsSignature,
1275
+ children: `
1276
+ const queryKey = ${queryKeyName}(${queryKeyParamsCall})
1277
+ return queryOptions<${TData}, ${TError}, ${TData}, typeof queryKey>({
1278
+ queryKey,
1279
+ queryFn: async ({ signal }) => {
1280
+ ${queryFnBody}
1281
+ },
1282
+ })
1283
+ `
1284
+ })
1285
+ });
1286
+ }
1287
+ //#endregion
1260
1288
  //#region src/components/InfiniteQueryOptions.tsx
1261
1289
  const declarationPrinter$6 = functionPrinter({ mode: "declaration" });
1262
- const callPrinter$6 = functionPrinter({ mode: "call" });
1290
+ const callPrinter$3 = functionPrinter({ mode: "call" });
1263
1291
  function InfiniteQueryOptions({ name, clientName, initialPageParam, cursorParam, nextParam, previousParam, node, tsResolver, queryParam, queryKeyName }) {
1264
1292
  const successNames = resolveSuccessNames(node, tsResolver);
1265
1293
  const queryFnDataType = successNames.length > 0 ? successNames.join(" | ") : tsResolver.resolveResponseName(node);
@@ -1278,7 +1306,7 @@ function InfiniteQueryOptions({ name, clientName, initialPageParam, cursorParam,
1278
1306
  const queryParamType = queryParam && queryParamsTypeName ? `${queryParamsTypeName}['${queryParam}']` : null;
1279
1307
  const pageParamType = queryParamType ? isInitialPageParamDefined ? `NonNullable<${queryParamType}>` : queryParamType : fallbackPageParamType;
1280
1308
  const queryKeyParamsNode = buildQueryKeyParams(node, { resolver: tsResolver });
1281
- const queryKeyParamsCall = callPrinter$6.print(queryKeyParamsNode) ?? "";
1309
+ const queryKeyParamsCall = callPrinter$3.print(queryKeyParamsNode) ?? "";
1282
1310
  const paramsNode = getQueryOptionsParams(node, { resolver: tsResolver });
1283
1311
  const paramsSignature = declarationPrinter$6.print(paramsNode) ?? "";
1284
1312
  const queryFnBody = `const { data } = await ${buildClientCall(node, {
@@ -1350,7 +1378,7 @@ return infiniteQueryOptions<${queryFnDataType}, ${errorType}, InfiniteData<${que
1350
1378
  //#endregion
1351
1379
  //#region src/components/MutationOptions.tsx
1352
1380
  const declarationPrinter$5 = functionPrinter({ mode: "declaration" });
1353
- const callPrinter$5 = functionPrinter({ mode: "call" });
1381
+ const callPrinter$2 = functionPrinter({ mode: "call" });
1354
1382
  function buildMutationConfigParamsNode(node) {
1355
1383
  return createFunctionParameters({ params: [createFunctionParameter({
1356
1384
  name: "config",
@@ -1369,7 +1397,7 @@ function MutationOptions({ name, clientName, node, tsResolver, mutationKeyName }
1369
1397
  const hasMutationParams = groupedParam !== null;
1370
1398
  const groupedParamsNode = createFunctionParameters({ params: groupedParam ? [groupedParam] : [] });
1371
1399
  const TRequest = hasMutationParams ? tsResolver.resolveRequestConfigName(node) : "undefined";
1372
- const argBindingStr = hasMutationParams ? callPrinter$5.print(groupedParamsNode) ?? "" : "_";
1400
+ const argBindingStr = hasMutationParams ? callPrinter$2.print(groupedParamsNode) ?? "" : "_";
1373
1401
  const mutationFnBody = `const { data } = await ${buildClientCall(node, {
1374
1402
  clientName,
1375
1403
  signal: false
@@ -1399,7 +1427,7 @@ function MutationOptions({ name, clientName, node, tsResolver, mutationKeyName }
1399
1427
  //#endregion
1400
1428
  //#region src/components/Mutation.tsx
1401
1429
  const declarationPrinter$4 = functionPrinter({ mode: "declaration" });
1402
- const callPrinter$4 = functionPrinter({ mode: "call" });
1430
+ const callPrinter$1 = functionPrinter({ mode: "call" });
1403
1431
  function resolveMutationRequestType(node, resolver) {
1404
1432
  return buildGroupedRequestParam(node, { resolver }) ? resolver.resolveRequestConfigName(node) : "undefined";
1405
1433
  }
@@ -1434,7 +1462,7 @@ function Mutation({ name, mutationOptionsName, node, tsResolver, mutationKeyName
1434
1462
  ].join(", ");
1435
1463
  const returnType = `UseMutationResult<${generics}>`;
1436
1464
  const mutationOptionsConfigNode = buildMutationConfigParamsNode(node);
1437
- const mutationOptionsParamsCall = callPrinter$4.print(mutationOptionsConfigNode) ?? "";
1465
+ const mutationOptionsParamsCall = callPrinter$1.print(mutationOptionsConfigNode) ?? "";
1438
1466
  const paramsNode = buildMutationParamsNode(node, { resolver: tsResolver });
1439
1467
  const paramsSignature = declarationPrinter$4.print(paramsNode) ?? "";
1440
1468
  return /* @__PURE__ */ jsx(File.Source, {
@@ -1466,7 +1494,6 @@ function Mutation({ name, mutationOptionsName, node, tsResolver, mutationKeyName
1466
1494
  //#endregion
1467
1495
  //#region src/components/Query.tsx
1468
1496
  const declarationPrinter$3 = functionPrinter({ mode: "declaration" });
1469
- const callPrinter$3 = functionPrinter({ mode: "call" });
1470
1497
  function buildQueryParamsNode(node, options) {
1471
1498
  const { resolver } = options;
1472
1499
  const successNames = resolveSuccessNames(node, resolver);
@@ -1486,7 +1513,10 @@ function buildQueryParamsNode(node, options) {
1486
1513
  }`,
1487
1514
  default: "{}"
1488
1515
  });
1489
- return createFunctionParameters({ params: [buildGroupedRequestParam(node, { resolver }), optionsParam].filter((param) => param !== null) });
1516
+ return createFunctionParameters({ params: [buildGroupedRequestParam(node, {
1517
+ resolver,
1518
+ memberTypeWrapper: maybeValueOrGetter
1519
+ }), optionsParam].filter((param) => param !== null) });
1490
1520
  }
1491
1521
  function Query({ name, queryKeyTypeName, queryOptionsName, queryKeyName, node, tsResolver, customOptions }) {
1492
1522
  const successNames = resolveSuccessNames(node, tsResolver);
@@ -1499,10 +1529,9 @@ function Query({ name, queryKeyTypeName, queryOptionsName, queryKeyName, node, t
1499
1529
  `TQueryData = ${TData}`,
1500
1530
  `TQueryKey extends QueryKey = ${queryKeyTypeName}`
1501
1531
  ];
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) ?? "";
1532
+ const resolvedParams = buildResolvedRequestParams(node);
1533
+ const queryKeyArgs = resolvedParams ? "resolvedParams" : "";
1534
+ const queryOptionsArgs = resolvedParams ? "resolvedParams, config" : "config";
1506
1535
  const paramsNode = buildQueryParamsNode(node, { resolver: tsResolver });
1507
1536
  const paramsSignature = declarationPrinter$3.print(paramsNode) ?? "";
1508
1537
  return /* @__PURE__ */ jsx(File.Source, {
@@ -1518,11 +1547,11 @@ function Query({ name, queryKeyTypeName, queryOptionsName, queryKeyName, node, t
1518
1547
  JSDoc: { comments: buildOperationComments(node) },
1519
1548
  children: `
1520
1549
  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}' })` : ""}
1550
+ const { client: queryClient, ...resolvedOptions } = queryConfig${resolvedParams ? `\n const resolvedParams = ${resolvedParams}` : ""}
1551
+ const queryKey = resolvedOptions?.queryKey ?? ${queryKeyName}(${queryKeyArgs})${customOptions ? `\n const customOptions = ${customOptions.name}({ hookName: '${name}', operationId: '${node.operationId}' })` : ""}
1523
1552
 
1524
1553
  const queryResult = useQuery({
1525
- ...${queryOptionsName}(${queryOptionsParamsCall}),${customOptions ? "\n ...customOptions," : ""}
1554
+ ...${queryOptionsName}(${queryOptionsArgs}),${customOptions ? "\n ...customOptions," : ""}
1526
1555
  ...resolvedOptions,
1527
1556
  queryKey,
1528
1557
  } as unknown as QueryObserverOptions, queryClient) as ${returnType}
@@ -1537,7 +1566,6 @@ function Query({ name, queryKeyTypeName, queryOptionsName, queryKeyName, node, t
1537
1566
  //#endregion
1538
1567
  //#region src/components/SuspenseInfiniteQuery.tsx
1539
1568
  const declarationPrinter$2 = functionPrinter({ mode: "declaration" });
1540
- const callPrinter$2 = functionPrinter({ mode: "call" });
1541
1569
  function buildSuspenseInfiniteQueryParamsNode(node, options) {
1542
1570
  const { resolver, pageParamGeneric } = options;
1543
1571
  const optionsParam = createFunctionParameter({
@@ -1548,7 +1576,10 @@ function buildSuspenseInfiniteQueryParamsNode(node, options) {
1548
1576
  }`,
1549
1577
  default: "{}"
1550
1578
  });
1551
- return createFunctionParameters({ params: [buildGroupedRequestParam(node, { resolver }), optionsParam].filter((param) => param !== null) });
1579
+ return createFunctionParameters({ params: [buildGroupedRequestParam(node, {
1580
+ resolver,
1581
+ memberTypeWrapper: maybeValueOrGetter
1582
+ }), optionsParam].filter((param) => param !== null) });
1552
1583
  }
1553
1584
  function SuspenseInfiniteQuery({ name, queryKeyTypeName, queryOptionsName, queryKeyName, node, tsResolver, customOptions, initialPageParam, queryParam }) {
1554
1585
  const successNames = resolveSuccessNames(node, tsResolver);
@@ -1576,10 +1607,9 @@ function SuspenseInfiniteQuery({ name, queryKeyTypeName, queryOptionsName, query
1576
1607
  `TQueryKey extends QueryKey = ${queryKeyTypeName}`,
1577
1608
  `TPageParam = ${pageParamType}`
1578
1609
  ];
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) ?? "";
1610
+ const resolvedParams = buildResolvedRequestParams(node);
1611
+ const queryKeyArgs = resolvedParams ? "resolvedParams" : "";
1612
+ const queryOptionsArgs = resolvedParams ? "resolvedParams, config" : "config";
1583
1613
  const paramsNode = buildSuspenseInfiniteQueryParamsNode(node, {
1584
1614
  resolver: tsResolver,
1585
1615
  pageParamGeneric: "TPageParam"
@@ -1598,11 +1628,11 @@ function SuspenseInfiniteQuery({ name, queryKeyTypeName, queryOptionsName, query
1598
1628
  JSDoc: { comments: buildOperationComments(node) },
1599
1629
  children: `
1600
1630
  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}' })` : ""}
1631
+ const { client: queryClient, ...resolvedOptions } = queryConfig${resolvedParams ? `\n const resolvedParams = ${resolvedParams}` : ""}
1632
+ const queryKey = resolvedOptions?.queryKey ?? ${queryKeyName}(${queryKeyArgs})${customOptions ? `\n const customOptions = ${customOptions.name}({ hookName: '${name}', operationId: '${node.operationId}' })` : ""}
1603
1633
 
1604
1634
  const queryResult = useSuspenseInfiniteQuery({
1605
- ...${queryOptionsName}(${queryOptionsParamsCall}),${customOptions ? "\n ...customOptions," : ""}
1635
+ ...${queryOptionsName}(${queryOptionsArgs}),${customOptions ? "\n ...customOptions," : ""}
1606
1636
  ...resolvedOptions,
1607
1637
  queryKey,
1608
1638
  } as unknown as UseSuspenseInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryKey, TPageParam>, queryClient) as ${returnType}
@@ -1617,7 +1647,7 @@ function SuspenseInfiniteQuery({ name, queryKeyTypeName, queryOptionsName, query
1617
1647
  //#endregion
1618
1648
  //#region src/components/SuspenseInfiniteQueryOptions.tsx
1619
1649
  const declarationPrinter$1 = functionPrinter({ mode: "declaration" });
1620
- const callPrinter$1 = functionPrinter({ mode: "call" });
1650
+ const callPrinter = functionPrinter({ mode: "call" });
1621
1651
  function SuspenseInfiniteQueryOptions({ name, clientName, initialPageParam, cursorParam, nextParam, previousParam, node, tsResolver, queryParam, queryKeyName }) {
1622
1652
  const successNames = resolveSuccessNames(node, tsResolver);
1623
1653
  const queryFnDataType = successNames.length > 0 ? successNames.join(" | ") : tsResolver.resolveResponseName(node);
@@ -1643,7 +1673,7 @@ function SuspenseInfiniteQueryOptions({ name, clientName, initialPageParam, curs
1643
1673
  })}
1644
1674
  return data`;
1645
1675
  const queryKeyParamsNode = buildQueryKeyParams(node, { resolver: tsResolver });
1646
- const queryKeyParamsCall = callPrinter$1.print(queryKeyParamsNode) ?? "";
1676
+ const queryKeyParamsCall = callPrinter.print(queryKeyParamsNode) ?? "";
1647
1677
  const hasNewParams = nextParam != null || previousParam != null;
1648
1678
  const [getNextPageParamExpr, getPreviousPageParamExpr] = (() => {
1649
1679
  if (hasNewParams) {
@@ -1708,7 +1738,6 @@ return infiniteQueryOptions<${queryFnDataType}, ${errorType}, InfiniteData<${que
1708
1738
  //#endregion
1709
1739
  //#region src/components/SuspenseQuery.tsx
1710
1740
  const declarationPrinter = functionPrinter({ mode: "declaration" });
1711
- const callPrinter = functionPrinter({ mode: "call" });
1712
1741
  function buildSuspenseQueryParamsNode(node, options) {
1713
1742
  const { resolver } = options;
1714
1743
  const successNames = resolveSuccessNames(node, resolver);
@@ -1727,7 +1756,10 @@ function buildSuspenseQueryParamsNode(node, options) {
1727
1756
  }`,
1728
1757
  default: "{}"
1729
1758
  });
1730
- return createFunctionParameters({ params: [buildGroupedRequestParam(node, { resolver }), optionsParam].filter((param) => param !== null) });
1759
+ return createFunctionParameters({ params: [buildGroupedRequestParam(node, {
1760
+ resolver,
1761
+ memberTypeWrapper: maybeValueOrGetter
1762
+ }), optionsParam].filter((param) => param !== null) });
1731
1763
  }
1732
1764
  function SuspenseQuery({ name, queryKeyTypeName, queryOptionsName, queryKeyName, node, tsResolver, customOptions }) {
1733
1765
  const successNames = resolveSuccessNames(node, tsResolver);
@@ -1736,10 +1768,9 @@ function SuspenseQuery({ name, queryKeyTypeName, queryOptionsName, queryKeyName,
1736
1768
  const TData = responseName;
1737
1769
  const returnType = `UseSuspenseQueryResult<TData, ${`ResponseErrorConfig<${errorNames.length > 0 ? errorNames.join(" | ") : "Error"}>`}> & { queryKey: TQueryKey }`;
1738
1770
  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) ?? "";
1771
+ const resolvedParams = buildResolvedRequestParams(node);
1772
+ const queryKeyArgs = resolvedParams ? "resolvedParams" : "";
1773
+ const queryOptionsArgs = resolvedParams ? "resolvedParams, config" : "config";
1743
1774
  const paramsNode = buildSuspenseQueryParamsNode(node, { resolver: tsResolver });
1744
1775
  const paramsSignature = declarationPrinter.print(paramsNode) ?? "";
1745
1776
  return /* @__PURE__ */ jsx(File.Source, {
@@ -1755,11 +1786,11 @@ function SuspenseQuery({ name, queryKeyTypeName, queryOptionsName, queryKeyName,
1755
1786
  JSDoc: { comments: buildOperationComments(node) },
1756
1787
  children: `
1757
1788
  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}' })` : ""}
1789
+ const { client: queryClient, ...resolvedOptions } = queryConfig${resolvedParams ? `\n const resolvedParams = ${resolvedParams}` : ""}
1790
+ const queryKey = resolvedOptions?.queryKey ?? ${queryKeyName}(${queryKeyArgs})${customOptions ? `\n const customOptions = ${customOptions.name}({ hookName: '${name}', operationId: '${node.operationId}' })` : ""}
1760
1791
 
1761
1792
  const queryResult = useSuspenseQuery({
1762
- ...${queryOptionsName}(${queryOptionsParamsCall}),${customOptions ? "\n ...customOptions," : ""}
1793
+ ...${queryOptionsName}(${queryOptionsArgs}),${customOptions ? "\n ...customOptions," : ""}
1763
1794
  ...resolvedOptions,
1764
1795
  queryKey,
1765
1796
  } as unknown as UseSuspenseQueryOptions, queryClient) as ${returnType}
@@ -1785,7 +1816,7 @@ const infiniteQueryGenerator = defineGenerator({
1785
1816
  operation(node, ctx) {
1786
1817
  if (!ast.isHttpOperationNode(node)) return null;
1787
1818
  const { config, driver, resolver, root } = ctx;
1788
- const { output, query, mutation, infinite, validator, client, group, customOptions } = ctx.options;
1819
+ const { output, query, mutation, infinite, validator, client, group, customOptions, hooks } = ctx.options;
1789
1820
  const pluginTs = driver.getPlugin(pluginTsName);
1790
1821
  if (!pluginTs) return null;
1791
1822
  const tsResolver = driver.getResolver(pluginTsName);
@@ -1919,31 +1950,33 @@ const infiniteQueryGenerator = defineGenerator({
1919
1950
  initialPageParam: infiniteOptions.initialPageParam,
1920
1951
  queryParam: infiniteOptions.queryParam
1921
1952
  }),
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
- })
1953
+ hooks && /* @__PURE__ */ jsxs(Fragment, { children: [
1954
+ /* @__PURE__ */ jsx(File.Import, {
1955
+ name: ["useInfiniteQuery"],
1956
+ path: importPath
1957
+ }),
1958
+ /* @__PURE__ */ jsx(File.Import, {
1959
+ name: [
1960
+ "QueryKey",
1961
+ "QueryClient",
1962
+ "InfiniteQueryObserverOptions",
1963
+ "UseInfiniteQueryResult"
1964
+ ],
1965
+ path: importPath,
1966
+ isTypeOnly: true
1967
+ }),
1968
+ /* @__PURE__ */ jsx(InfiniteQuery, {
1969
+ name: queryName,
1970
+ queryOptionsName,
1971
+ queryKeyName,
1972
+ queryKeyTypeName,
1973
+ node,
1974
+ tsResolver,
1975
+ initialPageParam: infiniteOptions.initialPageParam,
1976
+ queryParam: infiniteOptions.queryParam,
1977
+ customOptions
1978
+ })
1979
+ ] })
1947
1980
  ]
1948
1981
  });
1949
1982
  }
@@ -1961,7 +1994,7 @@ const mutationGenerator = defineGenerator({
1961
1994
  operation(node, ctx) {
1962
1995
  if (!ast.isHttpOperationNode(node)) return null;
1963
1996
  const { config, driver, resolver, root } = ctx;
1964
- const { output, query, mutation, validator, client, group, customOptions } = ctx.options;
1997
+ const { output, query, mutation, validator, client, group, customOptions, hooks } = ctx.options;
1965
1998
  const pluginTs = driver.getPlugin(pluginTsName);
1966
1999
  if (!pluginTs) return null;
1967
2000
  const tsResolver = driver.getResolver(pluginTsName);
@@ -2069,7 +2102,7 @@ const mutationGenerator = defineGenerator({
2069
2102
  node,
2070
2103
  tsResolver
2071
2104
  }),
2072
- mutation && /* @__PURE__ */ jsxs(Fragment, { children: [
2105
+ mutation && hooks && /* @__PURE__ */ jsxs(Fragment, { children: [
2073
2106
  /* @__PURE__ */ jsx(File.Import, {
2074
2107
  name: ["useMutation"],
2075
2108
  path: importPath
@@ -2110,7 +2143,7 @@ const queryGenerator = defineGenerator({
2110
2143
  operation(node, ctx) {
2111
2144
  if (!ast.isHttpOperationNode(node)) return null;
2112
2145
  const { config, driver, resolver, root } = ctx;
2113
- const { output, query, mutation, validator, client, group, customOptions } = ctx.options;
2146
+ const { output, query, mutation, validator, client, group, customOptions, hooks } = ctx.options;
2114
2147
  const pluginTs = driver.getPlugin(pluginTsName);
2115
2148
  if (!pluginTs) return null;
2116
2149
  const tsResolver = driver.getResolver(pluginTsName);
@@ -2222,7 +2255,7 @@ const queryGenerator = defineGenerator({
2222
2255
  node,
2223
2256
  tsResolver
2224
2257
  }),
2225
- query && /* @__PURE__ */ jsxs(Fragment, { children: [
2258
+ query && hooks && /* @__PURE__ */ jsxs(Fragment, { children: [
2226
2259
  /* @__PURE__ */ jsx(File.Import, {
2227
2260
  name: ["useQuery"],
2228
2261
  path: importPath
@@ -2265,7 +2298,7 @@ const suspenseInfiniteQueryGenerator = defineGenerator({
2265
2298
  operation(node, ctx) {
2266
2299
  if (!ast.isHttpOperationNode(node)) return null;
2267
2300
  const { config, driver, resolver, root } = ctx;
2268
- const { output, query, mutation, infinite, suspense, validator, client, group, customOptions } = ctx.options;
2301
+ const { output, query, mutation, infinite, suspense, validator, client, group, customOptions, hooks } = ctx.options;
2269
2302
  const pluginTs = driver.getPlugin(pluginTsName);
2270
2303
  if (!pluginTs) return null;
2271
2304
  const tsResolver = driver.getResolver(pluginTsName);
@@ -2399,31 +2432,33 @@ const suspenseInfiniteQueryGenerator = defineGenerator({
2399
2432
  initialPageParam: infiniteOptions.initialPageParam,
2400
2433
  queryParam: infiniteOptions.queryParam
2401
2434
  }),
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
- })
2435
+ hooks && /* @__PURE__ */ jsxs(Fragment, { children: [
2436
+ /* @__PURE__ */ jsx(File.Import, {
2437
+ name: ["useSuspenseInfiniteQuery"],
2438
+ path: importPath
2439
+ }),
2440
+ /* @__PURE__ */ jsx(File.Import, {
2441
+ name: [
2442
+ "QueryKey",
2443
+ "QueryClient",
2444
+ "UseSuspenseInfiniteQueryOptions",
2445
+ "UseSuspenseInfiniteQueryResult"
2446
+ ],
2447
+ path: importPath,
2448
+ isTypeOnly: true
2449
+ }),
2450
+ /* @__PURE__ */ jsx(SuspenseInfiniteQuery, {
2451
+ name: queryName,
2452
+ queryOptionsName,
2453
+ queryKeyName,
2454
+ queryKeyTypeName,
2455
+ node,
2456
+ tsResolver,
2457
+ initialPageParam: infiniteOptions.initialPageParam,
2458
+ queryParam: infiniteOptions.queryParam,
2459
+ customOptions
2460
+ })
2461
+ ] })
2427
2462
  ]
2428
2463
  });
2429
2464
  }
@@ -2442,7 +2477,7 @@ const suspenseQueryGenerator = defineGenerator({
2442
2477
  operation(node, ctx) {
2443
2478
  if (!ast.isHttpOperationNode(node)) return null;
2444
2479
  const { config, driver, resolver, root } = ctx;
2445
- const { output, query, mutation, suspense, validator, client, group, customOptions } = ctx.options;
2480
+ const { output, query, mutation, suspense, validator, client, group, customOptions, hooks } = ctx.options;
2446
2481
  const pluginTs = driver.getPlugin(pluginTsName);
2447
2482
  if (!pluginTs) return null;
2448
2483
  const tsResolver = driver.getResolver(pluginTsName);
@@ -2554,7 +2589,7 @@ const suspenseQueryGenerator = defineGenerator({
2554
2589
  node,
2555
2590
  tsResolver
2556
2591
  }),
2557
- suspense && /* @__PURE__ */ jsxs(Fragment, { children: [
2592
+ suspense && hooks && /* @__PURE__ */ jsxs(Fragment, { children: [
2558
2593
  /* @__PURE__ */ jsx(File.Import, {
2559
2594
  name: ["useSuspenseQuery"],
2560
2595
  path: importPath
@@ -2734,7 +2769,7 @@ const pluginReactQuery = definePlugin((options) => {
2734
2769
  const { output = {
2735
2770
  path: "hooks",
2736
2771
  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;
2772
+ }, group, exclude = [], include, override = [], validator = false, suspense = {}, infinite = false, mutation = {}, query = {}, mutationKey = mutationKeyTransformer, queryKey = queryKeyTransformer, customOptions, hooks = false, client, resolver: userResolver, macros: userMacros } = options;
2738
2773
  const selectedGenerators = [
2739
2774
  queryGenerator,
2740
2775
  suspenseQueryGenerator,
@@ -2796,6 +2831,7 @@ const pluginReactQuery = definePlugin((options) => {
2796
2831
  name: "useCustomHookOptions",
2797
2832
  ...customOptions
2798
2833
  } : null,
2834
+ hooks,
2799
2835
  validator,
2800
2836
  group: groupConfig,
2801
2837
  exclude,