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

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-BVmVgpLX.js} +379 -279
  3. package/dist/components-BVmVgpLX.js.map +1 -0
  4. package/dist/{components-dAKJEn9b.cjs → components-DLUeLMsz.cjs} +409 -279
  5. package/dist/components-DLUeLMsz.cjs.map +1 -0
  6. package/dist/components.cjs +1 -1
  7. package/dist/components.d.ts +4 -76
  8. package/dist/components.js +1 -1
  9. package/dist/{generators-CWEQsdO9.cjs → generators--AcF4Y4n.cjs} +332 -410
  10. package/dist/generators--AcF4Y4n.cjs.map +1 -0
  11. package/dist/{generators-C_fbcjpG.js → generators-BFn9CLBS.js} +333 -411
  12. package/dist/generators-BFn9CLBS.js.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 +179 -26
  17. package/dist/index.cjs.map +1 -1
  18. package/dist/index.d.ts +30 -1
  19. package/dist/index.js +179 -26
  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 +24 -13
  25. package/src/components/InfiniteQueryOptions.tsx +37 -55
  26. package/src/components/Mutation.tsx +35 -15
  27. package/src/components/MutationOptions.tsx +14 -13
  28. package/src/components/Query.tsx +14 -10
  29. package/src/components/QueryOptions.tsx +17 -34
  30. package/src/components/SuspenseInfiniteQuery.tsx +19 -13
  31. package/src/components/SuspenseInfiniteQueryOptions.tsx +28 -52
  32. package/src/components/SuspenseQuery.tsx +9 -10
  33. package/src/generators/customHookOptionsFileGenerator.tsx +18 -14
  34. package/src/generators/hookOptionsGenerator.tsx +42 -49
  35. package/src/generators/infiniteQueryGenerator.tsx +55 -76
  36. package/src/generators/mutationGenerator.tsx +51 -62
  37. package/src/generators/queryGenerator.tsx +52 -61
  38. package/src/generators/suspenseInfiniteQueryGenerator.tsx +50 -63
  39. package/src/generators/suspenseQueryGenerator.tsx +54 -74
  40. package/src/plugin.ts +45 -31
  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-DLUeLMsz.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,52 +108,53 @@ 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);
141
+ if (!_kubb_core.ast.isHttpOperationNode(node)) continue;
129
142
  const opOverrides = require_components.resolveOperationOverrides(node, override);
130
143
  const nodeQuery = "query" in opOverrides ? opOverrides.query : query;
131
144
  const nodeMutation = "mutation" in opOverrides ? opOverrides.mutation : mutation;
132
145
  const nodeInfinite = "infinite" in opOverrides ? opOverrides.infinite : infinite;
133
- const nodeInfiniteOptions = nodeInfinite && typeof nodeInfinite === "object" ? nodeInfinite : void 0;
146
+ const nodeInfiniteOptions = nodeInfinite && typeof nodeInfinite === "object" ? nodeInfinite : null;
134
147
  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
