@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.
- package/package.json +1 -1
- package/src/boot/Application.d.ts.map +1 -1
- package/src/boot/Application.js +29 -61
- package/src/cli/CLI.d.ts.map +1 -1
- package/src/cli/CLI.js +6 -0
- package/src/cli/commands/BroadcastWorkCommand.d.ts +10 -0
- package/src/cli/commands/BroadcastWorkCommand.d.ts.map +1 -0
- package/src/cli/commands/BroadcastWorkCommand.js +16 -0
- package/src/cli/commands/NotificationWorkCommand.d.ts +10 -0
- package/src/cli/commands/NotificationWorkCommand.d.ts.map +1 -0
- package/src/cli/commands/NotificationWorkCommand.js +16 -0
- package/src/cli/commands/QueueCommand.d.ts +10 -0
- package/src/cli/commands/QueueCommand.d.ts.map +1 -0
- package/src/cli/commands/QueueCommand.js +63 -0
- package/src/cli/commands/QueueWorkCommandUtils.d.ts +10 -0
- package/src/cli/commands/QueueWorkCommandUtils.d.ts.map +1 -0
- package/src/cli/commands/QueueWorkCommandUtils.js +43 -0
- package/src/cli/commands/createKindWorkCommand.d.ts +9 -0
- package/src/cli/commands/createKindWorkCommand.d.ts.map +1 -0
- package/src/cli/commands/createKindWorkCommand.js +33 -0
- package/src/cli/commands/index.d.ts +3 -0
- package/src/cli/commands/index.d.ts.map +1 -1
- package/src/cli/commands/index.js +3 -0
- package/src/cli/scaffolding/ModelGenerator.d.ts.map +1 -1
- package/src/cli/scaffolding/ModelGenerator.js +1 -0
- package/src/cli/workers/QueueWorkRunner.d.ts +23 -0
- package/src/cli/workers/QueueWorkRunner.d.ts.map +1 -0
- package/src/cli/workers/QueueWorkRunner.js +142 -0
- package/src/collections/Collection.d.ts +30 -0
- package/src/collections/Collection.d.ts.map +1 -0
- package/src/collections/Collection.js +146 -0
- package/src/collections/index.d.ts +3 -0
- package/src/collections/index.d.ts.map +1 -0
- package/src/collections/index.js +1 -0
- package/src/config/broadcast.d.ts.map +1 -1
- package/src/config/broadcast.js +5 -3
- package/src/config/cache.d.ts.map +1 -1
- package/src/config/cache.js +12 -6
- package/src/config/database.d.ts.map +1 -1
- package/src/config/database.js +5 -3
- package/src/config/mail.d.ts.map +1 -1
- package/src/config/mail.js +21 -14
- package/src/config/notification.d.ts.map +1 -1
- package/src/config/notification.js +10 -5
- package/src/config/storage.d.ts.map +1 -1
- package/src/config/storage.js +5 -6
- package/src/events/EventDispatcher.d.ts +16 -0
- package/src/events/EventDispatcher.d.ts.map +1 -0
- package/src/events/EventDispatcher.js +90 -0
- package/src/events/index.d.ts +3 -0
- package/src/events/index.d.ts.map +1 -0
- package/src/events/index.js +1 -0
- package/src/features/Queue.js +1 -1
- package/src/http/Response.d.ts +2 -2
- package/src/http/Response.d.ts.map +1 -1
- package/src/index.d.ts +11 -0
- package/src/index.d.ts.map +1 -1
- package/src/index.js +11 -0
- package/src/middleware/CsrfMiddleware.d.ts.map +1 -1
- package/src/middleware/CsrfMiddleware.js +20 -25
- package/src/middleware/SessionMiddleware.d.ts +8 -0
- package/src/middleware/SessionMiddleware.d.ts.map +1 -0
- package/src/middleware/SessionMiddleware.js +15 -0
- package/src/orm/DatabaseRuntimeRegistration.d.ts.map +1 -1
- package/src/orm/DatabaseRuntimeRegistration.js +4 -2
- package/src/orm/Model.d.ts +15 -0
- package/src/orm/Model.d.ts.map +1 -1
- package/src/orm/Model.js +57 -8
- package/src/orm/QueryBuilder.d.ts +9 -1
- package/src/orm/QueryBuilder.d.ts.map +1 -1
- package/src/orm/QueryBuilder.js +54 -2
- package/src/scripts/TemplateSync.js +23 -1
- package/src/security/PasswordResetTokenBroker.d.ts +39 -0
- package/src/security/PasswordResetTokenBroker.d.ts.map +1 -0
- package/src/security/PasswordResetTokenBroker.js +131 -0
- package/src/session/SessionManager.d.ts +39 -0
- package/src/session/SessionManager.d.ts.map +1 -0
- package/src/session/SessionManager.js +149 -0
- package/src/session/index.d.ts +3 -0
- package/src/session/index.d.ts.map +1 -0
- package/src/session/index.js +1 -0
- package/src/templates/features/Queue.ts.tpl +4 -3
- package/src/templates/project/basic/config/FileLogWriter.ts.tpl +4 -3
- package/src/templates/project/basic/config/SecretsManager.ts.tpl +1 -1
- package/src/templates/project/basic/config/broadcast.ts.tpl +6 -4
- package/src/templates/project/basic/config/cache.ts.tpl +17 -5
- package/src/templates/project/basic/config/database.ts.tpl +6 -4
- package/src/templates/project/basic/config/features.ts.tpl +2 -2
- package/src/templates/project/basic/config/logger.ts.tpl +0 -2
- package/src/templates/project/basic/config/logging/HttpLogger.ts.tpl +1 -1
- package/src/templates/project/basic/config/logging/SlackLogger.ts.tpl +1 -1
- package/src/templates/project/basic/config/mail.ts.tpl +26 -16
- package/src/templates/project/basic/config/microservices.ts.tpl +1 -1
- package/src/templates/project/basic/config/middleware.ts.tpl +6 -9
- package/src/templates/project/basic/config/notification.ts.tpl +19 -7
- package/src/templates/project/basic/config/security.ts.tpl +1 -2
- package/src/templates/project/basic/config/storage.ts.tpl +8 -6
- package/src/templates/project/basic/config/type.ts.tpl +2 -2
- package/src/tools/broadcast/Broadcast.d.ts +8 -0
- package/src/tools/broadcast/Broadcast.d.ts.map +1 -1
- package/src/tools/broadcast/Broadcast.js +23 -0
- package/src/tools/broadcast/BroadcastRuntimeRegistration.d.ts.map +1 -1
- package/src/tools/broadcast/BroadcastRuntimeRegistration.js +7 -4
- package/src/tools/notification/Notification.d.ts +10 -0
- package/src/tools/notification/Notification.d.ts.map +1 -1
- package/src/tools/notification/Notification.js +21 -0
- package/src/tools/notification/NotificationRuntimeRegistration.d.ts.map +1 -1
- package/src/tools/notification/NotificationRuntimeRegistration.js +7 -4
- package/src/tools/queue/Queue.d.ts.map +1 -1
- package/src/tools/queue/Queue.js +4 -1
- package/src/tools/queue/QueueRuntimeRegistration.d.ts.map +1 -1
- package/src/tools/queue/QueueRuntimeRegistration.js +5 -8
- package/src/tools/storage/StorageRuntimeRegistration.d.ts.map +1 -1
- package/src/tools/storage/StorageRuntimeRegistration.js +8 -10
- package/src/workers/BroadcastWorker.d.ts +22 -0
- package/src/workers/BroadcastWorker.d.ts.map +1 -0
- package/src/workers/BroadcastWorker.js +24 -0
- package/src/workers/NotificationWorker.d.ts +22 -0
- package/src/workers/NotificationWorker.d.ts.map +1 -0
- package/src/workers/NotificationWorker.js +23 -0
- package/src/workers/createQueueWorker.d.ts +24 -0
- package/src/workers/createQueueWorker.d.ts.map +1 -0
- 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 @@
|
|
|
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;;
|
|
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"}
|
package/src/config/broadcast.js
CHANGED
|
@@ -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
|
|
15
|
-
|
|
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;
|
|
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"}
|
package/src/config/cache.js
CHANGED
|
@@ -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
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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:
|
|
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;
|
|
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"}
|
package/src/config/database.js
CHANGED
|
@@ -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
|
|
13
|
-
|
|
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) => {
|
package/src/config/mail.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/src/config/mail.js
CHANGED
|
@@ -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
|
|
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 =
|
|
12
|
-
if (disabled
|
|
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(
|
|
17
|
-
const resolved =
|
|
18
|
-
if (resolved
|
|
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()
|
|
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;
|
|
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
|
|
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
|
-
|
|
34
|
-
|
|
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;
|
|
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"}
|
package/src/config/storage.js
CHANGED
|
@@ -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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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 @@
|
|
|
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';
|
package/src/features/Queue.js
CHANGED
package/src/http/Response.d.ts
CHANGED
|
@@ -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;
|
|
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';
|