arkos 1.4.1-canary.7 → 1.4.2-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 (39) hide show
  1. package/dist/cjs/modules/auth/auth.service.js +5 -3
  2. package/dist/cjs/modules/auth/auth.service.js.map +1 -1
  3. package/dist/cjs/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js +27 -9
  4. package/dist/cjs/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js.map +1 -1
  5. package/dist/cjs/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.js +28 -11
  6. package/dist/cjs/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.js.map +1 -1
  7. package/dist/cjs/modules/swagger/utils/helpers/missing-json-schemas-generator.js +3 -0
  8. package/dist/cjs/modules/swagger/utils/helpers/missing-json-schemas-generator.js.map +1 -1
  9. package/dist/cjs/server.js +6 -2
  10. package/dist/cjs/server.js.map +1 -1
  11. package/dist/cjs/utils/arkos-router/index.js +5 -0
  12. package/dist/cjs/utils/arkos-router/index.js.map +1 -1
  13. package/dist/cjs/utils/cli/dev.js +0 -7
  14. package/dist/cjs/utils/cli/dev.js.map +1 -1
  15. package/dist/cjs/utils/cli/utils/cli.helpers.js +1 -1
  16. package/dist/cjs/utils/cli/utils/template-generator/templates/router-template.js +1 -1
  17. package/dist/cjs/utils/cli/utils/template-generator/templates/router-template.js.map +1 -1
  18. package/dist/cjs/utils/prisma/prisma-json-schema-generator.js +19 -4
  19. package/dist/cjs/utils/prisma/prisma-json-schema-generator.js.map +1 -1
  20. package/dist/esm/modules/auth/auth.service.js +5 -3
  21. package/dist/esm/modules/auth/auth.service.js.map +1 -1
  22. package/dist/esm/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js +27 -9
  23. package/dist/esm/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js.map +1 -1
  24. package/dist/esm/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.js +28 -11
  25. package/dist/esm/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.js.map +1 -1
  26. package/dist/esm/modules/swagger/utils/helpers/missing-json-schemas-generator.js +3 -0
  27. package/dist/esm/modules/swagger/utils/helpers/missing-json-schemas-generator.js.map +1 -1
  28. package/dist/esm/server.js +6 -2
  29. package/dist/esm/server.js.map +1 -1
  30. package/dist/esm/utils/arkos-router/index.js +5 -0
  31. package/dist/esm/utils/arkos-router/index.js.map +1 -1
  32. package/dist/esm/utils/cli/dev.js +0 -7
  33. package/dist/esm/utils/cli/dev.js.map +1 -1
  34. package/dist/esm/utils/cli/utils/cli.helpers.js +1 -1
  35. package/dist/esm/utils/cli/utils/template-generator/templates/router-template.js +1 -1
  36. package/dist/esm/utils/cli/utils/template-generator/templates/router-template.js.map +1 -1
  37. package/dist/esm/utils/prisma/prisma-json-schema-generator.js +19 -4
  38. package/dist/esm/utils/prisma/prisma-json-schema-generator.js.map +1 -1
  39. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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","sourcesContent":["import { IncomingMessage, Server, ServerResponse } from \"http\";\nimport AppError from \"./modules/error-handler/utils/app-error\";\nimport { Express } from \"express\";\nimport { bootstrap } from \"./app\";\nimport http from \"http\";\nimport sheu from \"./utils/sheu\";\nimport portAndHostAllocator from \"./utils/features/port-and-host-allocator\";\nimport { killDevelopmentServerChildProcess } from \"./utils/cli/dev\";\nimport { killServerChildProcess } from \"./utils/cli/utils/cli.helpers\";\nimport { killProductionServerChildProcess } from \"./utils/cli/start\";\nimport { ArkosConfig } from \"./types/new-arkos-config\";\nimport { ArkosInitConfig } from \"./exports\";\nimport { getArkosConfig as getArkosConfigHelper } from \"./utils/helpers/arkos-config.helpers\";\nimport runtimeCliCommander from \"./utils/cli/utils/runtime-cli-commander\";\n\n/**\n * Gives access to the underlying current configurations being used by **Arkos** by default and also loaded through `arkos.config.{ts|js}`\n *\n * @returns {ArkosConfig}\n */\nexport function getArkosConfig(): ArkosConfig {\n // This was kept only not to require many changes on the given time\n return getArkosConfigHelper();\n}\n\nprocess.on(\"uncaughtException\", (err) => {\n if (err.message.includes(\"EPIPE\")) return;\n\n if (process.env.CLI !== \"true\")\n sheu.error(\"UNCAUGHT EXCEPTION! SHUTTING DOWN...\\n\", {\n timestamp: true,\n bold: true,\n });\n\n // console.error(err.name, err.message);\n console.error(err);\n process.exit(1);\n});\n\nlet server: Server<typeof IncomingMessage, typeof ServerResponse>;\nlet _app: Express;\n\n/**\n * Initializes the application server.\n *\n * This function starts the server by listening on a specified port.\n * The port is determined by the following order of precedence:\n * 1. The `port` argument passed to the function.\n * 2. Defaults to `8000` if neither is provided.\n *\n * @param {ArkosInitConfig} initConfig - initial configs for the api ( authentication, port).\n * @returns {Promise<Express>} This function returns the Express App after all middlewares configurations.\n * You can prevent it from listen py passing port as undefined\n *\n */\nasync function initApp(\n initConfig: ArkosInitConfig = {}\n): Promise<Express | undefined> {\n try {\n const arkosConfig = getArkosConfig();\n\n const portAndHost = { port: process.env.__PORT, host: process.env.__HOST! };\n\n let networkHost = portAndHostAllocator.getFirstNonLocalIp();\n\n _app = await bootstrap(initConfig);\n const time = new Date().toTimeString().split(\" \")[0];\n const cliCommand = process.env.CLI_COMMAND;\n\n if (\n !cliCommand &&\n ((\"port\" in arkosConfig && arkosConfig?.port !== undefined) ||\n !(\"port\" in arkosConfig))\n ) {\n server = http.createServer(_app);\n\n if (initConfig?.configureServer) await initConfig.configureServer(server);\n\n server.listen(\n Number(portAndHost?.port),\n portAndHost.host! === \"localhost\" ? \"127.0.0.1\" : portAndHost.host!,\n () => {\n const host = [\"0.0.0.0\", \"127.0.0.1\"].includes(portAndHost?.host)\n ? \"localhost\"\n : portAndHost?.host;\n\n const message = `${sheu.gray(time)} {{server}} waiting on http://${host}:${portAndHost?.port}`;\n\n sheu.ready(\n message.replace(\n \"{{server}}\",\n `${process.env.ARKOS_BUILD === \"true\" ? \"Production\" : \"Development\"} server`\n )\n );\n if (networkHost && portAndHost.host === \"0.0.0.0\")\n sheu.ready(\n message\n .replace(host, networkHost)\n .replace(\"{{server}}\", `Network server`)\n );\n if (\n arkosConfig?.swagger?.mode &&\n ((arkosConfig?.swagger?.enableAfterBuild &&\n process.env.ARKOS_BUILD === \"true\") ||\n process.env.ARKOS_BUILD !== \"true\")\n )\n sheu.ready(\n `${message.replace(\"{{server}}\", \"Documentation\")}${arkosConfig?.swagger?.endpoint || \"/api/docs\"}`\n );\n }\n );\n } else if (!cliCommand) {\n sheu.warn(\n `${sheu.gray(time)} Port set to undefined, hence no internal http server was setup.`\n );\n } else if (cliCommand) runtimeCliCommander.handle();\n\n return _app;\n } catch (err: any) {\n sheu.error(\n err?.message || \"Something went wrong while starting your application!\"\n );\n console.error(err);\n killDevelopmentServerChildProcess?.();\n killServerChildProcess?.();\n killProductionServerChildProcess?.();\n }\n}\n\nprocess.on(\"unhandledRejection\", (err: AppError) => {\n if (process.env.CLI !== \"true\")\n sheu.error(\"UNHANDLED REJECTION! SHUTTING DOWN...\\n\", {\n timestamp: true,\n bold: true,\n });\n // console.error(err.name, err.message);\n console.error(err);\n if (server?.close)\n server?.close(() => {\n process.exit(1);\n });\n else process.exit(1);\n});\n\n/**\n * Terminates the current running express application, server and process.\n *\n * @returns {void}\n */\nexport function terminateApplicationRunningProcessAndServer(): void {\n server?.close(() => {\n process.exit(1);\n });\n}\n\nexport function getExpressApp() {\n return _app;\n}\n\nexport { server, initApp };\n"]}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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","sourcesContent":["import { IncomingMessage, Server, ServerResponse } from \"http\";\nimport AppError from \"./modules/error-handler/utils/app-error\";\nimport { Express } from \"express\";\nimport { bootstrap } from \"./app\";\nimport http from \"http\";\nimport sheu from \"./utils/sheu\";\nimport portAndHostAllocator from \"./utils/features/port-and-host-allocator\";\nimport { killDevelopmentServerChildProcess } from \"./utils/cli/dev\";\nimport { killServerChildProcess } from \"./utils/cli/utils/cli.helpers\";\nimport { killProductionServerChildProcess } from \"./utils/cli/start\";\nimport { ArkosConfig } from \"./types/new-arkos-config\";\nimport { ArkosInitConfig } from \"./exports\";\nimport { getArkosConfig as getArkosConfigHelper } from \"./utils/helpers/arkos-config.helpers\";\nimport runtimeCliCommander from \"./utils/cli/utils/runtime-cli-commander\";\n\n/**\n * Gives access to the underlying current configurations being used by **Arkos** by default and also loaded through `arkos.config.{ts|js}`\n *\n * @returns {ArkosConfig}\n */\nexport function getArkosConfig(): ArkosConfig {\n // This was kept only not to require many changes on the given time\n return getArkosConfigHelper();\n}\n\nprocess.on(\"uncaughtException\", (err) => {\n if (err.message.includes(\"EPIPE\")) return;\n\n if (process.env.CLI !== \"true\")\n sheu.error(\"UNCAUGHT EXCEPTION! SHUTTING DOWN...\\n\", {\n timestamp: true,\n bold: true,\n });\n\n console.error(err);\n setTimeout(() => {\n process.exit(1);\n }, 0);\n});\n\nlet server: Server<typeof IncomingMessage, typeof ServerResponse>;\nlet _app: Express;\n\n/**\n * Initializes the application server.\n *\n * This function starts the server by listening on a specified port.\n * The port is determined by the following order of precedence:\n * 1. The `port` argument passed to the function.\n * 2. Defaults to `8000` if neither is provided.\n *\n * @param {ArkosInitConfig} initConfig - initial configs for the api ( authentication, port).\n * @returns {Promise<Express>} This function returns the Express App after all middlewares configurations.\n * You can prevent it from listen py passing port as undefined\n *\n */\nasync function initApp(\n initConfig: ArkosInitConfig = {}\n): Promise<Express | undefined> {\n try {\n const arkosConfig = getArkosConfig();\n\n const portAndHost = { port: process.env.__PORT, host: process.env.__HOST! };\n\n let networkHost = portAndHostAllocator.getFirstNonLocalIp();\n\n _app = await bootstrap(initConfig);\n const time = new Date().toTimeString().split(\" \")[0];\n const cliCommand = process.env.CLI_COMMAND;\n\n if (\n !cliCommand &&\n ((\"port\" in arkosConfig && arkosConfig?.port !== undefined) ||\n !(\"port\" in arkosConfig))\n ) {\n server = http.createServer(_app);\n\n if (initConfig?.configureServer) await initConfig.configureServer(server);\n\n server.listen(\n Number(portAndHost?.port),\n portAndHost.host! === \"localhost\" ? \"127.0.0.1\" : portAndHost.host!,\n () => {\n const host = [\"0.0.0.0\", \"127.0.0.1\"].includes(portAndHost?.host)\n ? \"localhost\"\n : portAndHost?.host;\n\n const message = `${sheu.gray(time)} {{server}} waiting on http://${host}:${portAndHost?.port}`;\n\n sheu.ready(\n message.replace(\n \"{{server}}\",\n `${process.env.ARKOS_BUILD === \"true\" ? \"Production\" : \"Development\"} server`\n )\n );\n if (networkHost && portAndHost.host === \"0.0.0.0\")\n sheu.ready(\n message\n .replace(host, networkHost)\n .replace(\"{{server}}\", `Network server`)\n );\n if (\n arkosConfig?.swagger?.mode &&\n ((arkosConfig?.swagger?.enableAfterBuild &&\n process.env.ARKOS_BUILD === \"true\") ||\n process.env.ARKOS_BUILD !== \"true\")\n )\n sheu.ready(\n `${message.replace(\"{{server}}\", \"Documentation\")}${arkosConfig?.swagger?.endpoint || \"/api/docs\"}`\n );\n }\n );\n } else if (!cliCommand) {\n sheu.warn(\n `${sheu.gray(time)} Port set to undefined, hence no internal http server was setup.`\n );\n } else if (cliCommand) runtimeCliCommander.handle();\n\n return _app;\n } catch (err: any) {\n sheu.error(\n err?.message || \"Something went wrong while starting your application!\"\n );\n console.error(err);\n killDevelopmentServerChildProcess?.();\n killServerChildProcess?.();\n killProductionServerChildProcess?.();\n }\n}\n\nprocess.on(\"unhandledRejection\", (err: AppError) => {\n if (process.env.CLI !== \"true\")\n sheu.error(\"UNHANDLED REJECTION! SHUTTING DOWN...\\n\", {\n timestamp: true,\n bold: true,\n });\n console.error(err);\n\n if (server?.close)\n server?.close(() => {\n process.exit(1);\n });\n else\n setTimeout(() => {\n process.exit(1);\n }, 0);\n});\n\n/**\n * Terminates the current running express application, server and process.\n *\n * @returns {void}\n */\nexport function terminateApplicationRunningProcessAndServer(): void {\n server?.close(() => {\n process.exit(1);\n });\n}\n\nexport function getExpressApp() {\n return _app;\n}\n\nexport { server, initApp };\n"]}
