@zintrust/core 0.1.14 → 0.1.15

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 (33) hide show
  1. package/package.json +1 -1
  2. package/src/boot/Application.d.ts.map +1 -1
  3. package/src/boot/Application.js +29 -61
  4. package/src/config/broadcast.d.ts.map +1 -1
  5. package/src/config/broadcast.js +5 -3
  6. package/src/config/cache.d.ts.map +1 -1
  7. package/src/config/cache.js +12 -6
  8. package/src/config/database.d.ts.map +1 -1
  9. package/src/config/database.js +5 -3
  10. package/src/config/mail.d.ts.map +1 -1
  11. package/src/config/mail.js +21 -14
  12. package/src/config/notification.d.ts.map +1 -1
  13. package/src/config/notification.js +10 -5
  14. package/src/config/storage.d.ts.map +1 -1
  15. package/src/config/storage.js +5 -6
  16. package/src/orm/DatabaseRuntimeRegistration.d.ts.map +1 -1
  17. package/src/orm/DatabaseRuntimeRegistration.js +4 -2
  18. package/src/templates/project/basic/config/broadcast.ts.tpl +8 -6
  19. package/src/templates/project/basic/config/cache.ts.tpl +19 -7
  20. package/src/templates/project/basic/config/database.ts.tpl +8 -6
  21. package/src/templates/project/basic/config/mail.ts.tpl +24 -14
  22. package/src/templates/project/basic/config/notification.ts.tpl +17 -5
  23. package/src/templates/project/basic/config/storage.ts.tpl +10 -8
  24. package/src/tools/broadcast/BroadcastRuntimeRegistration.d.ts.map +1 -1
  25. package/src/tools/broadcast/BroadcastRuntimeRegistration.js +7 -4
  26. package/src/tools/notification/NotificationRuntimeRegistration.d.ts.map +1 -1
  27. package/src/tools/notification/NotificationRuntimeRegistration.js +7 -4
  28. package/src/tools/queue/Queue.d.ts.map +1 -1
  29. package/src/tools/queue/Queue.js +4 -1
  30. package/src/tools/queue/QueueRuntimeRegistration.d.ts.map +1 -1
  31. package/src/tools/queue/QueueRuntimeRegistration.js +5 -8
  32. package/src/tools/storage/StorageRuntimeRegistration.d.ts.map +1 -1
  33. package/src/tools/storage/StorageRuntimeRegistration.js +8 -10
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zintrust/core",
3
- "version": "0.1.14",
3
+ "version": "0.1.15",
4
4
  "description": "Production-grade TypeScript backend framework for JavaScript",
5
5
  "homepage": "https://zintrust.com",
