@kubb/plugin-react-query 5.0.0-beta.4 → 5.0.0-beta.56

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.
Files changed (49) hide show
  1. package/README.md +38 -91
  2. package/dist/{components-DTGLu4UV.js → components-DL0Cai7l.js} +570 -514
  3. package/dist/components-DL0Cai7l.js.map +1 -0
  4. package/dist/{components-dAKJEn9b.cjs → components-yMQOuFmI.cjs} +600 -514
  5. package/dist/components-yMQOuFmI.cjs.map +1 -0
  6. package/dist/components.cjs +1 -1
  7. package/dist/components.d.ts +5 -77
  8. package/dist/components.js +1 -1
  9. package/dist/{generators-C_fbcjpG.js → generators-BG-Vcvfg.js} +444 -597
  10. package/dist/generators-BG-Vcvfg.js.map +1 -0
  11. package/dist/{generators-CWEQsdO9.cjs → generators-zGKP8yII.cjs} +442 -595
  12. package/dist/generators-zGKP8yII.cjs.map +1 -0
  13. package/dist/generators.cjs +1 -1
  14. package/dist/generators.d.ts +49 -10
  15. package/dist/generators.js +1 -1
  16. package/dist/index.cjs +201 -28
  17. package/dist/index.cjs.map +1 -1
  18. package/dist/index.d.ts +32 -4
  19. package/dist/index.js +203 -30
  20. package/dist/index.js.map +1 -1
  21. package/dist/types-X7D0NSvJ.d.ts +396 -0
  22. package/package.json +18 -27
  23. package/src/components/InfiniteQuery.tsx +27 -17
  24. package/src/components/InfiniteQueryOptions.tsx +60 -81
  25. package/src/components/Mutation.tsx +39 -20
  26. package/src/components/MutationOptions.tsx +15 -14
  27. package/src/components/Query.tsx +18 -15
  28. package/src/components/QueryOptions.tsx +20 -56
  29. package/src/components/SuspenseInfiniteQuery.tsx +22 -17
  30. package/src/components/SuspenseInfiniteQueryOptions.tsx +51 -76
  31. package/src/components/SuspenseQuery.tsx +13 -15
  32. package/src/generators/customHookOptionsFileGenerator.tsx +16 -12
  33. package/src/generators/hookOptionsGenerator.tsx +42 -49
  34. package/src/generators/infiniteQueryGenerator.tsx +55 -80
  35. package/src/generators/mutationGenerator.tsx +54 -66
  36. package/src/generators/queryGenerator.tsx +52 -65
  37. package/src/generators/suspenseInfiniteQueryGenerator.tsx +50 -67
  38. package/src/generators/suspenseQueryGenerator.tsx +54 -78
  39. package/src/plugin.ts +47 -33
  40. package/src/resolvers/resolverReactQuery.ts +104 -8
  41. package/src/types.ts +202 -68
  42. package/src/utils.ts +11 -33
  43. package/dist/components-DTGLu4UV.js.map +0 -1
  44. package/dist/components-dAKJEn9b.cjs.map +0 -1
  45. package/dist/generators-CWEQsdO9.cjs.map +0 -1
  46. package/dist/generators-C_fbcjpG.js.map +0 -1
  47. package/dist/types-DfaFRSBf.d.ts +0 -284
  48. package/extension.yaml +0 -938
  49. /package/dist/{chunk--u3MIqq1.js → chunk-C0LytTxp.js} +0 -0
@@ -1,4 +1,4 @@
1
- const require_components = require("./components-dAKJEn9b.cjs");
1
+ const require_components = require("./components-yMQOuFmI.cjs");
2
2
  let node_path = require("node:path");
3
3
  node_path = require_components.__toESM(node_path);
4
4
  let _kubb_core = require("@kubb/core");
@@ -9,23 +9,29 @@ let _kubb_renderer_jsx = require("@kubb/renderer-jsx");
9
9
  let _kubb_renderer_jsx_jsx_runtime = require("@kubb/renderer-jsx/jsx-runtime");
10
10
  let node_fs = require("node:fs");
11
11
  node_fs = require_components.__toESM(node_fs);
12
- let remeda = require("remeda");
13
12
  //#region src/generators/customHookOptionsFileGenerator.tsx
