arkos 1.4.11-beta → 1.4.12-beta
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/cjs/components/arkos-policy/index.js +38 -0
- package/dist/cjs/components/arkos-policy/index.js.map +1 -0
- package/dist/cjs/{types/arkos-prisma-input.bak.js → components/arkos-policy/types.js} +1 -1
- package/dist/cjs/components/arkos-policy/types.js.map +1 -0
- package/dist/cjs/exports/config.js +6 -0
- package/dist/cjs/exports/config.js.map +1 -0
- package/dist/cjs/modules/auth/auth.service.js +1 -1
- package/dist/cjs/modules/auth/auth.service.js.map +1 -1
- package/dist/cjs/modules/error-handler/error-handler.controller.js +1 -1
- package/dist/cjs/modules/error-handler/error-handler.controller.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/get-open-api-login-html.js +288 -0
- package/dist/cjs/modules/swagger/utils/get-open-api-login-html.js.map +1 -0
- package/dist/cjs/types/arkos-config/utils.js +3 -0
- package/dist/cjs/types/arkos-config/utils.js.map +1 -0
- package/dist/cjs/types/arkos-prisma-input.js.map +1 -1
- package/dist/cjs/types/arkos.js +3 -0
- package/dist/cjs/types/arkos.js.map +1 -0
- package/dist/cjs/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js +152 -0
- package/dist/cjs/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js.map +1 -0
- package/dist/cjs/utils/cli/utils/cli.helpers.js +1 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js +208 -0
- package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js.map +1 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-multiple-components.js +143 -39
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-multiple-components.js.map +1 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/policy-template.js +51 -0
- package/dist/cjs/utils/cli/utils/template-generator/templates/policy-template.js.map +1 -0
- package/dist/cjs/utils/cli/utils/template-generator/templates/zod-schema-generator.js +169 -0
- package/dist/cjs/utils/cli/utils/template-generator/templates/zod-schema-generator.js.map +1 -1
- package/dist/cjs/utils/features/api.features.js +0 -3
- package/dist/cjs/utils/features/api.features.js.map +1 -1
- package/dist/cjs/utils/helpers/api.features.helpers.js +20 -0
- package/dist/cjs/utils/helpers/api.features.helpers.js.map +1 -1
- package/dist/cjs/utils/helpers/exit-error.js +12 -0
- package/dist/cjs/utils/helpers/exit-error.js.map +1 -0
- package/dist/cjs/utils/initialize-app.js +56 -0
- package/dist/cjs/utils/initialize-app.js.map +1 -0
- package/dist/cjs/utils/setup-app.js +119 -0
- package/dist/cjs/utils/setup-app.js.map +1 -0
- package/dist/esm/components/arkos-policy/index.js +32 -0
- package/dist/esm/components/arkos-policy/index.js.map +1 -0
- package/dist/esm/components/arkos-policy/types.js +2 -0
- package/dist/esm/components/arkos-policy/types.js.map +1 -0
- package/dist/esm/exports/config.js +3 -0
- package/dist/esm/exports/config.js.map +1 -0
- package/dist/esm/modules/auth/auth.service.js +1 -1
- package/dist/esm/modules/auth/auth.service.js.map +1 -1
- package/dist/esm/modules/error-handler/error-handler.controller.js +1 -1
- package/dist/esm/modules/error-handler/error-handler.controller.js.map +1 -1
- package/dist/esm/modules/swagger/utils/get-open-api-login-html.js +285 -0
- package/dist/esm/modules/swagger/utils/get-open-api-login-html.js.map +1 -0
- package/dist/esm/types/arkos-config/utils.js +2 -0
- package/dist/esm/types/arkos-config/utils.js.map +1 -0
- package/dist/esm/types/arkos-prisma-input.js.map +1 -1
- package/dist/esm/types/arkos.js +2 -0
- package/dist/esm/types/arkos.js.map +1 -0
- package/dist/esm/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js +146 -0
- package/dist/esm/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js.map +1 -0
- package/dist/esm/utils/cli/utils/cli.helpers.js +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js +208 -0
- package/dist/esm/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-multiple-components.js +143 -39
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-multiple-components.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/policy-template.js +45 -0
- package/dist/esm/utils/cli/utils/template-generator/templates/policy-template.js.map +1 -0
- package/dist/esm/utils/cli/utils/template-generator/templates/zod-schema-generator.js +169 -0
- package/dist/esm/utils/cli/utils/template-generator/templates/zod-schema-generator.js.map +1 -1
- package/dist/esm/utils/features/api.features.js +0 -3
- package/dist/esm/utils/features/api.features.js.map +1 -1
- package/dist/esm/utils/helpers/api.features.helpers.js +20 -0
- package/dist/esm/utils/helpers/api.features.helpers.js.map +1 -1
- package/dist/esm/utils/helpers/exit-error.js +6 -0
- package/dist/esm/utils/helpers/exit-error.js.map +1 -0
- package/dist/esm/utils/initialize-app.js +50 -0
- package/dist/esm/utils/initialize-app.js.map +1 -0
- package/dist/esm/utils/setup-app.js +113 -0
- package/dist/esm/utils/setup-app.js.map +1 -0
- package/dist/types/components/arkos-policy/index.d.ts +31 -0
- package/dist/types/components/arkos-policy/types.d.ts +21 -0
- package/dist/types/exports/config.d.ts +2 -0
- package/dist/types/modules/swagger/utils/get-open-api-login-html.d.ts +1 -0
- package/dist/types/types/arkos-config/utils.d.ts +31 -0
- package/dist/types/types/arkos-prisma-input.d.ts +1 -1
- package/dist/types/types/arkos.d.ts +31 -0
- package/dist/types/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.d.ts +7 -0
- package/dist/types/utils/cli/utils/template-generator/templates/class-validator-dto-generator.d.ts +4 -0
- package/dist/types/utils/cli/utils/template-generator/templates/policy-template.d.ts +2 -0
- package/dist/types/utils/cli/utils/template-generator/templates/zod-schema-generator.d.ts +4 -0
- package/dist/types/utils/helpers/exit-error.d.ts +1 -0
- package/dist/types/utils/initialize-app.d.ts +2 -0
- package/dist/types/utils/setup-app.d.ts +2 -0
- package/package.json +55 -55
- package/dist/cjs/types/arkos-prisma-input.bak.js.map +0 -1
- package/dist/esm/types/arkos-prisma-input.bak.js +0 -2
- package/dist/esm/types/arkos-prisma-input.bak.js.map +0 -1
- package/dist/types/types/arkos-prisma-input.bak.d.ts +0 -237
package/dist/esm/utils/cli/utils/template-generator/templates/generate-multiple-components.js
CHANGED
|
@@ -1,10 +1,39 @@
|
|
|
1
1
|
import { camelCase, kebabCase, pascalCase, } from "../../../../helpers/change-case.helpers.js";
|
|
2
|
+
import ExitError from "../../../../helpers/exit-error.js";
|
|
2
3
|
import sheu from "../../../../sheu.js";
|
|
3
4
|
import { generateCommand } from "../../../generate.js";
|
|
5
|
+
const authOnlyComponents = new Set([
|
|
6
|
+
"login-schema",
|
|
7
|
+
"signup-schema",
|
|
8
|
+
"update-me-schema",
|
|
9
|
+
"update-password-schema",
|
|
10
|
+
"login-dto",
|
|
11
|
+
"signup-dto",
|
|
12
|
+
"update-me-dto",
|
|
13
|
+
"update-password-dto",
|
|
14
|
+
]);
|
|
15
|
+
const prismaOnlyComponents = new Set([
|
|
16
|
+
"model",
|
|
17
|
+
"schema",
|
|
18
|
+
"create-schema",
|
|
19
|
+
"update-schema",
|
|
20
|
+
"query-schema",
|
|
21
|
+
"dto",
|
|
22
|
+
"create-dto",
|
|
23
|
+
"update-dto",
|
|
24
|
+
"query-dto",
|
|
25
|
+
]);
|
|
4
26
|
export default async function generateMultipleComponents(options) {
|
|
5
|
-
const
|
|
6
|
-
if (!
|
|
7
|
-
throw
|
|
27
|
+
const moduleInput = options.modules || options.module || options.model;
|
|
28
|
+
if (!moduleInput)
|
|
29
|
+
throw ExitError("Module name is required. Use -m or --module flag.");
|
|
30
|
+
if (!options.modules && moduleInput?.includes(","))
|
|
31
|
+
throw ExitError("Multiple modules are not supported with -m/--module. Use -ms/--modules instead.\n" +
|
|
32
|
+
"Example: arkos g components -ms post,user,auth --names s,sc");
|
|
33
|
+
const moduleNames = moduleInput
|
|
34
|
+
.split(",")
|
|
35
|
+
.map((m) => m.trim())
|
|
36
|
+
.filter(Boolean);
|
|
8
37
|
const componentMap = {
|
|
9
38
|
s: generateCommand.service,
|
|
10
39
|
service: generateCommand.service,
|
|
@@ -38,6 +67,24 @@ export default async function generateMultipleComponents(options) {
|
|
|
38
67
|
interceptors: generateCommand.interceptors,
|
|
39
68
|
h: generateCommand.hooks,
|
|
40
69
|
hooks: generateCommand.hooks,
|
|
70
|
+
p: generateCommand.policy,
|
|
71
|
+
policy: generateCommand.policy,
|
|
72
|
+
ls: generateCommand.loginSchema,
|
|
73
|
+
"login-schema": generateCommand.loginSchema,
|
|
74
|
+
ss: generateCommand.signupSchema,
|
|
75
|
+
"signup-schema": generateCommand.signupSchema,
|
|
76
|
+
ums: generateCommand.updateMeSchema,
|
|
77
|
+
"update-me-schema": generateCommand.updateMeSchema,
|
|
78
|
+
ups: generateCommand.updatePasswordSchema,
|
|
79
|
+
"update-password-schema": generateCommand.updatePasswordSchema,
|
|
80
|
+
ld: generateCommand.loginDto,
|
|
81
|
+
"login-dto": generateCommand.loginDto,
|
|
82
|
+
sd: generateCommand.signupDto,
|
|
83
|
+
"signup-dto": generateCommand.signupDto,
|
|
84
|
+
umd: generateCommand.updateMeDto,
|
|
85
|
+
"update-me-dto": generateCommand.updateMeDto,
|
|
86
|
+
upd: generateCommand.updatePasswordDto,
|
|
87
|
+
"update-password-dto": generateCommand.updatePasswordDto,
|
|
41
88
|
};
|
|
42
89
|
const allComponents = [
|
|
43
90
|
"model",
|
|
@@ -56,6 +103,22 @@ export default async function generateMultipleComponents(options) {
|
|
|
56
103
|
"interceptors",
|
|
57
104
|
"hooks",
|
|
58
105
|
"auth-configs",
|
|
106
|
+
"policy",
|
|
107
|
+
];
|
|
108
|
+
const allAuthComponents = [
|
|
109
|
+
"login-schema",
|
|
110
|
+
"signup-schema",
|
|
111
|
+
"update-me-schema",
|
|
112
|
+
"update-password-schema",
|
|
113
|
+
"login-dto",
|
|
114
|
+
"signup-dto",
|
|
115
|
+
"update-me-dto",
|
|
116
|
+
"update-password-dto",
|
|
117
|
+
"query-options",
|
|
118
|
+
"interceptors",
|
|
119
|
+
"hooks",
|
|
120
|
+
"router",
|
|
121
|
+
"policy",
|
|
59
122
|
];
|
|
60
123
|
const defaultPaths = {
|
|
61
124
|
"create-schema": "src/modules/{{module-name}}/schemas",
|
|
@@ -67,18 +130,17 @@ export default async function generateMultipleComponents(options) {
|
|
|
67
130
|
"query-dto": "src/modules/{{module-name}}/dtos",
|
|
68
131
|
dto: "src/modules/{{module-name}}/dtos",
|
|
69
132
|
model: "prisma/schema",
|
|
133
|
+
"login-schema": "src/modules/auth/schemas",
|
|
134
|
+
"signup-schema": "src/modules/auth/schemas",
|
|
135
|
+
"update-me-schema": "src/modules/auth/schemas",
|
|
136
|
+
"update-password-schema": "src/modules/auth/schemas",
|
|
137
|
+
"login-dto": "src/modules/auth/dtos",
|
|
138
|
+
"signup-dto": "src/modules/auth/dtos",
|
|
139
|
+
"update-me-dto": "src/modules/auth/dtos",
|
|
140
|
+
"update-password-dto": "src/modules/auth/dtos",
|
|
70
141
|
};
|
|
71
|
-
|
|
72
|
-
pascal: pascalCase(moduleName),
|
|
73
|
-
camel: camelCase(moduleName),
|
|
74
|
-
kebab: kebabCase(moduleName),
|
|
75
|
-
};
|
|
76
|
-
const readableName = names.kebab.replaceAll("-", " ");
|
|
77
|
-
let componentsToGenerate = [];
|
|
142
|
+
let requestedComponents = [];
|
|
78
143
|
if (options.all) {
|
|
79
|
-
componentsToGenerate = allComponents;
|
|
80
|
-
console.log("");
|
|
81
|
-
sheu.info(`Generating all components for ${readableName}\n`);
|
|
82
144
|
}
|
|
83
145
|
else if (options.names) {
|
|
84
146
|
const requested = options.names
|
|
@@ -88,48 +150,90 @@ export default async function generateMultipleComponents(options) {
|
|
|
88
150
|
for (const comp of requested) {
|
|
89
151
|
if (componentMap[comp]) {
|
|
90
152
|
const fullName = Object.keys(componentMap).find((k) => componentMap[k] === componentMap[comp] && k.length > 2) || comp;
|
|
91
|
-
if (!
|
|
92
|
-
|
|
153
|
+
if (!requestedComponents.includes(fullName)) {
|
|
154
|
+
requestedComponents.push(fullName);
|
|
93
155
|
}
|
|
94
156
|
}
|
|
95
157
|
else {
|
|
96
158
|
sheu.warn(`Unknown component: "${comp}" - skipping`);
|
|
97
159
|
}
|
|
98
160
|
}
|
|
99
|
-
if (
|
|
161
|
+
if (requestedComponents.length === 0)
|
|
100
162
|
throw new Error("No valid components specified.");
|
|
101
|
-
sheu.info(`Generating components for ${readableName}`);
|
|
102
|
-
sheu.info(`Components: ${componentsToGenerate.join(", ")}\n`);
|
|
103
163
|
}
|
|
104
164
|
else {
|
|
105
|
-
throw new Error("Please specify either --all or --
|
|
165
|
+
throw new Error("Please specify either --all or --names flag.\n" +
|
|
106
166
|
"Examples:\n" +
|
|
107
|
-
" arkos g
|
|
108
|
-
" arkos g
|
|
167
|
+
" arkos g components -m user --all\n" +
|
|
168
|
+
" arkos g components -m user,post,auth --names s,sc,m");
|
|
169
|
+
}
|
|
170
|
+
const isMultipleModules = moduleNames.length > 1;
|
|
171
|
+
let totalSuccess = 0;
|
|
172
|
+
let totalFail = 0;
|
|
173
|
+
if (isMultipleModules) {
|
|
174
|
+
console.log("");
|
|
175
|
+
sheu.info(`Generating components for modules: ${moduleNames.join(", ")}\n`);
|
|
109
176
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
177
|
+
for (const moduleName of moduleNames) {
|
|
178
|
+
const isAuth = kebabCase(moduleName) === "auth";
|
|
179
|
+
const names = {
|
|
180
|
+
pascal: pascalCase(moduleName),
|
|
181
|
+
camel: camelCase(moduleName),
|
|
182
|
+
kebab: kebabCase(moduleName),
|
|
183
|
+
};
|
|
184
|
+
const readableName = names.kebab.replaceAll("-", " ");
|
|
185
|
+
let componentsToGenerate;
|
|
186
|
+
if (options.all) {
|
|
187
|
+
componentsToGenerate = isAuth ? allAuthComponents : allComponents;
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
componentsToGenerate = requestedComponents.filter((comp) => {
|
|
191
|
+
if (authOnlyComponents.has(comp) && !isAuth) {
|
|
192
|
+
sheu.warn(`Skipping "${comp}" for module "${moduleName}" — only valid for auth`);
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
if (prismaOnlyComponents.has(comp) && isAuth) {
|
|
196
|
+
sheu.warn(`Skipping "${comp}" for module "${moduleName}" — not valid for auth`);
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
return true;
|
|
121
200
|
});
|
|
122
|
-
successCount++;
|
|
123
201
|
}
|
|
124
|
-
|
|
125
|
-
sheu.
|
|
126
|
-
|
|
202
|
+
if (isMultipleModules) {
|
|
203
|
+
sheu.info(`\n→ ${readableName}`);
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
console.log("");
|
|
207
|
+
sheu.info(`Generating components for ${readableName}`);
|
|
208
|
+
if (!options.all)
|
|
209
|
+
sheu.info(`Components: ${componentsToGenerate.join(", ")}\n`);
|
|
127
210
|
}
|
|
211
|
+
let successCount = 0;
|
|
212
|
+
let failCount = 0;
|
|
213
|
+
for (const componentName of componentsToGenerate) {
|
|
214
|
+
try {
|
|
215
|
+
await componentMap[componentName]({
|
|
216
|
+
...options,
|
|
217
|
+
module: moduleName,
|
|
218
|
+
model: undefined,
|
|
219
|
+
path: defaultPaths[componentName],
|
|
220
|
+
shouldExit: false,
|
|
221
|
+
shouldPrintError: false,
|
|
222
|
+
isBulk: true,
|
|
223
|
+
});
|
|
224
|
+
successCount++;
|
|
225
|
+
}
|
|
226
|
+
catch (error) {
|
|
227
|
+
sheu.error(`Failed to generate ${componentName} for ${readableName}: ${error?.message}`);
|
|
228
|
+
failCount++;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
totalSuccess += successCount;
|
|
232
|
+
totalFail += failCount;
|
|
128
233
|
}
|
|
129
234
|
console.info("");
|
|
130
|
-
sheu.done(`Components generation complete ${
|
|
131
|
-
if (
|
|
235
|
+
sheu.done(`Components generation complete for: ${moduleNames.map((m) => m.replaceAll("-", " ")).join(", ")}`);
|
|
236
|
+
if (totalFail > 0)
|
|
132
237
|
process.exit(1);
|
|
133
|
-
}
|
|
134
238
|
}
|
|
135
239
|
//# sourceMappingURL=generate-multiple-components.js.map
|
package/dist/esm/utils/cli/utils/template-generator/templates/generate-multiple-components.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-multiple-components.js","sourceRoot":"","sources":["../../../../../../../src/utils/cli/utils/template-generator/templates/generate-multiple-components.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n camelCase,\n kebabCase,\n pascalCase,\n} from \"../../../../helpers/change-case.helpers\";\nimport sheu from \"../../../../sheu\";\nimport { generateCommand, GenerateOptions } from \"../../../generate\";\n\nexport type MultipleComponentsGenerateOptions = GenerateOptions & {\n all?: boolean;\n names?: string;\n};\n\nexport default async function generateMultipleComponents(\n options: MultipleComponentsGenerateOptions\n) {\n const moduleName = options.module || options.model;\n\n if (!moduleName)\n throw new Error(\"Module name is required. Use -m or --module flag.\");\n\n const componentMap: Record<string, Function> = {\n s: generateCommand.service,\n service: generateCommand.service,\n c: generateCommand.controller,\n controller: generateCommand.controller,\n r: generateCommand.router,\n router: generateCommand.router,\n sc: generateCommand.baseSchema,\n schema: generateCommand.baseSchema,\n cs: generateCommand.createSchema,\n \"create-schema\": generateCommand.createSchema,\n us: generateCommand.updateSchema,\n \"update-schema\": generateCommand.updateSchema,\n qs: generateCommand.querySchema,\n \"query-schema\": generateCommand.querySchema,\n d: generateCommand.baseDto,\n dto: generateCommand.baseDto,\n cd: generateCommand.createDto,\n \"create-dto\": generateCommand.createDto,\n ud: generateCommand.updateDto,\n \"update-dto\": generateCommand.updateDto,\n qd: generateCommand.queryDto,\n \"query-dto\": generateCommand.queryDto,\n m: generateCommand.prismaModel,\n model: generateCommand.prismaModel,\n a: generateCommand.authConfigs,\n \"auth-configs\": generateCommand.authConfigs,\n q: generateCommand.queryOptions,\n \"query-options\": generateCommand.queryOptions,\n i: generateCommand.interceptors,\n interceptors: generateCommand.interceptors,\n h: generateCommand.hooks,\n hooks: generateCommand.hooks,\n };\n\n const allComponents = [\n \"model\",\n \"schema\",\n \"create-schema\",\n \"update-schema\",\n \"query-schema\",\n \"dto\",\n \"create-dto\",\n \"update-dto\",\n \"query-dto\",\n \"query-options\",\n \"service\",\n \"controller\",\n \"router\",\n \"interceptors\",\n \"hooks\",\n \"auth-configs\",\n ];\n\n const defaultPaths: Record<string, string> = {\n \"create-schema\": \"src/modules/{{module-name}}/schemas\",\n \"update-schema\": \"src/modules/{{module-name}}/schemas\",\n \"query-schema\": \"src/modules/{{module-name}}/schemas\",\n schema: \"src/modules/{{module-name}}/schemas\",\n \"create-dto\": \"src/modules/{{module-name}}/dtos\",\n \"update-dto\": \"src/modules/{{module-name}}/dtos\",\n \"query-dto\": \"src/modules/{{module-name}}/dtos\",\n dto: \"src/modules/{{module-name}}/dtos\",\n model: \"prisma/schema\",\n };\n\n const names = {\n pascal: pascalCase(moduleName),\n camel: camelCase(moduleName),\n kebab: kebabCase(moduleName),\n };\n const readableName = names.kebab.replaceAll(\"-\", \" \");\n\n let componentsToGenerate: string[] = [];\n\n if (options.all) {\n componentsToGenerate = allComponents;\n console.log(\"\");\n sheu.info(`Generating all components for ${readableName}\\n`);\n } else if (options.names) {\n const requested = options.names\n .split(\",\")\n .map((c: string) => c.trim())\n .filter(Boolean);\n\n for (const comp of requested) {\n if (componentMap[comp]) {\n const fullName =\n Object.keys(componentMap).find(\n (k) => componentMap[k] === componentMap[comp] && k.length > 2\n ) || comp;\n if (!componentsToGenerate.includes(fullName)) {\n componentsToGenerate.push(fullName);\n }\n } else {\n sheu.warn(`Unknown component: \"${comp}\" - skipping`);\n }\n }\n\n if (componentsToGenerate.length === 0)\n throw new Error(\"No valid components specified.\");\n\n sheu.info(`Generating components for ${readableName}`);\n sheu.info(`Components: ${componentsToGenerate.join(\", \")}\\n`);\n } else {\n throw new Error(\n \"Please specify either --all or --components flag.\\n\" +\n \"Examples:\\n\" +\n \" arkos g module -m user --all\\n\" +\n \" arkos g module -m user -c s,sc,m\"\n );\n }\n\n let successCount = 0;\n let failCount = 0;\n\n for (const componentName of componentsToGenerate) {\n try {\n await componentMap[componentName]({\n ...options,\n module: moduleName,\n path: defaultPaths[componentName],\n shouldExit: false,\n shouldPrintError: false,\n isBulk: true,\n });\n successCount++;\n } catch (error: any) {\n sheu.error(\n `Failed to generate ${componentName} because ${error?.message}`\n );\n failCount++;\n }\n }\n\n console.info(\"\");\n sheu.done(\n `Components generation complete ${moduleName.replaceAll(\"-\", \" \")}`\n );\n\n if (failCount > 0) {\n process.exit(1);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"generate-multiple-components.js","sourceRoot":"","sources":["../../../../../../../src/utils/cli/utils/template-generator/templates/generate-multiple-components.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n camelCase,\n kebabCase,\n pascalCase,\n} from \"../../../../helpers/change-case.helpers\";\nimport ExitError from \"../../../../helpers/exit-error\";\nimport sheu from \"../../../../sheu\";\nimport { generateCommand, GenerateOptions } from \"../../../generate\";\n\nexport type MultipleComponentsGenerateOptions = GenerateOptions & {\n all?: boolean;\n names?: string;\n};\n\nconst authOnlyComponents = new Set([\n \"login-schema\",\n \"signup-schema\",\n \"update-me-schema\",\n \"update-password-schema\",\n \"login-dto\",\n \"signup-dto\",\n \"update-me-dto\",\n \"update-password-dto\",\n]);\n\nconst prismaOnlyComponents = new Set([\n \"model\",\n \"schema\",\n \"create-schema\",\n \"update-schema\",\n \"query-schema\",\n \"dto\",\n \"create-dto\",\n \"update-dto\",\n \"query-dto\",\n]);\n\nexport default async function generateMultipleComponents(\n options: MultipleComponentsGenerateOptions\n) {\n const moduleInput = options.modules || options.module || options.model;\n\n if (!moduleInput)\n throw ExitError(\"Module name is required. Use -m or --module flag.\");\n\n if (!options.modules && moduleInput?.includes(\",\"))\n throw ExitError(\n \"Multiple modules are not supported with -m/--module. Use -ms/--modules instead.\\n\" +\n \"Example: arkos g components -ms post,user,auth --names s,sc\"\n );\n\n const moduleNames = moduleInput\n .split(\",\")\n .map((m: string) => m.trim())\n .filter(Boolean);\n\n const componentMap: Record<string, Function> = {\n s: generateCommand.service,\n service: generateCommand.service,\n c: generateCommand.controller,\n controller: generateCommand.controller,\n r: generateCommand.router,\n router: generateCommand.router,\n sc: generateCommand.baseSchema,\n schema: generateCommand.baseSchema,\n cs: generateCommand.createSchema,\n \"create-schema\": generateCommand.createSchema,\n us: generateCommand.updateSchema,\n \"update-schema\": generateCommand.updateSchema,\n qs: generateCommand.querySchema,\n \"query-schema\": generateCommand.querySchema,\n d: generateCommand.baseDto,\n dto: generateCommand.baseDto,\n cd: generateCommand.createDto,\n \"create-dto\": generateCommand.createDto,\n ud: generateCommand.updateDto,\n \"update-dto\": generateCommand.updateDto,\n qd: generateCommand.queryDto,\n \"query-dto\": generateCommand.queryDto,\n m: generateCommand.prismaModel,\n model: generateCommand.prismaModel,\n a: generateCommand.authConfigs,\n \"auth-configs\": generateCommand.authConfigs,\n q: generateCommand.queryOptions,\n \"query-options\": generateCommand.queryOptions,\n i: generateCommand.interceptors,\n interceptors: generateCommand.interceptors,\n h: generateCommand.hooks,\n hooks: generateCommand.hooks,\n p: generateCommand.policy,\n policy: generateCommand.policy,\n ls: generateCommand.loginSchema,\n \"login-schema\": generateCommand.loginSchema,\n ss: generateCommand.signupSchema,\n \"signup-schema\": generateCommand.signupSchema,\n ums: generateCommand.updateMeSchema,\n \"update-me-schema\": generateCommand.updateMeSchema,\n ups: generateCommand.updatePasswordSchema,\n \"update-password-schema\": generateCommand.updatePasswordSchema,\n ld: generateCommand.loginDto,\n \"login-dto\": generateCommand.loginDto,\n sd: generateCommand.signupDto,\n \"signup-dto\": generateCommand.signupDto,\n umd: generateCommand.updateMeDto,\n \"update-me-dto\": generateCommand.updateMeDto,\n upd: generateCommand.updatePasswordDto,\n \"update-password-dto\": generateCommand.updatePasswordDto,\n };\n\n const allComponents = [\n \"model\",\n \"schema\",\n \"create-schema\",\n \"update-schema\",\n \"query-schema\",\n \"dto\",\n \"create-dto\",\n \"update-dto\",\n \"query-dto\",\n \"query-options\",\n \"service\",\n \"controller\",\n \"router\",\n \"interceptors\",\n \"hooks\",\n \"auth-configs\",\n \"policy\",\n ];\n\n const allAuthComponents = [\n \"login-schema\",\n \"signup-schema\",\n \"update-me-schema\",\n \"update-password-schema\",\n \"login-dto\",\n \"signup-dto\",\n \"update-me-dto\",\n \"update-password-dto\",\n \"query-options\",\n \"interceptors\",\n \"hooks\",\n \"router\",\n \"policy\",\n ];\n\n const defaultPaths: Record<string, string> = {\n \"create-schema\": \"src/modules/{{module-name}}/schemas\",\n \"update-schema\": \"src/modules/{{module-name}}/schemas\",\n \"query-schema\": \"src/modules/{{module-name}}/schemas\",\n schema: \"src/modules/{{module-name}}/schemas\",\n \"create-dto\": \"src/modules/{{module-name}}/dtos\",\n \"update-dto\": \"src/modules/{{module-name}}/dtos\",\n \"query-dto\": \"src/modules/{{module-name}}/dtos\",\n dto: \"src/modules/{{module-name}}/dtos\",\n model: \"prisma/schema\",\n \"login-schema\": \"src/modules/auth/schemas\",\n \"signup-schema\": \"src/modules/auth/schemas\",\n \"update-me-schema\": \"src/modules/auth/schemas\",\n \"update-password-schema\": \"src/modules/auth/schemas\",\n \"login-dto\": \"src/modules/auth/dtos\",\n \"signup-dto\": \"src/modules/auth/dtos\",\n \"update-me-dto\": \"src/modules/auth/dtos\",\n \"update-password-dto\": \"src/modules/auth/dtos\",\n };\n\n // Resolve which components to generate from --names or --all\n // (done once, applied per module with filtering)\n let requestedComponents: string[] = [];\n\n if (options.all) {\n // will be resolved per module below\n } else if (options.names) {\n const requested = options.names\n .split(\",\")\n .map((c: string) => c.trim())\n .filter(Boolean);\n\n for (const comp of requested) {\n if (componentMap[comp]) {\n const fullName =\n Object.keys(componentMap).find(\n (k) => componentMap[k] === componentMap[comp] && k.length > 2\n ) || comp;\n if (!requestedComponents.includes(fullName)) {\n requestedComponents.push(fullName);\n }\n } else {\n sheu.warn(`Unknown component: \"${comp}\" - skipping`);\n }\n }\n\n if (requestedComponents.length === 0)\n throw new Error(\"No valid components specified.\");\n } else {\n throw new Error(\n \"Please specify either --all or --names flag.\\n\" +\n \"Examples:\\n\" +\n \" arkos g components -m user --all\\n\" +\n \" arkos g components -m user,post,auth --names s,sc,m\"\n );\n }\n\n const isMultipleModules = moduleNames.length > 1;\n let totalSuccess = 0;\n let totalFail = 0;\n\n if (isMultipleModules) {\n console.log(\"\");\n sheu.info(`Generating components for modules: ${moduleNames.join(\", \")}\\n`);\n }\n\n for (const moduleName of moduleNames) {\n const isAuth = kebabCase(moduleName) === \"auth\";\n const names = {\n pascal: pascalCase(moduleName),\n camel: camelCase(moduleName),\n kebab: kebabCase(moduleName),\n };\n const readableName = names.kebab.replaceAll(\"-\", \" \");\n\n // Resolve components for this specific module\n let componentsToGenerate: string[];\n\n if (options.all) {\n componentsToGenerate = isAuth ? allAuthComponents : allComponents;\n } else {\n // Filter requested components — skip auth-only for non-auth, skip prisma-only for auth\n componentsToGenerate = requestedComponents.filter((comp) => {\n if (authOnlyComponents.has(comp) && !isAuth) {\n sheu.warn(\n `Skipping \"${comp}\" for module \"${moduleName}\" — only valid for auth`\n );\n return false;\n }\n if (prismaOnlyComponents.has(comp) && isAuth) {\n sheu.warn(\n `Skipping \"${comp}\" for module \"${moduleName}\" — not valid for auth`\n );\n return false;\n }\n return true;\n });\n }\n\n if (isMultipleModules) {\n sheu.info(`\\n→ ${readableName}`);\n } else {\n console.log(\"\");\n sheu.info(`Generating components for ${readableName}`);\n if (!options.all)\n sheu.info(`Components: ${componentsToGenerate.join(\", \")}\\n`);\n }\n\n let successCount = 0;\n let failCount = 0;\n\n for (const componentName of componentsToGenerate) {\n try {\n await componentMap[componentName]({\n ...options,\n module: moduleName,\n model: undefined,\n path: defaultPaths[componentName],\n shouldExit: false,\n shouldPrintError: false,\n isBulk: true,\n });\n successCount++;\n } catch (error: any) {\n sheu.error(\n `Failed to generate ${componentName} for ${readableName}: ${error?.message}`\n );\n failCount++;\n }\n }\n\n totalSuccess += successCount;\n totalFail += failCount;\n }\n\n console.info(\"\");\n sheu.done(\n `Components generation complete for: ${moduleNames.map((m) => m.replaceAll(\"-\", \" \")).join(\", \")}`\n );\n\n if (totalFail > 0) process.exit(1);\n}\n"]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { getArkosConfig } from "../../../../helpers/arkos-config.helpers.js";
|
|
2
|
+
import { kebabCase } from "../../../../helpers/change-case.helpers.js";
|
|
3
|
+
import prismaSchemaParser from "../../../../prisma/prisma-schema-parser.js";
|
|
4
|
+
export function generatePolicyTemplate(options) {
|
|
5
|
+
const { modelName } = options;
|
|
6
|
+
const arkosConfig = getArkosConfig();
|
|
7
|
+
if (!modelName)
|
|
8
|
+
throw new Error("Module name is required for policy template");
|
|
9
|
+
const modelNameCapitalized = modelName.kebab
|
|
10
|
+
.replaceAll("-", " ")
|
|
11
|
+
.split(" ")
|
|
12
|
+
.map((w) => w.charAt(0).toUpperCase() + w.slice(1))
|
|
13
|
+
.join(" ");
|
|
14
|
+
const modelNameSpaced = modelName.kebab.replaceAll("-", " ");
|
|
15
|
+
const models = prismaSchemaParser
|
|
16
|
+
.getModelsAsArrayOfStrings()
|
|
17
|
+
.map((m) => kebabCase(m.toLowerCase()));
|
|
18
|
+
const isPrismaModel = models.includes(modelName.kebab.toLowerCase());
|
|
19
|
+
const crudRules = isPrismaModel
|
|
20
|
+
? `
|
|
21
|
+
.rule("Create", {
|
|
22
|
+
${arkosConfig?.authentication?.mode === "static" ? "roles: []\n" : ""}name: "Create ${modelNameCapitalized}",
|
|
23
|
+
description: "Permission to create new ${modelNameSpaced} records",
|
|
24
|
+
})
|
|
25
|
+
.rule("View", {
|
|
26
|
+
${arkosConfig?.authentication?.mode === "static" ? "roles: []\n" : ""}name: "View ${modelNameCapitalized}",
|
|
27
|
+
description: "Permission to view ${modelNameSpaced} records",
|
|
28
|
+
})
|
|
29
|
+
.rule("Update", {
|
|
30
|
+
${arkosConfig?.authentication?.mode === "static" ? "roles: []\n" : ""}name: "Update ${modelNameCapitalized}",
|
|
31
|
+
description: "Permission to update existing ${modelNameSpaced} records",
|
|
32
|
+
})
|
|
33
|
+
.rule("Delete", {
|
|
34
|
+
${arkosConfig?.authentication?.mode === "static" ? "roles: []\n" : ""}name: "Delete ${modelNameCapitalized}",
|
|
35
|
+
description: "Permission to delete ${modelNameSpaced} records",
|
|
36
|
+
})`
|
|
37
|
+
: "";
|
|
38
|
+
return `import { ArkosPolicy } from "arkos";
|
|
39
|
+
|
|
40
|
+
const ${modelName.camel}Policy = ArkosPolicy("${modelName.kebab}")${crudRules};
|
|
41
|
+
|
|
42
|
+
export default ${modelName.camel}Policy;
|
|
43
|
+
`;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=policy-template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-template.js","sourceRoot":"","sources":["../../../../../../../src/utils/cli/utils/template-generator/templates/policy-template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,kBAAkB,MAAM,yCAAyC,CAAC;AAGzE,MAAM,UAAU,sBAAsB,CAAC,OAAwB;IAC7D,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAC9B,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IAErC,IAAI,CAAC,SAAS;QACZ,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAEjE,MAAM,oBAAoB,GAAG,SAAS,CAAC,KAAK;SACzC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC;SACpB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAClD,IAAI,CAAC,GAAG,CAAC,CAAC;IAEb,MAAM,eAAe,GAAG,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAE7D,MAAM,MAAM,GAAG,kBAAkB;SAC9B,yBAAyB,EAAE;SAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAE1C,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;IAErE,MAAM,SAAS,GAAG,aAAa;QAC7B,CAAC,CAAC;;MAEA,WAAW,EAAE,cAAc,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,iBAAiB,oBAAoB;6CACjE,eAAe;;;MAGtD,WAAW,EAAE,cAAc,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,eAAe,oBAAoB;uCACrE,eAAe;;;MAGhD,WAAW,EAAE,cAAc,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,iBAAiB,oBAAoB;kDAC5D,eAAe;;;MAG3D,WAAW,EAAE,cAAc,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,iBAAiB,oBAAoB;yCACrE,eAAe;KACnD;QACD,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;;QAED,SAAS,CAAC,KAAK,yBAAyB,SAAS,CAAC,KAAK,KAAK,SAAS;;iBAE5D,SAAS,CAAC,KAAK;CAC/B,CAAC;AACF,CAAC","sourcesContent":["import { getArkosConfig } from \"../../../../helpers/arkos-config.helpers\";\nimport { kebabCase } from \"../../../../helpers/change-case.helpers\";\nimport prismaSchemaParser from \"../../../../prisma/prisma-schema-parser\";\nimport { TemplateOptions } from \"../../template-generators\";\n\nexport function generatePolicyTemplate(options: TemplateOptions): string {\n const { modelName } = options;\n const arkosConfig = getArkosConfig();\n\n if (!modelName)\n throw new Error(\"Module name is required for policy template\");\n\n const modelNameCapitalized = modelName.kebab\n .replaceAll(\"-\", \" \")\n .split(\" \")\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(\" \");\n\n const modelNameSpaced = modelName.kebab.replaceAll(\"-\", \" \");\n\n const models = prismaSchemaParser\n .getModelsAsArrayOfStrings()\n .map((m) => kebabCase(m.toLowerCase()));\n\n const isPrismaModel = models.includes(modelName.kebab.toLowerCase());\n\n const crudRules = isPrismaModel\n ? `\n .rule(\"Create\", {\n ${arkosConfig?.authentication?.mode === \"static\" ? \"roles: []\\n\" : \"\"}name: \"Create ${modelNameCapitalized}\",\n description: \"Permission to create new ${modelNameSpaced} records\",\n })\n .rule(\"View\", {\n ${arkosConfig?.authentication?.mode === \"static\" ? \"roles: []\\n\" : \"\"}name: \"View ${modelNameCapitalized}\",\n description: \"Permission to view ${modelNameSpaced} records\",\n })\n .rule(\"Update\", {\n ${arkosConfig?.authentication?.mode === \"static\" ? \"roles: []\\n\" : \"\"}name: \"Update ${modelNameCapitalized}\",\n description: \"Permission to update existing ${modelNameSpaced} records\",\n })\n .rule(\"Delete\", {\n ${arkosConfig?.authentication?.mode === \"static\" ? \"roles: []\\n\" : \"\"}name: \"Delete ${modelNameCapitalized}\",\n description: \"Permission to delete ${modelNameSpaced} records\",\n })`\n : \"\";\n\n return `import { ArkosPolicy } from \"arkos\";\n\nconst ${modelName.camel}Policy = ArkosPolicy(\"${modelName.kebab}\")${crudRules};\n\nexport default ${modelName.camel}Policy;\n`;\n}\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import prismaSchemaParser from "../../../../prisma/prisma-schema-parser.js";
|
|
2
2
|
import { getUserFileExtension } from "../../../../helpers/fs.helpers.js";
|
|
3
|
+
import { getArkosConfig } from "../../../../helpers/arkos-config.helpers.js";
|
|
3
4
|
export class ZodSchemaGenerator {
|
|
4
5
|
ensureCorrectOptions(options) {
|
|
5
6
|
const { modelName } = options;
|
|
@@ -363,6 +364,174 @@ export default Query${modelName.pascal}Schema;${typeExport}
|
|
|
363
364
|
return "z.any()";
|
|
364
365
|
}
|
|
365
366
|
}
|
|
367
|
+
generateLoginSchema(_) {
|
|
368
|
+
const ext = getUserFileExtension();
|
|
369
|
+
const isTypeScript = ext === "ts";
|
|
370
|
+
const allowedUsernames = getArkosConfig()?.authentication?.login
|
|
371
|
+
?.allowedUsernames || ["username"];
|
|
372
|
+
const usernameFields = allowedUsernames.map((field) => {
|
|
373
|
+
const displayName = field.includes(".") ? field.split(".").pop() : field;
|
|
374
|
+
const zodType = displayName === "email" ? "z.string().email()" : "z.string().min(1)";
|
|
375
|
+
return ` ${displayName}: ${zodType}.optional()`;
|
|
376
|
+
});
|
|
377
|
+
const anyOfComment = allowedUsernames.length > 1
|
|
378
|
+
? `\n// At least one of: ${allowedUsernames.map((f) => (f.includes(".") ? f.split(".").pop() : f)).join(", ")} is required`
|
|
379
|
+
: "";
|
|
380
|
+
const typeExport = isTypeScript
|
|
381
|
+
? `\n\nexport type LoginSchemaType = z.infer<typeof LoginSchema>;`
|
|
382
|
+
: "";
|
|
383
|
+
return `import { z } from "zod";
|
|
384
|
+
${anyOfComment}
|
|
385
|
+
const LoginSchema = z.object({
|
|
386
|
+
${usernameFields.join(",\n")},
|
|
387
|
+
password: z.string().min(8)
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
export default LoginSchema;${typeExport}
|
|
391
|
+
`;
|
|
392
|
+
}
|
|
393
|
+
generateSignupSchema(_) {
|
|
394
|
+
const ext = getUserFileExtension();
|
|
395
|
+
const isTypeScript = ext === "ts";
|
|
396
|
+
const userModel = prismaSchemaParser.models.find((m) => m.name.toLowerCase() === "user");
|
|
397
|
+
if (!userModel)
|
|
398
|
+
throw new Error("User model not found in Prisma schema");
|
|
399
|
+
const restrictedFields = [
|
|
400
|
+
"id",
|
|
401
|
+
"createdAt",
|
|
402
|
+
"updatedAt",
|
|
403
|
+
"deletedAt",
|
|
404
|
+
"roles",
|
|
405
|
+
"role",
|
|
406
|
+
"isActive",
|
|
407
|
+
"isStaff",
|
|
408
|
+
"isSuperUser",
|
|
409
|
+
"passwordChangedAt",
|
|
410
|
+
"deletedSelfAccountAt",
|
|
411
|
+
"lastLoginAt",
|
|
412
|
+
];
|
|
413
|
+
const enumsUsed = new Set();
|
|
414
|
+
const schemaFields = [];
|
|
415
|
+
for (const field of userModel.fields) {
|
|
416
|
+
const isForeignKey = userModel.fields.some((f) => f.foreignKeyField === field.name);
|
|
417
|
+
if (field.isId || restrictedFields.includes(field.name) || isForeignKey)
|
|
418
|
+
continue;
|
|
419
|
+
if (field.isRelation) {
|
|
420
|
+
if (field.isArray)
|
|
421
|
+
continue;
|
|
422
|
+
const referencedModel = prismaSchemaParser.models.find((m) => m.name === field.type);
|
|
423
|
+
if (referencedModel) {
|
|
424
|
+
const refField = field.foreignReferenceField || "id";
|
|
425
|
+
const refFieldType = referencedModel.fields.find((f) => f.name === refField);
|
|
426
|
+
let zodType = this.mapPrismaTypeToZod(refFieldType?.type);
|
|
427
|
+
if (refFieldType?.type?.toLowerCase?.() === "string" ||
|
|
428
|
+
!refFieldType?.type)
|
|
429
|
+
zodType = zodType + ".min(1)";
|
|
430
|
+
const isOptional = field.isOptional || field.defaultValue !== undefined;
|
|
431
|
+
schemaFields.push(` ${field.name}: z.object({ ${refField}: ${zodType} })${isOptional ? ".optional()" : ""}`);
|
|
432
|
+
}
|
|
433
|
+
continue;
|
|
434
|
+
}
|
|
435
|
+
if (prismaSchemaParser.isEnum(field.type))
|
|
436
|
+
enumsUsed.add(field.type);
|
|
437
|
+
const zodSchema = field.name === "password"
|
|
438
|
+
? `z.string().min(8).regex(/[a-z]/, "Must contain lowercase").regex(/[A-Z]/, "Must contain uppercase").regex(/[0-9]/, "Must contain number")`
|
|
439
|
+
: this.generateZodField(field, true, false);
|
|
440
|
+
schemaFields.push(` ${field.name}: ${zodSchema}`);
|
|
441
|
+
}
|
|
442
|
+
const enumImports = enumsUsed.size > 0
|
|
443
|
+
? `import { ${Array.from(enumsUsed).join(", ")} } from "@prisma/client";\n`
|
|
444
|
+
: "";
|
|
445
|
+
const typeExport = isTypeScript
|
|
446
|
+
? `\n\nexport type SignupSchemaType = z.infer<typeof SignupSchema>;`
|
|
447
|
+
: "";
|
|
448
|
+
return `import { z } from "zod";
|
|
449
|
+
${enumImports}
|
|
450
|
+
const SignupSchema = z.object({
|
|
451
|
+
${schemaFields.join(",\n")}
|
|
452
|
+
});
|
|
453
|
+
|
|
454
|
+
export default SignupSchema;${typeExport}
|
|
455
|
+
`;
|
|
456
|
+
}
|
|
457
|
+
generateUpdateMeSchema(_) {
|
|
458
|
+
const ext = getUserFileExtension();
|
|
459
|
+
const isTypeScript = ext === "ts";
|
|
460
|
+
const userModel = prismaSchemaParser.models.find((m) => m.name.toLowerCase() === "user");
|
|
461
|
+
if (!userModel)
|
|
462
|
+
throw new Error("User model not found in Prisma schema");
|
|
463
|
+
const restrictedFields = [
|
|
464
|
+
"id",
|
|
465
|
+
"createdAt",
|
|
466
|
+
"updatedAt",
|
|
467
|
+
"deletedAt",
|
|
468
|
+
"roles",
|
|
469
|
+
"role",
|
|
470
|
+
"isActive",
|
|
471
|
+
"isStaff",
|
|
472
|
+
"isSuperUser",
|
|
473
|
+
"passwordChangedAt",
|
|
474
|
+
"deletedSelfAccountAt",
|
|
475
|
+
"lastLoginAt",
|
|
476
|
+
"password",
|
|
477
|
+
];
|
|
478
|
+
const enumsUsed = new Set();
|
|
479
|
+
const schemaFields = [];
|
|
480
|
+
for (const field of userModel.fields) {
|
|
481
|
+
const isForeignKey = userModel.fields.some((f) => f.foreignKeyField === field.name);
|
|
482
|
+
if (field.isId || restrictedFields.includes(field.name) || isForeignKey)
|
|
483
|
+
continue;
|
|
484
|
+
if (field.isRelation) {
|
|
485
|
+
if (field.isArray)
|
|
486
|
+
continue;
|
|
487
|
+
const referencedModel = prismaSchemaParser.models.find((m) => m.name === field.type);
|
|
488
|
+
if (referencedModel) {
|
|
489
|
+
const refField = field.foreignReferenceField || "id";
|
|
490
|
+
const refFieldType = referencedModel.fields.find((f) => f.name === refField);
|
|
491
|
+
let zodType = this.mapPrismaTypeToZod(refFieldType?.type);
|
|
492
|
+
if (refFieldType?.type?.toLowerCase?.() === "string" ||
|
|
493
|
+
!refFieldType?.type)
|
|
494
|
+
zodType = zodType + ".min(1)";
|
|
495
|
+
schemaFields.push(` ${field.name}: z.object({ ${refField}: ${zodType} }).optional()`);
|
|
496
|
+
}
|
|
497
|
+
continue;
|
|
498
|
+
}
|
|
499
|
+
if (prismaSchemaParser.isEnum(field.type))
|
|
500
|
+
enumsUsed.add(field.type);
|
|
501
|
+
const zodSchema = this.generateZodField(field, true, true);
|
|
502
|
+
schemaFields.push(` ${field.name}: ${zodSchema}`);
|
|
503
|
+
}
|
|
504
|
+
const enumImports = enumsUsed.size > 0
|
|
505
|
+
? `import { ${Array.from(enumsUsed).join(", ")} } from "@prisma/client";\n`
|
|
506
|
+
: "";
|
|
507
|
+
const typeExport = isTypeScript
|
|
508
|
+
? `\n\nexport type UpdateMeSchemaType = z.infer<typeof UpdateMeSchema>;`
|
|
509
|
+
: "";
|
|
510
|
+
return `import { z } from "zod";
|
|
511
|
+
${enumImports}
|
|
512
|
+
const UpdateMeSchema = z.object({
|
|
513
|
+
${schemaFields.join(",\n")}
|
|
514
|
+
});
|
|
515
|
+
|
|
516
|
+
export default UpdateMeSchema;${typeExport}
|
|
517
|
+
`;
|
|
518
|
+
}
|
|
519
|
+
generateUpdatePasswordSchema(_) {
|
|
520
|
+
const ext = getUserFileExtension();
|
|
521
|
+
const isTypeScript = ext === "ts";
|
|
522
|
+
const typeExport = isTypeScript
|
|
523
|
+
? `\n\nexport type UpdatePasswordSchemaType = z.infer<typeof UpdatePasswordSchema>;`
|
|
524
|
+
: "";
|
|
525
|
+
return `import { z } from "zod";
|
|
526
|
+
|
|
527
|
+
const UpdatePasswordSchema = z.object({
|
|
528
|
+
currentPassword: z.string().min(1),
|
|
529
|
+
newPassword: z.string().min(8).regex(/[a-z]/, "Must contain lowercase").regex(/[A-Z]/, "Must contain uppercase").regex(/[0-9]/, "Must contain number")
|
|
530
|
+
});
|
|
531
|
+
|
|
532
|
+
export default UpdatePasswordSchema;${typeExport}
|
|
533
|
+
`;
|
|
534
|
+
}
|
|
366
535
|
}
|
|
367
536
|
const zodSchemaGenerator = new ZodSchemaGenerator();
|
|
368
537
|
export default zodSchemaGenerator;
|