@kubb/plugin-react-query 5.0.0-beta.3 → 5.0.0-beta.30

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 (48) hide show
  1. package/README.md +34 -83
  2. package/dist/{components-DTGLu4UV.js → components-CDmg-RPi.js} +275 -255
  3. package/dist/components-CDmg-RPi.js.map +1 -0
  4. package/dist/{components-dAKJEn9b.cjs → components-MPBTffPl.cjs} +299 -255
  5. package/dist/components-MPBTffPl.cjs.map +1 -0
  6. package/dist/components.cjs +1 -1
  7. package/dist/components.d.ts +1 -75
  8. package/dist/components.js +1 -1
  9. package/dist/{generators-C_fbcjpG.js → generators-Bma51Uar.js} +301 -261
  10. package/dist/generators-Bma51Uar.js.map +1 -0
  11. package/dist/{generators-CWEQsdO9.cjs → generators-BtsWNz-6.cjs} +299 -259
  12. package/dist/generators-BtsWNz-6.cjs.map +1 -0
  13. package/dist/generators.cjs +1 -1
  14. package/dist/generators.d.ts +41 -1
  15. package/dist/generators.js +1 -1
  16. package/dist/index.cjs +143 -20
  17. package/dist/index.cjs.map +1 -1
  18. package/dist/index.d.ts +30 -1
  19. package/dist/index.js +143 -20
  20. package/dist/index.js.map +1 -1
  21. package/dist/types-DiZPLTXl.d.ts +400 -0
  22. package/extension.yaml +1507 -0
  23. package/package.json +16 -18
  24. package/src/components/InfiniteQuery.tsx +19 -13
  25. package/src/components/InfiniteQueryOptions.tsx +29 -47
  26. package/src/components/Mutation.tsx +35 -15
  27. package/src/components/MutationOptions.tsx +14 -13
  28. package/src/components/Query.tsx +9 -10
  29. package/src/components/QueryOptions.tsx +6 -27
  30. package/src/components/SuspenseInfiniteQuery.tsx +19 -13
  31. package/src/components/SuspenseInfiniteQueryOptions.tsx +29 -47
  32. package/src/components/SuspenseQuery.tsx +9 -10
  33. package/src/generators/customHookOptionsFileGenerator.tsx +18 -14
  34. package/src/generators/hookOptionsGenerator.tsx +36 -33
  35. package/src/generators/infiniteQueryGenerator.tsx +46 -64
  36. package/src/generators/mutationGenerator.tsx +42 -50
  37. package/src/generators/queryGenerator.tsx +43 -49
  38. package/src/generators/suspenseInfiniteQueryGenerator.tsx +41 -51
  39. package/src/generators/suspenseQueryGenerator.tsx +44 -62
  40. package/src/plugin.ts +42 -16
  41. package/src/resolvers/resolverReactQuery.ts +102 -6
  42. package/src/types.ts +199 -61
  43. package/src/utils.ts +10 -33
  44. package/dist/components-DTGLu4UV.js.map +0 -1
  45. package/dist/components-dAKJEn9b.cjs.map +0 -1
  46. package/dist/generators-CWEQsdO9.cjs.map +0 -1
  47. package/dist/generators-C_fbcjpG.js.map +0 -1
  48. package/dist/types-DfaFRSBf.d.ts +0 -284
@@ -1,4 +1,4 @@
1
- const require_components = require("./components-dAKJEn9b.cjs");
1
+ const require_components = require("./components-MPBTffPl.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");
@@ -11,21 +11,28 @@ let node_fs = require("node:fs");
11
11
  node_fs = require_components.__toESM(node_fs);
12
12
  let remeda = require("remeda");
13
13
  //#region src/generators/customHookOptionsFileGenerator.tsx