13
+ /**
14
+ * Scaffolds the user-editable `useCustomHookOptions` file when
15
+ * `pluginReactQuery({ customOptions: { ... } })` is configured. The file is
16
+ * only created when it does not already exist, so user edits persist across
17
+ * regeneration.
18
+ */
14
19
  const customHookOptionsFileGenerator = (0, _kubb_core.defineGenerator)({
15
20
  name: "react-query-custom-hook-options-file",
16
21
  renderer: _kubb_renderer_jsx.jsxRenderer,
17
22
  operations(nodes, ctx) {
18
23
  const { resolver, config, root } = ctx;
19
- const { output, customOptions, query, group, transformers } = ctx.options;
24
+ const { output, customOptions, query, group } = ctx.options;
20
25
  if (!customOptions) return null;
21
26
  const override = output.override ?? config.output.override ?? false;
22
27
  const { importPath, name } = customOptions;
28
+ const hookOptionsName = resolver.resolveHookOptionsName();
29
+ const customHookOptionsName = resolver.resolveCustomHookOptionsName();
23
30
  const reactQueryImportPath = query ? query.importPath : "@tanstack/react-query";
24
- const capitalize = (s) => s.charAt(0).toUpperCase() + s.slice(1);
25
31
  let hookFilePath;
26
32
  const firstNode = nodes[0];
27
33
  if (firstNode) {
28
- const hookName = require_components.transformName(`use${capitalize(resolver.resolveName(firstNode.operationId))}`, "function", transformers);
34
+ const hookName = resolver.resolveQueryName(firstNode);
29
35
  hookFilePath = resolver.resolveFile({
30
36
  name: hookName,
31
37
  extname: ".ts",
@@ -34,7 +40,7 @@ const customHookOptionsFileGenerator = (0, _kubb_core.defineGenerator)({
34
40
  }, {
35
41
  root,
36
42
  output,
37
- group
43
+ group: group ?? void 0
38
44
  }).path;
39
45
  } else hookFilePath = node_path.default.resolve(root, "index.ts");
40
46
  const ensureExtension = (filePath, extname) => {
@@ -63,7 +69,7 @@ const customHookOptionsFileGenerator = (0, _kubb_core.defineGenerator)({
63
69
  path: reactQueryImportPath
64
70
  }),
65
71
  /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
66
- name: ["HookOptions"],
72
+ name: [hookOptionsName],
67
73
  root: file.path,
68
74
  path: node_path.default.resolve(root, "./index.ts")
69
75
  }),
@@ -72,9 +78,9 @@ const customHookOptionsFileGenerator = (0, _kubb_core.defineGenerator)({
72
78
  isExportable: true,
73
79
  isIndexable: true,
74
80
  children: [/* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.Function, {
75
- name: "getCustomHookOptions",
81
+ name: customHookOptionsName,
76
82
  params: "{ queryClient }: { queryClient: QueryClient }",
77
- returnType: "Partial<HookOptions>",
83
+ returnType: `Partial<${hookOptionsName}>`,
78
84
  children: `return {
79
85
  // TODO: Define custom hook options here
80
86
  // Example:
@@ -86,12 +92,12 @@ const customHookOptionsFileGenerator = (0, _kubb_core.defineGenerator)({
86
92
  }`
87
93
  }), /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.Function, {
88
94
  name,
89
- generics: "T extends keyof HookOptions",
95
+ generics: `T extends keyof ${hookOptionsName}`,
90
96
  params: "{ hookName, operationId }: { hookName: T, operationId: string }",
91
- returnType: "HookOptions[T]",
97
+ returnType: `${hookOptionsName}[T]`,
92
98
  export: true,
93
99
  children: `const queryClient = useQueryClient()
94
- const customOptions = getCustomHookOptions({ queryClient })
100
+ const customOptions = ${customHookOptionsName}({ queryClient })
95
101
  return customOptions[hookName] ?? {}`
96
102
  })]
97
103
  })
@@ -101,52 +107,54 @@ const customHookOptionsFileGenerator = (0, _kubb_core.defineGenerator)({
101
107
  });
102
108
  //#endregion
103
109
  //#region src/generators/hookOptionsGenerator.tsx
110
+ /**
111
+ * Emits the `HookOptions` type used by `customOptions`. Enabled when
112
+ * `pluginReactQuery({ customOptions: { ... } })`. The generated type lists
113
+ * every hook keyed by name so user-supplied options stay in sync with the
114
+ * generated hooks at compile time.
115
+ */
104
116
  const hookOptionsGenerator = (0, _kubb_core.defineGenerator)({
105
117
  name: "react-query-hook-options",
106
118
  renderer: _kubb_renderer_jsx.jsxRenderer,
107
119
  operations(nodes, ctx) {
108
- const { resolver, config, root, adapter } = ctx;
109
- const { output, customOptions, query, mutation, suspense, infinite, group, transformers, override } = ctx.options;
120
+ const { resolver, config, root } = ctx;
121
+ const { output, customOptions, query, mutation, suspense, infinite, group, override } = ctx.options;
110
122
  if (!customOptions) return null;
123
+ const name = resolver.resolveHookOptionsName();
111
124
  const resolvedFile = resolver.resolveFile({
112
- name: "HookOptions",
125
+ name,
113
126
  extname: ".ts"
114
127
  }, {
115
128
  root,
116
129
  output,
117
- group
130
+ group: group ?? void 0
118
131
  });
119
132
  const hookOptionsFile = {
120
133
  ...resolvedFile,
121
- baseName: "HookOptions.ts",
122
- path: resolvedFile.path.replace(/hookOptions\.ts$/, "HookOptions.ts")
134
+ baseName: `${name}.ts`,
135
+ path: resolvedFile.path.replace(/[^/\\]+\.ts$/, `${name}.ts`)
123
136
  };
124
- const capitalize = (s) => s.charAt(0).toUpperCase() + s.slice(1);
125
137
  const imports = [];
126
138
  const hookOptions = {};
127
139
  for (const node of nodes) {
128
- const baseName = resolver.resolveName(node.operationId);
140
+ if (!_kubb_core.ast.isHttpOperationNode(node)) continue;
129
141
  const opOverrides = require_components.resolveOperationOverrides(node, override);
130
142
  const nodeQuery = "query" in opOverrides ? opOverrides.query : query;
131
143
  const nodeMutation = "mutation" in opOverrides ? opOverrides.mutation : mutation;
132
144
  const nodeInfinite = "infinite" in opOverrides ? opOverrides.infinite : infinite;
133
- const nodeInfiniteOptions = nodeInfinite && typeof nodeInfinite === "object" ? nodeInfinite : void 0;
145
+ const nodeInfiniteOptions = nodeInfinite && typeof nodeInfinite === "object" ? nodeInfinite : null;
134
146
  const isQueryOp = nodeQuery === false ? !!query && query.methods.some((m) => node.method.toLowerCase() === m.toLowerCase()) : !!nodeQuery && nodeQuery.methods.some((m) => node.method.toLowerCase() === m.toLowerCase());
135
- const isMutationOp = nodeMutation !== false && !isQueryOp && (0, remeda.difference)(nodeMutation ? nodeMutation.methods : [], nodeQuery ? nodeQuery.methods : []).some((m) => node.method.toLowerCase() === m.toLowerCase());
147
+ const nodeQueryMethods = new Set(nodeQuery ? nodeQuery.methods : []);
148
+ const isMutationOp = nodeMutation !== false && !isQueryOp && (nodeMutation ? nodeMutation.methods : []).some((m) => !nodeQueryMethods.has(m) && node.method.toLowerCase() === m.toLowerCase());
136
149
  const isSuspenseOp = !!suspense;
137
150
  const isInfiniteOp = !!nodeInfiniteOptions;
138
151
  if (isQueryOp) {
139
- const queryOptionsName = require_components.transformName(`${baseName}QueryOptions`, "function", transformers);
140
- const queryHookName = require_components.transformName(`use${capitalize(baseName)}`, "function", transformers);
141
- const queryHookFile = resolver.resolveFile({
142
- name: queryHookName,
143
- extname: ".ts",
144
- tag: node.tags[0] ?? "default",
145
- path: node.path
146
- }, {
152
+ const queryOptionsName = resolver.resolveQueryOptionsName(node);
153
+ const queryHookName = resolver.resolveQueryName(node);
154
+ const queryHookFile = resolver.resolveFile(require_components.operationFileEntry(node, queryHookName), {
147
155
  root,
148
156
  output,
149
- group
157
+ group: group ?? void 0
150
158
  });
151
159
  imports.push(/* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
152
160
  name: [queryOptionsName],
@@ -155,17 +163,12 @@ const hookOptionsGenerator = (0, _kubb_core.defineGenerator)({
155
163
  }));
156
164
  hookOptions[queryHookName] = `Partial<ReturnType<typeof ${queryOptionsName}>>`;
157
165
  if (isSuspenseOp) {
158
- const suspenseOptionsName = require_components.transformName(`${baseName}SuspenseQueryOptions`, "function", transformers);
159
- const suspenseHookName = require_components.transformName(`use${capitalize(baseName)}Suspense`, "function", transformers);
160
- const suspenseHookFile = resolver.resolveFile({
161
- name: suspenseHookName,
162
- extname: ".ts",
163
- tag: node.tags[0] ?? "default",
164
- path: node.path
165
- }, {
166
+ const suspenseOptionsName = resolver.resolveSuspenseQueryOptionsName(node);
167
+ const suspenseHookName = resolver.resolveSuspenseQueryName(node);
168
+ const suspenseHookFile = resolver.resolveFile(require_components.operationFileEntry(node, suspenseHookName), {
166
169
  root,
167
170
  output,
168
- group
171
+ group: group ?? void 0
169
172
  });
170
173
  imports.push(/* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
171
174
  name: [suspenseOptionsName],
@@ -176,19 +179,14 @@ const hookOptionsGenerator = (0, _kubb_core.defineGenerator)({
176
179
  }
177
180
  if (isInfiniteOp) {
178
181
  const normalizeKey = (key) => key.replace(/\?$/, "");
179
- const queryParamKeys = node.parameters.filter((p) => p.in === "query").map((p) => p.name);
182
+ const queryParamKeys = require_components.getOperationParameters(node).query.map((p) => p.name);
180
183
  if (nodeInfiniteOptions.queryParam ? queryParamKeys.some((k) => normalizeKey(k) === nodeInfiniteOptions.queryParam) : false) {
181
- const infiniteOptionsName = require_components.transformName(`${baseName}InfiniteQueryOptions`, "function", transformers);
182
- const infiniteHookName = require_components.transformName(`use${capitalize(baseName)}Infinite`, "function", transformers);
183
- const infiniteHookFile = resolver.resolveFile({
184
- name: infiniteHookName,
185
- extname: ".ts",
186
- tag: node.tags[0] ?? "default",
187
- path: node.path
188
- }, {
184
+ const infiniteOptionsName = resolver.resolveInfiniteQueryOptionsName(node);
185
+ const infiniteHookName = resolver.resolveInfiniteQueryName(node);
186
+ const infiniteHookFile = resolver.resolveFile(require_components.operationFileEntry(node, infiniteHookName), {
189
187
  root,
190
188
  output,
191
- group
189
+ group: group ?? void 0
192
190
  });
193
191
  imports.push(/* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
194
192
  name: [infiniteOptionsName],
@@ -197,17 +195,12 @@ const hookOptionsGenerator = (0, _kubb_core.defineGenerator)({
197
195
  }));
198
196
  hookOptions[infiniteHookName] = `Partial<ReturnType<typeof ${infiniteOptionsName}>>`;
199
197
  if (isSuspenseOp) {
200
- const suspenseInfiniteOptionsName = require_components.transformName(`${baseName}SuspenseInfiniteQueryOptions`, "function", transformers);
201
- const suspenseInfiniteHookName = require_components.transformName(`use${capitalize(baseName)}SuspenseInfinite`, "function", transformers);
202
- const suspenseInfiniteHookFile = resolver.resolveFile({
203
- name: suspenseInfiniteHookName,
204
- extname: ".ts",
205
- tag: node.tags[0] ?? "default",
206
- path: node.path
207
- }, {
198
+ const suspenseInfiniteOptionsName = resolver.resolveSuspenseInfiniteQueryOptionsName(node);
199
+ const suspenseInfiniteHookName = resolver.resolveSuspenseInfiniteQueryName(node);
200
+ const suspenseInfiniteHookFile = resolver.resolveFile(require_components.operationFileEntry(node, suspenseInfiniteHookName), {
208
201
  root,
209
202
  output,
210
- group
203
+ group: group ?? void 0
211
204
  });
212
205
  imports.push(/* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
213
206
  name: [suspenseInfiniteOptionsName],
@@ -220,17 +213,12 @@ const hookOptionsGenerator = (0, _kubb_core.defineGenerator)({
220
213
  }
221
214
  }
222
215
  if (isMutationOp) {
223
- const mutationOptionsName = require_components.transformName(`${baseName}MutationOptions`, "function", transformers);
224
- const mutationHookName = require_components.transformName(`use${capitalize(baseName)}`, "function", transformers);
225
- const mutationHookFile = resolver.resolveFile({
226
- name: mutationHookName,
227
- extname: ".ts",
228
- tag: node.tags[0] ?? "default",
229
- path: node.path
230
- }, {
216
+ const mutationOptionsName = resolver.resolveMutationOptionsName(node);
217
+ const mutationHookName = resolver.resolveMutationName(node);
218
+ const mutationHookFile = resolver.resolveFile(require_components.operationFileEntry(node, mutationHookName), {
231
219
  root,
232
220
  output,
233
- group
221
+ group: group ?? void 0
234
222
  });
235
223
  imports.push(/* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
236
224
  name: [mutationOptionsName],
@@ -240,18 +228,25 @@ const hookOptionsGenerator = (0, _kubb_core.defineGenerator)({
240
228
  hookOptions[mutationHookName] = `Partial<ReturnType<typeof ${mutationOptionsName}>>`;
241
229
  }
242
230
  }
243
- const name = "HookOptions";
244
231
  return /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx.File, {
245
232
  baseName: hookOptionsFile.baseName,
246
233
  path: hookOptionsFile.path,
247
234
  meta: hookOptionsFile.meta,
248
- banner: resolver.resolveBanner(adapter.inputNode, {
235
+ banner: resolver.resolveBanner(ctx.meta, {
249
236
  output,
250
- config
237
+ config,
238
+ file: {
239
+ path: hookOptionsFile.path,
240
+ baseName: hookOptionsFile.baseName
241
+ }
251
242
  }),
252
- footer: resolver.resolveFooter(adapter.inputNode, {
243
+ footer: resolver.resolveFooter(ctx.meta, {
253
244
  output,
254
- config
245
+ config,
246
+ file: {
247
+ path: hookOptionsFile.path,
248
+ baseName: hookOptionsFile.baseName
249
+ }
255
250
  }),
256
251
  children: [imports, /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Source, {
257
252
  name,
@@ -269,153 +264,123 @@ const hookOptionsGenerator = (0, _kubb_core.defineGenerator)({
269
264
  });
270
265
  //#endregion
271
266
  //#region src/generators/infiniteQueryGenerator.tsx
267
+ /**
268
+ * Built-in generator for `useInfiniteQuery` hooks. Enabled when
269
+ * `pluginReactQuery({ infinite: { ... } })`. Emits one `useFooInfiniteQuery`
270
+ * hook per query operation, wiring the configured `nextParam` /
271
+ * `previousParam` paths into TanStack Query's cursor-based pagination.
272
+ */
272
273
  const infiniteQueryGenerator = (0, _kubb_core.defineGenerator)({
273
274
  name: "react-infinite-query",
274
275
  renderer: _kubb_renderer_jsx.jsxRenderer,
275
276
  operation(node, ctx) {
276
- const { adapter, config, driver, resolver, root } = ctx;
277
- const { output, query, mutation, infinite, paramsCasing, paramsType, pathParamsType, parser, client: clientOptions, group, transformers, customOptions } = ctx.options;
277
+ if (!_kubb_core.ast.isHttpOperationNode(node)) return null;
278
+ const { config, driver, resolver, root } = ctx;
279
+ const { output, query, mutation, infinite, paramsCasing, paramsType, pathParamsType, parser, client: clientOptions, group, customOptions } = ctx.options;
278
280
  const pluginTs = driver.getPlugin(_kubb_plugin_ts.pluginTsName);
279
281
  if (!pluginTs) return null;
280
282
  const tsResolver = driver.getResolver(_kubb_plugin_ts.pluginTsName);
281
283
  const isQuery = query === false || !!query && query.methods.some((method) => node.method.toLowerCase() === method.toLowerCase());
282
- const isMutation = mutation !== false && !isQuery && (0, remeda.difference)(mutation ? mutation.methods : [], query ? query.methods : []).some((method) => node.method.toLowerCase() === method.toLowerCase());
283
- const infiniteOptions = infinite && typeof infinite === "object" ? infinite : void 0;
284
+ const queryMethods = new Set(query ? query.methods : []);
285
+ const isMutation = mutation !== false && !isQuery && (mutation ? mutation.methods : []).some((method) => !queryMethods.has(method) && node.method.toLowerCase() === method.toLowerCase());
286
+ const infiniteOptions = infinite && typeof infinite === "object" ? infinite : null;
284
287
  if (!isQuery || isMutation || !infiniteOptions) return null;
285
288
  const normalizeKey = (key) => key.replace(/\?$/, "");
286
- const queryParamKeys = node.parameters.filter((p) => p.in === "query").map((p) => p.name);
289
+ const queryParamKeys = require_components.getOperationParameters(node).query.map((p) => p.name);
287
290
  const hasQueryParam = infiniteOptions.queryParam ? queryParamKeys.some((k) => normalizeKey(k) === infiniteOptions.queryParam) : false;
288
291
  const hasCursorParam = !infiniteOptions.cursorParam || true;
289
292
  if (!hasQueryParam || !hasCursorParam) return null;
290
293
  const importPath = query ? query.importPath : "@tanstack/react-query";
291
- const baseName = resolver.resolveName(node.operationId);
292
- const capitalize = (s) => s.charAt(0).toUpperCase() + s.slice(1);
293
- const queryName = require_components.transformName(`use${capitalize(baseName)}Infinite`, "function", transformers);
294
- const queryOptionsName = require_components.transformName(`${baseName}InfiniteQueryOptions`, "function", transformers);
295
- const queryKeyName = require_components.transformName(`${baseName}InfiniteQueryKey`, "const", transformers);
296
- const queryKeyTypeName = require_components.transformName(`${capitalize(baseName)}InfiniteQueryKey`, "type", transformers);
297
- const clientBaseName = require_components.transformName(`${baseName}Infinite`, "function", transformers);
294
+ const queryName = resolver.resolveInfiniteQueryName(node);
295
+ const queryOptionsName = resolver.resolveInfiniteQueryOptionsName(node);
296
+ const queryKeyName = resolver.resolveInfiniteQueryKeyName(node);
297
+ const queryKeyTypeName = resolver.resolveInfiniteQueryKeyTypeName(node);
298
+ const clientBaseName = resolver.resolveInfiniteClientName(node);
298
299
  const meta = {
299
- file: resolver.resolveFile({
300
- name: queryName,
301
- extname: ".ts",
302
- tag: node.tags[0] ?? "default",
303
- path: node.path
304
- }, {
300
+ file: resolver.resolveFile(require_components.operationFileEntry(node, queryName), {
305
301
  root,
306
302
  output,
307
- group
303
+ group: group ?? void 0
308
304
  }),
309
- fileTs: tsResolver.resolveFile({
310
- name: node.operationId,
311
- extname: ".ts",
312
- tag: node.tags[0] ?? "default",
313
- path: node.path
314
- }, {
305
+ fileTs: tsResolver.resolveFile(require_components.operationFileEntry(node, node.operationId), {
315
306
  root,
316
307
  output: pluginTs.options?.output ?? output,
317
- group: pluginTs.options?.group
308
+ group: pluginTs.options?.group ?? void 0
318
309
  })
319
310
  };
320
- const casedParams = _kubb_core.ast.caseParams(node.parameters, paramsCasing);
321
- const pathParams = casedParams.filter((p) => p.in === "path");
322
- const queryParams = casedParams.filter((p) => p.in === "query");
323
- const headerParams = casedParams.filter((p) => p.in === "header");
324
- const importedTypeNames = [
325
- node.requestBody?.content?.[0]?.schema ? tsResolver.resolveDataName(node) : void 0,
326
- tsResolver.resolveResponseName(node),
327
- ...pathParams.map((p) => tsResolver.resolvePathParamsName(node, p)),
328
- ...queryParams.map((p) => tsResolver.resolveQueryParamsName(node, p)),
329
- ...headerParams.map((p) => tsResolver.resolveHeaderParamsName(node, p)),
330
- ...node.responses.map((res) => tsResolver.resolveResponseStatusName(node, res.statusCode))
331
- ].filter((name) => !!name && name !== queryKeyTypeName);
332
- const pluginZod = parser === "zod" ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : void 0;
333
- const zodResolver = pluginZod ? driver.getResolver(_kubb_plugin_zod.pluginZodName) : void 0;
334
- const fileZod = zodResolver ? zodResolver.resolveFile({
335
- name: node.operationId,
336
- extname: ".ts",
337
- tag: node.tags[0] ?? "default",
338
- path: node.path
339
- }, {
311
+ const importedTypeNames = require_components.resolveOperationTypeNames(node, tsResolver, {
312
+ paramsCasing,
313
+ exclude: [queryKeyTypeName],
314
+ order: "body-response-first"
315
+ });
316
+ const pluginZod = (0, _kubb_plugin_client.isParserEnabled)(parser) ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : null;
317
+ const zodResolver = pluginZod ? driver.getResolver(_kubb_plugin_zod.pluginZodName) : null;
318
+ const fileZod = zodResolver ? zodResolver.resolveFile(require_components.operationFileEntry(node, node.operationId), {
340
319
  root,
341
320
  output: pluginZod?.options?.output ?? output,
342
- group: pluginZod?.options?.group
343
- }) : void 0;
344
- const zodSchemaNames = zodResolver && parser === "zod" ? [zodResolver.resolveResponseName?.(node), node.requestBody?.content?.[0]?.schema ? zodResolver.resolveDataName?.(node) : void 0].filter(Boolean) : [];
321
+ group: pluginZod?.options?.group ?? void 0
322
+ }) : null;
323
+ const zodSchemaNames = require_components.resolveZodSchemaNames(node, zodResolver, parser);
345
324
  const clientPlugin = driver.getPlugin(_kubb_plugin_client.pluginClientName);
346
325
  const shouldUseClientPlugin = clientPlugin?.name === _kubb_plugin_client.pluginClientName && clientOptions.clientType !== "class";
347
- const clientResolver = shouldUseClientPlugin ? driver.getResolver(_kubb_plugin_client.pluginClientName) : void 0;
348
- const clientFile = shouldUseClientPlugin ? clientResolver?.resolveFile({
349
- name: node.operationId,
350
- extname: ".ts",
351
- tag: node.tags[0] ?? "default",
352
- path: node.path
353
- }, {
326
+ const clientResolver = shouldUseClientPlugin ? driver.getResolver(_kubb_plugin_client.pluginClientName) : null;
327
+ const clientFile = shouldUseClientPlugin ? clientResolver?.resolveFile(require_components.operationFileEntry(node, node.operationId), {
354
328
  root,
355
329
  output: clientPlugin?.options?.output ?? output,
356
- group: clientPlugin?.options?.group
357
- }) : void 0;
330
+ group: clientPlugin?.options?.group ?? void 0
331
+ }) : null;
358
332
  const resolvedClientName = shouldUseClientPlugin ? clientResolver?.resolveName(node.operationId) ?? clientBaseName : clientBaseName;
359
333
  return /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx.File, {
360
334
  baseName: meta.file.baseName,
361
335
  path: meta.file.path,
362
336
  meta: meta.file.meta,
363
- banner: resolver.resolveBanner(adapter.inputNode, {
337
+ banner: resolver.resolveBanner(ctx.meta, {
364
338
  output,
365
- config
339
+ config,
340
+ file: {
341
+ path: meta.file.path,
342
+ baseName: meta.file.baseName
343
+ }
366
344
  }),
367
- footer: resolver.resolveFooter(adapter.inputNode, {
345
+ footer: resolver.resolveFooter(ctx.meta, {
368
346
  output,
369
- config
347
+ config,
348
+ file: {
349
+ path: meta.file.path,
350
+ baseName: meta.file.baseName
351
+ }
370
352
  }),
371
353
  children: [
372
- parser === "zod" && fileZod && zodSchemaNames.length > 0 && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
354
+ fileZod && zodSchemaNames.length > 0 && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
373
355
  name: zodSchemaNames,
374
356
  root: meta.file.path,
375
357
  path: fileZod.path
376
358
  }),
377
- clientOptions.importPath ? /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
378
- !shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
379
- name: "fetch",
380
- path: clientOptions.importPath
381
- }),
382
- /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
383
- name: [
384
- "Client",
385
- "RequestConfig",
386
- "ResponseErrorConfig"
387
- ],
388
- path: clientOptions.importPath,
389
- isTypeOnly: true
390
- }),
391
- clientOptions.dataReturnType === "full" && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
392
- name: ["ResponseConfig"],
393
- path: clientOptions.importPath,
394
- isTypeOnly: true
395
- })
396
- ] }) : /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
397
- !shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
398
- name: ["fetch"],
399
- root: meta.file.path,
400
- path: node_path.default.resolve(root, ".kubb/fetch.ts")
401
- }),
402
- /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
403
- name: [
404
- "Client",
405
- "RequestConfig",
406
- "ResponseErrorConfig"
407
- ],
408
- root: meta.file.path,
409
- path: node_path.default.resolve(root, ".kubb/fetch.ts"),
410
- isTypeOnly: true
411
- }),
412
- clientOptions.dataReturnType === "full" && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
413
- name: ["ResponseConfig"],
414
- root: meta.file.path,
415
- path: node_path.default.resolve(root, ".kubb/fetch.ts"),
416
- isTypeOnly: true
417
- })
418
- ] }),
359
+ clientOptions.importPath ? /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [!shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
360
+ name: "client",
361
+ path: clientOptions.importPath
362
+ }), /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
363
+ name: [
364
+ "Client",
365
+ "RequestConfig",
366
+ "ResponseErrorConfig"
367
+ ],
368
+ path: clientOptions.importPath,
369
+ isTypeOnly: true
370
+ })] }) : /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [!shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
371
+ name: ["client"],
372
+ root: meta.file.path,
373
+ path: node_path.default.resolve(root, ".kubb/client.ts")
374
+ }), /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
375
+ name: [
376
+ "Client",
377
+ "RequestConfig",
378
+ "ResponseErrorConfig"
379
+ ],
380
+ root: meta.file.path,
381
+ path: node_path.default.resolve(root, ".kubb/client.ts"),
382
+ isTypeOnly: true
383
+ })] }),
419
384
  shouldUseClientPlugin && clientFile && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
