@zintrust/core 0.1.8 → 0.1.9

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 (88) hide show
  1. package/README.md +17 -0
  2. package/package.json +1 -2
  3. package/src/cache/Cache.d.ts.map +1 -1
  4. package/src/cache/Cache.js +8 -2
  5. package/src/cache/CacheDriverRegistry.d.ts +15 -0
  6. package/src/cache/CacheDriverRegistry.d.ts.map +1 -0
  7. package/src/cache/CacheDriverRegistry.js +19 -0
  8. package/src/cli/commands/AddCommand.d.ts.map +1 -1
  9. package/src/cli/commands/AddCommand.js +20 -1
  10. package/src/cli/scaffolding/ControllerGenerator.js +2 -2
  11. package/src/cli/scaffolding/FeatureScaffolder.js +5 -5
  12. package/src/cli/scaffolding/RouteGenerator.js +1 -1
  13. package/src/cli/scaffolding/SeederGenerator.js +1 -1
  14. package/src/cli/scaffolding/ServiceIntegrationTestGenerator.js +1 -1
  15. package/src/cli/scaffolding/ServiceScaffolder.js +4 -4
  16. package/src/common/uuid.d.ts +1 -1
  17. package/src/common/uuid.d.ts.map +1 -1
  18. package/src/common/uuid.js +3 -3
  19. package/src/config/cache.js +1 -1
  20. package/src/config/mail.d.ts +8 -0
  21. package/src/config/mail.d.ts.map +1 -1
  22. package/src/config/mail.js +17 -0
  23. package/src/config/type.d.ts +11 -2
  24. package/src/config/type.d.ts.map +1 -1
  25. package/src/index.d.ts +4 -0
  26. package/src/index.d.ts.map +1 -1
  27. package/src/index.js +7 -0
  28. package/src/microservices/MicroserviceGenerator.js +7 -7
  29. package/src/microservices/PostgresAdapter.d.ts.map +1 -1
  30. package/src/microservices/PostgresAdapter.js +18 -0
  31. package/src/orm/Database.d.ts.map +1 -1
  32. package/src/orm/Database.js +5 -0
  33. package/src/orm/DatabaseAdapterRegistry.d.ts +14 -0
  34. package/src/orm/DatabaseAdapterRegistry.d.ts.map +1 -0
  35. package/src/orm/DatabaseAdapterRegistry.js +19 -0
  36. package/src/orm/adapters/SQLiteAdapter.d.ts.map +1 -1
  37. package/src/orm/adapters/SQLiteAdapter.js +33 -2
  38. package/src/runtime/PluginManager.d.ts.map +1 -1
  39. package/src/runtime/PluginManager.js +68 -0
  40. package/src/runtime/PluginRegistry.d.ts +6 -1
  41. package/src/runtime/PluginRegistry.d.ts.map +1 -1
  42. package/src/runtime/PluginRegistry.js +56 -34
  43. package/src/scripts/TemplateImportsCheck.d.ts +2 -0
  44. package/src/scripts/TemplateImportsCheck.d.ts.map +1 -0
  45. package/src/scripts/TemplateImportsCheck.js +111 -0
  46. package/src/templates/adapters/MySQLAdapter.ts.tpl +9 -5
  47. package/src/templates/adapters/PostgreSQLAdapter.ts.tpl +9 -5
  48. package/src/templates/adapters/SQLServerAdapter.ts.tpl +9 -5
  49. package/src/templates/adapters/SQLiteAdapter.ts.tpl +67 -18
  50. package/src/templates/features/Queue.ts.tpl +2 -3
  51. package/src/templates/project/basic/README.md.tpl +4 -0
  52. package/src/templates/project/basic/app/Controllers/UserController.ts.tpl +1 -1
  53. package/src/templates/project/basic/app/Models/Post.ts.tpl +1 -1
  54. package/src/templates/project/basic/app/Models/User.ts.tpl +1 -1
  55. package/src/templates/project/basic/config/FileLogWriter.ts.tpl +4 -3
  56. package/src/templates/project/basic/config/SecretsManager.ts.tpl +2 -2
  57. package/src/templates/project/basic/config/StartupConfigValidator.ts.tpl +2 -2
  58. package/src/templates/project/basic/config/app.ts.tpl +2 -2
  59. package/src/templates/project/basic/config/broadcast.ts.tpl +2 -2
  60. package/src/templates/project/basic/config/cache.ts.tpl +3 -3
  61. package/src/templates/project/basic/config/cloudflare.ts.tpl +1 -1
  62. package/src/templates/project/basic/config/database.ts.tpl +2 -2
  63. package/src/templates/project/basic/config/env.ts.tpl +1 -1
  64. package/src/templates/project/basic/config/features.ts.tpl +1 -1
  65. package/src/templates/project/basic/config/index.ts.tpl +16 -16
  66. package/src/templates/project/basic/config/logger.ts.tpl +9 -7
  67. package/src/templates/project/basic/config/logging/KvLogger.ts.tpl +2 -2
  68. package/src/templates/project/basic/config/mail.ts.tpl +17 -2
  69. package/src/templates/project/basic/config/middleware.ts.tpl +10 -7
  70. package/src/templates/project/basic/config/notification.ts.tpl +2 -2
  71. package/src/templates/project/basic/config/queue.ts.tpl +2 -2
  72. package/src/templates/project/basic/config/security.ts.tpl +4 -3
  73. package/src/templates/project/basic/config/startup.ts.tpl +1 -1
  74. package/src/templates/project/basic/config/storage.ts.tpl +2 -2
  75. package/src/templates/project/basic/config/type.ts.tpl +17 -5
  76. package/src/templates/project/basic/routes/api.ts.tpl +6 -6
  77. package/src/templates/project/basic/routes/health.ts.tpl +11 -7
  78. package/src/templates/project/basic/routes/storage.ts.tpl +8 -5
  79. package/src/templates/project/basic/src/index.ts.tpl +2 -0
  80. package/src/templates/project/basic/src/zintrust.plugins.ts.tpl +8 -0
  81. package/src/tools/broadcast/drivers/Redis.js +1 -1
  82. package/src/tools/mail/Mail.d.ts +1 -1
  83. package/src/tools/mail/Mail.d.ts.map +1 -1
  84. package/src/tools/mail/Mail.js +11 -0
  85. package/src/tools/mail/MailDriverRegistry.d.ts +16 -0
  86. package/src/tools/mail/MailDriverRegistry.d.ts.map +1 -0
  87. package/src/tools/mail/MailDriverRegistry.js +19 -0
  88. package/src/tools/queue/drivers/Redis.js +1 -1