14
+ /**
15
+ * Scaffolds the user-editable `useCustomHookOptions` file when
16
+ * `pluginReactQuery({ customOptions: { ... } })` is configured. The file is
17
+ * only created when it does not already exist, so user edits persist across
18
+ * regeneration.
19
+ */
14
20
  const customHookOptionsFileGenerator = (0, _kubb_core.defineGenerator)({
15
21
  name: "react-query-custom-hook-options-file",
16
- renderer: _kubb_renderer_jsx.jsxRenderer,
22
+ renderer: _kubb_renderer_jsx.jsxRendererSync,
17
23
  operations(nodes, ctx) {
18
24
  const { resolver, config, root } = ctx;
19
- const { output, customOptions, query, group, transformers } = ctx.options;
25
+ const { output, customOptions, query, group } = ctx.options;
20
26
  if (!customOptions) return null;
21
27
  const override = output.override ?? config.output.override ?? false;
22
28
  const { importPath, name } = customOptions;
29
+ const hookOptionsName = resolver.resolveHookOptionsName();
30
+ const customHookOptionsName = resolver.resolveCustomHookOptionsName();
23
31
  const reactQueryImportPath = query ? query.importPath : "@tanstack/react-query";
24
- const capitalize = (s) => s.charAt(0).toUpperCase() + s.slice(1);
25
32
  let hookFilePath;
26
33
  const firstNode = nodes[0];
27
34
  if (firstNode) {
28
- const hookName = require_components.transformName(`use${capitalize(resolver.resolveName(firstNode.operationId))}`, "function", transformers);
35
+ const hookName = resolver.resolveQueryName(firstNode);
29
36
  hookFilePath = resolver.resolveFile({
30
37
  name: hookName,
31
38
  extname: ".ts",
@@ -34,7 +41,7 @@ const customHookOptionsFileGenerator = (0, _kubb_core.defineGenerator)({
34
41
  }, {
35
42
  root,
36
43
  output,
37
- group
44
+ group: group ?? void 0
38
45
  }).path;
39
46
  } else hookFilePath = node_path.default.resolve(root, "index.ts");
40
47
  const ensureExtension = (filePath, extname) => {
@@ -63,7 +70,7 @@ const customHookOptionsFileGenerator = (0, _kubb_core.defineGenerator)({
63
70
  path: reactQueryImportPath
64
71
  }),
65
72
  /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
66
- name: ["HookOptions"],
73
+ name: [hookOptionsName],
67
74
  root: file.path,
68
75
  path: node_path.default.resolve(root, "./index.ts")
69
76
  }),
@@ -72,9 +79,9 @@ const customHookOptionsFileGenerator = (0, _kubb_core.defineGenerator)({
72
79
  isExportable: true,
73
80
  isIndexable: true,
74
81
  children: [/* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.Function, {
75
- name: "getCustomHookOptions",
82
+ name: customHookOptionsName,
76
83
  params: "{ queryClient }: { queryClient: QueryClient }",
77
- returnType: "Partial<HookOptions>",
84
+ returnType: `Partial<${hookOptionsName}>`,
78
85
  children: `return {
79
86
  // TODO: Define custom hook options here
80
87
  // Example:
@@ -86,12 +93,12 @@ const customHookOptionsFileGenerator = (0, _kubb_core.defineGenerator)({
86
93
  }`
87
94
  }), /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.Function, {
88
95
  name,
89
- generics: "T extends keyof HookOptions",
96
+ generics: `T extends keyof ${hookOptionsName}`,
90
97
  params: "{ hookName, operationId }: { hookName: T, operationId: string }",
91
- returnType: "HookOptions[T]",
98
+ returnType: `${hookOptionsName}[T]`,
92
99
  export: true,
93
100
  children: `const queryClient = useQueryClient()
94
- const customOptions = getCustomHookOptions({ queryClient })
101
+ const customOptions = ${customHookOptionsName}({ queryClient })
95
102
  return customOptions[hookName] ?? {}`
96
103
  })]
97
104
  })
@@ -101,43 +108,48 @@ const customHookOptionsFileGenerator = (0, _kubb_core.defineGenerator)({
101
108
  });
102
109
  //#endregion
103
110
  //#region src/generators/hookOptionsGenerator.tsx
111
+ /**
112
+ * Emits the `HookOptions` type used by `customOptions`. Enabled when
113
+ * `pluginReactQuery({ customOptions: { ... } })`. The generated type lists
114
+ * every hook keyed by name so user-supplied options stay in sync with the
115
+ * generated hooks at compile time.
116
+ */
104
117
  const hookOptionsGenerator = (0, _kubb_core.defineGenerator)({
105
118
  name: "react-query-hook-options",
106
- renderer: _kubb_renderer_jsx.jsxRenderer,
119
+ renderer: _kubb_renderer_jsx.jsxRendererSync,
107
120
  operations(nodes, ctx) {
108
- const { resolver, config, root, adapter } = ctx;
109
- const { output, customOptions, query, mutation, suspense, infinite, group, transformers, override } = ctx.options;
121
+ const { resolver, config, root } = ctx;
122
+ const { output, customOptions, query, mutation, suspense, infinite, group, override } = ctx.options;
110
123
  if (!customOptions) return null;
124
+ const name = resolver.resolveHookOptionsName();
111
125
  const resolvedFile = resolver.resolveFile({
112
- name: "HookOptions",
126
+ name,
113
127
  extname: ".ts"
114
128
  }, {
115
129
  root,
116
130
  output,
117
- group
131
+ group: group ?? void 0
118
132
  });
119
133
  const hookOptionsFile = {
120
134
  ...resolvedFile,
121
- baseName: "HookOptions.ts",
122
- path: resolvedFile.path.replace(/hookOptions\.ts$/, "HookOptions.ts")
135
+ baseName: `${name}.ts`,
136
+ path: resolvedFile.path.replace(/[^/\\]+\.ts$/, `${name}.ts`)
123
137
  };
124
- const capitalize = (s) => s.charAt(0).toUpperCase() + s.slice(1);
125
138
  const imports = [];
126
139
  const hookOptions = {};
127
140
  for (const node of nodes) {
128
- const baseName = resolver.resolveName(node.operationId);
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
147
  const isMutationOp = nodeMutation !== false && !isQueryOp && (0, remeda.difference)(nodeMutation ? nodeMutation.methods : [], nodeQuery ? nodeQuery.methods : []).some((m) => node.method.toLowerCase() === m.toLowerCase());
136
148
  const isSuspenseOp = !!suspense;
137
149
  const isInfiniteOp = !!nodeInfiniteOptions;
138
150
  if (isQueryOp) {
139
- const queryOptionsName = require_components.transformName(`${baseName}QueryOptions`, "function", transformers);
140
- const queryHookName = require_components.transformName(`use${capitalize(baseName)}`, "function", transformers);
151
+ const queryOptionsName = resolver.resolveQueryOptionsName(node);
152
+ const queryHookName = resolver.resolveQueryName(node);
141
153
  const queryHookFile = resolver.resolveFile({
142
154
  name: queryHookName,
143
155
  extname: ".ts",
@@ -146,7 +158,7 @@ const hookOptionsGenerator = (0, _kubb_core.defineGenerator)({
146
158
  }, {
147
159
  root,
148
160
  output,
149
- group
161
+ group: group ?? void 0
150
162
  });
151
163
  imports.push(/* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
152
164
  name: [queryOptionsName],
@@ -155,8 +167,8 @@ const hookOptionsGenerator = (0, _kubb_core.defineGenerator)({
155
167
  }));
156
168
  hookOptions[queryHookName] = `Partial<ReturnType<typeof ${queryOptionsName}>>`;
157
169
  if (isSuspenseOp) {
158
- const suspenseOptionsName = require_components.transformName(`${baseName}SuspenseQueryOptions`, "function", transformers);
159
- const suspenseHookName = require_components.transformName(`use${capitalize(baseName)}Suspense`, "function", transformers);
170
+ const suspenseOptionsName = resolver.resolveSuspenseQueryOptionsName(node);
171
+ const suspenseHookName = resolver.resolveSuspenseQueryName(node);
160
172
  const suspenseHookFile = resolver.resolveFile({
161
173
  name: suspenseHookName,
162
174
  extname: ".ts",
@@ -165,7 +177,7 @@ const hookOptionsGenerator = (0, _kubb_core.defineGenerator)({
165
177
  }, {
166
178
  root,
167
179
  output,
168
- group
180
+ group: group ?? void 0
169
181
  });
170
182
  imports.push(/* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
171
183
  name: [suspenseOptionsName],
@@ -176,10 +188,10 @@ const hookOptionsGenerator = (0, _kubb_core.defineGenerator)({
176
188
  }
177
189
  if (isInfiniteOp) {
178
190
  const normalizeKey = (key) => key.replace(/\?$/, "");
179
- const queryParamKeys = node.parameters.filter((p) => p.in === "query").map((p) => p.name);
191
+ const queryParamKeys = require_components.getOperationParameters(node).query.map((p) => p.name);
180
192
  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);
193
+ const infiniteOptionsName = resolver.resolveInfiniteQueryOptionsName(node);
194
+ const infiniteHookName = resolver.resolveInfiniteQueryName(node);
183
195
  const infiniteHookFile = resolver.resolveFile({
184
196
  name: infiniteHookName,
185
197
  extname: ".ts",
@@ -188,7 +200,7 @@ const hookOptionsGenerator = (0, _kubb_core.defineGenerator)({
188
200
  }, {
189
201
  root,
190
202
  output,
191
- group
203
+ group: group ?? void 0
192
204
  });
193
205
  imports.push(/* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
194
206
  name: [infiniteOptionsName],
@@ -197,8 +209,8 @@ const hookOptionsGenerator = (0, _kubb_core.defineGenerator)({
197
209
  }));
198
210
  hookOptions[infiniteHookName] = `Partial<ReturnType<typeof ${infiniteOptionsName}>>`;
199
211
  if (isSuspenseOp) {
200
- const suspenseInfiniteOptionsName = require_components.transformName(`${baseName}SuspenseInfiniteQueryOptions`, "function", transformers);
201
- const suspenseInfiniteHookName = require_components.transformName(`use${capitalize(baseName)}SuspenseInfinite`, "function", transformers);
212
+ const suspenseInfiniteOptionsName = resolver.resolveSuspenseInfiniteQueryOptionsName(node);
213
+ const suspenseInfiniteHookName = resolver.resolveSuspenseInfiniteQueryName(node);
202
214
  const suspenseInfiniteHookFile = resolver.resolveFile({
203
215
  name: suspenseInfiniteHookName,
204
216
  extname: ".ts",
@@ -207,7 +219,7 @@ const hookOptionsGenerator = (0, _kubb_core.defineGenerator)({
207
219
  }, {
208
220
  root,
209
221
  output,
210
- group
222
+ group: group ?? void 0
211
223
  });
212
224
  imports.push(/* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
213
225
  name: [suspenseInfiniteOptionsName],
@@ -220,8 +232,8 @@ const hookOptionsGenerator = (0, _kubb_core.defineGenerator)({
220
232
  }
221
233
  }
222
234
  if (isMutationOp) {
223
- const mutationOptionsName = require_components.transformName(`${baseName}MutationOptions`, "function", transformers);
224
- const mutationHookName = require_components.transformName(`use${capitalize(baseName)}`, "function", transformers);
235
+ const mutationOptionsName = resolver.resolveMutationOptionsName(node);
236
+ const mutationHookName = resolver.resolveMutationName(node);
225
237
  const mutationHookFile = resolver.resolveFile({
226
238
  name: mutationHookName,
227
239
  extname: ".ts",
@@ -230,7 +242,7 @@ const hookOptionsGenerator = (0, _kubb_core.defineGenerator)({
230
242
  }, {
231
243
  root,
232
244
  output,
233
- group
245
+ group: group ?? void 0
234
246
  });
235
247
  imports.push(/* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
236
248
  name: [mutationOptionsName],
@@ -240,18 +252,25 @@ const hookOptionsGenerator = (0, _kubb_core.defineGenerator)({
240
252
  hookOptions[mutationHookName] = `Partial<ReturnType<typeof ${mutationOptionsName}>>`;
241
253
  }
242
254
  }
243
- const name = "HookOptions";
244
255
  return /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx.File, {
245
256
  baseName: hookOptionsFile.baseName,
246
257
  path: hookOptionsFile.path,
247
258
  meta: hookOptionsFile.meta,
248
- banner: resolver.resolveBanner(adapter.inputNode, {
259
+ banner: resolver.resolveBanner(ctx.meta, {
249
260
  output,
250
- config
261
+ config,
262
+ file: {
263
+ path: hookOptionsFile.path,
264
+ baseName: hookOptionsFile.baseName
265
+ }
251
266
  }),
252
- footer: resolver.resolveFooter(adapter.inputNode, {
267
+ footer: resolver.resolveFooter(ctx.meta, {
253
268
  output,
254
- config
269
+ config,
270
+ file: {
271
+ path: hookOptionsFile.path,
272
+ baseName: hookOptionsFile.baseName
273
+ }
255
274
  }),
256
275
  children: [imports, /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Source, {
257
276
  name,
@@ -269,32 +288,36 @@ const hookOptionsGenerator = (0, _kubb_core.defineGenerator)({
269
288
  });
270
289
  //#endregion
271
290
  //#region src/generators/infiniteQueryGenerator.tsx
291
+ /**
292
+ * Built-in generator for `useInfiniteQuery` hooks. Enabled when
293
+ * `pluginReactQuery({ infinite: { ... } })`. Emits one `useFooInfiniteQuery`
294
+ * hook per query operation, wiring the configured `nextParam` /
295
+ * `previousParam` paths into TanStack Query's cursor-based pagination.
296
+ */
272
297
  const infiniteQueryGenerator = (0, _kubb_core.defineGenerator)({
273
298
  name: "react-infinite-query",
274
- renderer: _kubb_renderer_jsx.jsxRenderer,
299
+ renderer: _kubb_renderer_jsx.jsxRendererSync,
275
300
  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;
301
+ const { config, driver, resolver, root } = ctx;
302
+ const { output, query, mutation, infinite, paramsCasing, paramsType, pathParamsType, parser, client: clientOptions, group, customOptions } = ctx.options;
278
303
  const pluginTs = driver.getPlugin(_kubb_plugin_ts.pluginTsName);
279
304
  if (!pluginTs) return null;
280
305
  const tsResolver = driver.getResolver(_kubb_plugin_ts.pluginTsName);
281
306
  const isQuery = query === false || !!query && query.methods.some((method) => node.method.toLowerCase() === method.toLowerCase());
282
307
  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;
308
+ const infiniteOptions = infinite && typeof infinite === "object" ? infinite : null;
284
309
  if (!isQuery || isMutation || !infiniteOptions) return null;
285
310
  const normalizeKey = (key) => key.replace(/\?$/, "");
286
- const queryParamKeys = node.parameters.filter((p) => p.in === "query").map((p) => p.name);
311
+ const queryParamKeys = require_components.getOperationParameters(node).query.map((p) => p.name);
287
312
  const hasQueryParam = infiniteOptions.queryParam ? queryParamKeys.some((k) => normalizeKey(k) === infiniteOptions.queryParam) : false;
288
313
  const hasCursorParam = !infiniteOptions.cursorParam || true;
289
314
  if (!hasQueryParam || !hasCursorParam) return null;
290
315
  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);
316
+ const queryName = resolver.resolveInfiniteQueryName(node);
317
+ const queryOptionsName = resolver.resolveInfiniteQueryOptionsName(node);
318
+ const queryKeyName = resolver.resolveInfiniteQueryKeyName(node);
319
+ const queryKeyTypeName = resolver.resolveInfiniteQueryKeyTypeName(node);
320
+ const clientBaseName = resolver.resolveInfiniteClientName(node);
298
321
  const meta = {
299
322
  file: resolver.resolveFile({
300
323
  name: queryName,
@@ -304,7 +327,7 @@ const infiniteQueryGenerator = (0, _kubb_core.defineGenerator)({
304
327
  }, {
305
328
  root,
306
329
  output,
307
- group
330
+ group: group ?? void 0
308
331
  }),
309
332
  fileTs: tsResolver.resolveFile({
310
333
  name: node.operationId,
@@ -314,23 +337,16 @@ const infiniteQueryGenerator = (0, _kubb_core.defineGenerator)({
314
337
  }, {
315
338
  root,
316
339
  output: pluginTs.options?.output ?? output,
317
- group: pluginTs.options?.group
340
+ group: pluginTs.options?.group ?? void 0
318
341
  })
319
342
  };
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;
343
+ const importedTypeNames = require_components.resolveOperationTypeNames(node, tsResolver, {
344
+ paramsCasing,
345
+ exclude: [queryKeyTypeName],
346
+ order: "body-response-first"
347
+ });
348
+ const pluginZod = parser === "zod" ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : null;
349
+ const zodResolver = pluginZod ? driver.getResolver(_kubb_plugin_zod.pluginZodName) : null;
334
350
  const fileZod = zodResolver ? zodResolver.resolveFile({
335
351
  name: node.operationId,
336
352
  extname: ".ts",
@@ -339,12 +355,12 @@ const infiniteQueryGenerator = (0, _kubb_core.defineGenerator)({
339
355
  }, {
340
356
  root,
341
357
  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) : [];
358
+ group: pluginZod?.options?.group ?? void 0
359
+ }) : null;
360
+ const zodSchemaNames = require_components.resolveZodSchemaNames(node, zodResolver);
345
361
  const clientPlugin = driver.getPlugin(_kubb_plugin_client.pluginClientName);
346
362
  const shouldUseClientPlugin = clientPlugin?.name === _kubb_plugin_client.pluginClientName && clientOptions.clientType !== "class";
347
- const clientResolver = shouldUseClientPlugin ? driver.getResolver(_kubb_plugin_client.pluginClientName) : void 0;
363
+ const clientResolver = shouldUseClientPlugin ? driver.getResolver(_kubb_plugin_client.pluginClientName) : null;
348
364
  const clientFile = shouldUseClientPlugin ? clientResolver?.resolveFile({
349
365
  name: node.operationId,
350
366
  extname: ".ts",
@@ -353,30 +369,38 @@ const infiniteQueryGenerator = (0, _kubb_core.defineGenerator)({
353
369
  }, {
354
370
  root,
355
371
  output: clientPlugin?.options?.output ?? output,
356
- group: clientPlugin?.options?.group
357
- }) : void 0;
372
+ group: clientPlugin?.options?.group ?? void 0
373
+ }) : null;
358
374
  const resolvedClientName = shouldUseClientPlugin ? clientResolver?.resolveName(node.operationId) ?? clientBaseName : clientBaseName;
359
375
  return /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx.File, {
360
376
  baseName: meta.file.baseName,
361
377
  path: meta.file.path,
362
378
  meta: meta.file.meta,
363
- banner: resolver.resolveBanner(adapter.inputNode, {
379
+ banner: resolver.resolveBanner(ctx.meta, {
364
380
  output,
365
- config
381
+ config,
382
+ file: {
383
+ path: meta.file.path,
384
+ baseName: meta.file.baseName
385
+ }
366
386
  }),
367
- footer: resolver.resolveFooter(adapter.inputNode, {
387
+ footer: resolver.resolveFooter(ctx.meta, {
368
388
  output,
369
- config
389
+ config,
390
+ file: {
391
+ path: meta.file.path,
392
+ baseName: meta.file.baseName
393
+ }
370
394
  }),
371
395
  children: [
372
- parser === "zod" && fileZod && zodSchemaNames.length > 0 && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
396
+ fileZod && zodSchemaNames.length > 0 && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
373
397
  name: zodSchemaNames,
374
398
  root: meta.file.path,
375
399
  path: fileZod.path
376
400
  }),
377
401
  clientOptions.importPath ? /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
378
402
  !shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
379
- name: "fetch",
403
+ name: "client",
380
404
  path: clientOptions.importPath
381
405
  }),
382
406
  /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
@@ -395,9 +419,9 @@ const infiniteQueryGenerator = (0, _kubb_core.defineGenerator)({
395
419
  })
396
420
  ] }) : /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
397
421
  !shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
398
- name: ["fetch"],
422
+ name: ["client"],
399
423
  root: meta.file.path,
400
- path: node_path.default.resolve(root, ".kubb/fetch.ts")
424
+ path: node_path.default.resolve(root, ".kubb/client.ts")
401
425
  }),
402
426
  /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
403
427
  name: [
@@ -406,13 +430,13 @@ const infiniteQueryGenerator = (0, _kubb_core.defineGenerator)({
406
430
  "ResponseErrorConfig"
407
431
  ],
408
432
  root: meta.file.path,
409
- path: node_path.default.resolve(root, ".kubb/fetch.ts"),
433
+ path: node_path.default.resolve(root, ".kubb/client.ts"),
410
434
  isTypeOnly: true
411
435
  }),
412
436
  clientOptions.dataReturnType === "full" && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
413
437
  name: ["ResponseConfig"],
414
438
  root: meta.file.path,
415
- path: node_path.default.resolve(root, ".kubb/fetch.ts"),
439
+ path: node_path.default.resolve(root, ".kubb/client.ts"),
416
440
  isTypeOnly: true
417
441
  })
418
442
  ] }),
@@ -517,25 +541,28 @@ const infiniteQueryGenerator = (0, _kubb_core.defineGenerator)({
517
541
  });
518
542
  //#endregion
519
543
  //#region src/generators/mutationGenerator.tsx
544
+ /**
545
+ * Built-in generator for `useMutation` hooks. Emits one `useFooMutation` hook
546
+ * per POST/PUT/DELETE operation (configurable via `mutation.methods`) plus
547
+ * the matching `fooMutationKey` / `fooMutationOptions` helpers.
548
+ */
520
549
  const mutationGenerator = (0, _kubb_core.defineGenerator)({
521
550
  name: "react-query-mutation",
522
- renderer: _kubb_renderer_jsx.jsxRenderer,
551
+ renderer: _kubb_renderer_jsx.jsxRendererSync,
523
552
  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;
553
+ const { config, driver, resolver, root } = ctx;
554
+ const { output, query, mutation, paramsCasing, paramsType, pathParamsType, parser, client: clientOptions, group, customOptions } = ctx.options;
526
555
  const pluginTs = driver.getPlugin(_kubb_plugin_ts.pluginTsName);
527
556
  if (!pluginTs) return null;
528
557
  const tsResolver = driver.getResolver(_kubb_plugin_ts.pluginTsName);
529
558
  const isQuery = query === false || !!query && query.methods.some((method) => node.method.toLowerCase() === method.toLowerCase());
530
559
  if (!(mutation !== false && !isQuery && (0, remeda.difference)(mutation ? mutation.methods : [], query ? query.methods : []).some((method) => node.method.toLowerCase() === method.toLowerCase()))) return null;
531
560
  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);
561
+ const mutationHookName = resolver.resolveMutationName(node);
562
+ const mutationTypeName = resolver.resolveMutationTypeName(node);
563
+ const mutationOptionsName = resolver.resolveMutationOptionsName(node);
564
+ const mutationKeyName = resolver.resolveMutationKeyName(node);
565
+ const clientName = resolver.resolveClientName(node);
539
566
  const meta = {
540
567
  file: resolver.resolveFile({
541
568
  name: mutationHookName,
@@ -545,7 +572,7 @@ const mutationGenerator = (0, _kubb_core.defineGenerator)({
545
572
  }, {
546
573
  root,
547
574
  output,
548
- group
575
+ group: group ?? void 0
549
576
  }),
550
577
  fileTs: tsResolver.resolveFile({
551
578
  name: node.operationId,
@@ -555,23 +582,15 @@ const mutationGenerator = (0, _kubb_core.defineGenerator)({
555
582
  }, {
556
583
  root,
557
584
  output: pluginTs.options?.output ?? output,
558
- group: pluginTs.options?.group
585
+ group: pluginTs.options?.group ?? void 0
559
586
  })
560
587
  };
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;
588
+ const importedTypeNames = require_components.resolveOperationTypeNames(node, tsResolver, {
589
+ paramsCasing,
590
+ order: "body-response-first"
591
+ });
592
+ const pluginZod = parser === "zod" ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : null;
593
+ const zodResolver = pluginZod ? driver.getResolver(_kubb_plugin_zod.pluginZodName) : null;
575
594
  const fileZod = zodResolver ? zodResolver.resolveFile({
576
595
  name: node.operationId,
577
596
  extname: ".ts",
@@ -580,12 +599,12 @@ const mutationGenerator = (0, _kubb_core.defineGenerator)({
580
599
  }, {
581
600
  root,
582
601
  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) : [];
602
+ group: pluginZod?.options?.group ?? void 0
603
+ }) : null;
604
+ const zodSchemaNames = require_components.resolveZodSchemaNames(node, zodResolver);
586
605
  const clientPlugin = driver.getPlugin(_kubb_plugin_client.pluginClientName);
587
606
  const shouldUseClientPlugin = clientPlugin?.name === _kubb_plugin_client.pluginClientName && clientOptions.clientType !== "class";
588
- const clientResolver = shouldUseClientPlugin ? driver.getResolver(_kubb_plugin_client.pluginClientName) : void 0;
607
+ const clientResolver = shouldUseClientPlugin ? driver.getResolver(_kubb_plugin_client.pluginClientName) : null;
589
608
  const clientFile = shouldUseClientPlugin ? clientResolver?.resolveFile({
590
609
  name: node.operationId,
591
610
  extname: ".ts",
@@ -594,30 +613,38 @@ const mutationGenerator = (0, _kubb_core.defineGenerator)({
594
613
  }, {
595
614
  root,
596
615
  output: clientPlugin?.options?.output ?? output,
597
- group: clientPlugin?.options?.group
598
- }) : void 0;
616
+ group: clientPlugin?.options?.group ?? void 0
617
+ }) : null;
599
618
  const resolvedClientName = shouldUseClientPlugin ? clientResolver?.resolveName(node.operationId) ?? clientName : clientName;
600
619
  return /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx.File, {
601
620
  baseName: meta.file.baseName,
602
621
  path: meta.file.path,
603
622
  meta: meta.file.meta,
604
- banner: resolver.resolveBanner(adapter.inputNode, {
623
+ banner: resolver.resolveBanner(ctx.meta, {
605
624
  output,
606
- config
625
+ config,
626
+ file: {
627
+ path: meta.file.path,
628
+ baseName: meta.file.baseName
629
+ }
607
630
  }),
608
- footer: resolver.resolveFooter(adapter.inputNode, {
631
+ footer: resolver.resolveFooter(ctx.meta, {
609
632
  output,
610
- config
633
+ config,
634
+ file: {
635
+ path: meta.file.path,
636
+ baseName: meta.file.baseName
637
+ }
611
638
  }),
612
639
  children: [
613
- parser === "zod" && fileZod && zodSchemaNames.length > 0 && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
640
+ fileZod && zodSchemaNames.length > 0 && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
614
641
  name: zodSchemaNames,
615
642
  root: meta.file.path,
616
643
  path: fileZod.path
617
644
  }),
618
645
  clientOptions.importPath ? /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
619
646
  !shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
620
- name: "fetch",
647
+ name: "client",
621
648
  path: clientOptions.importPath
622
649
  }),
623
650
  /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
@@ -636,9 +663,9 @@ const mutationGenerator = (0, _kubb_core.defineGenerator)({
636
663
  })
637
664
  ] }) : /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
638
665
  !shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
639
- name: ["fetch"],
666
+ name: ["client"],
640
667
  root: meta.file.path,
641
- path: node_path.default.resolve(root, ".kubb/fetch.ts")
668
+ path: node_path.default.resolve(root, ".kubb/client.ts")
642
669
  }),
643
670
  /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
644
671
  name: [
@@ -647,13 +674,13 @@ const mutationGenerator = (0, _kubb_core.defineGenerator)({
647
674
  "ResponseErrorConfig"
648
675
  ],
649
676
  root: meta.file.path,
650
- path: node_path.default.resolve(root, ".kubb/fetch.ts"),
677
+ path: node_path.default.resolve(root, ".kubb/client.ts"),
651
678
  isTypeOnly: true
652
679
  }),
653
680
  clientOptions.dataReturnType === "full" && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
654
681
  name: ["ResponseConfig"],
655
682
  root: meta.file.path,
656
- path: node_path.default.resolve(root, ".kubb/fetch.ts"),
683
+ path: node_path.default.resolve(root, ".kubb/client.ts"),
657
684
  isTypeOnly: true
658
685
  })
659
686
  ] }),
@@ -662,7 +689,7 @@ const mutationGenerator = (0, _kubb_core.defineGenerator)({
662
689
  root: meta.file.path,
663
690
  path: clientFile.path
664
691
  }),
665
- !shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
692
+ !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
693
  name: ["buildFormData"],
667
694
  root: meta.file.path,
668
695
  path: node_path.default.resolve(root, ".kubb/config.ts")
@@ -744,12 +771,17 @@ const mutationGenerator = (0, _kubb_core.defineGenerator)({
744
771
  });
745
772
  //#endregion
746
773
  //#region src/generators/queryGenerator.tsx
774
+ /**
775
+ * Built-in generator for `useQuery` hooks. Emits one `useFooQuery` hook per
776
+ * GET operation (configurable via `query.methods`) plus the matching
777
+ * `fooQueryKey` / `fooQueryOptions` helpers.
778
+ */
747
779
  const queryGenerator = (0, _kubb_core.defineGenerator)({
748
780
  name: "react-query",
749
- renderer: _kubb_renderer_jsx.jsxRenderer,
781
+ renderer: _kubb_renderer_jsx.jsxRendererSync,
750
782
  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;
783
+ const { config, driver, resolver, root } = ctx;
784
+ const { output, query, mutation, paramsCasing, paramsType, pathParamsType, parser, client: clientOptions, group, customOptions } = ctx.options;
753
785
  const pluginTs = driver.getPlugin(_kubb_plugin_ts.pluginTsName);
754
786
  if (!pluginTs) return null;
755
787
  const tsResolver = driver.getResolver(_kubb_plugin_ts.pluginTsName);
@@ -757,13 +789,11 @@ const queryGenerator = (0, _kubb_core.defineGenerator)({
757
789
  const isMutation = mutation !== false && !isQuery && (0, remeda.difference)(mutation ? mutation.methods : [], query ? query.methods : []).some((method) => node.method.toLowerCase() === method.toLowerCase());
758
790
  if (!isQuery || isMutation) return null;
759
791
  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);
792
+ const queryName = resolver.resolveQueryName(node);
793
+ const queryOptionsName = resolver.resolveQueryOptionsName(node);
794
+ const queryKeyName = resolver.resolveQueryKeyName(node);
795
+ const queryKeyTypeName = resolver.resolveQueryKeyTypeName(node);
796
+ const clientName = resolver.resolveClientName(node);
767
797
  const meta = {
768
798
  file: resolver.resolveFile({
769
799
  name: queryName,
@@ -773,7 +803,7 @@ const queryGenerator = (0, _kubb_core.defineGenerator)({
773
803
  }, {
774
804
  root,
775
805
  output,
776
- group
806
+ group: group ?? void 0
777
807
  }),
778
808
  fileTs: tsResolver.resolveFile({
779
809
  name: node.operationId,
@@ -783,23 +813,16 @@ const queryGenerator = (0, _kubb_core.defineGenerator)({
783
813
  }, {
784
814
  root,
785
815
  output: pluginTs.options?.output ?? output,
786
- group: pluginTs.options?.group
816
+ group: pluginTs.options?.group ?? void 0
787
817
  })
788
818
  };
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;
819
+ const importedTypeNames = require_components.resolveOperationTypeNames(node, tsResolver, {
820
+ paramsCasing,
821
+ exclude: [queryKeyTypeName],
822
+ order: "body-response-first"
823
+ });
824
+ const pluginZod = parser === "zod" ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : null;
825
+ const zodResolver = pluginZod ? driver.getResolver(_kubb_plugin_zod.pluginZodName) : null;
803
826
  const fileZod = zodResolver ? zodResolver.resolveFile({
804
827
  name: node.operationId,
805
828
  extname: ".ts",
@@ -808,12 +831,12 @@ const queryGenerator = (0, _kubb_core.defineGenerator)({
808
831
  }, {
809
832
  root,
810
833
  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) : [];
834
+ group: pluginZod?.options?.group ?? void 0
835
+ }) : null;
836
+ const zodSchemaNames = require_components.resolveZodSchemaNames(node, zodResolver);
814
837
  const clientPlugin = driver.getPlugin(_kubb_plugin_client.pluginClientName);
815
838
  const shouldUseClientPlugin = clientPlugin?.name === _kubb_plugin_client.pluginClientName && clientOptions.clientType !== "class";
816
- const clientResolver = shouldUseClientPlugin ? driver.getResolver(_kubb_plugin_client.pluginClientName) : void 0;
839
+ const clientResolver = shouldUseClientPlugin ? driver.getResolver(_kubb_plugin_client.pluginClientName) : null;
817
840
  const clientFile = shouldUseClientPlugin ? clientResolver?.resolveFile({
818
841
  name: node.operationId,
819
842
  extname: ".ts",
@@ -822,30 +845,38 @@ const queryGenerator = (0, _kubb_core.defineGenerator)({
822
845
  }, {
823
846
  root,
824
847
  output: clientPlugin?.options?.output ?? output,
825
- group: clientPlugin?.options?.group
826
- }) : void 0;
848
+ group: clientPlugin?.options?.group ?? void 0
849
+ }) : null;
827
850
  const resolvedClientName = shouldUseClientPlugin ? clientResolver?.resolveName(node.operationId) ?? clientName : clientName;
828
851
  return /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx.File, {
829
852
  baseName: meta.file.baseName,
830
853
  path: meta.file.path,
831
854
  meta: meta.file.meta,
832
- banner: resolver.resolveBanner(adapter.inputNode, {
855
+ banner: resolver.resolveBanner(ctx.meta, {
833
856
  output,
834
- config
857
+ config,
858
+ file: {
859
+ path: meta.file.path,
860
+ baseName: meta.file.baseName
861
+ }
835
862
  }),
836
- footer: resolver.resolveFooter(adapter.inputNode, {
863
+ footer: resolver.resolveFooter(ctx.meta, {
837
864
  output,
838
- config
865
+ config,
866
+ file: {
867
+ path: meta.file.path,
868
+ baseName: meta.file.baseName
869
+ }
839
870
  }),
840
871
  children: [
841
- parser === "zod" && fileZod && zodSchemaNames.length > 0 && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
872
+ fileZod && zodSchemaNames.length > 0 && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
842
873
  name: zodSchemaNames,
843
874
  root: meta.file.path,
844
875
  path: fileZod.path
845
876
  }),
846
877
  clientOptions.importPath ? /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
847
878
  !shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
848
- name: "fetch",
879
+ name: "client",
849
880
  path: clientOptions.importPath
850
881
  }),
851
882
  /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
@@ -864,9 +895,9 @@ const queryGenerator = (0, _kubb_core.defineGenerator)({
864
895
  })
865
896
  ] }) : /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
866
897
  !shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
867
- name: ["fetch"],
898
+ name: ["client"],
868
899
  root: meta.file.path,
869
- path: node_path.default.resolve(root, ".kubb/fetch.ts")
900
+ path: node_path.default.resolve(root, ".kubb/client.ts")
870
901
  }),
871
902
  /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
872
903
  name: [
@@ -875,13 +906,13 @@ const queryGenerator = (0, _kubb_core.defineGenerator)({
875
906
  "ResponseErrorConfig"
876
907
  ],
877
908
  root: meta.file.path,
878
- path: node_path.default.resolve(root, ".kubb/fetch.ts"),
909
+ path: node_path.default.resolve(root, ".kubb/client.ts"),
879
910
  isTypeOnly: true
880
911
  }),
881
912
  clientOptions.dataReturnType === "full" && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
882
913
  name: ["ResponseConfig"],
883
914
  root: meta.file.path,
884
- path: node_path.default.resolve(root, ".kubb/fetch.ts"),
915
+ path: node_path.default.resolve(root, ".kubb/client.ts"),
885
916
  isTypeOnly: true
886
917
  })
887
918
  ] }),
@@ -976,33 +1007,37 @@ const queryGenerator = (0, _kubb_core.defineGenerator)({
976
1007
  });
977
1008
  //#endregion
978
1009
  //#region src/generators/suspenseInfiniteQueryGenerator.tsx
1010
+ /**
1011
+ * Built-in generator for `useSuspenseInfiniteQuery` hooks. Enabled when both
1012
+ * `suspense` and `infinite` are configured. Combines suspense semantics with
1013
+ * cursor-based pagination — handlers throw promises while loading and pull
1014
+ * additional pages on demand.
1015
+ */
979
1016
  const suspenseInfiniteQueryGenerator = (0, _kubb_core.defineGenerator)({
980
1017
  name: "react-suspense-infinite-query",
981
- renderer: _kubb_renderer_jsx.jsxRenderer,
1018
+ renderer: _kubb_renderer_jsx.jsxRendererSync,
982
1019
  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;
1020
+ const { config, driver, resolver, root } = ctx;
1021
+ const { output, query, mutation, infinite, suspense, paramsCasing, paramsType, pathParamsType, parser, client: clientOptions, group, customOptions } = ctx.options;
985
1022
  const pluginTs = driver.getPlugin(_kubb_plugin_ts.pluginTsName);
986
1023
  if (!pluginTs) return null;
987
1024
  const tsResolver = driver.getResolver(_kubb_plugin_ts.pluginTsName);
988
1025
  const isQuery = query === false || !!query && query.methods.some((method) => node.method.toLowerCase() === method.toLowerCase());
989
1026
  const isMutation = mutation !== false && !isQuery && (0, remeda.difference)(mutation ? mutation.methods : [], query ? query.methods : []).some((method) => node.method.toLowerCase() === method.toLowerCase());
990
1027
  const isSuspense = !!suspense;
991
- const infiniteOptions = infinite && typeof infinite === "object" ? infinite : void 0;
1028
+ const infiniteOptions = infinite && typeof infinite === "object" ? infinite : null;
992
1029
  if (!isQuery || isMutation || !isSuspense || !infiniteOptions) return null;
993
1030
  const normalizeKey = (key) => key.replace(/\?$/, "");
994
- const queryParamKeys = node.parameters.filter((p) => p.in === "query").map((p) => p.name);
1031
+ const queryParamKeys = require_components.getOperationParameters(node).query.map((p) => p.name);
995
1032
  const hasQueryParam = infiniteOptions.queryParam ? queryParamKeys.some((k) => normalizeKey(k) === infiniteOptions.queryParam) : false;
996
1033
  const hasCursorParam = !infiniteOptions.cursorParam || true;
997
1034
  if (!hasQueryParam || !hasCursorParam) return null;
998
1035
  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);
1036
+ const queryName = resolver.resolveSuspenseInfiniteQueryName(node);
1037
+ const queryOptionsName = resolver.resolveSuspenseInfiniteQueryOptionsName(node);
1038
+ const queryKeyName = resolver.resolveSuspenseInfiniteQueryKeyName(node);
1039
+ const queryKeyTypeName = resolver.resolveSuspenseInfiniteQueryKeyTypeName(node);
1040
+ const clientBaseName = resolver.resolveSuspenseInfiniteClientName(node);
1006
1041
  const meta = {
1007
1042
  file: resolver.resolveFile({
1008
1043
  name: queryName,
@@ -1012,7 +1047,7 @@ const suspenseInfiniteQueryGenerator = (0, _kubb_core.defineGenerator)({
1012
1047
  }, {
1013
1048
  root,
1014
1049
  output,
1015
- group
1050
+ group: group ?? void 0
1016
1051
  }),
1017
1052
  fileTs: tsResolver.resolveFile({
1018
1053
  name: node.operationId,
@@ -1022,23 +1057,15 @@ const suspenseInfiniteQueryGenerator = (0, _kubb_core.defineGenerator)({
1022
1057
  }, {
1023
1058
  root,
1024
1059
  output: pluginTs.options?.output ?? output,
1025
- group: pluginTs.options?.group
1060
+ group: pluginTs.options?.group ?? void 0
1026
1061
  })
1027
1062
  };
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;
1063
+ const importedTypeNames = require_components.resolveOperationTypeNames(node, tsResolver, {
1064
+ paramsCasing,
1065
+ order: "body-response-first"
1066
+ });
1067
+ const pluginZod = parser === "zod" ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : null;
1068
+ const zodResolver = pluginZod ? driver.getResolver(_kubb_plugin_zod.pluginZodName) : null;
1042
1069
  const fileZod = zodResolver ? zodResolver.resolveFile({
1043
1070
  name: node.operationId,
1044
1071
  extname: ".ts",
@@ -1047,12 +1074,12 @@ const suspenseInfiniteQueryGenerator = (0, _kubb_core.defineGenerator)({
1047
1074
  }, {
1048
1075
  root,
1049
1076
  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) : [];
1077
+ group: pluginZod?.options?.group ?? void 0
1078
+ }) : null;
1079
+ const zodSchemaNames = require_components.resolveZodSchemaNames(node, zodResolver);
1053
1080
  const clientPlugin = driver.getPlugin(_kubb_plugin_client.pluginClientName);
1054
1081
  const shouldUseClientPlugin = clientPlugin?.name === _kubb_plugin_client.pluginClientName && clientOptions.clientType !== "class";
1055
- const clientResolver = shouldUseClientPlugin ? driver.getResolver(_kubb_plugin_client.pluginClientName) : void 0;
1082
+ const clientResolver = shouldUseClientPlugin ? driver.getResolver(_kubb_plugin_client.pluginClientName) : null;
1056
1083
  const clientFile = shouldUseClientPlugin ? clientResolver?.resolveFile({
1057
1084
  name: node.operationId,
1058
1085
  extname: ".ts",
@@ -1061,30 +1088,38 @@ const suspenseInfiniteQueryGenerator = (0, _kubb_core.defineGenerator)({
1061
1088
  }, {
1062
1089
  root,
1063
1090
  output: clientPlugin?.options?.output ?? output,
1064
- group: clientPlugin?.options?.group
1065
- }) : void 0;
1091
+ group: clientPlugin?.options?.group ?? void 0
1092
+ }) : null;
1066
1093
  const resolvedClientName = shouldUseClientPlugin ? clientResolver?.resolveName(node.operationId) ?? clientBaseName : clientBaseName;
1067
1094
  return /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx.File, {
1068
1095
  baseName: meta.file.baseName,
1069
1096
  path: meta.file.path,
1070
1097
  meta: meta.file.meta,
1071
- banner: resolver.resolveBanner(adapter.inputNode, {
1098
+ banner: resolver.resolveBanner(ctx.meta, {
1072
1099
  output,
1073
- config
1100
+ config,
1101
+ file: {
1102
+ path: meta.file.path,
1103
+ baseName: meta.file.baseName
1104
+ }
1074
1105
  }),
1075
- footer: resolver.resolveFooter(adapter.inputNode, {
1106
+ footer: resolver.resolveFooter(ctx.meta, {
1076
1107
  output,
1077
- config
1108
+ config,
1109
+ file: {
1110
+ path: meta.file.path,
1111
+ baseName: meta.file.baseName
1112
+ }
1078
1113
  }),
1079
1114
  children: [
1080
- parser === "zod" && fileZod && zodSchemaNames.length > 0 && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1115
+ fileZod && zodSchemaNames.length > 0 && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1081
1116
  name: zodSchemaNames,
1082
1117
  root: meta.file.path,
1083
1118
  path: fileZod.path
1084
1119
  }),
1085
1120
  clientOptions.importPath ? /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
1086
1121
  !shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1087
- name: "fetch",
1122
+ name: "client",
1088
1123
  path: clientOptions.importPath
1089
1124
  }),
1090
1125
  /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
@@ -1103,9 +1138,9 @@ const suspenseInfiniteQueryGenerator = (0, _kubb_core.defineGenerator)({
1103
1138
  })
1104
1139
  ] }) : /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
1105
1140
  !shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1106
- name: ["fetch"],
1141
+ name: ["client"],
1107
1142
  root: meta.file.path,
1108
- path: node_path.default.resolve(root, ".kubb/fetch.ts")
1143
+ path: node_path.default.resolve(root, ".kubb/client.ts")
1109
1144
  }),
1110
1145
  /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1111
1146
  name: [
@@ -1114,13 +1149,13 @@ const suspenseInfiniteQueryGenerator = (0, _kubb_core.defineGenerator)({
1114
1149
  "ResponseErrorConfig"
1115
1150
  ],
1116
1151
  root: meta.file.path,
1117
- path: node_path.default.resolve(root, ".kubb/fetch.ts"),
1152
+ path: node_path.default.resolve(root, ".kubb/client.ts"),
1118
1153
  isTypeOnly: true
1119
1154
  }),
1120
1155
  clientOptions.dataReturnType === "full" && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1121
1156
  name: ["ResponseConfig"],
1122
1157
  root: meta.file.path,
1123
- path: node_path.default.resolve(root, ".kubb/fetch.ts"),
1158
+ path: node_path.default.resolve(root, ".kubb/client.ts"),
1124
1159
  isTypeOnly: true
1125
1160
  })
1126
1161
  ] }),
@@ -1225,12 +1260,18 @@ const suspenseInfiniteQueryGenerator = (0, _kubb_core.defineGenerator)({
1225
1260
  });
1226
1261
  //#endregion
1227
1262
  //#region src/generators/suspenseQueryGenerator.tsx
1263
+ /**
1264
+ * Built-in generator for `useSuspenseQuery` hooks. Enabled when
1265
+ * `pluginReactQuery({ suspense: {} })`. Emits one `useFooSuspenseQuery` hook
1266
+ * per query operation. Suspense queries throw promises while loading and
1267
+ * require a `<Suspense>` boundary in the React tree. TanStack Query v5+ only.
1268
+ */
1228
1269
  const suspenseQueryGenerator = (0, _kubb_core.defineGenerator)({
1229
1270
  name: "react-suspense-query",
1230
- renderer: _kubb_renderer_jsx.jsxRenderer,
1271
+ renderer: _kubb_renderer_jsx.jsxRendererSync,
1231
1272
  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;
1273
+ const { config, driver, resolver, root } = ctx;
1274
+ const { output, query, mutation, suspense, paramsCasing, paramsType, pathParamsType, parser, client: clientOptions, group, customOptions } = ctx.options;
1234
1275
  const pluginTs = driver.getPlugin(_kubb_plugin_ts.pluginTsName);
1235
1276
  if (!pluginTs) return null;
1236
1277
  const tsResolver = driver.getResolver(_kubb_plugin_ts.pluginTsName);
@@ -1238,13 +1279,11 @@ const suspenseQueryGenerator = (0, _kubb_core.defineGenerator)({
1238
1279
  const isMutation = mutation !== false && !isQuery && (0, remeda.difference)(mutation ? mutation.methods : [], query ? query.methods : []).some((method) => node.method.toLowerCase() === method.toLowerCase());
1239
1280
  if (!isQuery || isMutation || !!!suspense) return null;
1240
1281
  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);
1282
+ const queryName = resolver.resolveSuspenseQueryName(node);
1283
+ const queryOptionsName = resolver.resolveSuspenseQueryOptionsName(node);
1284
+ const queryKeyName = resolver.resolveSuspenseQueryKeyName(node);
1285
+ const queryKeyTypeName = resolver.resolveSuspenseQueryKeyTypeName(node);
1286
+ const clientName = resolver.resolveSuspenseClientName(node);
1248
1287
  const meta = {
1249
1288
  file: resolver.resolveFile({
1250
1289
  name: queryName,
@@ -1254,7 +1293,7 @@ const suspenseQueryGenerator = (0, _kubb_core.defineGenerator)({
1254
1293
  }, {
1255
1294
  root,
1256
1295
  output,
1257
- group
1296
+ group: group ?? void 0
1258
1297
  }),
1259
1298
  fileTs: tsResolver.resolveFile({
1260
1299
  name: node.operationId,
@@ -1264,23 +1303,16 @@ const suspenseQueryGenerator = (0, _kubb_core.defineGenerator)({
1264
1303
  }, {
1265
1304
  root,
1266
1305
  output: pluginTs.options?.output ?? output,
1267
- group: pluginTs.options?.group
1306
+ group: pluginTs.options?.group ?? void 0
1268
1307
  })
1269
1308
  };
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;
1309
+ const importedTypeNames = require_components.resolveOperationTypeNames(node, tsResolver, {
1310
+ paramsCasing,
1311
+ exclude: [queryKeyTypeName],
1312
+ order: "body-response-first"
1313
+ });
1314
+ const pluginZod = parser === "zod" ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : null;
1315
+ const zodResolver = pluginZod ? driver.getResolver(_kubb_plugin_zod.pluginZodName) : null;
1284
1316
  const fileZod = zodResolver ? zodResolver.resolveFile({
1285
1317
  name: node.operationId,
1286
1318
  extname: ".ts",
@@ -1289,12 +1321,12 @@ const suspenseQueryGenerator = (0, _kubb_core.defineGenerator)({
1289
1321
  }, {
1290
1322
  root,
1291
1323
  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) : [];
1324
+ group: pluginZod?.options?.group ?? void 0
1325
+ }) : null;
1326
+ const zodSchemaNames = require_components.resolveZodSchemaNames(node, zodResolver);
1295
1327
  const clientPlugin = driver.getPlugin(_kubb_plugin_client.pluginClientName);
1296
1328
  const shouldUseClientPlugin = clientPlugin?.name === _kubb_plugin_client.pluginClientName && clientOptions.clientType !== "class";
1297
- const clientResolver = shouldUseClientPlugin ? driver.getResolver(_kubb_plugin_client.pluginClientName) : void 0;
1329
+ const clientResolver = shouldUseClientPlugin ? driver.getResolver(_kubb_plugin_client.pluginClientName) : null;
1298
1330
  const clientFile = shouldUseClientPlugin ? clientResolver?.resolveFile({
1299
1331
  name: node.operationId,
1300
1332
  extname: ".ts",
@@ -1303,30 +1335,38 @@ const suspenseQueryGenerator = (0, _kubb_core.defineGenerator)({
1303
1335
  }, {
1304
1336
  root,
1305
1337
  output: clientPlugin?.options?.output ?? output,
1306
- group: clientPlugin?.options?.group
1307
- }) : void 0;
1338
+ group: clientPlugin?.options?.group ?? void 0
1339
+ }) : null;
1308
1340
  const resolvedClientName = shouldUseClientPlugin ? clientResolver?.resolveName(node.operationId) ?? clientName : clientName;
1309
1341
  return /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx.File, {
1310
1342
  baseName: meta.file.baseName,
1311
1343
  path: meta.file.path,
1312
1344
  meta: meta.file.meta,
1313
- banner: resolver.resolveBanner(adapter.inputNode, {
1345
+ banner: resolver.resolveBanner(ctx.meta, {
1314
1346
  output,
1315
- config
1347
+ config,
1348
+ file: {
1349
+ path: meta.file.path,
1350
+ baseName: meta.file.baseName
1351
+ }
1316
1352
  }),
1317
- footer: resolver.resolveFooter(adapter.inputNode, {
1353
+ footer: resolver.resolveFooter(ctx.meta, {
1318
1354
  output,
1319
- config
1355
+ config,
1356
+ file: {
1357
+ path: meta.file.path,
1358
+ baseName: meta.file.baseName
1359
+ }
1320
1360
  }),
1321
1361
  children: [
1322
- parser === "zod" && fileZod && zodSchemaNames.length > 0 && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1362
+ fileZod && zodSchemaNames.length > 0 && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1323
1363
  name: zodSchemaNames,
1324
1364
  root: meta.file.path,
1325
1365
  path: fileZod.path
1326
1366
  }),
1327
1367
  clientOptions.importPath ? /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
1328
1368
  !shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1329
- name: "fetch",
1369
+ name: "client",
1330
1370
  path: clientOptions.importPath
1331
1371
  }),
1332
1372
  /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
@@ -1345,9 +1385,9 @@ const suspenseQueryGenerator = (0, _kubb_core.defineGenerator)({
1345
1385
  })
1346
1386
  ] }) : /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
1347
1387
  !shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1348
- name: ["fetch"],
1388
+ name: ["client"],
1349
1389
  root: meta.file.path,
1350
- path: node_path.default.resolve(root, ".kubb/fetch.ts")
1390
+ path: node_path.default.resolve(root, ".kubb/client.ts")
1351
1391
  }),
1352
1392
  /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1353
1393
  name: [
@@ -1356,13 +1396,13 @@ const suspenseQueryGenerator = (0, _kubb_core.defineGenerator)({
1356
1396
  "ResponseErrorConfig"
1357
1397
  ],
1358
1398
  root: meta.file.path,
1359
- path: node_path.default.resolve(root, ".kubb/fetch.ts"),
1399
+ path: node_path.default.resolve(root, ".kubb/client.ts"),
1360
1400
  isTypeOnly: true
1361
1401
  }),
1362
1402
  clientOptions.dataReturnType === "full" && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1363
1403
  name: ["ResponseConfig"],
1364
1404
  root: meta.file.path,
1365
- path: node_path.default.resolve(root, ".kubb/fetch.ts"),
1405
+ path: node_path.default.resolve(root, ".kubb/client.ts"),
1366
1406
  isTypeOnly: true
1367
1407
  })
1368
1408
  ] }),
@@ -1499,4 +1539,4 @@ Object.defineProperty(exports, "suspenseQueryGenerator", {
1499
1539
  }
1500
1540
  });
1501
1541
 
1502
- //# sourceMappingURL=generators-CWEQsdO9.cjs.map
1542
+ //# sourceMappingURL=generators-BtsWNz-6.cjs.map