148
  const isMutationOp = nodeMutation !== false && !isQueryOp && (0, remeda.difference)(nodeMutation ? nodeMutation.methods : [], nodeQuery ? nodeQuery.methods : []).some((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,114 +264,100 @@ 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
- renderer: _kubb_renderer_jsx.jsxRenderer,
275
+ renderer: _kubb_renderer_jsx.jsxRendererSync,
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
284
  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;
285
+ const infiniteOptions = infinite && typeof infinite === "object" ? infinite : null;
284
286
  if (!isQuery || isMutation || !infiniteOptions) return null;
285
287
  const normalizeKey = (key) => key.replace(/\?$/, "");
286
- const queryParamKeys = node.parameters.filter((p) => p.in === "query").map((p) => p.name);
288
+ const queryParamKeys = require_components.getOperationParameters(node).query.map((p) => p.name);
287
289
  const hasQueryParam = infiniteOptions.queryParam ? queryParamKeys.some((k) => normalizeKey(k) === infiniteOptions.queryParam) : false;
288
290
  const hasCursorParam = !infiniteOptions.cursorParam || true;
289
291
  if (!hasQueryParam || !hasCursorParam) return null;
290
292
  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);
293
+ const queryName = resolver.resolveInfiniteQueryName(node);
294
+ const queryOptionsName = resolver.resolveInfiniteQueryOptionsName(node);
295
+ const queryKeyName = resolver.resolveInfiniteQueryKeyName(node);
296
+ const queryKeyTypeName = resolver.resolveInfiniteQueryKeyTypeName(node);
297
+ const clientBaseName = resolver.resolveInfiniteClientName(node);
298
298
  const meta = {
299
- file: resolver.resolveFile({
300
- name: queryName,
301
- extname: ".ts",
302
- tag: node.tags[0] ?? "default",
303
- path: node.path
304
- }, {
299
+ file: resolver.resolveFile(require_components.operationFileEntry(node, queryName), {
305
300
  root,
306
301
  output,
307
- group
302
+ group: group ?? void 0
308
303
  }),
309
- fileTs: tsResolver.resolveFile({
310
- name: node.operationId,
311
- extname: ".ts",
312
- tag: node.tags[0] ?? "default",
313
- path: node.path
314
- }, {
304
+ fileTs: tsResolver.resolveFile(require_components.operationFileEntry(node, node.operationId), {
315
305
  root,
316
306
  output: pluginTs.options?.output ?? output,
317
- group: pluginTs.options?.group
307
+ group: pluginTs.options?.group ?? void 0
318
308
  })
319
309
  };
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
- }, {
310
+ const importedTypeNames = require_components.resolveOperationTypeNames(node, tsResolver, {
311
+ paramsCasing,
312
+ exclude: [queryKeyTypeName],
313
+ order: "body-response-first"
314
+ });
315
+ const pluginZod = parser === "zod" ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : null;
316
+ const zodResolver = pluginZod ? driver.getResolver(_kubb_plugin_zod.pluginZodName) : null;
317
+ const fileZod = zodResolver ? zodResolver.resolveFile(require_components.operationFileEntry(node, node.operationId), {
340
318
  root,
341
319
  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) : [];
320
+ group: pluginZod?.options?.group ?? void 0
321
+ }) : null;
322
+ const zodSchemaNames = require_components.resolveZodSchemaNames(node, zodResolver);
345
323
  const clientPlugin = driver.getPlugin(_kubb_plugin_client.pluginClientName);
346
324
  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
- }, {
325
+ const clientResolver = shouldUseClientPlugin ? driver.getResolver(_kubb_plugin_client.pluginClientName) : null;
326
+ const clientFile = shouldUseClientPlugin ? clientResolver?.resolveFile(require_components.operationFileEntry(node, node.operationId), {
354
327
  root,
355
328
  output: clientPlugin?.options?.output ?? output,
356
- group: clientPlugin?.options?.group
357
- }) : void 0;
329
+ group: clientPlugin?.options?.group ?? void 0
330
+ }) : null;
358
331
  const resolvedClientName = shouldUseClientPlugin ? clientResolver?.resolveName(node.operationId) ?? clientBaseName : clientBaseName;
359
332
  return /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx.File, {
360
333
  baseName: meta.file.baseName,
361
334
  path: meta.file.path,
362
335
  meta: meta.file.meta,
363
- banner: resolver.resolveBanner(adapter.inputNode, {
336
+ banner: resolver.resolveBanner(ctx.meta, {
364
337
  output,
365
- config
338
+ config,
339
+ file: {
340
+ path: meta.file.path,
341
+ baseName: meta.file.baseName
342
+ }
366
343
  }),
367
- footer: resolver.resolveFooter(adapter.inputNode, {
344
+ footer: resolver.resolveFooter(ctx.meta, {
368
345
  output,
369
- config
346
+ config,
347
+ file: {
348
+ path: meta.file.path,
349
+ baseName: meta.file.baseName
350
+ }
370
351
  }),
371
352
  children: [
372
- parser === "zod" && fileZod && zodSchemaNames.length > 0 && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
353
+ fileZod && zodSchemaNames.length > 0 && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
373
354
  name: zodSchemaNames,
374
355
  root: meta.file.path,
375
356
  path: fileZod.path
376
357
  }),
377
358
  clientOptions.importPath ? /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
378
359
  !shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
379
- name: "fetch",
360
+ name: "client",
380
361
  path: clientOptions.importPath
381
362
  }),
382
363
  /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
@@ -395,9 +376,9 @@ const infiniteQueryGenerator = (0, _kubb_core.defineGenerator)({
395
376
  })
396
377
  ] }) : /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
397
378
  !shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
398
- name: ["fetch"],
379
+ name: ["client"],
399
380
  root: meta.file.path,
400
- path: node_path.default.resolve(root, ".kubb/fetch.ts")
381
+ path: node_path.default.resolve(root, ".kubb/client.ts")
401
382
  }),
402
383
  /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
403
384
  name: [
@@ -406,13 +387,13 @@ const infiniteQueryGenerator = (0, _kubb_core.defineGenerator)({
406
387
  "ResponseErrorConfig"
407
388
  ],
408
389
  root: meta.file.path,
409
- path: node_path.default.resolve(root, ".kubb/fetch.ts"),
390
+ path: node_path.default.resolve(root, ".kubb/client.ts"),
410
391
  isTypeOnly: true
411
392
  }),
412
393
  clientOptions.dataReturnType === "full" && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
413
394
  name: ["ResponseConfig"],
414
395
  root: meta.file.path,
415
- path: node_path.default.resolve(root, ".kubb/fetch.ts"),
396
+ path: node_path.default.resolve(root, ".kubb/client.ts"),
416
397
  isTypeOnly: true
417
398
  })
418
399
  ] }),
@@ -517,107 +498,91 @@ const infiniteQueryGenerator = (0, _kubb_core.defineGenerator)({
517
498
  });
518
499
  //#endregion
519
500
  //#region src/generators/mutationGenerator.tsx
