vite-code-generator 0.1.0
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/README.md +95 -0
- package/bin/vite-gen.js +4 -0
- package/dist/cli/index.d.ts +4 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +124 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/generator/crud.d.ts +8 -0
- package/dist/generator/crud.d.ts.map +1 -0
- package/dist/generator/crud.js +33 -0
- package/dist/generator/crud.js.map +1 -0
- package/dist/generator/hello-world.d.ts +3 -0
- package/dist/generator/hello-world.d.ts.map +1 -0
- package/dist/generator/hello-world.js +162 -0
- package/dist/generator/hello-world.js.map +1 -0
- package/dist/generator/index.d.ts +9 -0
- package/dist/generator/index.d.ts.map +1 -0
- package/dist/generator/index.js +26 -0
- package/dist/generator/index.js.map +1 -0
- package/dist/generator/naming.d.ts +20 -0
- package/dist/generator/naming.d.ts.map +1 -0
- package/dist/generator/naming.js +42 -0
- package/dist/generator/naming.js.map +1 -0
- package/dist/generator/registry.d.ts +5 -0
- package/dist/generator/registry.d.ts.map +1 -0
- package/dist/generator/registry.js +20 -0
- package/dist/generator/registry.js.map +1 -0
- package/dist/generator/resource-api.d.ts +3 -0
- package/dist/generator/resource-api.d.ts.map +1 -0
- package/dist/generator/resource-api.js +143 -0
- package/dist/generator/resource-api.js.map +1 -0
- package/dist/generator/resource-hooks.d.ts +7 -0
- package/dist/generator/resource-hooks.d.ts.map +1 -0
- package/dist/generator/resource-hooks.js +248 -0
- package/dist/generator/resource-hooks.js.map +1 -0
- package/dist/generator/resource-page.d.ts +3 -0
- package/dist/generator/resource-page.d.ts.map +1 -0
- package/dist/generator/resource-page.js +280 -0
- package/dist/generator/resource-page.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +28 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { deriveResourceNames } from './naming.js';
|
|
2
|
+
import { parseCrudKinds, parseVariant, toSnakeCase, } from './crud.js';
|
|
3
|
+
function listFn(names, path) {
|
|
4
|
+
return `/**
|
|
5
|
+
* Get all ${names.pluralCamel}
|
|
6
|
+
*/
|
|
7
|
+
export const get${names.plural} = async () => {
|
|
8
|
+
const response = await api.get("/${path}");
|
|
9
|
+
return response.data;
|
|
10
|
+
};`;
|
|
11
|
+
}
|
|
12
|
+
function showFn(names, path) {
|
|
13
|
+
return `/**
|
|
14
|
+
* Get a single ${names.singularCamel}
|
|
15
|
+
*/
|
|
16
|
+
export const get${names.singular} = async (id: number) => {
|
|
17
|
+
const response = await api.get(\`/${path}/\${id}\`);
|
|
18
|
+
return response.data;
|
|
19
|
+
};`;
|
|
20
|
+
}
|
|
21
|
+
function createFn(names, path, variant) {
|
|
22
|
+
if (variant === 'bulk') {
|
|
23
|
+
return `/**
|
|
24
|
+
* Create new ${names.pluralCamel}
|
|
25
|
+
*/
|
|
26
|
+
export const create${names.plural} = async (${names.pluralCamel}: ${names.singular}[]) => {
|
|
27
|
+
const response = await api.post("/${path}", {
|
|
28
|
+
${names.pluralCamel},
|
|
29
|
+
});
|
|
30
|
+
return response.data;
|
|
31
|
+
};`;
|
|
32
|
+
}
|
|
33
|
+
return `/**
|
|
34
|
+
* Create new ${names.singularCamel}
|
|
35
|
+
*/
|
|
36
|
+
export const create${names.singular} = async (${names.singularCamel}: ${names.singular}) => {
|
|
37
|
+
const response = await api.post("/${path}", ${names.singularCamel});
|
|
38
|
+
return response.data;
|
|
39
|
+
};`;
|
|
40
|
+
}
|
|
41
|
+
function updateFn(names, path, variant) {
|
|
42
|
+
if (variant === 'bulk') {
|
|
43
|
+
return `/**
|
|
44
|
+
* Update ${names.pluralCamel}
|
|
45
|
+
*/
|
|
46
|
+
export const update${names.plural} = async (${names.pluralCamel}: ${names.singular}[]) => {
|
|
47
|
+
const response = await api.put(\`/${path}\`, {
|
|
48
|
+
${names.pluralCamel},
|
|
49
|
+
});
|
|
50
|
+
return response.data;
|
|
51
|
+
};`;
|
|
52
|
+
}
|
|
53
|
+
return `/**
|
|
54
|
+
* Update ${names.singularCamel}
|
|
55
|
+
*/
|
|
56
|
+
export const update${names.singular} = async (id: number, ${names.singularCamel}: ${names.singular}) => {
|
|
57
|
+
const response = await api.put(\`/${path}/\${id}\`, ${names.singularCamel});
|
|
58
|
+
return response.data;
|
|
59
|
+
};`;
|
|
60
|
+
}
|
|
61
|
+
function deleteFn(names, path, variant) {
|
|
62
|
+
if (variant === 'bulk') {
|
|
63
|
+
return `/**
|
|
64
|
+
* Delete ${names.pluralCamel}
|
|
65
|
+
*/
|
|
66
|
+
export const delete${names.plural} = async (ids: number[]) => {
|
|
67
|
+
const response = await api.delete(\`/${path}\`, {
|
|
68
|
+
params: { ids },
|
|
69
|
+
});
|
|
70
|
+
return response.data;
|
|
71
|
+
};`;
|
|
72
|
+
}
|
|
73
|
+
return `/**
|
|
74
|
+
* Delete ${names.singularCamel}
|
|
75
|
+
*/
|
|
76
|
+
export const delete${names.singular} = async (id: number) => {
|
|
77
|
+
const response = await api.delete(\`/${path}/\${id}\`);
|
|
78
|
+
return response.data;
|
|
79
|
+
};`;
|
|
80
|
+
}
|
|
81
|
+
function renderApiFile(names, methods, variant, path) {
|
|
82
|
+
const sections = [
|
|
83
|
+
`import { api } from "./base.api";`,
|
|
84
|
+
`import type { ${names.singular} } from "@/types";`,
|
|
85
|
+
'',
|
|
86
|
+
];
|
|
87
|
+
if (methods.has('list'))
|
|
88
|
+
sections.push(listFn(names, path), '');
|
|
89
|
+
if (methods.has('show'))
|
|
90
|
+
sections.push(showFn(names, path), '');
|
|
91
|
+
if (methods.has('create'))
|
|
92
|
+
sections.push(createFn(names, path, variant), '');
|
|
93
|
+
if (methods.has('update'))
|
|
94
|
+
sections.push(updateFn(names, path, variant), '');
|
|
95
|
+
if (methods.has('delete'))
|
|
96
|
+
sections.push(deleteFn(names, path, variant), '');
|
|
97
|
+
return `${sections.join('\n').trimEnd()}\n`;
|
|
98
|
+
}
|
|
99
|
+
export const resourceApiTemplate = {
|
|
100
|
+
name: 'resource-api',
|
|
101
|
+
description: 'API module for a resource (single or bulk mutations). Pass PascalCase singular name.',
|
|
102
|
+
kind: 'file',
|
|
103
|
+
flags: [
|
|
104
|
+
{
|
|
105
|
+
name: 'variant',
|
|
106
|
+
description: 'Mutation style: single (one record) or bulk (arrays)',
|
|
107
|
+
defaultValue: 'single',
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
name: 'methods',
|
|
111
|
+
description: 'Comma-separated methods to generate: list,show,create,update,delete (or all)',
|
|
112
|
+
defaultValue: 'all',
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
name: 'plural',
|
|
116
|
+
description: 'Optional PascalCase plural override (default: singular + s)',
|
|
117
|
+
defaultValue: '',
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
name: 'path',
|
|
121
|
+
description: 'Optional API path override (default: snake_case plural)',
|
|
122
|
+
defaultValue: '',
|
|
123
|
+
},
|
|
124
|
+
],
|
|
125
|
+
resolveFiles(context) {
|
|
126
|
+
const pluralFlag = typeof context.flags.plural === 'string' && context.flags.plural.length > 0
|
|
127
|
+
? context.flags.plural
|
|
128
|
+
: undefined;
|
|
129
|
+
const names = deriveResourceNames(context.projectName, pluralFlag);
|
|
130
|
+
const methods = parseCrudKinds(context.flags.methods, 'method');
|
|
131
|
+
const variant = parseVariant(context.flags.variant);
|
|
132
|
+
const path = typeof context.flags.path === 'string' && context.flags.path.length > 0
|
|
133
|
+
? context.flags.path.replace(/^\/+|\/+$/g, '')
|
|
134
|
+
: toSnakeCase(names.plural);
|
|
135
|
+
return [
|
|
136
|
+
{
|
|
137
|
+
path: `src/api/${names.pluralCamel}.api.ts`,
|
|
138
|
+
content: renderApiFile(names, methods, variant, path),
|
|
139
|
+
},
|
|
140
|
+
];
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
//# sourceMappingURL=resource-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-api.js","sourceRoot":"","sources":["../../src/generator/resource-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { TemplateDefinition } from '../types.js';
|
|
2
|
+
import { type CrudKind, type ResourceVariant } from './crud.js';
|
|
3
|
+
export declare const HOOK_KINDS: readonly ["list", "show", "create", "update", "delete"];
|
|
4
|
+
export type HookKind = CrudKind;
|
|
5
|
+
export type ResourceHooksVariant = ResourceVariant;
|
|
6
|
+
export declare const resourceHooksTemplate: TemplateDefinition;
|
|
7
|
+
//# sourceMappingURL=resource-hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-hooks.d.ts","sourceRoot":"","sources":["../../src/generator/resource-hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,kBAAkB,EAAgB,MAAM,aAAa,CAAC;AAErF,OAAO,EAIL,KAAK,QAAQ,EACb,KAAK,eAAe,EACrB,MAAM,WAAW,CAAC;AAEnB,eAAO,MAAM,UAAU,yDAAa,CAAC;AACrC,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAAC;AAChC,MAAM,MAAM,oBAAoB,GAAG,eAAe,CAAC;AAiOnD,eAAO,MAAM,qBAAqB,EAAE,kBAuCnC,CAAC"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { deriveResourceNames } from './naming.js';
|
|
2
|
+
import { CRUD_KINDS, parseCrudKinds, parseVariant, } from './crud.js';
|
|
3
|
+
export const HOOK_KINDS = CRUD_KINDS;
|
|
4
|
+
function buildImports(names, hooks, variant) {
|
|
5
|
+
const needsQuery = hooks.has('list') || hooks.has('show');
|
|
6
|
+
const needsMutation = hooks.has('create') || hooks.has('update') || hooks.has('delete');
|
|
7
|
+
const rqImports = [
|
|
8
|
+
needsQuery ? 'useQuery' : null,
|
|
9
|
+
needsMutation ? 'useMutation' : null,
|
|
10
|
+
needsMutation ? 'useQueryClient' : null,
|
|
11
|
+
].filter(Boolean);
|
|
12
|
+
const configImports = [
|
|
13
|
+
needsQuery ? 'queryConfig' : null,
|
|
14
|
+
'QueryKeys',
|
|
15
|
+
needsMutation ? 'mutationConfig' : null,
|
|
16
|
+
].filter(Boolean);
|
|
17
|
+
const apiFns = [];
|
|
18
|
+
if (hooks.has('list'))
|
|
19
|
+
apiFns.push(`get${names.plural}`);
|
|
20
|
+
if (hooks.has('show'))
|
|
21
|
+
apiFns.push(`get${names.singular}`);
|
|
22
|
+
if (hooks.has('create')) {
|
|
23
|
+
apiFns.push(variant === 'bulk' ? `create${names.plural}` : `create${names.singular}`);
|
|
24
|
+
}
|
|
25
|
+
if (hooks.has('update')) {
|
|
26
|
+
apiFns.push(variant === 'bulk' ? `update${names.plural}` : `update${names.singular}`);
|
|
27
|
+
}
|
|
28
|
+
if (hooks.has('delete')) {
|
|
29
|
+
apiFns.push(variant === 'bulk' ? `delete${names.plural}` : `delete${names.singular}`);
|
|
30
|
+
}
|
|
31
|
+
const lines = [
|
|
32
|
+
`import { ${configImports.join(', ')} } from "@/config";`,
|
|
33
|
+
`import { ${rqImports.join(', ')} } from "@tanstack/react-query";`,
|
|
34
|
+
`import { ${apiFns.join(', ')} } from "@/api";`,
|
|
35
|
+
`import type { ${names.singular} } from "@/types";`,
|
|
36
|
+
];
|
|
37
|
+
if (needsMutation) {
|
|
38
|
+
lines.push(`import { toast } from "react-toastify";`);
|
|
39
|
+
}
|
|
40
|
+
return lines.join('\n');
|
|
41
|
+
}
|
|
42
|
+
function listHook(names) {
|
|
43
|
+
return `/**
|
|
44
|
+
* Get a list of all ${names.pluralCamel}
|
|
45
|
+
*/
|
|
46
|
+
export const use${names.plural} = () => {
|
|
47
|
+
return useQuery<${names.singular}[]>({
|
|
48
|
+
queryKey: [QueryKeys.${names.pluralConst}],
|
|
49
|
+
queryFn: async () => {
|
|
50
|
+
const { data } = await get${names.plural}();
|
|
51
|
+
return data || [];
|
|
52
|
+
},
|
|
53
|
+
...queryConfig,
|
|
54
|
+
});
|
|
55
|
+
};`;
|
|
56
|
+
}
|
|
57
|
+
function showHook(names) {
|
|
58
|
+
return `/**
|
|
59
|
+
* Get a specific ${names.singularCamel}
|
|
60
|
+
*/
|
|
61
|
+
export const use${names.singular} = (id: number) => {
|
|
62
|
+
return useQuery<${names.singular}>({
|
|
63
|
+
queryKey: [QueryKeys.${names.singularConst}, id],
|
|
64
|
+
queryFn: async () => {
|
|
65
|
+
const { data } = await get${names.singular}(id);
|
|
66
|
+
return data || [];
|
|
67
|
+
},
|
|
68
|
+
...queryConfig,
|
|
69
|
+
});
|
|
70
|
+
};`;
|
|
71
|
+
}
|
|
72
|
+
function createHook(names, variant) {
|
|
73
|
+
if (variant === 'bulk') {
|
|
74
|
+
return `/**
|
|
75
|
+
* Create ${names.pluralCamel}
|
|
76
|
+
*/
|
|
77
|
+
export const useCreate${names.plural} = () => {
|
|
78
|
+
const queryClient = useQueryClient();
|
|
79
|
+
return useMutation({
|
|
80
|
+
mutationFn: async (${names.pluralCamel}: ${names.singular}[]) => {
|
|
81
|
+
const { data, errors } = await create${names.plural}(${names.pluralCamel});
|
|
82
|
+
if (errors.length > 0) throw errors;
|
|
83
|
+
|
|
84
|
+
return data;
|
|
85
|
+
},
|
|
86
|
+
onSuccess: () => {
|
|
87
|
+
toast.success("${names.singular} created successfully");
|
|
88
|
+
queryClient.invalidateQueries({ queryKey: [QueryKeys.${names.pluralConst}] });
|
|
89
|
+
},
|
|
90
|
+
...mutationConfig,
|
|
91
|
+
});
|
|
92
|
+
};`;
|
|
93
|
+
}
|
|
94
|
+
return `/**
|
|
95
|
+
* Create ${names.singularCamel}
|
|
96
|
+
*/
|
|
97
|
+
export const useCreate${names.singular} = () => {
|
|
98
|
+
const queryClient = useQueryClient();
|
|
99
|
+
return useMutation({
|
|
100
|
+
mutationFn: async (${names.singularCamel}: ${names.singular}) => {
|
|
101
|
+
const { data, errors } = await create${names.singular}(${names.singularCamel});
|
|
102
|
+
if (errors.length > 0) throw errors;
|
|
103
|
+
|
|
104
|
+
return data;
|
|
105
|
+
},
|
|
106
|
+
onSuccess: () => {
|
|
107
|
+
toast.success("${names.singular} created successfully");
|
|
108
|
+
queryClient.invalidateQueries({ queryKey: [QueryKeys.${names.pluralConst}] });
|
|
109
|
+
},
|
|
110
|
+
...mutationConfig,
|
|
111
|
+
});
|
|
112
|
+
};`;
|
|
113
|
+
}
|
|
114
|
+
function updateHook(names, variant) {
|
|
115
|
+
if (variant === 'bulk') {
|
|
116
|
+
return `/**
|
|
117
|
+
* Update ${names.pluralCamel}
|
|
118
|
+
*/
|
|
119
|
+
export const useUpdate${names.plural} = () => {
|
|
120
|
+
const queryClient = useQueryClient();
|
|
121
|
+
return useMutation({
|
|
122
|
+
mutationFn: async (${names.pluralCamel}: ${names.singular}[]) => {
|
|
123
|
+
const { data, errors } = await update${names.plural}(${names.pluralCamel});
|
|
124
|
+
if (errors.length > 0) throw errors;
|
|
125
|
+
|
|
126
|
+
return data;
|
|
127
|
+
},
|
|
128
|
+
onSuccess: () => {
|
|
129
|
+
toast.success("${names.singular} updated successfully");
|
|
130
|
+
queryClient.invalidateQueries({ queryKey: [QueryKeys.${names.pluralConst}] });
|
|
131
|
+
},
|
|
132
|
+
...mutationConfig,
|
|
133
|
+
});
|
|
134
|
+
};`;
|
|
135
|
+
}
|
|
136
|
+
return `/**
|
|
137
|
+
* Update ${names.singularCamel}
|
|
138
|
+
*/
|
|
139
|
+
export const useUpdate${names.singular} = () => {
|
|
140
|
+
const queryClient = useQueryClient();
|
|
141
|
+
return useMutation({
|
|
142
|
+
mutationFn: async ({ id, ${names.singularCamel} }: { id: number; ${names.singularCamel}: ${names.singular} }) => {
|
|
143
|
+
const { data, errors } = await update${names.singular}(id, ${names.singularCamel});
|
|
144
|
+
if (errors.length > 0) throw errors;
|
|
145
|
+
|
|
146
|
+
return data;
|
|
147
|
+
},
|
|
148
|
+
onSuccess: () => {
|
|
149
|
+
toast.success("${names.singular} updated successfully");
|
|
150
|
+
queryClient.invalidateQueries({ queryKey: [QueryKeys.${names.pluralConst}] });
|
|
151
|
+
},
|
|
152
|
+
...mutationConfig,
|
|
153
|
+
});
|
|
154
|
+
};`;
|
|
155
|
+
}
|
|
156
|
+
function deleteHook(names, variant) {
|
|
157
|
+
if (variant === 'bulk') {
|
|
158
|
+
return `/**
|
|
159
|
+
* Delete ${names.pluralCamel}
|
|
160
|
+
*/
|
|
161
|
+
export const useDelete${names.plural} = () => {
|
|
162
|
+
const queryClient = useQueryClient();
|
|
163
|
+
return useMutation({
|
|
164
|
+
mutationFn: async (ids: number[]) => {
|
|
165
|
+
const { data, errors } = await delete${names.plural}(ids);
|
|
166
|
+
if (errors.length > 0) throw errors;
|
|
167
|
+
|
|
168
|
+
return data;
|
|
169
|
+
},
|
|
170
|
+
onSuccess: () => {
|
|
171
|
+
toast.success("${names.singular} deleted successfully");
|
|
172
|
+
queryClient.invalidateQueries({ queryKey: [QueryKeys.${names.pluralConst}] });
|
|
173
|
+
},
|
|
174
|
+
...mutationConfig,
|
|
175
|
+
});
|
|
176
|
+
};`;
|
|
177
|
+
}
|
|
178
|
+
return `/**
|
|
179
|
+
* Delete ${names.singularCamel}
|
|
180
|
+
*/
|
|
181
|
+
export const useDelete${names.singular} = () => {
|
|
182
|
+
const queryClient = useQueryClient();
|
|
183
|
+
return useMutation({
|
|
184
|
+
mutationFn: async (id: number) => {
|
|
185
|
+
const { data, errors } = await delete${names.singular}(id);
|
|
186
|
+
if (errors.length > 0) throw errors;
|
|
187
|
+
|
|
188
|
+
return data;
|
|
189
|
+
},
|
|
190
|
+
onSuccess: () => {
|
|
191
|
+
toast.success("${names.singular} deleted successfully");
|
|
192
|
+
queryClient.invalidateQueries({ queryKey: [QueryKeys.${names.pluralConst}] });
|
|
193
|
+
},
|
|
194
|
+
...mutationConfig,
|
|
195
|
+
});
|
|
196
|
+
};`;
|
|
197
|
+
}
|
|
198
|
+
function renderHooksFile(names, hooks, variant) {
|
|
199
|
+
const sections = [buildImports(names, hooks, variant), ''];
|
|
200
|
+
if (hooks.has('list'))
|
|
201
|
+
sections.push(listHook(names), '');
|
|
202
|
+
if (hooks.has('show'))
|
|
203
|
+
sections.push(showHook(names), '');
|
|
204
|
+
if (hooks.has('create'))
|
|
205
|
+
sections.push(createHook(names, variant), '');
|
|
206
|
+
if (hooks.has('update'))
|
|
207
|
+
sections.push(updateHook(names, variant), '');
|
|
208
|
+
if (hooks.has('delete'))
|
|
209
|
+
sections.push(deleteHook(names, variant), '');
|
|
210
|
+
return `${sections.join('\n').trimEnd()}\n`;
|
|
211
|
+
}
|
|
212
|
+
export const resourceHooksTemplate = {
|
|
213
|
+
name: 'resource-hooks',
|
|
214
|
+
description: 'React Query hooks for a resource (single or bulk mutations). Pass PascalCase singular name.',
|
|
215
|
+
kind: 'file',
|
|
216
|
+
flags: [
|
|
217
|
+
{
|
|
218
|
+
name: 'variant',
|
|
219
|
+
description: 'Mutation style: single (one record) or bulk (arrays)',
|
|
220
|
+
defaultValue: 'single',
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
name: 'hooks',
|
|
224
|
+
description: 'Comma-separated hooks to generate: list,show,create,update,delete (or all)',
|
|
225
|
+
defaultValue: 'all',
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
name: 'plural',
|
|
229
|
+
description: 'Optional PascalCase plural override (default: singular + s)',
|
|
230
|
+
defaultValue: '',
|
|
231
|
+
},
|
|
232
|
+
],
|
|
233
|
+
resolveFiles(context) {
|
|
234
|
+
const pluralFlag = typeof context.flags.plural === 'string' && context.flags.plural.length > 0
|
|
235
|
+
? context.flags.plural
|
|
236
|
+
: undefined;
|
|
237
|
+
const names = deriveResourceNames(context.projectName, pluralFlag);
|
|
238
|
+
const hooks = parseCrudKinds(context.flags.hooks, 'hook');
|
|
239
|
+
const variant = parseVariant(context.flags.variant);
|
|
240
|
+
return [
|
|
241
|
+
{
|
|
242
|
+
path: `src/hooks/query-hooks/use${names.plural}.ts`,
|
|
243
|
+
content: renderHooksFile(names, hooks, variant),
|
|
244
|
+
},
|
|
245
|
+
];
|
|
246
|
+
},
|
|
247
|
+
};
|
|
248
|
+
//# sourceMappingURL=resource-hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-hooks.js","sourceRoot":"","sources":["../../src/generator/resource-hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-page.d.ts","sourceRoot":"","sources":["../../src/generator/resource-page.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,kBAAkB,EAAgB,MAAM,aAAa,CAAC;AAkPrF,eAAO,MAAM,oBAAoB,EAAE,kBAiDlC,CAAC"}
|