420
385
  name: [resolvedClientName],
421
386
  root: meta.file.path,
@@ -517,156 +482,129 @@ const infiniteQueryGenerator = (0, _kubb_core.defineGenerator)({
517
482
  });
518
483
  //#endregion
519
484
  //#region src/generators/mutationGenerator.tsx
485
+ /**
486
+ * Built-in generator for `useMutation` hooks. Emits one `useFooMutation` hook
487
+ * per POST/PUT/DELETE operation (configurable via `mutation.methods`) plus
488
+ * the matching `fooMutationKey` / `fooMutationOptions` helpers.
489
+ */
520
490
  const mutationGenerator = (0, _kubb_core.defineGenerator)({
521
491
  name: "react-query-mutation",
522
492
  renderer: _kubb_renderer_jsx.jsxRenderer,
523
493
  operation(node, ctx) {
524
- const { adapter, config, driver, resolver, root } = ctx;
525
- const { output, query, mutation, paramsCasing, paramsType, pathParamsType, parser, client: clientOptions, group, transformers, customOptions } = ctx.options;
494
+ if (!_kubb_core.ast.isHttpOperationNode(node)) return null;
495
+ const { config, driver, resolver, root } = ctx;
496
+ const { output, query, mutation, paramsCasing, paramsType, pathParamsType, parser, client: clientOptions, group, customOptions } = ctx.options;
526
497
  const pluginTs = driver.getPlugin(_kubb_plugin_ts.pluginTsName);
527
498
  if (!pluginTs) return null;
528
499
  const tsResolver = driver.getResolver(_kubb_plugin_ts.pluginTsName);
529
500
  const isQuery = query === false || !!query && query.methods.some((method) => node.method.toLowerCase() === method.toLowerCase());
530
- if (!(mutation !== false && !isQuery && (0, remeda.difference)(mutation ? mutation.methods : [], query ? query.methods : []).some((method) => node.method.toLowerCase() === method.toLowerCase()))) return null;
501
+ const queryMethods = new Set(query ? query.methods : []);
502
+ if (!(mutation !== false && !isQuery && (mutation ? mutation.methods : []).some((method) => !queryMethods.has(method) && node.method.toLowerCase() === method.toLowerCase()))) return null;
531
503
  const importPath = mutation ? mutation.importPath : "@tanstack/react-query";
532
- const baseName = resolver.resolveName(node.operationId);
533
- const capitalize = (s) => s.charAt(0).toUpperCase() + s.slice(1);
534
- const mutationHookName = require_components.transformName(`use${capitalize(baseName)}`, "function", transformers);
535
- const mutationTypeName = require_components.transformName(`${capitalize(baseName)}`, "type", transformers);
536
- const mutationOptionsName = require_components.transformName(`${baseName}MutationOptions`, "function", transformers);
537
- const mutationKeyName = require_components.transformName(`${baseName}MutationKey`, "const", transformers);
538
- const clientName = require_components.transformName(baseName, "function", transformers);
504
+ const mutationHookName = resolver.resolveMutationName(node);
505
+ const mutationTypeName = resolver.resolveMutationTypeName(node);
506
+ const mutationOptionsName = resolver.resolveMutationOptionsName(node);
507
+ const mutationKeyName = resolver.resolveMutationKeyName(node);
508
+ const clientName = resolver.resolveClientName(node);
539
509
  const meta = {
540
- file: resolver.resolveFile({
541
- name: mutationHookName,
542
- extname: ".ts",
543
- tag: node.tags[0] ?? "default",
544
- path: node.path
545
- }, {
510
+ file: resolver.resolveFile(require_components.operationFileEntry(node, mutationHookName), {
546
511
  root,
547
512
  output,
548
- group
513
+ group: group ?? void 0
549
514
  }),
550
- fileTs: tsResolver.resolveFile({
551
- name: node.operationId,
552
- extname: ".ts",
553
- tag: node.tags[0] ?? "default",
554
- path: node.path
555
- }, {
515
+ fileTs: tsResolver.resolveFile(require_components.operationFileEntry(node, node.operationId), {
556
516
  root,
557
517
  output: pluginTs.options?.output ?? output,
558
- group: pluginTs.options?.group
518
+ group: pluginTs.options?.group ?? void 0
559
519
  })
560
520
  };
561
- const casedParams = _kubb_core.ast.caseParams(node.parameters, paramsCasing);
562
- const pathParams = casedParams.filter((p) => p.in === "path");
563
- const queryParams = casedParams.filter((p) => p.in === "query");
564
- const headerParams = casedParams.filter((p) => p.in === "header");
565
- const importedTypeNames = [
566
- node.requestBody?.content?.[0]?.schema ? tsResolver.resolveDataName(node) : void 0,
567
- tsResolver.resolveResponseName(node),
568
- ...pathParams.map((p) => tsResolver.resolvePathParamsName(node, p)),
569
- ...queryParams.map((p) => tsResolver.resolveQueryParamsName(node, p)),
570
- ...headerParams.map((p) => tsResolver.resolveHeaderParamsName(node, p)),
571
- ...node.responses.map((res) => tsResolver.resolveResponseStatusName(node, res.statusCode))
572
- ].filter((name) => !!name);
573
- const pluginZod = parser === "zod" ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : void 0;
574
- const zodResolver = pluginZod ? driver.getResolver(_kubb_plugin_zod.pluginZodName) : void 0;
575
- const fileZod = zodResolver ? zodResolver.resolveFile({
576
- name: node.operationId,
577
- extname: ".ts",
578
- tag: node.tags[0] ?? "default",
579
- path: node.path
580
- }, {
521
+ const importedTypeNames = require_components.resolveOperationTypeNames(node, tsResolver, {
522
+ paramsCasing,
523
+ order: "body-response-first"
524
+ });
525
+ const pluginZod = (0, _kubb_plugin_client.isParserEnabled)(parser) ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : null;
526
+ const zodResolver = pluginZod ? driver.getResolver(_kubb_plugin_zod.pluginZodName) : null;
527
+ const fileZod = zodResolver ? zodResolver.resolveFile(require_components.operationFileEntry(node, node.operationId), {
581
528
  root,
582
529
  output: pluginZod?.options?.output ?? output,
583
- group: pluginZod?.options?.group
584
- }) : void 0;
585
- const zodSchemaNames = zodResolver && parser === "zod" ? [zodResolver.resolveResponseName?.(node), node.requestBody?.content?.[0]?.schema ? zodResolver.resolveDataName?.(node) : void 0].filter(Boolean) : [];
530
+ group: pluginZod?.options?.group ?? void 0
531
+ }) : null;
532
+ const zodSchemaNames = require_components.resolveZodSchemaNames(node, zodResolver, parser);
586
533
  const clientPlugin = driver.getPlugin(_kubb_plugin_client.pluginClientName);
587
534
  const shouldUseClientPlugin = clientPlugin?.name === _kubb_plugin_client.pluginClientName && clientOptions.clientType !== "class";
588
- const clientResolver = shouldUseClientPlugin ? driver.getResolver(_kubb_plugin_client.pluginClientName) : void 0;
589
- const clientFile = shouldUseClientPlugin ? clientResolver?.resolveFile({
590
- name: node.operationId,
591
- extname: ".ts",
592
- tag: node.tags[0] ?? "default",
593
- path: node.path
594
- }, {
535
+ const clientResolver = shouldUseClientPlugin ? driver.getResolver(_kubb_plugin_client.pluginClientName) : null;
536
+ const clientFile = shouldUseClientPlugin ? clientResolver?.resolveFile(require_components.operationFileEntry(node, node.operationId), {
595
537
  root,
596
538
  output: clientPlugin?.options?.output ?? output,
597
- group: clientPlugin?.options?.group
598
- }) : void 0;
539
+ group: clientPlugin?.options?.group ?? void 0
540
+ }) : null;
599
541
  const resolvedClientName = shouldUseClientPlugin ? clientResolver?.resolveName(node.operationId) ?? clientName : clientName;
600
542
  return /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx.File, {
601
543
  baseName: meta.file.baseName,
602
544
  path: meta.file.path,
603
545
  meta: meta.file.meta,
604
- banner: resolver.resolveBanner(adapter.inputNode, {
546
+ banner: resolver.resolveBanner(ctx.meta, {
605
547
  output,
606
- config
548
+ config,
549
+ file: {
550
+ path: meta.file.path,
551
+ baseName: meta.file.baseName
552
+ }
607
553
  }),
608
- footer: resolver.resolveFooter(adapter.inputNode, {
554
+ footer: resolver.resolveFooter(ctx.meta, {
609
555
  output,
610
- config
556
+ config,
557
+ file: {
558
+ path: meta.file.path,
559
+ baseName: meta.file.baseName
560
+ }
611
561
  }),
612
562
  children: [
613
- parser === "zod" && fileZod && zodSchemaNames.length > 0 && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
563
+ fileZod && zodSchemaNames.length > 0 && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
614
564
  name: zodSchemaNames,
615
565
  root: meta.file.path,
616
566
  path: fileZod.path
617
567
  }),
618
- clientOptions.importPath ? /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
619
- !shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
620
- name: "fetch",
621
- path: clientOptions.importPath
622
- }),
623
- /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
624
- name: [
625
- "Client",
626
- "RequestConfig",
627
- "ResponseErrorConfig"
628
- ],
629
- path: clientOptions.importPath,
630
- isTypeOnly: true
631
- }),
632
- clientOptions.dataReturnType === "full" && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
633
- name: ["ResponseConfig"],
634
- path: clientOptions.importPath,
635
- isTypeOnly: true
636
- })
637
- ] }) : /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
638
- !shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
639
- name: ["fetch"],
640
- root: meta.file.path,
641
- path: node_path.default.resolve(root, ".kubb/fetch.ts")
642
- }),
643
- /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
644
- name: [
645
- "Client",
646
- "RequestConfig",
647
- "ResponseErrorConfig"
648
- ],
649
- root: meta.file.path,
650
- path: node_path.default.resolve(root, ".kubb/fetch.ts"),
651
- isTypeOnly: true
652
- }),
653
- clientOptions.dataReturnType === "full" && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
654
- name: ["ResponseConfig"],
655
- root: meta.file.path,
656
- path: node_path.default.resolve(root, ".kubb/fetch.ts"),
657
- isTypeOnly: true
658
- })
659
- ] }),
568
+ clientOptions.importPath ? /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [!shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
569
+ name: "client",
570
+ path: clientOptions.importPath
571
+ }), /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
572
+ name: [
573
+ "Client",
574
+ "RequestConfig",
575
+ "ResponseErrorConfig"
576
+ ],
577
+ path: clientOptions.importPath,
578
+ isTypeOnly: true
579
+ })] }) : /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [!shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
580
+ name: ["client"],
581
+ root: meta.file.path,
582
+ path: node_path.default.resolve(root, ".kubb/client.ts")
583
+ }), /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
584
+ name: [
585
+ "Client",
586
+ "RequestConfig",
587
+ "ResponseErrorConfig"
588
+ ],
589
+ root: meta.file.path,
590
+ path: node_path.default.resolve(root, ".kubb/client.ts"),
591
+ isTypeOnly: true
592
+ })] }),
660
593
  shouldUseClientPlugin && clientFile && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