501
+ /**
502
+ * Built-in generator for `useMutation` hooks. Emits one `useFooMutation` hook
503
+ * per POST/PUT/DELETE operation (configurable via `mutation.methods`) plus
504
+ * the matching `fooMutationKey` / `fooMutationOptions` helpers.
505
+ */
520
506
  const mutationGenerator = (0, _kubb_core.defineGenerator)({
521
507
  name: "react-query-mutation",
522
- renderer: _kubb_renderer_jsx.jsxRenderer,
508
+ renderer: _kubb_renderer_jsx.jsxRendererSync,
523
509
  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;
510
+ if (!_kubb_core.ast.isHttpOperationNode(node)) return null;
511
+ const { config, driver, resolver, root } = ctx;
512
+ const { output, query, mutation, paramsCasing, paramsType, pathParamsType, parser, client: clientOptions, group, customOptions } = ctx.options;
526
513
  const pluginTs = driver.getPlugin(_kubb_plugin_ts.pluginTsName);
527
514
  if (!pluginTs) return null;
528
515
  const tsResolver = driver.getResolver(_kubb_plugin_ts.pluginTsName);
529
516
  const isQuery = query === false || !!query && query.methods.some((method) => node.method.toLowerCase() === method.toLowerCase());
530
517
  if (!(mutation !== false && !isQuery && (0, remeda.difference)(mutation ? mutation.methods : [], query ? query.methods : []).some((method) => node.method.toLowerCase() === method.toLowerCase()))) return null;
531
518
  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);
519
+ const mutationHookName = resolver.resolveMutationName(node);
520
+ const mutationTypeName = resolver.resolveMutationTypeName(node);
521
+ const mutationOptionsName = resolver.resolveMutationOptionsName(node);
522
+ const mutationKeyName = resolver.resolveMutationKeyName(node);
523
+ const clientName = resolver.resolveClientName(node);
539
524
  const meta = {
540
- file: resolver.resolveFile({
541
- name: mutationHookName,
542
- extname: ".ts",
543
- tag: node.tags[0] ?? "default",
544
- path: node.path
545
- }, {
525
+ file: resolver.resolveFile(require_components.operationFileEntry(node, mutationHookName), {
546
526
  root,
547
527
  output,
548
- group
528
+ group: group ?? void 0
549
529
  }),
550
- fileTs: tsResolver.resolveFile({
551
- name: node.operationId,
552
- extname: ".ts",
553
- tag: node.tags[0] ?? "default",
554
- path: node.path
555
- }, {
530
+ fileTs: tsResolver.resolveFile(require_components.operationFileEntry(node, node.operationId), {
556
531
  root,
557
532
  output: pluginTs.options?.output ?? output,
558
- group: pluginTs.options?.group
533
+ group: pluginTs.options?.group ?? void 0
559
534
  })
560
535
  };
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
- }, {
536
+ const importedTypeNames = require_components.resolveOperationTypeNames(node, tsResolver, {
537
+ paramsCasing,
538
+ order: "body-response-first"
539
+ });
540
+ const pluginZod = parser === "zod" ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : null;
541
+ const zodResolver = pluginZod ? driver.getResolver(_kubb_plugin_zod.pluginZodName) : null;
542
+ const fileZod = zodResolver ? zodResolver.resolveFile(require_components.operationFileEntry(node, node.operationId), {
581
543
  root,
582
544
  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) : [];
545
+ group: pluginZod?.options?.group ?? void 0
546
+ }) : null;
547
+ const zodSchemaNames = require_components.resolveZodSchemaNames(node, zodResolver);
586
548
  const clientPlugin = driver.getPlugin(_kubb_plugin_client.pluginClientName);
587
549
  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
- }, {
550
+ const clientResolver = shouldUseClientPlugin ? driver.getResolver(_kubb_plugin_client.pluginClientName) : null;
551
+ const clientFile = shouldUseClientPlugin ? clientResolver?.resolveFile(require_components.operationFileEntry(node, node.operationId), {
595
552
  root,
596
553
  output: clientPlugin?.options?.output ?? output,
597
- group: clientPlugin?.options?.group
598
- }) : void 0;
554
+ group: clientPlugin?.options?.group ?? void 0
555
+ }) : null;
599
556
  const resolvedClientName = shouldUseClientPlugin ? clientResolver?.resolveName(node.operationId) ?? clientName : clientName;
600
557
  return /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx.File, {
601
558
  baseName: meta.file.baseName,
602
559
  path: meta.file.path,
603
560
  meta: meta.file.meta,
604
- banner: resolver.resolveBanner(adapter.inputNode, {
561
+ banner: resolver.resolveBanner(ctx.meta, {
605
562
  output,
606
- config
563
+ config,
564
+ file: {
565
+ path: meta.file.path,
566
+ baseName: meta.file.baseName
567
+ }
607
568
  }),
608
- footer: resolver.resolveFooter(adapter.inputNode, {
569
+ footer: resolver.resolveFooter(ctx.meta, {
609
570
  output,
610
- config
571
+ config,
572
+ file: {
573
+ path: meta.file.path,
574
+ baseName: meta.file.baseName
575
+ }
611
576
  }),
612
577
  children: [
613
- parser === "zod" && fileZod && zodSchemaNames.length > 0 && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
578
+ fileZod && zodSchemaNames.length > 0 && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
614
579
  name: zodSchemaNames,
615
580
  root: meta.file.path,
616
581
  path: fileZod.path
617
582
  }),
618
583
  clientOptions.importPath ? /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
619
584
  !shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
620
- name: "fetch",
585
+ name: "client",
621
586
  path: clientOptions.importPath
622
587
  }),
623
588
  /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
@@ -636,9 +601,9 @@ const mutationGenerator = (0, _kubb_core.defineGenerator)({
636
601
  })
637
602
  ] }) : /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
638
603
  !shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
639
- name: ["fetch"],
604
+ name: ["client"],
640
605
  root: meta.file.path,
641
- path: node_path.default.resolve(root, ".kubb/fetch.ts")
606
+ path: node_path.default.resolve(root, ".kubb/client.ts")
642
607
  }),
