arkos 1.4.11-beta → 1.4.13-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.
Files changed (99) hide show
  1. package/dist/cjs/components/arkos-policy/index.js +38 -0
  2. package/dist/cjs/components/arkos-policy/index.js.map +1 -0
  3. package/dist/cjs/{types/arkos-prisma-input.bak.js → components/arkos-policy/types.js} +1 -1
  4. package/dist/cjs/components/arkos-policy/types.js.map +1 -0
  5. package/dist/cjs/exports/config.js +6 -0
  6. package/dist/cjs/exports/config.js.map +1 -0
  7. package/dist/cjs/modules/auth/auth.service.js +1 -1
  8. package/dist/cjs/modules/auth/auth.service.js.map +1 -1
  9. package/dist/cjs/modules/error-handler/error-handler.controller.js +1 -1
  10. package/dist/cjs/modules/error-handler/error-handler.controller.js.map +1 -1
  11. package/dist/cjs/modules/swagger/utils/get-open-api-login-html.js +288 -0
  12. package/dist/cjs/modules/swagger/utils/get-open-api-login-html.js.map +1 -0
  13. package/dist/cjs/types/arkos-config/utils.js +3 -0
  14. package/dist/cjs/types/arkos-config/utils.js.map +1 -0
  15. package/dist/cjs/types/arkos-prisma-input.js.map +1 -1
  16. package/dist/cjs/types/arkos.js +3 -0
  17. package/dist/cjs/types/arkos.js.map +1 -0
  18. package/dist/cjs/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js +152 -0
  19. package/dist/cjs/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js.map +1 -0
  20. package/dist/cjs/utils/cli/utils/cli.helpers.js +1 -1
  21. package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js +208 -0
  22. package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js.map +1 -1
  23. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-multiple-components.js +143 -39
  24. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-multiple-components.js.map +1 -1
  25. package/dist/cjs/utils/cli/utils/template-generator/templates/policy-template.js +51 -0
  26. package/dist/cjs/utils/cli/utils/template-generator/templates/policy-template.js.map +1 -0
  27. package/dist/cjs/utils/cli/utils/template-generator/templates/zod-schema-generator.js +169 -0
  28. package/dist/cjs/utils/cli/utils/template-generator/templates/zod-schema-generator.js.map +1 -1
  29. package/dist/cjs/utils/features/api.features.js +0 -3
  30. package/dist/cjs/utils/features/api.features.js.map +1 -1
  31. package/dist/cjs/utils/helpers/api.features.helpers.js +20 -0
  32. package/dist/cjs/utils/helpers/api.features.helpers.js.map +1 -1
  33. package/dist/cjs/utils/helpers/exit-error.js +12 -0
  34. package/dist/cjs/utils/helpers/exit-error.js.map +1 -0
  35. package/dist/cjs/utils/helpers/prisma.helpers.js +1 -2
  36. package/dist/cjs/utils/helpers/prisma.helpers.js.map +1 -1
  37. package/dist/cjs/utils/initialize-app.js +52 -0
  38. package/dist/cjs/utils/initialize-app.js.map +1 -0
  39. package/dist/cjs/utils/setup-app.js +119 -0
  40. package/dist/cjs/utils/setup-app.js.map +1 -0
  41. package/dist/esm/components/arkos-policy/index.js +32 -0
  42. package/dist/esm/components/arkos-policy/index.js.map +1 -0
  43. package/dist/esm/components/arkos-policy/types.js +2 -0
  44. package/dist/esm/components/arkos-policy/types.js.map +1 -0
  45. package/dist/esm/exports/config.js +3 -0
  46. package/dist/esm/exports/config.js.map +1 -0
  47. package/dist/esm/modules/auth/auth.service.js +1 -1
  48. package/dist/esm/modules/auth/auth.service.js.map +1 -1
  49. package/dist/esm/modules/error-handler/error-handler.controller.js +1 -1
  50. package/dist/esm/modules/error-handler/error-handler.controller.js.map +1 -1
  51. package/dist/esm/modules/swagger/utils/get-open-api-login-html.js +285 -0
  52. package/dist/esm/modules/swagger/utils/get-open-api-login-html.js.map +1 -0
  53. package/dist/esm/types/arkos-config/utils.js +2 -0
  54. package/dist/esm/types/arkos-config/utils.js.map +1 -0
  55. package/dist/esm/types/arkos-prisma-input.js.map +1 -1
  56. package/dist/esm/types/arkos.js +2 -0
  57. package/dist/esm/types/arkos.js.map +1 -0
  58. package/dist/esm/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js +146 -0
  59. package/dist/esm/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js.map +1 -0
  60. package/dist/esm/utils/cli/utils/cli.helpers.js +1 -1
  61. package/dist/esm/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js +208 -0
  62. package/dist/esm/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js.map +1 -1
  63. package/dist/esm/utils/cli/utils/template-generator/templates/generate-multiple-components.js +143 -39
  64. package/dist/esm/utils/cli/utils/template-generator/templates/generate-multiple-components.js.map +1 -1
  65. package/dist/esm/utils/cli/utils/template-generator/templates/policy-template.js +45 -0
  66. package/dist/esm/utils/cli/utils/template-generator/templates/policy-template.js.map +1 -0
  67. package/dist/esm/utils/cli/utils/template-generator/templates/zod-schema-generator.js +169 -0
  68. package/dist/esm/utils/cli/utils/template-generator/templates/zod-schema-generator.js.map +1 -1
  69. package/dist/esm/utils/features/api.features.js +0 -3
  70. package/dist/esm/utils/features/api.features.js.map +1 -1
  71. package/dist/esm/utils/helpers/api.features.helpers.js +20 -0
  72. package/dist/esm/utils/helpers/api.features.helpers.js.map +1 -1
  73. package/dist/esm/utils/helpers/exit-error.js +6 -0
  74. package/dist/esm/utils/helpers/exit-error.js.map +1 -0
  75. package/dist/esm/utils/helpers/prisma.helpers.js +1 -2
  76. package/dist/esm/utils/helpers/prisma.helpers.js.map +1 -1
  77. package/dist/esm/utils/initialize-app.js +45 -0
  78. package/dist/esm/utils/initialize-app.js.map +1 -0
  79. package/dist/esm/utils/setup-app.js +113 -0
  80. package/dist/esm/utils/setup-app.js.map +1 -0
  81. package/dist/types/components/arkos-policy/index.d.ts +31 -0
  82. package/dist/types/components/arkos-policy/types.d.ts +21 -0
  83. package/dist/types/exports/config.d.ts +2 -0
  84. package/dist/types/modules/swagger/utils/get-open-api-login-html.d.ts +1 -0
  85. package/dist/types/types/arkos-config/utils.d.ts +68 -0
  86. package/dist/types/types/arkos-prisma-input.d.ts +1 -1
  87. package/dist/types/types/arkos.d.ts +31 -0
  88. package/dist/types/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.d.ts +7 -0
  89. package/dist/types/utils/cli/utils/template-generator/templates/class-validator-dto-generator.d.ts +4 -0
  90. package/dist/types/utils/cli/utils/template-generator/templates/policy-template.d.ts +2 -0
  91. package/dist/types/utils/cli/utils/template-generator/templates/zod-schema-generator.d.ts +4 -0
  92. package/dist/types/utils/helpers/exit-error.d.ts +1 -0
  93. package/dist/types/utils/initialize-app.d.ts +3 -0
  94. package/dist/types/utils/setup-app.d.ts +2 -0
  95. package/package.json +55 -55
  96. package/dist/cjs/types/arkos-prisma-input.bak.js.map +0 -1
  97. package/dist/esm/types/arkos-prisma-input.bak.js +0 -2
  98. package/dist/esm/types/arkos-prisma-input.bak.js.map +0 -1
  99. package/dist/types/types/arkos-prisma-input.bak.d.ts +0 -237
@@ -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 moduleName = options.module || options.model;
6
- if (!moduleName)
7
- throw new Error("Module name is required. Use -m or --module flag.");
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
- const names = {
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 (!componentsToGenerate.includes(fullName)) {
92
- componentsToGenerate.push(fullName);
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 (componentsToGenerate.length === 0)
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 --components flag.\n" +
165
+ throw new Error("Please specify either --all or --names flag.\n" +
106
166
  "Examples:\n" +
107
- " arkos g module -m user --all\n" +
108
- " arkos g module -m user -c s,sc,m");
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
- let successCount = 0;
111
- let failCount = 0;
112
- for (const componentName of componentsToGenerate) {
113
- try {
114
- await componentMap[componentName]({
115
- ...options,
116
- module: moduleName,
117
- path: defaultPaths[componentName],
118
- shouldExit: false,
119
- shouldPrintError: false,
120
- isBulk: true,
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
- catch (error) {
125
- sheu.error(`Failed to generate ${componentName} because ${error?.message}`);
126
- failCount++;
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 ${moduleName.replaceAll("-", " ")}`);
131
- if (failCount > 0) {
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
@@ -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;