661
594
  name: [resolvedClientName],
662
595
  root: meta.file.path,
663
596
  path: clientFile.path
664
597
  }),
665
- !shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
598
+ !shouldUseClientPlugin && node.requestBody?.content?.some((e) => e.contentType === "multipart/form-data") && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
666
599
  name: ["buildFormData"],
667
600
  root: meta.file.path,
668
601
  path: node_path.default.resolve(root, ".kubb/config.ts")
669
602
  }),
603
+ !shouldUseClientPlugin && parser === "zod" && zodResolver && node.requestBody?.content?.[0]?.schema && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
604
+ name: ["z"],
605
+ path: "zod",
606
+ isTypeOnly: true
607
+ }),
670
608
  customOptions && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
671
609
  name: [customOptions.name],
672
610
  path: customOptions.importPath
@@ -744,147 +682,116 @@ const mutationGenerator = (0, _kubb_core.defineGenerator)({
744
682
  });
745
683
  //#endregion
746
684
  //#region src/generators/queryGenerator.tsx
685
+ /**
686
+ * Built-in generator for `useQuery` hooks. Emits one `useFooQuery` hook per
687
+ * GET operation (configurable via `query.methods`) plus the matching
688
+ * `fooQueryKey` / `fooQueryOptions` helpers.
689
+ */
747
690
  const queryGenerator = (0, _kubb_core.defineGenerator)({
748
691
  name: "react-query",
749
692
  renderer: _kubb_renderer_jsx.jsxRenderer,
750
693
  operation(node, ctx) {
751
- const { adapter, config, driver, resolver, root } = ctx;
752
- const { output, query, mutation, paramsCasing, paramsType, pathParamsType, parser, client: clientOptions, group, transformers, customOptions } = ctx.options;
694
+ if (!_kubb_core.ast.isHttpOperationNode(node)) return null;
695
+ const { config, driver, resolver, root } = ctx;
696
+ const { output, query, mutation, paramsCasing, paramsType, pathParamsType, parser, client: clientOptions, group, customOptions } = ctx.options;
753
697
  const pluginTs = driver.getPlugin(_kubb_plugin_ts.pluginTsName);
754
698
  if (!pluginTs) return null;
755
699
  const tsResolver = driver.getResolver(_kubb_plugin_ts.pluginTsName);
756
700
  const isQuery = query === false || !!query && query.methods.some((method) => node.method.toLowerCase() === method.toLowerCase());
757
- const isMutation = mutation !== false && !isQuery && (0, remeda.difference)(mutation ? mutation.methods : [], query ? query.methods : []).some((method) => node.method.toLowerCase() === method.toLowerCase());
701
+ const queryMethods = new Set(query ? query.methods : []);
702
+ const isMutation = mutation !== false && !isQuery && (mutation ? mutation.methods : []).some((method) => !queryMethods.has(method) && node.method.toLowerCase() === method.toLowerCase());
758
703
  if (!isQuery || isMutation) return null;
759
704
  const importPath = query ? query.importPath : "@tanstack/react-query";
760
- const baseName = resolver.resolveName(node.operationId);
761
- const capitalize = (s) => s.charAt(0).toUpperCase() + s.slice(1);
762
- const queryName = require_components.transformName(`use${capitalize(baseName)}`, "function", transformers);
763
- const queryOptionsName = require_components.transformName(`${baseName}QueryOptions`, "function", transformers);
764
- const queryKeyName = require_components.transformName(`${baseName}QueryKey`, "const", transformers);
765
- const queryKeyTypeName = require_components.transformName(`${capitalize(baseName)}QueryKey`, "type", transformers);
766
- const clientName = require_components.transformName(baseName, "function", transformers);
705
+ const queryName = resolver.resolveQueryName(node);
706
+ const queryOptionsName = resolver.resolveQueryOptionsName(node);
707
+ const queryKeyName = resolver.resolveQueryKeyName(node);
708
+ const queryKeyTypeName = resolver.resolveQueryKeyTypeName(node);
709
+ const clientName = resolver.resolveClientName(node);
767
710
  const meta = {
768
- file: resolver.resolveFile({
769
- name: queryName,
770
- extname: ".ts",
771
- tag: node.tags[0] ?? "default",
772
- path: node.path
773
- }, {
711
+ file: resolver.resolveFile(require_components.operationFileEntry(node, queryName), {
774
712
  root,
775
713
  output,
776
- group
714
+ group: group ?? void 0
777
715
  }),
778
- fileTs: tsResolver.resolveFile({
779
- name: node.operationId,
780
- extname: ".ts",
781
- tag: node.tags[0] ?? "default",
782
- path: node.path
783
- }, {
716
+ fileTs: tsResolver.resolveFile(require_components.operationFileEntry(node, node.operationId), {
784
717
  root,
785
718
  output: pluginTs.options?.output ?? output,
786
- group: pluginTs.options?.group
719
+ group: pluginTs.options?.group ?? void 0
787
720
  })
788
721
  };
789
- const casedParams = _kubb_core.ast.caseParams(node.parameters, paramsCasing);
790
- const pathParams = casedParams.filter((p) => p.in === "path");
791
- const queryParams = casedParams.filter((p) => p.in === "query");
792
- const headerParams = casedParams.filter((p) => p.in === "header");
793
- const importedTypeNames = [
794
- node.requestBody?.content?.[0]?.schema ? tsResolver.resolveDataName(node) : void 0,
795
- tsResolver.resolveResponseName(node),
796
- ...pathParams.map((p) => tsResolver.resolvePathParamsName(node, p)),
797
- ...queryParams.map((p) => tsResolver.resolveQueryParamsName(node, p)),
798
- ...headerParams.map((p) => tsResolver.resolveHeaderParamsName(node, p)),
799
- ...node.responses.map((res) => tsResolver.resolveResponseStatusName(node, res.statusCode))
800
- ].filter((name) => !!name && name !== queryKeyTypeName);
801
- const pluginZod = parser === "zod" ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : void 0;
802
- const zodResolver = pluginZod ? driver.getResolver(_kubb_plugin_zod.pluginZodName) : void 0;
803
- const fileZod = zodResolver ? zodResolver.resolveFile({
804
- name: node.operationId,
805
- extname: ".ts",
806
- tag: node.tags[0] ?? "default",
807
- path: node.path
808
- }, {
722
+ const importedTypeNames = require_components.resolveOperationTypeNames(node, tsResolver, {
723
+ paramsCasing,
724
+ exclude: [queryKeyTypeName],
725
+ order: "body-response-first"
726
+ });
727
+ const pluginZod = (0, _kubb_plugin_client.isParserEnabled)(parser) ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : null;
728
+ const zodResolver = pluginZod ? driver.getResolver(_kubb_plugin_zod.pluginZodName) : null;
729
+ const fileZod = zodResolver ? zodResolver.resolveFile(require_components.operationFileEntry(node, node.operationId), {
809
730
  root,
810
731
  output: pluginZod?.options?.output ?? output,
811
- group: pluginZod?.options?.group
812
- }) : void 0;
813
- const zodSchemaNames = zodResolver && parser === "zod" ? [zodResolver.resolveResponseName?.(node), node.requestBody?.content?.[0]?.schema ? zodResolver.resolveDataName?.(node) : void 0].filter(Boolean) : [];
732
+ group: pluginZod?.options?.group ?? void 0
733
+ }) : null;
734
+ const zodSchemaNames = require_components.resolveZodSchemaNames(node, zodResolver, parser);
814
735
  const clientPlugin = driver.getPlugin(_kubb_plugin_client.pluginClientName);
815
736
  const shouldUseClientPlugin = clientPlugin?.name === _kubb_plugin_client.pluginClientName && clientOptions.clientType !== "class";
816
- const clientResolver = shouldUseClientPlugin ? driver.getResolver(_kubb_plugin_client.pluginClientName) : void 0;
817
- const clientFile = shouldUseClientPlugin ? clientResolver?.resolveFile({
818
- name: node.operationId,
819
- extname: ".ts",
820
- tag: node.tags[0] ?? "default",
821
- path: node.path
822
- }, {
737
+ const clientResolver = shouldUseClientPlugin ? driver.getResolver(_kubb_plugin_client.pluginClientName) : null;
738
+ const clientFile = shouldUseClientPlugin ? clientResolver?.resolveFile(require_components.operationFileEntry(node, node.operationId), {
823
739
  root,
824
740
  output: clientPlugin?.options?.output ?? output,
825
- group: clientPlugin?.options?.group
826
- }) : void 0;
741
+ group: clientPlugin?.options?.group ?? void 0
742
+ }) : null;
827
743
  const resolvedClientName = shouldUseClientPlugin ? clientResolver?.resolveName(node.operationId) ?? clientName : clientName;
828
744
  return /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx.File, {
829
745
  baseName: meta.file.baseName,
830
746
  path: meta.file.path,
831
747
  meta: meta.file.meta,
832
- banner: resolver.resolveBanner(adapter.inputNode, {
748
+ banner: resolver.resolveBanner(ctx.meta, {
833
749
  output,
834
- config
750
+ config,
751
+ file: {
752
+ path: meta.file.path,
753
+ baseName: meta.file.baseName
754
+ }
835
755
  }),
836
- footer: resolver.resolveFooter(adapter.inputNode, {
756
+ footer: resolver.resolveFooter(ctx.meta, {
837
757
  output,
838
- config
758
+ config,
759
+ file: {
760
+ path: meta.file.path,
761
+ baseName: meta.file.baseName
762
+ }
839
763
  }),
840
764
  children: [
841
- parser === "zod" && fileZod && zodSchemaNames.length > 0 && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
765
+ fileZod && zodSchemaNames.length > 0 && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
842
766
  name: zodSchemaNames,
843
767
  root: meta.file.path,
844
768
  path: fileZod.path
845
769
  }),
846
- clientOptions.importPath ? /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
847
- !shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
848
- name: "fetch",
849
- path: clientOptions.importPath
850
- }),
851
- /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
852
- name: [
853
- "Client",
854
- "RequestConfig",
855
- "ResponseErrorConfig"
856
- ],
857
- path: clientOptions.importPath,
858
- isTypeOnly: true
859
- }),
860
- clientOptions.dataReturnType === "full" && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
861
- name: ["ResponseConfig"],
862
- path: clientOptions.importPath,
863
- isTypeOnly: true
864
- })
865
- ] }) : /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
866
- !shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
867
- name: ["fetch"],
868
- root: meta.file.path,
869
- path: node_path.default.resolve(root, ".kubb/fetch.ts")
870
- }),
871
- /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
872
- name: [
873
- "Client",
874
- "RequestConfig",
875
- "ResponseErrorConfig"
876
- ],
877
- root: meta.file.path,
878
- path: node_path.default.resolve(root, ".kubb/fetch.ts"),
879
- isTypeOnly: true
880
- }),
881
- clientOptions.dataReturnType === "full" && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
882
- name: ["ResponseConfig"],
883
- root: meta.file.path,
884
- path: node_path.default.resolve(root, ".kubb/fetch.ts"),
885
- isTypeOnly: true
886
- })
887
- ] }),
770
+ clientOptions.importPath ? /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [!shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
771
+ name: "client",
772
+ path: clientOptions.importPath
773
+ }), /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
774
+ name: [
775
+ "Client",
776
+ "RequestConfig",
777
+ "ResponseErrorConfig"
778
+ ],
779
+ path: clientOptions.importPath,
780
+ isTypeOnly: true
781
+ })] }) : /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [!shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
782
+ name: ["client"],
783
+ root: meta.file.path,
784
+ path: node_path.default.resolve(root, ".kubb/client.ts")
785
+ }), /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
786
+ name: [
787
+ "Client",
788
+ "RequestConfig",
789
+ "ResponseErrorConfig"
790
+ ],
791
+ root: meta.file.path,
792
+ path: node_path.default.resolve(root, ".kubb/client.ts"),
793
+ isTypeOnly: true
794
+ })] }),
888
795
  shouldUseClientPlugin && clientFile && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
