@zintrust/core 0.1.14 → 0.1.16

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 (123) 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/cli/CLI.d.ts.map +1 -1
  5. package/src/cli/CLI.js +6 -0
  6. package/src/cli/commands/BroadcastWorkCommand.d.ts +10 -0
  7. package/src/cli/commands/BroadcastWorkCommand.d.ts.map +1 -0
  8. package/src/cli/commands/BroadcastWorkCommand.js +16 -0
  9. package/src/cli/commands/NotificationWorkCommand.d.ts +10 -0
  10. package/src/cli/commands/NotificationWorkCommand.d.ts.map +1 -0
  11. package/src/cli/commands/NotificationWorkCommand.js +16 -0
  12. package/src/cli/commands/QueueCommand.d.ts +10 -0
  13. package/src/cli/commands/QueueCommand.d.ts.map +1 -0
  14. package/src/cli/commands/QueueCommand.js +63 -0
  15. package/src/cli/commands/QueueWorkCommandUtils.d.ts +10 -0
  16. package/src/cli/commands/QueueWorkCommandUtils.d.ts.map +1 -0
  17. package/src/cli/commands/QueueWorkCommandUtils.js +43 -0
  18. package/src/cli/commands/createKindWorkCommand.d.ts +9 -0
  19. package/src/cli/commands/createKindWorkCommand.d.ts.map +1 -0
  20. package/src/cli/commands/createKindWorkCommand.js +33 -0
  21. package/src/cli/commands/index.d.ts +3 -0
  22. package/src/cli/commands/index.d.ts.map +1 -1
  23. package/src/cli/commands/index.js +3 -0
  24. package/src/cli/scaffolding/ModelGenerator.d.ts.map +1 -1
  25. package/src/cli/scaffolding/ModelGenerator.js +1 -0
  26. package/src/cli/workers/QueueWorkRunner.d.ts +23 -0
  27. package/src/cli/workers/QueueWorkRunner.d.ts.map +1 -0
  28. package/src/cli/workers/QueueWorkRunner.js +142 -0
  29. package/src/collections/Collection.d.ts +30 -0
  30. package/src/collections/Collection.d.ts.map +1 -0
  31. package/src/collections/Collection.js +146 -0
  32. package/src/collections/index.d.ts +3 -0
  33. package/src/collections/index.d.ts.map +1 -0
  34. package/src/collections/index.js +1 -0
  35. package/src/config/broadcast.d.ts.map +1 -1
  36. package/src/config/broadcast.js +5 -3
  37. package/src/config/cache.d.ts.map +1 -1
  38. package/src/config/cache.js +12 -6
  39. package/src/config/database.d.ts.map +1 -1
  40. package/src/config/database.js +5 -3
  41. package/src/config/mail.d.ts.map +1 -1
  42. package/src/config/mail.js +21 -14
  43. package/src/config/notification.d.ts.map +1 -1
  44. package/src/config/notification.js +10 -5
  45. package/src/config/storage.d.ts.map +1 -1
  46. package/src/config/storage.js +5 -6
  47. package/src/events/EventDispatcher.d.ts +16 -0
  48. package/src/events/EventDispatcher.d.ts.map +1 -0
  49. package/src/events/EventDispatcher.js +90 -0
  50. package/src/events/index.d.ts +3 -0
  51. package/src/events/index.d.ts.map +1 -0
  52. package/src/events/index.js +1 -0
  53. package/src/features/Queue.js +1 -1
  54. package/src/http/Response.d.ts +2 -2
  55. package/src/http/Response.d.ts.map +1 -1
  56. package/src/index.d.ts +11 -0
  57. package/src/index.d.ts.map +1 -1
  58. package/src/index.js +11 -0
  59. package/src/middleware/CsrfMiddleware.d.ts.map +1 -1
  60. package/src/middleware/CsrfMiddleware.js +20 -25
  61. package/src/middleware/SessionMiddleware.d.ts +8 -0
  62. package/src/middleware/SessionMiddleware.d.ts.map +1 -0
  63. package/src/middleware/SessionMiddleware.js +15 -0
  64. package/src/orm/DatabaseRuntimeRegistration.d.ts.map +1 -1
  65. package/src/orm/DatabaseRuntimeRegistration.js +4 -2
  66. package/src/orm/Model.d.ts +15 -0
  67. package/src/orm/Model.d.ts.map +1 -1
  68. package/src/orm/Model.js +57 -8
  69. package/src/orm/QueryBuilder.d.ts +9 -1
  70. package/src/orm/QueryBuilder.d.ts.map +1 -1
  71. package/src/orm/QueryBuilder.js +54 -2
  72. package/src/scripts/TemplateSync.js +23 -1
  73. package/src/security/PasswordResetTokenBroker.d.ts +39 -0
  74. package/src/security/PasswordResetTokenBroker.d.ts.map +1 -0
  75. package/src/security/PasswordResetTokenBroker.js +131 -0
  76. package/src/session/SessionManager.d.ts +39 -0
  77. package/src/session/SessionManager.d.ts.map +1 -0
  78. package/src/session/SessionManager.js +149 -0
  79. package/src/session/index.d.ts +3 -0
  80. package/src/session/index.d.ts.map +1 -0
  81. package/src/session/index.js +1 -0
  82. package/src/templates/features/Queue.ts.tpl +4 -3
  83. package/src/templates/project/basic/config/FileLogWriter.ts.tpl +4 -3
  84. package/src/templates/project/basic/config/SecretsManager.ts.tpl +1 -1
  85. package/src/templates/project/basic/config/broadcast.ts.tpl +6 -4
  86. package/src/templates/project/basic/config/cache.ts.tpl +17 -5
  87. package/src/templates/project/basic/config/database.ts.tpl +6 -4
  88. package/src/templates/project/basic/config/features.ts.tpl +2 -2
  89. package/src/templates/project/basic/config/logger.ts.tpl +0 -2
  90. package/src/templates/project/basic/config/logging/HttpLogger.ts.tpl +1 -1
  91. package/src/templates/project/basic/config/logging/SlackLogger.ts.tpl +1 -1
  92. package/src/templates/project/basic/config/mail.ts.tpl +26 -16
  93. package/src/templates/project/basic/config/microservices.ts.tpl +1 -1
  94. package/src/templates/project/basic/config/middleware.ts.tpl +6 -9
  95. package/src/templates/project/basic/config/notification.ts.tpl +19 -7
  96. package/src/templates/project/basic/config/security.ts.tpl +1 -2
  97. package/src/templates/project/basic/config/storage.ts.tpl +8 -6
  98. package/src/templates/project/basic/config/type.ts.tpl +2 -2
  99. package/src/tools/broadcast/Broadcast.d.ts +8 -0
  100. package/src/tools/broadcast/Broadcast.d.ts.map +1 -1
  101. package/src/tools/broadcast/Broadcast.js +23 -0
  102. package/src/tools/broadcast/BroadcastRuntimeRegistration.d.ts.map +1 -1
  103. package/src/tools/broadcast/BroadcastRuntimeRegistration.js +7 -4
  104. package/src/tools/notification/Notification.d.ts +10 -0
  105. package/src/tools/notification/Notification.d.ts.map +1 -1
  106. package/src/tools/notification/Notification.js +21 -0
  107. package/src/tools/notification/NotificationRuntimeRegistration.d.ts.map +1 -1
  108. package/src/tools/notification/NotificationRuntimeRegistration.js +7 -4
  109. package/src/tools/queue/Queue.d.ts.map +1 -1
  110. package/src/tools/queue/Queue.js +4 -1
  111. package/src/tools/queue/QueueRuntimeRegistration.d.ts.map +1 -1
  112. package/src/tools/queue/QueueRuntimeRegistration.js +5 -8
  113. package/src/tools/storage/StorageRuntimeRegistration.d.ts.map +1 -1
  114. package/src/tools/storage/StorageRuntimeRegistration.js +8 -10
  115. package/src/workers/BroadcastWorker.d.ts +22 -0
  116. package/src/workers/BroadcastWorker.d.ts.map +1 -0
  117. package/src/workers/BroadcastWorker.js +24 -0
  118. package/src/workers/NotificationWorker.d.ts +22 -0
  119. package/src/workers/NotificationWorker.d.ts.map +1 -0
  120. package/src/workers/NotificationWorker.js +23 -0
  121. package/src/workers/createQueueWorker.d.ts +24 -0
  122. package/src/workers/createQueueWorker.d.ts.map +1 -0
  123. package/src/workers/createQueueWorker.js +114 -0
