arkos 1.6.7-beta → 1.6.8-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 (32) hide show
  1. package/cli.js +6 -8
  2. package/dist/cjs/modules/email/email.service.js +4 -2
  3. package/dist/cjs/modules/email/email.service.js.map +1 -1
  4. package/dist/cjs/modules/file-upload/file-upload.router.js +2 -2
  5. package/dist/cjs/modules/file-upload/file-upload.router.js.map +1 -1
  6. package/dist/cjs/utils/cli/dev.js +4 -17
  7. package/dist/cjs/utils/cli/dev.js.map +1 -1
  8. package/dist/cjs/utils/cli/prisma-generate.js +51 -36
  9. package/dist/cjs/utils/cli/prisma-generate.js.map +1 -1
  10. package/dist/cjs/utils/cli/utils/cli.helpers.js +1 -1
  11. package/dist/cjs/utils/cli/utils/template-generator/templates/router-template.js.map +1 -1
  12. package/dist/cjs/utils/helpers/arkos-config.helpers.js +5 -2
  13. package/dist/cjs/utils/helpers/arkos-config.helpers.js.map +1 -1
  14. package/dist/cjs/utils/prisma/prisma-schema-parser.js +6 -0
  15. package/dist/cjs/utils/prisma/prisma-schema-parser.js.map +1 -1
  16. package/dist/esm/modules/email/email.service.js +4 -2
  17. package/dist/esm/modules/email/email.service.js.map +1 -1
  18. package/dist/esm/modules/file-upload/file-upload.router.js +2 -2
  19. package/dist/esm/modules/file-upload/file-upload.router.js.map +1 -1
  20. package/dist/esm/utils/cli/dev.js +4 -17
  21. package/dist/esm/utils/cli/dev.js.map +1 -1
  22. package/dist/esm/utils/cli/prisma-generate.js +50 -36
  23. package/dist/esm/utils/cli/prisma-generate.js.map +1 -1
  24. package/dist/esm/utils/cli/utils/cli.helpers.js +1 -1
  25. package/dist/esm/utils/cli/utils/template-generator/templates/router-template.js.map +1 -1
  26. package/dist/esm/utils/helpers/arkos-config.helpers.js +5 -2
  27. package/dist/esm/utils/helpers/arkos-config.helpers.js.map +1 -1
  28. package/dist/esm/utils/prisma/prisma-schema-parser.js +6 -0
  29. package/dist/esm/utils/prisma/prisma-schema-parser.js.map +1 -1
  30. package/dist/types/modules/email/email.service.d.ts +2 -0
  31. package/dist/types/utils/prisma/prisma-schema-parser.d.ts +1 -0
  32. package/package.json +48 -25
@@ -7,14 +7,17 @@ import { importModule } from "./global.helpers.js";
7
7
  import { getUserFileExtension, crd } from "./fs.helpers.js";
8
8
 
9
9
  let definedArkosConfig = {};
10
+ const configFilename = `arkos.config.${fsHelpers.getUserFileExtension()}`;
10
11
  try {
11
12
  definedArkosConfig = process.env.NO_CLI === "true" ? await importModule(`${crd()}/arkos.config.${getUserFileExtension()}`) : () => {};
12
13
  }