889
796
  name: [resolvedClientName],
890
797
  root: meta.file.path,
@@ -976,154 +883,123 @@ const queryGenerator = (0, _kubb_core.defineGenerator)({
976
883
  });
977
884
  //#endregion
978
885
  //#region src/generators/suspenseInfiniteQueryGenerator.tsx
886
+ /**
887
+ * Built-in generator for `useSuspenseInfiniteQuery` hooks. Enabled when both
888
+ * `suspense` and `infinite` are configured. Combines suspense semantics with
889
+ * cursor-based pagination — handlers throw promises while loading and pull
890
+ * additional pages on demand.
891
+ */
979
892
  const suspenseInfiniteQueryGenerator = (0, _kubb_core.defineGenerator)({
980
893
  name: "react-suspense-infinite-query",
981
894
  renderer: _kubb_renderer_jsx.jsxRenderer,
982
895
  operation(node, ctx) {
983
- const { adapter, config, driver, resolver, root } = ctx;
984
- const { output, query, mutation, infinite, suspense, paramsCasing, paramsType, pathParamsType, parser, client: clientOptions, group, transformers, customOptions } = ctx.options;
896
+ if (!_kubb_core.ast.isHttpOperationNode(node)) return null;
897
+ const { config, driver, resolver, root } = ctx;
898
+ const { output, query, mutation, infinite, suspense, paramsCasing, paramsType, pathParamsType, parser, client: clientOptions, group, customOptions } = ctx.options;
985
899
  const pluginTs = driver.getPlugin(_kubb_plugin_ts.pluginTsName);
986
900
  if (!pluginTs) return null;
987
901
  const tsResolver = driver.getResolver(_kubb_plugin_ts.pluginTsName);
988
902
  const isQuery = query === false || !!query && query.methods.some((method) => node.method.toLowerCase() === method.toLowerCase());
989
- const isMutation = mutation !== false && !isQuery && (0, remeda.difference)(mutation ? mutation.methods : [], query ? query.methods : []).some((method) => node.method.toLowerCase() === method.toLowerCase());
903
+ const queryMethods = new Set(query ? query.methods : []);
904
+ const isMutation = mutation !== false && !isQuery && (mutation ? mutation.methods : []).some((method) => !queryMethods.has(method) && node.method.toLowerCase() === method.toLowerCase());
990
905
  const isSuspense = !!suspense;
991
- const infiniteOptions = infinite && typeof infinite === "object" ? infinite : void 0;
906
+ const infiniteOptions = infinite && typeof infinite === "object" ? infinite : null;
992
907
  if (!isQuery || isMutation || !isSuspense || !infiniteOptions) return null;
993
908
  const normalizeKey = (key) => key.replace(/\?$/, "");
994
- const queryParamKeys = node.parameters.filter((p) => p.in === "query").map((p) => p.name);
909
+ const queryParamKeys = require_components.getOperationParameters(node).query.map((p) => p.name);
995
910
  const hasQueryParam = infiniteOptions.queryParam ? queryParamKeys.some((k) => normalizeKey(k) === infiniteOptions.queryParam) : false;
996
911
  const hasCursorParam = !infiniteOptions.cursorParam || true;
997
912
  if (!hasQueryParam || !hasCursorParam) return null;
998
913
  const importPath = query ? query.importPath : "@tanstack/react-query";
999
- const baseName = resolver.resolveName(node.operationId);
1000
- const capitalize = (s) => s.charAt(0).toUpperCase() + s.slice(1);
1001
- const queryName = require_components.transformName(`use${capitalize(baseName)}SuspenseInfinite`, "function", transformers);
1002
- const queryOptionsName = require_components.transformName(`${baseName}SuspenseInfiniteQueryOptions`, "function", transformers);
1003
- const queryKeyName = require_components.transformName(`${baseName}SuspenseInfiniteQueryKey`, "const", transformers);
1004
- const queryKeyTypeName = require_components.transformName(`${capitalize(baseName)}SuspenseInfiniteQueryKey`, "type", transformers);
1005
- const clientBaseName = require_components.transformName(`${baseName}SuspenseInfinite`, "function", transformers);
914
+ const queryName = resolver.resolveSuspenseInfiniteQueryName(node);
915
+ const queryOptionsName = resolver.resolveSuspenseInfiniteQueryOptionsName(node);
916
+ const queryKeyName = resolver.resolveSuspenseInfiniteQueryKeyName(node);
917
+ const queryKeyTypeName = resolver.resolveSuspenseInfiniteQueryKeyTypeName(node);
918
+ const clientBaseName = resolver.resolveSuspenseInfiniteClientName(node);
1006
919
  const meta = {
1007
- file: resolver.resolveFile({
1008
- name: queryName,
1009
- extname: ".ts",
1010
- tag: node.tags[0] ?? "default",
1011
- path: node.path
1012
- }, {
920
+ file: resolver.resolveFile(require_components.operationFileEntry(node, queryName), {
1013
921
  root,
1014
922
  output,
1015
- group
923
+ group: group ?? void 0
1016
924
  }),
1017
- fileTs: tsResolver.resolveFile({
1018
- name: node.operationId,
1019
- extname: ".ts",
1020
- tag: node.tags[0] ?? "default",
1021
- path: node.path
1022
- }, {
925
+ fileTs: tsResolver.resolveFile(require_components.operationFileEntry(node, node.operationId), {
1023
926
  root,
1024
927
  output: pluginTs.options?.output ?? output,
1025
- group: pluginTs.options?.group
928
+ group: pluginTs.options?.group ?? void 0
1026
929
  })
1027
930
  };
1028
- const casedParams = _kubb_core.ast.caseParams(node.parameters, paramsCasing);
1029
- const pathParams = casedParams.filter((p) => p.in === "path");
1030
- const queryParams = casedParams.filter((p) => p.in === "query");
1031
- const headerParams = casedParams.filter((p) => p.in === "header");
1032
- const importedTypeNames = [
1033
- node.requestBody?.content?.[0]?.schema ? tsResolver.resolveDataName(node) : void 0,
1034
- tsResolver.resolveResponseName(node),
1035
- ...pathParams.map((p) => tsResolver.resolvePathParamsName(node, p)),
1036
- ...queryParams.map((p) => tsResolver.resolveQueryParamsName(node, p)),
1037
- ...headerParams.map((p) => tsResolver.resolveHeaderParamsName(node, p)),
1038
- ...node.responses.map((res) => tsResolver.resolveResponseStatusName(node, res.statusCode))
1039
- ].filter(Boolean);
1040
- const pluginZod = parser === "zod" ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : void 0;
1041
- const zodResolver = pluginZod ? driver.getResolver(_kubb_plugin_zod.pluginZodName) : void 0;
1042
- const fileZod = zodResolver ? zodResolver.resolveFile({
1043
- name: node.operationId,
1044
- extname: ".ts",
1045
- tag: node.tags[0] ?? "default",
1046
- path: node.path
1047
- }, {
931
+ const importedTypeNames = require_components.resolveOperationTypeNames(node, tsResolver, {
932
+ paramsCasing,
933
+ order: "body-response-first"
934
+ });
935
+ const pluginZod = (0, _kubb_plugin_client.isParserEnabled)(parser) ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : null;
936
+ const zodResolver = pluginZod ? driver.getResolver(_kubb_plugin_zod.pluginZodName) : null;
937
+ const fileZod = zodResolver ? zodResolver.resolveFile(require_components.operationFileEntry(node, node.operationId), {
1048
938
  root,
1049
939
  output: pluginZod?.options?.output ?? output,
1050
- group: pluginZod?.options?.group
1051
- }) : void 0;
1052
- const zodSchemaNames = zodResolver && parser === "zod" ? [zodResolver.resolveResponseName?.(node), node.requestBody?.content?.[0]?.schema ? zodResolver.resolveDataName?.(node) : void 0].filter(Boolean) : [];
940
+ group: pluginZod?.options?.group ?? void 0
941
+ }) : null;
942
+ const zodSchemaNames = require_components.resolveZodSchemaNames(node, zodResolver, parser);
1053
943
  const clientPlugin = driver.getPlugin(_kubb_plugin_client.pluginClientName);
1054
944
  const shouldUseClientPlugin = clientPlugin?.name === _kubb_plugin_client.pluginClientName && clientOptions.clientType !== "class";
1055
- const clientResolver = shouldUseClientPlugin ? driver.getResolver(_kubb_plugin_client.pluginClientName) : void 0;
1056
- const clientFile = shouldUseClientPlugin ? clientResolver?.resolveFile({
1057
- name: node.operationId,
1058
- extname: ".ts",
1059
- tag: node.tags[0] ?? "default",
1060
- path: node.path
1061
- }, {
945
+ const clientResolver = shouldUseClientPlugin ? driver.getResolver(_kubb_plugin_client.pluginClientName) : null;
946
+ const clientFile = shouldUseClientPlugin ? clientResolver?.resolveFile(require_components.operationFileEntry(node, node.operationId), {
1062
947
  root,
1063
948
  output: clientPlugin?.options?.output ?? output,
1064
- group: clientPlugin?.options?.group
1065
- }) : void 0;
949
+ group: clientPlugin?.options?.group ?? void 0
950
+ }) : null;
1066
951
  const resolvedClientName = shouldUseClientPlugin ? clientResolver?.resolveName(node.operationId) ?? clientBaseName : clientBaseName;
1067
952
  return /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx.File, {
1068
953
  baseName: meta.file.baseName,
1069
954
  path: meta.file.path,
1070
955
  meta: meta.file.meta,
1071
- banner: resolver.resolveBanner(adapter.inputNode, {
956
+ banner: resolver.resolveBanner(ctx.meta, {
1072
957
  output,
1073
- config
958
+ config,
959
+ file: {
960
+ path: meta.file.path,
961
+ baseName: meta.file.baseName
962
+ }
1074
963
  }),
1075
- footer: resolver.resolveFooter(adapter.inputNode, {
964
+ footer: resolver.resolveFooter(ctx.meta, {
1076
965
  output,
1077
- config
966
+ config,
967
+ file: {
968
+ path: meta.file.path,
969
+ baseName: meta.file.baseName
970
+ }
1078
971
  }),
1079
972
  children: [
1080
- parser === "zod" && fileZod && zodSchemaNames.length > 0 && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
973
+ fileZod && zodSchemaNames.length > 0 && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1081
974
  name: zodSchemaNames,
1082
975
  root: meta.file.path,
1083
976
  path: fileZod.path
1084
977
  }),
1085
- clientOptions.importPath ? /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
1086
- !shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1087
- name: "fetch",
1088
- path: clientOptions.importPath
1089
- }),
1090
- /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1091
- name: [
1092
- "Client",
1093
- "RequestConfig",
1094
- "ResponseErrorConfig"
1095
- ],
1096
- path: clientOptions.importPath,
1097
- isTypeOnly: true
1098
- }),
1099
- clientOptions.dataReturnType === "full" && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1100
- name: ["ResponseConfig"],
1101
- path: clientOptions.importPath,
1102
- isTypeOnly: true
1103
- })
1104
- ] }) : /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
1105
- !shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1106
- name: ["fetch"],
1107
- root: meta.file.path,
1108
- path: node_path.default.resolve(root, ".kubb/fetch.ts")
1109
- }),
1110
- /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1111
- name: [
1112
- "Client",
1113
- "RequestConfig",
1114
- "ResponseErrorConfig"
1115
- ],
1116
- root: meta.file.path,
1117
- path: node_path.default.resolve(root, ".kubb/fetch.ts"),
1118
- isTypeOnly: true
1119
- }),
1120
- clientOptions.dataReturnType === "full" && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1121
- name: ["ResponseConfig"],
1122
- root: meta.file.path,
1123
- path: node_path.default.resolve(root, ".kubb/fetch.ts"),
1124
- isTypeOnly: true
1125
- })
1126
- ] }),
978
+ clientOptions.importPath ? /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [!shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
979
+ name: "client",
980
+ path: clientOptions.importPath
981
+ }), /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
982
+ name: [
983
+ "Client",
984
+ "RequestConfig",
985
+ "ResponseErrorConfig"
986
+ ],
987
+ path: clientOptions.importPath,
988
+ isTypeOnly: true
989
+ })] }) : /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [!shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
990
+ name: ["client"],
991
+ root: meta.file.path,
992
+ path: node_path.default.resolve(root, ".kubb/client.ts")
993
+ }), /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
994
+ name: [
995
+ "Client",
996
+ "RequestConfig",
997
+ "ResponseErrorConfig"
998
+ ],
999
+ root: meta.file.path,
1000
+ path: node_path.default.resolve(root, ".kubb/client.ts"),
1001
+ isTypeOnly: true
1002
+ })] }),
1127
1003
  shouldUseClientPlugin && clientFile && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1128
