@kubb/plugin-vue-query 5.0.0-beta.42 → 5.0.0-beta.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{components-Bxe1EuWf.js → components-B79Gljyl.js} +176 -214
- package/dist/components-B79Gljyl.js.map +1 -0
- package/dist/{components-BwFPMwK7.cjs → components-D3xIZ9FA.cjs} +178 -216
- package/dist/components-D3xIZ9FA.cjs.map +1 -0
- package/dist/components.cjs +1 -1
- package/dist/components.d.ts +1 -1
- package/dist/components.js +1 -1
- package/dist/{generators-BSN6A0ED.cjs → generators-BTtcGtUY.cjs} +91 -137
- package/dist/generators-BTtcGtUY.cjs.map +1 -0
- package/dist/{generators-D9TUvYRN.js → generators-D95ddIFV.js} +93 -139
- package/dist/generators-D95ddIFV.js.map +1 -0
- package/dist/generators.cjs +1 -1
- package/dist/generators.d.ts +1 -1
- package/dist/generators.js +1 -1
- package/dist/index.cjs +35 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +36 -13
- package/dist/index.js.map +1 -1
- package/dist/{types-HHnnlEhK.d.ts → types-CwabLiFK.d.ts} +10 -14
- package/package.json +10 -17
- package/src/components/InfiniteQuery.tsx +3 -3
- package/src/components/InfiniteQueryOptions.tsx +24 -27
- package/src/components/Mutation.tsx +3 -3
- package/src/components/Query.tsx +3 -3
- package/src/components/QueryOptions.tsx +6 -27
- package/src/generators/infiniteQueryGenerator.tsx +5 -9
- package/src/generators/mutationGenerator.tsx +8 -9
- package/src/generators/queryGenerator.tsx +5 -9
- package/src/plugin.ts +4 -4
- package/src/resolvers/resolverVueQuery.ts +2 -2
- package/src/types.ts +9 -13
- package/src/utils.ts +1 -0
- package/dist/components-BwFPMwK7.cjs.map +0 -1
- package/dist/components-Bxe1EuWf.js.map +0 -1
- package/dist/generators-BSN6A0ED.cjs.map +0 -1
- package/dist/generators-D9TUvYRN.js.map +0 -1
- package/extension.yaml +0 -1248
package/dist/index.cjs
CHANGED
|
@@ -2,8 +2,8 @@ Object.defineProperties(exports, {
|
|
|
2
2
|
__esModule: { value: true },
|
|
3
3
|
[Symbol.toStringTag]: { value: "Module" }
|
|
4
4
|
});
|
|
5
|
-
const require_components = require("./components-
|
|
6
|
-
const require_generators = require("./generators-
|
|
5
|
+
const require_components = require("./components-D3xIZ9FA.cjs");
|
|
6
|
+
const require_generators = require("./generators-BTtcGtUY.cjs");
|
|
7
7
|
let node_path = require("node:path");
|
|
8
8
|
node_path = require_components.__toESM(node_path, 1);
|
|
9
9
|
let _kubb_core = require("@kubb/core");
|
|
@@ -13,32 +13,55 @@ let _kubb_plugin_client_templates_clients_fetch_source = require("@kubb/plugin-c
|
|
|
13
13
|
let _kubb_plugin_client_templates_config_source = require("@kubb/plugin-client/templates/config.source");
|
|
14
14
|
let _kubb_plugin_ts = require("@kubb/plugin-ts");
|
|
15
15
|
let _kubb_plugin_zod = require("@kubb/plugin-zod");
|
|
16
|
+
//#region ../../internals/utils/src/fs.ts
|
|
17
|
+
/**
|
|
18
|
+
* Builds a nested file path from a dotted name. Splits on dots that precede a letter
|
|
19
|
+
* (so version numbers embedded in operationIds like `v2025.0` stay intact), camelCases
|
|
20
|
+
* every earlier segment, applies `caseLast` to the final segment, and joins with `/`.
|
|
21
|
+
*
|
|
22
|
+
* Empty segments are dropped before joining. They arise when the name starts with a dot
|
|
23
|
+
* followed by a letter (e.g. `..Schema` splits into `['..', 'Schema']` and `'..'` cases to
|
|
24
|
+
* an empty string). Without this a leading `/` would form, which `path.resolve` reads as an
|
|
25
|
+
* absolute path, letting generated files escape the configured output directory.
|
|
26
|
+
*
|
|
27
|
+
* @example Nested path from a dotted name
|
|
28
|
+
* `toFilePath('pet.petId') // 'pet/petId'`
|
|
29
|
+
*
|
|
30
|
+
* @example PascalCase the final segment
|
|
31
|
+
* `toFilePath('pet.Pet', pascalCase) // 'pet/Pet'`
|
|
32
|
+
*
|
|
33
|
+
* @example Suffix applied to the final segment only
|
|
34
|
+
* `toFilePath('tag.tag', (part) => camelCase(part, { suffix: 'schema' })) // 'tag/tagSchema'`
|
|
35
|
+
*/
|
|
36
|
+
function toFilePath(name, caseLast = require_components.camelCase) {
|
|
37
|
+
const parts = name.split(/\.(?=[a-zA-Z])/);
|
|
38
|
+
return parts.map((part, i) => i === parts.length - 1 ? caseLast(part) : require_components.camelCase(part)).filter(Boolean).join("/");
|
|
39
|
+
}
|
|
40
|
+
//#endregion
|
|
16
41
|
//#region ../../internals/shared/src/group.ts
|
|
17
42
|
/**
|
|
18
43
|
* Builds the `group` config a Kubb plugin passes to `ctx.setOptions`, applying the
|
|
19
44
|
* shared default naming so every plugin groups output consistently:
|
|
20
45
|
*
|
|
21
46
|
* - `path` groups use the second path segment (`/pet/findByStatus` → `pet`).
|
|
22
|
-
* - other groups use
|
|
47
|
+
* - other groups use the camelCased group (`pet store` → `petStore`).
|
|
23
48
|
*
|
|
24
49
|
* A user-provided `group.name` always wins over the default namer, so callers stay in
|
|
25
50
|
* control of their output folders. Returns `null` when grouping is disabled, matching the
|
|
26
51
|
* per-plugin convention.
|
|
27
52
|
*
|
|
28
53
|
* @param group - The user-supplied group option, or `undefined` to disable grouping.
|
|
29
|
-
* @param options.suffix - Appended to non-`path` group names, e.g. `'Controller'` or `'Requests'`.
|
|
30
54
|
*
|
|
31
55
|
* @example
|
|
32
56
|
* ```ts
|
|
33
|
-
* createGroupConfig(group
|
|
34
|
-
* createGroupConfig(group, { suffix: 'Requests' }) // plugin-cypress, plugin-mcp
|
|
57
|
+
* createGroupConfig(group) // shared across every plugin
|
|
35
58
|
* ```
|
|
36
59
|
*/
|
|
37
|
-
function createGroupConfig(group
|
|
60
|
+
function createGroupConfig(group) {
|
|
38
61
|
if (!group) return null;
|
|
39
62
|
const defaultName = (ctx) => {
|
|
40
63
|
if (group.type === "path") return `${ctx.group.split("/")[1]}`;
|
|
41
|
-
return
|
|
64
|
+
return require_components.camelCase(ctx.group);
|
|
42
65
|
};
|
|
43
66
|
return {
|
|
44
67
|
...group,
|
|
@@ -70,7 +93,7 @@ const resolverVueQuery = (0, _kubb_core.defineResolver)(() => ({
|
|
|
70
93
|
name: "default",
|
|
71
94
|
pluginName: "plugin-vue-query",
|
|
72
95
|
default(name, type) {
|
|
73
|
-
return
|
|
96
|
+
return type === "file" ? toFilePath(name) : require_components.camelCase(name);
|
|
74
97
|
},
|
|
75
98
|
resolveName(name) {
|
|
76
99
|
return this.default(name, "function");
|
|
@@ -152,7 +175,7 @@ const pluginVueQueryName = "plugin-vue-query";
|
|
|
152
175
|
const pluginVueQuery = (0, _kubb_core.definePlugin)((options) => {
|
|
153
176
|
const { output = {
|
|
154
177
|
path: "hooks",
|
|
155
|
-
|
|
178
|
+
barrel: { type: "named" }
|
|
156
179
|
}, group, exclude = [], include, override = [], parser = false, infinite = false, paramsType = "inline", pathParamsType = paramsType === "object" ? "object" : options.pathParamsType || "inline", mutation = {}, query = {}, mutationKey = require_components.mutationKeyTransformer, queryKey = require_components.queryKeyTransformer, paramsCasing, client, resolver: userResolver, transformer: userTransformer, generators: userGenerators = [] } = options;
|
|
157
180
|
const clientName = client?.client ?? "axios";
|
|
158
181
|
const clientImportPath = client?.importPath ?? (!client?.bundle ? `@kubb/plugin-client/clients/${clientName}` : void 0);
|
|
@@ -161,11 +184,11 @@ const pluginVueQuery = (0, _kubb_core.definePlugin)((options) => {
|
|
|
161
184
|
require_generators.infiniteQueryGenerator,
|
|
162
185
|
require_generators.mutationGenerator
|
|
163
186
|
].filter((generator) => Boolean(generator));
|
|
164
|
-
const groupConfig = createGroupConfig(group
|
|
187
|
+
const groupConfig = createGroupConfig(group);
|
|
165
188
|
return {
|
|
166
189
|
name: pluginVueQueryName,
|
|
167
190
|
options,
|
|
168
|
-
dependencies: [_kubb_plugin_ts.pluginTsName, parser
|
|
191
|
+
dependencies: [_kubb_plugin_ts.pluginTsName, (0, _kubb_plugin_client.isParserEnabled)(parser) ? _kubb_plugin_zod.pluginZodName : void 0].filter((dependency) => Boolean(dependency)),
|
|
169
192
|
hooks: { "kubb:plugin:setup"(ctx) {
|
|
170
193
|
const resolver = userResolver ? {
|
|
171
194
|
...resolverVueQuery,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["camelCase","camelCase","mutationKeyTransformer","queryKeyTransformer","queryGenerator","infiniteQueryGenerator","mutationGenerator","pluginTsName","pluginZodName","path","pluginClientName","ast","fetchClientSource","axiosClientSource","configSource"],"sources":["../../../internals/shared/src/group.ts","../src/resolvers/resolverVueQuery.ts","../src/plugin.ts"],"sourcesContent":["import { camelCase } from '@internals/utils'\nimport type { Group } from '@kubb/core'\n\n/**\n * Builds the `group` config a Kubb plugin passes to `ctx.setOptions`, applying the\n * shared default naming so every plugin groups output consistently:\n *\n * - `path` groups use the second path segment (`/pet/findByStatus` → `pet`).\n * - other groups use `${camelCase(group)}${suffix}` (e.g. `petController`).\n *\n * A user-provided `group.name` always wins over the default namer, so callers stay in\n * control of their output folders. Returns `null` when grouping is disabled, matching the\n * per-plugin convention.\n *\n * @param group - The user-supplied group option, or `undefined` to disable grouping.\n * @param options.suffix - Appended to non-`path` group names, e.g. `'Controller'` or `'Requests'`.\n *\n * @example\n * ```ts\n * createGroupConfig(group, { suffix: 'Controller' }) // plugin-ts, plugin-client, …\n * createGroupConfig(group, { suffix: 'Requests' }) // plugin-cypress, plugin-mcp\n * ```\n */\nexport function createGroupConfig(group: Group | undefined, options: { suffix: string }): Group | null {\n if (!group) {\n return null\n }\n\n const defaultName = (ctx: { group: string }): string => {\n if (group.type === 'path') {\n return `${ctx.group.split('/')[1]}`\n }\n\n return `${camelCase(ctx.group)}${options.suffix}`\n }\n\n return {\n ...group,\n name: group.name ? group.name : defaultName,\n } satisfies Group\n}\n","import { camelCase } from '@internals/utils'\nimport { defineResolver } from '@kubb/core'\nimport type { PluginVueQuery } from '../types.ts'\n\nfunction capitalize(name: string): string {\n return `${name.charAt(0).toUpperCase()}${name.slice(1)}`\n}\n\n/**\n * Default resolver used by `@kubb/plugin-vue-query`. Decides the names and\n * file paths for every generated TanStack Query composable (`useFooQuery`,\n * `useFooMutation`, `useFooInfiniteQuery`) and its companion helpers.\n *\n * Functions and files use camelCase; composables get the `use` prefix.\n *\n * @example Resolve composable and helper names\n * ```ts\n * import { resolverVueQuery } from '@kubb/plugin-vue-query'\n *\n * resolverVueQuery.resolveQueryName(operationNode) // 'useGetPetById'\n * resolverVueQuery.resolveQueryKeyName(operationNode) // 'getPetByIdQueryKey'\n * resolverVueQuery.resolveQueryOptionsName(operationNode) // 'getPetByIdQueryOptions'\n * ```\n */\nexport const resolverVueQuery = defineResolver<PluginVueQuery>(() => ({\n name: 'default',\n pluginName: 'plugin-vue-query',\n default(name, type) {\n return camelCase(name, { isFile: type === 'file' })\n },\n resolveName(name) {\n return this.default(name, 'function')\n },\n resolvePathName(name, type) {\n return this.default(name, type)\n },\n resolveQueryName(node) {\n return `use${capitalize(this.resolveName(node.operationId))}`\n },\n resolveInfiniteQueryName(node) {\n return `use${capitalize(this.resolveName(node.operationId))}Infinite`\n },\n resolveMutationName(node) {\n return `use${capitalize(this.resolveName(node.operationId))}`\n },\n resolveQueryOptionsName(node) {\n return `${this.resolveName(node.operationId)}QueryOptions`\n },\n resolveInfiniteQueryOptionsName(node) {\n return `${this.resolveName(node.operationId)}InfiniteQueryOptions`\n },\n resolveQueryKeyName(node) {\n return `${this.resolveName(node.operationId)}QueryKey`\n },\n resolveInfiniteQueryKeyName(node) {\n return `${this.resolveName(node.operationId)}InfiniteQueryKey`\n },\n resolveMutationKeyName(node) {\n return `${this.resolveName(node.operationId)}MutationKey`\n },\n resolveQueryKeyTypeName(node) {\n return `${capitalize(this.resolveName(node.operationId))}QueryKey`\n },\n resolveInfiniteQueryKeyTypeName(node) {\n return `${capitalize(this.resolveName(node.operationId))}InfiniteQueryKey`\n },\n resolveMutationTypeName(node) {\n return capitalize(this.resolveName(node.operationId))\n },\n resolveClientName(node) {\n return this.resolveName(node.operationId)\n },\n resolveInfiniteClientName(node) {\n return `${this.resolveName(node.operationId)}Infinite`\n },\n}))\n","import path from 'node:path'\nimport { createGroupConfig } from '@internals/shared'\nimport { ast, definePlugin } from '@kubb/core'\nimport { pluginClientName } from '@kubb/plugin-client'\nimport { source as axiosClientSource } from '@kubb/plugin-client/templates/clients/axios.source'\nimport { source as fetchClientSource } from '@kubb/plugin-client/templates/clients/fetch.source'\nimport { source as configSource } from '@kubb/plugin-client/templates/config.source'\nimport { pluginTsName } from '@kubb/plugin-ts'\nimport { pluginZodName } from '@kubb/plugin-zod'\nimport { mutationKeyTransformer } from '@internals/tanstack-query'\nimport { queryKeyTransformer } from '@internals/tanstack-query'\nimport { infiniteQueryGenerator, mutationGenerator, queryGenerator } from './generators'\nimport { resolverVueQuery } from './resolvers/resolverVueQuery.ts'\nimport type { PluginVueQuery } from './types.ts'\n\n/**\n * Canonical plugin name for `@kubb/plugin-vue-query`. Used for driver lookups\n * and cross-plugin dependency references.\n */\nexport const pluginVueQueryName = 'plugin-vue-query' satisfies PluginVueQuery['name']\n\n/**\n * Generates one TanStack Query composable per OpenAPI operation for Vue's\n * Composition API. Queries become `useFooQuery` (and optionally\n * `useFooInfiniteQuery`); mutations become `useFooMutation`. Each composable\n * is fully typed end to end.\n *\n * @example\n * ```ts\n * import { defineConfig } from 'kubb'\n * import { pluginTs } from '@kubb/plugin-ts'\n * import { pluginVueQuery } from '@kubb/plugin-vue-query'\n *\n * export default defineConfig({\n * input: { path: './petStore.yaml' },\n * output: { path: './src/gen' },\n * plugins: [\n * pluginTs(),\n * pluginVueQuery({\n * output: { path: './hooks' },\n * }),\n * ],\n * })\n * ```\n */\nexport const pluginVueQuery = definePlugin<PluginVueQuery>((options) => {\n const {\n output = { path: 'hooks', barrelType: 'named' },\n group,\n exclude = [],\n include,\n override = [],\n parser = false,\n infinite = false,\n paramsType = 'inline',\n pathParamsType = paramsType === 'object' ? 'object' : options.pathParamsType || 'inline',\n mutation = {},\n query = {},\n mutationKey = mutationKeyTransformer,\n queryKey = queryKeyTransformer,\n paramsCasing,\n client,\n resolver: userResolver,\n transformer: userTransformer,\n generators: userGenerators = [],\n } = options\n\n const clientName = client?.client ?? 'axios'\n const clientImportPath = client?.importPath ?? (!client?.bundle ? `@kubb/plugin-client/clients/${clientName}` : undefined)\n\n const selectedGenerators =\n options.generators ??\n [queryGenerator, infiniteQueryGenerator, mutationGenerator].filter((generator): generator is NonNullable<typeof generator> => Boolean(generator))\n\n const groupConfig = createGroupConfig(group, { suffix: 'Controller' })\n\n return {\n name: pluginVueQueryName,\n options,\n dependencies: [pluginTsName, parser === 'zod' ? pluginZodName : undefined].filter((dependency): dependency is string => Boolean(dependency)),\n hooks: {\n 'kubb:plugin:setup'(ctx) {\n const resolver = userResolver ? { ...resolverVueQuery, ...userResolver } : resolverVueQuery\n\n ctx.setOptions({\n output,\n client: {\n bundle: client?.bundle,\n baseURL: client?.baseURL,\n client: clientName,\n clientType: client?.clientType ?? 'function',\n importPath: clientImportPath,\n dataReturnType: client?.dataReturnType ?? 'data',\n paramsCasing,\n },\n queryKey,\n query:\n query === false\n ? false\n : {\n importPath: '@tanstack/vue-query',\n methods: ['get'],\n ...query,\n },\n mutationKey,\n mutation:\n mutation === false\n ? false\n : {\n importPath: '@tanstack/vue-query',\n methods: ['post', 'put', 'patch', 'delete'],\n ...mutation,\n },\n infinite: infinite\n ? {\n queryParam: 'id',\n initialPageParam: 0,\n cursorParam: null,\n nextParam: null,\n previousParam: null,\n ...infinite,\n }\n : false,\n parser,\n paramsType,\n pathParamsType,\n paramsCasing,\n group: groupConfig,\n exclude,\n include,\n override,\n resolver,\n })\n ctx.setResolver(resolver)\n if (userTransformer) {\n ctx.setTransformer(userTransformer)\n }\n\n for (const gen of selectedGenerators) {\n ctx.addGenerator(gen)\n }\n for (const gen of userGenerators) {\n ctx.addGenerator(gen)\n }\n\n const root = path.resolve(ctx.config.root, ctx.config.output.path)\n const hasClientPlugin = !!ctx.config.plugins?.some((p) => (p as { name?: string }).name === pluginClientName)\n\n if (client?.bundle && !hasClientPlugin && !clientImportPath) {\n ctx.injectFile({\n baseName: 'client.ts',\n path: path.resolve(root, '.kubb/client.ts'),\n sources: [\n ast.createSource({\n name: 'client',\n nodes: [ast.createText(clientName === 'fetch' ? fetchClientSource : axiosClientSource)],\n isExportable: true,\n isIndexable: true,\n }),\n ],\n })\n }\n\n if (!hasClientPlugin) {\n ctx.injectFile({\n baseName: 'config.ts',\n path: path.resolve(root, '.kubb/config.ts'),\n sources: [\n ast.createSource({\n name: 'config',\n nodes: [ast.createText(configSource)],\n isExportable: false,\n isIndexable: false,\n }),\n ],\n })\n }\n },\n },\n }\n})\n\nexport default pluginVueQuery\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBA,SAAgB,kBAAkB,OAA0B,SAA2C;CACrG,IAAI,CAAC,OACH,OAAO;CAGT,MAAM,eAAe,QAAmC;EACtD,IAAI,MAAM,SAAS,QACjB,OAAO,GAAG,IAAI,MAAM,MAAM,GAAG,EAAE;EAGjC,OAAO,GAAGA,mBAAAA,UAAU,IAAI,KAAK,IAAI,QAAQ;CAC3C;CAEA,OAAO;EACL,GAAG;EACH,MAAM,MAAM,OAAO,MAAM,OAAO;CAClC;AACF;;;ACpCA,SAAS,WAAW,MAAsB;CACxC,OAAO,GAAG,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC;AACvD;;;;;;;;;;;;;;;;;AAkBA,MAAa,oBAAA,GAAA,WAAA,uBAAyD;CACpE,MAAM;CACN,YAAY;CACZ,QAAQ,MAAM,MAAM;EAClB,OAAOC,mBAAAA,UAAU,MAAM,EAAE,QAAQ,SAAS,OAAO,CAAC;CACpD;CACA,YAAY,MAAM;EAChB,OAAO,KAAK,QAAQ,MAAM,UAAU;CACtC;CACA,gBAAgB,MAAM,MAAM;EAC1B,OAAO,KAAK,QAAQ,MAAM,IAAI;CAChC;CACA,iBAAiB,MAAM;EACrB,OAAO,MAAM,WAAW,KAAK,YAAY,KAAK,WAAW,CAAC;CAC5D;CACA,yBAAyB,MAAM;EAC7B,OAAO,MAAM,WAAW,KAAK,YAAY,KAAK,WAAW,CAAC,EAAE;CAC9D;CACA,oBAAoB,MAAM;EACxB,OAAO,MAAM,WAAW,KAAK,YAAY,KAAK,WAAW,CAAC;CAC5D;CACA,wBAAwB,MAAM;EAC5B,OAAO,GAAG,KAAK,YAAY,KAAK,WAAW,EAAE;CAC/C;CACA,gCAAgC,MAAM;EACpC,OAAO,GAAG,KAAK,YAAY,KAAK,WAAW,EAAE;CAC/C;CACA,oBAAoB,MAAM;EACxB,OAAO,GAAG,KAAK,YAAY,KAAK,WAAW,EAAE;CAC/C;CACA,4BAA4B,MAAM;EAChC,OAAO,GAAG,KAAK,YAAY,KAAK,WAAW,EAAE;CAC/C;CACA,uBAAuB,MAAM;EAC3B,OAAO,GAAG,KAAK,YAAY,KAAK,WAAW,EAAE;CAC/C;CACA,wBAAwB,MAAM;EAC5B,OAAO,GAAG,WAAW,KAAK,YAAY,KAAK,WAAW,CAAC,EAAE;CAC3D;CACA,gCAAgC,MAAM;EACpC,OAAO,GAAG,WAAW,KAAK,YAAY,KAAK,WAAW,CAAC,EAAE;CAC3D;CACA,wBAAwB,MAAM;EAC5B,OAAO,WAAW,KAAK,YAAY,KAAK,WAAW,CAAC;CACtD;CACA,kBAAkB,MAAM;EACtB,OAAO,KAAK,YAAY,KAAK,WAAW;CAC1C;CACA,0BAA0B,MAAM;EAC9B,OAAO,GAAG,KAAK,YAAY,KAAK,WAAW,EAAE;CAC/C;AACF,EAAE;;;;;;;ACxDF,MAAa,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;AA0BlC,MAAa,kBAAA,GAAA,WAAA,eAA+C,YAAY;CACtE,MAAM,EACJ,SAAS;EAAE,MAAM;EAAS,YAAY;CAAQ,GAC9C,OACA,UAAU,CAAC,GACX,SACA,WAAW,CAAC,GACZ,SAAS,OACT,WAAW,OACX,aAAa,UACb,iBAAiB,eAAe,WAAW,WAAW,QAAQ,kBAAkB,UAChF,WAAW,CAAC,GACZ,QAAQ,CAAC,GACT,cAAcC,mBAAAA,wBACd,WAAWC,mBAAAA,qBACX,cACA,QACA,UAAU,cACV,aAAa,iBACb,YAAY,iBAAiB,CAAC,MAC5B;CAEJ,MAAM,aAAa,QAAQ,UAAU;CACrC,MAAM,mBAAmB,QAAQ,eAAe,CAAC,QAAQ,SAAS,+BAA+B,eAAe,KAAA;CAEhH,MAAM,qBACJ,QAAQ,cACR;EAACC,mBAAAA;EAAgBC,mBAAAA;EAAwBC,mBAAAA;CAAiB,EAAE,QAAQ,cAA0D,QAAQ,SAAS,CAAC;CAElJ,MAAM,cAAc,kBAAkB,OAAO,EAAE,QAAQ,aAAa,CAAC;CAErE,OAAO;EACL,MAAM;EACN;EACA,cAAc,CAACC,gBAAAA,cAAc,WAAW,QAAQC,iBAAAA,gBAAgB,KAAA,CAAS,EAAE,QAAQ,eAAqC,QAAQ,UAAU,CAAC;EAC3I,OAAO,EACL,oBAAoB,KAAK;GACvB,MAAM,WAAW,eAAe;IAAE,GAAG;IAAkB,GAAG;GAAa,IAAI;GAE3E,IAAI,WAAW;IACb;IACA,QAAQ;KACN,QAAQ,QAAQ;KAChB,SAAS,QAAQ;KACjB,QAAQ;KACR,YAAY,QAAQ,cAAc;KAClC,YAAY;KACZ,gBAAgB,QAAQ,kBAAkB;KAC1C;IACF;IACA;IACA,OACE,UAAU,QACN,QACA;KACE,YAAY;KACZ,SAAS,CAAC,KAAK;KACf,GAAG;IACL;IACN;IACA,UACE,aAAa,QACT,QACA;KACE,YAAY;KACZ,SAAS;MAAC;MAAQ;MAAO;MAAS;KAAQ;KAC1C,GAAG;IACL;IACN,UAAU,WACN;KACE,YAAY;KACZ,kBAAkB;KAClB,aAAa;KACb,WAAW;KACX,eAAe;KACf,GAAG;IACL,IACA;IACJ;IACA;IACA;IACA;IACA,OAAO;IACP;IACA;IACA;IACA;GACF,CAAC;GACD,IAAI,YAAY,QAAQ;GACxB,IAAI,iBACF,IAAI,eAAe,eAAe;GAGpC,KAAK,MAAM,OAAO,oBAChB,IAAI,aAAa,GAAG;GAEtB,KAAK,MAAM,OAAO,gBAChB,IAAI,aAAa,GAAG;GAGtB,MAAM,OAAOC,UAAAA,QAAK,QAAQ,IAAI,OAAO,MAAM,IAAI,OAAO,OAAO,IAAI;GACjE,MAAM,kBAAkB,CAAC,CAAC,IAAI,OAAO,SAAS,MAAM,MAAO,EAAwB,SAASC,oBAAAA,gBAAgB;GAE5G,IAAI,QAAQ,UAAU,CAAC,mBAAmB,CAAC,kBACzC,IAAI,WAAW;IACb,UAAU;IACV,MAAMD,UAAAA,QAAK,QAAQ,MAAM,iBAAiB;IAC1C,SAAS,CACPE,WAAAA,IAAI,aAAa;KACf,MAAM;KACN,OAAO,CAACA,WAAAA,IAAI,WAAW,eAAe,UAAUC,mDAAAA,SAAoBC,mDAAAA,MAAiB,CAAC;KACtF,cAAc;KACd,aAAa;IACf,CAAC,CACH;GACF,CAAC;GAGH,IAAI,CAAC,iBACH,IAAI,WAAW;IACb,UAAU;IACV,MAAMJ,UAAAA,QAAK,QAAQ,MAAM,iBAAiB;IAC1C,SAAS,CACPE,WAAAA,IAAI,aAAa;KACf,MAAM;KACN,OAAO,CAACA,WAAAA,IAAI,WAAWG,4CAAAA,MAAY,CAAC;KACpC,cAAc;KACd,aAAa;IACf,CAAC,CACH;GACF,CAAC;EAEL,EACF;CACF;AACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["camelCase","camelCase","camelCase","mutationKeyTransformer","queryKeyTransformer","queryGenerator","infiniteQueryGenerator","mutationGenerator","pluginTsName","pluginZodName","path","pluginClientName","ast","fetchClientSource","axiosClientSource","configSource"],"sources":["../../../internals/utils/src/fs.ts","../../../internals/shared/src/group.ts","../src/resolvers/resolverVueQuery.ts","../src/plugin.ts"],"sourcesContent":["import { posix } from 'node:path'\nimport { camelCase } from './casing.ts'\n\nfunction toSlash(p: string): string {\n if (p.startsWith('\\\\\\\\?\\\\')) return p\n return p.replaceAll('\\\\', '/')\n}\n\n/**\n * Returns the relative path from `rootDir` to `filePath`, always using forward slashes\n * and prefixed with `./` when not already traversing upward.\n *\n * @example\n * ```ts\n * getRelativePath('/src/components', '/src/components/Button.tsx') // './Button.tsx'\n * getRelativePath('/src/components', '/src/utils/helpers.ts') // '../utils/helpers.ts'\n * ```\n */\nexport function getRelativePath(rootDir?: string | null, filePath?: string | null): string {\n if (!rootDir || !filePath) {\n throw new Error(`Root and file should be filled in when retrieving the relativePath, ${rootDir || ''} ${filePath || ''}`)\n }\n\n const relativePath = posix.relative(toSlash(rootDir), toSlash(filePath))\n\n return relativePath.startsWith('../') ? relativePath : `./${relativePath}`\n}\n\n/**\n * Builds a nested file path from a dotted name. Splits on dots that precede a letter\n * (so version numbers embedded in operationIds like `v2025.0` stay intact), camelCases\n * every earlier segment, applies `caseLast` to the final segment, and joins with `/`.\n *\n * Empty segments are dropped before joining. They arise when the name starts with a dot\n * followed by a letter (e.g. `..Schema` splits into `['..', 'Schema']` and `'..'` cases to\n * an empty string). Without this a leading `/` would form, which `path.resolve` reads as an\n * absolute path, letting generated files escape the configured output directory.\n *\n * @example Nested path from a dotted name\n * `toFilePath('pet.petId') // 'pet/petId'`\n *\n * @example PascalCase the final segment\n * `toFilePath('pet.Pet', pascalCase) // 'pet/Pet'`\n *\n * @example Suffix applied to the final segment only\n * `toFilePath('tag.tag', (part) => camelCase(part, { suffix: 'schema' })) // 'tag/tagSchema'`\n */\nexport function toFilePath(name: string, caseLast: (part: string) => string = camelCase): string {\n const parts = name.split(/\\.(?=[a-zA-Z])/)\n return parts\n .map((part, i) => (i === parts.length - 1 ? caseLast(part) : camelCase(part)))\n .filter(Boolean)\n .join('/')\n}\n","import { camelCase } from '@internals/utils'\nimport type { Group } from '@kubb/core'\n\n/**\n * Builds the `group` config a Kubb plugin passes to `ctx.setOptions`, applying the\n * shared default naming so every plugin groups output consistently:\n *\n * - `path` groups use the second path segment (`/pet/findByStatus` → `pet`).\n * - other groups use the camelCased group (`pet store` → `petStore`).\n *\n * A user-provided `group.name` always wins over the default namer, so callers stay in\n * control of their output folders. Returns `null` when grouping is disabled, matching the\n * per-plugin convention.\n *\n * @param group - The user-supplied group option, or `undefined` to disable grouping.\n *\n * @example\n * ```ts\n * createGroupConfig(group) // shared across every plugin\n * ```\n */\nexport function createGroupConfig(group: Group | undefined): Group | null {\n if (!group) {\n return null\n }\n\n const defaultName = (ctx: { group: string }): string => {\n if (group.type === 'path') {\n return `${ctx.group.split('/')[1]}`\n }\n\n return camelCase(ctx.group)\n }\n\n return {\n ...group,\n name: group.name ? group.name : defaultName,\n } satisfies Group\n}\n","import { camelCase, toFilePath } from '@internals/utils'\nimport { defineResolver } from '@kubb/core'\nimport type { PluginVueQuery } from '../types.ts'\n\nfunction capitalize(name: string): string {\n return `${name.charAt(0).toUpperCase()}${name.slice(1)}`\n}\n\n/**\n * Default resolver used by `@kubb/plugin-vue-query`. Decides the names and\n * file paths for every generated TanStack Query composable (`useFooQuery`,\n * `useFooMutation`, `useFooInfiniteQuery`) and its companion helpers.\n *\n * Functions and files use camelCase; composables get the `use` prefix.\n *\n * @example Resolve composable and helper names\n * ```ts\n * import { resolverVueQuery } from '@kubb/plugin-vue-query'\n *\n * resolverVueQuery.resolveQueryName(operationNode) // 'useGetPetById'\n * resolverVueQuery.resolveQueryKeyName(operationNode) // 'getPetByIdQueryKey'\n * resolverVueQuery.resolveQueryOptionsName(operationNode) // 'getPetByIdQueryOptions'\n * ```\n */\nexport const resolverVueQuery = defineResolver<PluginVueQuery>(() => ({\n name: 'default',\n pluginName: 'plugin-vue-query',\n default(name, type) {\n return type === 'file' ? toFilePath(name) : camelCase(name)\n },\n resolveName(name) {\n return this.default(name, 'function')\n },\n resolvePathName(name, type) {\n return this.default(name, type)\n },\n resolveQueryName(node) {\n return `use${capitalize(this.resolveName(node.operationId))}`\n },\n resolveInfiniteQueryName(node) {\n return `use${capitalize(this.resolveName(node.operationId))}Infinite`\n },\n resolveMutationName(node) {\n return `use${capitalize(this.resolveName(node.operationId))}`\n },\n resolveQueryOptionsName(node) {\n return `${this.resolveName(node.operationId)}QueryOptions`\n },\n resolveInfiniteQueryOptionsName(node) {\n return `${this.resolveName(node.operationId)}InfiniteQueryOptions`\n },\n resolveQueryKeyName(node) {\n return `${this.resolveName(node.operationId)}QueryKey`\n },\n resolveInfiniteQueryKeyName(node) {\n return `${this.resolveName(node.operationId)}InfiniteQueryKey`\n },\n resolveMutationKeyName(node) {\n return `${this.resolveName(node.operationId)}MutationKey`\n },\n resolveQueryKeyTypeName(node) {\n return `${capitalize(this.resolveName(node.operationId))}QueryKey`\n },\n resolveInfiniteQueryKeyTypeName(node) {\n return `${capitalize(this.resolveName(node.operationId))}InfiniteQueryKey`\n },\n resolveMutationTypeName(node) {\n return capitalize(this.resolveName(node.operationId))\n },\n resolveClientName(node) {\n return this.resolveName(node.operationId)\n },\n resolveInfiniteClientName(node) {\n return `${this.resolveName(node.operationId)}Infinite`\n },\n}))\n","import path from 'node:path'\nimport { createGroupConfig } from '@internals/shared'\nimport { ast, definePlugin } from '@kubb/core'\nimport { isParserEnabled, pluginClientName } from '@kubb/plugin-client'\nimport { source as axiosClientSource } from '@kubb/plugin-client/templates/clients/axios.source'\nimport { source as fetchClientSource } from '@kubb/plugin-client/templates/clients/fetch.source'\nimport { source as configSource } from '@kubb/plugin-client/templates/config.source'\nimport { pluginTsName } from '@kubb/plugin-ts'\nimport { pluginZodName } from '@kubb/plugin-zod'\nimport { mutationKeyTransformer } from '@internals/tanstack-query'\nimport { queryKeyTransformer } from '@internals/tanstack-query'\nimport { infiniteQueryGenerator, mutationGenerator, queryGenerator } from './generators'\nimport { resolverVueQuery } from './resolvers/resolverVueQuery.ts'\nimport type { PluginVueQuery } from './types.ts'\n\n/**\n * Canonical plugin name for `@kubb/plugin-vue-query`. Used for driver lookups\n * and cross-plugin dependency references.\n */\nexport const pluginVueQueryName = 'plugin-vue-query' satisfies PluginVueQuery['name']\n\n/**\n * Generates one TanStack Query composable per OpenAPI operation for Vue's\n * Composition API. Queries become `useFooQuery` (and optionally\n * `useFooInfiniteQuery`); mutations become `useFooMutation`. Each composable\n * is fully typed end to end.\n *\n * @example\n * ```ts\n * import { defineConfig } from 'kubb'\n * import { pluginTs } from '@kubb/plugin-ts'\n * import { pluginVueQuery } from '@kubb/plugin-vue-query'\n *\n * export default defineConfig({\n * input: { path: './petStore.yaml' },\n * output: { path: './src/gen' },\n * plugins: [\n * pluginTs(),\n * pluginVueQuery({\n * output: { path: './hooks' },\n * }),\n * ],\n * })\n * ```\n */\nexport const pluginVueQuery = definePlugin<PluginVueQuery>((options) => {\n const {\n output = { path: 'hooks', barrel: { type: 'named' } },\n group,\n exclude = [],\n include,\n override = [],\n parser = false,\n infinite = false,\n paramsType = 'inline',\n pathParamsType = paramsType === 'object' ? 'object' : options.pathParamsType || 'inline',\n mutation = {},\n query = {},\n mutationKey = mutationKeyTransformer,\n queryKey = queryKeyTransformer,\n paramsCasing,\n client,\n resolver: userResolver,\n transformer: userTransformer,\n generators: userGenerators = [],\n } = options\n\n const clientName = client?.client ?? 'axios'\n const clientImportPath = client?.importPath ?? (!client?.bundle ? `@kubb/plugin-client/clients/${clientName}` : undefined)\n\n const selectedGenerators =\n options.generators ??\n [queryGenerator, infiniteQueryGenerator, mutationGenerator].filter((generator): generator is NonNullable<typeof generator> => Boolean(generator))\n\n const groupConfig = createGroupConfig(group)\n\n return {\n name: pluginVueQueryName,\n options,\n dependencies: [pluginTsName, isParserEnabled(parser) ? pluginZodName : undefined].filter((dependency): dependency is string => Boolean(dependency)),\n hooks: {\n 'kubb:plugin:setup'(ctx) {\n const resolver = userResolver ? { ...resolverVueQuery, ...userResolver } : resolverVueQuery\n\n ctx.setOptions({\n output,\n client: {\n bundle: client?.bundle,\n baseURL: client?.baseURL,\n client: clientName,\n clientType: client?.clientType ?? 'function',\n importPath: clientImportPath,\n dataReturnType: client?.dataReturnType ?? 'data',\n paramsCasing,\n },\n queryKey,\n query:\n query === false\n ? false\n : {\n importPath: '@tanstack/vue-query',\n methods: ['get'],\n ...query,\n },\n mutationKey,\n mutation:\n mutation === false\n ? false\n : {\n importPath: '@tanstack/vue-query',\n methods: ['post', 'put', 'patch', 'delete'],\n ...mutation,\n },\n infinite: infinite\n ? {\n queryParam: 'id',\n initialPageParam: 0,\n cursorParam: null,\n nextParam: null,\n previousParam: null,\n ...infinite,\n }\n : false,\n parser,\n paramsType,\n pathParamsType,\n paramsCasing,\n group: groupConfig,\n exclude,\n include,\n override,\n resolver,\n })\n ctx.setResolver(resolver)\n if (userTransformer) {\n ctx.setTransformer(userTransformer)\n }\n\n for (const gen of selectedGenerators) {\n ctx.addGenerator(gen)\n }\n for (const gen of userGenerators) {\n ctx.addGenerator(gen)\n }\n\n const root = path.resolve(ctx.config.root, ctx.config.output.path)\n const hasClientPlugin = !!ctx.config.plugins?.some((p) => (p as { name?: string }).name === pluginClientName)\n\n if (client?.bundle && !hasClientPlugin && !clientImportPath) {\n ctx.injectFile({\n baseName: 'client.ts',\n path: path.resolve(root, '.kubb/client.ts'),\n sources: [\n ast.createSource({\n name: 'client',\n nodes: [ast.createText(clientName === 'fetch' ? fetchClientSource : axiosClientSource)],\n isExportable: true,\n isIndexable: true,\n }),\n ],\n })\n }\n\n if (!hasClientPlugin) {\n ctx.injectFile({\n baseName: 'config.ts',\n path: path.resolve(root, '.kubb/config.ts'),\n sources: [\n ast.createSource({\n name: 'config',\n nodes: [ast.createText(configSource)],\n isExportable: false,\n isIndexable: false,\n }),\n ],\n })\n }\n },\n },\n }\n})\n\nexport default pluginVueQuery\n"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,40 +1,63 @@
|
|
|
1
1
|
import "./chunk-C0LytTxp.js";
|
|
2
|
-
import { m as camelCase, s as queryKeyTransformer, u as mutationKeyTransformer } from "./components-
|
|
3
|
-
import { n as mutationGenerator, r as infiniteQueryGenerator, t as queryGenerator } from "./generators-
|
|
2
|
+
import { m as camelCase, s as queryKeyTransformer, u as mutationKeyTransformer } from "./components-B79Gljyl.js";
|
|
3
|
+
import { n as mutationGenerator, r as infiniteQueryGenerator, t as queryGenerator } from "./generators-D95ddIFV.js";
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import { ast, definePlugin, defineResolver } from "@kubb/core";
|
|
6
|
-
import { pluginClientName } from "@kubb/plugin-client";
|
|
6
|
+
import { isParserEnabled, pluginClientName } from "@kubb/plugin-client";
|
|
7
7
|
import { source } from "@kubb/plugin-client/templates/clients/axios.source";
|
|
8
8
|
import { source as source$1 } from "@kubb/plugin-client/templates/clients/fetch.source";
|
|
9
9
|
import { source as source$2 } from "@kubb/plugin-client/templates/config.source";
|
|
10
10
|
import { pluginTsName } from "@kubb/plugin-ts";
|
|
11
11
|
import { pluginZodName } from "@kubb/plugin-zod";
|
|
12
|
+
//#region ../../internals/utils/src/fs.ts
|
|
13
|
+
/**
|
|
14
|
+
* Builds a nested file path from a dotted name. Splits on dots that precede a letter
|
|
15
|
+
* (so version numbers embedded in operationIds like `v2025.0` stay intact), camelCases
|
|
16
|
+
* every earlier segment, applies `caseLast` to the final segment, and joins with `/`.
|
|
17
|
+
*
|
|
18
|
+
* Empty segments are dropped before joining. They arise when the name starts with a dot
|
|
19
|
+
* followed by a letter (e.g. `..Schema` splits into `['..', 'Schema']` and `'..'` cases to
|
|
20
|
+
* an empty string). Without this a leading `/` would form, which `path.resolve` reads as an
|
|
21
|
+
* absolute path, letting generated files escape the configured output directory.
|
|
22
|
+
*
|
|
23
|
+
* @example Nested path from a dotted name
|
|
24
|
+
* `toFilePath('pet.petId') // 'pet/petId'`
|
|
25
|
+
*
|
|
26
|
+
* @example PascalCase the final segment
|
|
27
|
+
* `toFilePath('pet.Pet', pascalCase) // 'pet/Pet'`
|
|
28
|
+
*
|
|
29
|
+
* @example Suffix applied to the final segment only
|
|
30
|
+
* `toFilePath('tag.tag', (part) => camelCase(part, { suffix: 'schema' })) // 'tag/tagSchema'`
|
|
31
|
+
*/
|
|
32
|
+
function toFilePath(name, caseLast = camelCase) {
|
|
33
|
+
const parts = name.split(/\.(?=[a-zA-Z])/);
|
|
34
|
+
return parts.map((part, i) => i === parts.length - 1 ? caseLast(part) : camelCase(part)).filter(Boolean).join("/");
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
12
37
|
//#region ../../internals/shared/src/group.ts
|
|
13
38
|
/**
|
|
14
39
|
* Builds the `group` config a Kubb plugin passes to `ctx.setOptions`, applying the
|
|
15
40
|
* shared default naming so every plugin groups output consistently:
|
|
16
41
|
*
|
|
17
42
|
* - `path` groups use the second path segment (`/pet/findByStatus` → `pet`).
|
|
18
|
-
* - other groups use
|
|
43
|
+
* - other groups use the camelCased group (`pet store` → `petStore`).
|
|
19
44
|
*
|
|
20
45
|
* A user-provided `group.name` always wins over the default namer, so callers stay in
|
|
21
46
|
* control of their output folders. Returns `null` when grouping is disabled, matching the
|
|
22
47
|
* per-plugin convention.
|
|
23
48
|
*
|
|
24
49
|
* @param group - The user-supplied group option, or `undefined` to disable grouping.
|
|
25
|
-
* @param options.suffix - Appended to non-`path` group names, e.g. `'Controller'` or `'Requests'`.
|
|
26
50
|
*
|
|
27
51
|
* @example
|
|
28
52
|
* ```ts
|
|
29
|
-
* createGroupConfig(group
|
|
30
|
-
* createGroupConfig(group, { suffix: 'Requests' }) // plugin-cypress, plugin-mcp
|
|
53
|
+
* createGroupConfig(group) // shared across every plugin
|
|
31
54
|
* ```
|
|
32
55
|
*/
|
|
33
|
-
function createGroupConfig(group
|
|
56
|
+
function createGroupConfig(group) {
|
|
34
57
|
if (!group) return null;
|
|
35
58
|
const defaultName = (ctx) => {
|
|
36
59
|
if (group.type === "path") return `${ctx.group.split("/")[1]}`;
|
|
37
|
-
return
|
|
60
|
+
return camelCase(ctx.group);
|
|
38
61
|
};
|
|
39
62
|
return {
|
|
40
63
|
...group,
|
|
@@ -66,7 +89,7 @@ const resolverVueQuery = defineResolver(() => ({
|
|
|
66
89
|
name: "default",
|
|
67
90
|
pluginName: "plugin-vue-query",
|
|
68
91
|
default(name, type) {
|
|
69
|
-
return
|
|
92
|
+
return type === "file" ? toFilePath(name) : camelCase(name);
|
|
70
93
|
},
|
|
71
94
|
resolveName(name) {
|
|
72
95
|
return this.default(name, "function");
|
|
@@ -148,7 +171,7 @@ const pluginVueQueryName = "plugin-vue-query";
|
|
|
148
171
|
const pluginVueQuery = definePlugin((options) => {
|
|
149
172
|
const { output = {
|
|
150
173
|
path: "hooks",
|
|
151
|
-
|
|
174
|
+
barrel: { type: "named" }
|
|
152
175
|
}, group, exclude = [], include, override = [], parser = false, infinite = false, paramsType = "inline", pathParamsType = paramsType === "object" ? "object" : options.pathParamsType || "inline", mutation = {}, query = {}, mutationKey = mutationKeyTransformer, queryKey = queryKeyTransformer, paramsCasing, client, resolver: userResolver, transformer: userTransformer, generators: userGenerators = [] } = options;
|
|
153
176
|
const clientName = client?.client ?? "axios";
|
|
154
177
|
const clientImportPath = client?.importPath ?? (!client?.bundle ? `@kubb/plugin-client/clients/${clientName}` : void 0);
|
|
@@ -157,11 +180,11 @@ const pluginVueQuery = definePlugin((options) => {
|
|
|
157
180
|
infiniteQueryGenerator,
|
|
158
181
|
mutationGenerator
|
|
159
182
|
].filter((generator) => Boolean(generator));
|
|
160
|
-
const groupConfig = createGroupConfig(group
|
|
183
|
+
const groupConfig = createGroupConfig(group);
|
|
161
184
|
return {
|
|
162
185
|
name: pluginVueQueryName,
|
|
163
186
|
options,
|
|
164
|
-
dependencies: [pluginTsName, parser
|
|
187
|
+
dependencies: [pluginTsName, isParserEnabled(parser) ? pluginZodName : void 0].filter((dependency) => Boolean(dependency)),
|
|
165
188
|
hooks: { "kubb:plugin:setup"(ctx) {
|
|
166
189
|
const resolver = userResolver ? {
|
|
167
190
|
...resolverVueQuery,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["fetchClientSource","axiosClientSource","configSource"],"sources":["../../../internals/shared/src/group.ts","../src/resolvers/resolverVueQuery.ts","../src/plugin.ts"],"sourcesContent":["import { camelCase } from '@internals/utils'\nimport type { Group } from '@kubb/core'\n\n/**\n * Builds the `group` config a Kubb plugin passes to `ctx.setOptions`, applying the\n * shared default naming so every plugin groups output consistently:\n *\n * - `path` groups use the second path segment (`/pet/findByStatus` → `pet`).\n * - other groups use `${camelCase(group)}${suffix}` (e.g. `petController`).\n *\n * A user-provided `group.name` always wins over the default namer, so callers stay in\n * control of their output folders. Returns `null` when grouping is disabled, matching the\n * per-plugin convention.\n *\n * @param group - The user-supplied group option, or `undefined` to disable grouping.\n * @param options.suffix - Appended to non-`path` group names, e.g. `'Controller'` or `'Requests'`.\n *\n * @example\n * ```ts\n * createGroupConfig(group, { suffix: 'Controller' }) // plugin-ts, plugin-client, …\n * createGroupConfig(group, { suffix: 'Requests' }) // plugin-cypress, plugin-mcp\n * ```\n */\nexport function createGroupConfig(group: Group | undefined, options: { suffix: string }): Group | null {\n if (!group) {\n return null\n }\n\n const defaultName = (ctx: { group: string }): string => {\n if (group.type === 'path') {\n return `${ctx.group.split('/')[1]}`\n }\n\n return `${camelCase(ctx.group)}${options.suffix}`\n }\n\n return {\n ...group,\n name: group.name ? group.name : defaultName,\n } satisfies Group\n}\n","import { camelCase } from '@internals/utils'\nimport { defineResolver } from '@kubb/core'\nimport type { PluginVueQuery } from '../types.ts'\n\nfunction capitalize(name: string): string {\n return `${name.charAt(0).toUpperCase()}${name.slice(1)}`\n}\n\n/**\n * Default resolver used by `@kubb/plugin-vue-query`. Decides the names and\n * file paths for every generated TanStack Query composable (`useFooQuery`,\n * `useFooMutation`, `useFooInfiniteQuery`) and its companion helpers.\n *\n * Functions and files use camelCase; composables get the `use` prefix.\n *\n * @example Resolve composable and helper names\n * ```ts\n * import { resolverVueQuery } from '@kubb/plugin-vue-query'\n *\n * resolverVueQuery.resolveQueryName(operationNode) // 'useGetPetById'\n * resolverVueQuery.resolveQueryKeyName(operationNode) // 'getPetByIdQueryKey'\n * resolverVueQuery.resolveQueryOptionsName(operationNode) // 'getPetByIdQueryOptions'\n * ```\n */\nexport const resolverVueQuery = defineResolver<PluginVueQuery>(() => ({\n name: 'default',\n pluginName: 'plugin-vue-query',\n default(name, type) {\n return camelCase(name, { isFile: type === 'file' })\n },\n resolveName(name) {\n return this.default(name, 'function')\n },\n resolvePathName(name, type) {\n return this.default(name, type)\n },\n resolveQueryName(node) {\n return `use${capitalize(this.resolveName(node.operationId))}`\n },\n resolveInfiniteQueryName(node) {\n return `use${capitalize(this.resolveName(node.operationId))}Infinite`\n },\n resolveMutationName(node) {\n return `use${capitalize(this.resolveName(node.operationId))}`\n },\n resolveQueryOptionsName(node) {\n return `${this.resolveName(node.operationId)}QueryOptions`\n },\n resolveInfiniteQueryOptionsName(node) {\n return `${this.resolveName(node.operationId)}InfiniteQueryOptions`\n },\n resolveQueryKeyName(node) {\n return `${this.resolveName(node.operationId)}QueryKey`\n },\n resolveInfiniteQueryKeyName(node) {\n return `${this.resolveName(node.operationId)}InfiniteQueryKey`\n },\n resolveMutationKeyName(node) {\n return `${this.resolveName(node.operationId)}MutationKey`\n },\n resolveQueryKeyTypeName(node) {\n return `${capitalize(this.resolveName(node.operationId))}QueryKey`\n },\n resolveInfiniteQueryKeyTypeName(node) {\n return `${capitalize(this.resolveName(node.operationId))}InfiniteQueryKey`\n },\n resolveMutationTypeName(node) {\n return capitalize(this.resolveName(node.operationId))\n },\n resolveClientName(node) {\n return this.resolveName(node.operationId)\n },\n resolveInfiniteClientName(node) {\n return `${this.resolveName(node.operationId)}Infinite`\n },\n}))\n","import path from 'node:path'\nimport { createGroupConfig } from '@internals/shared'\nimport { ast, definePlugin } from '@kubb/core'\nimport { pluginClientName } from '@kubb/plugin-client'\nimport { source as axiosClientSource } from '@kubb/plugin-client/templates/clients/axios.source'\nimport { source as fetchClientSource } from '@kubb/plugin-client/templates/clients/fetch.source'\nimport { source as configSource } from '@kubb/plugin-client/templates/config.source'\nimport { pluginTsName } from '@kubb/plugin-ts'\nimport { pluginZodName } from '@kubb/plugin-zod'\nimport { mutationKeyTransformer } from '@internals/tanstack-query'\nimport { queryKeyTransformer } from '@internals/tanstack-query'\nimport { infiniteQueryGenerator, mutationGenerator, queryGenerator } from './generators'\nimport { resolverVueQuery } from './resolvers/resolverVueQuery.ts'\nimport type { PluginVueQuery } from './types.ts'\n\n/**\n * Canonical plugin name for `@kubb/plugin-vue-query`. Used for driver lookups\n * and cross-plugin dependency references.\n */\nexport const pluginVueQueryName = 'plugin-vue-query' satisfies PluginVueQuery['name']\n\n/**\n * Generates one TanStack Query composable per OpenAPI operation for Vue's\n * Composition API. Queries become `useFooQuery` (and optionally\n * `useFooInfiniteQuery`); mutations become `useFooMutation`. Each composable\n * is fully typed end to end.\n *\n * @example\n * ```ts\n * import { defineConfig } from 'kubb'\n * import { pluginTs } from '@kubb/plugin-ts'\n * import { pluginVueQuery } from '@kubb/plugin-vue-query'\n *\n * export default defineConfig({\n * input: { path: './petStore.yaml' },\n * output: { path: './src/gen' },\n * plugins: [\n * pluginTs(),\n * pluginVueQuery({\n * output: { path: './hooks' },\n * }),\n * ],\n * })\n * ```\n */\nexport const pluginVueQuery = definePlugin<PluginVueQuery>((options) => {\n const {\n output = { path: 'hooks', barrelType: 'named' },\n group,\n exclude = [],\n include,\n override = [],\n parser = false,\n infinite = false,\n paramsType = 'inline',\n pathParamsType = paramsType === 'object' ? 'object' : options.pathParamsType || 'inline',\n mutation = {},\n query = {},\n mutationKey = mutationKeyTransformer,\n queryKey = queryKeyTransformer,\n paramsCasing,\n client,\n resolver: userResolver,\n transformer: userTransformer,\n generators: userGenerators = [],\n } = options\n\n const clientName = client?.client ?? 'axios'\n const clientImportPath = client?.importPath ?? (!client?.bundle ? `@kubb/plugin-client/clients/${clientName}` : undefined)\n\n const selectedGenerators =\n options.generators ??\n [queryGenerator, infiniteQueryGenerator, mutationGenerator].filter((generator): generator is NonNullable<typeof generator> => Boolean(generator))\n\n const groupConfig = createGroupConfig(group, { suffix: 'Controller' })\n\n return {\n name: pluginVueQueryName,\n options,\n dependencies: [pluginTsName, parser === 'zod' ? pluginZodName : undefined].filter((dependency): dependency is string => Boolean(dependency)),\n hooks: {\n 'kubb:plugin:setup'(ctx) {\n const resolver = userResolver ? { ...resolverVueQuery, ...userResolver } : resolverVueQuery\n\n ctx.setOptions({\n output,\n client: {\n bundle: client?.bundle,\n baseURL: client?.baseURL,\n client: clientName,\n clientType: client?.clientType ?? 'function',\n importPath: clientImportPath,\n dataReturnType: client?.dataReturnType ?? 'data',\n paramsCasing,\n },\n queryKey,\n query:\n query === false\n ? false\n : {\n importPath: '@tanstack/vue-query',\n methods: ['get'],\n ...query,\n },\n mutationKey,\n mutation:\n mutation === false\n ? false\n : {\n importPath: '@tanstack/vue-query',\n methods: ['post', 'put', 'patch', 'delete'],\n ...mutation,\n },\n infinite: infinite\n ? {\n queryParam: 'id',\n initialPageParam: 0,\n cursorParam: null,\n nextParam: null,\n previousParam: null,\n ...infinite,\n }\n : false,\n parser,\n paramsType,\n pathParamsType,\n paramsCasing,\n group: groupConfig,\n exclude,\n include,\n override,\n resolver,\n })\n ctx.setResolver(resolver)\n if (userTransformer) {\n ctx.setTransformer(userTransformer)\n }\n\n for (const gen of selectedGenerators) {\n ctx.addGenerator(gen)\n }\n for (const gen of userGenerators) {\n ctx.addGenerator(gen)\n }\n\n const root = path.resolve(ctx.config.root, ctx.config.output.path)\n const hasClientPlugin = !!ctx.config.plugins?.some((p) => (p as { name?: string }).name === pluginClientName)\n\n if (client?.bundle && !hasClientPlugin && !clientImportPath) {\n ctx.injectFile({\n baseName: 'client.ts',\n path: path.resolve(root, '.kubb/client.ts'),\n sources: [\n ast.createSource({\n name: 'client',\n nodes: [ast.createText(clientName === 'fetch' ? fetchClientSource : axiosClientSource)],\n isExportable: true,\n isIndexable: true,\n }),\n ],\n })\n }\n\n if (!hasClientPlugin) {\n ctx.injectFile({\n baseName: 'config.ts',\n path: path.resolve(root, '.kubb/config.ts'),\n sources: [\n ast.createSource({\n name: 'config',\n nodes: [ast.createText(configSource)],\n isExportable: false,\n isIndexable: false,\n }),\n ],\n })\n }\n },\n },\n }\n})\n\nexport default pluginVueQuery\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["fetchClientSource","axiosClientSource","configSource"],"sources":["../../../internals/utils/src/fs.ts","../../../internals/shared/src/group.ts","../src/resolvers/resolverVueQuery.ts","../src/plugin.ts"],"sourcesContent":["import { posix } from 'node:path'\nimport { camelCase } from './casing.ts'\n\nfunction toSlash(p: string): string {\n if (p.startsWith('\\\\\\\\?\\\\')) return p\n return p.replaceAll('\\\\', '/')\n}\n\n/**\n * Returns the relative path from `rootDir` to `filePath`, always using forward slashes\n * and prefixed with `./` when not already traversing upward.\n *\n * @example\n * ```ts\n * getRelativePath('/src/components', '/src/components/Button.tsx') // './Button.tsx'\n * getRelativePath('/src/components', '/src/utils/helpers.ts') // '../utils/helpers.ts'\n * ```\n */\nexport function getRelativePath(rootDir?: string | null, filePath?: string | null): string {\n if (!rootDir || !filePath) {\n throw new Error(`Root and file should be filled in when retrieving the relativePath, ${rootDir || ''} ${filePath || ''}`)\n }\n\n const relativePath = posix.relative(toSlash(rootDir), toSlash(filePath))\n\n return relativePath.startsWith('../') ? relativePath : `./${relativePath}`\n}\n\n/**\n * Builds a nested file path from a dotted name. Splits on dots that precede a letter\n * (so version numbers embedded in operationIds like `v2025.0` stay intact), camelCases\n * every earlier segment, applies `caseLast` to the final segment, and joins with `/`.\n *\n * Empty segments are dropped before joining. They arise when the name starts with a dot\n * followed by a letter (e.g. `..Schema` splits into `['..', 'Schema']` and `'..'` cases to\n * an empty string). Without this a leading `/` would form, which `path.resolve` reads as an\n * absolute path, letting generated files escape the configured output directory.\n *\n * @example Nested path from a dotted name\n * `toFilePath('pet.petId') // 'pet/petId'`\n *\n * @example PascalCase the final segment\n * `toFilePath('pet.Pet', pascalCase) // 'pet/Pet'`\n *\n * @example Suffix applied to the final segment only\n * `toFilePath('tag.tag', (part) => camelCase(part, { suffix: 'schema' })) // 'tag/tagSchema'`\n */\nexport function toFilePath(name: string, caseLast: (part: string) => string = camelCase): string {\n const parts = name.split(/\\.(?=[a-zA-Z])/)\n return parts\n .map((part, i) => (i === parts.length - 1 ? caseLast(part) : camelCase(part)))\n .filter(Boolean)\n .join('/')\n}\n","import { camelCase } from '@internals/utils'\nimport type { Group } from '@kubb/core'\n\n/**\n * Builds the `group` config a Kubb plugin passes to `ctx.setOptions`, applying the\n * shared default naming so every plugin groups output consistently:\n *\n * - `path` groups use the second path segment (`/pet/findByStatus` → `pet`).\n * - other groups use the camelCased group (`pet store` → `petStore`).\n *\n * A user-provided `group.name` always wins over the default namer, so callers stay in\n * control of their output folders. Returns `null` when grouping is disabled, matching the\n * per-plugin convention.\n *\n * @param group - The user-supplied group option, or `undefined` to disable grouping.\n *\n * @example\n * ```ts\n * createGroupConfig(group) // shared across every plugin\n * ```\n */\nexport function createGroupConfig(group: Group | undefined): Group | null {\n if (!group) {\n return null\n }\n\n const defaultName = (ctx: { group: string }): string => {\n if (group.type === 'path') {\n return `${ctx.group.split('/')[1]}`\n }\n\n return camelCase(ctx.group)\n }\n\n return {\n ...group,\n name: group.name ? group.name : defaultName,\n } satisfies Group\n}\n","import { camelCase, toFilePath } from '@internals/utils'\nimport { defineResolver } from '@kubb/core'\nimport type { PluginVueQuery } from '../types.ts'\n\nfunction capitalize(name: string): string {\n return `${name.charAt(0).toUpperCase()}${name.slice(1)}`\n}\n\n/**\n * Default resolver used by `@kubb/plugin-vue-query`. Decides the names and\n * file paths for every generated TanStack Query composable (`useFooQuery`,\n * `useFooMutation`, `useFooInfiniteQuery`) and its companion helpers.\n *\n * Functions and files use camelCase; composables get the `use` prefix.\n *\n * @example Resolve composable and helper names\n * ```ts\n * import { resolverVueQuery } from '@kubb/plugin-vue-query'\n *\n * resolverVueQuery.resolveQueryName(operationNode) // 'useGetPetById'\n * resolverVueQuery.resolveQueryKeyName(operationNode) // 'getPetByIdQueryKey'\n * resolverVueQuery.resolveQueryOptionsName(operationNode) // 'getPetByIdQueryOptions'\n * ```\n */\nexport const resolverVueQuery = defineResolver<PluginVueQuery>(() => ({\n name: 'default',\n pluginName: 'plugin-vue-query',\n default(name, type) {\n return type === 'file' ? toFilePath(name) : camelCase(name)\n },\n resolveName(name) {\n return this.default(name, 'function')\n },\n resolvePathName(name, type) {\n return this.default(name, type)\n },\n resolveQueryName(node) {\n return `use${capitalize(this.resolveName(node.operationId))}`\n },\n resolveInfiniteQueryName(node) {\n return `use${capitalize(this.resolveName(node.operationId))}Infinite`\n },\n resolveMutationName(node) {\n return `use${capitalize(this.resolveName(node.operationId))}`\n },\n resolveQueryOptionsName(node) {\n return `${this.resolveName(node.operationId)}QueryOptions`\n },\n resolveInfiniteQueryOptionsName(node) {\n return `${this.resolveName(node.operationId)}InfiniteQueryOptions`\n },\n resolveQueryKeyName(node) {\n return `${this.resolveName(node.operationId)}QueryKey`\n },\n resolveInfiniteQueryKeyName(node) {\n return `${this.resolveName(node.operationId)}InfiniteQueryKey`\n },\n resolveMutationKeyName(node) {\n return `${this.resolveName(node.operationId)}MutationKey`\n },\n resolveQueryKeyTypeName(node) {\n return `${capitalize(this.resolveName(node.operationId))}QueryKey`\n },\n resolveInfiniteQueryKeyTypeName(node) {\n return `${capitalize(this.resolveName(node.operationId))}InfiniteQueryKey`\n },\n resolveMutationTypeName(node) {\n return capitalize(this.resolveName(node.operationId))\n },\n resolveClientName(node) {\n return this.resolveName(node.operationId)\n },\n resolveInfiniteClientName(node) {\n return `${this.resolveName(node.operationId)}Infinite`\n },\n}))\n","import path from 'node:path'\nimport { createGroupConfig } from '@internals/shared'\nimport { ast, definePlugin } from '@kubb/core'\nimport { isParserEnabled, pluginClientName } from '@kubb/plugin-client'\nimport { source as axiosClientSource } from '@kubb/plugin-client/templates/clients/axios.source'\nimport { source as fetchClientSource } from '@kubb/plugin-client/templates/clients/fetch.source'\nimport { source as configSource } from '@kubb/plugin-client/templates/config.source'\nimport { pluginTsName } from '@kubb/plugin-ts'\nimport { pluginZodName } from '@kubb/plugin-zod'\nimport { mutationKeyTransformer } from '@internals/tanstack-query'\nimport { queryKeyTransformer } from '@internals/tanstack-query'\nimport { infiniteQueryGenerator, mutationGenerator, queryGenerator } from './generators'\nimport { resolverVueQuery } from './resolvers/resolverVueQuery.ts'\nimport type { PluginVueQuery } from './types.ts'\n\n/**\n * Canonical plugin name for `@kubb/plugin-vue-query`. Used for driver lookups\n * and cross-plugin dependency references.\n */\nexport const pluginVueQueryName = 'plugin-vue-query' satisfies PluginVueQuery['name']\n\n/**\n * Generates one TanStack Query composable per OpenAPI operation for Vue's\n * Composition API. Queries become `useFooQuery` (and optionally\n * `useFooInfiniteQuery`); mutations become `useFooMutation`. Each composable\n * is fully typed end to end.\n *\n * @example\n * ```ts\n * import { defineConfig } from 'kubb'\n * import { pluginTs } from '@kubb/plugin-ts'\n * import { pluginVueQuery } from '@kubb/plugin-vue-query'\n *\n * export default defineConfig({\n * input: { path: './petStore.yaml' },\n * output: { path: './src/gen' },\n * plugins: [\n * pluginTs(),\n * pluginVueQuery({\n * output: { path: './hooks' },\n * }),\n * ],\n * })\n * ```\n */\nexport const pluginVueQuery = definePlugin<PluginVueQuery>((options) => {\n const {\n output = { path: 'hooks', barrel: { type: 'named' } },\n group,\n exclude = [],\n include,\n override = [],\n parser = false,\n infinite = false,\n paramsType = 'inline',\n pathParamsType = paramsType === 'object' ? 'object' : options.pathParamsType || 'inline',\n mutation = {},\n query = {},\n mutationKey = mutationKeyTransformer,\n queryKey = queryKeyTransformer,\n paramsCasing,\n client,\n resolver: userResolver,\n transformer: userTransformer,\n generators: userGenerators = [],\n } = options\n\n const clientName = client?.client ?? 'axios'\n const clientImportPath = client?.importPath ?? (!client?.bundle ? `@kubb/plugin-client/clients/${clientName}` : undefined)\n\n const selectedGenerators =\n options.generators ??\n [queryGenerator, infiniteQueryGenerator, mutationGenerator].filter((generator): generator is NonNullable<typeof generator> => Boolean(generator))\n\n const groupConfig = createGroupConfig(group)\n\n return {\n name: pluginVueQueryName,\n options,\n dependencies: [pluginTsName, isParserEnabled(parser) ? pluginZodName : undefined].filter((dependency): dependency is string => Boolean(dependency)),\n hooks: {\n 'kubb:plugin:setup'(ctx) {\n const resolver = userResolver ? { ...resolverVueQuery, ...userResolver } : resolverVueQuery\n\n ctx.setOptions({\n output,\n client: {\n bundle: client?.bundle,\n baseURL: client?.baseURL,\n client: clientName,\n clientType: client?.clientType ?? 'function',\n importPath: clientImportPath,\n dataReturnType: client?.dataReturnType ?? 'data',\n paramsCasing,\n },\n queryKey,\n query:\n query === false\n ? false\n : {\n importPath: '@tanstack/vue-query',\n methods: ['get'],\n ...query,\n },\n mutationKey,\n mutation:\n mutation === false\n ? false\n : {\n importPath: '@tanstack/vue-query',\n methods: ['post', 'put', 'patch', 'delete'],\n ...mutation,\n },\n infinite: infinite\n ? {\n queryParam: 'id',\n initialPageParam: 0,\n cursorParam: null,\n nextParam: null,\n previousParam: null,\n ...infinite,\n }\n : false,\n parser,\n paramsType,\n pathParamsType,\n paramsCasing,\n group: groupConfig,\n exclude,\n include,\n override,\n resolver,\n })\n ctx.setResolver(resolver)\n if (userTransformer) {\n ctx.setTransformer(userTransformer)\n }\n\n for (const gen of selectedGenerators) {\n ctx.addGenerator(gen)\n }\n for (const gen of userGenerators) {\n ctx.addGenerator(gen)\n }\n\n const root = path.resolve(ctx.config.root, ctx.config.output.path)\n const hasClientPlugin = !!ctx.config.plugins?.some((p) => (p as { name?: string }).name === pluginClientName)\n\n if (client?.bundle && !hasClientPlugin && !clientImportPath) {\n ctx.injectFile({\n baseName: 'client.ts',\n path: path.resolve(root, '.kubb/client.ts'),\n sources: [\n ast.createSource({\n name: 'client',\n nodes: [ast.createText(clientName === 'fetch' ? fetchClientSource : axiosClientSource)],\n isExportable: true,\n isIndexable: true,\n }),\n ],\n })\n }\n\n if (!hasClientPlugin) {\n ctx.injectFile({\n baseName: 'config.ts',\n path: path.resolve(root, '.kubb/config.ts'),\n sources: [\n ast.createSource({\n name: 'config',\n nodes: [ast.createText(configSource)],\n isExportable: false,\n isIndexable: false,\n }),\n ],\n })\n }\n },\n },\n }\n})\n\nexport default pluginVueQuery\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as __name } from "./chunk-C0LytTxp.js";
|
|
2
|
-
import { Exclude, Generator, Group, Include, Output, Override, PluginFactoryOptions, Resolver, ast } from "@kubb/core";
|
|
2
|
+
import { Exclude, Generator, Group, Include, Output, OutputOptions, Override, PluginFactoryOptions, Resolver, ast } from "@kubb/core";
|
|
3
3
|
import { ClientImportPath, PluginClient } from "@kubb/plugin-client";
|
|
4
4
|
|
|
5
5
|
//#region src/types.d.ts
|
|
@@ -147,17 +147,13 @@ type Infinite = {
|
|
|
147
147
|
*/
|
|
148
148
|
initialPageParam?: unknown;
|
|
149
149
|
};
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
* Split generated files into subfolders based on the operation's tag.
|
|
159
|
-
*/
|
|
160
|
-
group?: Group;
|
|
150
|
+
/**
|
|
151
|
+
* Where the generated composables are written and how they are exported, plus the optional
|
|
152
|
+
* `group` strategy. The `group` option organizes `output.mode: 'directory'` output into per-tag or per-path subdirectories.
|
|
153
|
+
*
|
|
154
|
+
* @default { path: 'hooks', barrel: { type: 'named' } }
|
|
155
|
+
*/
|
|
156
|
+
type Options = OutputOptions & {
|
|
161
157
|
/**
|
|
162
158
|
* HTTP client used inside every generated composable. Mirrors a subset of
|
|
163
159
|
* `pluginClient` options.
|
|
@@ -243,7 +239,7 @@ type ResolvedOptions = {
|
|
|
243
239
|
include: Options['include'];
|
|
244
240
|
override: NonNullable<Options['override']>;
|
|
245
241
|
client: Pick<PluginClient['options'], 'client' | 'clientType' | 'dataReturnType' | 'importPath' | 'baseURL' | 'bundle' | 'paramsCasing'>;
|
|
246
|
-
parser:
|
|
242
|
+
parser: NonNullable<Options['parser']>;
|
|
247
243
|
pathParamsType: NonNullable<Options['pathParamsType']>;
|
|
248
244
|
paramsCasing: Options['paramsCasing'];
|
|
249
245
|
paramsType: NonNullable<Options['paramsType']>;
|
|
@@ -267,4 +263,4 @@ declare global {
|
|
|
267
263
|
}
|
|
268
264
|
//#endregion
|
|
269
265
|
export { Transformer as i, Options as n, PluginVueQuery as r, Infinite as t };
|
|
270
|
-
//# sourceMappingURL=types-
|
|
266
|
+
//# sourceMappingURL=types-CwabLiFK.d.ts.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kubb/plugin-vue-query",
|
|
3
|
-
"version": "5.0.0-beta.
|
|
3
|
+
"version": "5.0.0-beta.56",
|
|
4
4
|
"description": "Generate type-safe TanStack Query (Vue Query) composables from your OpenAPI specification. Covers useQuery, useMutation, useInfiniteQuery, and queryOptions with Vue 3 Composition API support.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"code-generation",
|
|
@@ -30,7 +30,6 @@
|
|
|
30
30
|
"files": [
|
|
31
31
|
"src",
|
|
32
32
|
"dist",
|
|
33
|
-
"extension.yaml",
|
|
34
33
|
"!/**/**.test.**",
|
|
35
34
|
"!/**/__tests__/**",
|
|
36
35
|
"!/**/__snapshots__/**"
|
|
@@ -70,11 +69,12 @@
|
|
|
70
69
|
"registry": "https://registry.npmjs.org/"
|
|
71
70
|
},
|
|
72
71
|
"dependencies": {
|
|
73
|
-
"@kubb/
|
|
74
|
-
"@kubb/
|
|
75
|
-
"@kubb/
|
|
76
|
-
"@kubb/plugin-
|
|
77
|
-
"@kubb/plugin-
|
|
72
|
+
"@kubb/ast": "5.0.0-beta.55",
|
|
73
|
+
"@kubb/core": "5.0.0-beta.55",
|
|
74
|
+
"@kubb/renderer-jsx": "5.0.0-beta.55",
|
|
75
|
+
"@kubb/plugin-client": "5.0.0-beta.56",
|
|
76
|
+
"@kubb/plugin-ts": "5.0.0-beta.56",
|
|
77
|
+
"@kubb/plugin-zod": "5.0.0-beta.56"
|
|
78
78
|
},
|
|
79
79
|
"devDependencies": {
|
|
80
80
|
"@internals/shared": "0.0.0",
|
|
@@ -82,21 +82,14 @@
|
|
|
82
82
|
"@internals/utils": "0.0.0"
|
|
83
83
|
},
|
|
84
84
|
"peerDependencies": {
|
|
85
|
-
"@kubb/renderer-jsx": "5.0.0-beta.
|
|
85
|
+
"@kubb/renderer-jsx": "5.0.0-beta.55"
|
|
86
86
|
},
|
|
87
|
-
"size-limit": [
|
|
88
|
-
{
|
|
89
|
-
"path": "./dist/*.js",
|
|
90
|
-
"limit": "510 KiB",
|
|
91
|
-
"gzip": true
|
|
92
|
-
}
|
|
93
|
-
],
|
|
94
87
|
"engines": {
|
|
95
88
|
"node": ">=22"
|
|
96
89
|
},
|
|
97
90
|
"scripts": {
|
|
98
|
-
"build": "tsdown
|
|
99
|
-
"clean": "
|
|
91
|
+
"build": "tsdown",
|
|
92
|
+
"clean": "node -e \"require('node:fs').rmSync('./dist', {recursive:true,force:true})\"",
|
|
100
93
|
"lint": "oxlint .",
|
|
101
94
|
"lint:fix": "oxlint --fix .",
|
|
102
95
|
"release": "pnpm publish --no-git-check",
|
|
@@ -5,7 +5,7 @@ import { File, Function } from '@kubb/renderer-jsx'
|
|
|
5
5
|
import type { KubbReactNode } from '@kubb/renderer-jsx/types'
|
|
6
6
|
import type { Infinite, PluginVueQuery } from '../types.ts'
|
|
7
7
|
import { getEnabledParamNames, markParamsOptional } from '@internals/tanstack-query'
|
|
8
|
-
import { getComments, resolveErrorNames, resolveSuccessNames, wrapWithMaybeRefOrGetter } from '../utils.ts'
|
|
8
|
+
import { buildStatusUnionType, getComments, resolveErrorNames, resolveSuccessNames, wrapWithMaybeRefOrGetter } from '../utils.ts'
|
|
9
9
|
import { buildQueryKeyParamsNode } from './QueryKey.tsx'
|
|
10
10
|
import { getQueryOptionsParams } from './QueryOptions.tsx'
|
|
11
11
|
|
|
@@ -43,7 +43,7 @@ function buildInfiniteQueryParamsNode(
|
|
|
43
43
|
const requestName = node.requestBody?.content?.[0]?.schema ? resolver.resolveDataName(node) : null
|
|
44
44
|
const errorNames = resolveErrorNames(node, resolver)
|
|
45
45
|
|
|
46
|
-
const TData = dataReturnType === 'data' ? responseName :
|
|
46
|
+
const TData = dataReturnType === 'data' ? responseName : buildStatusUnionType(node, resolver)
|
|
47
47
|
const TError = `ResponseErrorConfig<${errorNames.length > 0 ? errorNames.join(' | ') : 'Error'}>`
|
|
48
48
|
|
|
49
49
|
const optionsParam = ast.createFunctionParameter({
|
|
@@ -85,7 +85,7 @@ export function InfiniteQuery({
|
|
|
85
85
|
const responseName = successNames.length > 0 ? successNames.join(' | ') : tsResolver.resolveResponseName(node)
|
|
86
86
|
const errorNames = resolveErrorNames(node, tsResolver)
|
|
87
87
|
|
|
88
|
-
const TData = dataReturnType === 'data' ? responseName :
|
|
88
|
+
const TData = dataReturnType === 'data' ? responseName : buildStatusUnionType(node, tsResolver)
|
|
89
89
|
const TError = `ResponseErrorConfig<${errorNames.length > 0 ? errorNames.join(' | ') : 'Error'}>`
|
|
90
90
|
const returnType = `UseInfiniteQueryReturnType<${['TData', TError].join(', ')}> & { queryKey: TQueryKey }`
|
|
91
91
|
const generics = [`TData = InfiniteData<${TData}>`, `TQueryData = ${TData}`, `TQueryKey extends QueryKey = ${queryKeyTypeName}`]
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { getOperationParameters } from '@internals/shared'
|
|
2
|
-
import { getNestedAccessor } from '@
|
|
2
|
+
import { getNestedAccessor } from '@kubb/ast/utils'
|
|
3
3
|
import type { ast } from '@kubb/core'
|
|
4
4
|
import type { ResolverTs } from '@kubb/plugin-ts'
|
|
5
5
|
import { functionPrinter } from '@kubb/plugin-ts'
|
|
6
6
|
import { File, Function } from '@kubb/renderer-jsx'
|
|
7
7
|
import type { KubbReactNode } from '@kubb/renderer-jsx/types'
|
|
8
8
|
import type { Infinite, PluginVueQuery } from '../types.ts'
|
|
9
|
-
import { resolveErrorNames, resolveSuccessNames } from '../utils.ts'
|
|
9
|
+
import { buildStatusUnionType, resolveErrorNames, resolveSuccessNames } from '../utils.ts'
|
|
10
10
|
import { buildQueryKeyParamsNode } from './QueryKey.tsx'
|
|
11
11
|
import { getEnabledParamNames, markParamsOptional } from '@internals/tanstack-query'
|
|
12
12
|
import { getQueryOptionsParams } from './QueryOptions.tsx'
|
|
@@ -49,7 +49,7 @@ export function InfiniteQueryOptions({
|
|
|
49
49
|
}: Props): KubbReactNode {
|
|
50
50
|
const successNames = resolveSuccessNames(node, tsResolver)
|
|
51
51
|
const responseName = successNames.length > 0 ? successNames.join(' | ') : tsResolver.resolveResponseName(node)
|
|
52
|
-
const queryFnDataType = dataReturnType === 'data' ? responseName :
|
|
52
|
+
const queryFnDataType = dataReturnType === 'data' ? responseName : buildStatusUnionType(node, tsResolver)
|
|
53
53
|
const errorNames = resolveErrorNames(node, tsResolver)
|
|
54
54
|
const errorType = `ResponseErrorConfig<${errorNames.length > 0 ? errorNames.join(' | ') : 'Error'}>`
|
|
55
55
|
|
|
@@ -122,11 +122,10 @@ export function InfiniteQueryOptions({
|
|
|
122
122
|
|
|
123
123
|
const infiniteOverrideParams =
|
|
124
124
|
queryParam && queryParamsTypeName
|
|
125
|
-
? `
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
} as ${queryParamsTypeName}`
|
|
125
|
+
? `params = {
|
|
126
|
+
...(params ?? {}),
|
|
127
|
+
['${queryParam}']: pageParam as unknown as ${queryParamsTypeName}['${queryParam}'],
|
|
128
|
+
} as ${queryParamsTypeName}`
|
|
130
129
|
: ''
|
|
131
130
|
|
|
132
131
|
if (infiniteOverrideParams) {
|
|
@@ -134,16 +133,15 @@ export function InfiniteQueryOptions({
|
|
|
134
133
|
<File.Source name={name} isExportable isIndexable>
|
|
135
134
|
<Function name={name} export params={paramsSignature}>
|
|
136
135
|
{`
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
})
|
|
136
|
+
const queryKey = ${queryKeyName}(${queryKeyParamsCall})
|
|
137
|
+
return infiniteQueryOptions<${queryFnDataType}, ${errorType}, InfiniteData<${queryFnDataType}>, QueryKey, ${pageParamType}>({${enabledText ? `\n ${enabledText}` : ''}
|
|
138
|
+
queryKey,
|
|
139
|
+
queryFn: async ({ signal, pageParam }) => {
|
|
140
|
+
${infiniteOverrideParams}
|
|
141
|
+
return ${clientName}(${addToValueCalls(clientCallStr, enabledNames)})
|
|
142
|
+
},
|
|
143
|
+
${queryOptionsArr.join(',\n ')}
|
|
144
|
+
})
|
|
147
145
|
`}
|
|
148
146
|
</Function>
|
|
149
147
|
</File.Source>
|
|
@@ -154,15 +152,14 @@ export function InfiniteQueryOptions({
|
|
|
154
152
|
<File.Source name={name} isExportable isIndexable>
|
|
155
153
|
<Function name={name} export params={paramsSignature}>
|
|
156
154
|
{`
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
})
|
|
155
|
+
const queryKey = ${queryKeyName}(${queryKeyParamsCall})
|
|
156
|
+
return infiniteQueryOptions<${queryFnDataType}, ${errorType}, InfiniteData<${queryFnDataType}>, QueryKey, ${pageParamType}>({${enabledText ? `\n ${enabledText}` : ''}
|
|
157
|
+
queryKey,
|
|
158
|
+
queryFn: async ({ signal }) => {
|
|
159
|
+
return ${clientName}(${addToValueCalls(clientCallStr, enabledNames)})
|
|
160
|
+
},
|
|
161
|
+
${queryOptionsArr.join(',\n ')}
|
|
162
|
+
})
|
|
166
163
|
`}
|
|
167
164
|
</Function>
|
|
168
165
|
</File.Source>
|
|
@@ -4,7 +4,7 @@ import { functionPrinter } from '@kubb/plugin-ts'
|
|
|
4
4
|
import { File, Function } from '@kubb/renderer-jsx'
|
|
5
5
|
import type { KubbReactNode } from '@kubb/renderer-jsx/types'
|
|
6
6
|
import type { PluginVueQuery } from '../types.ts'
|
|
7
|
-
import { buildRequestConfigType, getComments, resolveErrorNames, resolveSuccessNames, wrapWithMaybeRefOrGetter } from '../utils.ts'
|
|
7
|
+
import { buildRequestConfigType, buildStatusUnionType, getComments, resolveErrorNames, resolveSuccessNames, wrapWithMaybeRefOrGetter } from '../utils.ts'
|
|
8
8
|
|
|
9
9
|
type Props = {
|
|
10
10
|
name: string
|
|
@@ -51,7 +51,7 @@ function buildMutationParamsNode(
|
|
|
51
51
|
const responseName = successNames.length > 0 ? successNames.join(' | ') : resolver.resolveResponseName(node)
|
|
52
52
|
const errorNames = resolveErrorNames(node, resolver)
|
|
53
53
|
|
|
54
|
-
const TData = dataReturnType === 'data' ? responseName :
|
|
54
|
+
const TData = dataReturnType === 'data' ? responseName : buildStatusUnionType(node, resolver)
|
|
55
55
|
const TError = `ResponseErrorConfig<${errorNames.length > 0 ? errorNames.join(' | ') : 'Error'}>`
|
|
56
56
|
|
|
57
57
|
const mutationArgParamsNode = createMutationArgParams(node, { paramsCasing, resolver })
|
|
@@ -91,7 +91,7 @@ export function Mutation({
|
|
|
91
91
|
const responseName = successNames.length > 0 ? successNames.join(' | ') : tsResolver.resolveResponseName(node)
|
|
92
92
|
const errorNames = resolveErrorNames(node, tsResolver)
|
|
93
93
|
|
|
94
|
-
const TData = dataReturnType === 'data' ? responseName :
|
|
94
|
+
const TData = dataReturnType === 'data' ? responseName : buildStatusUnionType(node, tsResolver)
|
|
95
95
|
const TError = `ResponseErrorConfig<${errorNames.length > 0 ? errorNames.join(' | ') : 'Error'}>`
|
|
96
96
|
|
|
97
97
|
const mutationArgParamsNode = createMutationArgParams(node, {
|