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

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