1004
  name: [resolvedClientName],
1129
1005
  root: meta.file.path,
@@ -1225,147 +1101,117 @@ const suspenseInfiniteQueryGenerator = (0, _kubb_core.defineGenerator)({
1225
1101
  });
1226
1102
  //#endregion
1227
1103
  //#region src/generators/suspenseQueryGenerator.tsx
1104
+ /**
1105
+ * Built-in generator for `useSuspenseQuery` hooks. Enabled when
1106
+ * `pluginReactQuery({ suspense: {} })`. Emits one `useFooSuspenseQuery` hook
1107
+ * per query operation. Suspense queries throw promises while loading and
1108
+ * require a `<Suspense>` boundary in the React tree. TanStack Query v5+ only.
1109
+ */
1228
1110
  const suspenseQueryGenerator = (0, _kubb_core.defineGenerator)({
1229
1111
  name: "react-suspense-query",
1230
1112
  renderer: _kubb_renderer_jsx.jsxRenderer,
1231
1113
  operation(node, ctx) {
1232
- const { adapter, config, driver, resolver, root } = ctx;
1233
- const { output, query, mutation, suspense, paramsCasing, paramsType, pathParamsType, parser, client: clientOptions, group, transformers, customOptions } = ctx.options;
1114
+ if (!_kubb_core.ast.isHttpOperationNode(node)) return null;
1115
+ const { config, driver, resolver, root } = ctx;
1116
+ const { output, query, mutation, suspense, paramsCasing, paramsType, pathParamsType, parser, client: clientOptions, group, customOptions } = ctx.options;
1234
1117
  const pluginTs = driver.getPlugin(_kubb_plugin_ts.pluginTsName);
1235
1118
  if (!pluginTs) return null;
1236
1119
  const tsResolver = driver.getResolver(_kubb_plugin_ts.pluginTsName);
1237
1120
  const isQuery = query === false || !!query && query.methods.some((method) => node.method.toLowerCase() === method.toLowerCase());
1238
- const isMutation = mutation !== false && !isQuery && (0, remeda.difference)(mutation ? mutation.methods : [], query ? query.methods : []).some((method) => node.method.toLowerCase() === method.toLowerCase());
1121
+ const queryMethods = new Set(query ? query.methods : []);
1122
+ const isMutation = mutation !== false && !isQuery && (mutation ? mutation.methods : []).some((method) => !queryMethods.has(method) && node.method.toLowerCase() === method.toLowerCase());
1239
1123
  if (!isQuery || isMutation || !!!suspense) return null;
1240
1124
  const importPath = query ? query.importPath : "@tanstack/react-query";
1241
- const baseName = resolver.resolveName(node.operationId);
1242
- const capitalize = (s) => s.charAt(0).toUpperCase() + s.slice(1);
1243
- const queryName = require_components.transformName(`use${capitalize(baseName)}Suspense`, "function", transformers);
1244
- const queryOptionsName = require_components.transformName(`${baseName}SuspenseQueryOptions`, "function", transformers);
1245
- const queryKeyName = require_components.transformName(`${baseName}SuspenseQueryKey`, "const", transformers);
1246
- const queryKeyTypeName = require_components.transformName(`${capitalize(baseName)}SuspenseQueryKey`, "type", transformers);
1247
- const clientName = require_components.transformName(`${baseName}Suspense`, "function", transformers);
1125
+ const queryName = resolver.resolveSuspenseQueryName(node);
1126
+ const queryOptionsName = resolver.resolveSuspenseQueryOptionsName(node);
1127
+ const queryKeyName = resolver.resolveSuspenseQueryKeyName(node);
1128
+ const queryKeyTypeName = resolver.resolveSuspenseQueryKeyTypeName(node);
1129
+ const clientName = resolver.resolveSuspenseClientName(node);
1248
1130
  const meta = {
1249
- file: resolver.resolveFile({
1250
- name: queryName,
1251
- extname: ".ts",
1252
- tag: node.tags[0] ?? "default",
1253
- path: node.path
1254
- }, {
1131
+ file: resolver.resolveFile(require_components.operationFileEntry(node, queryName), {
1255
1132
  root,
1256
1133
  output,
1257
- group
1134
+ group: group ?? void 0
1258
1135
  }),
1259
- fileTs: tsResolver.resolveFile({
1260
- name: node.operationId,
1261
- extname: ".ts",
1262
- tag: node.tags[0] ?? "default",
1263
- path: node.path
1264
- }, {
1136
+ fileTs: tsResolver.resolveFile(require_components.operationFileEntry(node, node.operationId), {
1265
1137
  root,
1266
1138
  output: pluginTs.options?.output ?? output,
1267
- group: pluginTs.options?.group
1139
+ group: pluginTs.options?.group ?? void 0
1268
1140
  })
1269
1141
  };
1270
- const casedParams = _kubb_core.ast.caseParams(node.parameters, paramsCasing);
1271
- const pathParams = casedParams.filter((p) => p.in === "path");
1272
- const queryParams = casedParams.filter((p) => p.in === "query");
1273
- const headerParams = casedParams.filter((p) => p.in === "header");
1274
- const importedTypeNames = [
1275
- node.requestBody?.content?.[0]?.schema ? tsResolver.resolveDataName(node) : void 0,
1276
- tsResolver.resolveResponseName(node),
1277
- ...pathParams.map((p) => tsResolver.resolvePathParamsName(node, p)),
1278
- ...queryParams.map((p) => tsResolver.resolveQueryParamsName(node, p)),
1279
- ...headerParams.map((p) => tsResolver.resolveHeaderParamsName(node, p)),
1280
- ...node.responses.map((res) => tsResolver.resolveResponseStatusName(node, res.statusCode))
1281
- ].filter((name) => !!name && name !== queryKeyTypeName);
1282
- const pluginZod = parser === "zod" ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : void 0;
1283
- const zodResolver = pluginZod ? driver.getResolver(_kubb_plugin_zod.pluginZodName) : void 0;
1284
- const fileZod = zodResolver ? zodResolver.resolveFile({
1285
- name: node.operationId,
1286
- extname: ".ts",
1287
- tag: node.tags[0] ?? "default",
1288
- path: node.path
1289
- }, {
1142
+ const importedTypeNames = require_components.resolveOperationTypeNames(node, tsResolver, {
1143
+ paramsCasing,
1144
+ exclude: [queryKeyTypeName],
1145
+ order: "body-response-first"
1146
+ });
1147
+ const pluginZod = (0, _kubb_plugin_client.isParserEnabled)(parser) ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : null;
1148
+ const zodResolver = pluginZod ? driver.getResolver(_kubb_plugin_zod.pluginZodName) : null;
1149
+ const fileZod = zodResolver ? zodResolver.resolveFile(require_components.operationFileEntry(node, node.operationId), {
1290
1150
  root,
1291
1151
  output: pluginZod?.options?.output ?? output,
1292
- group: pluginZod?.options?.group
1293
- }) : void 0;
1294
- const zodSchemaNames = zodResolver && parser === "zod" ? [zodResolver.resolveResponseName?.(node), node.requestBody?.content?.[0]?.schema ? zodResolver.resolveDataName?.(node) : void 0].filter(Boolean) : [];
1152
+ group: pluginZod?.options?.group ?? void 0
1153
+ }) : null;
1154
+ const zodSchemaNames = require_components.resolveZodSchemaNames(node, zodResolver, parser);
1295
1155
  const clientPlugin = driver.getPlugin(_kubb_plugin_client.pluginClientName);
1296
1156
  const shouldUseClientPlugin = clientPlugin?.name === _kubb_plugin_client.pluginClientName && clientOptions.clientType !== "class";
1297
- const clientResolver = shouldUseClientPlugin ? driver.getResolver(_kubb_plugin_client.pluginClientName) : void 0;
1298
- const clientFile = shouldUseClientPlugin ? clientResolver?.resolveFile({
1299
- name: node.operationId,
1300
- extname: ".ts",
1301
- tag: node.tags[0] ?? "default",
1302
- path: node.path
1303
- }, {
1157
+ const clientResolver = shouldUseClientPlugin ? driver.getResolver(_kubb_plugin_client.pluginClientName) : null;
1158
+ const clientFile = shouldUseClientPlugin ? clientResolver?.resolveFile(require_components.operationFileEntry(node, node.operationId), {
1304
1159
  root,
1305
1160
  output: clientPlugin?.options?.output ?? output,
1306
- group: clientPlugin?.options?.group
1307
- }) : void 0;
1161
+ group: clientPlugin?.options?.group ?? void 0
1162
+ }) : null;
1308
1163
  const resolvedClientName = shouldUseClientPlugin ? clientResolver?.resolveName(node.operationId) ?? clientName : clientName;
1309
1164
  return /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx.File, {
1310
1165
  baseName: meta.file.baseName,
1311
1166
  path: meta.file.path,
1312
1167
  meta: meta.file.meta,
1313
- banner: resolver.resolveBanner(adapter.inputNode, {
1168
+ banner: resolver.resolveBanner(ctx.meta, {
1314
1169
  output,
1315
- config
1170
+ config,
1171
+ file: {
1172
+ path: meta.file.path,
1173
+ baseName: meta.file.baseName
1174
+ }
1316
1175
  }),
1317
- footer: resolver.resolveFooter(adapter.inputNode, {
1176
+ footer: resolver.resolveFooter(ctx.meta, {
1318
1177
  output,
1319
- config
1178
+ config,
1179
+ file: {
1180
+ path: meta.file.path,
1181
+ baseName: meta.file.baseName
1182
+ }
1320
1183
  }),
1321
1184
  children: [
1322
- parser === "zod" && fileZod && zodSchemaNames.length > 0 && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1185
+ fileZod && zodSchemaNames.length > 0 && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1323
1186
  name: zodSchemaNames,
1324
1187
  root: meta.file.path,
1325
1188
  path: fileZod.path
1326
1189
  }),
1327
- clientOptions.importPath ? /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
1328
- !shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1329
- name: "fetch",
1330
- path: clientOptions.importPath
1331
- }),
1332
- /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1333
- name: [
1334
- "Client",
1335
- "RequestConfig",
1336
- "ResponseErrorConfig"
1337
- ],
1338
- path: clientOptions.importPath,
1339
- isTypeOnly: true
1340
- }),
1341
- clientOptions.dataReturnType === "full" && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1342
- name: ["ResponseConfig"],
1343
- path: clientOptions.importPath,
1344
- isTypeOnly: true
1345
- })
1346
- ] }) : /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
1347
- !shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1348
- name: ["fetch"],
1349
- root: meta.file.path,
1350
- path: node_path.default.resolve(root, ".kubb/fetch.ts")
1351
- }),
1352
- /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1353
- name: [
1354
- "Client",
1355
- "RequestConfig",
1356
- "ResponseErrorConfig"
1357
- ],
1358
- root: meta.file.path,
1359
- path: node_path.default.resolve(root, ".kubb/fetch.ts"),
1360
- isTypeOnly: true
1361
- }),
1362
- clientOptions.dataReturnType === "full" && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1363
- name: ["ResponseConfig"],
1364
- root: meta.file.path,
1365
- path: node_path.default.resolve(root, ".kubb/fetch.ts"),
1366
- isTypeOnly: true
1367
- })
1368
- ] }),
1190
+ clientOptions.importPath ? /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [!shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1191
+ name: "client",
1192
+ path: clientOptions.importPath
1193
+ }), /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1194
+ name: [
1195
+ "Client",
1196
+ "RequestConfig",
1197
+ "ResponseErrorConfig"
1198
+ ],
1199
+ path: clientOptions.importPath,
1200
+ isTypeOnly: true
1201
+ })] }) : /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [!shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1202
+ name: ["client"],
1203
+ root: meta.file.path,
1204
+ path: node_path.default.resolve(root, ".kubb/client.ts")
1205
+ }), /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1206
+ name: [
1207
+ "Client",
1208
+ "RequestConfig",
1209
+ "ResponseErrorConfig"
1210
+ ],
1211
+ root: meta.file.path,
1212
+ path: node_path.default.resolve(root, ".kubb/client.ts"),
1213
+ isTypeOnly: true
1214
+ })] }),
1369
1215
  shouldUseClientPlugin && clientFile && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1370
1216
  name: [resolvedClientName],
1371
1217
  root: meta.file.path,
@@ -1420,7 +1266,8 @@ const suspenseQueryGenerator = (0, _kubb_core.defineGenerator)({
1420
1266
  paramsCasing,
1421
1267
  paramsType,
1422
1268
  pathParamsType,
1423
- dataReturnType: clientOptions.dataReturnType || "data"
1269
+ dataReturnType: clientOptions.dataReturnType || "data",
1270
+ suspense: true
1424
1271
  }),
1425
1272
  suspense && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
1426
1273
  /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
@@ -1499,4 +1346,4 @@ Object.defineProperty(exports, "suspenseQueryGenerator", {
1499
1346
  }
1500
1347
  });
1501
1348
 
1502
- //# sourceMappingURL=generators-CWEQsdO9.cjs.map
1349
+ //# sourceMappingURL=generators-zGKP8yII.cjs.map