13
14
  catch (err) {
14
- if (err.message.toLowerCase().includes("cannot find module"))
15
- sheu.warn(`Using default configs, because arkos.config.${fsHelpers.getUserFileExtension()} was not found`, {
15
+ if (err.message.toLowerCase().includes(`${configFilename}'`))
16
+ sheu.warn(`Using default configs, because ${configFilename} was not found`, {
16
17
  timestamp: true,
17
18
  });
19
+ else
20
+ throw err;
18
21
  }
19
22
  export function isUsingAuthentication() {
20
23
  const { authentication } = getArkosConfig();
@@ -1 +1 @@
1
- {"version":3,"file":"arkos-config.helpers.js","sourceRoot":"","sources":["../../../../src/utils/helpers/arkos-config.helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAmB,MAAM,kBAAkB,CAAC;AACjE,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,SAAS,MAAM,cAAc,CAAC;AACrC,OAAO,KAAK,SAAS,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,CAAC,wCAAwC,CAAC,CAAC;AAE3C,IAAI,kBAAkB,GAAQ,EAAE,CAAC;AAEjC,IAAI,CAAC;IACH,kBAAkB,GAAG,0BAA0B,CAAC;AAClD,CAAC;AAAC,OAAO,GAAQ,EAAE,CAAC;IAClB,IAAI,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QAC1D,IAAI,CAAC,IAAI,CACP,+CAA+C,SAAS,CAAC,oBAAoB,EAAE,gBAAgB,EAC/F;YACE,SAAS,EAAE,IAAI;SAChB,CACF,CAAC;AACN,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,MAAM,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAAC;IAE5C,OAAO,cAAc,EAAE,IAAI,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,MAAM,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAAC;IAE5C,OAAO,cAAc,EAAE,IAAI,IAAI,cAAc,EAAE,OAAO,KAAK,KAAK,CAAC;AACnE,CAAC;AAOD,MAAM,UAAU,cAAc;IAC5B,MAAM,MAAM,GACV,OAAO,kBAAkB,KAAK,QAAQ;QACpC,CAAC,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE;QAC9B,CAAC,CAAE,kBAA0B,EAAE,OAAO,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3E,MAAM,UAAU,GAAG,gBAAgB,SAAS,CAAC,oBAAoB,EAAE,EAAE,CAAC;IAEtE,IACG,MAAc,CAAC,QAAQ,KAAK,cAAc;QAC3C,OAAO,IAAI,IAAI,WAAW;QAC1B,OAAO,kBAAkB,KAAK,QAAQ,EACtC,CAAC;QACD,IAAI,CAAC,KAAK,CACR,0BAA0B,UAAU,8GAA8G,UAAU;;;;;;;CAOjK,CACI,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,YAAY,CAAC,MAAM,CAAQ,CAAC;AACrC,CAAC;AAOD,MAAM,UAAU,YAAY;IAC1B,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,MAAM,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAChC,MAAM,qBAAqB,GAAG,uBAAuB,EAAE,CAAC;IAExD,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU;QAC7B,MAAM,SAAS,CACb,gHAAgH,CACjH,CAAC;IAEJ,IACE,qBAAqB;QACrB,YAAY,EAAE;QACd,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU;QACvB,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,EAAE,MAAM;QAEnC,MAAM,SAAS,CACb,qHAAqH,CACtH,CAAC;IAEJ,IAAI,qBAAqB,IAAI,CAAC,iBAAiB,EAAE;QAC/C,MAAM,SAAS,CACb,2LAA2L,CAC5L,CAAC;AACN,CAAC","sourcesContent":["import { defineConfig, UserArkosConfig } from \"../define-config\";\nimport sheu from \"../sheu\";\nimport ExitError from \"./exit-error\";\nimport * as fsHelpers from \"./fs.helpers\";\nimport { getPrismaInstance } from \"./prisma.helpers\";\n(\"ReplaceWithNeededImportsForArkosConfig\"); // This will be filled by post build script\n\nlet definedArkosConfig: any = {};\n\ntry {\n definedArkosConfig = \"ReplaceWithDynamicImport\"; // This will be filled by post build script\n} catch (err: any) {\n if (err.message.toLowerCase().includes(\"cannot find module\"))\n sheu.warn(\n `Using default configs, because arkos.config.${fsHelpers.getUserFileExtension()} was not found`,\n {\n timestamp: true,\n }\n );\n}\n\nexport function isUsingAuthentication() {\n const { authentication } = getArkosConfig();\n\n return authentication?.mode;\n}\n\nexport function isAuthenticationEnabled() {\n const { authentication } = getArkosConfig();\n\n return authentication?.mode && authentication?.enabled !== false;\n}\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(): UserArkosConfig {\n const config =\n typeof definedArkosConfig === \"string\"\n ? { __loader: \"defineConfig\" }\n : (definedArkosConfig as any)?.default || { __loader: \"defineConfig\" };\n const configFile = `arkos.config.${fsHelpers.getUserFileExtension()}`;\n\n if (\n (config as any).__loader !== \"defineConfig\" &&\n typeof jest == \"undefined\" &&\n typeof definedArkosConfig === \"object\"\n ) {\n sheu.error(\n `From v1.6 config under ${configFile} must be wrapped in \\`defineConfig()\\` function from \\`arkos/config\\`. You can do the following under your ${configFile}:\n\nimport { defineConfig } from \"arkos/config\"\n\nconst config = defineConfig({ ... })\n\nexport default config\n`\n );\n process.exit(1);\n }\n\n return defineConfig(config) as any;\n}\n\n/**\n * Returns true if application is being run through `arkos start` after `arkos build`\n *\n * @since 1.5.16-beta\n */\nexport function isProduction() {\n return process.env.ARKOS_BUILD === \"true\";\n}\n\nexport function validateArkosConfig() {\n const config = getArkosConfig();\n const authenticationEnabled = isAuthenticationEnabled();\n\n if (!config?.source?.entryPoint)\n throw ExitError(\n `Invalid value for 'arkosConfig.source.entryPoint', please pass a valid path from the current working directory`\n );\n\n if (\n authenticationEnabled &&\n isProduction() &&\n !process.env.JWT_SECRET &&\n !config.authentication?.jwt?.secret\n )\n throw ExitError(\n `Missing jwt secret in production, see https://www.arkosjs.com/docs/core-concepts/authentication/setup#configuration`\n );\n\n if (authenticationEnabled && !getPrismaInstance())\n throw ExitError(\n `Arkos' authentication system relies on prisma instance, please disabled your authentication or see https://www.arkosjs.com/docs/core-concepts/prisma-orm/setup to setup a prisma instance`\n );\n}\n"]}
1
+ {"version":3,"file":"arkos-config.helpers.js","sourceRoot":"","sources":["../../../../src/utils/helpers/arkos-config.helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAmB,MAAM,kBAAkB,CAAC;AACjE,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,SAAS,MAAM,cAAc,CAAC;AACrC,OAAO,KAAK,SAAS,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,CAAC,wCAAwC,CAAC,CAAC;AAE3C,IAAI,kBAAkB,GAAQ,EAAE,CAAC;AACjC,MAAM,cAAc,GAAG,gBAAgB,SAAS,CAAC,oBAAoB,EAAE,EAAE,CAAA;AAEzE,IAAI,CAAC;IACH,kBAAkB,GAAG,0BAA0B,CAAC;AAClD,CAAC;AAAC,OAAO,GAAQ,EAAE,CAAC;IAClB,IAAI,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,GAAG,cAAc,GAAG,CAAC;QAC1D,IAAI,CAAC,IAAI,CACP,kCAAkC,cAAc,gBAAgB,EAChE;YACE,SAAS,EAAE,IAAI;SAChB,CACF,CAAC;;QACC,MAAM,GAAG,CAAA;AAChB,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,MAAM,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAAC;IAE5C,OAAO,cAAc,EAAE,IAAI,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,MAAM,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAAC;IAE5C,OAAO,cAAc,EAAE,IAAI,IAAI,cAAc,EAAE,OAAO,KAAK,KAAK,CAAC;AACnE,CAAC;AAOD,MAAM,UAAU,cAAc;IAC5B,MAAM,MAAM,GACV,OAAO,kBAAkB,KAAK,QAAQ;QACpC,CAAC,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE;QAC9B,CAAC,CAAE,kBAA0B,EAAE,OAAO,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3E,MAAM,UAAU,GAAG,gBAAgB,SAAS,CAAC,oBAAoB,EAAE,EAAE,CAAC;IAEtE,IACG,MAAc,CAAC,QAAQ,KAAK,cAAc;QAC3C,OAAO,IAAI,IAAI,WAAW;QAC1B,OAAO,kBAAkB,KAAK,QAAQ,EACtC,CAAC;QACD,IAAI,CAAC,KAAK,CACR,0BAA0B,UAAU,8GAA8G,UAAU;;;;;;;CAOjK,CACI,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,YAAY,CAAC,MAAM,CAAQ,CAAC;AACrC,CAAC;AAOD,MAAM,UAAU,YAAY;IAC1B,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,MAAM,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAChC,MAAM,qBAAqB,GAAG,uBAAuB,EAAE,CAAC;IAExD,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU;QAC7B,MAAM,SAAS,CACb,gHAAgH,CACjH,CAAC;IAEJ,IACE,qBAAqB;QACrB,YAAY,EAAE;QACd,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU;QACvB,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,EAAE,MAAM;QAEnC,MAAM,SAAS,CACb,qHAAqH,CACtH,CAAC;IAEJ,IAAI,qBAAqB,IAAI,CAAC,iBAAiB,EAAE;QAC/C,MAAM,SAAS,CACb,2LAA2L,CAC5L,CAAC;AACN,CAAC","sourcesContent":["import { defineConfig, UserArkosConfig } from \"../define-config\";\nimport sheu from \"../sheu\";\nimport ExitError from \"./exit-error\";\nimport * as fsHelpers from \"./fs.helpers\";\nimport { getPrismaInstance } from \"./prisma.helpers\";\n(\"ReplaceWithNeededImportsForArkosConfig\"); // This will be filled by post build script\n\nlet definedArkosConfig: any = {};\nconst configFilename = `arkos.config.${fsHelpers.getUserFileExtension()}`\n\ntry {\n definedArkosConfig = \"ReplaceWithDynamicImport\"; // This will be filled by post build script\n} catch (err: any) {\n if (err.message.toLowerCase().includes(`${configFilename}'`))\n sheu.warn(\n `Using default configs, because ${configFilename} was not found`,\n {\n timestamp: true,\n }\n );\n else throw err\n}\n\nexport function isUsingAuthentication() {\n const { authentication } = getArkosConfig();\n\n return authentication?.mode;\n}\n\nexport function isAuthenticationEnabled() {\n const { authentication } = getArkosConfig();\n\n return authentication?.mode && authentication?.enabled !== false;\n}\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(): UserArkosConfig {\n const config =\n typeof definedArkosConfig === \"string\"\n ? { __loader: \"defineConfig\" }\n : (definedArkosConfig as any)?.default || { __loader: \"defineConfig\" };\n const configFile = `arkos.config.${fsHelpers.getUserFileExtension()}`;\n\n if (\n (config as any).__loader !== \"defineConfig\" &&\n typeof jest == \"undefined\" &&\n typeof definedArkosConfig === \"object\"\n ) {\n sheu.error(\n `From v1.6 config under ${configFile} must be wrapped in \\`defineConfig()\\` function from \\`arkos/config\\`. You can do the following under your ${configFile}:\n\nimport { defineConfig } from \"arkos/config\"\n\nconst config = defineConfig({ ... })\n\nexport default config\n`\n );\n process.exit(1);\n }\n\n return defineConfig(config) as any;\n}\n\n/**\n * Returns true if application is being run through `arkos start` after `arkos build`\n *\n * @since 1.5.16-beta\n */\nexport function isProduction() {\n return process.env.ARKOS_BUILD === \"true\";\n}\n\nexport function validateArkosConfig() {\n const config = getArkosConfig();\n const authenticationEnabled = isAuthenticationEnabled();\n\n if (!config?.source?.entryPoint)\n throw ExitError(\n `Invalid value for 'arkosConfig.source.entryPoint', please pass a valid path from the current working directory`\n );\n\n if (\n authenticationEnabled &&\n isProduction() &&\n !process.env.JWT_SECRET &&\n !config.authentication?.jwt?.secret\n )\n throw ExitError(\n `Missing jwt secret in production, see https://www.arkosjs.com/docs/core-concepts/authentication/setup#configuration`\n );\n\n if (authenticationEnabled && !getPrismaInstance())\n throw ExitError(\n `Arkos' authentication system relies on prisma instance, please disabled your authentication or see https://www.arkosjs.com/docs/core-concepts/prisma-orm/setup to setup a prisma instance`\n );\n}\n"]}
@@ -288,6 +288,7 @@ ${fieldDefinitions}${mapDirective}
288
288
  generatorProvider: "",
289
289
  datasourceProvider: "",
290
290
  datasourceUrl: "",
291
+ clientOutput: "",
291
292
  };
292
293
  const lines = this.getPrismaSchemasContent().split("\n");
293
294
  let inGenerator = false;
@@ -326,6 +327,11 @@ ${fieldDefinitions}${mapDirective}
326
327
  config.datasourceProvider = match[1];
327
328
  }
328
329
  }
330
+ if (inGenerator && trimmed.includes("output")) {
331
+ const match = trimmed.match(/output\s*=\s*"([^"]+)"/);
332
+ if (match)
333
+ config.clientOutput = match[1];
334
+ }
329
335
  if (inDatasource && trimmed.includes("url")) {
330
336
  const match = trimmed.match(/url\s*=\s*(env\("([^"]+)"\)|"([^"]+)")/);
331
337
  if (match) {
@@ -1 +1 @@
1
- {"version":3,"file":"prisma-schema-parser.js","sourceRoot":"","sources":["../../../../src/utils/prisma/prisma-schema-parser.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"path\";\nimport { PrismaSchema, PrismaModel, PrismaEnum, PrismaField } from \"./types\";\nimport { camelCase, pascalCase } from \"../helpers/change-case.helpers\";\nimport fs from \"fs\";\nimport sheu from \"../sheu\";\nimport { getArkosConfig } from \"../helpers/arkos-config.helpers\";\n\ninterface SchemaConfig {\n generatorProvider: string;\n datasourceProvider: string;\n datasourceUrl: string;\n}\n\n/**\n * A parser for Prisma schema files that extracts models, enums, and their properties.\n *\n * @example\n * ```typescript\n * const schemaContent = `\n * model User {\n * id Int @id @default(autoincrement())\n * email String @unique\n * }\n * `;\n * const parser = new PrismaSchemaParser();\n * const schema = parser.parse();\n * ```\n */\nexport class PrismaSchemaParser {\n compositeTypes: PrismaModel[] = [];\n /** Collection of parsed enum definitions */\n enums: PrismaEnum[] = [];\n /** Collection of parsed model definitions */\n models: PrismaModel[] = [];\n /** Current loaded prisma schemas content as a single file */\n prismaSchemasContent: string = \"\";\n parsed: boolean = false;\n config: SchemaConfig;\n warningNotLogged = true;\n\n constructor() {\n this.parse();\n this.config = this.parseSchemaConfig();\n }\n\n /**\n * Parses the Prisma schema and extracts all models and enums.\n *\n * @returns The parsed schema containing arrays of models and enums\n */\n parse(\n { override }: { override: boolean } = { override: false }\n ): PrismaSchema {\n if (!this.parsed || override) {\n this.compositeTypes = this.extractCompositeTypes();\n this.enums = this.extractEnums();\n this.models = this.extractModels();\n this.parsed = true;\n }\n\n return {\n models: this.models,\n enums: this.enums,\n };\n }\n\n private extractCompositeTypes(): PrismaModel[] {\n const typeRegex = /type\\s+\\w+\\s*\\{((?:[^{}]*(?:\\{[^{}]*\\}[^{}]*)*)*)\\}/g;\n const schema = this.getPrismaSchemasContent() || \"\";\n const blocks = schema.match(typeRegex) || [];\n return blocks\n .map((block) => this.parseModelBlock(block, /type\\s+(\\w+)/))\n .filter(Boolean) as PrismaModel[];\n }\n\n /**\n * Extracts all enum definitions from the schema.\n *\n * @private\n * @returns Array of parsed enum objects\n */\n private extractEnums(): PrismaEnum[] {\n const enums: PrismaEnum[] = [];\n const schema = this.getPrismaSchemasContent() || \"\";\n const enumBlocks = schema.match(/enum\\s+\\w+\\s*\\{[^}]*\\}/g) || [];\n\n for (const block of enumBlocks) {\n const enumObj = this.parseEnumBlock(block);\n if (enumObj) {\n enums.push(enumObj);\n }\n }\n\n return enums;\n }\n\n /**\n * Parses a single enum block and extracts its name and values.\n *\n * @private\n * @param block - The enum block string (e.g., \"enum Status { ACTIVE INACTIVE }\")\n * @returns The parsed enum object or null if parsing fails\n */\n private parseEnumBlock(block: string): PrismaEnum | null {\n const nameMatch = block.match(/enum\\s+(\\w+)/);\n if (!nameMatch) return null;\n\n const name = nameMatch[1];\n const values = block\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(\n (line) =>\n line &&\n !line.startsWith(\"enum\") &&\n !line.startsWith(\"{\") &&\n !line.startsWith(\"}\")\n )\n .map((line) => line.replace(/,$/, \"\"));\n\n return { name, values };\n }\n\n /**\n * Extracts all model definitions from the schema.\n *\n * @private\n * @returns Array of parsed model objects\n */\n private extractModels(): PrismaModel[] {\n const models: PrismaModel[] = [];\n const modelBlocks = this.extractModelBlocks();\n\n for (const block of modelBlocks) {\n const model = this.parseModelBlock(block);\n if (model) {\n models.push(model);\n }\n }\n\n return models;\n }\n\n /**\n * Extracts raw model block strings from the schema using regex.\n *\n * @private\n * @returns Array of model block strings\n */\n private extractModelBlocks(): string[] {\n const modelRegex = /model\\s+\\w+\\s*\\{((?:[^{}]*(?:\\{[^{}]*\\}[^{}]*)*)*)\\}/g;\n const schema = this.getPrismaSchemasContent() || \"\";\n return schema.match(modelRegex) || [];\n }\n\n /**\n * Parses a single model block and extracts its name, fields, and metadata.\n *\n * @private\n * @param block - The model block string\n * @returns The parsed model object or null if parsing fails\n */\n private parseModelBlock(\n block: string,\n reg: RegExp = /model\\s+(\\w+)/\n ): PrismaModel | null {\n const nameMatch = block.match(reg);\n if (!nameMatch) return null;\n\n const name = nameMatch[1];\n const fields = this.parseFields(block);\n\n // Check for @@map directive\n const mapMatch = block.match(/@@map\\s*\\(\\s*\"([^\"]+)\"\\s*\\)/);\n const mapName = mapMatch ? mapMatch[1] : undefined;\n\n return { name, fields, mapName };\n }\n\n /**\n * Parses all field definitions within a model block.\n *\n * @private\n * @param block - The model block string containing field definitions\n * @returns Array of parsed field objects\n */\n private parseFields(block: string): PrismaField[] {\n const fields: PrismaField[] = [];\n const fieldLines = block\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith(\"{\") && !line.startsWith(\"}\"));\n\n for (const line of fieldLines) {\n if (line.startsWith(\"//\") || line.startsWith(\"@@\")) continue;\n if (/^model\\s+\\w+\\s*\\{/.test(line)) continue;\n if (/^type\\s+\\w+\\s*\\{/.test(line)) continue;\n\n const field = this.parseFieldLine(line);\n if (field) {\n fields.push(field);\n }\n }\n\n return fields;\n }\n\n /**\n * Parses a single field line and extracts all field properties.\n *\n * @private\n * @param line - A single field definition line (e.g., \"id Int @id @default(autoincrement())\")\n * @returns The parsed field object or null if parsing fails\n *\n * @example\n * ```typescript\n * // Input: \"email String? @unique @default(\"user@example.com\")\"\n * // Output: {\n * // name: \"email\",\n * // type: \"String\",\n * // isOptional: true,\n * // isArray: false,\n * // defaultValue: \"user@example.com\",\n * // isId: false,\n * // isUnique: true,\n * // attributes: [\"@unique\", \"@default(\\\"user@example.com\\\")\"]\n * // }\n * ```\n */\n private parseFieldLine(line: string): PrismaField | null {\n const fieldMatch = line.match(/^(\\w+)\\s+(\\w+(?:\\[\\])?)\\??\\s*(.*)/);\n if (!fieldMatch) return null;\n\n const [, name, typeWithArray, attributesStr] = fieldMatch;\n const isArray = typeWithArray.endsWith(\"[]\");\n const type = isArray ? typeWithArray.slice(0, -2) : typeWithArray;\n const isOptional = line.includes(\"?\");\n\n const attributes = attributesStr\n .split(/\\s+/)\n .filter((attr) => attr.startsWith(\"@\"));\n\n // Extract default value\n let defaultValue: any = undefined;\n const defaultMatch = attributesStr.match(/@default\\(([^)]+)\\)/);\n if (defaultMatch) {\n defaultValue = this.parseDefaultValue(defaultMatch[1]);\n }\n\n let foreignKeyField = \"\";\n const relationMatch = attributesStr.match(\n /@relation\\([^)]*fields:\\s*\\[([^\\]]+)\\]/\n );\n if (relationMatch)\n foreignKeyField = relationMatch[1].trim().replace(/['\"]/g, \"\");\n\n let foreignReferenceField = \"\";\n const foreignReferenceFieldMatch = attributesStr.match(\n /@relation\\([^)]*references:\\s*\\[([^\\]]+)\\]/\n );\n if (foreignReferenceFieldMatch)\n foreignReferenceField = foreignReferenceFieldMatch[1]\n .trim()\n .replace(/['\"]/g, \"\");\n\n const isId = attributes.some((attr) => attr.startsWith(\"@id\"));\n const isUnique = attributes.some((attr) => attr.startsWith(\"@unique\"));\n const models = this.models;\n\n return {\n name,\n type,\n isOptional,\n isRelation:\n models.map((model) => model.name).includes(type) ||\n this.getPrismaSchemasContent().includes(`model ${type} {`),\n isCompositeType: this.compositeTypes.map((t) => t.name).includes(type),\n isArray,\n foreignKeyField,\n foreignReferenceField,\n defaultValue,\n isId,\n isUnique,\n attributes,\n rawLine: line.trim(),\n };\n }\n\n /**\n * Parses a default value string and converts it to the appropriate JavaScript type.\n *\n * @private\n * @param defaultStr - The default value string from @default() attribute\n * @returns The parsed default value in appropriate JavaScript type, or undefined for functions\n *\n * @example\n * ```typescript\n * parseDefaultValue('\"hello\"') // returns \"hello\"\n * parseDefaultValue('true') // returns true\n * parseDefaultValue('42') // returns 42\n * parseDefaultValue('3.14') // returns 3.14\n * parseDefaultValue('ACTIVE') // returns \"ACTIVE\" (enum value)\n * parseDefaultValue('now()') // returns undefined (function)\n * ```\n */\n private parseDefaultValue(defaultStr: string): any {\n defaultStr = defaultStr.trim();\n // Handle string values\n if (defaultStr.startsWith(\"[\")) {\n return defaultStr.replace(\"[\", \"\").replace(\"]\", \"\").split(\",\");\n }\n if (defaultStr.startsWith('\"') && defaultStr.endsWith('\"'))\n return defaultStr.slice(1, -1);\n // Handle boolean values\n if (defaultStr === \"true\") return true;\n if (defaultStr === \"false\") return false;\n // Handle numeric values (including negative numbers)\n if (/^-?\\d+$/.test(defaultStr)) return parseInt(defaultStr, 10);\n if (/^-?\\d+\\.\\d+$/.test(defaultStr)) return parseFloat(defaultStr);\n // Handle enum values (no quotes, not a function)\n if (!defaultStr.includes(\"(\")) return defaultStr;\n // Handle functions (like now(), auto(), etc.)\n if (defaultStr.includes(\"(\"))\n // For MongoDB, we'll skip function defaults as they're handled by the DB\n return undefined;\n return defaultStr;\n }\n\n getPrismaSchemasContent(): string {\n if (this.prismaSchemasContent) return this.prismaSchemasContent;\n\n const models: string[] = [];\n const modelRegex = /model\\s+(\\w+)\\s*{/g;\n\n const prismaContent: string[] = [];\n const prismaPath = path.resolve(process.cwd(), \"prisma\");\n\n const files = this.getAllPrismaFiles(prismaPath);\n\n for (const file of files) {\n const content = fs.readFileSync(file, \"utf-8\");\n if (!prismaContent?.includes?.(content)) prismaContent.push(content);\n }\n\n // Gather the content of all *.prisma files into single one\n const content = prismaContent\n .join(\"\\n\")\n .replace(modelRegex, (_, modelName) => {\n if (!models?.includes?.(modelName))\n models.push(camelCase(modelName.trim()));\n return `model ${modelName} {`;\n });\n\n return content;\n }\n\n generatePrismaModel(options: {\n modelName: { pascal: string; camel: string; kebab: string };\n }): string {\n const { modelName } = options;\n if (!modelName)\n throw new Error(\"Model name is required for Prisma model template\");\n\n const allModels = prismaSchemaParser.models;\n if (allModels.length === 0)\n throw new Error(\"No models found in Prisma schema for reference.\");\n\n const timestampFields = [\n \"id\",\n \"createdAt\",\n \"updatedAt\",\n \"create_at\",\n \"update_at\",\n \"deletedAt\",\n \"deleted_at\",\n ];\n\n const commonFieldsMap = new Map<string, PrismaField>();\n let allModelsHaveMap = allModels.length > 0;\n\n if (allModels.length === 1) {\n const singleModel = allModels[0];\n if (!singleModel.mapName) allModelsHaveMap = false;\n\n for (const field of singleModel.fields) {\n if (timestampFields.includes(field.name)) {\n commonFieldsMap.set(field.name, field);\n }\n }\n } else if (allModels.length > 0) {\n const firstModel = allModels[0];\n if (!firstModel.mapName) allModelsHaveMap = false;\n\n for (const field of firstModel.fields) {\n commonFieldsMap.set(field.name, field);\n }\n\n for (let i = 1; i < allModels.length; i++) {\n const currentModel = allModels[i];\n if (!currentModel.mapName) allModelsHaveMap = false;\n const currentFieldNames = new Set(\n currentModel.fields.map((f) => f.name)\n );\n\n for (const fieldName of commonFieldsMap.keys()) {\n if (!currentFieldNames.has(fieldName)) {\n commonFieldsMap.delete(fieldName);\n }\n }\n }\n }\n\n const fields = Array.from(commonFieldsMap.values());\n const fieldDefinitions = fields\n .map((field) => (field.rawLine ? ` ${field.rawLine}` : null))\n .filter(Boolean)\n .join(\"\\n\");\n\n const mapDirective = allModelsHaveMap\n ? `\\n\\n @@map(\"${modelName.kebab}\")`\n : \"\";\n\n return `model ${modelName.pascal} {\n${fieldDefinitions}${mapDirective}\n}\n`;\n }\n\n private getAllPrismaFiles(dirPath: string, fileList: string[] = []) {\n try {\n const files = fs.readdirSync(dirPath);\n\n files?.forEach((file) => {\n const filePath = path.join(dirPath, file);\n const stat = fs.statSync(filePath);\n\n // Skip migrations folder\n if (stat.isDirectory() && file !== \"migrations\") {\n fileList = this.getAllPrismaFiles(filePath, fileList);\n } else if (stat.isFile() && file.endsWith(\".prisma\")) {\n fileList.push(filePath);\n }\n });\n\n return fileList;\n } catch {\n if (\n getArkosConfig()?.warnings?.suppress?.prisma?.noSchemaFound !== true &&\n this.warningNotLogged &&\n process.env.NO_CLI === \"true\"\n ) {\n sheu.warn(\"No prisma folder was found in order to load models\", {\n timestamp: true,\n });\n this.warningNotLogged = false;\n }\n return [];\n }\n }\n\n parseSchemaConfig(): SchemaConfig {\n const config: SchemaConfig = {\n generatorProvider: \"\",\n datasourceProvider: \"\",\n datasourceUrl: \"\",\n };\n\n const lines = this.getPrismaSchemasContent().split(\"\\n\");\n let inGenerator = false;\n let inDatasource = false;\n let braceCount = 0;\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n if (trimmed.startsWith(\"//\") || trimmed.startsWith(\"#\")) continue;\n\n if (trimmed.startsWith(\"generator\")) {\n inGenerator = true;\n continue;\n }\n\n if (trimmed.startsWith(\"datasource\")) {\n inDatasource = true;\n continue;\n }\n\n if (trimmed.includes(\"{\")) braceCount++;\n if (trimmed.includes(\"}\")) braceCount--;\n\n // Check if we're exiting blocks\n if (braceCount === 0) {\n if (inGenerator && trimmed.includes(\"}\")) inGenerator = false;\n\n if (inDatasource && trimmed.includes(\"}\")) inDatasource = false;\n }\n\n if (inGenerator && trimmed.includes(\"provider\")) {\n const match = trimmed.match(/provider\\s*=\\s*\"([^\"]+)\"/);\n if (match) config.generatorProvider = match[1];\n }\n\n if (inDatasource && trimmed.includes(\"provider\")) {\n const match = trimmed.match(/provider\\s*=\\s*\"([^\"]+)\"/);\n if (match) {\n config.datasourceProvider = match[1];\n }\n }\n\n if (inDatasource && trimmed.includes(\"url\")) {\n const match = trimmed.match(/url\\s*=\\s*(env\\(\"([^\"]+)\"\\)|\"([^\"]+)\")/);\n if (match) {\n config.datasourceUrl = match[1];\n }\n }\n }\n\n return config;\n }\n\n /**\n * Checks if a given type name corresponds to a defined enum.\n *\n * @param typeName - The type name to check\n * @returns True if the type is an enum, false otherwise\n *\n * @example\n * ```typescript\n * const parser = new PrismaSchemaParser(schemaWithStatusEnum);\n * parser.parse();\n * parser.isEnum('Status'); // true\n * parser.isEnum('String'); // false\n * ```\n */\n isEnum(typeName: string): boolean {\n return this.enums.some((e) => e.name === typeName);\n }\n\n /**\n * Checks if a given type name corresponds to a defined model.\n *\n * @param typeName - The type name to check\n * @returns True if the type is a model, false otherwise\n *\n * @example\n * ```typescript\n * const parser = new PrismaSchemaParser(schemaWithUserModel);\n * parser.parse();\n * parser.isModel('User'); // true\n * parser.isModel('String'); // false\n * ```\n */\n isModel(typeName: string): boolean {\n return this.models.some((m) => m.name === typeName);\n }\n\n getModelUniqueFields(modelName: string) {\n return this.models\n .find(({ name }) => pascalCase(name) === pascalCase(modelName))\n ?.fields.filter(({ isUnique }) => isUnique);\n }\n\n getModelRelations(modelName: string) {\n return this.models\n .find((model) => pascalCase(model.name) === pascalCase(modelName))\n ?.fields.filter((field) => field.isRelation);\n }\n\n getModelsAsArrayOfStrings() {\n return this.models.map(({ name }) => name);\n }\n\n getField(criteria: Partial<PrismaField>): PrismaField | undefined {\n return this.models\n .reduce((acc, model) => {\n acc.push(...model.fields);\n return acc;\n }, [] as PrismaField[])\n .find((field) => {\n return Object.keys(criteria).every((key) => {\n return (\n field[key as keyof PrismaField] ===\n criteria[key as keyof PrismaField]\n );\n });\n });\n }\n}\n\nconst prismaSchemaParser = new PrismaSchemaParser();\n\nexport default prismaSchemaParser;\n"]}
1
+ {"version":3,"file":"prisma-schema-parser.js","sourceRoot":"","sources":["../../../../src/utils/prisma/prisma-schema-parser.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"path\";\nimport { PrismaSchema, PrismaModel, PrismaEnum, PrismaField } from \"./types\";\nimport { camelCase, pascalCase } from \"../helpers/change-case.helpers\";\nimport fs from \"fs\";\nimport sheu from \"../sheu\";\nimport { getArkosConfig } from \"../helpers/arkos-config.helpers\";\n\ninterface SchemaConfig {\n generatorProvider: string;\n datasourceProvider: string;\n datasourceUrl: string;\n clientOutput: string;\n}\n\n/**\n * A parser for Prisma schema files that extracts models, enums, and their properties.\n *\n * @example\n * ```typescript\n * const schemaContent = `\n * model User {\n * id Int @id @default(autoincrement())\n * email String @unique\n * }\n * `;\n * const parser = new PrismaSchemaParser();\n * const schema = parser.parse();\n * ```\n */\nexport class PrismaSchemaParser {\n compositeTypes: PrismaModel[] = [];\n /** Collection of parsed enum definitions */\n enums: PrismaEnum[] = [];\n /** Collection of parsed model definitions */\n models: PrismaModel[] = [];\n /** Current loaded prisma schemas content as a single file */\n prismaSchemasContent: string = \"\";\n parsed: boolean = false;\n config: SchemaConfig;\n warningNotLogged = true;\n\n constructor() {\n this.parse();\n this.config = this.parseSchemaConfig();\n }\n\n /**\n * Parses the Prisma schema and extracts all models and enums.\n *\n * @returns The parsed schema containing arrays of models and enums\n */\n parse(\n { override }: { override: boolean } = { override: false }\n ): PrismaSchema {\n if (!this.parsed || override) {\n this.compositeTypes = this.extractCompositeTypes();\n this.enums = this.extractEnums();\n this.models = this.extractModels();\n this.parsed = true;\n }\n\n return {\n models: this.models,\n enums: this.enums,\n };\n }\n\n private extractCompositeTypes(): PrismaModel[] {\n const typeRegex = /type\\s+\\w+\\s*\\{((?:[^{}]*(?:\\{[^{}]*\\}[^{}]*)*)*)\\}/g;\n const schema = this.getPrismaSchemasContent() || \"\";\n const blocks = schema.match(typeRegex) || [];\n return blocks\n .map((block) => this.parseModelBlock(block, /type\\s+(\\w+)/))\n .filter(Boolean) as PrismaModel[];\n }\n\n /**\n * Extracts all enum definitions from the schema.\n *\n * @private\n * @returns Array of parsed enum objects\n */\n private extractEnums(): PrismaEnum[] {\n const enums: PrismaEnum[] = [];\n const schema = this.getPrismaSchemasContent() || \"\";\n const enumBlocks = schema.match(/enum\\s+\\w+\\s*\\{[^}]*\\}/g) || [];\n\n for (const block of enumBlocks) {\n const enumObj = this.parseEnumBlock(block);\n if (enumObj) {\n enums.push(enumObj);\n }\n }\n\n return enums;\n }\n\n /**\n * Parses a single enum block and extracts its name and values.\n *\n * @private\n * @param block - The enum block string (e.g., \"enum Status { ACTIVE INACTIVE }\")\n * @returns The parsed enum object or null if parsing fails\n */\n private parseEnumBlock(block: string): PrismaEnum | null {\n const nameMatch = block.match(/enum\\s+(\\w+)/);\n if (!nameMatch) return null;\n\n const name = nameMatch[1];\n const values = block\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(\n (line) =>\n line &&\n !line.startsWith(\"enum\") &&\n !line.startsWith(\"{\") &&\n !line.startsWith(\"}\")\n )\n .map((line) => line.replace(/,$/, \"\"));\n\n return { name, values };\n }\n\n /**\n * Extracts all model definitions from the schema.\n *\n * @private\n * @returns Array of parsed model objects\n */\n private extractModels(): PrismaModel[] {\n const models: PrismaModel[] = [];\n const modelBlocks = this.extractModelBlocks();\n\n for (const block of modelBlocks) {\n const model = this.parseModelBlock(block);\n if (model) {\n models.push(model);\n }\n }\n\n return models;\n }\n\n /**\n * Extracts raw model block strings from the schema using regex.\n *\n * @private\n * @returns Array of model block strings\n */\n private extractModelBlocks(): string[] {\n const modelRegex = /model\\s+\\w+\\s*\\{((?:[^{}]*(?:\\{[^{}]*\\}[^{}]*)*)*)\\}/g;\n const schema = this.getPrismaSchemasContent() || \"\";\n return schema.match(modelRegex) || [];\n }\n\n /**\n * Parses a single model block and extracts its name, fields, and metadata.\n *\n * @private\n * @param block - The model block string\n * @returns The parsed model object or null if parsing fails\n */\n private parseModelBlock(\n block: string,\n reg: RegExp = /model\\s+(\\w+)/\n ): PrismaModel | null {\n const nameMatch = block.match(reg);\n if (!nameMatch) return null;\n\n const name = nameMatch[1];\n const fields = this.parseFields(block);\n\n // Check for @@map directive\n const mapMatch = block.match(/@@map\\s*\\(\\s*\"([^\"]+)\"\\s*\\)/);\n const mapName = mapMatch ? mapMatch[1] : undefined;\n\n return { name, fields, mapName };\n }\n\n /**\n * Parses all field definitions within a model block.\n *\n * @private\n * @param block - The model block string containing field definitions\n * @returns Array of parsed field objects\n */\n private parseFields(block: string): PrismaField[] {\n const fields: PrismaField[] = [];\n const fieldLines = block\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith(\"{\") && !line.startsWith(\"}\"));\n\n for (const line of fieldLines) {\n if (line.startsWith(\"//\") || line.startsWith(\"@@\")) continue;\n if (/^model\\s+\\w+\\s*\\{/.test(line)) continue;\n if (/^type\\s+\\w+\\s*\\{/.test(line)) continue;\n\n const field = this.parseFieldLine(line);\n if (field) {\n fields.push(field);\n }\n }\n\n return fields;\n }\n\n /**\n * Parses a single field line and extracts all field properties.\n *\n * @private\n * @param line - A single field definition line (e.g., \"id Int @id @default(autoincrement())\")\n * @returns The parsed field object or null if parsing fails\n *\n * @example\n * ```typescript\n * // Input: \"email String? @unique @default(\"user@example.com\")\"\n * // Output: {\n * // name: \"email\",\n * // type: \"String\",\n * // isOptional: true,\n * // isArray: false,\n * // defaultValue: \"user@example.com\",\n * // isId: false,\n * // isUnique: true,\n * // attributes: [\"@unique\", \"@default(\\\"user@example.com\\\")\"]\n * // }\n * ```\n */\n private parseFieldLine(line: string): PrismaField | null {\n const fieldMatch = line.match(/^(\\w+)\\s+(\\w+(?:\\[\\])?)\\??\\s*(.*)/);\n if (!fieldMatch) return null;\n\n const [, name, typeWithArray, attributesStr] = fieldMatch;\n const isArray = typeWithArray.endsWith(\"[]\");\n const type = isArray ? typeWithArray.slice(0, -2) : typeWithArray;\n const isOptional = line.includes(\"?\");\n\n const attributes = attributesStr\n .split(/\\s+/)\n .filter((attr) => attr.startsWith(\"@\"));\n\n // Extract default value\n let defaultValue: any = undefined;\n const defaultMatch = attributesStr.match(/@default\\(([^)]+)\\)/);\n if (defaultMatch) {\n defaultValue = this.parseDefaultValue(defaultMatch[1]);\n }\n\n let foreignKeyField = \"\";\n const relationMatch = attributesStr.match(\n /@relation\\([^)]*fields:\\s*\\[([^\\]]+)\\]/\n );\n if (relationMatch)\n foreignKeyField = relationMatch[1].trim().replace(/['\"]/g, \"\");\n\n let foreignReferenceField = \"\";\n const foreignReferenceFieldMatch = attributesStr.match(\n /@relation\\([^)]*references:\\s*\\[([^\\]]+)\\]/\n );\n if (foreignReferenceFieldMatch)\n foreignReferenceField = foreignReferenceFieldMatch[1]\n .trim()\n .replace(/['\"]/g, \"\");\n\n const isId = attributes.some((attr) => attr.startsWith(\"@id\"));\n const isUnique = attributes.some((attr) => attr.startsWith(\"@unique\"));\n const models = this.models;\n\n return {\n name,\n type,\n isOptional,\n isRelation:\n models.map((model) => model.name).includes(type) ||\n this.getPrismaSchemasContent().includes(`model ${type} {`),\n isCompositeType: this.compositeTypes.map((t) => t.name).includes(type),\n isArray,\n foreignKeyField,\n foreignReferenceField,\n defaultValue,\n isId,\n isUnique,\n attributes,\n rawLine: line.trim(),\n };\n }\n\n /**\n * Parses a default value string and converts it to the appropriate JavaScript type.\n *\n * @private\n * @param defaultStr - The default value string from @default() attribute\n * @returns The parsed default value in appropriate JavaScript type, or undefined for functions\n *\n * @example\n * ```typescript\n * parseDefaultValue('\"hello\"') // returns \"hello\"\n * parseDefaultValue('true') // returns true\n * parseDefaultValue('42') // returns 42\n * parseDefaultValue('3.14') // returns 3.14\n * parseDefaultValue('ACTIVE') // returns \"ACTIVE\" (enum value)\n * parseDefaultValue('now()') // returns undefined (function)\n * ```\n */\n private parseDefaultValue(defaultStr: string): any {\n defaultStr = defaultStr.trim();\n // Handle string values\n if (defaultStr.startsWith(\"[\")) {\n return defaultStr.replace(\"[\", \"\").replace(\"]\", \"\").split(\",\");\n }\n if (defaultStr.startsWith('\"') && defaultStr.endsWith('\"'))\n return defaultStr.slice(1, -1);\n // Handle boolean values\n if (defaultStr === \"true\") return true;\n if (defaultStr === \"false\") return false;\n // Handle numeric values (including negative numbers)\n if (/^-?\\d+$/.test(defaultStr)) return parseInt(defaultStr, 10);\n if (/^-?\\d+\\.\\d+$/.test(defaultStr)) return parseFloat(defaultStr);\n // Handle enum values (no quotes, not a function)\n if (!defaultStr.includes(\"(\")) return defaultStr;\n // Handle functions (like now(), auto(), etc.)\n if (defaultStr.includes(\"(\"))\n // For MongoDB, we'll skip function defaults as they're handled by the DB\n return undefined;\n return defaultStr;\n }\n\n getPrismaSchemasContent(): string {\n if (this.prismaSchemasContent) return this.prismaSchemasContent;\n\n const models: string[] = [];\n const modelRegex = /model\\s+(\\w+)\\s*{/g;\n\n const prismaContent: string[] = [];\n const prismaPath = path.resolve(process.cwd(), \"prisma\");\n\n const files = this.getAllPrismaFiles(prismaPath);\n\n for (const file of files) {\n const content = fs.readFileSync(file, \"utf-8\");\n if (!prismaContent?.includes?.(content)) prismaContent.push(content);\n }\n\n // Gather the content of all *.prisma files into single one\n const content = prismaContent\n .join(\"\\n\")\n .replace(modelRegex, (_, modelName) => {\n if (!models?.includes?.(modelName))\n models.push(camelCase(modelName.trim()));\n return `model ${modelName} {`;\n });\n\n return content;\n }\n\n generatePrismaModel(options: {\n modelName: { pascal: string; camel: string; kebab: string };\n }): string {\n const { modelName } = options;\n if (!modelName)\n throw new Error(\"Model name is required for Prisma model template\");\n\n const allModels = prismaSchemaParser.models;\n if (allModels.length === 0)\n throw new Error(\"No models found in Prisma schema for reference.\");\n\n const timestampFields = [\n \"id\",\n \"createdAt\",\n \"updatedAt\",\n \"create_at\",\n \"update_at\",\n \"deletedAt\",\n \"deleted_at\",\n ];\n\n const commonFieldsMap = new Map<string, PrismaField>();\n let allModelsHaveMap = allModels.length > 0;\n\n if (allModels.length === 1) {\n const singleModel = allModels[0];\n if (!singleModel.mapName) allModelsHaveMap = false;\n\n for (const field of singleModel.fields) {\n if (timestampFields.includes(field.name)) {\n commonFieldsMap.set(field.name, field);\n }\n }\n } else if (allModels.length > 0) {\n const firstModel = allModels[0];\n if (!firstModel.mapName) allModelsHaveMap = false;\n\n for (const field of firstModel.fields) {\n commonFieldsMap.set(field.name, field);\n }\n\n for (let i = 1; i < allModels.length; i++) {\n const currentModel = allModels[i];\n if (!currentModel.mapName) allModelsHaveMap = false;\n const currentFieldNames = new Set(\n currentModel.fields.map((f) => f.name)\n );\n\n for (const fieldName of commonFieldsMap.keys()) {\n if (!currentFieldNames.has(fieldName)) {\n commonFieldsMap.delete(fieldName);\n }\n }\n }\n }\n\n const fields = Array.from(commonFieldsMap.values());\n const fieldDefinitions = fields\n .map((field) => (field.rawLine ? ` ${field.rawLine}` : null))\n .filter(Boolean)\n .join(\"\\n\");\n\n const mapDirective = allModelsHaveMap\n ? `\\n\\n @@map(\"${modelName.kebab}\")`\n : \"\";\n\n return `model ${modelName.pascal} {\n${fieldDefinitions}${mapDirective}\n}\n`;\n }\n\n private getAllPrismaFiles(dirPath: string, fileList: string[] = []) {\n try {\n const files = fs.readdirSync(dirPath);\n\n files?.forEach((file) => {\n const filePath = path.join(dirPath, file);\n const stat = fs.statSync(filePath);\n\n // Skip migrations folder\n if (stat.isDirectory() && file !== \"migrations\") {\n fileList = this.getAllPrismaFiles(filePath, fileList);\n } else if (stat.isFile() && file.endsWith(\".prisma\")) {\n fileList.push(filePath);\n }\n });\n\n return fileList;\n } catch {\n if (\n getArkosConfig()?.warnings?.suppress?.prisma?.noSchemaFound !== true &&\n this.warningNotLogged &&\n process.env.NO_CLI === \"true\"\n ) {\n sheu.warn(\"No prisma folder was found in order to load models\", {\n timestamp: true,\n });\n this.warningNotLogged = false;\n }\n return [];\n }\n }\n\n parseSchemaConfig(): SchemaConfig {\n const config: SchemaConfig = {\n generatorProvider: \"\",\n datasourceProvider: \"\",\n datasourceUrl: \"\",\n clientOutput: \"\",\n };\n\n const lines = this.getPrismaSchemasContent().split(\"\\n\");\n let inGenerator = false;\n let inDatasource = false;\n let braceCount = 0;\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n if (trimmed.startsWith(\"//\") || trimmed.startsWith(\"#\")) continue;\n\n if (trimmed.startsWith(\"generator\")) {\n inGenerator = true;\n continue;\n }\n\n if (trimmed.startsWith(\"datasource\")) {\n inDatasource = true;\n continue;\n }\n\n if (trimmed.includes(\"{\")) braceCount++;\n if (trimmed.includes(\"}\")) braceCount--;\n\n // Check if we're exiting blocks\n if (braceCount === 0) {\n if (inGenerator && trimmed.includes(\"}\")) inGenerator = false;\n\n if (inDatasource && trimmed.includes(\"}\")) inDatasource = false;\n }\n\n if (inGenerator && trimmed.includes(\"provider\")) {\n const match = trimmed.match(/provider\\s*=\\s*\"([^\"]+)\"/);\n if (match) config.generatorProvider = match[1];\n }\n\n if (inDatasource && trimmed.includes(\"provider\")) {\n const match = trimmed.match(/provider\\s*=\\s*\"([^\"]+)\"/);\n if (match) {\n config.datasourceProvider = match[1];\n }\n }\n\n if (inGenerator && trimmed.includes(\"output\")) {\n const match = trimmed.match(/output\\s*=\\s*\"([^\"]+)\"/);\n if (match)\n config.clientOutput = match[1];\n }\n\n if (inDatasource && trimmed.includes(\"url\")) {\n const match = trimmed.match(/url\\s*=\\s*(env\\(\"([^\"]+)\"\\)|\"([^\"]+)\")/);\n if (match) {\n config.datasourceUrl = match[1];\n }\n }\n }\n\n return config;\n }\n\n /**\n * Checks if a given type name corresponds to a defined enum.\n *\n * @param typeName - The type name to check\n * @returns True if the type is an enum, false otherwise\n *\n * @example\n * ```typescript\n * const parser = new PrismaSchemaParser(schemaWithStatusEnum);\n * parser.parse();\n * parser.isEnum('Status'); // true\n * parser.isEnum('String'); // false\n * ```\n */\n isEnum(typeName: string): boolean {\n return this.enums.some((e) => e.name === typeName);\n }\n\n /**\n * Checks if a given type name corresponds to a defined model.\n *\n * @param typeName - The type name to check\n * @returns True if the type is a model, false otherwise\n *\n * @example\n * ```typescript\n * const parser = new PrismaSchemaParser(schemaWithUserModel);\n * parser.parse();\n * parser.isModel('User'); // true\n * parser.isModel('String'); // false\n * ```\n */\n isModel(typeName: string): boolean {\n return this.models.some((m) => m.name === typeName);\n }\n\n getModelUniqueFields(modelName: string) {\n return this.models\n .find(({ name }) => pascalCase(name) === pascalCase(modelName))\n ?.fields.filter(({ isUnique }) => isUnique);\n }\n\n getModelRelations(modelName: string) {\n return this.models\n .find((model) => pascalCase(model.name) === pascalCase(modelName))\n ?.fields.filter((field) => field.isRelation);\n }\n\n getModelsAsArrayOfStrings() {\n return this.models.map(({ name }) => name);\n }\n\n getField(criteria: Partial<PrismaField>): PrismaField | undefined {\n return this.models\n .reduce((acc, model) => {\n acc.push(...model.fields);\n return acc;\n }, [] as PrismaField[])\n .find((field) => {\n return Object.keys(criteria).every((key) => {\n return (\n field[key as keyof PrismaField] ===\n criteria[key as keyof PrismaField]\n );\n });\n });\n }\n}\n\nconst prismaSchemaParser = new PrismaSchemaParser();\n\nexport default prismaSchemaParser;\n"]}
@@ -21,6 +21,8 @@ export type SMTPConnectionOptions = {
21
21
  secure?: boolean;
22
22
  auth?: SMTPAuthOptions;
23
23
  name?: string;
24
+ user?: string;
25
+ pass?: string;
24
26
  };
25
27
  /**
26
28
  * A service class to handle email-related tasks, including sending emails.
@@ -3,6 +3,7 @@ interface SchemaConfig {
3
3
  generatorProvider: string;
4
4
  datasourceProvider: string;
5
5
  datasourceUrl: string;
6
+ clientOutput: string;
6
7
  }
7
8
  /**
8
9
  * A parser for Prisma schema files that extracts models, enums, and their properties.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "arkos",
3
- "version": "1.6.7-beta",
3
+ "version": "1.6.8-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",
@@ -71,14 +71,30 @@
71
71
  },
72
72
  "typesVersions": {
73
73
  "*": {
74
- "*": ["./dist/types/exports/*/index.d.ts"],
75
- "services": ["./dist/types/exports/services/index.d.ts"],
76
- "validation": ["./dist/types/exports/validation/index.d.ts"],
77
- "error-handler": ["./dist/types/exports/error-handler/index.d.ts"],
78
- "prisma": ["./dist/types/exports/prisma/index.d.ts"],
79
- "auth": ["./dist/types/exports/auth/index.d.ts"],
80
- "middlewares": ["./dist/types/exports/middlewares/index.d.ts"],
81
- "utils": ["./dist/types/exports/utils/index.d.ts"]
74
+ "*": [
75
+ "./dist/types/exports/*/index.d.ts"
76
+ ],
77
+ "services": [
78
+ "./dist/types/exports/services/index.d.ts"
79
+ ],
80
+ "validation": [
81
+ "./dist/types/exports/validation/index.d.ts"
82
+ ],
83
+ "error-handler": [
84
+ "./dist/types/exports/error-handler/index.d.ts"
85
+ ],
86
+ "prisma": [
87
+ "./dist/types/exports/prisma/index.d.ts"
88
+ ],
89
+ "auth": [
90
+ "./dist/types/exports/auth/index.d.ts"
91
+ ],
92
+ "middlewares": [
93
+ "./dist/types/exports/middlewares/index.d.ts"
94
+ ],
95
+ "utils": [
96
+ "./dist/types/exports/utils/index.d.ts"
97
+ ]
82
98
  }
83
99
  },
84
100
  "scripts": {
@@ -94,7 +110,7 @@
94
110
  "lint": "eslint src --ext .ts",
95
111
  "prepublishOnly": "pnpm run build",
96
112
  "prelinkOnly": "npm run build",
97
- "test": "jest",
113
+ "test": "NODE_OPTIONS=--max-old-space-size=1024 jest",
98
114
  "test:watch": "jest --watch",
99
115
  "test:coverage": "jest --coverage",
100
116
  "test:create": "tsx src/scripts/create-test.ts",
@@ -131,10 +147,15 @@
131
147
  "url": "https://github.com/uanela/arkos/issues"
132
148
  },
133
149
  "homepage": "https://www.arkosjs.com",
134
- "files": ["dist", "cli.js", "README.md"],
150
+ "files": [
151
+ "dist",
152
+ "cli.js",
153
+ "README.md"
154
+ ],
135
155
  "devDependencies": {
136
156
  "@babel/preset-typescript": "7.27.1",
137
- "@scalar/express-api-reference": "0.8.32",
157
+ "@prisma/client": "6.19.3",
158
+ "@scalar/express-api-reference": "0.10.2",
138
159
  "@types/bcrypt": "5.0.2",
139
160
  "@types/body-parser": "1.19.5",
140
161
  "@types/compression": "1.7.5",
@@ -145,25 +166,27 @@
145
166
  "@types/jest": "29.5.14",
146
167
  "@types/jsonwebtoken": "9.0.9",
147
168
  "@types/multer": "2.0.0",
148
- "@types/node": "22.13.13",
169
+ "@types/node": "24.0.12",
149
170
  "@types/nodemailer": "8.0.0",
150
171
  "@types/pluralize": "0.0.33",
151
172
  "@types/swagger-jsdoc": "6.0.4",
152
173
  "@typescript-eslint/eslint-plugin": "6.0.0",
153
174
  "@typescript-eslint/parser": "6.0.0",
154
175
  "esbuild": "0.25.1",
176
+ "express": "4.22.2",
155
177
  "fast-glob": "3.3.3",
156
178
  "jest": "29.7.0",
157
179
  "knip": "6.0.1",
158
180
  "mimetype": "0.0.8",
159
181
  "openapi-types": "12.1.3",
160
- "prisma": "6.19.2",
182
+ "prisma": "6.19.3",
161
183
  "ts-jest": "29.3.1",
162
184
  "ts-node": "^10.9.2",
163
185
  "ts-prune": "0.10.3",
164
- "tsx": "4.20.3",
186
+ "tsx": "4.23.1",
165
187
  "type-fest": "4.41.0",
166
- "typescript": "5.8.2"
188
+ "typescript": "5.8.2",
189
+ "zod": "3.25.76"
167
190
  },
168
191
  "dependencies": {
169
192
  "chokidar": "4.0.3",
@@ -171,28 +194,28 @@
171
194
  "pluralize": "8.0.0"
172
195
  },
173
196
  "peerDependencies": {
174
- "@prisma/client": "6.19.2",
197
+ "@prisma/client": "6.19.3",
175
198
  "@scalar/api-reference": "1.55.3",
176
- "@scalar/express-api-reference": "0.8.35",
199
+ "@scalar/express-api-reference": "0.10.12",
177
200
  "bcryptjs": "3.0.2",
178
201
  "class-transformer": "0.5.1",
179
- "class-validator": "0.14.1",
202
+ "class-validator": "0.15.1",
180
203
  "class-validator-jsonschema": "5.0.2",
181
204
  "compression": "1.8.1",
182
205
  "cookie-parser": "1.4.7",
183
206
  "cors": "2.8.6",
184
207
  "dotenv": "17.4.2",
185
208
  "dotenv-expand": "13.0.0",
186
- "express": "4.22.1",
187
- "express-rate-limit": "8.4.1",
209
+ "express": "4.22.2",
210
+ "express-rate-limit": "8.6.1",
188
211
  "html-to-text": "9.0.5",
189
212
  "jsonwebtoken": "9.0.3",
190
213
  "mimetype": "0.0.8",
191
- "nodemailer": "8.0.7",
192
- "sharp": "0.34.5",
193
- "multer": "2.1.1",
214
+ "multer": "2.2.0",
215
+ "nodemailer": "9.0.3",
216
+ "sharp": "0.35.3",
194
217
  "swagger-jsdoc": "6.2.8",
195
- "zod": "3.24.2",
218
+ "zod": "3.25.76",
196
219
  "zod-to-json-schema": "3.24.6"
197
220
  },
198
221
  "engines": {