6
6
  "repository": {
@@ -1 +1 @@
1
- {"version":3,"file":"Application.d.ts","sourceRoot":"","sources":["../../../src/boot/Application.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,iBAAiB,EAAoB,MAAM,8BAA8B,CAAC;AAEnF,OAAO,EAAE,gBAAgB,EAAmB,MAAM,8BAA8B,CAAC;AACjF,OAAO,EAAE,KAAK,OAAO,EAAU,MAAM,kBAAkB,CAAC;AASxD,MAAM,WAAW,YAAY;IAC3B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,QAAQ,IAAI,OAAO,CAAC;IACpB,aAAa,IAAI,OAAO,CAAC;IACzB,YAAY,IAAI,OAAO,CAAC;IACxB,SAAS,IAAI,OAAO,CAAC;IACrB,cAAc,IAAI,MAAM,CAAC;IACzB,SAAS,IAAI,OAAO,CAAC;IACrB,YAAY,IAAI,iBAAiB,CAAC;IAClC,kBAAkB,IAAI,gBAAgB,CAAC;IACvC,WAAW,IAAI,MAAM,CAAC;CACvB;AAkVD;;GAEG;AACH,eAAO,MAAM,WAAW;IACtB;;OAEG;sBACe,MAAM,GAAG,YAAY;EA0CvC,CAAC;AAEH,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"Application.d.ts","sourceRoot":"","sources":["../../../src/boot/Application.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,iBAAiB,EAAoB,MAAM,8BAA8B,CAAC;AAEnF,OAAO,EAAE,gBAAgB,EAAmB,MAAM,8BAA8B,CAAC;AACjF,OAAO,EAAE,KAAK,OAAO,EAAU,MAAM,kBAAkB,CAAC;AASxD,MAAM,WAAW,YAAY;IAC3B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,QAAQ,IAAI,OAAO,CAAC;IACpB,aAAa,IAAI,OAAO,CAAC;IACzB,YAAY,IAAI,OAAO,CAAC;IACxB,SAAS,IAAI,OAAO,CAAC;IACrB,cAAc,IAAI,MAAM,CAAC;IACzB,SAAS,IAAI,OAAO,CAAC;IACrB,YAAY,IAAI,iBAAiB,CAAC;IAClC,kBAAkB,IAAI,gBAAgB,CAAC;IACvC,WAAW,IAAI,MAAM,CAAC;CACvB;AAsUD;;GAEG;AACH,eAAO,MAAM,WAAW;IACtB;;OAEG;sBACe,MAAM,GAAG,YAAY;EA0CvC,CAAC;AAEH,eAAe,WAAW,CAAC"}
@@ -197,6 +197,34 @@ const initializeArtifactDirectories = async (resolvedBasePath) => {
197
197
  }
198
198
  }
199
199
  };
200
+ const tryImportOptional = async (modulePath) => {
201
+ try {
202
+ return (await import(modulePath));
203
+ }
204
+ catch {
205
+ return undefined;
206
+ }
207
+ };
208
+ const registerFromRuntimeConfig = async () => {
209
+ const db = await tryImportOptional('@orm/DatabaseRuntimeRegistration');
210
+ db?.registerDatabasesFromRuntimeConfig?.(databaseConfig);
211
+ const queues = await tryImportOptional('@tools/queue/QueueRuntimeRegistration');
212
+ queues?.registerQueuesFromRuntimeConfig?.(queueConfig);
213
+ const caches = await tryImportOptional('@cache/CacheRuntimeRegistration');
214
+ caches?.registerCachesFromRuntimeConfig?.(cacheConfig);
215
+ const broadcasters = await tryImportOptional('@broadcast/BroadcastRuntimeRegistration');
216
+ broadcasters?.registerBroadcastersFromRuntimeConfig?.({
217
+ default: broadcastConfig.default,
218
+ drivers: broadcastConfig.drivers,
219
+ });
220
+ const disks = await tryImportOptional('@storage/StorageRuntimeRegistration');
221
+ disks?.registerDisksFromRuntimeConfig?.(storageConfig);
222
+ const notifications = await tryImportOptional('@notification/NotificationRuntimeRegistration');
223
+ notifications?.registerNotificationChannelsFromRuntimeConfig?.({
224
+ default: notificationConfig.default,
225
+ drivers: notificationConfig.drivers,
226
+ });
227
+ };
200
228
  const createLifecycle = (params) => {
201
229
  const boot = async () => {
202
230
  if (params.getBooted())
@@ -205,67 +233,7 @@ const createLifecycle = (params) => {
205
233
  StartupConfigValidator.assertValid();
206
234
  FeatureFlags.initialize();
207
235
  await StartupHealthChecks.assertHealthy();
208
- // Register ORM database connections from runtime config.
209
- // This makes every `databaseConfig.connections[name]` available via `useDatabase(undefined, name)`.
210
- // The configured default is also registered as 'default'.
211
- try {
212
- const { registerDatabasesFromRuntimeConfig } = await import('../orm/DatabaseRuntimeRegistration.js');
213
- registerDatabasesFromRuntimeConfig(databaseConfig);
214
- }
215
- catch {
216
- // best-effort: ignore in restrictive runtimes
217
- }
218
- // Register queue drivers from runtime config.
219
- // Ensures default drivers like `sync` are available without manual registration.
220
- try {
221
- const { registerQueuesFromRuntimeConfig } = await import('../tools/queue/QueueRuntimeRegistration.js');
222
- registerQueuesFromRuntimeConfig(queueConfig);
223
- }
224
- catch {
225
- // best-effort: ignore in restrictive runtimes
226
- }
227
- // Register cache driver factories from runtime config.
228
- // Ensures built-in drivers are available via the driver registry.
229
- try {
230
- const { registerCachesFromRuntimeConfig } = await import('../cache/CacheRuntimeRegistration.js');
231
- registerCachesFromRuntimeConfig(cacheConfig);
232
- }
233
- catch {
234
- // best-effort: ignore in restrictive runtimes
235
- }
236
- // Register broadcasters from runtime config.
237
- // Ensures named broadcasters are available and unknown names throw when selected.
238
- try {
239
- const { registerBroadcastersFromRuntimeConfig } = await import('../tools/broadcast/BroadcastRuntimeRegistration.js');
240
- registerBroadcastersFromRuntimeConfig({
241
- default: broadcastConfig.default,
242
- drivers: broadcastConfig.drivers,
243
- });
244
- }
245
- catch {
246
- // best-effort: ignore in restrictive runtimes
247
- }
248
- // Register storage disks from runtime config.
249
- // Ensures named disks are available and 'default' is a reserved alias.
250
- try {
251
- const { registerDisksFromRuntimeConfig } = await import('../tools/storage/StorageRuntimeRegistration.js');
252
- registerDisksFromRuntimeConfig(storageConfig);
253
- }
254
- catch {
255
- // best-effort: ignore in restrictive runtimes
256
- }
257
- // Register notification channels from runtime config.
258
- // Enables selecting named channels and reserves the `default` alias.
259
- try {
260
- const { registerNotificationChannelsFromRuntimeConfig } = await import('../tools/notification/NotificationRuntimeRegistration.js');
261
- registerNotificationChannelsFromRuntimeConfig({
262
- default: notificationConfig.default,
263
- drivers: notificationConfig.drivers,
264
- });
265
- }
266
- catch {
267
- // best-effort: ignore in restrictive runtimes
268
- }
236
+ await registerFromRuntimeConfig();
269
237
  await initializeArtifactDirectories(params.resolvedBasePath);
270
238
  await registerRoutes(params.resolvedBasePath, params.router);
271
239
  // Register service providers
@@ -1 +1 @@
1
- {"version":3,"file":"broadcast.d.ts","sourceRoot":"","sources":["../../../src/config/broadcast.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAGL,6BAA6B,EAC7B,0BAA0B,EAC1B,2BAA2B,EAC3B,0BAA0B,EAC1B,+BAA+B,EAChC,MAAM,cAAc,CAAC;;IA0EpB;;OAEG;sBACY,MAAM;IAIrB;;;;;OAKG;;2BAEe,6BAA6B;;;;;IAc/C;;OAEG;kCACc,MAAM;IAIvB;;;OAGG;sCACoB,MAAM,KAAG,0BAA0B;;AAK5D,wBAAiD"}
1
+ {"version":3,"file":"broadcast.d.ts","sourceRoot":"","sources":["../../../src/config/broadcast.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAGL,6BAA6B,EAC7B,0BAA0B,EAC1B,2BAA2B,EAC3B,0BAA0B,EAC1B,+BAA+B,EAChC,MAAM,cAAc,CAAC;;IA4EpB;;OAEG;sBACY,MAAM;IAIrB;;;;;OAKG;;2BAEe,6BAA6B;;;;;IAc/C;;OAEG;kCACc,MAAM;IAIvB;;;OAGG;sCACoB,MAAM,KAAG,0BAA0B;;AAK5D,wBAAiD"}
@@ -11,11 +11,13 @@ const hasOwn = (obj, key) => {
11
11
  return Object.prototype.hasOwnProperty.call(obj, key);
12
12
  };
13
13
  const getDefaultBroadcaster = (drivers) => {
14
- const value = normalizeDriverName(Env.get('BROADCAST_DRIVER', 'inmemory'));
15
- if (value.length > 0 && hasOwn(drivers, value)) {
14
+ const envSelectedRaw = Env.get('BROADCAST_CONNECTION', Env.get('BROADCAST_DRIVER', 'inmemory'));
15
+ const value = normalizeDriverName(envSelectedRaw ?? 'inmemory');
16
+ if (value.length > 0 && hasOwn(drivers, value))
16
17
  return value;
18
+ if (envSelectedRaw.trim().length > 0) {
19
+ throw ErrorFactory.createConfigError(`Broadcast driver not configured: ${value}`);
17
20
  }
18
- // Backwards-compatible default.
19
21
  return hasOwn(drivers, 'inmemory') ? 'inmemory' : (Object.keys(drivers)[0] ?? 'inmemory');
20
22
  };
21
23
  const getPusherConfig = () => ({
@@ -1 +1 @@
1
- {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/config/cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAoB,iBAAiB,EAAE,MAAM,cAAc,CAAC;AA+EnE,eAAO,MAAM,WAAW;IArDtB;;OAEG;;IAGH;;OAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;IA4BH;;OAEG;qBACc,MAAM,GAAG,iBAAiB;IAI3C;;OAEG;;IAGH;;OAEG;;EAImD,CAAC;AACzD,MAAM,MAAM,WAAW,GAAG,OAAO,WAAW,CAAC"}
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/config/cache.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAoB,iBAAiB,EAAE,MAAM,cAAc,CAAC;AA2FnE,eAAO,MAAM,WAAW;IA/DtB;;OAEG;;IAaH;;OAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;IA4BH;;OAEG;qBACc,MAAM,GAAG,iBAAiB;IAI3C;;OAEG;;IAGH;;OAEG;;EAImD,CAAC;AACzD,MAAM,MAAM,WAAW,GAAG,OAAO,WAAW,CAAC"}
@@ -17,17 +17,23 @@ const getCacheDriver = (config, name) => {
17
17
  if (isExplicitSelection) {
18
18
  throw ErrorFactory.createConfigError(`Cache store not configured: ${storeName}`);
19
19
  }
20
- // Backwards-compatible fallback.
21
- const fallback = config.drivers['memory'] ?? Object.values(config.drivers)[0];
22
- if (fallback !== undefined)
23
- return fallback;
24
- throw ErrorFactory.createConfigError('No cache stores are configured');
20
+ if (Object.keys(config.drivers ?? {}).length === 0) {
21
+ throw ErrorFactory.createConfigError('No cache stores are configured');
22
+ }
23
+ throw ErrorFactory.createConfigError(`Cache default store not configured: ${storeName || '<empty>'}`);
25
24
  };
26
25
  const cacheConfigObj = {
27
26
  /**
28
27
  * Default cache driver
29
28
  */
30
- default: Env.CACHE_DRIVER,
29
+ default: (() => {
30
+ const envConnection = Env.get('CACHE_CONNECTION', '').trim();
31
+ const envDriver = typeof Env.CACHE_DRIVER === 'string'
32
+ ? String(Env.CACHE_DRIVER)
33
+ : Env.get('CACHE_DRIVER', 'memory');
34
+ const selected = envConnection.length > 0 ? envConnection : String(envDriver ?? 'memory');
35
+ return selected.trim().toLowerCase();
36
+ })(),
31
37
  /**
32
38
  * Cache drivers
33
39
  */
@@ -1 +1 @@
1
- {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/config/database.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAuB,MAAM,cAAc,CAAC;AAkHlG,eAAO,MAAM,cAAc;IAzCzB;;OAEG;;IAGH;;OAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAGH;;OAEG;wBACiB,mBAAmB,GAAG,wBAAwB;IAIlE;;OAEG;;;;;IAMH;;OAEG;;;;;IAMH;;OAEG;;;;EAMyD,CAAC;AAC/D,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAC"}
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/config/database.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAuB,MAAM,cAAc,CAAC;AAoHlG,eAAO,MAAM,cAAc;IAzCzB;;OAEG;;IAGH;;OAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAGH;;OAEG;wBACiB,mBAAmB,GAAG,wBAAwB;IAIlE;;OAEG;;;;;IAMH;;OAEG;;;;;IAMH;;OAEG;;;;EAMyD,CAAC;AAC/D,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAC"}
@@ -9,11 +9,13 @@ const hasOwn = (obj, key) => {
9
9
  return Object.prototype.hasOwnProperty.call(obj, key);
10
10
  };
11
11
  const getDefaultConnection = (connections) => {
12
- const value = String(Env.DB_CONNECTION || '').trim();
13
- if (value.length > 0 && hasOwn(connections, value)) {
12
+ const envSelectedRaw = Env.get('DB_CONNECTION', '');
13
+ const value = String(envSelectedRaw ?? '').trim();
14
+ if (value.length > 0 && hasOwn(connections, value))
14
15
  return value;
16
+ if (envSelectedRaw.trim().length > 0) {
17
+ throw ErrorFactory.createConfigError(`Database connection not configured: ${value}`);
15
18
  }
16
- // Backwards-compatible default.
17
19
  return hasOwn(connections, 'sqlite') ? 'sqlite' : (Object.keys(connections)[0] ?? 'sqlite');
18
20
  };
19
21
  const getDatabaseConnection = (config) => {
@@ -1 +1 @@
1
- {"version":3,"file":"mail.d.ts","sourceRoot":"","sources":["../../../src/config/mail.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAmB,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAwGtE,eAAO,MAAM,UAAU;IA7ErB;;OAEG;;IAGH;;OAEG;;;;;IAMH;;OAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAsDH;;OAEG;gCACc,MAAM,KAAG,gBAAgB;EAKU,CAAC;AACvD,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC"}
1
+ {"version":3,"file":"mail.d.ts","sourceRoot":"","sources":["../../../src/config/mail.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAmB,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAkHtE,eAAO,MAAM,UAAU;IA7ErB;;OAEG;;IAGH;;OAEG;;;;;IAMH;;OAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAsDH;;OAEG;gCACc,MAAM,KAAG,gBAAgB;EAKU,CAAC;AACvD,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC"}
@@ -5,33 +5,40 @@
5
5
  */
6
6
  import { Env } from './env.js';
7
7
  import { ErrorFactory } from '../exceptions/ZintrustError.js';
8
+ const isMailDriverConfig = (value) => {
9
+ if (typeof value !== 'object' || value === null)
10
+ return false;
11
+ if (!('driver' in value))
12
+ return false;
13
+ const driver = value.driver;
14
+ return typeof driver === 'string' && driver.trim().length > 0;
15
+ };
8
16
  const getMailDriver = (config, name) => {
9
- const selected = (name ?? config.default).toString().trim();
17
+ const drivers = config.drivers;
18
+ const envSelectedRaw = Env.get('MAIL_CONNECTION', Env.get('MAIL_DRIVER', '')).trim();
19
+ const selected = (name ??
20
+ (envSelectedRaw.length > 0 ? envSelectedRaw : undefined) ??
21
+ config.default)
22
+ .toString()
23
+ .trim();
10
24
  if (selected.length === 0) {
11
- const disabled = config.drivers['disabled'];
12
- if (disabled !== undefined)
25
+ const disabled = drivers['disabled'];
26
+ if (isMailDriverConfig(disabled))
13
27
  return disabled;
14
28
  throw ErrorFactory.createConfigError('Mail driver not configured: disabled');
15
29
  }
16
- if (Object.hasOwn(config.drivers, selected)) {
17
- const resolved = config.drivers[selected];
18
- if (resolved !== undefined)
30
+ if (Object.hasOwn(drivers, selected)) {
31
+ const resolved = drivers[selected];
32
+ if (isMailDriverConfig(resolved))
19
33
  return resolved;
20
34
  }
21
- // Backward-compatible fallback: if the default is misconfigured, treat mail as disabled.
22
- if (name === undefined) {
23
- const disabled = config.drivers['disabled'];
24
- if (disabled !== undefined)
25
- return disabled;
26
- throw ErrorFactory.createConfigError('Mail driver not configured: disabled');
27
- }
28
35
  throw ErrorFactory.createConfigError(`Mail driver not configured: ${selected}`);
29
36
  };
30
37
  const mailConfigObj = {
31
38
  /**
32
39
  * Default mail driver
33
40
  */
34
- default: Env.get('MAIL_DRIVER', 'disabled').trim().toLowerCase() || 'disabled',
41
+ default: Env.get('MAIL_CONNECTION', Env.get('MAIL_DRIVER', 'disabled')).trim().toLowerCase(),
35
42
  /**
36
43
  * Default "From" identity
37
44
  */
@@ -1 +1 @@
1
- {"version":3,"file":"notification.d.ts","sourceRoot":"","sources":["../../../src/config/notification.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EACV,6BAA6B,EAE7B,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,cAAc,CAAC;AA2GtB,eAAO,MAAM,kBAAkB;IA1C7B;;OAEG;sBACY,MAAM;IAIrB;;;;;OAKG;sBACY,mBAAmB;IAKlC;;OAEG;wBACc,qBAAqB;IAItC;;OAEG;kCACc,MAAM;IAIvB;;;;OAIG;sCACoB,MAAM,KAAG,6BAA6B;EAKO,CAAC;AACvE,MAAM,MAAM,kBAAkB,GAAG,OAAO,kBAAkB,CAAC;AAE3D,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"notification.d.ts","sourceRoot":"","sources":["../../../src/config/notification.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EACV,6BAA6B,EAE7B,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,cAAc,CAAC;AAuHtB,eAAO,MAAM,kBAAkB;IA1C7B;;OAEG;sBACY,MAAM;IAIrB;;;;;OAKG;sBACY,mBAAmB;IAKlC;;OAEG;wBACc,qBAAqB;IAItC;;OAEG;kCACc,MAAM;IAIvB;;;;OAIG;sCACoB,MAAM,KAAG,6BAA6B;EAKO,CAAC;AACvE,MAAM,MAAM,kBAAkB,GAAG,OAAO,kBAAkB,CAAC;AAE3D,eAAe,kBAAkB,CAAC"}
@@ -11,9 +11,13 @@ const hasOwn = (obj, key) => {
11
11
  return Object.prototype.hasOwnProperty.call(obj, key);
12
12
  };
13
13
  const getDefaultChannel = (drivers) => {
14
- const value = normalizeName(Env.get('NOTIFICATION_DRIVER', 'console'));
14
+ const envSelectedRaw = Env.get('NOTIFICATION_CONNECTION', Env.get('NOTIFICATION_DRIVER', 'console'));
15
+ const value = normalizeName(envSelectedRaw ?? 'console');
15
16
  if (value.length > 0 && hasOwn(drivers, value))
16
17
  return value;
18
+ if (envSelectedRaw.trim().length > 0) {
19
+ throw ErrorFactory.createConfigError(`Notification channel not configured: ${value}`);
20
+ }
17
21
  return hasOwn(drivers, 'console') ? 'console' : (Object.keys(drivers)[0] ?? 'console');
18
22
  };
19
23
  const getNotificationDriver = (config, name) => {
@@ -27,13 +31,14 @@ const getNotificationDriver = (config, name) => {
27
31
  if (resolved !== undefined)
28
32
  return resolved;
29
33
  }
34
+ if (Object.keys(config.drivers ?? {}).length === 0) {
35
+ throw ErrorFactory.createConfigError('No notification channels are configured');
36
+ }
30
37
  if (isExplicitSelection) {
31
38
  throw ErrorFactory.createConfigError(`Notification channel not configured: ${channelName}`);
32
39
  }
33
- const fallback = config.drivers['console'] ?? Object.values(config.drivers)[0];
34
- if (fallback !== undefined)
35
- return fallback;
36
- throw ErrorFactory.createConfigError('No notification channels are configured');
40
+ // Default selection is strict: if `default` points at an unconfigured channel, throw.
41
+ throw ErrorFactory.createConfigError(`Notification channel not configured: ${channelName}`);
37
42
  };
38
43
  const getBaseProviders = () => {
39
44
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/config/storage.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAiI9F,eAAO,MAAM,aAAa;IAhExB;;OAEG;sBACY,MAAM;IAIrB;;OAEG;sBACY,cAAc;IAI7B;;OAEG;oBACa,oBAAoB,GAAG,mBAAmB;IAI1D;;;;;;OAMG;0BACmB,oBAAoB,SAAS,MAAM,GAAG,mBAAmB;IAI/E;;OAEG;mBACS;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAO5C;;OAEG;sBACY;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;IAQtE;;OAEG;sBACY;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;EAQW,CAAC;AAE7D,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC"}
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/config/storage.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAmI9F,eAAO,MAAM,aAAa;IAhExB;;OAEG;sBACY,MAAM;IAIrB;;OAEG;sBACY,cAAc;IAI7B;;OAEG;oBACa,oBAAoB,GAAG,mBAAmB;IAI1D;;;;;;OAMG;0BACmB,oBAAoB,SAAS,MAAM,GAAG,mBAAmB;IAI/E;;OAEG;mBACS;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAO5C;;OAEG;sBACY;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;IAQtE;;OAEG;sBACY;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;EAQW,CAAC;AAE7D,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC"}
@@ -20,11 +20,10 @@ const getStorageDriver = (config, name) => {
20
20
  if (isExplicitSelection) {
21
21
  throw ErrorFactory.createConfigError(`Storage disk not configured: ${diskName}`);
22
22
  }
23
- // Backwards-compatible fallback.
24
- const fallback = config.drivers['local'] ?? Object.values(config.drivers)[0];
25
- if (fallback !== undefined)
26
- return fallback;
27
- throw ErrorFactory.createConfigError('No storage disks are configured');
23
+ if (Object.keys(config.drivers ?? {}).length === 0) {
24
+ throw ErrorFactory.createConfigError('No storage disks are configured');
25
+ }
26
+ throw ErrorFactory.createConfigError(`Storage default disk not configured: ${diskName || '<empty>'}`);
28
27
  };
29
28
  const getDrivers = () => ({
30
29
  local: {
@@ -65,7 +64,7 @@ const storageConfigObj = {
65
64
  * Default storage driver (dynamic; tests may mutate process.env)
66
65
  */
67
66
  get default() {
68
- return Env.get('STORAGE_DRIVER', 'local');
67
+ return Env.get('STORAGE_CONNECTION', Env.get('STORAGE_DRIVER', 'local')).trim().toLowerCase();
69
68
  },
70
69
  /**
71
70
  * Storage drivers configuration (dynamic; tests may mutate process.env)
@@ -1 +1 @@
1
- {"version":3,"file":"DatabaseRuntimeRegistration.d.ts","sourceRoot":"","sources":["../../../src/orm/DatabaseRuntimeRegistration.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,mBAAmB,EAGpB,MAAM,cAAc,CAAC;AAuCtB;;;;;;;GAOG;AACH,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAOpF"}
1
+ {"version":3,"file":"DatabaseRuntimeRegistration.d.ts","sourceRoot":"","sources":["../../../src/orm/DatabaseRuntimeRegistration.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,mBAAmB,EAGpB,MAAM,cAAc,CAAC;AAwCtB;;;;;;;GAOG;AACH,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAWpF"}
@@ -4,6 +4,7 @@
4
4
  * Bridges config-layer database connection definitions into ORM connection
5
5
  * instances that can be selected via `useDatabase(undefined, name)`.
6
6
  */
7
+ import { ErrorFactory } from '../exceptions/ZintrustError.js';
7
8
  import { useDatabase } from './Database.js';
8
9
  const toOrmConfig = (cfg) => {
9
10
  switch (cfg.driver) {
@@ -49,7 +50,8 @@ const registerConnections = (connections) => {
49
50
  export function registerDatabasesFromRuntimeConfig(config) {
50
51
  registerConnections(config.connections);
51
52
  const defaultCfg = config.connections[config.default];
52
- if (defaultCfg !== undefined) {
53
- useDatabase(toOrmConfig(defaultCfg), 'default');
53
+ if (defaultCfg === undefined) {
54
+ throw ErrorFactory.createConfigError(`Database default connection not configured: ${String(config.default ?? '')}`);
54
55
  }
56
+ useDatabase(toOrmConfig(defaultCfg), 'default');
55
57
  }
@@ -5,7 +5,7 @@
5
5
  * Driver selection must be dynamic (tests may mutate process.env).
6
6
  */
7
7
 
8
- import { Env } from './env';
8
+ import { Env } from '@config/env';
9
9
  import {
10
10
  BroadcastConfigInput,
11
11
  BroadcastDrivers,
@@ -14,7 +14,7 @@ import {
14
14
  PusherBroadcastDriverConfig,
15
15
  RedisBroadcastDriverConfig,
16
16
  RedisHttpsBroadcastDriverConfig,
17
- } from './type';
17
+ } from '@config/type';
18
18
  import { ErrorFactory } from '@zintrust/core';
19
19
 
20
20
  const normalizeDriverName = (value: string): string => value.trim().toLowerCase();
@@ -24,13 +24,15 @@ const hasOwn = (obj: Record<string, unknown>, key: string): boolean => {
24
24
  };
25
25
 
26
26
  const getDefaultBroadcaster = (drivers: BroadcastDrivers): string => {
27
- const value = normalizeDriverName(Env.get('BROADCAST_DRIVER', 'inmemory'));
27
+ const envSelectedRaw = Env.get('BROADCAST_CONNECTION', Env.get('BROADCAST_DRIVER', 'inmemory'));
28
+ const value = normalizeDriverName(envSelectedRaw ?? 'inmemory');
28
29
 
29
- if (value.length > 0 && hasOwn(drivers, value)) {
30
- return value;
30
+ if (value.length > 0 && hasOwn(drivers, value)) return value;
31
+
32
+ if (envSelectedRaw.trim().length > 0) {
33
+ throw ErrorFactory.createConfigError(`Broadcast driver not configured: ${value}`);
31
34
  }
32
35
 
33
- // Backwards-compatible default.
34
36
  return hasOwn(drivers, 'inmemory') ? 'inmemory' : (Object.keys(drivers)[0] ?? 'inmemory');
35
37
  };
36
38
 
@@ -4,8 +4,8 @@
4
4
  * Sealed namespace for immutability
5
5
  */
6
6
 
7
- import { Env } from './env';
8
- import { CacheConfigInput, CacheDriverConfig } from './type';
7
+ import { Env } from '@config/env';
8
+ import { CacheConfigInput, CacheDriverConfig } from '@config/type';
9
9
  import { ErrorFactory } from '@zintrust/core';
10
10
 
11
11
  const getCacheDriver = (config: CacheConfigInput, name?: string): CacheDriverConfig => {
@@ -23,18 +23,30 @@ const getCacheDriver = (config: CacheConfigInput, name?: string): CacheDriverCon
23
23
  throw ErrorFactory.createConfigError(`Cache store not configured: ${storeName}`);
24
24
  }
25
25
 
26
- // Backwards-compatible fallback.
27
- const fallback = config.drivers['memory'] ?? Object.values(config.drivers)[0];
28
- if (fallback !== undefined) return fallback;
26
+ if (Object.keys(config.drivers ?? {}).length === 0) {
27
+ throw ErrorFactory.createConfigError('No cache stores are configured');
28
+ }
29
29
 
30
- throw ErrorFactory.createConfigError('No cache stores are configured');
30
+ throw ErrorFactory.createConfigError(
31
+ `Cache default store not configured: ${storeName || '<empty>'}`
32
+ );
31
33
  };
32
34
 
33
35
  const cacheConfigObj = {
34
36
  /**
35
37
  * Default cache driver
36
38
  */
37
- default: Env.CACHE_DRIVER,
39
+ default: (() => {
40
+ const envConnection = Env.get('CACHE_CONNECTION', '').trim();
41
+
42
+ const envDriver =
43
+ typeof (Env as unknown as { CACHE_DRIVER?: unknown }).CACHE_DRIVER === 'string'
44
+ ? String((Env as unknown as { CACHE_DRIVER?: unknown }).CACHE_DRIVER)
45
+ : Env.get('CACHE_DRIVER', 'memory');
46
+
47
+ const selected = envConnection.length > 0 ? envConnection : String(envDriver ?? 'memory');
48
+ return selected.trim().toLowerCase();
49
+ })(),
38
50
 
39
51
  /**
40
52
  * Cache drivers
@@ -4,8 +4,8 @@
4
4
  * Sealed namespace for immutability
5
5
  */
6
6
 
7
- import { Env } from './env';
8
- import { DatabaseConfigShape, DatabaseConnectionConfig, DatabaseConnections } from './type';
7
+ import { Env } from '@config/env';
8
+ import { DatabaseConfigShape, DatabaseConnectionConfig, DatabaseConnections } from '@config/type';
9
9
  import { ErrorFactory } from '@zintrust/core';
10
10
 
11
11
  const hasOwn = (obj: Record<string, unknown>, key: string): boolean => {
@@ -13,13 +13,15 @@ const hasOwn = (obj: Record<string, unknown>, key: string): boolean => {
13
13
  };
14
14
 
15
15
  const getDefaultConnection = (connections: DatabaseConnections): string => {
16
- const value = String(Env.DB_CONNECTION || '').trim();
16
+ const envSelectedRaw = Env.get('DB_CONNECTION', '');
17
+ const value = String(envSelectedRaw ?? '').trim();
17
18
 
18
- if (value.length > 0 && hasOwn(connections, value)) {
19
- return value;
19
+ if (value.length > 0 && hasOwn(connections, value)) return value;
20
+
21
+ if (envSelectedRaw.trim().length > 0) {
22
+ throw ErrorFactory.createConfigError(`Database connection not configured: ${value}`);
20
23
  }
21
24
 
22
- // Backwards-compatible default.
23
25
  return hasOwn(connections, 'sqlite') ? 'sqlite' : (Object.keys(connections)[0] ?? 'sqlite');
24
26
  };
25
27
 
@@ -8,24 +8,34 @@ import { Env } from '@config/env';
8
8
  import type { MailConfigInput, MailDriverConfig } from '@config/type';
9
9
  import { ErrorFactory } from '@zintrust/core';
10
10
 
11
+ const isMailDriverConfig = (value: unknown): value is MailDriverConfig => {
12
+ if (typeof value !== 'object' || value === null) return false;
13
+ if (!('driver' in value)) return false;
14
+
15
+ const driver = (value as { driver?: unknown }).driver;
16
+ return typeof driver === 'string' && driver.trim().length > 0;
17
+ };
18
+
11
19
  const getMailDriver = (config: MailConfigInput, name?: string): MailDriverConfig => {
12
- const selected = (name ?? config.default).toString().trim();
20
+ const drivers = config.drivers as Record<string, unknown>;
21
+ const envSelectedRaw = Env.get('MAIL_CONNECTION', Env.get('MAIL_DRIVER', '')).trim();
22
+ const selected = (
23
+ name ??
24
+ (envSelectedRaw.length > 0 ? envSelectedRaw : undefined) ??
25
+ config.default
26
+ )
27
+ .toString()
28
+ .trim();
29
+
13
30
  if (selected.length === 0) {
14
- const disabled = config.drivers['disabled'];
15
- if (disabled !== undefined) return disabled;
31
+ const disabled = drivers['disabled'];
32
+ if (isMailDriverConfig(disabled)) return disabled;
16
33
  throw ErrorFactory.createConfigError('Mail driver not configured: disabled');
17
34
  }
18
35
 
19
- if (Object.hasOwn(config.drivers, selected)) {
20
- const resolved = config.drivers[selected];
21
- if (resolved !== undefined) return resolved;
22
- }
23
-
24
- // Backward-compatible fallback: if the default is misconfigured, treat mail as disabled.
25
- if (name === undefined) {
26
- const disabled = config.drivers['disabled'];
27
- if (disabled !== undefined) return disabled;
28
- throw ErrorFactory.createConfigError('Mail driver not configured: disabled');
36
+ if (Object.hasOwn(drivers, selected)) {
37
+ const resolved = drivers[selected];
38
+ if (isMailDriverConfig(resolved)) return resolved;
29
39
  }
30
40
 
31
41
  throw ErrorFactory.createConfigError(`Mail driver not configured: ${selected}`);
@@ -35,7 +45,7 @@ const mailConfigObj = {
35
45
  /**
36
46
  * Default mail driver
37
47
  */
38
- default: Env.get('MAIL_DRIVER', 'disabled').trim().toLowerCase() || 'disabled',
48
+ default: Env.get('MAIL_CONNECTION', Env.get('MAIL_DRIVER', 'disabled')).trim().toLowerCase(),
39
49
 
40
50
  /**
41
51
  * Default "From" identity
@@ -21,8 +21,18 @@ const hasOwn = (obj: Record<string, unknown>, key: string): boolean => {
21
21
  };
22
22
 
23
23
  const getDefaultChannel = (drivers: NotificationDrivers): string => {
24
- const value = normalizeName(Env.get('NOTIFICATION_DRIVER', 'console'));
24
+ const envSelectedRaw = Env.get(
25
+ 'NOTIFICATION_CONNECTION',
26
+ Env.get('NOTIFICATION_DRIVER', 'console')
27
+ );
28
+ const value = normalizeName(envSelectedRaw ?? 'console');
29
+
25
30
  if (value.length > 0 && hasOwn(drivers, value)) return value;
31
+
32
+ if (envSelectedRaw.trim().length > 0) {
33
+ throw ErrorFactory.createConfigError(`Notification channel not configured: ${value}`);
34
+ }
35
+
26
36
  return hasOwn(drivers, 'console') ? 'console' : (Object.keys(drivers)[0] ?? 'console');
27
37
  };
28
38
 
@@ -43,14 +53,16 @@ const getNotificationDriver = (
43
53
  if (resolved !== undefined) return resolved;
44
54
  }
45
55
 
56
+ if (Object.keys(config.drivers ?? {}).length === 0) {
57
+ throw ErrorFactory.createConfigError('No notification channels are configured');
58
+ }
59
+
46
60
  if (isExplicitSelection) {
47
61
  throw ErrorFactory.createConfigError(`Notification channel not configured: ${channelName}`);
48
62
  }
49
63
 
50
- const fallback = config.drivers['console'] ?? Object.values(config.drivers)[0];
51
- if (fallback !== undefined) return fallback;
52
-
53
- throw ErrorFactory.createConfigError('No notification channels are configured');
64
+ // Default selection is strict: if `default` points at an unconfigured channel, throw.
65
+ throw ErrorFactory.createConfigError(`Notification channel not configured: ${channelName}`);
54
66
  };
55
67
 
56
68
  const getBaseProviders = (): NotificationProviders => {
@@ -4,11 +4,11 @@
4
4
  * Sealed namespace for immutability
5
5
  */
6
6
 
7
- import { Env } from './env';
8
- import type { StorageConfigRuntime, StorageDriverConfig, StorageDrivers } from './type';
7
+ import { Env } from '@config/env';
8
+ import type { StorageConfigRuntime, StorageDriverConfig, StorageDrivers } from '@config/type';
9
9
  import { ErrorFactory } from '@zintrust/core';
10
10
 
11
- const hasOwn = (obj: Record<string, unknown>, key: string): boolean => {
11
+ const hasOwn = <T extends object>(obj: T, key: PropertyKey): key is keyof T => {
12
12
  return Object.prototype.hasOwnProperty.call(obj, key);
13
13
  };
14
14
 
@@ -27,11 +27,13 @@ const getStorageDriver = (config: StorageConfigRuntime, name?: string): StorageD
27
27
  throw ErrorFactory.createConfigError(`Storage disk not configured: ${diskName}`);
28
28
  }
29
29
 
30
- // Backwards-compatible fallback.
31
- const fallback = config.drivers['local'] ?? Object.values(config.drivers)[0];
32
- if (fallback !== undefined) return fallback;
30
+ if (Object.keys(config.drivers ?? {}).length === 0) {
31
+ throw ErrorFactory.createConfigError('No storage disks are configured');
32
+ }
33
33
 
34
- throw ErrorFactory.createConfigError('No storage disks are configured');
34
+ throw ErrorFactory.createConfigError(
35
+ `Storage default disk not configured: ${diskName || '<empty>'}`
36
+ );
35
37
  };
36
38
 
37
39
  const getDrivers = (): StorageDrivers => ({
@@ -74,7 +76,7 @@ const storageConfigObj = {
74
76
  * Default storage driver (dynamic; tests may mutate process.env)
75
77
  */
76
78
  get default(): string {
77
- return Env.get('STORAGE_DRIVER', 'local');
79
+ return Env.get('STORAGE_CONNECTION', Env.get('STORAGE_DRIVER', 'local')).trim().toLowerCase();
78
80
  },
79
81
 
80
82
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"BroadcastRuntimeRegistration.d.ts","sourceRoot":"","sources":["../../../../src/tools/broadcast/BroadcastRuntimeRegistration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAIzD;;;;;;;GAOG;AACH,wBAAgB,qCAAqC,CACnD,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,GAAG,SAAS,CAAC,GACxD,IAAI,CAWN"}
1
+ {"version":3,"file":"BroadcastRuntimeRegistration.d.ts","sourceRoot":"","sources":["../../../../src/tools/broadcast/BroadcastRuntimeRegistration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAKzD;;;;;;;GAOG;AACH,wBAAgB,qCAAqC,CACnD,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,GAAG,SAAS,CAAC,GACxD,IAAI,CAeN"}
@@ -1,3 +1,4 @@
1
+ import { ErrorFactory } from '../../exceptions/ZintrustError.js';
1
2
  import { BroadcastRegistry } from './BroadcastRegistry.js';
2
3
  /**
3
4
  * Register broadcasters from runtime config.
@@ -12,9 +13,11 @@ export function registerBroadcastersFromRuntimeConfig(config) {
12
13
  BroadcastRegistry.register(name, driverConfig);
13
14
  }
14
15
  const defaultName = (config.default ?? '').toString().trim().toLowerCase();
15
- if (defaultName.length === 0)
16
- return;
17
- if (BroadcastRegistry.has(defaultName)) {
18
- BroadcastRegistry.register('default', BroadcastRegistry.get(defaultName));
16
+ if (defaultName.length === 0) {
17
+ throw ErrorFactory.createConfigError('Broadcast default driver is not configured');
19
18
  }
19
+ if (!BroadcastRegistry.has(defaultName)) {
20
+ throw ErrorFactory.createConfigError(`Broadcast default driver not configured: ${defaultName}`);
21
+ }
22
+ BroadcastRegistry.register('default', BroadcastRegistry.get(defaultName));
20
23
  }
@@ -1 +1 @@
1
- {"version":3,"file":"NotificationRuntimeRegistration.d.ts","sourceRoot":"","sources":["../../../../src/tools/notification/NotificationRuntimeRegistration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAG5D;;;;;GAKG;AACH,wBAAgB,6CAA6C,CAC3D,MAAM,EAAE,IAAI,CAAC,uBAAuB,EAAE,SAAS,GAAG,SAAS,CAAC,GAC3D,IAAI,CAWN;AAED,eAAO,MAAM,+BAA+B;;EAE1C,CAAC;AAEH,eAAe,+BAA+B,CAAC"}
1
+ {"version":3,"file":"NotificationRuntimeRegistration.d.ts","sourceRoot":"","sources":["../../../../src/tools/notification/NotificationRuntimeRegistration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAI5D;;;;;GAKG;AACH,wBAAgB,6CAA6C,CAC3D,MAAM,EAAE,IAAI,CAAC,uBAAuB,EAAE,SAAS,GAAG,SAAS,CAAC,GAC3D,IAAI,CAiBN;AAED,eAAO,MAAM,+BAA+B;;EAE1C,CAAC;AAEH,eAAe,+BAA+B,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { ErrorFactory } from '../../exceptions/ZintrustError.js';
1
2
  import { NotificationChannelRegistry } from './NotificationChannelRegistry.js';
2
3
  /**
3
4
  * Register notification channels from runtime config.
@@ -10,11 +11,13 @@ export function registerNotificationChannelsFromRuntimeConfig(config) {
10
11
  NotificationChannelRegistry.register(name, driverConfig);
11
12
  }
12
13
  const defaultName = (config.default ?? '').toString().trim().toLowerCase();
13
- if (defaultName.length === 0)
14
- return;
15
- if (NotificationChannelRegistry.has(defaultName)) {
16
- NotificationChannelRegistry.register('default', NotificationChannelRegistry.get(defaultName));
14
+ if (defaultName.length === 0) {
15
+ throw ErrorFactory.createConfigError('Notification default channel is not configured');
17
16
  }
17
+ if (!NotificationChannelRegistry.has(defaultName)) {
18
+ throw ErrorFactory.createConfigError(`Notification default channel not configured: ${defaultName}`);
19
+ }
20
+ NotificationChannelRegistry.register('default', NotificationChannelRegistry.get(defaultName));
18
21
  }
19
22
  export const NotificationRuntimeRegistration = Object.freeze({
20
23
  registerNotificationChannelsFromRuntimeConfig,
@@ -1 +1 @@
1
- {"version":3,"file":"Queue.d.ts","sourceRoot":"","sources":["../../../../src/tools/queue/Queue.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,CAAC,CAAC,GAAG,OAAO,IAAI;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAErF,UAAU,YAAY;IACpB,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACjE,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAC1E,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAID,eAAO,MAAM,KAAK;mBACD,MAAM,UAAU,YAAY;aAIlC,IAAI;eAIF,MAAM,GAAG,YAAY;YAUlB,CAAC,mBAAmB,MAAM,WAAW,CAAC,eAAe,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAK7E,CAAC,mBACN,MAAM,eACA,MAAM,GAClB,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;eAKtB,MAAM,MAAM,MAAM,eAAe,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;kBAKpD,MAAM,eAAe,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;iBAK9C,MAAM,eAAe,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;EAI9D,CAAC;AAEH,eAAe,KAAK,CAAC"}
1
+ {"version":3,"file":"Queue.d.ts","sourceRoot":"","sources":["../../../../src/tools/queue/Queue.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,CAAC,CAAC,GAAG,OAAO,IAAI;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAErF,UAAU,YAAY;IACpB,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACjE,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAC1E,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAID,eAAO,MAAM,KAAK;mBACD,MAAM,UAAU,YAAY;aAIlC,IAAI;eAIF,MAAM,GAAG,YAAY;YAelB,CAAC,mBAAmB,MAAM,WAAW,CAAC,eAAe,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAK7E,CAAC,mBACN,MAAM,eACA,MAAM,GAClB,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;eAKtB,MAAM,MAAM,MAAM,eAAe,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;kBAKpD,MAAM,eAAe,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;iBAK9C,MAAM,eAAe,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;EAI9D,CAAC;AAEH,eAAe,KAAK,CAAC"}
@@ -8,7 +8,10 @@ export const Queue = Object.freeze({
8
8
  drivers.clear();
9
9
  },
10
10
  get(name) {
11
- const driverName = (name ?? process.env['QUEUE_DRIVER'] ?? 'inmemory')
11
+ const driverName = (name ??
12
+ process.env['QUEUE_CONNECTION'] ??
13
+ process.env['QUEUE_DRIVER'] ??
14
+ 'inmemory')
12
15
  .toString()
13
16
  .trim()
14
17
  .toLowerCase();
@@ -1 +1 @@
1
- {"version":3,"file":"QueueRuntimeRegistration.d.ts","sourceRoot":"","sources":["../../../../src/tools/queue/QueueRuntimeRegistration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAMjD;;;;;;;GAOG;AACH,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAgBzE"}
1
+ {"version":3,"file":"QueueRuntimeRegistration.d.ts","sourceRoot":"","sources":["../../../../src/tools/queue/QueueRuntimeRegistration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAOjD;;;;;;;GAOG;AACH,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAczE"}
@@ -1,3 +1,4 @@
1
+ import { ErrorFactory } from '../../exceptions/ZintrustError.js';
1
2
  import { InMemoryQueue } from '../queue/drivers/InMemory.js';
2
3
  import { RedisQueue } from '../queue/drivers/Redis.js';
3
4
  import { Queue } from '../queue/Queue.js';
@@ -16,13 +17,9 @@ export function registerQueuesFromRuntimeConfig(config) {
16
17
  Queue.register('sync', InMemoryQueue);
17
18
  Queue.register('redis', RedisQueue);
18
19
  const defaultName = (config.default ?? '').toString().trim().toLowerCase();
19
- if (defaultName.length === 0)
20
- return;
21
- try {
22
- const drv = Queue.get(defaultName);
23
- Queue.register('default', drv);
24
- }
25
- catch {
26
- // Best-effort: external drivers may be registered by optional packages.
20
+ if (defaultName.length === 0) {
21
+ throw ErrorFactory.createConfigError('Queue default driver is not configured');
27
22
  }
23
+ const drv = Queue.get(defaultName);
24
+ Queue.register('default', drv);
28
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"StorageRuntimeRegistration.d.ts","sourceRoot":"","sources":["../../../../src/tools/storage/StorageRuntimeRegistration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAG9E,MAAM,MAAM,oBAAoB,GAAG,oBAAoB,GAAG;IACxD,eAAe,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,mBAAmB,CAAC;CAC1D,CAAC;AAEF,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAmBjF;AAED,eAAO,MAAM,0BAA0B;;EAErC,CAAC;AAEH,eAAe,0BAA0B,CAAC"}
1
+ {"version":3,"file":"StorageRuntimeRegistration.d.ts","sourceRoot":"","sources":["../../../../src/tools/storage/StorageRuntimeRegistration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAI9E,MAAM,MAAM,oBAAoB,GAAG,oBAAoB,GAAG;IACxD,eAAe,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,mBAAmB,CAAC;CAC1D,CAAC;AAEF,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAiBjF;AAED,eAAO,MAAM,0BAA0B;;EAErC,CAAC;AAEH,eAAe,0BAA0B,CAAC"}
@@ -1,21 +1,19 @@
1
+ import { ErrorFactory } from '../../exceptions/ZintrustError.js';
1
2
  import { StorageDiskRegistry } from './StorageDiskRegistry.js';
2
3
  export function registerDisksFromRuntimeConfig(config) {
3
4
  for (const [name, driverConfig] of Object.entries(config.drivers)) {
4
5
  StorageDiskRegistry.register(name, driverConfig);
5
6
  }
6
7
  // Alias reserved name `default` to the configured default.
7
- // Prefer config.getDriverConfig() so we preserve its fallback semantics.
8
- let resolvedDefault;
9
- if (typeof config.getDriverConfig === 'function') {
10
- resolvedDefault = config.getDriverConfig('default');
8
+ const defaultName = String(config.default ?? '').trim();
9
+ if (defaultName.length === 0) {
10
+ throw ErrorFactory.createConfigError('Storage default disk is not configured');
11
11
  }
12
- else {
13
- const values = Object.values(config.drivers);
14
- resolvedDefault = config.drivers[config.default] ?? values[0];
15
- }
16
- if (resolvedDefault !== undefined) {
17
- StorageDiskRegistry.register('default', resolvedDefault);
12
+ const resolvedDefault = config.drivers[defaultName];
13
+ if (resolvedDefault === undefined) {
14
+ throw ErrorFactory.createConfigError(`Storage default disk not configured: ${defaultName}`);
18
15
  }
16
+ StorageDiskRegistry.register('default', resolvedDefault);
19
17
  }
20
18
  export const StorageRuntimeRegistration = Object.freeze({
21
19
  registerDisksFromRuntimeConfig,