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
package/cli.js CHANGED
@@ -1,30 +1,28 @@
1
1
  #!/usr/bin/env node
2
2
  (async () => {
3
- const { join } = await import("path");
3
+ const { join, dirname } = await import("path");
4
4
  const { existsSync, readFileSync } = await import("fs");
5
5
  const { spawn } = await import("child_process");
6
+ const { fileURLToPath } = await import("node:url");
7
+
8
+ const __filename = fileURLToPath(import.meta.url);
9
+ const __dirname = dirname(__filename);
6
10
 
7
11
  const pkgPath = join(process.cwd(), "package.json");
8
12
  let useEsm = false;
9
-
10
13
  if (existsSync(pkgPath)) {
11
14
  const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
12
15
  useEsm = pkg.type === "module";
13
16
  }
14
-
15
- const tsSrc = join(process.cwd(), "tsconfig.json");
16
17
  const entryPoint = join(
17
18
  __dirname,
18
19
  `dist/${useEsm ? "esm" : "cjs"}/utils/cli/index.js`
19
20
  );
20
- const useTs = existsSync(tsSrc);
21
-
22
21
  const args = [
23
- ...(useTs ? ["--experimental-strip-types"] : []),
22
+ ...["--import", "tsx"],
24
23
  entryPoint,
25
24
  ...process.argv.slice(2),
26
25
  ];
27
-
28
26
  process.env.NO_CLI = "true";
29
27
  process.env.FORCE_COLOR = "3";
30
28
  process.env.__ARKOS_CLI = "true";
@@ -50,6 +50,8 @@ class EmailService {
50
50
  }
51
51
  : undefined,
52
52
  name,
53
+ user,
54
+ pass
53
55
  };
54
56
  }
