arkos 1.4.1-canary.1 → 1.4.1-canary.11
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/modules/auth/auth.service.js +1 -1
- package/dist/cjs/modules/auth/auth.service.js.map +1 -1
- package/dist/cjs/modules/auth/utils/services/auth-action.service.js +15 -9
- package/dist/cjs/modules/auth/utils/services/auth-action.service.js.map +1 -1
- package/dist/cjs/modules/base/base.middlewares.js +10 -2
- package/dist/cjs/modules/base/base.middlewares.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js +27 -9
- package/dist/cjs/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.js +28 -11
- package/dist/cjs/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/missing-json-schemas-generator.js +3 -0
- package/dist/cjs/modules/swagger/utils/helpers/missing-json-schemas-generator.js.map +1 -1
- package/dist/cjs/utils/arkos-router/index.js +19 -6
- package/dist/cjs/utils/arkos-router/index.js.map +1 -1
- package/dist/cjs/utils/cli/dev.js +1 -45
- package/dist/cjs/utils/cli/dev.js.map +1 -1
- package/dist/cjs/utils/cli/start.js +11 -8
- package/dist/cjs/utils/cli/start.js.map +1 -1
- package/dist/cjs/utils/cli/utils/cli.helpers.js +1 -1
- package/dist/cjs/utils/cli/utils/runtime-cli-commander.js +6 -6
- package/dist/cjs/utils/cli/utils/runtime-cli-commander.js.map +1 -1
- package/dist/cjs/utils/dotenv.helpers.js +6 -2
- package/dist/cjs/utils/dotenv.helpers.js.map +1 -1
- package/dist/cjs/utils/prisma/prisma-json-schema-generator.js +19 -4
- package/dist/cjs/utils/prisma/prisma-json-schema-generator.js.map +1 -1
- package/dist/cjs/utils/validate-dto.js +1 -5
- package/dist/cjs/utils/validate-dto.js.map +1 -1
- package/dist/cjs/utils/validate-schema.js +2 -7
- package/dist/cjs/utils/validate-schema.js.map +1 -1
- 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/auth/utils/services/auth-action.service.js +15 -9
- package/dist/esm/modules/auth/utils/services/auth-action.service.js.map +1 -1
- package/dist/esm/modules/base/base.middlewares.js +10 -2
- package/dist/esm/modules/base/base.middlewares.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js +27 -9
- package/dist/esm/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.js +28 -11
- package/dist/esm/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/missing-json-schemas-generator.js +3 -0
- package/dist/esm/modules/swagger/utils/helpers/missing-json-schemas-generator.js.map +1 -1
- package/dist/esm/utils/arkos-router/index.js +19 -6
- package/dist/esm/utils/arkos-router/index.js.map +1 -1
- package/dist/esm/utils/cli/dev.js +2 -46
- package/dist/esm/utils/cli/dev.js.map +1 -1
- package/dist/esm/utils/cli/start.js +11 -8
- package/dist/esm/utils/cli/start.js.map +1 -1
- package/dist/esm/utils/cli/utils/cli.helpers.js +1 -1
- package/dist/esm/utils/cli/utils/runtime-cli-commander.js +6 -6
- package/dist/esm/utils/cli/utils/runtime-cli-commander.js.map +1 -1
- package/dist/esm/utils/dotenv.helpers.js +6 -2
- package/dist/esm/utils/dotenv.helpers.js.map +1 -1
- package/dist/esm/utils/prisma/prisma-json-schema-generator.js +19 -4
- package/dist/esm/utils/prisma/prisma-json-schema-generator.js.map +1 -1
- package/dist/esm/utils/validate-dto.js +1 -2
- package/dist/esm/utils/validate-dto.js.map +1 -1
- package/dist/esm/utils/validate-schema.js +2 -4
- package/dist/esm/utils/validate-schema.js.map +1 -1
- package/dist/types/utils/arkos-router/index.d.ts +2 -1
- package/dist/types/utils/cli/dev.d.ts +1 -1
- package/dist/types/utils/cli/start.d.ts +1 -1
- package/package.json +2 -2
|
@@ -3,12 +3,11 @@ import fs from "fs";
|
|
|
3
3
|
import { spawn } from "child_process";
|
|
4
4
|
import { loadEnvironmentVariables } from "../dotenv.helpers.js";
|
|
5
5
|
import { fullCleanCwd } from "../helpers/fs.helpers.js";
|
|
6
|
-
import portAndHostAllocator from "../features/port-and-host-allocator.js";
|
|
7
6
|
import watermarkStamper from "./utils/watermark-stamper.js";
|
|
8
7
|
import sheu from "../sheu.js";
|
|
9
8
|
let child = null;
|
|
10
9
|
let envFiles;
|
|
11
|
-
export
|
|
10
|
+
export function startCommand(options = {}) {
|
|
12
11
|
if (!process.env.NODE_ENV)
|
|
13
12
|
process.env.NODE_ENV = "production";
|
|
14
13
|
process.env.ARKOS_BUILD = "true";
|
|
@@ -28,14 +27,18 @@ export async function startCommand(options = {}) {
|
|
|
28
27
|
ARKOS_BUILD: "true",
|
|
29
28
|
CLI: "false",
|
|
30
29
|
};
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
env.
|
|
30
|
+
env.__HOST =
|
|
31
|
+
env?.CLI_HOST ||
|
|
32
|
+
env?.HOST ||
|
|
33
|
+
(env.ARKOS_BUILD !== "true" ? "0.0.0.0" : "127.0.0.1");
|
|
34
|
+
env.__PORT =
|
|
35
|
+
env?.CLI_PORT ||
|
|
36
|
+
env?.PORT ||
|
|
37
|
+
"8000";
|
|
36
38
|
watermarkStamper.stamp({
|
|
37
39
|
envFiles,
|
|
38
|
-
|
|
40
|
+
port: env.__PORT,
|
|
41
|
+
host: env.__HOST,
|
|
39
42
|
});
|
|
40
43
|
child = spawn("node", [entryPoint], {
|
|
41
44
|
stdio: "inherit",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../../src/utils/cli/start.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAgB,KAAK,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../../src/utils/cli/start.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"path\";\nimport fs from \"fs\";\nimport { ChildProcess, spawn } from \"child_process\";\nimport { loadEnvironmentVariables } from \"../dotenv.helpers\";\nimport { fullCleanCwd } from \"../helpers/fs.helpers\";\nimport watermarkStamper from \"./utils/watermark-stamper\";\nimport sheu from \"../sheu\";\n\ninterface StartOptions {\n port?: string;\n host?: string;\n}\n\nlet child: ChildProcess | null = null;\nlet envFiles: string[] | undefined;\n\n/**\n * Production start command for the arkos CLI\n */\nexport function startCommand(options: StartOptions = {}) {\n if (!process.env.NODE_ENV) process.env.NODE_ENV = \"production\";\n process.env.ARKOS_BUILD = \"true\";\n\n envFiles = loadEnvironmentVariables();\n\n try {\n const { port, host } = options;\n\n const entryPoint = path.join(process.cwd(), \".build\", \"src\", \"app.js\");\n\n if (!fs.existsSync(path.join(entryPoint))) {\n sheu.error(\n `Could not find built application entry point at ${fullCleanCwd(entryPoint)}`\n );\n process.exit(1);\n }\n\n const env: { [x: string]: string } = {\n NODE_ENV: \"production\",\n ...process.env,\n ...(port && { CLI_PORT: port }),\n ...(host && { CLI_HOST: host }),\n ARKOS_BUILD: \"true\",\n CLI: \"false\",\n };\n\n env.__HOST =\n env?.CLI_HOST ||\n // config?.host ||\n env?.HOST ||\n (env.ARKOS_BUILD !== \"true\" ? \"0.0.0.0\" : \"127.0.0.1\");\n\n env.__PORT =\n env?.CLI_PORT ||\n // || config?.port\n env?.PORT ||\n \"8000\";\n\n watermarkStamper.stamp({\n envFiles,\n port: env.__PORT,\n host: env.__HOST,\n });\n\n child = spawn(\"node\", [entryPoint], {\n stdio: \"inherit\",\n env,\n shell: true,\n });\n\n process.on(\"SIGINT\", () => {\n if (child) child.kill();\n\n process.exit(0);\n });\n } catch (error) {\n sheu.error(\"Production server failed to start:\");\n console.error(error);\n process.exit(1);\n }\n}\n\n/**\n * Help function to help other processes to terminate the production server child process\n */\nexport function killProductionServerChildProcess() {\n (child as ChildProcess)?.kill?.();\n child = null;\n}\n"]}
|
|
@@ -21,7 +21,8 @@ class RuntimeCliCommander {
|
|
|
21
21
|
async exportAuthAction() {
|
|
22
22
|
const options = this.getOptions();
|
|
23
23
|
const authActions = authActionService.getAll();
|
|
24
|
-
const
|
|
24
|
+
const ext = getUserFileExtension();
|
|
25
|
+
const targetPath = path.join(process.cwd(), options.path || "", `auth-actions.${ext}`);
|
|
25
26
|
let finalAuthActions = authActions;
|
|
26
27
|
let isUpdate = false;
|
|
27
28
|
if (!options.overwrite) {
|
|
@@ -62,7 +63,7 @@ npx arkos export auth-action --overwrite
|
|
|
62
63
|
`);
|
|
63
64
|
}
|
|
64
65
|
}
|
|
65
|
-
finalAuthActions = authActions.map((newAction) => {
|
|
66
|
+
finalAuthActions = [...authActions, ...existingActions].map((newAction) => {
|
|
66
67
|
const existingAction = existingActions.find((existing) => existing.action === newAction.action &&
|
|
67
68
|
existing.resource === newAction.resource);
|
|
68
69
|
if (existingAction) {
|
|
@@ -76,10 +77,9 @@ npx arkos export auth-action --overwrite
|
|
|
76
77
|
});
|
|
77
78
|
isUpdate = true;
|
|
78
79
|
}
|
|
79
|
-
catch (error) {
|
|
80
|
-
}
|
|
80
|
+
catch (error) { }
|
|
81
81
|
}
|
|
82
|
-
const fileContent = `const authActions = ${JSON.stringify(finalAuthActions, null, 2)}${
|
|
82
|
+
const fileContent = `const authActions = ${JSON.stringify(finalAuthActions, null, 2)}${ext === "ts" ? " as const" : ""};
|
|
83
83
|
|
|
84
84
|
export default authActions;
|
|
85
85
|
`;
|
|
@@ -87,7 +87,7 @@ export default authActions;
|
|
|
87
87
|
await fs.writeFile(targetPath, fileContent, "utf-8");
|
|
88
88
|
console.info("");
|
|
89
89
|
if (isUpdate)
|
|
90
|
-
sheu.done(`Auth actions updated and exported successfully ${fullCleanCwd(targetPath)}`);
|
|
90
|
+
sheu.done(`Auth actions updated and exported successfully at ${fullCleanCwd(targetPath)}`);
|
|
91
91
|
else
|
|
92
92
|
sheu.done(`Auth actions exported successfully at ${fullCleanCwd(targetPath)}`);
|
|
93
93
|
this.end();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-cli-commander.js","sourceRoot":"","sources":["../../../../../src/utils/cli/utils/runtime-cli-commander.ts"],"names":[],"mappings":"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","sourcesContent":["import { authActionService } from \"../../../exports/services\";\nimport fs from \"fs/promises\";\nimport path from \"path\";\nimport sheu from \"../../sheu\";\nimport { fullCleanCwd, getUserFileExtension } from \"../../helpers/fs.helpers\";\nimport { importModule } from \"../../helpers/global.helpers\";\nimport deepmerge from \"../../helpers/deepmerge.helper\";\nimport { killDevelopmentServerChildProcess } from \"../dev\";\n\n/**\n * Runtime CLI Commander class for handling command-line interface commands\n * during runtime execution. Provides methods for executing various CLI commands\n * and managing their lifecycle.\n *\n * @class RuntimeCliCommander\n */\nclass RuntimeCliCommander {\n /**\n * Parses and returns CLI command options from environment variables\n *\n * @returns {Object} Parsed CLI command options object\n *\n * @example\n * // Returns { overwrite: true, path: './exports' }\n * getOptions();\n */\n getOptions(): { overwrite?: boolean; path: string } {\n return JSON.parse(process.env.CLI_COMMAND_OPTIONS || \"{}\");\n }\n\n /**\n * Terminates the development server child process and exits the current process\n *\n * @returns {void}\n */\n end(): void {\n killDevelopmentServerChildProcess();\n process.exit(1);\n }\n\n /**\n * Main command handler that routes to specific command implementations\n * based on the CLI_COMMAND environment variable\n *\n * @returns {Promise<void>}\n *\n * @example\n * // Handles EXPORT_AUTH_ACTION command\n * await handle();\n */\n async handle(): Promise<void> {\n const command = process.env.CLI_COMMAND;\n if (command === \"EXPORT_AUTH_ACTION\") await this.exportAuthAction();\n }\n\n /**\n * Exports authentication actions to a file, with options for merging with existing\n * actions and specifying output path\n *\n * @param {Object} [options] - Export configuration options\n * @param {boolean} [options.overwrite] - Whether to overwrite existing file (default: false)\n * @param {string} [options.path] - Custom output directory path\n * @returns {Promise<void>}\n *\n * @example\n * // Export with default options (merge if exists)\n * await exportAuthAction();\n *\n * @example\n * // Export with overwrite and custom path\n * await exportAuthAction({ overwrite: true, path: './custom-exports' });\n */\n async exportAuthAction(): Promise<void> {\n const options = this.getOptions() as { overwrite?: boolean; path?: string };\n const authActions = authActionService.getAll();\n\n const targetPath = path.join(\n process.cwd(),\n options.path || \"\",\n `auth-actions.${getUserFileExtension()}`\n );\n\n let finalAuthActions = authActions;\n let isUpdate = false;\n\n if (!options.overwrite) {\n try {\n const existingModule = await importModule(targetPath);\n const existingActions = existingModule.default || existingModule;\n\n const rolesChanges: string[] = [];\n\n for (const newAction of authActions) {\n const existingAction = existingActions.find(\n (existing: any) =>\n existing.action === newAction.action &&\n existing.resource === newAction.resource\n );\n\n if (existingAction) {\n const existingRoles = existingAction.roles\n ? [...existingAction.roles].sort()\n : [];\n const newRoles = newAction.roles ? [...newAction.roles].sort() : [];\n\n const rolesMatch =\n existingRoles.length === newRoles.length &&\n existingRoles.every((role, index) => role === newRoles[index]);\n\n if (!rolesMatch) {\n rolesChanges.push(\n ` - ${newAction.action}:${newAction.resource}: [${existingRoles.join(\", \")}] → [${newRoles.join(\", \")}]`\n );\n }\n }\n }\n\n if (rolesChanges.length > 0) {\n const warningMessage = `Roles for the following permissions will be updated:\\n${rolesChanges.join(\"\\n\")}`;\n\n sheu.warn(warningMessage);\n\n const answer = await new Promise<boolean>((resolve) => {\n process.stdout.write(\n `\\n${sheu.green(\"?\", { bold: true })} Do you want to proceed with updating these roles? (Y/n): `\n );\n process.stdin.once(\"data\", (data) => {\n const result = data.toString().trim().toLowerCase();\n process.stdin.pause();\n resolve(result === \"y\" || result.length === 0);\n });\n });\n\n if (!answer) {\n throw new Error(\n `Auth action export cancelled. Roles were not updated to preserve existing permissions., if you would like to overwrite existing auth actions run:\n\nnpx arkos export auth-action --overwrite\n`\n );\n }\n }\n\n finalAuthActions = authActions.map((newAction) => {\n const existingAction = existingActions.find(\n (existing: any) =>\n existing.action === newAction.action &&\n existing.resource === newAction.resource\n );\n\n if (existingAction) {\n return {\n ...newAction,\n ...existingAction,\n roles: newAction.roles,\n };\n }\n\n return newAction;\n });\n isUpdate = true;\n } catch (error) {\n // Handle error appropriately\n }\n }\n\n const fileContent = `const authActions = ${JSON.stringify(finalAuthActions, null, 2)}${getUserFileExtension() === \"ts\" ? \" as const\" : \"\"};\n\nexport default authActions;\n`;\n\n await fs.mkdir(path.dirname(targetPath), { recursive: true });\n await fs.writeFile(targetPath, fileContent, \"utf-8\");\n\n console.info(\"\");\n if (isUpdate)\n sheu.done(\n `Auth actions updated and exported successfully ${fullCleanCwd(targetPath)}`\n );\n else\n sheu.done(\n `Auth actions exported successfully at ${fullCleanCwd(targetPath)}`\n );\n\n this.end();\n }\n}\n\n/**\n * Singleton instance of RuntimeCliCommander\n *\n * @type {RuntimeCliCommander}\n */\nconst runtimeCliCommander: RuntimeCliCommander = new RuntimeCliCommander();\n\nexport default runtimeCliCommander;\n"]}
|
|
1
|
+
{"version":3,"file":"runtime-cli-commander.js","sourceRoot":"","sources":["../../../../../src/utils/cli/utils/runtime-cli-commander.ts"],"names":[],"mappings":"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","sourcesContent":["import { authActionService } from \"../../../exports/services\";\nimport fs from \"fs/promises\";\nimport path from \"path\";\nimport sheu from \"../../sheu\";\nimport { fullCleanCwd, getUserFileExtension } from \"../../helpers/fs.helpers\";\nimport { importModule } from \"../../helpers/global.helpers\";\nimport { killDevelopmentServerChildProcess } from \"../dev\";\n\n/**\n * Runtime CLI Commander class for handling command-line interface commands\n * during runtime execution. Provides methods for executing various CLI commands\n * and managing their lifecycle.\n *\n * @class RuntimeCliCommander\n */\nclass RuntimeCliCommander {\n /**\n * Parses and returns CLI command options from environment variables\n *\n * @returns {Object} Parsed CLI command options object\n *\n * @example\n * // Returns { overwrite: true, path: './exports' }\n * getOptions();\n */\n getOptions(): { overwrite?: boolean; path: string } {\n return JSON.parse(process.env.CLI_COMMAND_OPTIONS || \"{}\");\n }\n\n /**\n * Terminates the development server child process and exits the current process\n *\n * @returns {void}\n */\n end(): void {\n killDevelopmentServerChildProcess();\n process.exit(1);\n }\n\n /**\n * Main command handler that routes to specific command implementations\n * based on the CLI_COMMAND environment variable\n *\n * @returns {Promise<void>}\n *\n * @example\n * // Handles EXPORT_AUTH_ACTION command\n * await handle();\n */\n async handle(): Promise<void> {\n const command = process.env.CLI_COMMAND;\n if (command === \"EXPORT_AUTH_ACTION\") await this.exportAuthAction();\n }\n\n /**\n * Exports authentication actions to a file, with options for merging with existing\n * actions and specifying output path\n *\n * @param {Object} [options] - Export configuration options\n * @param {boolean} [options.overwrite] - Whether to overwrite existing file (default: false)\n * @param {string} [options.path] - Custom output directory path\n * @returns {Promise<void>}\n *\n * @example\n * // Export with default options (merge if exists)\n * await exportAuthAction();\n *\n * @example\n * // Export with overwrite and custom path\n * await exportAuthAction({ overwrite: true, path: './custom-exports' });\n */\n async exportAuthAction(): Promise<void> {\n const options = this.getOptions() as { overwrite?: boolean; path?: string };\n const authActions = authActionService.getAll();\n const ext = getUserFileExtension();\n\n const targetPath = path.join(\n process.cwd(),\n options.path || \"\",\n `auth-actions.${ext}`\n );\n\n let finalAuthActions = authActions;\n let isUpdate = false;\n\n if (!options.overwrite) {\n try {\n const existingModule = await importModule(targetPath);\n const existingActions = existingModule.default || existingModule;\n\n const rolesChanges: string[] = [];\n\n for (const newAction of authActions) {\n const existingAction = existingActions.find(\n (existing: any) =>\n existing.action === newAction.action &&\n existing.resource === newAction.resource\n );\n\n if (existingAction) {\n const existingRoles = existingAction.roles\n ? [...existingAction.roles].sort()\n : [];\n const newRoles = newAction.roles ? [...newAction.roles].sort() : [];\n\n const rolesMatch =\n existingRoles.length === newRoles.length &&\n existingRoles.every((role, index) => role === newRoles[index]);\n\n if (!rolesMatch) {\n rolesChanges.push(\n ` - ${newAction.action}:${newAction.resource}: [${existingRoles.join(\", \")}] → [${newRoles.join(\", \")}]`\n );\n }\n }\n }\n\n if (rolesChanges.length > 0) {\n const warningMessage = `Roles for the following permissions will be updated:\\n${rolesChanges.join(\"\\n\")}`;\n\n sheu.warn(warningMessage);\n\n const answer = await new Promise<boolean>((resolve) => {\n process.stdout.write(\n `\\n${sheu.green(\"?\", { bold: true })} Do you want to proceed with updating these roles? (Y/n): `\n );\n process.stdin.once(\"data\", (data) => {\n const result = data.toString().trim().toLowerCase();\n process.stdin.pause();\n resolve(result === \"y\" || result.length === 0);\n });\n });\n\n if (!answer) {\n throw new Error(\n `Auth action export cancelled. Roles were not updated to preserve existing permissions., if you would like to overwrite existing auth actions run:\n\nnpx arkos export auth-action --overwrite\n`\n );\n }\n }\n\n finalAuthActions = [...authActions, ...existingActions].map(\n (newAction) => {\n const existingAction = existingActions.find(\n (existing: any) =>\n existing.action === newAction.action &&\n existing.resource === newAction.resource\n );\n\n if (existingAction) {\n return {\n ...newAction,\n ...existingAction,\n roles: newAction.roles,\n };\n }\n\n return newAction;\n }\n );\n\n isUpdate = true;\n } catch (error) {}\n }\n\n const fileContent = `const authActions = ${JSON.stringify(finalAuthActions, null, 2)}${ext === \"ts\" ? \" as const\" : \"\"};\n\nexport default authActions;\n`;\n\n await fs.mkdir(path.dirname(targetPath), { recursive: true });\n await fs.writeFile(targetPath, fileContent, \"utf-8\");\n\n console.info(\"\");\n if (isUpdate)\n sheu.done(\n `Auth actions updated and exported successfully at ${fullCleanCwd(targetPath)}`\n );\n else\n sheu.done(\n `Auth actions exported successfully at ${fullCleanCwd(targetPath)}`\n );\n\n this.end();\n }\n}\n\n/**\n * Singleton instance of RuntimeCliCommander\n *\n * @type {RuntimeCliCommander}\n */\nconst runtimeCliCommander: RuntimeCliCommander = new RuntimeCliCommander();\n\nexport default runtimeCliCommander;\n"]}
|
|
@@ -9,8 +9,12 @@ export function loadEnvironmentVariables() {
|
|
|
9
9
|
const envFiles = [
|
|
10
10
|
path.resolve(cwd, ".env"),
|
|
11
11
|
path.resolve(cwd, ".env.local"),
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
...(ENV
|
|
13
|
+
? [
|
|
14
|
+
path.resolve(cwd, `.env.${ENV}`),
|
|
15
|
+
path.resolve(cwd, `.env.${ENV}.local`),
|
|
16
|
+
]
|
|
17
|
+
: []),
|
|
14
18
|
];
|
|
15
19
|
envFiles.forEach((filePath) => {
|
|
16
20
|
if (fs.existsSync(filePath)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dotenv.helpers.js","sourceRoot":"","sources":["../../../src/utils/dotenv.helpers.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,IAAI,MAAM,QAAQ,CAAC;AAW1B,MAAM,UAAU,wBAAwB;IACtC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;IACjC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,IAAI,UAAU,GAAa,EAAE,CAAC;IAE9B,MAAM,QAAQ,GAAG;QACf,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,GAAG,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"dotenv.helpers.js","sourceRoot":"","sources":["../../../src/utils/dotenv.helpers.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,IAAI,MAAM,QAAQ,CAAC;AAW1B,MAAM,UAAU,wBAAwB;IACtC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;IACjC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,IAAI,UAAU,GAAa,EAAE,CAAC;IAE9B,MAAM,QAAQ,GAAG;QACf,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC;QAC/B,GAAG,CAAC,GAAG;YACL,CAAC,CAAC;gBACE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,GAAG,EAAE,CAAC;gBAChC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,GAAG,QAAQ,CAAC;aACvC;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;IAEF,QAAQ,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC5B,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,MAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACnE,IAAI,CAAC,IAAI,CACP,sBAAsB,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,4BAA4B,CAC7F,CAAC;iBACC,CAAC;gBACJ,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;oBAC3B,IAAI,EAAE,QAAQ;oBACd,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,IAAI;iBACL,CAAC,CAAC;gBAEV,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;oBACjB,OAAO,CAAC,IAAI,CAAC,0BAA0B,QAAQ,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;gBACnE,CAAC;;oBAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,CAAC,cAAc,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAE5E,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CACX,yCAAyC,EACzC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CACvB,CAAC;QACF,MAAM,IAAI,KAAK,CACb,2CAA2C,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACpE,CAAC;IACJ,CAAC;IAED,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC,OAAO,EAAE,CAAC;AAC9C,CAAC","sourcesContent":["import path from \"path\";\nimport fs from \"fs\";\nimport dotenv from \"dotenv\";\nimport sheu from \"./sheu\";\n\n/**\n * Loads environment variables in a prioritized order\n * 1. Base defaults (.env.defaults) - lowest priority\n * 2. Environment-specific (.env.{NODE_ENV})\n * 3. Environment-specific local (.env.{NODE_ENV}.local)\n * 4. Local environment overrides (.env.local)\n * 5. Main .env file (.env)\n * 6. Process environment variables - highest priority (already loaded by Node)\n */\nexport function loadEnvironmentVariables() {\n const ENV = process.env.NODE_ENV;\n const cwd = process.cwd();\n let loadedEnvs: string[] = [];\n\n const envFiles = [\n path.resolve(cwd, \".env\"),\n path.resolve(cwd, \".env.local\"),\n ...(ENV\n ? [\n path.resolve(cwd, `.env.${ENV}`),\n path.resolve(cwd, `.env.${ENV}.local`),\n ]\n : []),\n ];\n\n envFiles.forEach((filePath) => {\n if (fs.existsSync(filePath)) {\n if (process.env.ARKOS_BUILD === \"true\" && filePath.endsWith(\".local\"))\n sheu.warn(\n `Skipping the local ${filePath.replace(cwd, \"\").replace(\"/\", \"\")} files in production build`\n );\n else {\n const result = dotenv.config({\n path: filePath,\n override: true,\n quiet: true,\n } as any);\n\n if (result.error) {\n console.warn(`Warning: Error loading ${filePath}`, result.error);\n } else loadedEnvs.push(filePath);\n }\n }\n });\n\n const requiredVars = [\"DATABASE_URL\"];\n const missingVars = requiredVars.filter((varName) => !process.env[varName]);\n\n if (missingVars.length > 0) {\n console.error(\n \"Missing required environment variables:\",\n missingVars.join(\", \")\n );\n throw new Error(\n `Missing required environment variables: ${missingVars.join(\", \")}`\n );\n }\n\n if (loadedEnvs) return loadedEnvs.reverse();\n}\n"]}
|
|
@@ -211,6 +211,9 @@ export class PrismaJsonSchemaGenerator {
|
|
|
211
211
|
const selectFields = options?.select;
|
|
212
212
|
const omittedFields = options?.omit;
|
|
213
213
|
const includeRelations = options?.include;
|
|
214
|
+
if (selectFields && includeRelations) {
|
|
215
|
+
throw new Error(`Found both 'select' and 'include' in ${model.name} query options. Please use one of them.`);
|
|
216
|
+
}
|
|
214
217
|
for (const field of model.fields) {
|
|
215
218
|
if (field.name === "password")
|
|
216
219
|
continue;
|
|
@@ -219,10 +222,14 @@ export class PrismaJsonSchemaGenerator {
|
|
|
219
222
|
if (selectFields && !selectFields[field.name])
|
|
220
223
|
continue;
|
|
221
224
|
if (this.isModelRelation(field.type)) {
|
|
222
|
-
if (includeRelations?.[field.name]
|
|
225
|
+
if (includeRelations?.[field.name] ||
|
|
226
|
+
selectFields?.[field.name] ||
|
|
227
|
+
omittedFields?.[field.name] === false) {
|
|
223
228
|
const relationModel = this.schema.models.find((m) => m.name === field.type);
|
|
224
229
|
if (relationModel) {
|
|
225
|
-
const relationSchema = this.generateNestedRelationSchema(relationModel, includeRelations[field.name]
|
|
230
|
+
const relationSchema = this.generateNestedRelationSchema(relationModel, includeRelations?.[field.name] ||
|
|
231
|
+
selectFields?.[field.name] ||
|
|
232
|
+
omittedFields?.[field.name]);
|
|
226
233
|
properties[field.name] = field.isArray
|
|
227
234
|
? { type: "array", items: relationSchema }
|
|
228
235
|
: relationSchema;
|
|
@@ -246,6 +253,10 @@ export class PrismaJsonSchemaGenerator {
|
|
|
246
253
|
const required = [];
|
|
247
254
|
const selectFields = includeOptions?.select;
|
|
248
255
|
const nestedIncludes = includeOptions?.include;
|
|
256
|
+
const ommittedFields = includeOptions?.omit;
|
|
257
|
+
if (selectFields && nestedIncludes) {
|
|
258
|
+
throw new Error(`Found both 'select' and 'include' in nested ${model.name} query options. Please use one of them.`);
|
|
259
|
+
}
|
|
249
260
|
for (const field of model.fields) {
|
|
250
261
|
if (field.name.toLowerCase().includes("password")) {
|
|
251
262
|
continue;
|
|
@@ -254,10 +265,14 @@ export class PrismaJsonSchemaGenerator {
|
|
|
254
265
|
continue;
|
|
255
266
|
}
|
|
256
267
|
if (this.isModelRelation(field.type)) {
|
|
257
|
-
if (nestedIncludes?.[field.name]
|
|
268
|
+
if (nestedIncludes?.[field.name] ||
|
|
269
|
+
selectFields?.[field.name] ||
|
|
270
|
+
ommittedFields?.[field.name] === false) {
|
|
258
271
|
const relationModel = this.schema.models.find((m) => m.name === field.type);
|
|
259
272
|
if (relationModel) {
|
|
260
|
-
const nestedSchema = this.generateNestedRelationSchema(relationModel, nestedIncludes[field.name]
|
|
273
|
+
const nestedSchema = this.generateNestedRelationSchema(relationModel, nestedIncludes?.[field.name] ||
|
|
274
|
+
selectFields?.[field.name] ||
|
|
275
|
+
ommittedFields?.[field.name]);
|
|
261
276
|
properties[field.name] = field.isArray
|
|
262
277
|
? { type: "array", items: nestedSchema }
|
|
263
278
|
: nestedSchema;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prisma-json-schema-generator.js","sourceRoot":"","sources":["../../../../src/utils/prisma/prisma-json-schema-generator.ts"],"names":[],"mappings":"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","sourcesContent":["import { ArkosConfig, RouterConfig } from \"../../exports\";\nimport { AuthPrismaQueryOptions, PrismaQueryOptions } from \"../../types\";\nimport deepmerge from \"../helpers/deepmerge.helper\";\nimport {\n getModuleComponents,\n ValidationFileMappingKey,\n} from \"../dynamic-loader\";\nimport prismaSchemaParser from \"./prisma-schema-parser\";\nimport {\n PrismaModel,\n PrismaField,\n JsonSchema,\n JsonSchemaProperty,\n} from \"./types\";\nimport { localValidatorFileExists } from \"../../modules/swagger/utils/helpers/swagger.router.helpers\";\n\nexport interface SchemaGenerationConfig {\n modelName: string;\n arkosConfig: ArkosConfig;\n schemasToGenerate?: ValidationFileMappingKey[];\n}\n\nexport interface GeneratedSchemas {\n [key: string]: JsonSchema;\n}\n\n/**\n * Enhanced JSON Schema generator that creates schemas based on Prisma models and query options\n */\nexport class PrismaJsonSchemaGenerator {\n schema = prismaSchemaParser.parse();\n\n /**\n * Main method to generate all schemas for a model\n */\n generateModelSchemas(config: SchemaGenerationConfig): GeneratedSchemas {\n const {\n modelName,\n arkosConfig,\n schemasToGenerate = [\n \"model\",\n \"login\",\n \"signup\",\n \"getMe\",\n \"updateMe\",\n \"updatePassword\",\n \"create\",\n \"createOne\",\n \"createMany\",\n \"update\",\n \"updateOne\",\n \"updateMany\",\n \"query\",\n \"findOne\",\n \"findMany\",\n ],\n } = config;\n\n const moduleComponents = getModuleComponents(modelName);\n const routerConfig = moduleComponents?.router?.config || {};\n const prismaQueryOptions = moduleComponents?.prismaQueryOptions || {};\n const authModuleModel = [\"auth\", \"me\", \"password\", \"signup\", \"login\"];\n const isAuthModule = authModuleModel.includes(modelName.toLowerCase());\n\n if (arkosConfig?.swagger?.strict && arkosConfig.swagger.mode !== \"prisma\")\n return {};\n\n if (routerConfig?.disable === true) return {};\n\n const model = this.schema.models.find(\n (m) => m.name.toLowerCase() === modelName.toLowerCase()\n );\n if (!model && !isAuthModule) return {};\n\n const schemas: { [key: string]: JsonSchema } = {};\n\n if (isAuthModule) {\n this.generateAuthSchemas(\n this.schema.models.find((m) => m.name.toLowerCase() === \"user\")!,\n schemas,\n arkosConfig,\n schemasToGenerate,\n prismaQueryOptions as AuthPrismaQueryOptions<any>\n );\n } else {\n if (model)\n this.generateCrudSchemas(\n model,\n schemas,\n arkosConfig,\n schemasToGenerate,\n prismaQueryOptions as PrismaQueryOptions<any>,\n routerConfig\n );\n }\n\n return { ...schemas };\n }\n\n /**\n * Generate auth-specific schemas\n */\n private generateAuthSchemas(\n model: PrismaModel,\n schemas: { [key: string]: JsonSchema },\n arkosConfig: ArkosConfig,\n schemasToGenerate: ValidationFileMappingKey[],\n queryOptions?: AuthPrismaQueryOptions<any>,\n routerConfig?: RouterConfig\n ) {\n const modelName = \"Auth\";\n\n // if no auth activated forget those json schemas\n if (!arkosConfig?.authentication) return schemas;\n\n // Login schema (input)\n if (\n schemasToGenerate.includes(\"login\") &&\n !this.isEndpointDisabled(\"login\", routerConfig) &&\n !localValidatorFileExists(\"login\", modelName, arkosConfig)\n ) {\n schemas[`LoginSchema`] = this.generateLoginSchema(arkosConfig);\n }\n\n // Signup schema (input)\n if (\n schemasToGenerate.includes(\"signup\") &&\n !this.isEndpointDisabled(\"signup\", routerConfig) &&\n !localValidatorFileExists(\"signup\", modelName, arkosConfig)\n ) {\n schemas[`SignupSchema`] = this.generateSignupSchema(\n model,\n queryOptions?.signup\n );\n }\n\n // UpdateMe schema (input)\n if (\n schemasToGenerate.includes(\"updateMe\") &&\n !this.isEndpointDisabled(\"updateMe\", routerConfig) &&\n !localValidatorFileExists(\"updateMe\", modelName, arkosConfig)\n ) {\n schemas[`UpdateMeSchema`] = this.generateUpdateMeSchema(\n model,\n queryOptions?.updateMe\n );\n }\n\n // UpdatePassword schema (input)\n if (\n schemasToGenerate.includes(\"updatePassword\") &&\n !this.isEndpointDisabled(\"updatePassword\", routerConfig) &&\n !localValidatorFileExists(\"updatePassword\", modelName, arkosConfig)\n ) {\n schemas[`UpdatePasswordSchema`] = this.generateUpdatePasswordSchema(\n model,\n queryOptions?.updatePassword\n );\n }\n\n if (\n schemasToGenerate.includes(\"getMe\") &&\n !this.isEndpointDisabled(\"getMe\", routerConfig) &&\n !localValidatorFileExists(\"getMe\", modelName, arkosConfig)\n ) {\n schemas[`GetMeSchema`] = this.generateResponseSchema(\n model,\n queryOptions?.getMe || {},\n \"findOne\"\n );\n }\n }\n\n /**\n * Generate standard CRUD schemas\n */\n private generateCrudSchemas(\n model: PrismaModel,\n schemas: { [key: string]: JsonSchema },\n arkosConfig: ArkosConfig,\n schemasToGenerate: ValidationFileMappingKey[],\n queryOptions?: PrismaQueryOptions<any>,\n routerConfig?: RouterConfig<any>\n ) {\n const modelName = model.name;\n\n const ensureBaseSchemaReference = (\n operation: string,\n modelName: string\n ) => {\n const suffix =\n arkosConfig.validation?.resolver === \"zod\" ? \"Schema\" : \"Dto\";\n\n const singleOpName = operation === \"Create\" ? \"createOne\" : \"updateOne\";\n const hasLocalValidator = localValidatorFileExists(\n singleOpName,\n modelName,\n arkosConfig\n );\n\n if (hasLocalValidator) return `${operation}${modelName}${suffix}`;\n else {\n const modelSchemaKey = `${operation}${modelName}ModelSchema`;\n\n if (!schemas[modelSchemaKey]) {\n if (operation === \"Create\") {\n schemas[modelSchemaKey] = this.generateCreateSchema(\n model,\n this.resolvePrismaQueryOptions(queryOptions, \"createOne\")\n );\n } else if (operation === \"Update\") {\n schemas[modelSchemaKey] = this.generateUpdateSchema(\n model,\n this.resolvePrismaQueryOptions(queryOptions, \"updateOne\")\n );\n }\n }\n\n return modelSchemaKey;\n }\n };\n\n if (\n schemasToGenerate.includes(\"createOne\") &&\n !this.isEndpointDisabled(\"createOne\", routerConfig) &&\n !localValidatorFileExists(\"createOne\", modelName, arkosConfig)\n ) {\n schemas[`Create${modelName}ModelSchema`] = this.generateCreateSchema(\n model,\n this.resolvePrismaQueryOptions(queryOptions, \"createOne\")\n );\n }\n\n if (\n schemasToGenerate.includes(\"createMany\") &&\n !this.isEndpointDisabled(\"createMany\", routerConfig) &&\n !localValidatorFileExists(\"createMany\", modelName, arkosConfig)\n ) {\n const baseSchemaKey = ensureBaseSchemaReference(\"Create\", modelName);\n schemas[`CreateMany${modelName}ModelSchema`] = {\n type: \"array\",\n items: { $ref: `#/components/schemas/${baseSchemaKey}` },\n };\n }\n\n if (\n schemasToGenerate.includes(\"updateOne\") &&\n !this.isEndpointDisabled(\"updateOne\", routerConfig) &&\n !localValidatorFileExists(\"updateOne\", modelName, arkosConfig)\n ) {\n schemas[`Update${modelName}ModelSchema`] = this.generateUpdateSchema(\n model,\n this.resolvePrismaQueryOptions(queryOptions, \"updateOne\")\n );\n }\n\n if (\n schemasToGenerate.includes(\"updateMany\") &&\n !this.isEndpointDisabled(\"updateMany\", routerConfig) &&\n !localValidatorFileExists(\"updateMany\", modelName, arkosConfig)\n ) {\n schemas[`UpdateMany${modelName}ModelSchema`] = this.generateUpdateSchema(\n model,\n this.resolvePrismaQueryOptions(queryOptions, \"updateOne\")\n );\n }\n if (\n schemasToGenerate.includes(\"findOne\") &&\n !this.isEndpointDisabled(\"findOne\", routerConfig) &&\n !localValidatorFileExists(\"findOne\", modelName, arkosConfig)\n ) {\n schemas[`FindOne${modelName}ModelSchema`] = this.generateResponseSchema(\n model,\n this.resolvePrismaQueryOptions(queryOptions, \"findOne\"),\n \"findOne\"\n );\n }\n\n if (\n schemasToGenerate.includes(\"findMany\") &&\n !this.isEndpointDisabled(\"findMany\", routerConfig) &&\n !localValidatorFileExists(\"findMany\", modelName, arkosConfig)\n ) {\n schemas[`FindMany${modelName}ModelSchema`] = {\n type: \"array\",\n items: this.generateResponseSchema(\n model,\n this.resolvePrismaQueryOptions(queryOptions, \"findMany\"),\n \"findMany\"\n ),\n };\n }\n }\n\n /**\n * Generate create schema (excludes ID, includes relation IDs only)\n */\n private generateCreateSchema(\n model: PrismaModel,\n _: Record<string, any>\n ): JsonSchema {\n const properties: { [key: string]: JsonSchemaProperty } = {};\n const required: string[] = [];\n const restrictedFields = [\"createdAt\", \"updatedAt\", \"deletedAt\", \"id\"];\n\n if (model.name.toLowerCase() === \"auth\")\n restrictedFields.push(\n \"roles\",\n \"role\",\n \"isActive\",\n \"isStaff\",\n \"isSuperUser\",\n \"passwordChangedAt\",\n \"deletedSelfAccountAt\",\n \"lastLoginAt\"\n );\n\n for (const field of model.fields) {\n const isForeignKey = model.fields.some(\n (_field) => _field.foreignKeyField === field.name\n );\n if (field.isId || restrictedFields.includes(field.name) || isForeignKey)\n continue;\n\n if (this.isModelRelation(field.type)) {\n if (!field.isArray) {\n const referencedModel = prismaSchemaParser.models.find(\n (_model) => _model.name === field.type\n )!;\n\n properties[field.name] = {\n type: \"object\",\n properties: {\n [field.foreignReferenceField || \"id\"]: {\n type: this.mapPrismaTypeToJsonSchema(\n referencedModel?.fields.find(\n (_field) => _field.name === field.foreignReferenceField\n )?.type || \"String\"\n ),\n },\n },\n };\n\n if (!field.isOptional && field.defaultValue === undefined)\n required.push(field.name);\n }\n continue;\n }\n\n const property = this.convertFieldToJsonSchema(field);\n properties[field.name] = property;\n\n // Field is required if not optional, no default, and not array\n if (\n !field.isOptional &&\n field.defaultValue === undefined &&\n !field.isArray\n ) {\n required.push(field.name);\n }\n }\n\n return {\n type: \"object\",\n properties,\n required,\n };\n }\n\n /**\n * Generate update schema (all fields optional, includes relation IDs only)\n */\n private generateUpdateSchema(\n model: PrismaModel,\n _: Record<string, any>\n ): JsonSchema {\n const properties: { [key: string]: JsonSchemaProperty } = {};\n const autoFillFields = [\"createdAt\", \"updatedAt\", \"deletedAt\", \"id\"];\n\n for (const field of model.fields) {\n const isForeignKey = model.fields.some(\n (_field) => _field.foreignKeyField === field.name\n );\n if (field.isId || autoFillFields.includes(field.name) || isForeignKey)\n continue;\n\n if (this.isModelRelation(field.type)) {\n if (!field.isArray) {\n const referencedModel = prismaSchemaParser.models.find(\n (_model) => _model.name === field.type\n )!;\n\n properties[field.name] = {\n type: \"object\",\n properties: {\n [field.foreignReferenceField || \"id\"]: {\n type: this.mapPrismaTypeToJsonSchema(\n referencedModel?.fields.find(\n (_field) => _field.name === field.foreignReferenceField\n )?.type || \"String\"\n ),\n },\n },\n };\n }\n\n continue;\n }\n\n const property = this.convertFieldToJsonSchema(field);\n properties[field.name] = property;\n }\n\n return {\n type: \"object\",\n properties,\n required: [], // All fields are optional in update\n };\n }\n\n /**\n * Generate response schema (includes nested relations based on query options)\n */\n private generateResponseSchema(\n model: PrismaModel,\n options: Record<string, any>,\n _: \"findOne\" | \"findMany\"\n ): JsonSchema {\n const properties: { [key: string]: JsonSchemaProperty } = {};\n const required: string[] = [];\n\n // Get select and include options\n const selectFields = options?.select;\n const omittedFields = options?.omit;\n const includeRelations = options?.include;\n\n for (const field of model.fields) {\n // Skip password fields\n if (field.name === \"password\") continue;\n\n // Skip ommited fields\n if (omittedFields && omittedFields[field.name]) continue;\n\n // If select is specified, only include selected fields\n if (selectFields && !selectFields[field.name]) continue;\n\n // Handle relations\n if (this.isModelRelation(field.type)) {\n // Include relation if specified in include option\n if (includeRelations?.[field.name]) {\n const relationModel = this.schema.models.find(\n (m) => m.name === field.type\n );\n\n if (relationModel) {\n const relationSchema = this.generateNestedRelationSchema(\n relationModel,\n includeRelations[field.name]\n );\n properties[field.name] = field.isArray\n ? { type: \"array\", items: relationSchema }\n : relationSchema;\n }\n }\n continue;\n }\n\n const property = this.convertFieldToJsonSchema(field);\n properties[field.name] = property;\n\n // Field is required if not optional (for response schemas, we include all by default)\n if (!field.isOptional) required.push(field.name);\n }\n\n return {\n type: \"object\",\n properties,\n required,\n };\n }\n\n /**\n * Generate nested relation schema\n */\n private generateNestedRelationSchema(\n model: PrismaModel,\n includeOptions: any\n ): JsonSchemaProperty {\n const properties: { [key: string]: JsonSchemaProperty } = {};\n const required: string[] = [];\n\n // Handle nested select\n const selectFields = includeOptions?.select;\n const nestedIncludes = includeOptions?.include;\n\n for (const field of model.fields) {\n // Skip password fields\n if (field.name.toLowerCase().includes(\"password\")) {\n continue;\n }\n\n if (selectFields && !selectFields[field.name]) {\n continue;\n }\n\n if (this.isModelRelation(field.type)) {\n if (nestedIncludes?.[field.name]) {\n const relationModel = this.schema.models.find(\n (m) => m.name === field.type\n );\n if (relationModel) {\n const nestedSchema = this.generateNestedRelationSchema(\n relationModel,\n nestedIncludes[field.name]\n );\n properties[field.name] = field.isArray\n ? { type: \"array\", items: nestedSchema }\n : nestedSchema;\n }\n }\n continue;\n }\n\n const property = this.convertFieldToJsonSchema(field);\n properties[field.name] = property;\n\n if (!field.isOptional) {\n required.push(field.name);\n }\n }\n\n return {\n type: \"object\",\n properties,\n required,\n };\n }\n\n /**\n * Auth-specific schema generators\n */\n private generateLoginSchema(arkosConfig?: ArkosConfig): JsonSchema {\n const userNameFields =\n arkosConfig?.authentication?.login?.allowedUsernames || [];\n\n // Helper function to get display name for nested fields\n const getDisplayName = (field: string) => {\n if (field.includes(\".\")) return field.split(\".\").pop() || field; // Get the part after the last dot\n return field;\n };\n\n // Base schema with password (always required)\n const baseSchema: JsonSchemaProperty = {\n type: \"object\",\n properties: {\n password: {\n type: \"string\",\n minLength: 8,\n },\n },\n required: [\"password\"],\n };\n\n // Add all username fields to properties\n userNameFields.forEach((field) => {\n const displayName = getDisplayName(field);\n baseSchema.properties![displayName] = {\n type: \"string\",\n format: \"string\",\n description: `Username field: ${field}`, // Optional: show original field path\n };\n });\n\n // At least one username field must be provided along with password\n if (userNameFields.length > 0) {\n const usernameDisplayNames = userNameFields.map(getDisplayName);\n\n return {\n ...baseSchema,\n anyOf: usernameDisplayNames.map(() => ({\n required: [...baseSchema.required!],\n })),\n };\n }\n\n return baseSchema;\n }\n private generateSignupSchema(\n model: PrismaModel,\n options?: Record<string, any>\n ): JsonSchema {\n // Similar to create but might have specific required fields\n const singupSchema = this.generateCreateSchema(model, options || {});\n\n const restrictedFields = [\n \"roles\",\n \"role\",\n \"isActive\",\n \"isStaff\",\n \"isSuperUser\",\n \"passwordChangedAt\",\n \"deletedSelfAccountAt\",\n \"lastLoginAt\",\n ];\n restrictedFields.forEach((field) => {\n delete singupSchema?.properties?.[field];\n });\n\n return singupSchema;\n }\n\n private generateUpdateMeSchema(\n model: PrismaModel,\n options?: Record<string, any>\n ): JsonSchema {\n // Similar to update but might exclude certain fields like role, etc.\n const updateSchema = this.generateUpdateSchema(model, options || {});\n\n // Remove sensitive fields that users shouldn't update themselves\n const restrictedFields = [\n \"roles\",\n \"role\",\n \"isActive\",\n \"isStaff\",\n \"isSuperUser\",\n \"passwordChangedAt\",\n \"deletedSelfAccountAt\",\n \"password\",\n \"lastLoginAt\",\n ];\n restrictedFields.forEach((field) => {\n delete updateSchema?.properties?.[field];\n });\n\n return updateSchema;\n }\n\n private generateUpdatePasswordSchema(\n _: PrismaModel,\n _1?: Record<string, any>\n ): JsonSchema {\n return {\n type: \"object\",\n properties: {\n currentPassword: { type: \"string\" },\n newPassword: { type: \"string\", minLength: 8 },\n },\n required: [\"currentPassword\", \"newPassword\"],\n };\n }\n\n /**\n * Utility methods\n */\n private resolvePrismaQueryOptions(\n prismaQueryOptions?: PrismaQueryOptions<any> | AuthPrismaQueryOptions<any>,\n action?: ValidationFileMappingKey\n ): Record<string, any> {\n if (!prismaQueryOptions || !action) {\n return {};\n }\n\n const options = prismaQueryOptions as any;\n const actionOptions = options[action] || {};\n\n // Start with deprecated queryOptions (for backward compatibility)\n let mergedOptions = options.queryOptions || {};\n\n // Apply global options (replaces queryOptions)\n if (options.global)\n mergedOptions = deepmerge(mergedOptions, options.global);\n\n // Apply general operation options based on action type\n const generalOptions = this.getGeneralOptionsForAction(options, action);\n if (generalOptions)\n mergedOptions = deepmerge(mergedOptions, generalOptions);\n\n // Finally apply specific action options (highest priority)\n if (actionOptions) mergedOptions = deepmerge(mergedOptions, actionOptions);\n\n return mergedOptions;\n }\n\n /**\n * Helps in remmaping those prisma query options that combines many operations for example find, save...\n */\n private getGeneralOptionsForAction(\n options: any,\n action: ValidationFileMappingKey\n ): Record<string, any> | null {\n const actionMap: { [key: string]: string[] } = {\n find: [\"findOne\", \"findMany\"],\n create: [\"createOne\", \"createMany\"],\n update: [\"updateOne\", \"updateMany\"],\n delete: [\"deleteOne\", \"deleteMany\"],\n save: [\"createOne\", \"createMany\", \"updateOne\", \"updateMany\"],\n saveOne: [\"createOne\", \"updateOne\"],\n saveMany: [\"createMany\", \"updateMany\"],\n };\n\n for (const [optionKey, actions] of Object.entries(actionMap)) {\n if (actions.includes(action) && options[optionKey]) {\n return options[optionKey];\n }\n }\n\n return null;\n }\n\n private isEndpointDisabled(\n endpoint: string,\n routerConfig?: RouterConfig<any>\n ): boolean {\n if (!routerConfig?.disable) return false;\n\n if (typeof routerConfig.disable === \"boolean\") {\n return routerConfig.disable;\n }\n\n return (\n routerConfig.disable[endpoint as keyof typeof routerConfig.disable] ||\n false\n );\n }\n\n private isModelRelation(typeName: string): boolean {\n return this.schema.models.some((m) => m.name === typeName);\n }\n\n private convertFieldToJsonSchema(field: PrismaField): JsonSchemaProperty {\n // Reuse the existing method from the original generator\n const baseType = this.mapPrismaTypeToJsonSchema(field.type);\n const property: JsonSchemaProperty = { type: baseType };\n\n if (field.isArray) {\n property.type = \"array\";\n property.items = { type: this.mapPrismaTypeToJsonSchema(field.type) };\n }\n\n if (field.defaultValue !== undefined) {\n property.default = field.defaultValue;\n }\n\n if (field.type === \"DateTime\") {\n property.format = \"date-time\";\n }\n\n if (this.isEnum(field.type)) {\n const enumDef = this.schema.enums.find((e) => e.name === field.type);\n if (enumDef) {\n property.enum = enumDef.values;\n }\n }\n\n return property;\n }\n\n private mapPrismaTypeToJsonSchema(prismaType: string): string {\n const typeMap: { [key: string]: string } = {\n String: \"string\",\n Int: \"number\",\n Float: \"number\",\n Boolean: \"boolean\",\n DateTime: \"string\",\n Json: \"object\",\n Bytes: \"string\",\n };\n\n if (typeMap[prismaType]) return typeMap[prismaType];\n\n if (this.isEnum(prismaType)) return \"string\";\n\n if (this.isModelRelation(prismaType)) return \"object\";\n\n return \"string\";\n }\n\n private isEnum(typeName: string): boolean {\n return this.schema.enums.some((e) => e.name === typeName);\n }\n}\n\nconst prismaJsonSchemaGenerator = new PrismaJsonSchemaGenerator();\n\nexport default prismaJsonSchemaGenerator;\n"]}
|
|
1
|
+
{"version":3,"file":"prisma-json-schema-generator.js","sourceRoot":"","sources":["../../../../src/utils/prisma/prisma-json-schema-generator.ts"],"names":[],"mappings":"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","sourcesContent":["import { ArkosConfig, RouterConfig } from \"../../exports\";\nimport { AuthPrismaQueryOptions, PrismaQueryOptions } from \"../../types\";\nimport deepmerge from \"../helpers/deepmerge.helper\";\nimport {\n getModuleComponents,\n ValidationFileMappingKey,\n} from \"../dynamic-loader\";\nimport prismaSchemaParser from \"./prisma-schema-parser\";\nimport {\n PrismaModel,\n PrismaField,\n JsonSchema,\n JsonSchemaProperty,\n} from \"./types\";\nimport { localValidatorFileExists } from \"../../modules/swagger/utils/helpers/swagger.router.helpers\";\n\nexport interface SchemaGenerationConfig {\n modelName: string;\n arkosConfig: ArkosConfig;\n schemasToGenerate?: ValidationFileMappingKey[];\n}\n\nexport interface GeneratedSchemas {\n [key: string]: JsonSchema;\n}\n\n/**\n * Enhanced JSON Schema generator that creates schemas based on Prisma models and query options\n */\nexport class PrismaJsonSchemaGenerator {\n schema = prismaSchemaParser.parse();\n\n /**\n * Main method to generate all schemas for a model\n */\n generateModelSchemas(config: SchemaGenerationConfig): GeneratedSchemas {\n const {\n modelName,\n arkosConfig,\n schemasToGenerate = [\n \"model\",\n \"login\",\n \"signup\",\n \"getMe\",\n \"updateMe\",\n \"updatePassword\",\n \"create\",\n \"createOne\",\n \"createMany\",\n \"update\",\n \"updateOne\",\n \"updateMany\",\n \"query\",\n \"findOne\",\n \"findMany\",\n ],\n } = config;\n\n const moduleComponents = getModuleComponents(modelName);\n const routerConfig = moduleComponents?.router?.config || {};\n const prismaQueryOptions = moduleComponents?.prismaQueryOptions || {};\n const authModuleModel = [\"auth\", \"me\", \"password\", \"signup\", \"login\"];\n const isAuthModule = authModuleModel.includes(modelName.toLowerCase());\n\n if (arkosConfig?.swagger?.strict && arkosConfig.swagger.mode !== \"prisma\")\n return {};\n\n if (routerConfig?.disable === true) return {};\n\n const model = this.schema.models.find(\n (m) => m.name.toLowerCase() === modelName.toLowerCase()\n );\n if (!model && !isAuthModule) return {};\n\n const schemas: { [key: string]: JsonSchema } = {};\n\n if (isAuthModule) {\n this.generateAuthSchemas(\n this.schema.models.find((m) => m.name.toLowerCase() === \"user\")!,\n schemas,\n arkosConfig,\n schemasToGenerate,\n prismaQueryOptions as AuthPrismaQueryOptions<any>\n );\n } else {\n if (model)\n this.generateCrudSchemas(\n model,\n schemas,\n arkosConfig,\n schemasToGenerate,\n prismaQueryOptions as PrismaQueryOptions<any>,\n routerConfig\n );\n }\n\n return { ...schemas };\n }\n\n /**\n * Generate auth-specific schemas\n */\n private generateAuthSchemas(\n model: PrismaModel,\n schemas: { [key: string]: JsonSchema },\n arkosConfig: ArkosConfig,\n schemasToGenerate: ValidationFileMappingKey[],\n queryOptions?: AuthPrismaQueryOptions<any>,\n routerConfig?: RouterConfig\n ) {\n const modelName = \"Auth\";\n\n // if no auth activated forget those json schemas\n if (!arkosConfig?.authentication) return schemas;\n\n // Login schema (input)\n if (\n schemasToGenerate.includes(\"login\") &&\n !this.isEndpointDisabled(\"login\", routerConfig) &&\n !localValidatorFileExists(\"login\", modelName, arkosConfig)\n ) {\n schemas[`LoginSchema`] = this.generateLoginSchema(arkosConfig);\n }\n\n // Signup schema (input)\n if (\n schemasToGenerate.includes(\"signup\") &&\n !this.isEndpointDisabled(\"signup\", routerConfig) &&\n !localValidatorFileExists(\"signup\", modelName, arkosConfig)\n ) {\n schemas[`SignupSchema`] = this.generateSignupSchema(\n model,\n queryOptions?.signup\n );\n }\n\n // UpdateMe schema (input)\n if (\n schemasToGenerate.includes(\"updateMe\") &&\n !this.isEndpointDisabled(\"updateMe\", routerConfig) &&\n !localValidatorFileExists(\"updateMe\", modelName, arkosConfig)\n ) {\n schemas[`UpdateMeSchema`] = this.generateUpdateMeSchema(\n model,\n queryOptions?.updateMe\n );\n }\n\n // UpdatePassword schema (input)\n if (\n schemasToGenerate.includes(\"updatePassword\") &&\n !this.isEndpointDisabled(\"updatePassword\", routerConfig) &&\n !localValidatorFileExists(\"updatePassword\", modelName, arkosConfig)\n ) {\n schemas[`UpdatePasswordSchema`] = this.generateUpdatePasswordSchema(\n model,\n queryOptions?.updatePassword\n );\n }\n\n if (\n schemasToGenerate.includes(\"getMe\") &&\n !this.isEndpointDisabled(\"getMe\", routerConfig) &&\n !localValidatorFileExists(\"getMe\", modelName, arkosConfig)\n ) {\n schemas[`GetMeSchema`] = this.generateResponseSchema(\n model,\n queryOptions?.getMe || {},\n \"findOne\"\n );\n }\n }\n\n /**\n * Generate standard CRUD schemas\n */\n private generateCrudSchemas(\n model: PrismaModel,\n schemas: { [key: string]: JsonSchema },\n arkosConfig: ArkosConfig,\n schemasToGenerate: ValidationFileMappingKey[],\n queryOptions?: PrismaQueryOptions<any>,\n routerConfig?: RouterConfig<any>\n ) {\n const modelName = model.name;\n\n const ensureBaseSchemaReference = (\n operation: string,\n modelName: string\n ) => {\n const suffix =\n arkosConfig.validation?.resolver === \"zod\" ? \"Schema\" : \"Dto\";\n\n const singleOpName = operation === \"Create\" ? \"createOne\" : \"updateOne\";\n const hasLocalValidator = localValidatorFileExists(\n singleOpName,\n modelName,\n arkosConfig\n );\n\n if (hasLocalValidator) return `${operation}${modelName}${suffix}`;\n else {\n const modelSchemaKey = `${operation}${modelName}ModelSchema`;\n\n if (!schemas[modelSchemaKey]) {\n if (operation === \"Create\") {\n schemas[modelSchemaKey] = this.generateCreateSchema(\n model,\n this.resolvePrismaQueryOptions(queryOptions, \"createOne\")\n );\n } else if (operation === \"Update\") {\n schemas[modelSchemaKey] = this.generateUpdateSchema(\n model,\n this.resolvePrismaQueryOptions(queryOptions, \"updateOne\")\n );\n }\n }\n\n return modelSchemaKey;\n }\n };\n\n if (\n schemasToGenerate.includes(\"createOne\") &&\n !this.isEndpointDisabled(\"createOne\", routerConfig) &&\n !localValidatorFileExists(\"createOne\", modelName, arkosConfig)\n ) {\n schemas[`Create${modelName}ModelSchema`] = this.generateCreateSchema(\n model,\n this.resolvePrismaQueryOptions(queryOptions, \"createOne\")\n );\n }\n\n if (\n schemasToGenerate.includes(\"createMany\") &&\n !this.isEndpointDisabled(\"createMany\", routerConfig) &&\n !localValidatorFileExists(\"createMany\", modelName, arkosConfig)\n ) {\n const baseSchemaKey = ensureBaseSchemaReference(\"Create\", modelName);\n schemas[`CreateMany${modelName}ModelSchema`] = {\n type: \"array\",\n items: { $ref: `#/components/schemas/${baseSchemaKey}` },\n };\n }\n\n if (\n schemasToGenerate.includes(\"updateOne\") &&\n !this.isEndpointDisabled(\"updateOne\", routerConfig) &&\n !localValidatorFileExists(\"updateOne\", modelName, arkosConfig)\n ) {\n schemas[`Update${modelName}ModelSchema`] = this.generateUpdateSchema(\n model,\n this.resolvePrismaQueryOptions(queryOptions, \"updateOne\")\n );\n }\n\n if (\n schemasToGenerate.includes(\"updateMany\") &&\n !this.isEndpointDisabled(\"updateMany\", routerConfig) &&\n !localValidatorFileExists(\"updateMany\", modelName, arkosConfig)\n ) {\n schemas[`UpdateMany${modelName}ModelSchema`] = this.generateUpdateSchema(\n model,\n this.resolvePrismaQueryOptions(queryOptions, \"updateOne\")\n );\n }\n if (\n schemasToGenerate.includes(\"findOne\") &&\n !this.isEndpointDisabled(\"findOne\", routerConfig) &&\n !localValidatorFileExists(\"findOne\", modelName, arkosConfig)\n ) {\n schemas[`FindOne${modelName}ModelSchema`] = this.generateResponseSchema(\n model,\n this.resolvePrismaQueryOptions(queryOptions, \"findOne\"),\n \"findOne\"\n );\n }\n\n if (\n schemasToGenerate.includes(\"findMany\") &&\n !this.isEndpointDisabled(\"findMany\", routerConfig) &&\n !localValidatorFileExists(\"findMany\", modelName, arkosConfig)\n ) {\n schemas[`FindMany${modelName}ModelSchema`] = {\n type: \"array\",\n items: this.generateResponseSchema(\n model,\n this.resolvePrismaQueryOptions(queryOptions, \"findMany\"),\n \"findMany\"\n ),\n };\n }\n }\n\n /**\n * Generate create schema (excludes ID, includes relation IDs only)\n */\n private generateCreateSchema(\n model: PrismaModel,\n _: Record<string, any>\n ): JsonSchema {\n const properties: { [key: string]: JsonSchemaProperty } = {};\n const required: string[] = [];\n const restrictedFields = [\"createdAt\", \"updatedAt\", \"deletedAt\", \"id\"];\n\n if (model.name.toLowerCase() === \"auth\")\n restrictedFields.push(\n \"roles\",\n \"role\",\n \"isActive\",\n \"isStaff\",\n \"isSuperUser\",\n \"passwordChangedAt\",\n \"deletedSelfAccountAt\",\n \"lastLoginAt\"\n );\n\n for (const field of model.fields) {\n const isForeignKey = model.fields.some(\n (_field) => _field.foreignKeyField === field.name\n );\n if (field.isId || restrictedFields.includes(field.name) || isForeignKey)\n continue;\n\n if (this.isModelRelation(field.type)) {\n if (!field.isArray) {\n const referencedModel = prismaSchemaParser.models.find(\n (_model) => _model.name === field.type\n )!;\n\n properties[field.name] = {\n type: \"object\",\n properties: {\n [field.foreignReferenceField || \"id\"]: {\n type: this.mapPrismaTypeToJsonSchema(\n referencedModel?.fields.find(\n (_field) => _field.name === field.foreignReferenceField\n )?.type || \"String\"\n ),\n },\n },\n };\n\n if (!field.isOptional && field.defaultValue === undefined)\n required.push(field.name);\n }\n continue;\n }\n\n const property = this.convertFieldToJsonSchema(field);\n properties[field.name] = property;\n\n // Field is required if not optional, no default, and not array\n if (\n !field.isOptional &&\n field.defaultValue === undefined &&\n !field.isArray\n ) {\n required.push(field.name);\n }\n }\n\n return {\n type: \"object\",\n properties,\n required,\n };\n }\n\n /**\n * Generate update schema (all fields optional, includes relation IDs only)\n */\n private generateUpdateSchema(\n model: PrismaModel,\n _: Record<string, any>\n ): JsonSchema {\n const properties: { [key: string]: JsonSchemaProperty } = {};\n const autoFillFields = [\"createdAt\", \"updatedAt\", \"deletedAt\", \"id\"];\n\n for (const field of model.fields) {\n const isForeignKey = model.fields.some(\n (_field) => _field.foreignKeyField === field.name\n );\n if (field.isId || autoFillFields.includes(field.name) || isForeignKey)\n continue;\n\n if (this.isModelRelation(field.type)) {\n if (!field.isArray) {\n const referencedModel = prismaSchemaParser.models.find(\n (_model) => _model.name === field.type\n )!;\n\n properties[field.name] = {\n type: \"object\",\n properties: {\n [field.foreignReferenceField || \"id\"]: {\n type: this.mapPrismaTypeToJsonSchema(\n referencedModel?.fields.find(\n (_field) => _field.name === field.foreignReferenceField\n )?.type || \"String\"\n ),\n },\n },\n };\n }\n\n continue;\n }\n\n const property = this.convertFieldToJsonSchema(field);\n properties[field.name] = property;\n }\n\n return {\n type: \"object\",\n properties,\n required: [], // All fields are optional in update\n };\n }\n\n /**\n * Generate response schema (includes nested relations based on query options)\n */\n private generateResponseSchema(\n model: PrismaModel,\n options: Record<string, any>,\n _: \"findOne\" | \"findMany\"\n ): JsonSchema {\n const properties: { [key: string]: JsonSchemaProperty } = {};\n const required: string[] = [];\n\n // Get select and include options\n const selectFields = options?.select;\n const omittedFields = options?.omit;\n const includeRelations = options?.include;\n\n if (selectFields && includeRelations) {\n throw new Error(\n `Found both 'select' and 'include' in ${model.name} query options. Please use one of them.`\n );\n }\n\n for (const field of model.fields) {\n // Skip password fields\n if (field.name === \"password\") continue;\n\n // Skip ommited fields\n if (omittedFields && omittedFields[field.name]) continue;\n\n // If select is specified, only include selected fields\n if (selectFields && !selectFields[field.name]) continue;\n\n // Handle relations\n if (this.isModelRelation(field.type)) {\n // Include relation if specified in include option\n if (\n includeRelations?.[field.name] ||\n selectFields?.[field.name] ||\n omittedFields?.[field.name] === false\n ) {\n const relationModel = this.schema.models.find(\n (m) => m.name === field.type\n );\n\n if (relationModel) {\n const relationSchema = this.generateNestedRelationSchema(\n relationModel,\n includeRelations?.[field.name] ||\n selectFields?.[field.name] ||\n omittedFields?.[field.name]\n );\n properties[field.name] = field.isArray\n ? { type: \"array\", items: relationSchema }\n : relationSchema;\n }\n }\n continue;\n }\n\n const property = this.convertFieldToJsonSchema(field);\n properties[field.name] = property;\n\n // Field is required if not optional (for response schemas, we include all by default)\n if (!field.isOptional) required.push(field.name);\n }\n\n return {\n type: \"object\",\n properties,\n required,\n };\n }\n\n /**\n * Generate nested relation schema\n */\n private generateNestedRelationSchema(\n model: PrismaModel,\n includeOptions: any\n ): JsonSchemaProperty {\n const properties: { [key: string]: JsonSchemaProperty } = {};\n const required: string[] = [];\n\n // Handle nested select\n const selectFields = includeOptions?.select;\n const nestedIncludes = includeOptions?.include;\n const ommittedFields = includeOptions?.omit;\n\n if (selectFields && nestedIncludes) {\n throw new Error(\n `Found both 'select' and 'include' in nested ${model.name} query options. Please use one of them.`\n );\n }\n\n for (const field of model.fields) {\n // Skip password fields\n if (field.name.toLowerCase().includes(\"password\")) {\n continue;\n }\n\n if (selectFields && !selectFields[field.name]) {\n continue;\n }\n\n if (this.isModelRelation(field.type)) {\n if (\n nestedIncludes?.[field.name] ||\n selectFields?.[field.name] ||\n ommittedFields?.[field.name] === false\n ) {\n const relationModel = this.schema.models.find(\n (m) => m.name === field.type\n );\n if (relationModel) {\n const nestedSchema = this.generateNestedRelationSchema(\n relationModel,\n nestedIncludes?.[field.name] ||\n selectFields?.[field.name] ||\n ommittedFields?.[field.name]\n );\n properties[field.name] = field.isArray\n ? { type: \"array\", items: nestedSchema }\n : nestedSchema;\n }\n }\n continue;\n }\n\n const property = this.convertFieldToJsonSchema(field);\n properties[field.name] = property;\n\n if (!field.isOptional) {\n required.push(field.name);\n }\n }\n\n return {\n type: \"object\",\n properties,\n required,\n };\n }\n\n /**\n * Auth-specific schema generators\n */\n private generateLoginSchema(arkosConfig?: ArkosConfig): JsonSchema {\n const userNameFields =\n arkosConfig?.authentication?.login?.allowedUsernames || [];\n\n // Helper function to get display name for nested fields\n const getDisplayName = (field: string) => {\n if (field.includes(\".\")) return field.split(\".\").pop() || field; // Get the part after the last dot\n return field;\n };\n\n // Base schema with password (always required)\n const baseSchema: JsonSchemaProperty = {\n type: \"object\",\n properties: {\n password: {\n type: \"string\",\n minLength: 8,\n },\n },\n required: [\"password\"],\n };\n\n // Add all username fields to properties\n userNameFields.forEach((field) => {\n const displayName = getDisplayName(field);\n baseSchema.properties![displayName] = {\n type: \"string\",\n format: \"string\",\n description: `Username field: ${field}`, // Optional: show original field path\n };\n });\n\n // At least one username field must be provided along with password\n if (userNameFields.length > 0) {\n const usernameDisplayNames = userNameFields.map(getDisplayName);\n\n return {\n ...baseSchema,\n anyOf: usernameDisplayNames.map(() => ({\n required: [...baseSchema.required!],\n })),\n };\n }\n\n return baseSchema;\n }\n private generateSignupSchema(\n model: PrismaModel,\n options?: Record<string, any>\n ): JsonSchema {\n // Similar to create but might have specific required fields\n const singupSchema = this.generateCreateSchema(model, options || {});\n\n const restrictedFields = [\n \"roles\",\n \"role\",\n \"isActive\",\n \"isStaff\",\n \"isSuperUser\",\n \"passwordChangedAt\",\n \"deletedSelfAccountAt\",\n \"lastLoginAt\",\n ];\n restrictedFields.forEach((field) => {\n delete singupSchema?.properties?.[field];\n });\n\n return singupSchema;\n }\n\n private generateUpdateMeSchema(\n model: PrismaModel,\n options?: Record<string, any>\n ): JsonSchema {\n // Similar to update but might exclude certain fields like role, etc.\n const updateSchema = this.generateUpdateSchema(model, options || {});\n\n // Remove sensitive fields that users shouldn't update themselves\n const restrictedFields = [\n \"roles\",\n \"role\",\n \"isActive\",\n \"isStaff\",\n \"isSuperUser\",\n \"passwordChangedAt\",\n \"deletedSelfAccountAt\",\n \"password\",\n \"lastLoginAt\",\n ];\n restrictedFields.forEach((field) => {\n delete updateSchema?.properties?.[field];\n });\n\n return updateSchema;\n }\n\n private generateUpdatePasswordSchema(\n _: PrismaModel,\n _1?: Record<string, any>\n ): JsonSchema {\n return {\n type: \"object\",\n properties: {\n currentPassword: { type: \"string\" },\n newPassword: { type: \"string\", minLength: 8 },\n },\n required: [\"currentPassword\", \"newPassword\"],\n };\n }\n\n /**\n * Utility methods\n */\n private resolvePrismaQueryOptions(\n prismaQueryOptions?: PrismaQueryOptions<any> | AuthPrismaQueryOptions<any>,\n action?: ValidationFileMappingKey\n ): Record<string, any> {\n if (!prismaQueryOptions || !action) {\n return {};\n }\n\n const options = prismaQueryOptions as any;\n const actionOptions = options[action] || {};\n\n // Start with deprecated queryOptions (for backward compatibility)\n let mergedOptions = options.queryOptions || {};\n\n // Apply global options (replaces queryOptions)\n if (options.global)\n mergedOptions = deepmerge(mergedOptions, options.global);\n\n // Apply general operation options based on action type\n const generalOptions = this.getGeneralOptionsForAction(options, action);\n if (generalOptions)\n mergedOptions = deepmerge(mergedOptions, generalOptions);\n\n // Finally apply specific action options (highest priority)\n if (actionOptions) mergedOptions = deepmerge(mergedOptions, actionOptions);\n\n return mergedOptions;\n }\n\n /**\n * Helps in remmaping those prisma query options that combines many operations for example find, save...\n */\n private getGeneralOptionsForAction(\n options: any,\n action: ValidationFileMappingKey\n ): Record<string, any> | null {\n const actionMap: { [key: string]: string[] } = {\n find: [\"findOne\", \"findMany\"],\n create: [\"createOne\", \"createMany\"],\n update: [\"updateOne\", \"updateMany\"],\n delete: [\"deleteOne\", \"deleteMany\"],\n save: [\"createOne\", \"createMany\", \"updateOne\", \"updateMany\"],\n saveOne: [\"createOne\", \"updateOne\"],\n saveMany: [\"createMany\", \"updateMany\"],\n };\n\n for (const [optionKey, actions] of Object.entries(actionMap)) {\n if (actions.includes(action) && options[optionKey]) {\n return options[optionKey];\n }\n }\n\n return null;\n }\n\n private isEndpointDisabled(\n endpoint: string,\n routerConfig?: RouterConfig<any>\n ): boolean {\n if (!routerConfig?.disable) return false;\n\n if (typeof routerConfig.disable === \"boolean\") {\n return routerConfig.disable;\n }\n\n return (\n routerConfig.disable[endpoint as keyof typeof routerConfig.disable] ||\n false\n );\n }\n\n private isModelRelation(typeName: string): boolean {\n return this.schema.models.some((m) => m.name === typeName);\n }\n\n private convertFieldToJsonSchema(field: PrismaField): JsonSchemaProperty {\n // Reuse the existing method from the original generator\n const baseType = this.mapPrismaTypeToJsonSchema(field.type);\n const property: JsonSchemaProperty = { type: baseType };\n\n if (field.isArray) {\n property.type = \"array\";\n property.items = { type: this.mapPrismaTypeToJsonSchema(field.type) };\n }\n\n if (field.defaultValue !== undefined) {\n property.default = field.defaultValue;\n }\n\n if (field.type === \"DateTime\") {\n property.format = \"date-time\";\n }\n\n if (this.isEnum(field.type)) {\n const enumDef = this.schema.enums.find((e) => e.name === field.type);\n if (enumDef) {\n property.enum = enumDef.values;\n }\n }\n\n return property;\n }\n\n private mapPrismaTypeToJsonSchema(prismaType: string): string {\n const typeMap: { [key: string]: string } = {\n String: \"string\",\n Int: \"number\",\n Float: \"number\",\n Boolean: \"boolean\",\n DateTime: \"string\",\n Json: \"object\",\n Bytes: \"string\",\n };\n\n if (typeMap[prismaType]) return typeMap[prismaType];\n\n if (this.isEnum(prismaType)) return \"string\";\n\n if (this.isModelRelation(prismaType)) return \"object\";\n\n return \"string\";\n }\n\n private isEnum(typeName: string): boolean {\n return this.schema.enums.some((e) => e.name === typeName);\n }\n}\n\nconst prismaJsonSchemaGenerator = new PrismaJsonSchemaGenerator();\n\nexport default prismaJsonSchemaGenerator;\n"]}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { plainToInstance } from "class-transformer";
|
|
2
2
|
import { validate } from "class-validator";
|
|
3
|
-
import AppError from "../modules/error-handler/utils/app-error.js";
|
|
4
3
|
export default async function validateDto(DtoClass, data, validationOptions) {
|
|
5
4
|
const dataDto = plainToInstance(DtoClass, data);
|
|
6
5
|
const errors = await validate(dataDto, validationOptions);
|
|
7
6
|
if (errors.length > 0)
|
|
8
|
-
throw
|
|
7
|
+
throw errors;
|
|
9
8
|
return dataDto;
|
|
10
9
|
}
|
|
11
10
|
//# sourceMappingURL=validate-dto.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-dto.js","sourceRoot":"","sources":["../../../src/utils/validate-dto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAoB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"validate-dto.js","sourceRoot":"","sources":["../../../src/utils/validate-dto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAoB,MAAM,iBAAiB,CAAC;AAiC7D,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,WAAW,CACvC,QAA6B,EAC7B,IAAyB,EACzB,iBAAoC;IAEpC,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;IAE1D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,MAAM,CAAC;IAEpC,OAAO,OAAO,CAAC;AACjB,CAAC","sourcesContent":["import { ClassConstructor, plainToInstance } from \"class-transformer\";\nimport { validate, ValidatorOptions } from \"class-validator\";\n\n/**\n * Used to easy validate your data with class validator by passing the validator class and the data to validate, and if whished some validation options\n *\n * @param {ClassConstructor<T>} DtoClass - The DTO class you want to use to validate the data\n * @param {Record<string, any>} data - The data to validated\n * @param {ValidatorOptions} validationOptions - class-validator validation options, default {whitelist: true}\n * @returns {Promise<T> | AppError} - returns the validated data or the encountered errors.\n *\n *\n * @example\n * ```ts\n * class CreateUserDto {\n * @IsString()\n * name: string;\n *\n * @IsEmail()\n * email: string;\n * }\n *\n * async function main() {\n * const data = { name: \"Uanela Como\", email: \"invalid-email\" };\n * try {\n * const validatedUser = await validateDto(CreateUserDto, data);\n * // do something\n * } catch (error) {\n * console.error(error.message);\n * }\n * }\n * ```\n */\n\nexport default async function validateDto<T extends object>(\n DtoClass: ClassConstructor<T>,\n data: Record<string, any>,\n validationOptions?: ValidatorOptions\n): Promise<T> {\n const dataDto = plainToInstance(DtoClass, data);\n const errors = await validate(dataDto, validationOptions);\n\n if (errors.length > 0) throw errors;\n\n return dataDto;\n}\n"]}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import AppError from "../modules/error-handler/utils/app-error.js";
|
|
2
1
|
export default async function validateSchema(schema, data, options) {
|
|
3
2
|
const result = schema.safeParse(data);
|
|
4
|
-
if (!result.success)
|
|
5
|
-
throw
|
|
6
|
-
}
|
|
3
|
+
if (!result.success)
|
|
4
|
+
throw result.error;
|
|
7
5
|
return result.data;
|
|
8
6
|
}
|
|
9
7
|
//# sourceMappingURL=validate-schema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-schema.js","sourceRoot":"","sources":["../../../src/utils/validate-schema.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validate-schema.js","sourceRoot":"","sources":["../../../src/utils/validate-schema.ts"],"names":[],"mappings":"AA2BA,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,cAAc,CAC1C,MAAoB,EACpB,IAAa,EACb,OAAa;IAEb,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,MAAM,MAAM,CAAC,KAAK,CAAC;IACxC,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC","sourcesContent":["import { ZodSchema } from \"zod\";\n\n/**\n * Validates data using a Zod schema and throws an AppError if validation fails.\n *\n * @param {ZodSchema} schema - The Zod schema to validate against.\n * @param {unknown} data - The data to validate.\n * @returns {Promise<any>} - The validated data or throws an AppError on failure.\n *\n * @example\n * ```typescript\n * const userSchema = z.object({\n * name: z.string(),\n * email: z.string().email()\n * });\n *\n * async function main() {\n * const data = { name: \"Uanela Como\", email: \"invalid-email\" };\n * try {\n * const validatedUser = await validateSchema(userSchema, data);\n * // do something\n * } catch (error) {\n * console.error(error.message);\n * }\n * }\n * ```\n */\nexport default async function validateSchema<T>(\n schema: ZodSchema<T>,\n data: unknown,\n options?: any\n): Promise<T> {\n const result = schema.safeParse(data);\n if (!result.success) throw result.error;\n return result.data;\n}\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { RouterOptions } from "express";
|
|
1
2
|
import { IArkosRouter } from "./types";
|
|
2
3
|
import { OpenAPIV3 } from "openapi-types";
|
|
3
|
-
export default function ArkosRouter(): IArkosRouter;
|
|
4
|
+
export default function ArkosRouter(options?: RouterOptions): IArkosRouter;
|
|
4
5
|
export declare function generateOpenAPIFromApp(app: any): Record<string, Record<string, Partial<{
|
|
5
6
|
tags?: string[];
|
|
6
7
|
summary?: string;
|
|
@@ -2,6 +2,6 @@ interface DevOptions {
|
|
|
2
2
|
port?: string;
|
|
3
3
|
host?: string;
|
|
4
4
|
}
|
|
5
|
-
export declare function devCommand(options?: DevOptions): Promise<
|
|
5
|
+
export declare function devCommand(options?: DevOptions): Promise<undefined>;
|
|
6
6
|
export declare function killDevelopmentServerChildProcess(): void;
|
|
7
7
|
export {};
|
|
@@ -2,6 +2,6 @@ interface StartOptions {
|
|
|
2
2
|
port?: string;
|
|
3
3
|
host?: string;
|
|
4
4
|
}
|
|
5
|
-
export declare function startCommand(options?: StartOptions):
|
|
5
|
+
export declare function startCommand(options?: StartOptions): void;
|
|
6
6
|
export declare function killProductionServerChildProcess(): void;
|
|
7
7
|
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "arkos",
|
|
3
|
-
"version": "1.4.1-canary.
|
|
3
|
+
"version": "1.4.1-canary.11",
|
|
4
4
|
"description": "The Express & Prisma RESTful Framework",
|
|
5
5
|
"main": "dist/cjs/exports/index.js",
|
|
6
6
|
"module": "dist/esm/exports/index.js",
|
|
@@ -194,7 +194,7 @@
|
|
|
194
194
|
"swagger-ui-express": "^5.0.1",
|
|
195
195
|
"trash-cli": "6.0.0",
|
|
196
196
|
"zod": "^3.24.2",
|
|
197
|
-
"tsx-strict": "^0.
|
|
197
|
+
"tsx-strict": "^0.3.3",
|
|
198
198
|
"zod-to-json-schema": "^3.24.6"
|
|
199
199
|
},
|
|
200
200
|
"engines": {
|