643
608
  /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
644
609
  name: [
@@ -647,13 +612,13 @@ const mutationGenerator = (0, _kubb_core.defineGenerator)({
647
612
  "ResponseErrorConfig"
648
613
  ],
649
614
  root: meta.file.path,
650
- path: node_path.default.resolve(root, ".kubb/fetch.ts"),
615
+ path: node_path.default.resolve(root, ".kubb/client.ts"),
651
616
  isTypeOnly: true
652
617
  }),
653
618
  clientOptions.dataReturnType === "full" && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
654
619
  name: ["ResponseConfig"],
655
620
  root: meta.file.path,
656
- path: node_path.default.resolve(root, ".kubb/fetch.ts"),
621
+ path: node_path.default.resolve(root, ".kubb/client.ts"),
657
622
  isTypeOnly: true
658
623
  })
659
624
  ] }),
@@ -662,7 +627,7 @@ const mutationGenerator = (0, _kubb_core.defineGenerator)({
662
627
  root: meta.file.path,
663
628
  path: clientFile.path
664
629
  }),
665
- !shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
630
+ !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
631
  name: ["buildFormData"],
667
632
  root: meta.file.path,
668
633
  path: node_path.default.resolve(root, ".kubb/config.ts")
@@ -744,12 +709,18 @@ const mutationGenerator = (0, _kubb_core.defineGenerator)({
744
709
  });
745
710
  //#endregion
746
711
  //#region src/generators/queryGenerator.tsx
712
+ /**
713
+ * Built-in generator for `useQuery` hooks. Emits one `useFooQuery` hook per
714
+ * GET operation (configurable via `query.methods`) plus the matching
715
+ * `fooQueryKey` / `fooQueryOptions` helpers.
716
+ */
747
717
  const queryGenerator = (0, _kubb_core.defineGenerator)({
748
718
  name: "react-query",
749
- renderer: _kubb_renderer_jsx.jsxRenderer,
719
+ renderer: _kubb_renderer_jsx.jsxRendererSync,
750
720
  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;
721
+ if (!_kubb_core.ast.isHttpOperationNode(node)) return null;
722
+ const { config, driver, resolver, root } = ctx;
723
+ const { output, query, mutation, paramsCasing, paramsType, pathParamsType, parser, client: clientOptions, group, customOptions } = ctx.options;
753
724
  const pluginTs = driver.getPlugin(_kubb_plugin_ts.pluginTsName);
754
725
  if (!pluginTs) return null;
755
726
  const tsResolver = driver.getResolver(_kubb_plugin_ts.pluginTsName);
@@ -757,95 +728,74 @@ const queryGenerator = (0, _kubb_core.defineGenerator)({
757
728
  const isMutation = mutation !== false && !isQuery && (0, remeda.difference)(mutation ? mutation.methods : [], query ? query.methods : []).some((method) => node.method.toLowerCase() === method.toLowerCase());
758
729
  if (!isQuery || isMutation) return null;
759
730
  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);
731
+ const queryName = resolver.resolveQueryName(node);
732
+ const queryOptionsName = resolver.resolveQueryOptionsName(node);
733
+ const queryKeyName = resolver.resolveQueryKeyName(node);
734
+ const queryKeyTypeName = resolver.resolveQueryKeyTypeName(node);
735
+ const clientName = resolver.resolveClientName(node);
767
736
  const meta = {
768
- file: resolver.resolveFile({
769
- name: queryName,
770
- extname: ".ts",
771
- tag: node.tags[0] ?? "default",
772
- path: node.path
773
- }, {
737
+ file: resolver.resolveFile(require_components.operationFileEntry(node, queryName), {
774
738
  root,
775
739
  output,
776
- group
740
+ group: group ?? void 0
777
741
  }),
778
- fileTs: tsResolver.resolveFile({
779
- name: node.operationId,
780
- extname: ".ts",
781
- tag: node.tags[0] ?? "default",
782
- path: node.path
783
- }, {
742
+ fileTs: tsResolver.resolveFile(require_components.operationFileEntry(node, node.operationId), {
784
743
  root,
785
744
  output: pluginTs.options?.output ?? output,
786
- group: pluginTs.options?.group
745
+ group: pluginTs.options?.group ?? void 0
787
746
  })
788
747
  };
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
- }, {
748
+ const importedTypeNames = require_components.resolveOperationTypeNames(node, tsResolver, {
749
+ paramsCasing,
750
+ exclude: [queryKeyTypeName],
751
+ order: "body-response-first"
752
+ });
753
+ const pluginZod = parser === "zod" ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : null;
754
+ const zodResolver = pluginZod ? driver.getResolver(_kubb_plugin_zod.pluginZodName) : null;
755
+ const fileZod = zodResolver ? zodResolver.resolveFile(require_components.operationFileEntry(node, node.operationId), {
809
756
  root,
810
757
  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) : [];
758
+ group: pluginZod?.options?.group ?? void 0
759
+ }) : null;
760
+ const zodSchemaNames = require_components.resolveZodSchemaNames(node, zodResolver);
814
761
  const clientPlugin = driver.getPlugin(_kubb_plugin_client.pluginClientName);
815
762
  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
- }, {
763
+ const clientResolver = shouldUseClientPlugin ? driver.getResolver(_kubb_plugin_client.pluginClientName) : null;
764
+ const clientFile = shouldUseClientPlugin ? clientResolver?.resolveFile(require_components.operationFileEntry(node, node.operationId), {
823
765
  root,
824
766
  output: clientPlugin?.options?.output ?? output,
825
- group: clientPlugin?.options?.group
826
- }) : void 0;
767
+ group: clientPlugin?.options?.group ?? void 0
768
+ }) : null;
827
769
  const resolvedClientName = shouldUseClientPlugin ? clientResolver?.resolveName(node.operationId) ?? clientName : clientName;
828
770
  return /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx.File, {
829
771
  baseName: meta.file.baseName,
830
772
  path: meta.file.path,
831
773
  meta: meta.file.meta,
832
- banner: resolver.resolveBanner(adapter.inputNode, {
774
+ banner: resolver.resolveBanner(ctx.meta, {
833
775
  output,
834
- config
776
+ config,
777
+ file: {
778
+ path: meta.file.path,
779
+ baseName: meta.file.baseName
780
+ }
835
781
  }),
836
- footer: resolver.resolveFooter(adapter.inputNode, {
782
+ footer: resolver.resolveFooter(ctx.meta, {
837
783
  output,
838
- config
784
+ config,
785
+ file: {
786
+ path: meta.file.path,
787
+ baseName: meta.file.baseName
788
+ }
839
789
  }),
840
790
  children: [
841
- parser === "zod" && fileZod && zodSchemaNames.length > 0 && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
791
+ fileZod && zodSchemaNames.length > 0 && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
842
792
  name: zodSchemaNames,
843
793
  root: meta.file.path,
844
794
  path: fileZod.path
845
795
  }),
846
796
  clientOptions.importPath ? /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
847
797
  !shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
848
- name: "fetch",
798
+ name: "client",
849
799
  path: clientOptions.importPath
850
800
  }),
851
801
  /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
@@ -864,9 +814,9 @@ const queryGenerator = (0, _kubb_core.defineGenerator)({
864
814
  })
865
815
  ] }) : /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
866
816
  !shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
867
- name: ["fetch"],
817
+ name: ["client"],
868
818
  root: meta.file.path,
869
- path: node_path.default.resolve(root, ".kubb/fetch.ts")
819
+ path: node_path.default.resolve(root, ".kubb/client.ts")
870
820
  }),
871
821
  /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
872
822
  name: [
@@ -875,13 +825,13 @@ const queryGenerator = (0, _kubb_core.defineGenerator)({
875
825
  "ResponseErrorConfig"
876
826
  ],
877
827
  root: meta.file.path,
878
- path: node_path.default.resolve(root, ".kubb/fetch.ts"),
828
+ path: node_path.default.resolve(root, ".kubb/client.ts"),
879
829
  isTypeOnly: true
880
830
  }),
881
831
  clientOptions.dataReturnType === "full" && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
882
832
  name: ["ResponseConfig"],
883
833
  root: meta.file.path,
884
- path: node_path.default.resolve(root, ".kubb/fetch.ts"),
834
+ path: node_path.default.resolve(root, ".kubb/client.ts"),
885
835
  isTypeOnly: true
886
836
  })