55
57
  getTransporter(customConfig) {
@@ -58,7 +60,7 @@ class EmailService {
58
60
  return nodemailer_1.default.createTransport(config);
59
61
  }
60
62
  if (!this.transporter) {
61
- const { name, ...config } = this.getEmailConfig() || {};
63
+ const { name, user, pass, ...config } = this.getEmailConfig() || {};
62
64
  this.transporter = nodemailer_1.default.createTransport(config);
63
65
  }
64
66
  return this.transporter;
@@ -68,7 +70,7 @@ class EmailService {
68
70
  const transporter = connectionOptions
69
71
  ? this.getTransporter(connectionOptions)
70
72
  : this.getTransporter();
71
- const fromAddress = options.from || connectionOptions?.auth?.user || config.auth?.user;
73
+ const fromAddress = options.from || connectionOptions?.auth?.user || config.auth?.user || config?.user;
72
74
  if (connectionOptions || !skipVerification) {
73
75
  const isConnected = await this.verifyConnection(transporter);
74
76
  if (!isConnected)
@@ -1 +1 @@
1
- {"version":3,"file":"email.service.js","sourceRoot":"","sources":["../../../../src/modules/email/email.service.ts"],"names":[],"mappings":"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","sourcesContent":["import nodemailer, { SendMailOptions, Transporter } from \"nodemailer\";\nimport { convert } from \"html-to-text\";\nimport { getArkosConfig } from \"../../server\";\nimport AppError from \"../error-handler/utils/app-error\";\n\n/**\n * Defines the options for sending an email.\n */\nexport type EmailOptions = {\n subject: string;\n} & SendMailOptions;\n\n/**\n * Defines the authentication options for SMTP.\n */\nexport type SMTPAuthOptions = {\n user: string;\n pass: string;\n};\n\n/**\n * Defines the connection options for SMTP server.\n */\nexport type SMTPConnectionOptions = {\n host?: string;\n port?: number;\n secure?: boolean;\n auth?: SMTPAuthOptions;\n name?: string;\n};\n\n/**\n * A service class to handle email-related tasks, including sending emails.\n *\n * See the api reference [www.arkosjs.com/docs/reference/the-email-service-class](https://www.arkosjs.com/docs/reference/the-email-service-class)\n */\nexport class EmailService {\n transporter: Transporter | null = null;\n private customConfig: SMTPConnectionOptions | null = null;\n\n /**\n * Creates an instance of the EmailService class.\n *\n * @param {SMTPConnectionOptions} [config] - Optional custom SMTP configuration.\n * If provided, these settings will be used instead of the Arkos config.\n */\n constructor(config?: SMTPConnectionOptions) {\n if (config) {\n this.customConfig = config;\n }\n }\n\n /**\n * Gets the email configuration from multiple sources with priority:\n * 1. Constructor customConfig\n * 2. ArkosConfig\n * 3. Environment variables\n * @returns Configuration object with host, port, and auth details\n * @throws AppError if required email configuration is not set\n */\n private getEmailConfig(): SMTPConnectionOptions {\n if (this.customConfig) {\n return this.customConfig;\n }\n\n const { email: emailConfigs } = getArkosConfig();\n const host = emailConfigs?.host || process.env.EMAIL_HOST;\n const port =\n emailConfigs?.port ||\n (process.env.EMAIL_PORT ? parseInt(process.env.EMAIL_PORT) : undefined);\n const secure =\n emailConfigs?.secure !== undefined\n ? emailConfigs.secure\n : process.env.EMAIL_SECURE\n ? process.env.EMAIL_SECURE === \"true\"\n : undefined;\n const user = emailConfigs?.auth?.user || process.env.EMAIL_USER;\n const pass = emailConfigs?.auth?.pass || process.env.EMAIL_PASSWORD;\n const name = emailConfigs?.name || process.env.EMAIL_NAME;\n\n if (!host) {\n throw new AppError(\n \"You are trying to use emailService without setting email configurations. \" +\n \"Please configure either arkosConfig.email or environment variables (EMAIL_HOST)\",\n 500,\n {\n docs: \"Read more about emailService at https://www.arkosjs.com/docs/guides/email-service\",\n }\n );\n }\n\n return {\n ...emailConfigs,\n host,\n port: port || 465,\n secure: secure !== undefined ? secure : true,\n auth:\n user && pass\n ? {\n user,\n pass,\n }\n : undefined,\n name,\n };\n }\n\n /**\n * Gets or creates a transporter using the email configuration\n * @param customConfig Optional override connection settings (takes full priority if provided)\n * @returns A configured nodemailer transporter\n */\n private getTransporter(customConfig?: SMTPConnectionOptions): Transporter {\n if (customConfig) {\n const { name, ...config } = customConfig;\n return nodemailer.createTransport(config);\n }\n\n if (!this.transporter) {\n const { name, ...config } = this.getEmailConfig() || {};\n this.transporter = nodemailer.createTransport(config);\n }\n return this.transporter;\n }\n\n /**\n * Sends an email with the provided options.\n * Can use either the default configuration or custom connection options.\n *\n * @param {EmailOptions} options - The options for the email to be sent.\n * @param {SMTPConnectionOptions} [connectionOptions] - Optional custom connection settings.\n * @param {boolean} [skipVerification=false] - Whether to skip connection verification.\n * @returns {Promise<{ success: boolean; messageId?: string } & Record<string, any>>} Result with message ID on success.\n */\n public async send(\n options: EmailOptions & SendMailOptions,\n connectionOptions?: SMTPConnectionOptions,\n skipVerification: boolean = true\n ): Promise<{ success: boolean; messageId?: string } & Record<string, any>> {\n const config = this.getEmailConfig();\n const transporter = connectionOptions\n ? this.getTransporter(connectionOptions)\n : this.getTransporter();\n\n const fromAddress =\n options.from || connectionOptions?.auth?.user || config.auth?.user;\n\n if (connectionOptions || !skipVerification) {\n const isConnected = await this.verifyConnection(transporter);\n if (!isConnected) throw new Error(\"Failed to connect to email server\");\n }\n\n const info = await transporter.sendMail({\n ...options,\n from: fromAddress\n ? config.name\n ? `${config.name}<${fromAddress}>`\n : fromAddress\n : undefined,\n text:\n options?.text ||\n (typeof options.html === \"string\" && options.html\n ? convert(options.html as string)\n : undefined),\n });\n\n return { success: true, ...info };\n }\n\n /**\n * Verifies the connection to the email server.\n * @param {Transporter} [transporterToVerify] - Optional transporter to verify.\n * @returns {Promise<boolean>} A promise that resolves to true if connection is valid.\n */\n public async verifyConnection(\n transporterToVerify?: Transporter\n ): Promise<boolean> {\n try {\n const transporter = transporterToVerify || this.getTransporter();\n await transporter.verify();\n return true;\n } catch (error) {\n console.error(\"Email Server Connection Failed\", error);\n return false;\n }\n }\n\n /**\n * Updates the custom configuration for this email service instance.\n * @param {SMTPConnectionOptions} config - The new connection options.\n */\n public updateConfig(config: SMTPConnectionOptions): void {\n this.customConfig = config;\n this.transporter = null; // Reset transporter so it will be recreated with new config\n }\n\n /**\n * Creates a new instance of EmailService with custom configuration.\n * @param {SMTPConnectionOptions} config - The connection options for the new instance.\n * @returns {EmailService} A new EmailService instance.\n */\n public static create(config: SMTPConnectionOptions): EmailService {\n return new EmailService(config);\n }\n}\n\nconst emailService = new EmailService();\n\nexport default emailService;\n"]}
1
+ {"version":3,"file":"email.service.js","sourceRoot":"","sources":["../../../../src/modules/email/email.service.ts"],"names":[],"mappings":";;;;;;AAAA,4DAAsE;AACtE,+CAAuC;AACvC,yCAA8C;AAC9C,iFAAwD;AAmCxD,MAAa,YAAY;IAUvB,YAAY,MAA8B;QAT1C,gBAAW,GAAuB,IAAI,CAAC;QAC/B,iBAAY,GAAiC,IAAI,CAAC;QASxD,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;QAC7B,CAAC;IACH,CAAC;IAUO,cAAc;QACpB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC,YAAY,CAAC;QAC3B,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,IAAA,uBAAc,GAAE,CAAC;QACjD,MAAM,IAAI,GAAG,YAAY,EAAE,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;QAC1D,MAAM,IAAI,GACR,YAAY,EAAE,IAAI;YAClB,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC1E,MAAM,MAAM,GACV,YAAY,EAAE,MAAM,KAAK,SAAS;YAChC,CAAC,CAAC,YAAY,CAAC,MAAM;YACrB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY;gBACxB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,MAAM;gBACrC,CAAC,CAAC,SAAS,CAAC;QAClB,MAAM,IAAI,GAAG,YAAY,EAAE,IAAI,EAAE,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;QAChE,MAAM,IAAI,GAAG,YAAY,EAAE,IAAI,EAAE,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;QACpE,MAAM,IAAI,GAAG,YAAY,EAAE,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;QAE1D,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,mBAAQ,CAChB,2EAA2E;gBAC3E,iFAAiF,EACjF,GAAG,EACH;gBACE,IAAI,EAAE,mFAAmF;aAC1F,CACF,CAAC;QACJ,CAAC;QAED,OAAO;YACL,GAAG,YAAY;YACf,IAAI;YACJ,IAAI,EAAE,IAAI,IAAI,GAAG;YACjB,MAAM,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;YAC5C,IAAI,EACF,IAAI,IAAI,IAAI;gBACV,CAAC,CAAC;oBACA,IAAI;oBACJ,IAAI;iBACL;gBACD,CAAC,CAAC,SAAS;YACf,IAAI;YACJ,IAAI;YACJ,IAAI;SACL,CAAC;IACJ,CAAC;IAOO,cAAc,CAAC,YAAoC;QACzD,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,GAAG,YAAY,CAAC;YACzC,OAAO,oBAAU,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC;YACpE,IAAI,CAAC,WAAW,GAAG,oBAAU,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAWM,KAAK,CAAC,IAAI,CACf,OAAuC,EACvC,iBAAyC,EACzC,mBAA4B,IAAI;QAEhC,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACrC,MAAM,WAAW,GAAG,iBAAiB;YACnC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC;YACxC,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QAE1B,MAAM,WAAW,GACf,OAAO,CAAC,IAAI,IAAI,iBAAiB,EAAE,IAAI,EAAE,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,MAAM,EAAE,IAAI,CAAC;QAErF,IAAI,iBAAiB,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3C,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;YAC7D,IAAI,CAAC,WAAW;gBAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC;YACtC,GAAG,OAAO;YACV,IAAI,EAAE,WAAW;gBACf,CAAC,CAAC,MAAM,CAAC,IAAI;oBACX,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,WAAW,GAAG;oBAClC,CAAC,CAAC,WAAW;gBACf,CAAC,CAAC,SAAS;YACb,IAAI,EACF,OAAO,EAAE,IAAI;gBACb,CAAC,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI;oBAC/C,CAAC,CAAC,IAAA,sBAAO,EAAC,OAAO,CAAC,IAAc,CAAC;oBACjC,CAAC,CAAC,SAAS,CAAC;SACjB,CAAC,CAAC;QAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;IACpC,CAAC;IAOM,KAAK,CAAC,gBAAgB,CAC3B,mBAAiC;QAEjC,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,mBAAmB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACjE,MAAM,WAAW,CAAC,MAAM,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;YACvD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAMM,YAAY,CAAC,MAA6B;QAC/C,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;QAC3B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAOM,MAAM,CAAC,MAAM,CAAC,MAA6B;QAChD,OAAO,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;CACF;AA1KD,oCA0KC;AAED,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;AAExC,kBAAe,YAAY,CAAC","sourcesContent":["import nodemailer, { SendMailOptions, Transporter } from \"nodemailer\";\nimport { convert } from \"html-to-text\";\nimport { getArkosConfig } from \"../../server\";\nimport AppError from \"../error-handler/utils/app-error\";\n\n/**\n * Defines the options for sending an email.\n */\nexport type EmailOptions = {\n subject: string;\n} & SendMailOptions;\n\n/**\n * Defines the authentication options for SMTP.\n */\nexport type SMTPAuthOptions = {\n user: string;\n pass: string;\n};\n\n/**\n * Defines the connection options for SMTP server.\n */\nexport type SMTPConnectionOptions = {\n host?: string;\n port?: number;\n secure?: boolean;\n auth?: SMTPAuthOptions;\n name?: string;\n user?: string;\n pass?: string;\n};\n\n/**\n * A service class to handle email-related tasks, including sending emails.\n *\n * See the api reference [www.arkosjs.com/docs/reference/the-email-service-class](https://www.arkosjs.com/docs/reference/the-email-service-class)\n */\nexport class EmailService {\n transporter: Transporter | null = null;\n private customConfig: SMTPConnectionOptions | null = null;\n\n /**\n * Creates an instance of the EmailService class.\n *\n * @param {SMTPConnectionOptions} [config] - Optional custom SMTP configuration.\n * If provided, these settings will be used instead of the Arkos config.\n */\n constructor(config?: SMTPConnectionOptions) {\n if (config) {\n this.customConfig = config;\n }\n }\n\n /**\n * Gets the email configuration from multiple sources with priority:\n * 1. Constructor customConfig\n * 2. ArkosConfig\n * 3. Environment variables\n * @returns Configuration object with host, port, and auth details\n * @throws AppError if required email configuration is not set\n */\n private getEmailConfig(): SMTPConnectionOptions {\n if (this.customConfig) {\n return this.customConfig;\n }\n\n const { email: emailConfigs } = getArkosConfig();\n const host = emailConfigs?.host || process.env.EMAIL_HOST;\n const port =\n emailConfigs?.port ||\n (process.env.EMAIL_PORT ? parseInt(process.env.EMAIL_PORT) : undefined);\n const secure =\n emailConfigs?.secure !== undefined\n ? emailConfigs.secure\n : process.env.EMAIL_SECURE\n ? process.env.EMAIL_SECURE === \"true\"\n : undefined;\n const user = emailConfigs?.auth?.user || process.env.EMAIL_USER;\n const pass = emailConfigs?.auth?.pass || process.env.EMAIL_PASSWORD;\n const name = emailConfigs?.name || process.env.EMAIL_NAME;\n\n if (!host) {\n throw new AppError(\n \"You are trying to use emailService without setting email configurations. \" +\n \"Please configure either arkosConfig.email or environment variables (EMAIL_HOST)\",\n 500,\n {\n docs: \"Read more about emailService at https://www.arkosjs.com/docs/guides/email-service\",\n }\n );\n }\n\n return {\n ...emailConfigs,\n host,\n port: port || 465,\n secure: secure !== undefined ? secure : true,\n auth:\n user && pass\n ? {\n user,\n pass,\n }\n : undefined,\n name,\n user,\n pass\n };\n }\n\n /**\n * Gets or creates a transporter using the email configuration\n * @param customConfig Optional override connection settings (takes full priority if provided)\n * @returns A configured nodemailer transporter\n */\n private getTransporter(customConfig?: SMTPConnectionOptions): Transporter {\n if (customConfig) {\n const { name, ...config } = customConfig;\n return nodemailer.createTransport(config);\n }\n\n if (!this.transporter) {\n const { name, user, pass, ...config } = this.getEmailConfig() || {};\n this.transporter = nodemailer.createTransport(config);\n }\n return this.transporter;\n }\n\n /**\n * Sends an email with the provided options.\n * Can use either the default configuration or custom connection options.\n *\n * @param {EmailOptions} options - The options for the email to be sent.\n * @param {SMTPConnectionOptions} [connectionOptions] - Optional custom connection settings.\n * @param {boolean} [skipVerification=false] - Whether to skip connection verification.\n * @returns {Promise<{ success: boolean; messageId?: string } & Record<string, any>>} Result with message ID on success.\n */\n public async send(\n options: EmailOptions & SendMailOptions,\n connectionOptions?: SMTPConnectionOptions,\n skipVerification: boolean = true\n ): Promise<{ success: boolean; messageId?: string } & Record<string, any>> {\n const config = this.getEmailConfig();\n const transporter = connectionOptions\n ? this.getTransporter(connectionOptions)\n : this.getTransporter();\n\n const fromAddress =\n options.from || connectionOptions?.auth?.user || config.auth?.user || config?.user;\n\n if (connectionOptions || !skipVerification) {\n const isConnected = await this.verifyConnection(transporter);\n if (!isConnected) throw new Error(\"Failed to connect to email server\");\n }\n\n const info = await transporter.sendMail({\n ...options,\n from: fromAddress\n ? config.name\n ? `${config.name}<${fromAddress}>`\n : fromAddress\n : undefined,\n text:\n options?.text ||\n (typeof options.html === \"string\" && options.html\n ? convert(options.html as string)\n : undefined),\n });\n\n return { success: true, ...info };\n }\n\n /**\n * Verifies the connection to the email server.\n * @param {Transporter} [transporterToVerify] - Optional transporter to verify.\n * @returns {Promise<boolean>} A promise that resolves to true if connection is valid.\n */\n public async verifyConnection(\n transporterToVerify?: Transporter\n ): Promise<boolean> {\n try {\n const transporter = transporterToVerify || this.getTransporter();\n await transporter.verify();\n return true;\n } catch (error) {\n console.error(\"Email Server Connection Failed\", error);\n return false;\n }\n }\n\n /**\n * Updates the custom configuration for this email service instance.\n * @param {SMTPConnectionOptions} config - The new connection options.\n */\n public updateConfig(config: SMTPConnectionOptions): void {\n this.customConfig = config;\n this.transporter = null; // Reset transporter so it will be recreated with new config\n }\n\n /**\n * Creates a new instance of EmailService with custom configuration.\n * @param {SMTPConnectionOptions} config - The connection options for the new instance.\n * @returns {EmailService} A new EmailService instance.\n */\n public static create(config: SMTPConnectionOptions): EmailService {\n return new EmailService(config);\n }\n}\n\nconst emailService = new EmailService();\n\nexport default emailService;\n"]}
@@ -21,7 +21,7 @@ const file_upload_json_schema_generator_1 = __importDefault(require("./utils/fil
21
21
  const app_error_1 = __importDefault(require("../error-handler/utils/app-error.js"));
22
22
  function getFileUploadRouter(arkosConfig) {
23
23
  const router = (0, arkos_router_1.default)();
24
- const { fileUpload } = arkosConfig;
24
+ const { fileUpload, globalPrefix } = arkosConfig;
25
25
  if (!fileUpload?.enabled === false)
26
26
  return router;
27
27
  const moduleComponents = (0, dynamic_loader_1.getModuleComponents)("file-upload");
@@ -80,7 +80,7 @@ function getFileUploadRouter(arkosConfig) {
80
80
  cacheControl: true,
81
81
  }, fileUpload?.expressStatic || {})), (err, req, _res, next) => {
82
82
  if (err.code === "ENOENT") {
83
- const filepath = req.path.replace(`/api/${arkosConfig.fileUpload?.baseRoute}`.replace("//", "/"), "");
83
+ const filepath = req.path.replace(`${globalPrefix}/${arkosConfig.fileUpload?.baseRoute}`.replace("//", "/"), "");
84
84
  throw new app_error_1.default(`File ${filepath} was not found`, 404, "FileNotFound", { filepath });
85
85
  }
86
86
  next(err);
@@ -1 +1 @@
1
- {"version":3,"file":"file-upload.router.js","sourceRoot":"","sources":["../../../../src/modules/file-upload/file-upload.router.ts"],"names":[],"mappings":"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","sourcesContent":["import { Router } from \"express\";\nimport { getModuleComponents } from \"../../utils/dynamic-loader\";\nimport fileUploadController from \"./file-upload.controller\";\nimport express from \"express\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport { AuthConfigs } from \"../../types/auth\";\nimport { sendResponse } from \"../base/base.middlewares\";\nimport {\n createRouteConfig,\n processMiddleware,\n} from \"../../utils/helpers/routers.helpers\";\nimport { adjustRequestUrl } from \"./utils/helpers/file-upload.helpers\";\nimport { isEndpointDisabled } from \"../base/utils/helpers/base.router.helpers\";\nimport debuggerService from \"../debugger/debugger.service\";\nimport routerValidator from \"../base/utils/router-validator\";\nimport { getUserFileExtension } from \"../../utils/helpers/fs.helpers\";\nimport { ArkosNextFunction, ArkosRequest, ArkosResponse } from \"../../exports\";\nimport path from \"path\";\nimport ArkosRouter from \"../../utils/arkos-router\";\nimport { UserArkosConfig } from \"../../utils/define-config\";\nimport { FileUploadRouterEndpoint } from \"../../types/router-config\";\nimport fileUploadJsonSchemaGenerator from \"./utils/file-upload-json-schema-generator\";\nimport AppError from \"../error-handler/utils/app-error\";\n\nexport function getFileUploadRouter(arkosConfig: UserArkosConfig) {\n const router = ArkosRouter();\n const { fileUpload } = arkosConfig;\n\n if (!fileUpload?.enabled === false) return router;\n\n const moduleComponents = getModuleComponents(\"file-upload\");\n let {\n interceptors = {} as any,\n authConfigs = {} as AuthConfigs,\n router: customRouterModule,\n }: any = {};\n\n if (moduleComponents)\n ({\n interceptors = {},\n authConfigs = {},\n router: customRouterModule,\n } = moduleComponents);\n\n const routerConfig = customRouterModule?.config || {};\n if (routerConfig?.disable === true) return router;\n\n const customRouter = customRouterModule?.default as Router;\n let basePathname = fileUpload?.baseRoute || \"/api/uploads/\";\n\n if (!basePathname.startsWith(\"/\")) basePathname = \"/\" + basePathname;\n if (!basePathname.endsWith(\"/\")) basePathname = basePathname + \"/\";\n\n // Strip leading slash so createRouteConfig can prepend its own \"/\"\n // e.g. \"/api/uploads/\" → \"api/uploads/\" → createRouteConfig builds \"/api/uploads/*\"\n const baseRoutePrefix = basePathname.slice(1);\n\n if (customRouter && customRouterModule) {\n if (routerValidator.isExpressRouter(customRouter))\n router.use({ path: basePathname }, customRouter);\n else\n throw Error(\n `ValidationError: The exported router from file-upload.router.${getUserFileExtension()} is not a valid express or arkos Router.`\n );\n }\n\n const endpoints: FileUploadRouterEndpoint[] = [\n \"findFile\",\n \"uploadFile\",\n \"updateFile\",\n \"deleteFile\",\n ];\n\n for (const endpoint of endpoints) {\n const endpointConfig = routerConfig[endpoint];\n if (endpointConfig?.experimental?.openapi === false) continue;\n routerConfig[endpoint] = {\n ...(endpointConfig || {}),\n experimental: {\n ...(endpointConfig?.experimental || {}),\n openapi: fileUploadJsonSchemaGenerator.getOpenApiConfig(\n endpointConfig,\n endpoint\n ),\n },\n };\n }\n\n if (!isEndpointDisabled(routerConfig, \"findFile\")) {\n const baseUploadDirFullPath = path.resolve(\n path\n .join(process.cwd(), fileUpload?.baseUploadDir || \"uploads\")\n .replaceAll(\"//\", \"/\")\n );\n router.get(\n createRouteConfig(\n arkosConfig,\n \"findFile\",\n baseRoutePrefix,\n `*`,\n routerConfig,\n \"file-upload\",\n authConfigs\n ),\n ...processMiddleware(interceptors?.beforeFindFile),\n adjustRequestUrl,\n express.static(\n baseUploadDirFullPath,\n deepmerge(\n {\n maxAge: \"1y\",\n etag: true,\n lastModified: true,\n dotfiles: \"ignore\",\n fallthrough: false,\n index: false,\n cacheControl: true,\n },\n fileUpload?.expressStatic || {}\n )\n ),\n (\n err: any,\n req: ArkosRequest,\n _res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n if (err.code === \"ENOENT\") {\n const filepath = req.path.replace(\n `/api/${arkosConfig.fileUpload?.baseRoute}`.replace(\"//\", \"/\"),\n \"\"\n );\n throw new AppError(\n `File ${filepath} was not found`,\n 404,\n \"FileNotFound\",\n { filepath }\n );\n }\n\n next(err);\n },\n ...processMiddleware(interceptors?.onFindFileError, { type: \"error\" })\n );\n }\n\n if (!isEndpointDisabled(routerConfig, \"uploadFile\")) {\n router.post(\n createRouteConfig(\n arkosConfig,\n \"uploadFile\",\n baseRoutePrefix,\n `:fileType`,\n routerConfig,\n \"file-upload\",\n authConfigs\n ),\n ...processMiddleware(interceptors?.beforeUploadFile),\n fileUploadController.uploadFile,\n ...processMiddleware(interceptors?.afterUploadFile),\n sendResponse,\n ...processMiddleware(interceptors?.onUploadFileError, { type: \"error\" })\n );\n }\n\n if (!isEndpointDisabled(routerConfig, \"updateFile\")) {\n router.patch(\n createRouteConfig(\n arkosConfig,\n \"updateFile\",\n baseRoutePrefix,\n `:fileType/:fileName`,\n routerConfig,\n \"file-upload\",\n authConfigs\n ),\n ...processMiddleware(interceptors?.beforeUpdateFile),\n fileUploadController.updateFile,\n ...processMiddleware(interceptors?.afterUpdateFile),\n sendResponse,\n ...processMiddleware(interceptors?.onUpdateFileError, { type: \"error\" })\n );\n }\n\n if (!isEndpointDisabled(routerConfig, \"deleteFile\")) {\n router.delete(\n createRouteConfig(\n arkosConfig,\n \"deleteFile\",\n baseRoutePrefix,\n `:fileType/:fileName`,\n routerConfig,\n \"file-upload\",\n authConfigs\n ),\n ...processMiddleware(interceptors?.beforeDeleteFile),\n fileUploadController.deleteFile,\n ...processMiddleware(interceptors?.afterDeleteFile),\n sendResponse,\n ...processMiddleware(interceptors?.onDeleteFileError, { type: \"error\" })\n );\n }\n\n debuggerService.logModuleFinalRouter(\"file-upload\", router);\n return router;\n}\n"]}
1
+ {"version":3,"file":"file-upload.router.js","sourceRoot":"","sources":["../../../../src/modules/file-upload/file-upload.router.ts"],"names":[],"mappings":";;;;;AAwBA,kDAqLC;AA5MD,+DAAiE;AACjE,sFAA4D;AAC5D,sDAA8B;AAC9B,4FAA6D;AAE7D,+DAAwD;AACxD,yEAG6C;AAC7C,6EAAuE;AACvE,mFAA+E;AAC/E,oFAA2D;AAC3D,sFAA6D;AAC7D,+DAAsE;AAEtE,gDAAwB;AACxB,4EAAmD;AAGnD,kHAAsF;AACtF,iFAAwD;AAExD,SAAgB,mBAAmB,CAAC,WAA4B;IAC9D,MAAM,MAAM,GAAG,IAAA,sBAAW,GAAE,CAAC;IAC7B,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,WAAW,CAAC;IAEjD,IAAI,CAAC,UAAU,EAAE,OAAO,KAAK,KAAK;QAAE,OAAO,MAAM,CAAC;IAElD,MAAM,gBAAgB,GAAG,IAAA,oCAAmB,EAAC,aAAa,CAAC,CAAC;IAC5D,IAAI,EACF,YAAY,GAAG,EAAS,EACxB,WAAW,GAAG,EAAiB,EAC/B,MAAM,EAAE,kBAAkB,GAC3B,GAAQ,EAAE,CAAC;IAEZ,IAAI,gBAAgB;QAClB,CAAC;YACC,YAAY,GAAG,EAAE;YACjB,WAAW,GAAG,EAAE;YAChB,MAAM,EAAE,kBAAkB;SAC3B,GAAG,gBAAgB,CAAC,CAAC;IAExB,MAAM,YAAY,GAAG,kBAAkB,EAAE,MAAM,IAAI,EAAE,CAAC;IACtD,IAAI,YAAY,EAAE,OAAO,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAElD,MAAM,YAAY,GAAG,kBAAkB,EAAE,OAAiB,CAAC;IAC3D,IAAI,YAAY,GAAG,UAAU,EAAE,SAAS,IAAI,eAAe,CAAC;IAE5D,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,YAAY,GAAG,GAAG,GAAG,YAAY,CAAC;IACrE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,YAAY,GAAG,YAAY,GAAG,GAAG,CAAC;IAInE,MAAM,eAAe,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE9C,IAAI,YAAY,IAAI,kBAAkB,EAAE,CAAC;QACvC,IAAI,0BAAe,CAAC,eAAe,CAAC,YAAY,CAAC;YAC/C,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,YAAY,CAAC,CAAC;;YAEjD,MAAM,KAAK,CACT,gEAAgE,IAAA,iCAAoB,GAAE,0CAA0C,CACjI,CAAC;IACN,CAAC;IAED,MAAM,SAAS,GAA+B;QAC5C,UAAU;QACV,YAAY;QACZ,YAAY;QACZ,YAAY;KACb,CAAC;IAEF,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,cAAc,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,cAAc,EAAE,YAAY,EAAE,OAAO,KAAK,KAAK;YAAE,SAAS;QAC9D,YAAY,CAAC,QAAQ,CAAC,GAAG;YACvB,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC;YACzB,YAAY,EAAE;gBACZ,GAAG,CAAC,cAAc,EAAE,YAAY,IAAI,EAAE,CAAC;gBACvC,OAAO,EAAE,2CAA6B,CAAC,gBAAgB,CACrD,cAAc,EACd,QAAQ,CACT;aACF;SACF,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,IAAA,wCAAkB,EAAC,YAAY,EAAE,UAAU,CAAC,EAAE,CAAC;QAClD,MAAM,qBAAqB,GAAG,cAAI,CAAC,OAAO,CACxC,cAAI;aACD,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,aAAa,IAAI,SAAS,CAAC;aAC3D,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CACzB,CAAC;QACF,MAAM,CAAC,GAAG,CACR,IAAA,mCAAiB,EACf,WAAW,EACX,UAAU,EACV,eAAe,EACf,GAAG,EACH,YAAY,EACZ,aAAa,EACb,WAAW,CACZ,EACD,GAAG,IAAA,mCAAiB,EAAC,YAAY,EAAE,cAAc,CAAC,EAClD,sCAAgB,EAChB,iBAAO,CAAC,MAAM,CACZ,qBAAqB,EACrB,IAAA,0BAAS,EACP;YACE,MAAM,EAAE,IAAI;YACZ,IAAI,EAAE,IAAI;YACV,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,QAAQ;YAClB,WAAW,EAAE,KAAK;YAClB,KAAK,EAAE,KAAK;YACZ,YAAY,EAAE,IAAI;SACnB,EACD,UAAU,EAAE,aAAa,IAAI,EAAE,CAChC,CACF,EACD,CACE,GAAQ,EACR,GAAiB,EACjB,IAAmB,EACnB,IAAuB,EACvB,EAAE;YACF,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC1B,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,CAC/B,GAAG,YAAY,IAAI,WAAW,CAAC,UAAU,EAAE,SAAS,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EACzE,EAAE,CACH,CAAC;gBACF,MAAM,IAAI,mBAAQ,CAChB,QAAQ,QAAQ,gBAAgB,EAChC,GAAG,EACH,cAAc,EACd,EAAE,QAAQ,EAAE,CACb,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,CAAC,EACD,GAAG,IAAA,mCAAiB,EAAC,YAAY,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CACvE,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,IAAA,wCAAkB,EAAC,YAAY,EAAE,YAAY,CAAC,EAAE,CAAC;QACpD,MAAM,CAAC,IAAI,CACT,IAAA,mCAAiB,EACf,WAAW,EACX,YAAY,EACZ,eAAe,EACf,WAAW,EACX,YAAY,EACZ,aAAa,EACb,WAAW,CACZ,EACD,GAAG,IAAA,mCAAiB,EAAC,YAAY,EAAE,gBAAgB,CAAC,EACpD,gCAAoB,CAAC,UAAU,EAC/B,GAAG,IAAA,mCAAiB,EAAC,YAAY,EAAE,eAAe,CAAC,EACnD,+BAAY,EACZ,GAAG,IAAA,mCAAiB,EAAC,YAAY,EAAE,iBAAiB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CACzE,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,IAAA,wCAAkB,EAAC,YAAY,EAAE,YAAY,CAAC,EAAE,CAAC;QACpD,MAAM,CAAC,KAAK,CACV,IAAA,mCAAiB,EACf,WAAW,EACX,YAAY,EACZ,eAAe,EACf,qBAAqB,EACrB,YAAY,EACZ,aAAa,EACb,WAAW,CACZ,EACD,GAAG,IAAA,mCAAiB,EAAC,YAAY,EAAE,gBAAgB,CAAC,EACpD,gCAAoB,CAAC,UAAU,EAC/B,GAAG,IAAA,mCAAiB,EAAC,YAAY,EAAE,eAAe,CAAC,EACnD,+BAAY,EACZ,GAAG,IAAA,mCAAiB,EAAC,YAAY,EAAE,iBAAiB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CACzE,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,IAAA,wCAAkB,EAAC,YAAY,EAAE,YAAY,CAAC,EAAE,CAAC;QACpD,MAAM,CAAC,MAAM,CACX,IAAA,mCAAiB,EACf,WAAW,EACX,YAAY,EACZ,eAAe,EACf,qBAAqB,EACrB,YAAY,EACZ,aAAa,EACb,WAAW,CACZ,EACD,GAAG,IAAA,mCAAiB,EAAC,YAAY,EAAE,gBAAgB,CAAC,EACpD,gCAAoB,CAAC,UAAU,EAC/B,GAAG,IAAA,mCAAiB,EAAC,YAAY,EAAE,eAAe,CAAC,EACnD,+BAAY,EACZ,GAAG,IAAA,mCAAiB,EAAC,YAAY,EAAE,iBAAiB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CACzE,CAAC;IACJ,CAAC;IAED,0BAAe,CAAC,oBAAoB,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAC5D,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import { Router } from \"express\";\nimport { getModuleComponents } from \"../../utils/dynamic-loader\";\nimport fileUploadController from \"./file-upload.controller\";\nimport express from \"express\";\nimport deepmerge from \"../../utils/helpers/deepmerge.helper\";\nimport { AuthConfigs } from \"../../types/auth\";\nimport { sendResponse } from \"../base/base.middlewares\";\nimport {\n createRouteConfig,\n processMiddleware,\n} from \"../../utils/helpers/routers.helpers\";\nimport { adjustRequestUrl } from \"./utils/helpers/file-upload.helpers\";\nimport { isEndpointDisabled } from \"../base/utils/helpers/base.router.helpers\";\nimport debuggerService from \"../debugger/debugger.service\";\nimport routerValidator from \"../base/utils/router-validator\";\nimport { getUserFileExtension } from \"../../utils/helpers/fs.helpers\";\nimport { ArkosNextFunction, ArkosRequest, ArkosResponse } from \"../../exports\";\nimport path from \"path\";\nimport ArkosRouter from \"../../utils/arkos-router\";\nimport { UserArkosConfig } from \"../../utils/define-config\";\nimport { FileUploadRouterEndpoint } from \"../../types/router-config\";\nimport fileUploadJsonSchemaGenerator from \"./utils/file-upload-json-schema-generator\";\nimport AppError from \"../error-handler/utils/app-error\";\n\nexport function getFileUploadRouter(arkosConfig: UserArkosConfig) {\n const router = ArkosRouter();\n const { fileUpload, globalPrefix } = arkosConfig;\n\n if (!fileUpload?.enabled === false) return router;\n\n const moduleComponents = getModuleComponents(\"file-upload\");\n let {\n interceptors = {} as any,\n authConfigs = {} as AuthConfigs,\n router: customRouterModule,\n }: any = {};\n\n if (moduleComponents)\n ({\n interceptors = {},\n authConfigs = {},\n router: customRouterModule,\n } = moduleComponents);\n\n const routerConfig = customRouterModule?.config || {};\n if (routerConfig?.disable === true) return router;\n\n const customRouter = customRouterModule?.default as Router;\n let basePathname = fileUpload?.baseRoute || \"/api/uploads/\";\n\n if (!basePathname.startsWith(\"/\")) basePathname = \"/\" + basePathname;\n if (!basePathname.endsWith(\"/\")) basePathname = basePathname + \"/\";\n\n // Strip leading slash so createRouteConfig can prepend its own \"/\"\n // e.g. \"/api/uploads/\" → \"api/uploads/\" → createRouteConfig builds \"/api/uploads/*\"\n const baseRoutePrefix = basePathname.slice(1);\n\n if (customRouter && customRouterModule) {\n if (routerValidator.isExpressRouter(customRouter))\n router.use({ path: basePathname }, customRouter);\n else\n throw Error(\n `ValidationError: The exported router from file-upload.router.${getUserFileExtension()} is not a valid express or arkos Router.`\n );\n }\n\n const endpoints: FileUploadRouterEndpoint[] = [\n \"findFile\",\n \"uploadFile\",\n \"updateFile\",\n \"deleteFile\",\n ];\n\n for (const endpoint of endpoints) {\n const endpointConfig = routerConfig[endpoint];\n if (endpointConfig?.experimental?.openapi === false) continue;\n routerConfig[endpoint] = {\n ...(endpointConfig || {}),\n experimental: {\n ...(endpointConfig?.experimental || {}),\n openapi: fileUploadJsonSchemaGenerator.getOpenApiConfig(\n endpointConfig,\n endpoint\n ),\n },\n };\n }\n\n if (!isEndpointDisabled(routerConfig, \"findFile\")) {\n const baseUploadDirFullPath = path.resolve(\n path\n .join(process.cwd(), fileUpload?.baseUploadDir || \"uploads\")\n .replaceAll(\"//\", \"/\")\n );\n router.get(\n createRouteConfig(\n arkosConfig,\n \"findFile\",\n baseRoutePrefix,\n `*`,\n routerConfig,\n \"file-upload\",\n authConfigs\n ),\n ...processMiddleware(interceptors?.beforeFindFile),\n adjustRequestUrl,\n express.static(\n baseUploadDirFullPath,\n deepmerge(\n {\n maxAge: \"1y\",\n etag: true,\n lastModified: true,\n dotfiles: \"ignore\",\n fallthrough: false,\n index: false,\n cacheControl: true,\n },\n fileUpload?.expressStatic || {}\n )\n ),\n (\n err: any,\n req: ArkosRequest,\n _res: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n if (err.code === \"ENOENT\") {\n const filepath = req.path.replace(\n `${globalPrefix}/${arkosConfig.fileUpload?.baseRoute}`.replace(\"//\", \"/\"),\n \"\"\n );\n throw new AppError(\n `File ${filepath} was not found`,\n 404,\n \"FileNotFound\",\n { filepath }\n );\n }\n\n next(err);\n },\n ...processMiddleware(interceptors?.onFindFileError, { type: \"error\" })\n );\n }\n\n if (!isEndpointDisabled(routerConfig, \"uploadFile\")) {\n router.post(\n createRouteConfig(\n arkosConfig,\n \"uploadFile\",\n baseRoutePrefix,\n `:fileType`,\n routerConfig,\n \"file-upload\",\n authConfigs\n ),\n ...processMiddleware(interceptors?.beforeUploadFile),\n fileUploadController.uploadFile,\n ...processMiddleware(interceptors?.afterUploadFile),\n sendResponse,\n ...processMiddleware(interceptors?.onUploadFileError, { type: \"error\" })\n );\n }\n\n if (!isEndpointDisabled(routerConfig, \"updateFile\")) {\n router.patch(\n createRouteConfig(\n arkosConfig,\n \"updateFile\",\n baseRoutePrefix,\n `:fileType/:fileName`,\n routerConfig,\n \"file-upload\",\n authConfigs\n ),\n ...processMiddleware(interceptors?.beforeUpdateFile),\n fileUploadController.updateFile,\n ...processMiddleware(interceptors?.afterUpdateFile),\n sendResponse,\n ...processMiddleware(interceptors?.onUpdateFileError, { type: \"error\" })\n );\n }\n\n if (!isEndpointDisabled(routerConfig, \"deleteFile\")) {\n router.delete(\n createRouteConfig(\n arkosConfig,\n \"deleteFile\",\n baseRoutePrefix,\n `:fileType/:fileName`,\n routerConfig,\n \"file-upload\",\n authConfigs\n ),\n ...processMiddleware(interceptors?.beforeDeleteFile),\n fileUploadController.deleteFile,\n ...processMiddleware(interceptors?.afterDeleteFile),\n sendResponse,\n ...processMiddleware(interceptors?.onDeleteFileError, { type: \"error\" })\n );\n }\n\n debuggerService.logModuleFinalRouter(\"file-upload\", router);\n return router;\n}\n"]}
@@ -33,26 +33,13 @@ async function devCommand(options = {}) {
33
33
  }
34
34
  const fileExt = (0, fs_helpers_1.getUserFileExtension)();
35
35
  const entryPointRelative = path_1.default.relative(process.cwd(), entryPoint);
36
- const baseServiceTypesPath = path_1.default.resolve(process.cwd(), `node_modules/@arkosjs/generated/cjs/index.js`);
36
+ const baseServiceTypesPath = path_1.default.resolve(process.cwd(), `.arkos/index.d.ts`);
37
37
  if (fileExt === "ts" &&
38
38
  !fs_1.default.existsSync(baseServiceTypesPath) &&
39
39
  fs_1.default.existsSync(path_1.default.resolve(path_1.default.join(process.cwd(), "prisma")))) {
40
- const answer = await new Promise((resolve) => {
41
- sheu_1.default.warn('Missing base services types please run "npx arkos prisma generate" to generate and sync the types from @prisma/client');
42
- process.stdout.write(`\n${sheu_1.default.green("?", { bold: true })} Would you like to run "npx arkos prisma generate"? (Y/n): `);
43
- process.stdin.once("data", (data) => {
44
- const result = data.toString().trim().toLowerCase();
45
- process.stdin.pause();
46
- resolve(result === "y" || result.length === 0);
47
- });
48
- });
49
- if (answer) {
50
- console.info("\nSyncing base service with @prisma/client...");
51
- console.log("");
52
- (0, child_process_1.execSync)(`npx arkos prisma generate`);
53
- }
54
- else
55
- throw Error('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/tooling/cli/overviewarkos-cli#typescript-types-generation.');
40
+ console.info("\nGenerating arkos types and prisma client...");
41
+ console.log("");
42
+ (0, child_process_1.execSync)(`npx arkos prisma generate`);
56
43
  }
57
44
  const getEnv = () => ({
58
45
  NODE_ENV: "development",
@@ -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 { fullCleanCwd, 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\";\nimport { getArkosConfig } from \"../helpers/arkos-config.helpers\";\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 process.env.NO_CLI = \"true\";\n\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 config = getArkosConfig();\n\n const entryPoint = path.resolve(process.cwd(), config.source?.entryPoint!);\n\n if (!fs.existsSync(entryPoint)) {\n console.error(\n `Could not find application entry point at ${fullCleanCwd(entryPoint).replaceAll(/^\\/+/g, \"\")}`\n );\n return process.exit(1);\n }\n\n const fileExt = getUserFileExtension();\n\n const entryPointRelative = path.relative(process.cwd(), entryPoint);\n\n const baseServiceTypesPath = path.resolve(\n process.cwd(),\n `node_modules/@arkosjs/generated/cjs/index.js`\n );\n if (\n fileExt === \"ts\" &&\n !fs.existsSync(baseServiceTypesPath) &&\n fs.existsSync(path.resolve(path.join(process.cwd(), \"prisma\")))\n ) {\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/tooling/cli/overviewarkos-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\", entryPointRelative], {\n stdio: [\"inherit\", \"inherit\", \"inherit\", \"ipc\"],\n env,\n });\n } else {\n env.TSX_TSCONFIG_PATH = \"./jsconfig.json\";\n child = spawn(\n \"npx\",\n [\"tsx-strict\", \"--no-type-check\", \"--watch\", entryPointRelative],\n {\n stdio: [\"inherit\", \"inherit\", \"inherit\", \"ipc\"],\n env,\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"]}
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 { fullCleanCwd, 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\";\nimport { getArkosConfig } from \"../helpers/arkos-config.helpers\";\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 process.env.NO_CLI = \"true\";\n\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 config = getArkosConfig();\n\n const entryPoint = path.resolve(process.cwd(), config.source?.entryPoint!);\n\n if (!fs.existsSync(entryPoint)) {\n console.error(\n `Could not find application entry point at ${fullCleanCwd(entryPoint).replaceAll(/^\\/+/g, \"\")}`\n );\n return process.exit(1);\n }\n\n const fileExt = getUserFileExtension();\n\n const entryPointRelative = path.relative(process.cwd(), entryPoint);\n\n const baseServiceTypesPath = path.resolve(\n process.cwd(),\n `.arkos/index.d.ts`\n );\n if (\n fileExt === \"ts\" &&\n !fs.existsSync(baseServiceTypesPath) &&\n fs.existsSync(path.resolve(path.join(process.cwd(), \"prisma\")))\n ) {\n console.info(\"\\nGenerating arkos types and prisma client...\");\n console.log(\"\");\n execSync(`npx arkos prisma generate`);\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\", entryPointRelative], {\n stdio: [\"inherit\", \"inherit\", \"inherit\", \"ipc\"],\n env,\n });\n } else {\n env.TSX_TSCONFIG_PATH = \"./jsconfig.json\";\n child = spawn(\n \"npx\",\n [\"tsx-strict\", \"--no-type-check\", \"--watch\", entryPointRelative],\n {\n stdio: [\"inherit\", \"inherit\", \"inherit\", \"ipc\"],\n env,\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"]}
@@ -10,9 +10,13 @@ const fs_1 = __importDefault(require("fs"));
10
10
  const child_process_1 = require("child_process");
11
11
  const sheu_1 = __importDefault(require("../sheu.js"));
12
12
  const path_1 = __importDefault(require("path"));
13
- const GENERATED_PACKAGE_NAME = "@arkosjs/generated";
13
+ const fs_helpers_1 = require("../helpers/fs.helpers.js");
14
+ const bundler_1 = require("../bundler.js");
14
15
  function getGeneratedPackageDir() {
15
- return path_1.default.resolve(process.cwd(), `node_modules/${GENERATED_PACKAGE_NAME}`);
16
+ return path_1.default.resolve(process.cwd(), `.arkos`);
17
+ }
18
+ function getPrismaGeneratedPath() {
19
+ return prisma_schema_parser_1.default.config.clientOutput ? path_1.default.resolve(path_1.default.join((0, fs_helpers_1.crd)(), prisma_schema_parser_1.default.config.clientOutput)) : "@prisma/client";
16
20
  }
17
21
  function buildTypesContent() {
18
22
  const modelEntries = prisma_schema_parser_1.default.models
@@ -32,7 +36,7 @@ function buildTypesContent() {
32
36
  };`)
33
37
  .join("");
34
38
  return `
35
- import { Prisma, PrismaClient } from "@prisma/client";
39
+ import { Prisma, PrismaClient } from "${getPrismaGeneratedPath()}";
36
40
  import { ServiceBaseContext } from "arkos/services";
37
41
  import { ArkosPrismaInput } from "arkos/prisma";
38
42
 
@@ -60,53 +64,64 @@ export type ExtractPrismaQueryOptions<T, K extends keyof T = never> = Omit<T, K>
60
64
  export { PrismaClient };
61
65
  `;
62
66
  }
63
- function buildCjsContent() {
64
- return `
65
- "use strict";
66
- Object.defineProperty(exports, "__esModule", { value: true });
67
- exports.PrismaClient = void 0;
68
- const client_1 = require("@prisma/client");
69
- exports.PrismaClient = client_1.PrismaClient;
70
- `;
71
- }
72
67
  function buildEsmContent() {
73
68
  return `
74
- export { PrismaClient } from "@prisma/client";
69
+ export { PrismaClient } from "${getPrismaGeneratedPath()}";
75
70
  `;
76
71
  }
77
- function buildPackageJson() {
78
- return JSON.stringify({
79
- name: GENERATED_PACKAGE_NAME,
80
- version: "1.0.0",
81
- types: "./index.d.ts",
82
- main: "./cjs/index.js",
83
- module: "./esm/index.js",
84
- exports: {
85
- ".": {
86
- require: "./cjs/index.js",
87
- import: "./esm/index.js",
88
- types: "./index.d.ts",
89
- },
90
- },
91
- }, null, 2);
72
+ function updateTsConfigPaths() {
73
+ var _a;
74
+ const tsconfigPath = path_1.default.join((0, fs_helpers_1.crd)(), "tsconfig.json");
75
+ if (!fs_1.default.existsSync(tsconfigPath)) {
76
+ sheu_1.default.warn("tsconfig.json not found, skipping @arkosjs/generated path mapping.", { timestamp: true });
77
+ return;
78
+ }
79
+ let tsconfig;
80
+ try {
81
+ tsconfig = bundler_1.bundler.readJsonWithComments(tsconfigPath);
82
+ }
83
+ catch (err) {
84
+ sheu_1.default.warn(`Failed to parse tsconfig.json, skipping @arkosjs/generated path mapping: ${err.message}`);
85
+ return;
86
+ }
87
+ tsconfig.compilerOptions ?? (tsconfig.compilerOptions = {});
88
+ (_a = tsconfig.compilerOptions).paths ?? (_a.paths = {});
89
+ const generatedDtsPath = "./.arkos/index.d.ts";
90
+ const existing = tsconfig.compilerOptions.paths["@arkosjs/generated"];
91
+ if (Array.isArray(existing) && existing.includes(generatedDtsPath))
92
+ return;
93
+ tsconfig.compilerOptions.paths["@arkosjs/generated"] = [generatedDtsPath];
94
+ fs_1.default.writeFileSync(tsconfigPath, JSON.stringify(tsconfig, null, 2) + "\n", "utf8");
95
+ sheu_1.default.done(`@arkosjs/generated path mapping added to tsconfig.json!`);
96
+ }
97
+ function updateGitIgnore() {
98
+ const gitignorePath = path_1.default.join((0, fs_helpers_1.crd)(), ".gitignore");
99
+ if (!fs_1.default.existsSync(gitignorePath)) {
100
+ sheu_1.default.warn(".gitignore not found, skipping .arkos ignore entry.", { timestamp: true });
101
+ return;
102
+ }
103
+ const content = fs_1.default.readFileSync(gitignorePath, "utf8");
104
+ const lines = content
105
+ .split(/\r?\n/)
106
+ .map((line) => line.trim());
107
+ if (lines.includes(".arkos"))
108
+ return;
109
+ const updated = content.replace(/\s*$/, "") + "\n.arkos\n";
110
+ fs_1.default.writeFileSync(gitignorePath, updated, "utf8");
111
+ sheu_1.default.done(".arkos added to .gitignore!");
92
112
  }
93
113
  function prismaGenerateCommand() {
94
114
  (0, child_process_1.execSync)("npx prisma generate", { stdio: "inherit" });
95
115
  const pkgDir = getGeneratedPackageDir();
96
- fs_1.default.mkdirSync(path_1.default.join(pkgDir, "cjs"), { recursive: true });
97
116
  fs_1.default.mkdirSync(path_1.default.join(pkgDir, "esm"), { recursive: true });
98
117
  fs_1.default.writeFileSync(path_1.default.join(pkgDir, "index.d.ts"), buildTypesContent(), {
99
118
  encoding: "utf8",
100
119
  });
101
- fs_1.default.writeFileSync(path_1.default.join(pkgDir, "cjs", "index.js"), buildCjsContent(), {
102
- encoding: "utf8",
103
- });
104
120
  fs_1.default.writeFileSync(path_1.default.join(pkgDir, "esm", "index.js"), buildEsmContent(), {
105
121
  encoding: "utf8",
106
122
  });
107
- fs_1.default.writeFileSync(path_1.default.join(pkgDir, "package.json"), buildPackageJson(), {
108
- encoding: "utf8",
109
- });
110
- sheu_1.default.done(`Types and values for ${GENERATED_PACKAGE_NAME} and @prisma/client generated successfully!`);
123
+ updateTsConfigPaths();
124
+ updateGitIgnore();
125
+ sheu_1.default.done(`Types and values for arkos and prisma client generated successfully!`);
111
126
  }
112
127
  //# sourceMappingURL=prisma-generate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prisma-generate.js","sourceRoot":"","sources":["../../../../src/utils/cli/prisma-generate.ts"],"names":[],"mappings":";;;;;AAoGA,wCA2BC;AA/HD,0FAAgE;AAChE,wEAA2D;AAC3D,4CAAoB;AACpB,iDAAyC;AACzC,mDAA2B;AAC3B,gDAAwB;AAExB,MAAM,sBAAsB,GAAG,oBAAoB,CAAC;AAEpD,SAAS,sBAAsB;IAC7B,OAAO,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,sBAAsB,EAAE,CAAC,CAAC;AAC/E,CAAC;AAED,SAAS,iBAAiB;IACxB,MAAM,YAAY,GAAG,8BAAkB,CAAC,MAAM;SAC3C,GAAG,CACF,CAAC,KAAK,EAAE,EAAE,CAAC;KACZ,IAAA,+BAAS,EAAC,KAAK,CAAC,IAAI,CAAC;uBACH,KAAK,CAAC,IAAI;yBACR,KAAK,CAAC,IAAI;2BACR,KAAK,CAAC,IAAI;4BACT,KAAK,CAAC,IAAI;yBACb,KAAK,CAAC,IAAI;6BACN,KAAK,CAAC,IAAI;yBACd,KAAK,CAAC,IAAI;6BACN,KAAK,CAAC,IAAI;yBACd,KAAK,CAAC,IAAI;6BACN,KAAK,CAAC,IAAI;wBACf,KAAK,CAAC,IAAI;KAC7B,CACA;SACA,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,OAAO;;;;;;;;;;;;;;;;;;;6DAmBoD,YAAY;;;;;;;;CAQxE,CAAC;AACF,CAAC;AAED,SAAS,eAAe;IACtB,OAAO;;;;;;CAMR,CAAC;AACF,CAAC;AAED,SAAS,eAAe;IACtB,OAAO;;CAER,CAAC;AACF,CAAC;AAED,SAAS,gBAAgB;IACvB,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,cAAc;QACrB,IAAI,EAAE,gBAAgB;QACtB,MAAM,EAAE,gBAAgB;QACxB,OAAO,EAAE;YACP,GAAG,EAAE;gBACH,OAAO,EAAE,gBAAgB;gBACzB,MAAM,EAAE,gBAAgB;gBACxB,KAAK,EAAE,cAAc;aACtB;SACF;KACF,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,SAAwB,qBAAqB;IAC3C,IAAA,wBAAQ,EAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAEtD,MAAM,MAAM,GAAG,sBAAsB,EAAE,CAAC;IAExC,YAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,YAAE,CAAC,SAAS,CAAC,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5D,YAAE,CAAC,aAAa,CAAC,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,iBAAiB,EAAE,EAAE;QACrE,QAAQ,EAAE,MAAM;KACjB,CAAC,CAAC;IAEH,YAAE,CAAC,aAAa,CAAC,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,eAAe,EAAE,EAAE;QACxE,QAAQ,EAAE,MAAM;KACjB,CAAC,CAAC;IAEH,YAAE,CAAC,aAAa,CAAC,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,eAAe,EAAE,EAAE;QACxE,QAAQ,EAAE,MAAM;KACjB,CAAC,CAAC;IAEH,YAAE,CAAC,aAAa,CAAC,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,gBAAgB,EAAE,EAAE;QACtE,QAAQ,EAAE,MAAM;KACjB,CAAC,CAAC;IAEH,cAAI,CAAC,IAAI,CACP,wBAAwB,sBAAsB,6CAA6C,CAC5F,CAAC;AACJ,CAAC","sourcesContent":["import prismaSchemaParser from \"../prisma/prisma-schema-parser\";\nimport { kebabCase } from \"../helpers/change-case.helpers\";\nimport fs from \"fs\";\nimport { execSync } from \"child_process\";\nimport sheu from \"../sheu\";\nimport path from \"path\";\n\nconst GENERATED_PACKAGE_NAME = \"@arkosjs/generated\";\n\nfunction getGeneratedPackageDir(): string {\n return path.resolve(process.cwd(), `node_modules/${GENERATED_PACKAGE_NAME}`);\n}\n\nfunction buildTypesContent(): string {\n const modelEntries = prismaSchemaParser.models\n .map(\n (model) => `\n \"${kebabCase(model.name)}\": {\n Delegate: Prisma.${model.name}Delegate;\n GetPayload: Prisma.${model.name}GetPayload<T>;\n FindManyArgs: Prisma.${model.name}FindManyArgs;\n FindFirstArgs: Prisma.${model.name}FindFirstArgs;\n CreateArgs: Prisma.${model.name}CreateArgs;\n CreateManyArgs: Prisma.${model.name}CreateManyArgs;\n UpdateArgs: Prisma.${model.name}UpdateArgs;\n UpdateManyArgs: Prisma.${model.name}UpdateManyArgs;\n DeleteArgs: Prisma.${model.name}DeleteArgs;\n DeleteManyArgs: Prisma.${model.name}DeleteManyArgs;\n CountArgs: Prisma.${model.name}CountArgs;\n };`\n )\n .join(\"\");\n\n return `\nimport { Prisma, PrismaClient } from \"@prisma/client\";\nimport { ServiceBaseContext } from \"arkos/services\";\nimport { ArkosPrismaInput } from \"arkos/prisma\";\n\nexport interface PrismaField {\n name: string;\n type: string;\n isOptional: boolean;\n isArray: boolean;\n foreignKeyField?: string;\n foreignReferenceField?: string;\n isRelation: boolean;\n defaultValue?: any;\n isId?: boolean;\n isUnique?: boolean;\n attributes: string[];\n}\n\nexport type PrismaModels<T extends Record<string, any>> = {${modelEntries}\n};\n\nexport type ExtractPrismaFilters<T> = T extends { where?: infer W; [x: string]: any } ? W : any;\nexport type ExtractPrismaData<T> = T extends { data: infer D; [x: string]: any } ? D : any;\nexport type ExtractPrismaQueryOptions<T, K extends keyof T = never> = Omit<T, K>;\n\nexport { PrismaClient };\n`;\n}\n\nfunction buildCjsContent(): string {\n return `\n\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.PrismaClient = void 0;\nconst client_1 = require(\"@prisma/client\");\nexports.PrismaClient = client_1.PrismaClient;\n`;\n}\n\nfunction buildEsmContent(): string {\n return `\nexport { PrismaClient } from \"@prisma/client\";\n`;\n}\n\nfunction buildPackageJson(): string {\n return JSON.stringify(\n {\n name: GENERATED_PACKAGE_NAME,\n version: \"1.0.0\",\n types: \"./index.d.ts\",\n main: \"./cjs/index.js\",\n module: \"./esm/index.js\",\n exports: {\n \".\": {\n require: \"./cjs/index.js\",\n import: \"./esm/index.js\",\n types: \"./index.d.ts\",\n },\n },\n },\n null,\n 2\n );\n}\n\nexport default function prismaGenerateCommand() {\n execSync(\"npx prisma generate\", { stdio: \"inherit\" });\n\n const pkgDir = getGeneratedPackageDir();\n\n fs.mkdirSync(path.join(pkgDir, \"cjs\"), { recursive: true });\n fs.mkdirSync(path.join(pkgDir, \"esm\"), { recursive: true });\n\n fs.writeFileSync(path.join(pkgDir, \"index.d.ts\"), buildTypesContent(), {\n encoding: \"utf8\",\n });\n\n fs.writeFileSync(path.join(pkgDir, \"cjs\", \"index.js\"), buildCjsContent(), {\n encoding: \"utf8\",\n });\n\n fs.writeFileSync(path.join(pkgDir, \"esm\", \"index.js\"), buildEsmContent(), {\n encoding: \"utf8\",\n });\n\n fs.writeFileSync(path.join(pkgDir, \"package.json\"), buildPackageJson(), {\n encoding: \"utf8\",\n });\n\n sheu.done(\n `Types and values for ${GENERATED_PACKAGE_NAME} and @prisma/client generated successfully!`\n );\n}\n"]}
1
+ {"version":3,"file":"prisma-generate.js","sourceRoot":"","sources":["../../../../src/utils/cli/prisma-generate.ts"],"names":[],"mappings":"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","sourcesContent":["import prismaSchemaParser from \"../prisma/prisma-schema-parser\";\nimport { kebabCase } from \"../helpers/change-case.helpers\";\nimport fs from \"fs\";\nimport { execSync } from \"child_process\";\nimport sheu from \"../sheu\";\nimport path from \"path\";\nimport { crd } from \"../helpers/fs.helpers\";\nimport { bundler } from \"../bundler\";\n\nfunction getGeneratedPackageDir(): string {\n return path.resolve(process.cwd(), `.arkos`);\n}\n\nfunction getPrismaGeneratedPath() {\n return prismaSchemaParser.config.clientOutput ? path.resolve(path.join(crd(), prismaSchemaParser.config.clientOutput)) : \"@prisma/client\"\n}\n\nfunction buildTypesContent(): string {\n const modelEntries = prismaSchemaParser.models\n .map(\n (model) => `\n \"${kebabCase(model.name)}\": {\n Delegate: Prisma.${model.name}Delegate;\n GetPayload: Prisma.${model.name}GetPayload<T>;\n FindManyArgs: Prisma.${model.name}FindManyArgs;\n FindFirstArgs: Prisma.${model.name}FindFirstArgs;\n CreateArgs: Prisma.${model.name}CreateArgs;\n CreateManyArgs: Prisma.${model.name}CreateManyArgs;\n UpdateArgs: Prisma.${model.name}UpdateArgs;\n UpdateManyArgs: Prisma.${model.name}UpdateManyArgs;\n DeleteArgs: Prisma.${model.name}DeleteArgs;\n DeleteManyArgs: Prisma.${model.name}DeleteManyArgs;\n CountArgs: Prisma.${model.name}CountArgs;\n };`\n )\n .join(\"\");\n\n return `\nimport { Prisma, PrismaClient } from \"${getPrismaGeneratedPath()}\";\nimport { ServiceBaseContext } from \"arkos/services\";\nimport { ArkosPrismaInput } from \"arkos/prisma\";\n\nexport interface PrismaField {\n name: string;\n type: string;\n isOptional: boolean;\n isArray: boolean;\n foreignKeyField?: string;\n foreignReferenceField?: string;\n isRelation: boolean;\n defaultValue?: any;\n isId?: boolean;\n isUnique?: boolean;\n attributes: string[];\n}\n\nexport type PrismaModels<T extends Record<string, any>> = {${modelEntries}\n};\n\nexport type ExtractPrismaFilters<T> = T extends { where?: infer W; [x: string]: any } ? W : any;\nexport type ExtractPrismaData<T> = T extends { data: infer D; [x: string]: any } ? D : any;\nexport type ExtractPrismaQueryOptions<T, K extends keyof T = never> = Omit<T, K>;\n\nexport { PrismaClient };\n`;\n}\n\nfunction buildEsmContent(): string {\n return `\nexport { PrismaClient } from \"${getPrismaGeneratedPath()}\";\n`;\n}\n\n/**\n * Adds/updates the `@arkosjs/generated` path alias in the project's\n * tsconfig.json, pointing it at the generated `.arkos/index.d.ts` file.\n * Reuses Bundler's tolerant JSONC parser so comments/trailing commas in\n * the user's tsconfig don't break parsing.\n */\nfunction updateTsConfigPaths(): void {\n const tsconfigPath = path.join(crd(), \"tsconfig.json\");\n\n if (!fs.existsSync(tsconfigPath)) {\n sheu.warn(\n \"tsconfig.json not found, skipping @arkosjs/generated path mapping.\", { timestamp: true }\n );\n return;\n }\n\n let tsconfig: any;\n try {\n tsconfig = bundler.readJsonWithComments(tsconfigPath);\n } catch (err) {\n sheu.warn(\n `Failed to parse tsconfig.json, skipping @arkosjs/generated path mapping: ${(err as Error).message\n }`\n );\n return;\n }\n\n tsconfig.compilerOptions ??= {};\n tsconfig.compilerOptions.paths ??= {};\n\n const generatedDtsPath = \"./.arkos/index.d.ts\";\n const existing = tsconfig.compilerOptions.paths[\"@arkosjs/generated\"];\n\n if (Array.isArray(existing) && existing.includes(generatedDtsPath))\n return\n\n tsconfig.compilerOptions.paths[\"@arkosjs/generated\"] = [generatedDtsPath];\n\n fs.writeFileSync(\n tsconfigPath,\n JSON.stringify(tsconfig, null, 2) + \"\\n\",\n \"utf8\"\n );\n\n sheu.done(`@arkosjs/generated path mapping added to tsconfig.json!`);\n}\n\nfunction updateGitIgnore(): void {\n const gitignorePath = path.join(crd(), \".gitignore\");\n\n if (!fs.existsSync(gitignorePath)) {\n sheu.warn(\n \".gitignore not found, skipping .arkos ignore entry.\",\n { timestamp: true }\n );\n return;\n }\n\n const content = fs.readFileSync(gitignorePath, \"utf8\");\n const lines = content\n .split(/\\r?\\n/)\n .map((line) => line.trim());\n\n if (lines.includes(\".arkos\")) return;\n\n const updated =\n content.replace(/\\s*$/, \"\") + \"\\n.arkos\\n\";\n\n fs.writeFileSync(gitignorePath, updated, \"utf8\");\n\n sheu.done(\".arkos added to .gitignore!\");\n}\n\nexport default function prismaGenerateCommand() {\n execSync(\"npx prisma generate\", { stdio: \"inherit\" });\n const pkgDir = getGeneratedPackageDir();\n fs.mkdirSync(path.join(pkgDir, \"esm\"), { recursive: true });\n fs.writeFileSync(path.join(pkgDir, \"index.d.ts\"), buildTypesContent(), {\n encoding: \"utf8\",\n });\n fs.writeFileSync(path.join(pkgDir, \"esm\", \"index.js\"), buildEsmContent(), {\n encoding: \"utf8\",\n });\n updateTsConfigPaths();\n updateGitIgnore();\n sheu.done(\n `Types and values for arkos and prisma client generated successfully!`\n );\n}\n"]}
@@ -19,6 +19,6 @@ function killServerChildProcess() {
19
19
  (0, start_1.killProductionServerChildProcess)();
20
20
  }
21
21
  function getVersion() {
22
- return "1.6.7-beta";
22
+ return "1.6.8-beta";
23
23
  }
24
24
  //# sourceMappingURL=cli.helpers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"router-template.js","sourceRoot":"","sources":["../../../../../../../src/utils/cli/utils/template-generator/templates/router-template.ts"],"names":[],"mappings":";;;;;AAOA,wDAiCC;AAxCD,0DAAgD;AAChD,+DAAsE;AACtE,gDAAsD;AAGtD,mEAA8D;AAE9D,SAAgB,sBAAsB,CAAC,OAAwB;IAC7D,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAE9B,IAAI,CAAC,SAAS;QACZ,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAEjE,MAAM,cAAc,GAAG,CAAC,GAAG,4BAAiB,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC,QAAQ,CAC3E,SAAS,CAAC,KAAK,CAChB,CAAC;IACF,MAAM,GAAG,GAAG,IAAA,iCAAoB,GAAE,CAAC;IAEnC,MAAM,kBAAkB,GACtB,GAAG,KAAK,IAAI;QACV,CAAC,CAAC,eAAe,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,UAAU,GAAG;QAC3G,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,wBAAwB,GAC5B,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,mCAAmC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1D,MAAM,WAAW,GAAG,cAAc;QAChC,CAAC,CAAC;mBACa,kBAAkB;CACpC;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO,uCAAuC,SAAS,CAAC,KAAK,KAAK,aAAa,CAAC,CAAC,CAAC,2CAA2C,CAAC,CAAC,CAAC,EAAE;EAClI,wBAAwB;EACxB,WAAW;;QAEL,SAAS,CAAC,KAAK;uBACA,IAAA,mBAAS,EAAC,IAAA,yBAAU,EAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;;;iBAGjE,SAAS,CAAC,KAAK;CAC/B,CAAC;AACF,CAAC","sourcesContent":["import pluralize, { singular } from \"pluralize\";\nimport { getUserFileExtension } from \"../../../../helpers/fs.helpers\";\nimport { kebabPrismaModels } from \"../../../generate\";\nimport { TemplateOptions } from \"../../template-generators\";\nimport { pascalCase } from \"../../../../helpers/change-case.helpers\";\nimport { capitalize } from \"../../../../helpers/text.helpers\";\n\nexport function generateRouterTemplate(options: TemplateOptions): string {\n const { modelName } = options;\n\n if (!modelName)\n throw new Error(\"Module name is required for router template\");\n\n const isNormalModule = [...kebabPrismaModels, \"file-upload\", \"auth\"].includes(\n modelName.kebab\n );\n const ext = getUserFileExtension();\n\n const routerConfigTsType =\n ext === \"ts\"\n ? `: RouteHook<${[\"file-upload\", \"auth\"].includes(modelName.kebab) ? `\"${modelName.kebab}\"` : '\"prisma\"'}>`\n : \"\";\n const routerConfigTsTypeImport =\n ext === \"ts\" ? \"import { RouteHook } from 'arkos'\" : \"\";\n const routeConfig = isNormalModule\n ? `\nexport const hook${routerConfigTsType} = { }\n`\n : \"\";\n\n return `import { ArkosRouter } from 'arkos';${modelName.kebab === \"file-upload\" ? \"\\nimport config from '../../arkos.config'\" : \"\"}\n${routerConfigTsTypeImport}\n${routeConfig}\n\nconst ${modelName.camel}Router = ArkosRouter({ \n openapi: { tags: [\"${pluralize(capitalize(modelName.kebab.replaceAll(\"-\", \" \")))}\"] }\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":";;;;;AAMA,wDAiCC;AAvCD,0DAAkC;AAClC,+DAAsE;AACtE,gDAAsD;AAEtD,mEAA8D;AAE9D,SAAgB,sBAAsB,CAAC,OAAwB;IAC7D,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAE9B,IAAI,CAAC,SAAS;QACZ,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAEjE,MAAM,cAAc,GAAG,CAAC,GAAG,4BAAiB,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC,QAAQ,CAC3E,SAAS,CAAC,KAAK,CAChB,CAAC;IACF,MAAM,GAAG,GAAG,IAAA,iCAAoB,GAAE,CAAC;IAEnC,MAAM,kBAAkB,GACtB,GAAG,KAAK,IAAI;QACV,CAAC,CAAC,eAAe,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,UAAU,GAAG;QAC3G,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,wBAAwB,GAC5B,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,mCAAmC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1D,MAAM,WAAW,GAAG,cAAc;QAChC,CAAC,CAAC;mBACa,kBAAkB;CACpC;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO,uCAAuC,SAAS,CAAC,KAAK,KAAK,aAAa,CAAC,CAAC,CAAC,2CAA2C,CAAC,CAAC,CAAC,EAAE;EAClI,wBAAwB;EACxB,WAAW;;QAEL,SAAS,CAAC,KAAK;uBACA,IAAA,mBAAS,EAAC,IAAA,yBAAU,EAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;;;iBAGjE,SAAS,CAAC,KAAK;CAC/B,CAAC;AACF,CAAC","sourcesContent":["import pluralize from \"pluralize\";\nimport { getUserFileExtension } from \"../../../../helpers/fs.helpers\";\nimport { kebabPrismaModels } from \"../../../generate\";\nimport { TemplateOptions } from \"../../template-generators\";\nimport { capitalize } from \"../../../../helpers/text.helpers\";\n\nexport function generateRouterTemplate(options: TemplateOptions): string {\n const { modelName } = options;\n\n if (!modelName)\n throw new Error(\"Module name is required for router template\");\n\n const isNormalModule = [...kebabPrismaModels, \"file-upload\", \"auth\"].includes(\n modelName.kebab\n );\n const ext = getUserFileExtension();\n\n const routerConfigTsType =\n ext === \"ts\"\n ? `: RouteHook<${[\"file-upload\", \"auth\"].includes(modelName.kebab) ? `\"${modelName.kebab}\"` : '\"prisma\"'}>`\n : \"\";\n const routerConfigTsTypeImport =\n ext === \"ts\" ? \"import { RouteHook } from 'arkos'\" : \"\";\n const routeConfig = isNormalModule\n ? `\nexport const hook${routerConfigTsType} = { }\n`\n : \"\";\n\n return `import { ArkosRouter } from 'arkos';${modelName.kebab === \"file-upload\" ? \"\\nimport config from '../../arkos.config'\" : \"\"}\n${routerConfigTsTypeImport}\n${routeConfig}\n\nconst ${modelName.camel}Router = ArkosRouter({ \n openapi: { tags: [\"${pluralize(capitalize(modelName.kebab.replaceAll(\"-\", \" \")))}\"] }\n})\n\nexport default ${modelName.camel}Router\n`;\n}\n"]}
@@ -48,14 +48,17 @@ const fsHelpers = __importStar(require("./fs.helpers.js"));
48
48
  const prisma_helpers_1 = require("./prisma.helpers.js");
49
49
  const fs_helpers_1 = require("./fs.helpers");
50
50
  let definedArkosConfig = {};
51
+ const configFilename = `arkos.config.${fsHelpers.getUserFileExtension()}`;
51
52
  try {
52
53
  definedArkosConfig = process.env.NO_CLI === "true" ? __importDefault(require(`${fs_helpers_1.crd()}/arkos.config.${fs_helpers_1.getUserFileExtension()}`)) : () => {};
53
54
  }
54
55
  catch (err) {
55
- if (err.message.toLowerCase().includes("cannot find module"))
56
- sheu_1.default.warn(`Using default configs, because arkos.config.${fsHelpers.getUserFileExtension()} was not found`, {
56
+ if (err.message.toLowerCase().includes(`${configFilename}'`))
57
+ sheu_1.default.warn(`Using default configs, because ${configFilename} was not found`, {
57
58
  timestamp: true,
58
59
  });
60
+ else
61
+ throw err;
59
62
  }
60
63
  function isUsingAuthentication() {
61
64
  const { authentication } = getArkosConfig();
@@ -1 +1 @@
1
- {"version":3,"file":"arkos-config.helpers.js","sourceRoot":"","sources":["../../../../src/utils/helpers/arkos-config.helpers.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBA,sDAIC;AAED,0DAIC;AAOD,wCA0BC;AAOD,oCAEC;AAED,kDAuBC;AAlGD,oDAAiE;AACjE,mDAA2B;AAC3B,8DAAqC;AACrC,wDAA0C;AAC1C,qDAAqD;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,cAAI,CAAC,IAAI,CACP,+CAA+C,SAAS,CAAC,oBAAoB,EAAE,gBAAgB,EAC/F;YACE,SAAS,EAAE,IAAI;SAChB,CACF,CAAC;AACN,CAAC;AAED,SAAgB,qBAAqB;IACnC,MAAM,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAAC;IAE5C,OAAO,cAAc,EAAE,IAAI,CAAC;AAC9B,CAAC;AAED,SAAgB,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,SAAgB,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,cAAI,CAAC,KAAK,CACR,0BAA0B,UAAU,8GAA8G,UAAU;;;;;;;CAOjK,CACI,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,IAAA,4BAAY,EAAC,MAAM,CAAQ,CAAC;AACrC,CAAC;AAOD,SAAgB,YAAY;IAC1B,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,MAAM,CAAC;AAC5C,CAAC;AAED,SAAgB,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,IAAA,oBAAS,EACb,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,IAAA,oBAAS,EACb,qHAAqH,CACtH,CAAC;IAEJ,IAAI,qBAAqB,IAAI,CAAC,IAAA,kCAAiB,GAAE;QAC/C,MAAM,IAAA,oBAAS,EACb,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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBA,sDAIC;AAED,0DAIC;AAOD,wCA0BC;AAOD,oCAEC;AAED,kDAuBC;AApGD,oDAAiE;AACjE,mDAA2B;AAC3B,8DAAqC;AACrC,wDAA0C;AAC1C,qDAAqD;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,cAAI,CAAC,IAAI,CACP,kCAAkC,cAAc,gBAAgB,EAChE;YACE,SAAS,EAAE,IAAI;SAChB,CACF,CAAC;;QACC,MAAM,GAAG,CAAA;AAChB,CAAC;AAED,SAAgB,qBAAqB;IACnC,MAAM,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAAC;IAE5C,OAAO,cAAc,EAAE,IAAI,CAAC;AAC9B,CAAC;AAED,SAAgB,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,SAAgB,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,cAAI,CAAC,KAAK,CACR,0BAA0B,UAAU,8GAA8G,UAAU;;;;;;;CAOjK,CACI,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,IAAA,4BAAY,EAAC,MAAM,CAAQ,CAAC;AACrC,CAAC;AAOD,SAAgB,YAAY;IAC1B,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,MAAM,CAAC;AAC5C,CAAC;AAED,SAAgB,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,IAAA,oBAAS,EACb,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,IAAA,oBAAS,EACb,qHAAqH,CACtH,CAAC;IAEJ,IAAI,qBAAqB,IAAI,CAAC,IAAA,kCAAiB,GAAE;QAC/C,MAAM,IAAA,oBAAS,EACb,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"]}
@@ -294,6 +294,7 @@ ${fieldDefinitions}${mapDirective}
294
294
  generatorProvider: "",
295
295
  datasourceProvider: "",
296
296
  datasourceUrl: "",
297
+ clientOutput: "",
297
298
  };
298
299
  const lines = this.getPrismaSchemasContent().split("\n");
299
300
  let inGenerator = false;
@@ -332,6 +333,11 @@ ${fieldDefinitions}${mapDirective}
332
333
  config.datasourceProvider = match[1];
333
334
  }
334
335
  }
336
+ if (inGenerator && trimmed.includes("output")) {
337
+ const match = trimmed.match(/output\s*=\s*"([^"]+)"/);
338
+ if (match)
339
+ config.clientOutput = match[1];
340
+ }
335
341
  if (inDatasource && trimmed.includes("url")) {
336
342
  const match = trimmed.match(/url\s*=\s*(env\("([^"]+)"\)|"([^"]+)")/);
337
343
  if (match) {