@@ -0,0 +1,30 @@
1
+ export type PrimitiveKey = string | number | boolean | null | undefined;
2
+ export type ICollection<T> = Readonly<{
3
+ all: () => T[];
4
+ toArray: () => T[];
5
+ count: () => number;
6
+ isEmpty: () => boolean;
7
+ map: <U>(fn: (item: T, index: number) => U) => ICollection<U>;
8
+ filter: (fn: (item: T, index: number) => boolean) => ICollection<T>;
9
+ reduce: <U>(fn: (acc: U, item: T, index: number) => U, initial: U) => U;
10
+ first: (fn?: (item: T, index: number) => boolean) => T | undefined;
11
+ last: (fn?: (item: T, index: number) => boolean) => T | undefined;
12
+ pluck: <K extends keyof T>(key: K) => ICollection<T[K]>;
13
+ where: <K extends keyof T>(key: K, value: T[K]) => ICollection<T>;
14
+ unique: (keySelector?: (item: T) => PrimitiveKey) => ICollection<T>;
15
+ sortBy: (keySelector: (item: T) => PrimitiveKey) => ICollection<T>;
16
+ chunk: (size: number) => ICollection<T[]>;
17
+ take: (n: number) => ICollection<T>;
18
+ skip: (n: number) => ICollection<T>;
19
+ keyBy: <K extends PropertyKey>(keySelector: (item: T) => K) => ReadonlyMap<K, T>;
20
+ groupBy: <K extends PropertyKey>(keySelector: (item: T) => K) => ReadonlyMap<K, ICollection<T>>;
21
+ tap: (fn: (items: T[]) => void) => ICollection<T>;
22
+ [Symbol.iterator]: () => Iterator<T>;
23
+ }>;
24
+ export declare const Collection: Readonly<{
25
+ from: <T>(items: Iterable<T> | ArrayLike<T> | null | undefined) => ICollection<T>;
26
+ of: <T>(...items: T[]) => ICollection<T>;
27
+ isCollection: (value: unknown) => value is ICollection<unknown>;
28
+ }>;
29
+ export declare function collect<T>(items: Iterable<T> | ArrayLike<T> | null | undefined): ICollection<T>;
30
+ //# sourceMappingURL=Collection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Collection.d.ts","sourceRoot":"","sources":["../../../src/collections/Collection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,146 @@
1
+ function normalizeToArray(items) {
2
+ if (items === null || items === undefined)
3
+ return [];
4
+ if (typeof items[Symbol.iterator] === 'function') {
5
+ return Array.from(items);
6
+ }
7
+ return Array.from(items);
8
+ }
9
+ function stableArray(items) {
10
+ return items.slice();
11
+ }
12
+ function firstMatch(snapshot, fn) {
13
+ if (!fn)
14
+ return snapshot[0];
15
+ for (let i = 0; i < snapshot.length; i += 1) {
16
+ if (fn(snapshot[i], i))
17
+ return snapshot[i];
18
+ }
19
+ return undefined;
20
+ }
21
+ function lastMatch(snapshot, fn) {
22
+ if (!fn)
23
+ return snapshot.at(-1);
24
+ for (let i = snapshot.length - 1; i >= 0; i -= 1) {
25
+ if (fn(snapshot[i], i))
26
+ return snapshot[i];
27
+ }
28
+ return undefined;
29
+ }
30
+ function uniqueItems(snapshot, keySelector) {
31
+ const seen = new Set();
32
+ const out = [];
33
+ for (const item of snapshot) {
34
+ const key = keySelector ? keySelector(item) : item;
35
+ if (seen.has(key))
36
+ continue;
37
+ seen.add(key);
38
+ out.push(item);
39
+ }
40
+ return out;
41
+ }
42
+ function sortByKey(snapshot, keySelector) {
43
+ const out = snapshot.slice();
44
+ out.sort((a, b) => {
45
+ const ka = keySelector(a);
46
+ const kb = keySelector(b);
47
+ const aNil = ka === null || ka === undefined;
48
+ const bNil = kb === null || kb === undefined;
49
+ if (aNil && bNil)
50
+ return 0;
51
+ if (aNil)
52
+ return 1;
53
+ if (bNil)
54
+ return -1;
55
+ if (typeof ka === 'number' && typeof kb === 'number')
56
+ return ka - kb;
57
+ return String(ka).localeCompare(String(kb));
58
+ });
59
+ return out;
60
+ }
61
+ function chunkItems(snapshot, size) {
62
+ const n = Math.floor(size);
63
+ if (!Number.isFinite(n) || n <= 0)
64
+ return [];
65
+ const out = [];
66
+ for (let i = 0; i < snapshot.length; i += n) {
67
+ out.push(snapshot.slice(i, i + n));
68
+ }
69
+ return out;
70
+ }
71
+ function keyByItems(snapshot, keySelector) {
72
+ const out = new Map();
73
+ for (const item of snapshot) {
74
+ out.set(keySelector(item), item);
75
+ }
76
+ return out;
77
+ }
78
+ function groupByItems(snapshot, keySelector) {
79
+ const groups = new Map();
80
+ for (const item of snapshot) {
81
+ const key = keySelector(item);
82
+ const bucket = groups.get(key);
83
+ if (bucket)
84
+ bucket.push(item);
85
+ else
86
+ groups.set(key, [item]);
87
+ }
88
+ const out = new Map();
89
+ for (const [k, bucket] of groups.entries()) {
90
+ out.set(k, makeCollection(bucket));
91
+ }
92
+ return out;
93
+ }
94
+ function makeCollection(items) {
95
+ const snapshot = stableArray(items);
96
+ const api = Object.freeze({
97
+ all: () => snapshot.slice(),
98
+ toArray: () => snapshot.slice(),
99
+ count: () => snapshot.length,
100
+ isEmpty: () => snapshot.length === 0,
101
+ map: (fn) => makeCollection(snapshot.map(fn)),
102
+ filter: (fn) => makeCollection(snapshot.filter(fn)),
103
+ reduce: (fn, initial) => snapshot.reduce(fn, initial),
104
+ first: (fn) => firstMatch(snapshot, fn),
105
+ last: (fn) => lastMatch(snapshot, fn),
106
+ pluck: (key) => makeCollection(snapshot.map((item) => item[key])),
107
+ where: (key, value) => makeCollection(snapshot.filter((item) => item[key] === value)),
108
+ unique: (keySelector) => makeCollection(uniqueItems(snapshot, keySelector)),
109
+ sortBy: (keySelector) => makeCollection(sortByKey(snapshot, keySelector)),
110
+ chunk: (size) => makeCollection(chunkItems(snapshot, size)),
111
+ take: (n) => {
112
+ const count = Math.max(0, Math.floor(n));
113
+ return makeCollection(snapshot.slice(0, count));
114
+ },
115
+ skip: (n) => {
116
+ const count = Math.max(0, Math.floor(n));
117
+ return makeCollection(snapshot.slice(count));
118
+ },
119
+ keyBy: (keySelector) => keyByItems(snapshot, keySelector),
120
+ groupBy: (keySelector) => groupByItems(snapshot, keySelector),
121
+ tap: (fn) => {
122
+ fn(snapshot.slice());
123
+ return makeCollection(snapshot);
124
+ },
125
+ [Symbol.iterator]: function* () {
126
+ for (const item of snapshot)
127
+ yield item;
128
+ },
129
+ });
130
+ return api;
131
+ }
132
+ export const Collection = Object.freeze({
133
+ from: (items) => makeCollection(normalizeToArray(items)),
134
+ of: (...items) => makeCollection(items),
135
+ isCollection: (value) => {
136
+ if (value === null || value === undefined)
137
+ return false;
138
+ return (typeof value === 'object' &&
139
+ typeof value.all === 'function' &&
140
+ typeof value.map === 'function' &&
141
+ typeof value[Symbol.iterator] === 'function');
142
+ },
143
+ });
144
+ export function collect(items) {
145
+ return Collection.from(items);
146
+ }
@@ -0,0 +1,3 @@
1
+ export { collect, Collection } from '../collections/Collection';
2
+ export type { ICollection, PrimitiveKey } from '../collections/Collection';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/collections/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC/D,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1 @@
1
+ export { collect, Collection } from '../collections/Collection.js';
@@ -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)
@@ -0,0 +1,16 @@
1
+ export type EventMap = Record<string, unknown>;
2
+ export type EventListener<TPayload> = (payload: TPayload) => void | Promise<void>;
3
+ export interface IEventDispatcher<TEvents extends EventMap = EventMap> {
4
+ on<K extends keyof TEvents & string>(event: K, listener: EventListener<TEvents[K]>): () => void;
5
+ once<K extends keyof TEvents & string>(event: K, listener: EventListener<TEvents[K]>): () => void;
6
+ off<K extends keyof TEvents & string>(event: K, listener: EventListener<TEvents[K]>): void;
7
+ emit<K extends keyof TEvents & string>(event: K, payload: TEvents[K]): void;
8
+ emitAsync<K extends keyof TEvents & string>(event: K, payload: TEvents[K]): Promise<void>;
9
+ listenerCount<K extends keyof TEvents & string>(event: K): number;
10
+ clear<K extends keyof TEvents & string>(event?: K): void;
11
+ }
12
+ export declare const EventDispatcher: Readonly<{
13
+ create<TEvents extends EventMap = EventMap>(): IEventDispatcher<TEvents>;
14
+ }>;
15
+ export default EventDispatcher;
16
+ //# sourceMappingURL=EventDispatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventDispatcher.d.ts","sourceRoot":"","sources":["../../../src/events/EventDispatcher.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC/C,MAAM,MAAM,aAAa,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE,QAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAElF,MAAM,WAAW,gBAAgB,CAAC,OAAO,SAAS,QAAQ,GAAG,QAAQ;IACnE,EAAE,CAAC,CAAC,SAAS,MAAM,OAAO,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC;IAChG,IAAI,CAAC,CAAC,SAAS,MAAM,OAAO,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC;IAClG,GAAG,CAAC,CAAC,SAAS,MAAM,OAAO,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAC3F,IAAI,CAAC,CAAC,SAAS,MAAM,OAAO,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAC5E,SAAS,CAAC,CAAC,SAAS,MAAM,OAAO,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1F,aAAa,CAAC,CAAC,SAAS,MAAM,OAAO,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC;IAClE,KAAK,CAAC,CAAC,SAAS,MAAM,OAAO,GAAG,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;CAC1D;AAwBD,eAAO,MAAM,eAAe;WACnB,OAAO,SAAS,QAAQ,gBAAgB,gBAAgB,CAAC,OAAO,CAAC;EAiGxE,CAAC;AAEH,eAAe,eAAe,CAAC"}
@@ -0,0 +1,90 @@
1
+ import { Logger } from '../config/logger.js';
2
+ function getOrCreateSet(store, event) {
3
+ const existing = store.get(event);
4
+ if (existing !== undefined)
5
+ return existing;
6
+ const created = new Set();
7
+ store.set(event, created);
8
+ return created;
9
+ }
10
+ function safeFireAndForget(listener, payload, event) {
11
+ const result = listener(payload);
12
+ if (result instanceof Promise) {
13
+ void result.catch((error) => {
14
+ Logger.error('Unhandled async event listener error', { event, error });
15
+ });
16
+ }
17
+ }
18
+ export const EventDispatcher = Object.freeze({
19
+ create() {
20
+ const listeners = new Map();
21
+ return {
22
+ on(event, listener) {
23
+ const set = getOrCreateSet(listeners, event);
24
+ set.add(listener);
25
+ return () => {
26
+ this.off(event, listener);
27
+ };
28
+ },
29
+ once(event, listener) {
30
+ const wrapped = async (payload) => {
31
+ this.off(event, wrapped);
32
+ return listener(payload);
33
+ };
34
+ const set = getOrCreateSet(listeners, event);
35
+ set.add(wrapped);
36
+ return () => {
37
+ this.off(event, wrapped);
38
+ };
39
+ },
40
+ off(event, listener) {
41
+ const set = listeners.get(event);
42
+ if (set === undefined)
43
+ return;
44
+ set.delete(listener);
45
+ if (set.size === 0) {
46
+ listeners.delete(event);
47
+ }
48
+ },
49
+ emit(event, payload) {
50
+ const set = listeners.get(event);
51
+ if (set === undefined)
52
+ return;
53
+ // Snapshot to avoid mutation during iteration affecting dispatch.
54
+ const snapshot = Array.from(set);
55
+ for (const listener of snapshot) {
56
+ safeFireAndForget(listener, payload, event);
57
+ }
58
+ },
59
+ async emitAsync(event, payload) {
60
+ const set = listeners.get(event);
61
+ if (set === undefined)
62
+ return;
63
+ const snapshot = Array.from(set);
64
+ const results = await Promise.allSettled(snapshot.map(async (listener) => {
65
+ await listener(payload);
66
+ }));
67
+ const errors = results
68
+ .filter((r) => r.status === 'rejected')
69
+ .map((r) => r.reason);
70
+ if (errors.length === 1) {
71
+ throw errors[0];
72
+ }
73
+ if (errors.length > 1) {
74
+ throw new AggregateError(errors, `Multiple event listeners failed for "${event}"`);
75
+ }
76
+ },
77
+ listenerCount(event) {
78
+ return listeners.get(event)?.size ?? 0;
79
+ },
80
+ clear(event) {
81
+ if (event !== undefined) {
82
+ listeners.delete(event);
83
+ return;
84
+ }
85
+ listeners.clear();
86
+ },
87
+ };
88
+ },
89
+ });
90
+ export default EventDispatcher;
@@ -0,0 +1,3 @@
1
+ export { EventDispatcher } from './EventDispatcher';
2
+ export type { EventListener, EventMap, IEventDispatcher } from './EventDispatcher';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/events/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1 @@
1
+ export { EventDispatcher } from './EventDispatcher.js';
@@ -11,7 +11,7 @@ export const Queue = Object.freeze({
11
11
  * Add a job to the queue
12
12
  */
13
13
  async add(data) {
14
- const id = await generateSecureJobId();
14
+ const id = generateSecureJobId();
15
15
  const job = {
16
16
  id,
17
17
  data,
@@ -8,8 +8,8 @@ export interface IResponse {
8
8
  setStatus(code: number): IResponse;
9
9
  getStatus(): number;
10
10
  readonly statusCode: number;
11
- setHeader(name: string, value: string): IResponse;
12
- getHeader(name: string): string | undefined;
11
+ setHeader(name: string, value: string | string[]): IResponse;
12
+ getHeader(name: string): string | string[] | undefined;
13
13
  json(data: unknown): void;
14
14
  text(text: string): void;
15
15
  html(html: string): void;
@@ -1 +1 @@
1
- {"version":3,"file":"Response.d.ts","sourceRoot":"","sources":["../../../src/http/Response.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,IAAI,MAAM,uBAAuB,CAAC;AAE9C,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,SAAS,IAAI,MAAM,CAAC;IACpB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAClD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC5C,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjD,MAAM,IAAI,IAAI,CAAC,cAAc,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED;;;GAGG;AACH,eAAO,MAAM,QAAQ;IACnB;;OAEG;gBACS,IAAI,CAAC,cAAc,GAAG,SAAS;EA0D3C,CAAC;AAEH,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"Response.d.ts","sourceRoot":"","sources":["../../../src/http/Response.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,IAAI,MAAM,uBAAuB,CAAC;AAE9C,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,SAAS,IAAI,MAAM,CAAC;IACpB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;IAC7D,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;IACvD,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjD,MAAM,IAAI,IAAI,CAAC,cAAc,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED;;;GAGG;AACH,eAAO,MAAM,QAAQ;IACnB;;OAEG;gBACS,IAAI,CAAC,cAAc,GAAG,SAAS;EA0D3C,CAAC;AAEH,eAAe,QAAQ,CAAC"}
package/src/index.d.ts CHANGED
@@ -65,6 +65,7 @@ export { MiddlewareStack } from './middleware/MiddlewareStack';
65
65
  export type { Middleware } from './middleware/MiddlewareStack';
66
66
  export { RateLimiter } from './middleware/RateLimiter';
67
67
  export { SecurityMiddleware } from './middleware/SecurityMiddleware';
68
+ export { SessionMiddleware } from './middleware/SessionMiddleware';
68
69
  export { MySQLAdapter } from './orm/adapters/MySQLAdapter';
69
70
  export { PostgreSQLAdapter } from './orm/adapters/PostgreSQLAdapter';
70
71
  export { SQLiteAdapter } from './orm/adapters/SQLiteAdapter';
@@ -81,6 +82,8 @@ export type { IRouter } from './routing/Router';
81
82
  export { delay, ensureDirSafe } from './common/index';
82
83
  export { generateSecureJobId, generateUuid } from './common/uuid';
83
84
  export { ZintrustAwsSigV4 as AwsSigV4 };
85
+ export { collect, Collection } from './collections/index';
86
+ export type { ICollection, PrimitiveKey } from './collections/index';
84
87
  export { HttpClient } from './tools/http/Http';
85
88
  export type { IHttpRequest, IHttpResponse } from './tools/http/Http';
86
89
  export type { DatabaseConfig, ID1Database } from './orm/DatabaseAdapter';
@@ -99,10 +102,16 @@ export { Encryptor } from './security/Encryptor';
99
102
  export { Hash } from './security/Hash';
100
103
  export { JwtManager } from './security/JwtManager';
101
104
  export type { IJwtManager, JwtAlgorithm, JwtManagerType, JwtOptions, JwtPayload, } from './security/JwtManager';
105
+ export { PasswordResetTokenBroker } from './security/PasswordResetTokenBroker';
106
+ export type { IPasswordResetTokenBroker, IPasswordResetTokenStore, PasswordResetTokenBrokerOptions, PasswordResetTokenBrokerType, PasswordResetTokenRecord, } from './security/PasswordResetTokenBroker';
102
107
  export { Xss } from './security/Xss';
103
108
  export { XssProtection } from './security/XssProtection';
104
109
  export { ZintrustSignedRequest as SignedRequest };
105
110
  export { ErrorFactory } from './exceptions/ZintrustError';
111
+ export { EventDispatcher } from './events/EventDispatcher';
112
+ export type { EventListener, EventMap, IEventDispatcher } from './events/EventDispatcher';
113
+ export { SessionManager } from './session/SessionManager';
114
+ export type { ISession, ISessionManager, SessionData, SessionManagerOptions, } from './session/SessionManager';
106
115
  export { Env } from './config/env';
107
116
  export { Logger } from './config/logger';
108
117
  export { appConfig } from './config/app';
@@ -154,9 +163,11 @@ export { Notification } from './tools/notification/Notification';
154
163
  export { NotificationRegistry } from './tools/notification/Registry';
155
164
  export { MarkdownRenderer } from './tools/templates';
156
165
  export { RuntimeHealthProbes } from './health/RuntimeHealthProbes';
166
+ export { BroadcastWorker } from './workers/BroadcastWorker';
157
167
  export { Broadcast } from './tools/broadcast/Broadcast';
158
168
  export { BroadcastRegistry } from './tools/broadcast/BroadcastRegistry';
159
169
  export { registerBroadcastersFromRuntimeConfig } from './tools/broadcast/BroadcastRuntimeRegistration';
170
+ export { NotificationWorker } from './workers/NotificationWorker';
160
171
  export { Storage } from './tools/storage/index';
161
172
  export { LocalSignedUrl } from './tools/storage/LocalSignedUrl';
162
173
  export { StorageDriverRegistry } from './tools/storage/StorageDriverRegistry';