887
837
  ] }),
@@ -976,115 +926,100 @@ const queryGenerator = (0, _kubb_core.defineGenerator)({
976
926
  });
977
927
  //#endregion
978
928
  //#region src/generators/suspenseInfiniteQueryGenerator.tsx
929
+ /**
930
+ * Built-in generator for `useSuspenseInfiniteQuery` hooks. Enabled when both
931
+ * `suspense` and `infinite` are configured. Combines suspense semantics with
932
+ * cursor-based pagination — handlers throw promises while loading and pull
933
+ * additional pages on demand.
934
+ */
979
935
  const suspenseInfiniteQueryGenerator = (0, _kubb_core.defineGenerator)({
980
936
  name: "react-suspense-infinite-query",
981
- renderer: _kubb_renderer_jsx.jsxRenderer,
937
+ renderer: _kubb_renderer_jsx.jsxRendererSync,
982
938
  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;
939
+ if (!_kubb_core.ast.isHttpOperationNode(node)) return null;
940
+ const { config, driver, resolver, root } = ctx;
941
+ const { output, query, mutation, infinite, suspense, paramsCasing, paramsType, pathParamsType, parser, client: clientOptions, group, customOptions } = ctx.options;
985
942
  const pluginTs = driver.getPlugin(_kubb_plugin_ts.pluginTsName);
986
943
  if (!pluginTs) return null;
987
944
  const tsResolver = driver.getResolver(_kubb_plugin_ts.pluginTsName);
988
945
  const isQuery = query === false || !!query && query.methods.some((method) => node.method.toLowerCase() === method.toLowerCase());
989
946
  const isMutation = mutation !== false && !isQuery && (0, remeda.difference)(mutation ? mutation.methods : [], query ? query.methods : []).some((method) => node.method.toLowerCase() === method.toLowerCase());
990
947
  const isSuspense = !!suspense;
991
- const infiniteOptions = infinite && typeof infinite === "object" ? infinite : void 0;
948
+ const infiniteOptions = infinite && typeof infinite === "object" ? infinite : null;
992
949
  if (!isQuery || isMutation || !isSuspense || !infiniteOptions) return null;
993
950
  const normalizeKey = (key) => key.replace(/\?$/, "");
994
- const queryParamKeys = node.parameters.filter((p) => p.in === "query").map((p) => p.name);
951
+ const queryParamKeys = require_components.getOperationParameters(node).query.map((p) => p.name);
995
952
  const hasQueryParam = infiniteOptions.queryParam ? queryParamKeys.some((k) => normalizeKey(k) === infiniteOptions.queryParam) : false;
996
953
  const hasCursorParam = !infiniteOptions.cursorParam || true;
997
954
  if (!hasQueryParam || !hasCursorParam) return null;
998
955
  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);
956
+ const queryName = resolver.resolveSuspenseInfiniteQueryName(node);
957
+ const queryOptionsName = resolver.resolveSuspenseInfiniteQueryOptionsName(node);
958
+ const queryKeyName = resolver.resolveSuspenseInfiniteQueryKeyName(node);
959
+ const queryKeyTypeName = resolver.resolveSuspenseInfiniteQueryKeyTypeName(node);
960
+ const clientBaseName = resolver.resolveSuspenseInfiniteClientName(node);
1006
961
  const meta = {
1007
- file: resolver.resolveFile({
1008
- name: queryName,
1009
- extname: ".ts",
1010
- tag: node.tags[0] ?? "default",
1011
- path: node.path
1012
- }, {
962
+ file: resolver.resolveFile(require_components.operationFileEntry(node, queryName), {
1013
963
  root,
1014
964
  output,
1015
- group
965
+ group: group ?? void 0
1016
966
  }),
1017
- fileTs: tsResolver.resolveFile({
1018
- name: node.operationId,
1019
- extname: ".ts",
1020
- tag: node.tags[0] ?? "default",
1021
- path: node.path
1022
- }, {
967
+ fileTs: tsResolver.resolveFile(require_components.operationFileEntry(node, node.operationId), {
1023
968
  root,
1024
969
  output: pluginTs.options?.output ?? output,
1025
- group: pluginTs.options?.group
970
+ group: pluginTs.options?.group ?? void 0
1026
971
  })
1027
972
  };
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
- }, {
973
+ const importedTypeNames = require_components.resolveOperationTypeNames(node, tsResolver, {
974
+ paramsCasing,
975
+ order: "body-response-first"
976
+ });
977
+ const pluginZod = parser === "zod" ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : null;
978
+ const zodResolver = pluginZod ? driver.getResolver(_kubb_plugin_zod.pluginZodName) : null;
979
+ const fileZod = zodResolver ? zodResolver.resolveFile(require_components.operationFileEntry(node, node.operationId), {
1048
980
  root,
1049
981
  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) : [];
982
+ group: pluginZod?.options?.group ?? void 0
983
+ }) : null;
984
+ const zodSchemaNames = require_components.resolveZodSchemaNames(node, zodResolver);
1053
985
  const clientPlugin = driver.getPlugin(_kubb_plugin_client.pluginClientName);
1054
986
  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
- }, {
987
+ const clientResolver = shouldUseClientPlugin ? driver.getResolver(_kubb_plugin_client.pluginClientName) : null;
988
+ const clientFile = shouldUseClientPlugin ? clientResolver?.resolveFile(require_components.operationFileEntry(node, node.operationId), {
1062
989
  root,
1063
990
  output: clientPlugin?.options?.output ?? output,
1064
- group: clientPlugin?.options?.group
1065
- }) : void 0;
991
+ group: clientPlugin?.options?.group ?? void 0
992
+ }) : null;
1066
993
  const resolvedClientName = shouldUseClientPlugin ? clientResolver?.resolveName(node.operationId) ?? clientBaseName : clientBaseName;
1067
994
  return /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx.File, {
1068
995
  baseName: meta.file.baseName,
1069
996
  path: meta.file.path,
1070
997
  meta: meta.file.meta,
1071
- banner: resolver.resolveBanner(adapter.inputNode, {
998
+ banner: resolver.resolveBanner(ctx.meta, {
1072
999
  output,
1073
- config
1000
+ config,
1001
+ file: {
1002
+ path: meta.file.path,
1003
+ baseName: meta.file.baseName
1004
+ }
1074
1005
  }),
1075
- footer: resolver.resolveFooter(adapter.inputNode, {
1006
+ footer: resolver.resolveFooter(ctx.meta, {
1076
1007
  output,
1077
- config
1008
+ config,
1009
+ file: {
1010
+ path: meta.file.path,
1011
+ baseName: meta.file.baseName
1012
+ }
1078
1013
  }),
1079
1014
  children: [
1080
- parser === "zod" && fileZod && zodSchemaNames.length > 0 && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1015
+ fileZod && zodSchemaNames.length > 0 && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1081
1016
  name: zodSchemaNames,
1082
1017
  root: meta.file.path,
1083
1018
  path: fileZod.path
1084
1019
  }),
1085
1020
  clientOptions.importPath ? /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
1086
1021
  !shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1087
- name: "fetch",
1022
+ name: "client",
1088
1023
  path: clientOptions.importPath
1089
1024
  }),
1090
1025
  /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
@@ -1103,9 +1038,9 @@ const suspenseInfiniteQueryGenerator = (0, _kubb_core.defineGenerator)({
1103
1038
  })
1104
1039
  ] }) : /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
1105
1040
  !shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1106
- name: ["fetch"],
1041
+ name: ["client"],
1107
1042
  root: meta.file.path,
1108
- path: node_path.default.resolve(root, ".kubb/fetch.ts")
1043
+ path: node_path.default.resolve(root, ".kubb/client.ts")
1109
1044
  }),