@@ -35,14 +35,19 @@ export default function ArkosRouter(options) {
35
35
  if ([null, undefined].includes(path))
36
36
  throw Error("Please pass valid value for path field to use in your route");
37
37
  const method = prop;
38
+ const UndefinedHandlerError = (handler) => Error(`Wrong value for handler in route ${method.toUpperCase()} ${path}, recevied ${handler}.`);
38
39
  if (handlers.length > 0) {
39
40
  handlers = handlers.map((handler) => {
41
+ if (!handler)
42
+ throw UndefinedHandlerError(handler);
40
43
  return typeof handler === "function"
41
44
  ? catchAsync(handler, {
42
45
  type: handler.length > 3 ? "error" : "normal",
43
46
  })
44
47
  : Array.isArray(handler)
45
48
  ? handler.map((nesteHandler) => {
49
+ if (!handler)
50
+ throw UndefinedHandlerError(nesteHandler);
46
51
  if (typeof nesteHandler === "function")
47
52
  return;
48
53
  catchAsync(nesteHandler, {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/utils/arkos-router/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAiB,MAAM,SAAS,CAAC;AAGhD,OAAO,oBAAoB,MAAM,0BAA0B,CAAC;AAC5D,OAAO,mBAAmB,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAEzD,OAAO,eAAe,MAAM,oBAAoB,CAAC;AACjD,OAAO,0BAA0B,MAAM,oEAAoE,CAAC;AAC5G,OAAO,sBAAsB,MAAM,8DAA8D,CAAC;AAClG,OAAO,aAAa,MAAM,gCAAgC,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AA0B7D,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,OAAuB;IACzD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAE/B,OAAO,IAAI,KAAK,CAAC,MAAM,EAAE;QACvB,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ;YACxB,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;YAE3D,MAAM,WAAW,GAAG;gBAClB,KAAK;gBACL,MAAM;gBACN,KAAK;gBACL,OAAO;gBACP,QAAQ;gBACR,KAAK;gBACL,MAAM;gBACN,OAAO;gBACP,SAAS;aACV,CAAC;YAMF,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAc,CAAC,EAAE,CAAC;gBACzC,OAAO,UACL,MAAwB,EACxB,GAAG,QAAkC;oBAErC,IAAI,MAAM,CAAC,QAAQ;wBAAE,OAAO;oBAE5B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;oBAEzB,IAAI,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,MAAM,CAAC;wBAClD,MAAM,KAAK,CACT,mCAAmC,IAAc,4EAA4E,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CACrM,CAAC;oBAEJ,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,IAAW,CAAC;wBACzC,MAAM,KAAK,CACT,6DAA6D,CAC9D,CAAC;oBAEJ,MAAM,MAAM,GAAG,IAAc,CAAC;oBAE9B,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACxB,QAAQ,GAAG,QAAQ,CAAC,GAAG,CACrB,CAAC,OAA0D,EAAE,EAAE;4BAC7D,OAAO,OAAO,OAAO,KAAK,UAAU;gCAClC,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE;oCAClB,IAAI,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ;iCAC9C,CAAC;gCACJ,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;oCACtB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,YAAiB,EAAE,EAAE;wCAChC,IAAI,OAAO,YAAY,KAAK,UAAU;4CAAE,OAAO;wCAC/C,UAAU,CAAC,YAAY,EAAE;4CACvB,IAAI,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ;yCAC9C,CAAC,CAAC;wCACH,OAAO,YAAY,CAAC;oCACtB,CAAC,CAAC;oCACJ,CAAC,CAAC,OAAO,CAAC;wBAChB,CAAC,CACF,CAAC;wBAEF,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;wBACnD,mBAAmB,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;oBAC7D,CAAC;oBAED,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;oBACrC,MAAM,gBAAgB,GAAG,WAAW,CAAC,UAAU,CAAC;oBAChD,MAAM,oBAAoB,GAAG,WAAW,CAAC,cAAc,CAAC;oBACxD,MAAM,gBAAgB,GAAG,gBAAgB,EAAE,MAAM,CAAC;oBAClD,MAAM,KAAK,GAAG,GAAG,MAAM,CAAC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC;oBAEhD,IACE,gBAAgB;wBAChB,CAAC,CAAC,CAAC,YAAY,IAAI,MAAM,CAAC;4BACxB,CAAC,YAAY,IAAI,MAAM;gCACrB,CAAC,MAAM,CAAC,UAAU;gCAClB,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC;wBAErC,MAAM,KAAK,CACT,yQAAyQ,CAC1Q,CAAC;oBAEJ,IAAI,CAAC,gBAAgB,EAAE,QAAQ,IAAI,MAAM,CAAC,UAAU;wBAClD,MAAM,KAAK,CACT,wCAAwC,KAAK,qHAAqH,CACnK,CAAC;oBAEJ,IAAI,MAAM,CAAC,cAAc,IAAI,CAAC,oBAAoB,EAAE,IAAI;wBACtD,MAAM,KAAK,CACT,gCAAgC,KAAK,+DAA+D,oBAAoB,EAAE;;uFAEjD,CAC1E,CAAC;oBAEJ,QAAQ,GAAG,CAAC,GAAG,kBAAkB,CAAC,MAAM,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC;oBAExD,IACE,MAAM,CAAC,YAAY,EAAE,OAAO;wBAC5B,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,aAAa,KAAK,KAAK;wBAEnD,QAAQ,CAAC,IAAI,CACX,UAAU,CACR,aAAa,CAAC,iBAAiB,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,EAC5D,EAAE,IAAI,EAAE,OAAO,EAAE,CAClB,CACF,CAAC;oBAEJ,OAAO,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,CAAC;gBACxD,CAAC,CAAC;YACJ,CAAC;YAED,OAAO,cAAc,CAAC;QACxB,CAAC;KACF,CAAiB,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,GAAQ;IAC7C,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IAErC,IAAI,KAAK,GAGL,EAAE,CAAC;IAEP,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE;QAC1C,IAAI,MAAM,EAAE,YAAY,EAAE,OAAO,KAAK,KAAK;YAAE,OAAO;QACpD,MAAM,YAAY,GAAG,IAAI,CAAC;QAE1B,MAAM,2BAA2B,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC5D,KAAK,MAAM,SAAS,IAAI,2BAA2B,EAAE,CAAC;YACpD,IAAI,GAAG,IAAI,CAAC,UAAU,CACpB,IAAI,SAAS,EAAE,EACf,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,IAAI,CAAC,CAAC,CAAC,IAAI,SAAS,GAAG,CAC/D,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QAEnC,IAAI,OAAO,MAAM,EAAE,YAAY,EAAE,OAAO,KAAK,SAAS,EAAE,CAAC;YACvD,MAAM,GAAG;gBACP,GAAG,MAAM;gBACT,YAAY,EAAE;oBACZ,GAAG,MAAM,CAAC,YAAY;oBACtB,OAAO,EAAE,EAAE;iBACZ;aACF,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GACX,OAAO,MAAM,EAAE,YAAY,EAAE,OAAO,KAAK,QAAQ;YACjD,MAAM,CAAC,YAAY,CAAC,OAAO,KAAK,IAAI;YAClC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO;YAC7B,CAAC,CAAC,EAAE,CAAC;QAET,MAAM,qBAAqB,GACzB,WAAW,EAAE,UAAU,EAAE,QAAQ,KAAK,KAAK;YACzC,CAAC,CAAC,eAAe;YACjB,CAAC,CAAC,0BAA0B,CAAC;QAEjC,IAAI,UAAU,GAAG,EAAE,CAAC;QACpB,MAAM,4BAA4B,GAAG;YACnC,KAAK,EAAE,OAAO;YACd,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE,QAAQ;SAClB,CAAC;QAEF,IAAI,OAAO,MAAM,EAAE,UAAU,KAAK,SAAS,IAAI,MAAM,EAAE,UAAU,EAAE,CAAC;YAClE,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC;gBAC5D,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;oBAAE,SAAS;gBACrC,IAAI,CAAC,MAAM,EAAE,UAAkB,CAAA,CAAC,GAAG,CAAC,EAAE,CAAC;oBACrC,MAAM,UAAU,GAAG,qBAAqB,CAAC,GAAU,CAAC,CAAC;oBACrD,MAAM,MAAM,GAAG,sBAAsB,CAAC,4BAA4B,CAC/D,4BAAoC,CAAC,GAAG,CAAC,EAC1C,UAAU,CACX,CAAC;oBACF,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,gBAAgB,GACpB,sBAAsB,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAEvD,MAAM,aAAa,GAAgC;YACjD,GAAG,CAAC,gBAAgB,CAAC,UAAU,IAAI,EAAE,CAAC;YACtC,GAAG,UAAU;SACd,CAAC;QAEF,KAAK,MAAM,SAAS,IAAI,2BAA2B,EAAE,CAAC;YACpD,IACE,CAAC,aAAa,CAAC,IAAI,CACjB,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CACxB,IAAI,KAAK,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,OAAO,KAAK,MAAM,CAC5D;gBAED,aAAa,CAAC,IAAI,CAAC;oBACjB,IAAI,EAAE,SAAS;oBACf,EAAE,EAAE,MAAM;oBACV,QAAQ,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC;oBAClC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC3B,CAAC,CAAC;QACP,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;YAClC,IACE,CAAC,2BAA2B,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;gBACjD,CAAC,2BAA2B,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC;gBACvD,KAAK,CAAC,EAAE,KAAK,MAAM;gBAEnB,MAAM,IAAI,KAAK,CACb,qDAAqD,KAAK,CAAC,IAAI,4CAA4C,YAAY,EAAE,CAC1H,CAAC;QACN,CAAC;QAED,OAAO,gBAAgB,CAAC,UAAU,CAAC;QAElC,KAAa,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,GAAG;YAC3C,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,GAAG,IAAI,EAAE;YACtC,WAAW,EAAE,OAAO,EAAE,WAAW,IAAI,GAAG,MAAM,IAAI,IAAI,EAAE;YACxD,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC;YACnC,WAAW,EAAE,GAAG,MAAM,CAAC,WAAW,EAAE,IAAI,IAAI,EAAE;YAC9C,UAAU,EAAE,aAAa;YACzB,GAAG,CAAC,CAAC,gBAAgB,CAAC,WAAW;gBAC/B,MAAM,EAAE,UAAU;gBAClB,MAAM,EAAE,UAAU,EAAE,IAAI,IAAI;gBAC1B,WAAW,EAAE;oBACX,OAAO,EAAE;wBACP,kBAAkB,EAAE;4BAClB,MAAM,EAAE,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,IAAW,CAAC;yBAC/D;qBACF;iBACF;aACF,CAAC;YACJ,GAAG,gBAAgB;SACpB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import { Router, RouterOptions } from \"express\";\nimport { IArkosRouter, ArkosRouteConfig } from \"./types\";\nimport { OpenAPIV3 } from \"openapi-types\";\nimport RouteConfigValidator from \"./route-config-validator\";\nimport RouteConfigRegistry from \"./route-config-registry\";\nimport {\n extractArkosRoutes,\n extractPathParams,\n getMiddlewareStack,\n} from \"./utils/helpers\";\nimport { getArkosConfig } from \"../../exports\";\nimport { catchAsync } from \"../../exports/error-handler\";\nimport { ArkosErrorRequestHandler, ArkosRequestHandler } from \"../../types\";\nimport zodToJsonSchema from \"zod-to-json-schema\";\nimport classValidatorToJsonSchema from \"../../modules/swagger/utils/helpers/class-validator-to-json-schema\";\nimport openApiSchemaConverter from \"../../modules/swagger/utils/helpers/openapi-schema-converter\";\nimport uploadManager from \"./utils/helpers/upload-manager\";\nimport { getUserFileExtension } from \"../helpers/fs.helpers\";\n\n/**\n * Creates an enhanced Express Router with features like OpenAPI documentation capabilities and smart data validation.\n *\n * The ArkosRouter extends the standard Express Router with the ability to\n * automatically capture OpenAPI metadata from route configurations.\n *\n * @example\n * const router = ArkosRouter();\n *\n * router.get(\n * {\n * path: \"/users/:id\",\n * openapi: {\n * summary: \"Get user by ID\",\n * tags: [\"Users\"]\n * }\n * },\n * (req, res) => { ... }\n * );\n *\n * @returns {IArkosRouter} A proxied Express Router instance with enhanced OpenAPI capabilities\n *\n * @see {@link ArkosRouteConfig} for configuration options\n */\nexport default function ArkosRouter(options?: RouterOptions): IArkosRouter {\n const router = Router(options);\n\n return new Proxy(router, {\n get(target, prop, receiver) {\n const originalMethod = Reflect.get(target, prop, receiver);\n\n const httpMethods = [\n \"get\",\n \"post\",\n \"put\",\n \"patch\",\n \"delete\",\n \"all\",\n \"head\",\n \"trace\",\n \"options\",\n ];\n\n type ArkosAnyRequestHandler =\n | ArkosRequestHandler\n | ArkosErrorRequestHandler;\n\n if (httpMethods.includes(prop as string)) {\n return function (\n config: ArkosRouteConfig,\n ...handlers: ArkosAnyRequestHandler[]\n ) {\n if (config.disabled) return;\n\n const path = config.path;\n\n if (!RouteConfigValidator.isArkosRouteConfig(config))\n throw Error(\n `First argument of ArkosRouter().${prop as string}() must be a valid ArkosRouteConfig object with path field, but recevied ${typeof config === \"object\" ? JSON.stringify(config, null, 2) : config}`\n );\n\n if ([null, undefined].includes(path as any))\n throw Error(\n \"Please pass valid value for path field to use in your route\"\n );\n\n const method = prop as string;\n\n if (handlers.length > 0) {\n handlers = handlers.map(\n (handler: ArkosAnyRequestHandler | ArkosAnyRequestHandler[]) => {\n return typeof handler === \"function\"\n ? catchAsync(handler, {\n type: handler.length > 3 ? \"error\" : \"normal\",\n })\n : Array.isArray(handler)\n ? handler.map((nesteHandler: any) => {\n if (typeof nesteHandler === \"function\") return;\n catchAsync(nesteHandler, {\n type: handler.length > 3 ? \"error\" : \"normal\",\n });\n return nesteHandler;\n })\n : handler;\n }\n );\n\n const finalHandler = handlers[handlers.length - 1];\n RouteConfigRegistry.register(finalHandler, config, method);\n }\n\n const arkosConfig = getArkosConfig();\n const validationConfig = arkosConfig.validation;\n const authenticationConfig = arkosConfig.authentication;\n const strictValidation = validationConfig?.strict;\n const route = `${method.toUpperCase()} ${path}`;\n\n if (\n strictValidation &&\n (!(\"validation\" in config) ||\n (\"validation\" in config &&\n !config.validation &&\n config.validation !== undefined))\n )\n throw Error(\n \"When using strict validation you must either pass { validation: false } in order to explicitly tell that no input will be received, or pass `undefined` for each input type e.g { validation: { query: undefined } } in order to deny the input of given request input.\"\n );\n\n if (!validationConfig?.resolver && config.validation)\n throw Error(\n `Trying to pass validators into route ${route} config validation option without choosing a validation resolver under arkos.init({ validation: { resolver: '' } })`\n );\n\n if (config.authentication && !authenticationConfig?.mode)\n throw Error(\n `Trying to authenticate route ${route} without choosing an authentication mode under arkos.config.${getUserFileExtension()}\n\nFor further help see https://www.arkosjs.com/docs/core-concepts/authentication-system.`\n );\n\n handlers = [...getMiddlewareStack(config), ...handlers];\n\n if (\n config.experimental?.uploads &&\n config.experimental.uploads.deleteOnError !== false\n )\n handlers.push(\n catchAsync(\n uploadManager.handleFileCleanup(config.experimental.uploads),\n { type: \"error\" }\n )\n );\n\n return originalMethod.call(target, path, ...handlers);\n };\n }\n // }\n return originalMethod;\n },\n }) as IArkosRouter;\n}\n\nexport function generateOpenAPIFromApp(app: any) {\n const routes = extractArkosRoutes(app);\n const arkosConfig = getArkosConfig();\n\n let paths: Record<\n string,\n Record<string, Partial<OpenAPIV3.OperationObject>>\n > = {};\n\n routes.forEach(({ path, method, config }) => {\n if (config?.experimental?.openapi === false) return;\n const originalPath = path;\n\n const pathParatemersFromRoutePath = extractPathParams(path);\n for (const parameter of pathParatemersFromRoutePath) {\n path = path.replaceAll(\n `:${parameter}`,\n parameter.endsWith(\"?\") ? `{${parameter}}?` : `{${parameter}}`\n );\n }\n\n if (!paths[path]) paths[path] = {};\n\n if (typeof config?.experimental?.openapi === \"boolean\") {\n config = {\n ...config,\n experimental: {\n ...config.experimental,\n openapi: {},\n },\n };\n }\n\n const openapi =\n typeof config?.experimental?.openapi === \"object\" &&\n config.experimental.openapi !== null\n ? config.experimental.openapi\n : {};\n\n const validatorToJsonSchema =\n arkosConfig?.validation?.resolver === \"zod\"\n ? zodToJsonSchema\n : classValidatorToJsonSchema;\n\n let parameters = [];\n const validationToParameterMapping = {\n query: \"query\",\n params: \"path\",\n headers: \"header\",\n cookies: \"cookie\",\n };\n\n if (typeof config?.validation !== \"boolean\" && config?.validation) {\n for (const [key, val] of Object.entries(config?.validation)) {\n if ([\"body\"].includes(key)) continue;\n if ((config?.validation as any)[key]) {\n const jsonSchema = validatorToJsonSchema(val as any);\n const params = openApiSchemaConverter.jsonSchemaToOpeApiParameters(\n (validationToParameterMapping as any)[key],\n jsonSchema\n );\n parameters.push(...params);\n }\n }\n }\n\n const convertedOpenAPI =\n openApiSchemaConverter.convertOpenAPIConfig(openapi);\n\n const allParameters: OpenAPIV3.ParameterObject[] = [\n ...(convertedOpenAPI.parameters || []),\n ...parameters,\n ];\n\n for (const parameter of pathParatemersFromRoutePath) {\n if (\n !allParameters.find(\n ({ name, in: paramIn }) =>\n name === parameter.replace(\"?\", \"\") && paramIn === \"path\"\n )\n )\n allParameters.push({\n name: parameter,\n in: \"path\",\n required: !parameter.includes(\"?\"),\n schema: { type: \"string\" },\n });\n }\n\n for (const param of allParameters) {\n if (\n !pathParatemersFromRoutePath.includes(param.name) &&\n !pathParatemersFromRoutePath.includes(`${param.name}?`) &&\n param.in === \"path\"\n )\n throw new Error(\n `ValidationError: Trying to define path parameter '${param.name}' but it is not present in your pathname ${originalPath}`\n );\n }\n\n delete convertedOpenAPI.parameters;\n\n (paths as any)[path][method.toLowerCase()] = {\n summary: openapi?.summary || `${path}`,\n description: openapi?.description || `${method} ${path}`,\n tags: openapi?.tags || [\"Defaults\"],\n operationId: `${method.toLowerCase()}:${path}`,\n parameters: allParameters,\n ...(!convertedOpenAPI.requestBody &&\n config?.validation &&\n config?.validation?.body && {\n requestBody: {\n content: {\n \"application/json\": {\n schema: validatorToJsonSchema(config?.validation?.body as any),\n },\n },\n },\n }),\n ...convertedOpenAPI,\n };\n });\n\n return paths;\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/utils/arkos-router/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { Router, RouterOptions } from \"express\";\nimport { IArkosRouter, ArkosRouteConfig } from \"./types\";\nimport { OpenAPIV3 } from \"openapi-types\";\nimport RouteConfigValidator from \"./route-config-validator\";\nimport RouteConfigRegistry from \"./route-config-registry\";\nimport {\n extractArkosRoutes,\n extractPathParams,\n getMiddlewareStack,\n} from \"./utils/helpers\";\nimport { getArkosConfig } from \"../../exports\";\nimport { catchAsync } from \"../../exports/error-handler\";\nimport { ArkosErrorRequestHandler, ArkosRequestHandler } from \"../../types\";\nimport zodToJsonSchema from \"zod-to-json-schema\";\nimport classValidatorToJsonSchema from \"../../modules/swagger/utils/helpers/class-validator-to-json-schema\";\nimport openApiSchemaConverter from \"../../modules/swagger/utils/helpers/openapi-schema-converter\";\nimport uploadManager from \"./utils/helpers/upload-manager\";\nimport { getUserFileExtension } from \"../helpers/fs.helpers\";\n\n/**\n * Creates an enhanced Express Router with features like OpenAPI documentation capabilities and smart data validation.\n *\n * The ArkosRouter extends the standard Express Router with the ability to\n * automatically capture OpenAPI metadata from route configurations.\n *\n * @example\n * const router = ArkosRouter();\n *\n * router.get(\n * {\n * path: \"/users/:id\",\n * openapi: {\n * summary: \"Get user by ID\",\n * tags: [\"Users\"]\n * }\n * },\n * (req, res) => { ... }\n * );\n *\n * @returns {IArkosRouter} A proxied Express Router instance with enhanced OpenAPI capabilities\n *\n * @see {@link ArkosRouteConfig} for configuration options\n */\nexport default function ArkosRouter(options?: RouterOptions): IArkosRouter {\n const router = Router(options);\n\n return new Proxy(router, {\n get(target, prop, receiver) {\n const originalMethod = Reflect.get(target, prop, receiver);\n\n const httpMethods = [\n \"get\",\n \"post\",\n \"put\",\n \"patch\",\n \"delete\",\n \"all\",\n \"head\",\n \"trace\",\n \"options\",\n ];\n\n type ArkosAnyRequestHandler =\n | ArkosRequestHandler\n | ArkosErrorRequestHandler;\n\n if (httpMethods.includes(prop as string)) {\n return function (\n config: ArkosRouteConfig,\n ...handlers: ArkosAnyRequestHandler[]\n ) {\n if (config.disabled) return;\n\n const path = config.path;\n\n if (!RouteConfigValidator.isArkosRouteConfig(config))\n throw Error(\n `First argument of ArkosRouter().${prop as string}() must be a valid ArkosRouteConfig object with path field, but recevied ${typeof config === \"object\" ? JSON.stringify(config, null, 2) : config}`\n );\n\n if ([null, undefined].includes(path as any))\n throw Error(\n \"Please pass valid value for path field to use in your route\"\n );\n\n const method = prop as string;\n const UndefinedHandlerError = (handler: any) =>\n Error(\n `Wrong value for handler in route ${method.toUpperCase()} ${path}, recevied ${handler}.`\n );\n\n if (handlers.length > 0) {\n handlers = handlers.map(\n (handler: ArkosAnyRequestHandler | ArkosAnyRequestHandler[]) => {\n if (!handler) throw UndefinedHandlerError(handler);\n\n return typeof handler === \"function\"\n ? catchAsync(handler, {\n type: handler.length > 3 ? \"error\" : \"normal\",\n })\n : Array.isArray(handler)\n ? handler.map((nesteHandler: any) => {\n if (!handler) throw UndefinedHandlerError(nesteHandler);\n\n if (typeof nesteHandler === \"function\") return;\n catchAsync(nesteHandler, {\n type: handler.length > 3 ? \"error\" : \"normal\",\n });\n return nesteHandler;\n })\n : handler;\n }\n );\n\n const finalHandler = handlers[handlers.length - 1];\n RouteConfigRegistry.register(finalHandler, config, method);\n }\n\n const arkosConfig = getArkosConfig();\n const validationConfig = arkosConfig.validation;\n const authenticationConfig = arkosConfig.authentication;\n const strictValidation = validationConfig?.strict;\n const route = `${method.toUpperCase()} ${path}`;\n\n if (\n strictValidation &&\n (!(\"validation\" in config) ||\n (\"validation\" in config &&\n !config.validation &&\n config.validation !== undefined))\n )\n throw Error(\n \"When using strict validation you must either pass { validation: false } in order to explicitly tell that no input will be received, or pass `undefined` for each input type e.g { validation: { query: undefined } } in order to deny the input of given request input.\"\n );\n\n if (!validationConfig?.resolver && config.validation)\n throw Error(\n `Trying to pass validators into route ${route} config validation option without choosing a validation resolver under arkos.init({ validation: { resolver: '' } })`\n );\n\n if (config.authentication && !authenticationConfig?.mode)\n throw Error(\n `Trying to authenticate route ${route} without choosing an authentication mode under arkos.config.${getUserFileExtension()}\n\nFor further help see https://www.arkosjs.com/docs/core-concepts/authentication-system.`\n );\n\n handlers = [...getMiddlewareStack(config), ...handlers];\n\n if (\n config.experimental?.uploads &&\n config.experimental.uploads.deleteOnError !== false\n )\n handlers.push(\n catchAsync(\n uploadManager.handleFileCleanup(config.experimental.uploads),\n { type: \"error\" }\n )\n );\n\n return originalMethod.call(target, path, ...handlers);\n };\n }\n // }\n return originalMethod;\n },\n }) as IArkosRouter;\n}\n\nexport function generateOpenAPIFromApp(app: any) {\n const routes = extractArkosRoutes(app);\n const arkosConfig = getArkosConfig();\n\n let paths: Record<\n string,\n Record<string, Partial<OpenAPIV3.OperationObject>>\n > = {};\n\n routes.forEach(({ path, method, config }) => {\n if (config?.experimental?.openapi === false) return;\n const originalPath = path;\n\n const pathParatemersFromRoutePath = extractPathParams(path);\n for (const parameter of pathParatemersFromRoutePath) {\n path = path.replaceAll(\n `:${parameter}`,\n parameter.endsWith(\"?\") ? `{${parameter}}?` : `{${parameter}}`\n );\n }\n\n if (!paths[path]) paths[path] = {};\n\n if (typeof config?.experimental?.openapi === \"boolean\") {\n config = {\n ...config,\n experimental: {\n ...config.experimental,\n openapi: {},\n },\n };\n }\n\n const openapi =\n typeof config?.experimental?.openapi === \"object\" &&\n config.experimental.openapi !== null\n ? config.experimental.openapi\n : {};\n\n const validatorToJsonSchema =\n arkosConfig?.validation?.resolver === \"zod\"\n ? zodToJsonSchema\n : classValidatorToJsonSchema;\n\n let parameters = [];\n const validationToParameterMapping = {\n query: \"query\",\n params: \"path\",\n headers: \"header\",\n cookies: \"cookie\",\n };\n\n if (typeof config?.validation !== \"boolean\" && config?.validation) {\n for (const [key, val] of Object.entries(config?.validation)) {\n if ([\"body\"].includes(key)) continue;\n if ((config?.validation as any)[key]) {\n const jsonSchema = validatorToJsonSchema(val as any);\n const params = openApiSchemaConverter.jsonSchemaToOpeApiParameters(\n (validationToParameterMapping as any)[key],\n jsonSchema\n );\n parameters.push(...params);\n }\n }\n }\n\n const convertedOpenAPI =\n openApiSchemaConverter.convertOpenAPIConfig(openapi);\n\n const allParameters: OpenAPIV3.ParameterObject[] = [\n ...(convertedOpenAPI.parameters || []),\n ...parameters,\n ];\n\n for (const parameter of pathParatemersFromRoutePath) {\n if (\n !allParameters.find(\n ({ name, in: paramIn }) =>\n name === parameter.replace(\"?\", \"\") && paramIn === \"path\"\n )\n )\n allParameters.push({\n name: parameter,\n in: \"path\",\n required: !parameter.includes(\"?\"),\n schema: { type: \"string\" },\n });\n }\n\n for (const param of allParameters) {\n if (\n !pathParatemersFromRoutePath.includes(param.name) &&\n !pathParatemersFromRoutePath.includes(`${param.name}?`) &&\n param.in === \"path\"\n )\n throw new Error(\n `ValidationError: Trying to define path parameter '${param.name}' but it is not present in your pathname ${originalPath}`\n );\n }\n\n delete convertedOpenAPI.parameters;\n\n (paths as any)[path][method.toLowerCase()] = {\n summary: openapi?.summary || `${path}`,\n description: openapi?.description || `${method} ${path}`,\n tags: openapi?.tags || [\"Defaults\"],\n operationId: `${method.toLowerCase()}:${path}`,\n parameters: allParameters,\n ...(!convertedOpenAPI.requestBody &&\n config?.validation &&\n config?.validation?.body && {\n requestBody: {\n content: {\n \"application/json\": {\n schema: validatorToJsonSchema(config?.validation?.body as any),\n },\n },\n },\n }),\n ...convertedOpenAPI,\n };\n });\n\n return paths;\n}\n"]}
@@ -16,7 +16,6 @@ export async function devCommand(options = {}) {
16
16
  let restartTimeout = null;
17
17
  try {
18
18
  const { port, host } = options;
19
- let isRestarting = false;
20
19
  const fileExt = getUserFileExtension();
21
20
  const entryPoint = path.resolve(process.cwd(), `src/app.${fileExt}`);
22
21
  if (!fs.existsSync(entryPoint)) {
@@ -81,12 +80,6 @@ export async function devCommand(options = {}) {
81
80
  child.on("error", (error) => {
82
81
  console.error("Failed to start server:", error);
83
82
  });
84
- child.on("exit", (code, signal) => {
85
- if (!isRestarting && signal !== "SIGTERM" && signal !== "SIGINT") {
86
- console.info(`Server exited with code ${code}, restarting...`);
87
- startServer();
88
- }
89
- });
90
83
  }
91
84
  };
92
85
  startServer();
@@ -1 +1 @@
1
- {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../../../src/utils/cli/dev.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn, ChildProcess, execSync } from \"child_process\";\nimport { getUserFileExtension } from \"../helpers/fs.helpers\";\nimport { loadEnvironmentVariables } from \"../dotenv.helpers\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport sheu from \"../sheu\";\nimport portAndHostAllocator from \"../features/port-and-host-allocator\";\nimport watermarkStamper from \"./utils/watermark-stamper\";\n\ninterface DevOptions {\n port?: string;\n host?: string;\n}\n\nlet child: ChildProcess | null = null;\nlet envFiles: string[] | undefined;\n\n/**\n * Dev server command for the arkos CLI\n */\nexport async function devCommand(options: DevOptions = {}) {\n if (!process.env.NODE_ENV) process.env.NODE_ENV = \"development\";\n envFiles = loadEnvironmentVariables();\n child = null;\n let restartTimeout: NodeJS.Timeout | null = null;\n\n try {\n const { port, host } = options;\n let isRestarting = false;\n\n const fileExt = getUserFileExtension();\n const entryPoint = path.resolve(process.cwd(), `src/app.${fileExt}`);\n\n if (!fs.existsSync(entryPoint)) {\n console.error(`Could not find application entry point at ${entryPoint}`);\n return process.exit(1);\n }\n\n const baseServiceTypesPath = path.resolve(\n process.cwd(),\n `node_modules/@arkosjs/types/base.service.d.ts`\n );\n if (fileExt === \"ts\" && !fs.existsSync(baseServiceTypesPath)) {\n const answer = await new Promise<boolean>((resolve) => {\n sheu.warn(\n 'Missing base services types please run \"npx arkos prisma generate\" to generate and sync the types from @prisma/client'\n );\n process.stdout.write(\n `\\n${sheu.green(\"?\", { bold: true })} Would you like to run \"npx arkos prisma generate\"? (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 console.info(\"\\nSyncing base service with @prisma/client...\");\n console.log(\"\");\n execSync(`npx arkos prisma generate`);\n } else\n throw Error(\n 'Missing BaseService types please run \"npx arkos prisma generate\" to generate and sync the types from @prisma/client, see more at https://www.arkosjs.com/docs/cli/built-in-cli#typescript-types-generation.'\n );\n }\n\n const getEnv = () =>\n ({\n NODE_ENV: \"development\",\n ...process.env,\n ...(port && { CLI_PORT: port }),\n ...(host && { CLI_HOST: host }),\n CLI: \"false\",\n }) as { [x: string]: string };\n\n const env = getEnv();\n const hostAndPort = await portAndHostAllocator.getHostAndAvailablePort(\n env,\n { logWarning: true }\n );\n\n watermarkStamper.stamp({\n ...hostAndPort,\n envFiles,\n });\n\n process.env.__PORT = hostAndPort.port || \"\";\n process.env.__HOST = hostAndPort.host || \"\";\n\n const startServer = () => {\n if (child) {\n child.kill();\n child = null;\n }\n\n const env = getEnv();\n\n if (fileExt === \"ts\") {\n child = spawn(\"npx\", [\"tsx-strict\", \"--watch\", entryPoint], {\n stdio: \"inherit\",\n env,\n shell: true,\n });\n } else {\n child = spawn(\n \"npx\",\n [\"tsx-strict\", \"--no-type-check\", \"--watch\", entryPoint],\n {\n stdio: \"inherit\",\n env,\n shell: true,\n }\n );\n }\n\n if (child) {\n child.on(\"error\", (error) => {\n console.error(\"Failed to start server:\", error);\n });\n\n child.on(\"exit\", (code, signal) => {\n if (!isRestarting && signal !== \"SIGTERM\" && signal !== \"SIGINT\") {\n console.info(`Server exited with code ${code}, restarting...`);\n startServer();\n }\n });\n }\n };\n\n startServer();\n\n const cleanup = () => {\n if (restartTimeout) clearTimeout(restartTimeout);\n\n if (child) {\n child.kill(\"SIGTERM\");\n\n setTimeout(() => {\n if (child && !child.killed) child.kill(\"SIGKILL\");\n }, 5000);\n }\n\n process.exit(0);\n };\n\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n\n process.on(\"uncaughtException\", (error) => {\n console.error(\"Uncaught Exception:\", error);\n cleanup();\n });\n } catch (error) {\n sheu.error(\"Development server failed to start:\");\n console.error(error);\n\n if (child) {\n (child as ChildProcess)?.kill?.();\n child = null;\n }\n\n process.exit(1);\n }\n}\n\n/**\n * Help function to help other processes to terminate the development server child process\n */\nexport function killDevelopmentServerChildProcess() {\n (child as ChildProcess)?.kill?.();\n child = null;\n}\n"]}
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../../../src/utils/cli/dev.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn, ChildProcess, execSync } from \"child_process\";\nimport { getUserFileExtension } from \"../helpers/fs.helpers\";\nimport { loadEnvironmentVariables } from \"../dotenv.helpers\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport sheu from \"../sheu\";\nimport portAndHostAllocator from \"../features/port-and-host-allocator\";\nimport watermarkStamper from \"./utils/watermark-stamper\";\n\ninterface DevOptions {\n port?: string;\n host?: string;\n}\n\nlet child: ChildProcess | null = null;\nlet envFiles: string[] | undefined;\n\n/**\n * Dev server command for the arkos CLI\n */\nexport async function devCommand(options: DevOptions = {}) {\n if (!process.env.NODE_ENV) process.env.NODE_ENV = \"development\";\n envFiles = loadEnvironmentVariables();\n child = null;\n let restartTimeout: NodeJS.Timeout | null = null;\n\n try {\n const { port, host } = options;\n\n const fileExt = getUserFileExtension();\n const entryPoint = path.resolve(process.cwd(), `src/app.${fileExt}`);\n\n if (!fs.existsSync(entryPoint)) {\n console.error(`Could not find application entry point at ${entryPoint}`);\n return process.exit(1);\n }\n\n const baseServiceTypesPath = path.resolve(\n process.cwd(),\n `node_modules/@arkosjs/types/base.service.d.ts`\n );\n if (fileExt === \"ts\" && !fs.existsSync(baseServiceTypesPath)) {\n const answer = await new Promise<boolean>((resolve) => {\n sheu.warn(\n 'Missing base services types please run \"npx arkos prisma generate\" to generate and sync the types from @prisma/client'\n );\n process.stdout.write(\n `\\n${sheu.green(\"?\", { bold: true })} Would you like to run \"npx arkos prisma generate\"? (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 console.info(\"\\nSyncing base service with @prisma/client...\");\n console.log(\"\");\n execSync(`npx arkos prisma generate`);\n } else\n throw Error(\n 'Missing BaseService types please run \"npx arkos prisma generate\" to generate and sync the types from @prisma/client, see more at https://www.arkosjs.com/docs/cli/built-in-cli#typescript-types-generation.'\n );\n }\n\n const getEnv = () =>\n ({\n NODE_ENV: \"development\",\n ...process.env,\n ...(port && { CLI_PORT: port }),\n ...(host && { CLI_HOST: host }),\n CLI: \"false\",\n }) as { [x: string]: string };\n\n const env = getEnv();\n const hostAndPort = await portAndHostAllocator.getHostAndAvailablePort(\n env,\n { logWarning: true }\n );\n\n watermarkStamper.stamp({\n ...hostAndPort,\n envFiles,\n });\n\n process.env.__PORT = hostAndPort.port || \"\";\n process.env.__HOST = hostAndPort.host || \"\";\n\n const startServer = () => {\n if (child) {\n child.kill();\n child = null;\n }\n\n const env = getEnv();\n\n if (fileExt === \"ts\") {\n child = spawn(\"npx\", [\"tsx-strict\", \"--watch\", entryPoint], {\n stdio: \"inherit\",\n env,\n shell: true,\n });\n } else {\n child = spawn(\n \"npx\",\n [\"tsx-strict\", \"--no-type-check\", \"--watch\", entryPoint],\n {\n stdio: \"inherit\",\n env,\n shell: true,\n }\n );\n }\n\n if (child) {\n child.on(\"error\", (error) => {\n console.error(\"Failed to start server:\", error);\n });\n }\n };\n\n startServer();\n\n const cleanup = () => {\n if (restartTimeout) clearTimeout(restartTimeout);\n\n if (child) {\n child.kill(\"SIGTERM\");\n\n setTimeout(() => {\n if (child && !child.killed) child.kill(\"SIGKILL\");\n }, 5000);\n }\n\n process.exit(0);\n };\n\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n\n process.on(\"uncaughtException\", (error) => {\n console.error(\"Uncaught Exception:\", error);\n cleanup();\n });\n } catch (error) {\n sheu.error(\"Development server failed to start:\");\n console.error(error);\n\n if (child) {\n (child as ChildProcess)?.kill?.();\n child = null;\n }\n\n process.exit(1);\n }\n}\n\n/**\n * Help function to help other processes to terminate the development server child process\n */\nexport function killDevelopmentServerChildProcess() {\n (child as ChildProcess)?.kill?.();\n child = null;\n}\n"]}
@@ -11,6 +11,6 @@ export function killServerChildProcess() {
11
11
  killProductionServerChildProcess();
12
12
  }
13
13
  export function getVersion() {
14
- return "1.4.1-canary.7";
14
+ return "1.4.2-beta";
15
15
  }
16
16
  //# sourceMappingURL=cli.helpers.js.map
@@ -6,7 +6,7 @@ export function generateRouterTemplate(options) {
6
6
  const ext = getUserFileExtension();
7
7
  const controllerPath = imports?.controller || `./${modelName.kebab}.controller.${ext}`;
8
8
  const routerConfigTsType = ext === "ts"
9
- ? `: RouterConfig<${["file-upload", "auth"].includes(modelName.kebab) ? modelName.kebab : "prisma"}>`
9
+ ? `: RouterConfig<${["file-upload", "auth"].includes(modelName.kebab) ? modelName.kebab : '"prisma"'}>`
10
10
  : "";
11
11
  const routerConfigTsTypeImport = ext === "ts" ? "import { RouterConfig } from 'arkos'" : "";
12
12
  const controllerExists = checkFileExists(controllerPath);
@@ -1 +1 @@
1
- {"version":3,"file":"router-template.js","sourceRoot":"","sources":["../../../../../../../src/utils/cli/utils/template-generator/templates/router-template.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,oBAAoB,GACrB,MAAM,gCAAgC,CAAC;AAGxC,MAAM,UAAU,sBAAsB,CAAC,OAAwB;IAC7D,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAEvC,IAAI,CAAC,SAAS;QACZ,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAEjE,MAAM,GAAG,GAAG,oBAAoB,EAAE,CAAC;IACnC,MAAM,cAAc,GAClB,OAAO,EAAE,UAAU,IAAI,KAAK,SAAS,CAAC,KAAK,eAAe,GAAG,EAAE,CAAC;IAElE,MAAM,kBAAkB,GACtB,GAAG,KAAK,IAAI;QACV,CAAC,CAAC,kBAAkB,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,GAAG;QACrG,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,wBAAwB,GAC5B,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE7D,MAAM,gBAAgB,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC;IAEzD,MAAM,oBAAoB,GAAG,gBAAgB;QAC3C,CAAC,CAAC,UAAU,SAAS,CAAC,KAAK,oBACvB,OAAO,EAAE,UAAU;YACnB,KAAK,SAAS,CAAC,KAAK,cAAc,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,EAClE,GAAG;QACL,CAAC,CAAC,UAAU,SAAS,CAAC,KAAK,oBACvB,OAAO,EAAE,UAAU;YACnB,KAAK,SAAS,CAAC,KAAK,cAAc,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,EAClE,GAAG,CAAC;IAER,MAAM,qBAAqB,GAAG,GAAG,SAAS,CAAC,KAAK,wBAAwB,CAAC;IAEzE,OAAO;EACP,oBAAoB;EACpB,wBAAwB;;qBAEL,kBAAkB;;QAE/B,SAAS,CAAC,KAAK;;EAErB,SAAS,CAAC,KAAK;;;2DAG0C,SAAS,CAAC,KAAK;;;;;;;IAOtE,qBAAqB;;;iBAGR,SAAS,CAAC,KAAK;CAC/B,CAAC;AACF,CAAC","sourcesContent":["import {\n checkFileExists,\n getUserFileExtension,\n} from \"../../../../helpers/fs.helpers\";\nimport { TemplateOptions } from \"../../template-generators\";\n\nexport function generateRouterTemplate(options: TemplateOptions): string {\n const { modelName, imports } = options;\n\n if (!modelName)\n throw new Error(\"Module name is required for router template\");\n\n const ext = getUserFileExtension();\n const controllerPath =\n imports?.controller || `./${modelName.kebab}.controller.${ext}`;\n\n const routerConfigTsType =\n ext === \"ts\"\n ? `: RouterConfig<${[\"file-upload\", \"auth\"].includes(modelName.kebab) ? modelName.kebab : \"prisma\"}>`\n : \"\";\n const routerConfigTsTypeImport =\n ext === \"ts\" ? \"import { RouterConfig } from 'arkos'\" : \"\";\n\n const controllerExists = checkFileExists(controllerPath);\n\n const controllerImportLine = controllerExists\n ? `import ${modelName.camel}Controller from \"${\n imports?.controller ||\n `./${modelName.kebab}.controller${ext === \"js\" ? \".\" + \"js\" : \"\"}`\n }\"`\n : `import ${modelName.camel}Controller from \"${\n imports?.controller ||\n `./${modelName.kebab}.controller${ext === \"js\" ? \".\" + \"js\" : \"\"}`\n }\"`;\n\n const controllerHandlerLine = `${modelName.camel}Controller.someHandler`;\n\n return `import { ArkosRouter } from 'arkos'\n${controllerImportLine}\n${routerConfigTsTypeImport}\n\nexport const config${routerConfigTsType} = { }\n\nconst ${modelName.camel}Router = ArkosRouter()\n\n${modelName.camel}Router.get(\n {\n path: \"/custom-endpoint\",\n authentication: { action: \"CustomAction\", resource: \"${modelName.kebab}\" },\n validation: {},\n experimental: {\n openapi: {},\n // uploads: {}\n }\n },\n ${controllerHandlerLine}\n)\n\nexport default ${modelName.camel}Router\n`;\n}\n"]}
1
+ {"version":3,"file":"router-template.js","sourceRoot":"","sources":["../../../../../../../src/utils/cli/utils/template-generator/templates/router-template.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,oBAAoB,GACrB,MAAM,gCAAgC,CAAC;AAGxC,MAAM,UAAU,sBAAsB,CAAC,OAAwB;IAC7D,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAEvC,IAAI,CAAC,SAAS;QACZ,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAEjE,MAAM,GAAG,GAAG,oBAAoB,EAAE,CAAC;IACnC,MAAM,cAAc,GAClB,OAAO,EAAE,UAAU,IAAI,KAAK,SAAS,CAAC,KAAK,eAAe,GAAG,EAAE,CAAC;IAElE,MAAM,kBAAkB,GACtB,GAAG,KAAK,IAAI;QACV,CAAC,CAAC,kBAAkB,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,GAAG;QACvG,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,wBAAwB,GAC5B,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE7D,MAAM,gBAAgB,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC;IAEzD,MAAM,oBAAoB,GAAG,gBAAgB;QAC3C,CAAC,CAAC,UAAU,SAAS,CAAC,KAAK,oBACvB,OAAO,EAAE,UAAU;YACnB,KAAK,SAAS,CAAC,KAAK,cAAc,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,EAClE,GAAG;QACL,CAAC,CAAC,UAAU,SAAS,CAAC,KAAK,oBACvB,OAAO,EAAE,UAAU;YACnB,KAAK,SAAS,CAAC,KAAK,cAAc,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,EAClE,GAAG,CAAC;IAER,MAAM,qBAAqB,GAAG,GAAG,SAAS,CAAC,KAAK,wBAAwB,CAAC;IAEzE,OAAO;EACP,oBAAoB;EACpB,wBAAwB;;qBAEL,kBAAkB;;QAE/B,SAAS,CAAC,KAAK;;EAErB,SAAS,CAAC,KAAK;;;2DAG0C,SAAS,CAAC,KAAK;;;;;;;IAOtE,qBAAqB;;;iBAGR,SAAS,CAAC,KAAK;CAC/B,CAAC;AACF,CAAC","sourcesContent":["import {\n checkFileExists,\n getUserFileExtension,\n} from \"../../../../helpers/fs.helpers\";\nimport { TemplateOptions } from \"../../template-generators\";\n\nexport function generateRouterTemplate(options: TemplateOptions): string {\n const { modelName, imports } = options;\n\n if (!modelName)\n throw new Error(\"Module name is required for router template\");\n\n const ext = getUserFileExtension();\n const controllerPath =\n imports?.controller || `./${modelName.kebab}.controller.${ext}`;\n\n const routerConfigTsType =\n ext === \"ts\"\n ? `: RouterConfig<${[\"file-upload\", \"auth\"].includes(modelName.kebab) ? modelName.kebab : '\"prisma\"'}>`\n : \"\";\n const routerConfigTsTypeImport =\n ext === \"ts\" ? \"import { RouterConfig } from 'arkos'\" : \"\";\n\n const controllerExists = checkFileExists(controllerPath);\n\n const controllerImportLine = controllerExists\n ? `import ${modelName.camel}Controller from \"${\n imports?.controller ||\n `./${modelName.kebab}.controller${ext === \"js\" ? \".\" + \"js\" : \"\"}`\n }\"`\n : `import ${modelName.camel}Controller from \"${\n imports?.controller ||\n `./${modelName.kebab}.controller${ext === \"js\" ? \".\" + \"js\" : \"\"}`\n }\"`;\n\n const controllerHandlerLine = `${modelName.camel}Controller.someHandler`;\n\n return `import { ArkosRouter } from 'arkos'\n${controllerImportLine}\n${routerConfigTsTypeImport}\n\nexport const config${routerConfigTsType} = { }\n\nconst ${modelName.camel}Router = ArkosRouter()\n\n${modelName.camel}Router.get(\n {\n path: \"/custom-endpoint\",\n authentication: { action: \"CustomAction\", resource: \"${modelName.kebab}\" },\n validation: {},\n experimental: {\n openapi: {},\n // uploads: {}\n }\n },\n ${controllerHandlerLine}\n)\n\nexport default ${modelName.camel}Router\n`;\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":"AAEA,OAAO,SAAS,MAAM,6BAA6B,CAAC;AACpD,OAAO,EACL,mBAAmB,GAEpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,kBAAkB,MAAM,wBAAwB,CAAC;AAOxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4DAA4D,CAAC;AAetG,MAAM,OAAO,yBAAyB;IAAtC;QACE,WAAM,GAAG,kBAAkB,CAAC,KAAK,EAAE,CAAC;IA8uBtC,CAAC;IAzuBC,oBAAoB,CAAC,MAA8B;QACjD,MAAM,EACJ,SAAS,EACT,WAAW,EACX,iBAAiB,GAAG;YAClB,OAAO;YACP,OAAO;YACP,QAAQ;YACR,OAAO;YACP,UAAU;YACV,gBAAgB;YAChB,QAAQ;YACR,WAAW;YACX,YAAY;YACZ,QAAQ;YACR,WAAW;YACX,YAAY;YACZ,OAAO;YACP,SAAS;YACT,UAAU;SACX,GACF,GAAG,MAAM,CAAC;QAEX,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;QACxD,MAAM,YAAY,GAAG,gBAAgB,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC;QAC5D,MAAM,kBAAkB,GAAG,gBAAgB,EAAE,kBAAkB,IAAI,EAAE,CAAC;QACtE,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QACtE,MAAM,YAAY,GAAG,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;QAEvE,IAAI,WAAW,EAAE,OAAO,EAAE,MAAM,IAAI,WAAW,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ;YACvE,OAAO,EAAE,CAAC;QAEZ,IAAI,YAAY,EAAE,OAAO,KAAK,IAAI;YAAE,OAAO,EAAE,CAAC;QAE9C,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CACnC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,SAAS,CAAC,WAAW,EAAE,CACxD,CAAC;QACF,IAAI,CAAC,KAAK,IAAI,CAAC,YAAY;YAAE,OAAO,EAAE,CAAC;QAEvC,MAAM,OAAO,GAAkC,EAAE,CAAC;QAElD,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,CAAC,mBAAmB,CACtB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,MAAM,CAAE,EAChE,OAAO,EACP,WAAW,EACX,iBAAiB,EACjB,kBAAiD,CAClD,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,KAAK;gBACP,IAAI,CAAC,mBAAmB,CACtB,KAAK,EACL,OAAO,EACP,WAAW,EACX,iBAAiB,EACjB,kBAA6C,EAC7C,YAAY,CACb,CAAC;QACN,CAAC;QAED,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC;IACxB,CAAC;IAKO,mBAAmB,CACzB,KAAkB,EAClB,OAAsC,EACtC,WAAwB,EACxB,iBAA6C,EAC7C,YAA0C,EAC1C,YAA2B;QAE3B,MAAM,SAAS,GAAG,MAAM,CAAC;QAGzB,IAAI,CAAC,WAAW,EAAE,cAAc;YAAE,OAAO,OAAO,CAAC;QAGjD,IACE,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC;YACnC,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,YAAY,CAAC;YAC/C,CAAC,wBAAwB,CAAC,OAAO,EAAE,SAAS,EAAE,WAAW,CAAC,EAC1D,CAAC;YACD,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;QACjE,CAAC;QAGD,IACE,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACpC,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,YAAY,CAAC;YAChD,CAAC,wBAAwB,CAAC,QAAQ,EAAE,SAAS,EAAE,WAAW,CAAC,EAC3D,CAAC;YACD,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,oBAAoB,CACjD,KAAK,EACL,YAAY,EAAE,MAAM,CACrB,CAAC;QACJ,CAAC;QAGD,IACE,iBAAiB,CAAC,QAAQ,CAAC,UAAU,CAAC;YACtC,CAAC,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,YAAY,CAAC;YAClD,CAAC,wBAAwB,CAAC,UAAU,EAAE,SAAS,EAAE,WAAW,CAAC,EAC7D,CAAC;YACD,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,sBAAsB,CACrD,KAAK,EACL,YAAY,EAAE,QAAQ,CACvB,CAAC;QACJ,CAAC;QAGD,IACE,iBAAiB,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YAC5C,CAAC,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,EAAE,YAAY,CAAC;YACxD,CAAC,wBAAwB,CAAC,gBAAgB,EAAE,SAAS,EAAE,WAAW,CAAC,EACnE,CAAC;YACD,OAAO,CAAC,sBAAsB,CAAC,GAAG,IAAI,CAAC,4BAA4B,CACjE,KAAK,EACL,YAAY,EAAE,cAAc,CAC7B,CAAC;QACJ,CAAC;QAED,IACE,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC;YACnC,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,YAAY,CAAC;YAC/C,CAAC,wBAAwB,CAAC,OAAO,EAAE,SAAS,EAAE,WAAW,CAAC,EAC1D,CAAC;YACD,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,sBAAsB,CAClD,KAAK,EACL,YAAY,EAAE,KAAK,IAAI,EAAE,EACzB,SAAS,CACV,CAAC;QACJ,CAAC;IACH,CAAC;IAKO,mBAAmB,CACzB,KAAkB,EAClB,OAAsC,EACtC,WAAwB,EACxB,iBAA6C,EAC7C,YAAsC,EACtC,YAAgC;QAEhC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC;QAE7B,MAAM,yBAAyB,GAAG,CAChC,SAAiB,EACjB,SAAiB,EACjB,EAAE;YACF,MAAM,MAAM,GACV,WAAW,CAAC,UAAU,EAAE,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;YAEhE,MAAM,YAAY,GAAG,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC;YACxE,MAAM,iBAAiB,GAAG,wBAAwB,CAChD,YAAY,EACZ,SAAS,EACT,WAAW,CACZ,CAAC;YAEF,IAAI,iBAAiB;gBAAE,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,EAAE,CAAC;iBAC7D,CAAC;gBACJ,MAAM,cAAc,GAAG,GAAG,SAAS,GAAG,SAAS,aAAa,CAAC;gBAE7D,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;oBAC7B,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;wBAC3B,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,oBAAoB,CACjD,KAAK,EACL,IAAI,CAAC,yBAAyB,CAAC,YAAY,EAAE,WAAW,CAAC,CAC1D,CAAC;oBACJ,CAAC;yBAAM,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;wBAClC,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,oBAAoB,CACjD,KAAK,EACL,IAAI,CAAC,yBAAyB,CAAC,YAAY,EAAE,WAAW,CAAC,CAC1D,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAED,OAAO,cAAc,CAAC;YACxB,CAAC;QACH,CAAC,CAAC;QAEF,IACE,iBAAiB,CAAC,QAAQ,CAAC,WAAW,CAAC;YACvC,CAAC,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,YAAY,CAAC;YACnD,CAAC,wBAAwB,CAAC,WAAW,EAAE,SAAS,EAAE,WAAW,CAAC,EAC9D,CAAC;YACD,OAAO,CAAC,SAAS,SAAS,aAAa,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAClE,KAAK,EACL,IAAI,CAAC,yBAAyB,CAAC,YAAY,EAAE,WAAW,CAAC,CAC1D,CAAC;QACJ,CAAC;QAED,IACE,iBAAiB,CAAC,QAAQ,CAAC,YAAY,CAAC;YACxC,CAAC,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE,YAAY,CAAC;YACpD,CAAC,wBAAwB,CAAC,YAAY,EAAE,SAAS,EAAE,WAAW,CAAC,EAC/D,CAAC;YACD,MAAM,aAAa,GAAG,yBAAyB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YACrE,OAAO,CAAC,aAAa,SAAS,aAAa,CAAC,GAAG;gBAC7C,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,wBAAwB,aAAa,EAAE,EAAE;aACzD,CAAC;QACJ,CAAC;QAED,IACE,iBAAiB,CAAC,QAAQ,CAAC,WAAW,CAAC;YACvC,CAAC,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,YAAY,CAAC;YACnD,CAAC,wBAAwB,CAAC,WAAW,EAAE,SAAS,EAAE,WAAW,CAAC,EAC9D,CAAC;YACD,OAAO,CAAC,SAAS,SAAS,aAAa,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAClE,KAAK,EACL,IAAI,CAAC,yBAAyB,CAAC,YAAY,EAAE,WAAW,CAAC,CAC1D,CAAC;QACJ,CAAC;QAED,IACE,iBAAiB,CAAC,QAAQ,CAAC,YAAY,CAAC;YACxC,CAAC,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE,YAAY,CAAC;YACpD,CAAC,wBAAwB,CAAC,YAAY,EAAE,SAAS,EAAE,WAAW,CAAC,EAC/D,CAAC;YACD,OAAO,CAAC,aAAa,SAAS,aAAa,CAAC,GAAG,IAAI,CAAC,oBAAoB,CACtE,KAAK,EACL,IAAI,CAAC,yBAAyB,CAAC,YAAY,EAAE,WAAW,CAAC,CAC1D,CAAC;QACJ,CAAC;QACD,IACE,iBAAiB,CAAC,QAAQ,CAAC,SAAS,CAAC;YACrC,CAAC,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,YAAY,CAAC;YACjD,CAAC,wBAAwB,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,EAC5D,CAAC;YACD,OAAO,CAAC,UAAU,SAAS,aAAa,CAAC,GAAG,IAAI,CAAC,sBAAsB,CACrE,KAAK,EACL,IAAI,CAAC,yBAAyB,CAAC,YAAY,EAAE,SAAS,CAAC,EACvD,SAAS,CACV,CAAC;QACJ,CAAC;QAED,IACE,iBAAiB,CAAC,QAAQ,CAAC,UAAU,CAAC;YACtC,CAAC,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,YAAY,CAAC;YAClD,CAAC,wBAAwB,CAAC,UAAU,EAAE,SAAS,EAAE,WAAW,CAAC,EAC7D,CAAC;YACD,OAAO,CAAC,WAAW,SAAS,aAAa,CAAC,GAAG;gBAC3C,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,IAAI,CAAC,sBAAsB,CAChC,KAAK,EACL,IAAI,CAAC,yBAAyB,CAAC,YAAY,EAAE,UAAU,CAAC,EACxD,UAAU,CACX;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAKO,oBAAoB,CAC1B,KAAkB,EAClB,CAAsB;QAEtB,MAAM,UAAU,GAA0C,EAAE,CAAC;QAC7D,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,gBAAgB,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;QAEvE,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,MAAM;YACrC,gBAAgB,CAAC,IAAI,CACnB,OAAO,EACP,MAAM,EACN,UAAU,EACV,SAAS,EACT,aAAa,EACb,mBAAmB,EACnB,sBAAsB,EACtB,aAAa,CACd,CAAC;QAEJ,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjC,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CACpC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,eAAe,KAAK,KAAK,CAAC,IAAI,CAClD,CAAC;YACF,IAAI,KAAK,CAAC,IAAI,IAAI,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,YAAY;gBACrE,SAAS;YAEX,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;oBACnB,MAAM,eAAe,GAAG,kBAAkB,CAAC,MAAM,CAAC,IAAI,CACpD,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CACtC,CAAC;oBAEH,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG;wBACvB,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,CAAC,KAAK,CAAC,qBAAqB,IAAI,IAAI,CAAC,EAAE;gCACrC,IAAI,EAAE,IAAI,CAAC,yBAAyB,CAClC,eAAe,EAAE,MAAM,CAAC,IAAI,CAC1B,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,qBAAqB,CACxD,EAAE,IAAI,IAAI,QAAQ,CACpB;6BACF;yBACF;qBACF,CAAC;oBAEF,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS;wBACvD,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC9B,CAAC;gBACD,SAAS;YACX,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;YACtD,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;YAGlC,IACE,CAAC,KAAK,CAAC,UAAU;gBACjB,KAAK,CAAC,YAAY,KAAK,SAAS;gBAChC,CAAC,KAAK,CAAC,OAAO,EACd,CAAC;gBACD,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,UAAU;YACV,QAAQ;SACT,CAAC;IACJ,CAAC;IAKO,oBAAoB,CAC1B,KAAkB,EAClB,CAAsB;QAEtB,MAAM,UAAU,GAA0C,EAAE,CAAC;QAC7D,MAAM,cAAc,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;QAErE,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjC,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CACpC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,eAAe,KAAK,KAAK,CAAC,IAAI,CAClD,CAAC;YACF,IAAI,KAAK,CAAC,IAAI,IAAI,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,YAAY;gBACnE,SAAS;YAEX,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;oBACnB,MAAM,eAAe,GAAG,kBAAkB,CAAC,MAAM,CAAC,IAAI,CACpD,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CACtC,CAAC;oBAEH,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG;wBACvB,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,CAAC,KAAK,CAAC,qBAAqB,IAAI,IAAI,CAAC,EAAE;gCACrC,IAAI,EAAE,IAAI,CAAC,yBAAyB,CAClC,eAAe,EAAE,MAAM,CAAC,IAAI,CAC1B,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,qBAAqB,CACxD,EAAE,IAAI,IAAI,QAAQ,CACpB;6BACF;yBACF;qBACF,CAAC;gBACJ,CAAC;gBAED,SAAS;YACX,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;YACtD,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;QACpC,CAAC;QAED,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,UAAU;YACV,QAAQ,EAAE,EAAE;SACb,CAAC;IACJ,CAAC;IAKO,sBAAsB,CAC5B,KAAkB,EAClB,OAA4B,EAC5B,CAAyB;QAEzB,MAAM,UAAU,GAA0C,EAAE,CAAC;QAC7D,MAAM,QAAQ,GAAa,EAAE,CAAC;QAG9B,MAAM,YAAY,GAAG,OAAO,EAAE,MAAM,CAAC;QACrC,MAAM,aAAa,GAAG,OAAO,EAAE,IAAI,CAAC;QACpC,MAAM,gBAAgB,GAAG,OAAO,EAAE,OAAO,CAAC;QAE1C,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YAEjC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;gBAAE,SAAS;YAGxC,IAAI,aAAa,IAAI,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YAGzD,IAAI,YAAY,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YAGxD,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAErC,IAAI,gBAAgB,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBACnC,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAC3C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAC7B,CAAC;oBAEF,IAAI,aAAa,EAAE,CAAC;wBAClB,MAAM,cAAc,GAAG,IAAI,CAAC,4BAA4B,CACtD,aAAa,EACb,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAC7B,CAAC;wBACF,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO;4BACpC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE;4BAC1C,CAAC,CAAC,cAAc,CAAC;oBACrB,CAAC;gBACH,CAAC;gBACD,SAAS;YACX,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;YACtD,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;YAGlC,IAAI,CAAC,KAAK,CAAC,UAAU;gBAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnD,CAAC;QAED,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,UAAU;YACV,QAAQ;SACT,CAAC;IACJ,CAAC;IAKO,4BAA4B,CAClC,KAAkB,EAClB,cAAmB;QAEnB,MAAM,UAAU,GAA0C,EAAE,CAAC;QAC7D,MAAM,QAAQ,GAAa,EAAE,CAAC;QAG9B,MAAM,YAAY,GAAG,cAAc,EAAE,MAAM,CAAC;QAC5C,MAAM,cAAc,GAAG,cAAc,EAAE,OAAO,CAAC;QAE/C,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YAEjC,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBAClD,SAAS;YACX,CAAC;YAED,IAAI,YAAY,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC9C,SAAS;YACX,CAAC;YAED,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrC,IAAI,cAAc,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBACjC,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAC3C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAC7B,CAAC;oBACF,IAAI,aAAa,EAAE,CAAC;wBAClB,MAAM,YAAY,GAAG,IAAI,CAAC,4BAA4B,CACpD,aAAa,EACb,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAC3B,CAAC;wBACF,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO;4BACpC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE;4BACxC,CAAC,CAAC,YAAY,CAAC;oBACnB,CAAC;gBACH,CAAC;gBACD,SAAS;YACX,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;YACtD,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;YAElC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;gBACtB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,UAAU;YACV,QAAQ;SACT,CAAC;IACJ,CAAC;IAKO,mBAAmB,CAAC,WAAyB;QACnD,MAAM,cAAc,GAClB,WAAW,EAAE,cAAc,EAAE,KAAK,EAAE,gBAAgB,IAAI,EAAE,CAAC;QAG7D,MAAM,cAAc,GAAG,CAAC,KAAa,EAAE,EAAE;YACvC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC;YAChE,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QAGF,MAAM,UAAU,GAAuB;YACrC,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,SAAS,EAAE,CAAC;iBACb;aACF;YACD,QAAQ,EAAE,CAAC,UAAU,CAAC;SACvB,CAAC;QAGF,cAAc,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC/B,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;YAC1C,UAAU,CAAC,UAAW,CAAC,WAAW,CAAC,GAAG;gBACpC,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,QAAQ;gBAChB,WAAW,EAAE,mBAAmB,KAAK,EAAE;aACxC,CAAC;QACJ,CAAC,CAAC,CAAC;QAGH,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,oBAAoB,GAAG,cAAc,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAEhE,OAAO;gBACL,GAAG,UAAU;gBACb,KAAK,EAAE,oBAAoB,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;oBACrC,QAAQ,EAAE,CAAC,GAAG,UAAU,CAAC,QAAS,CAAC;iBACpC,CAAC,CAAC;aACJ,CAAC;QACJ,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IACO,oBAAoB,CAC1B,KAAkB,EAClB,OAA6B;QAG7B,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;QAErE,MAAM,gBAAgB,GAAG;YACvB,OAAO;YACP,MAAM;YACN,UAAU;YACV,SAAS;YACT,aAAa;YACb,mBAAmB;YACnB,sBAAsB;YACtB,aAAa;SACd,CAAC;QACF,gBAAgB,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACjC,OAAO,YAAY,EAAE,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,OAAO,YAAY,CAAC;IACtB,CAAC;IAEO,sBAAsB,CAC5B,KAAkB,EAClB,OAA6B;QAG7B,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;QAGrE,MAAM,gBAAgB,GAAG;YACvB,OAAO;YACP,MAAM;YACN,UAAU;YACV,SAAS;YACT,aAAa;YACb,mBAAmB;YACnB,sBAAsB;YACtB,UAAU;YACV,aAAa;SACd,CAAC;QACF,gBAAgB,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACjC,OAAO,YAAY,EAAE,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,OAAO,YAAY,CAAC;IACtB,CAAC;IAEO,4BAA4B,CAClC,CAAc,EACd,EAAwB;QAExB,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,eAAe,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACnC,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE;aAC9C;YACD,QAAQ,EAAE,CAAC,iBAAiB,EAAE,aAAa,CAAC;SAC7C,CAAC;IACJ,CAAC;IAKO,yBAAyB,CAC/B,kBAA0E,EAC1E,MAAiC;QAEjC,IAAI,CAAC,kBAAkB,IAAI,CAAC,MAAM,EAAE,CAAC;YACnC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,OAAO,GAAG,kBAAyB,CAAC;QAC1C,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAG5C,IAAI,aAAa,GAAG,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC;QAG/C,IAAI,OAAO,CAAC,MAAM;YAChB,aAAa,GAAG,SAAS,CAAC,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAG3D,MAAM,cAAc,GAAG,IAAI,CAAC,0BAA0B,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACxE,IAAI,cAAc;YAChB,aAAa,GAAG,SAAS,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;QAG3D,IAAI,aAAa;YAAE,aAAa,GAAG,SAAS,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;QAE3E,OAAO,aAAa,CAAC;IACvB,CAAC;IAKO,0BAA0B,CAChC,OAAY,EACZ,MAAgC;QAEhC,MAAM,SAAS,GAAgC;YAC7C,IAAI,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC;YAC7B,MAAM,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC;YACnC,MAAM,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC;YACnC,MAAM,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC;YACnC,IAAI,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,CAAC;YAC5D,OAAO,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC;YACnC,QAAQ,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC;SACvC,CAAC;QAEF,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7D,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBACnD,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,kBAAkB,CACxB,QAAgB,EAChB,YAAgC;QAEhC,IAAI,CAAC,YAAY,EAAE,OAAO;YAAE,OAAO,KAAK,CAAC;QAEzC,IAAI,OAAO,YAAY,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC9C,OAAO,YAAY,CAAC,OAAO,CAAC;QAC9B,CAAC;QAED,OAAO,CACL,YAAY,CAAC,OAAO,CAAC,QAA6C,CAAC;YACnE,KAAK,CACN,CAAC;IACJ,CAAC;IAEO,eAAe,CAAC,QAAgB;QACtC,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IAC7D,CAAC;IAEO,wBAAwB,CAAC,KAAkB;QAEjD,MAAM,QAAQ,GAAG,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAuB,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAExD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,QAAQ,CAAC,IAAI,GAAG,OAAO,CAAC;YACxB,QAAQ,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACxE,CAAC;QAED,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACrC,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC,YAAY,CAAC;QACxC,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC9B,QAAQ,CAAC,MAAM,GAAG,WAAW,CAAC;QAChC,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC;YACrE,IAAI,OAAO,EAAE,CAAC;gBACZ,QAAQ,CAAC,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;YACjC,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,yBAAyB,CAAC,UAAkB;QAClD,MAAM,OAAO,GAA8B;YACzC,MAAM,EAAE,QAAQ;YAChB,GAAG,EAAE,QAAQ;YACb,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,SAAS;YAClB,QAAQ,EAAE,QAAQ;YAClB,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,QAAQ;SAChB,CAAC;QAEF,IAAI,OAAO,CAAC,UAAU,CAAC;YAAE,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC;QAEpD,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;YAAE,OAAO,QAAQ,CAAC;QAE7C,IAAI,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC;YAAE,OAAO,QAAQ,CAAC;QAEtD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,MAAM,CAAC,QAAgB;QAC7B,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IAC5D,CAAC;CACF;AAED,MAAM,yBAAyB,GAAG,IAAI,yBAAyB,EAAE,CAAC;AAElE,eAAe,yBAAyB,CAAC","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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "arkos",
3
- "version": "1.4.1-canary.7",
3
+ "version": "1.4.2-beta",
4
4
  "description": "The Express & Prisma RESTful Framework",
5
5
  "main": "dist/cjs/exports/index.js",
6
6
  "module": "dist/esm/exports/index.js",