@@ -3,13 +3,17 @@
3
3
  * Provides health, liveness, and readiness endpoints.
4
4
  */
5
5
 
6
- import { appConfig } from '@/config';
7
- import { RuntimeHealthProbes } from '@/health/RuntimeHealthProbes';
8
- import { Env } from '@zintrust/core';
9
- import { Logger } from '@config/logger';
10
- import { useDatabase } from '@zintrust/core';
11
- import { QueryBuilder } from '@zintrust/core';
12
- import { type IRouter, Router } from '@zintrust/core';
6
+ import {
7
+ Env,
8
+ Logger,
9
+ QueryBuilder,
10
+ RuntimeHealthProbes,
11
+ type IRouter,
12
+ Router,
13
+ useDatabase,
14
+ } from '@zintrust/core';
15
+
16
+ import { appConfig } from '../config';
13
17
 
14
18
  export function registerHealthRoutes(router: IRouter): void {
15
19
  registerHealthRoute(router);
@@ -1,8 +1,11 @@
1
- import { HTTP_HEADERS } from '@config/constants';
2
- import { Env } from '@zintrust/core';
3
- import { type IRouter, Router } from '@zintrust/core';
4
- import { LocalSignedUrl } from '@storage/LocalSignedUrl';
5
- import { Storage } from '@storage/index';
1
+ import {
2
+ Env,
3
+ HTTP_HEADERS,
4
+ LocalSignedUrl,
5
+ Storage,
6
+ type IRouter,
7
+ Router,
8
+ } from '@zintrust/core';
6
9
 
7
10
  export function registerStorageRoutes(router: IRouter): void {
8
11
  Router.get(router, '/storage/download', async (req, res) => {
@@ -4,6 +4,8 @@
4
4
 
5
5
  import { Application, Env, Logger, Server } from '@zintrust/core';
6
6
  import process from '@zintrust/core/node';
7
+ // Optional adapters/drivers registered via `zin plugin install`
8
+ import './zintrust.plugins.js';
7
9
 
8
10
  type AppInstance = ReturnType<typeof Application.create>;
9
11
  type ServerInstance = ReturnType<typeof Server.create>;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Zintrust plugin auto-imports
3
+ *
4
+ * This file is managed by `zin plugin install` and contains side-effect
5
+ * imports that register optional adapters/drivers into core registries.
6
+ */
7
+
8
+ // Intentionally empty by default.
@@ -41,7 +41,7 @@ export const RedisDriver = (() => {
41
41
  const globalFake = globalThis
42
42
  .__fakeRedisClient;
43
43
  if (globalFake === undefined) {
44
- throw ErrorFactory.createConfigError("Redis broadcast driver requires the 'redis' package or a test fake client set in globalThis.__fakeRedisClient");
44
+ throw ErrorFactory.createConfigError("Redis broadcast driver requires the 'redis' package (run `zin add broadcast:redis` / `zin plugin install broadcast:redis`, or `npm install redis`) or a test fake client set in globalThis.__fakeRedisClient");
45
45
  }
46
46
  client = globalFake;
47
47
  connected = true;
@@ -12,7 +12,7 @@ export type SendMailInput = {
12
12
  };
13
13
  export type SendMailResult = {
14
14
  ok: boolean;
15
- driver: 'sendgrid' | 'disabled' | 'smtp' | 'ses' | 'mailgun';
15
+ driver: 'sendgrid' | 'disabled' | 'smtp' | 'ses' | 'mailgun' | 'nodemailer';
16
16
  messageId?: string;
17
17
  };
18
18
  export declare const Mail: Readonly<{
@@ -1 +1 @@
1
- {"version":3,"file":"Mail.d.ts","sourceRoot":"","sources":["../../../../src/tools/mail/Mail.ts"],"names":[],"mappings":"AAQA,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAG7E,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAkIF,eAAO,MAAM,IAAI;gBACG,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;EAqBzD,CAAC;AAEH,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"Mail.d.ts","sourceRoot":"","sources":["../../../../src/tools/mail/Mail.ts"],"names":[],"mappings":"AAQA,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAI7E,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,GAAG,KAAK,GAAG,SAAS,GAAG,YAAY,CAAC;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AA6IF,eAAO,MAAM,IAAI;gBACG,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;EAqBzD,CAAC;AAEH,eAAe,IAAI,CAAC"}
@@ -5,6 +5,7 @@ import { SendGridDriver } from './drivers/SendGrid.js';
5
5
  import { SesDriver } from './drivers/Ses.js';
6
6
  import { SmtpDriver } from './drivers/Smtp.js';
7
7
  import { resolveAttachments } from './attachments.js';
8
+ import { MailDriverRegistry } from './MailDriverRegistry.js';
8
9
  import { Storage } from '../storage/index.js';
9
10
  const resolveFrom = (input) => {
10
11
  const address = input?.address ?? mailConfig.from.address;
@@ -76,6 +77,16 @@ const sendWithDriver = async (driver, message) => {
76
77
  const result = await SesDriver.send({ region: driver.region }, message);
77
78
  return { ok: result.ok, driver: 'ses', messageId: result.messageId };
78
79
  }
80
+ // External drivers can register via MailDriverRegistry (e.g., nodemailer)
81
+ const external = MailDriverRegistry.get(driver.driver);
82
+ if (external !== undefined) {
83
+ const result = await external(driver, message);
84
+ return {
85
+ ok: Boolean(result?.ok),
86
+ driver: driver.driver,
87
+ messageId: typeof result?.messageId === 'string' ? result.messageId : undefined,
88
+ };
89
+ }
79
90
  // Config exists for future drivers, but implementations are intentionally CLI/runtime-safe and added incrementally.
80
91
  {
81
92
  const err = ErrorFactory.createConfigError(`Mail driver not implemented: ${mailConfig.default}`);
@@ -0,0 +1,16 @@
1
+ export type MailSendHandler = (config: unknown, message: unknown) => Promise<{
2
+ ok: boolean;
3
+ messageId?: string;
4
+ }>;
5
+ declare function register(driver: string, handler: MailSendHandler): void;
6
+ declare function get(driver: string): MailSendHandler | undefined;
7
+ declare function has(driver: string): boolean;
8
+ declare function list(): string[];
9
+ export declare const MailDriverRegistry: Readonly<{
10
+ register: typeof register;
11
+ get: typeof get;
12
+ has: typeof has;
13
+ list: typeof list;
14
+ }>;
15
+ export {};
16
+ //# sourceMappingURL=MailDriverRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MailDriverRegistry.d.ts","sourceRoot":"","sources":["../../../../src/tools/mail/MailDriverRegistry.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,CAC5B,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,OAAO,KACb,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAIlD,iBAAS,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI,CAEhE;AAED,iBAAS,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAExD;AAED,iBAAS,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEpC;AAED,iBAAS,IAAI,IAAI,MAAM,EAAE,CAExB;AAED,eAAO,MAAM,kBAAkB;;;;;EAK7B,CAAC"}
@@ -0,0 +1,19 @@
1
+ const registry = new Map();
2
+ function register(driver, handler) {
3
+ registry.set(driver, handler);
4
+ }
5
+ function get(driver) {
6
+ return registry.get(driver);
7
+ }
8
+ function has(driver) {
9
+ return registry.has(driver);
10
+ }
11
+ function list() {
12
+ return Array.from(registry.keys());
13
+ }
14
+ export const MailDriverRegistry = Object.freeze({
15
+ register,
16
+ get,
17
+ has,
18
+ list,
19
+ });
@@ -43,7 +43,7 @@ export const RedisQueue = (() => {
43
43
  const globalFake = globalThis
44
44
  .__fakeRedisClient;
45
45
  if (globalFake === undefined) {
46
- throw ErrorFactory.createConfigError("Redis queue driver requires the 'redis' package or a test fake client set in globalThis.__fakeRedisClient");
46
+ throw ErrorFactory.createConfigError("Redis queue driver requires the 'redis' package (run `zin add queue:redis` / `zin plugin install queue:redis`, or `npm install redis`) or a test fake client set in globalThis.__fakeRedisClient");
47
47
  }
48
48
  client = globalFake;
49
49
  connected = true;