1110
1045
  /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1111
1046
  name: [
@@ -1114,13 +1049,13 @@ const suspenseInfiniteQueryGenerator = (0, _kubb_core.defineGenerator)({
1114
1049
  "ResponseErrorConfig"
1115
1050
  ],
1116
1051
  root: meta.file.path,
1117
- path: node_path.default.resolve(root, ".kubb/fetch.ts"),
1052
+ path: node_path.default.resolve(root, ".kubb/client.ts"),
1118
1053
  isTypeOnly: true
1119
1054
  }),
1120
1055
  clientOptions.dataReturnType === "full" && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1121
1056
  name: ["ResponseConfig"],
1122
1057
  root: meta.file.path,
1123
- path: node_path.default.resolve(root, ".kubb/fetch.ts"),
1058
+ path: node_path.default.resolve(root, ".kubb/client.ts"),
1124
1059
  isTypeOnly: true
1125
1060
  })
1126
1061
  ] }),
@@ -1225,12 +1160,19 @@ const suspenseInfiniteQueryGenerator = (0, _kubb_core.defineGenerator)({
1225
1160
  });
1226
1161
  //#endregion
1227
1162
  //#region src/generators/suspenseQueryGenerator.tsx
1163
+ /**
1164
+ * Built-in generator for `useSuspenseQuery` hooks. Enabled when
1165
+ * `pluginReactQuery({ suspense: {} })`. Emits one `useFooSuspenseQuery` hook
1166
+ * per query operation. Suspense queries throw promises while loading and
1167
+ * require a `<Suspense>` boundary in the React tree. TanStack Query v5+ only.
1168
+ */
1228
1169
  const suspenseQueryGenerator = (0, _kubb_core.defineGenerator)({
1229
1170
  name: "react-suspense-query",
1230
- renderer: _kubb_renderer_jsx.jsxRenderer,
1171
+ renderer: _kubb_renderer_jsx.jsxRendererSync,
1231
1172
  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;
1173
+ if (!_kubb_core.ast.isHttpOperationNode(node)) return null;
1174
+ const { config, driver, resolver, root } = ctx;
1175
+ const { output, query, mutation, suspense, paramsCasing, paramsType, pathParamsType, parser, client: clientOptions, group, customOptions } = ctx.options;
1234
1176
  const pluginTs = driver.getPlugin(_kubb_plugin_ts.pluginTsName);
1235
1177
  if (!pluginTs) return null;
1236
1178
  const tsResolver = driver.getResolver(_kubb_plugin_ts.pluginTsName);
@@ -1238,95 +1180,74 @@ const suspenseQueryGenerator = (0, _kubb_core.defineGenerator)({
1238
1180
  const isMutation = mutation !== false && !isQuery && (0, remeda.difference)(mutation ? mutation.methods : [], query ? query.methods : []).some((method) => node.method.toLowerCase() === method.toLowerCase());
1239
1181
  if (!isQuery || isMutation || !!!suspense) return null;
1240
1182
  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);
1183
+ const queryName = resolver.resolveSuspenseQueryName(node);
1184
+ const queryOptionsName = resolver.resolveSuspenseQueryOptionsName(node);
1185
+ const queryKeyName = resolver.resolveSuspenseQueryKeyName(node);
1186
+ const queryKeyTypeName = resolver.resolveSuspenseQueryKeyTypeName(node);
1187
+ const clientName = resolver.resolveSuspenseClientName(node);
1248
1188
  const meta = {
1249
- file: resolver.resolveFile({
1250
- name: queryName,
1251
- extname: ".ts",
1252
- tag: node.tags[0] ?? "default",
1253
- path: node.path
1254
- }, {
1189
+ file: resolver.resolveFile(require_components.operationFileEntry(node, queryName), {
1255
1190
  root,
1256
1191
  output,
1257
- group
1192
+ group: group ?? void 0
1258
1193
  }),
1259
- fileTs: tsResolver.resolveFile({
1260
- name: node.operationId,
1261
- extname: ".ts",
1262
- tag: node.tags[0] ?? "default",
1263
- path: node.path
1264
- }, {
1194
+ fileTs: tsResolver.resolveFile(require_components.operationFileEntry(node, node.operationId), {
1265
1195
  root,
1266
1196
  output: pluginTs.options?.output ?? output,
1267
- group: pluginTs.options?.group
1197
+ group: pluginTs.options?.group ?? void 0
1268
1198
  })
1269
1199
  };
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
- }, {
1200
+ const importedTypeNames = require_components.resolveOperationTypeNames(node, tsResolver, {
1201
+ paramsCasing,
1202
+ exclude: [queryKeyTypeName],
1203
+ order: "body-response-first"
1204
+ });
1205
+ const pluginZod = parser === "zod" ? driver.getPlugin(_kubb_plugin_zod.pluginZodName) : null;
1206
+ const zodResolver = pluginZod ? driver.getResolver(_kubb_plugin_zod.pluginZodName) : null;
1207
+ const fileZod = zodResolver ? zodResolver.resolveFile(require_components.operationFileEntry(node, node.operationId), {
1290
1208
  root,
1291
1209
  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) : [];
1210
+ group: pluginZod?.options?.group ?? void 0
1211
+ }) : null;
1212
+ const zodSchemaNames = require_components.resolveZodSchemaNames(node, zodResolver);
1295
1213
  const clientPlugin = driver.getPlugin(_kubb_plugin_client.pluginClientName);
1296
1214
  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
- }, {
1215
+ const clientResolver = shouldUseClientPlugin ? driver.getResolver(_kubb_plugin_client.pluginClientName) : null;
1216
+ const clientFile = shouldUseClientPlugin ? clientResolver?.resolveFile(require_components.operationFileEntry(node, node.operationId), {
1304
1217
  root,
1305
1218
  output: clientPlugin?.options?.output ?? output,
1306
- group: clientPlugin?.options?.group
1307
- }) : void 0;
1219
+ group: clientPlugin?.options?.group ?? void 0
1220
+ }) : null;
1308
1221
  const resolvedClientName = shouldUseClientPlugin ? clientResolver?.resolveName(node.operationId) ?? clientName : clientName;
1309
1222
  return /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx.File, {
1310
1223
  baseName: meta.file.baseName,
1311
1224
  path: meta.file.path,
1312
1225
  meta: meta.file.meta,
1313
- banner: resolver.resolveBanner(adapter.inputNode, {
1226
+ banner: resolver.resolveBanner(ctx.meta, {
1314
1227
  output,
1315
- config
1228
+ config,
1229
+ file: {
1230
+ path: meta.file.path,
1231
+ baseName: meta.file.baseName
1232
+ }
1316
1233
  }),
1317
- footer: resolver.resolveFooter(adapter.inputNode, {
1234
+ footer: resolver.resolveFooter(ctx.meta, {
1318
1235
  output,
1319
- config
1236
+ config,
1237
+ file: {
1238
+ path: meta.file.path,
1239
+ baseName: meta.file.baseName
1240
+ }
1320
1241
  }),
1321
1242
  children: [
1322
- parser === "zod" && fileZod && zodSchemaNames.length > 0 && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1243
+ fileZod && zodSchemaNames.length > 0 && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1323
1244
  name: zodSchemaNames,
1324
1245
  root: meta.file.path,
1325
1246
  path: fileZod.path
1326
1247
  }),
1327
1248
  clientOptions.importPath ? /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
1328
1249
  !shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1329
- name: "fetch",
1250
+ name: "client",
1330
1251
  path: clientOptions.importPath
1331
1252
  }),
1332
1253
  /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
@@ -1345,9 +1266,9 @@ const suspenseQueryGenerator = (0, _kubb_core.defineGenerator)({
1345
1266
  })
1346
1267
  ] }) : /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
1347
1268
  !shouldUseClientPlugin && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1348
- name: ["fetch"],
1269
+ name: ["client"],
1349
1270
  root: meta.file.path,
1350
- path: node_path.default.resolve(root, ".kubb/fetch.ts")
1271
+ path: node_path.default.resolve(root, ".kubb/client.ts")
1351
1272
  }),
1352
1273
  /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1353
1274
  name: [
@@ -1356,13 +1277,13 @@ const suspenseQueryGenerator = (0, _kubb_core.defineGenerator)({
1356
1277
  "ResponseErrorConfig"
1357
1278
  ],
1358
1279
  root: meta.file.path,
1359
- path: node_path.default.resolve(root, ".kubb/fetch.ts"),
1280
+ path: node_path.default.resolve(root, ".kubb/client.ts"),
1360
1281
  isTypeOnly: true
1361
1282
  }),
1362
1283
  clientOptions.dataReturnType === "full" && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
1363
1284
  name: ["ResponseConfig"],
1364
1285
  root: meta.file.path,
1365
- path: node_path.default.resolve(root, ".kubb/fetch.ts"),
1286
+ path: node_path.default.resolve(root, ".kubb/client.ts"),
1366
1287
  isTypeOnly: true
1367
1288
  })
1368
1289
  ] }),
@@ -1420,7 +1341,8 @@ const suspenseQueryGenerator = (0, _kubb_core.defineGenerator)({
1420
1341
  paramsCasing,
1421
1342
  paramsType,
1422
1343
  pathParamsType,
1423
- dataReturnType: clientOptions.dataReturnType || "data"
1344
+ dataReturnType: clientOptions.dataReturnType || "data",
1345
+ suspense: true
1424
1346
  }),
1425
1347
  suspense && /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsxs)(_kubb_renderer_jsx_jsx_runtime.Fragment, { children: [
1426
1348
  /* @__PURE__ */ (0, _kubb_renderer_jsx_jsx_runtime.jsx)(_kubb_renderer_jsx.File.Import, {
@@ -1499,4 +1421,4 @@ Object.defineProperty(exports, "suspenseQueryGenerator", {
1499
1421
  }
1500
1422
  });
1501
1423
 
1502
- //# sourceMappingURL=generators-CWEQsdO9.cjs.map
1424
+ //# sourceMappingURL=generators--AcF4Y4n.cjs.map