stratal 0.0.21 → 0.0.22
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/README.md +1 -1
- package/dist/{base-email.provider-CfQCA08m.mjs → base-email.provider-BWZHIjt8.mjs} +1 -1
- package/dist/{base-email.provider-CfQCA08m.mjs.map → base-email.provider-BWZHIjt8.mjs.map} +1 -1
- package/dist/bin/quarry.mjs +46 -109
- package/dist/bin/quarry.mjs.map +1 -1
- package/dist/cache/index.d.mts +6 -46
- package/dist/cache/index.d.mts.map +1 -1
- package/dist/cache/index.mjs +20 -67
- package/dist/cache/index.mjs.map +1 -1
- package/dist/{cache.service-DsnKuNyO.d.mts → cache.service-e34gV6tz.d.mts} +8 -8
- package/dist/{cache.service-DsnKuNyO.d.mts.map → cache.service-e34gV6tz.d.mts.map} +1 -1
- package/dist/{cache.tokens-B7Rw1C9Q.mjs → cache.tokens-ovi_c52J.mjs} +1 -1
- package/dist/{cache.tokens-B7Rw1C9Q.mjs.map → cache.tokens-ovi_c52J.mjs.map} +1 -1
- package/dist/{colors-DJaRDXoS.mjs → colors-axmupKdp.mjs} +1 -1
- package/dist/{colors-DJaRDXoS.mjs.map → colors-axmupKdp.mjs.map} +1 -1
- package/dist/{command-BgSlsS4M.mjs → command-BU4ApTo5.mjs} +2 -3
- package/dist/command-BU4ApTo5.mjs.map +1 -0
- package/dist/{command-Cmmf0oHX.d.mts → command-wXfvHbBZ.d.mts} +3 -2
- package/dist/command-wXfvHbBZ.d.mts.map +1 -0
- package/dist/config/index.d.mts +24 -11
- package/dist/config/index.d.mts.map +1 -1
- package/dist/config/index.mjs +31 -57
- package/dist/config/index.mjs.map +1 -1
- package/dist/{consumer-registry-B7yUNh0q.d.mts → consumer-registry-DHQtypr1.d.mts} +1 -1
- package/dist/{consumer-registry-B7yUNh0q.d.mts.map → consumer-registry-DHQtypr1.d.mts.map} +1 -1
- package/dist/container-storage-GpNNz79X.mjs +52 -0
- package/dist/container-storage-GpNNz79X.mjs.map +1 -0
- package/dist/{controller.decorator-B9vwn0zK.mjs → controller.decorator-DIUazNU7.mjs} +8 -8
- package/dist/controller.decorator-DIUazNU7.mjs.map +1 -0
- package/dist/cron/index.d.mts +26 -5
- package/dist/cron/index.d.mts.map +1 -1
- package/dist/cron/index.mjs +1 -1
- package/dist/{cron-manager-DQSK8uoV.mjs → cron-manager-9bpN9bu4.mjs} +35 -15
- package/dist/cron-manager-9bpN9bu4.mjs.map +1 -0
- package/dist/{cron-manager-CmTimEjf.d.mts → cron-manager-CSTIBPcM.d.mts} +6 -13
- package/dist/cron-manager-CSTIBPcM.d.mts.map +1 -0
- package/dist/decorate-HgTKAYK8.mjs +16 -0
- package/dist/deep-merge-C8NgcXw4.mjs +18 -0
- package/dist/deep-merge-C8NgcXw4.mjs.map +1 -0
- package/dist/di/index.d.mts +2 -2
- package/dist/di/index.mjs +4 -3
- package/dist/di-BO1QIb5H.mjs +415 -0
- package/dist/di-BO1QIb5H.mjs.map +1 -0
- package/dist/email/index.d.mts +14 -89
- package/dist/email/index.d.mts.map +1 -1
- package/dist/email/index.mjs +25 -125
- package/dist/email/index.mjs.map +1 -1
- package/dist/en-BPP6h6y5.mjs +202 -0
- package/dist/en-BPP6h6y5.mjs.map +1 -0
- package/dist/{env-D1rcZ8_r.d.mts → env-DKSbuBi5.d.mts} +1 -1
- package/dist/env-DKSbuBi5.d.mts.map +1 -0
- package/dist/errors/index.d.mts +2 -2
- package/dist/errors/index.mjs +4 -2
- package/dist/errors-BBZTnjdq.mjs +333 -0
- package/dist/errors-BBZTnjdq.mjs.map +1 -0
- package/dist/events/index.d.mts +2 -2
- package/dist/events/index.d.mts.map +1 -1
- package/dist/events/index.mjs +1 -1
- package/dist/{events-CzCV8jI8.mjs → events-D1KdDaiP.mjs} +11 -11
- package/dist/events-D1KdDaiP.mjs.map +1 -0
- package/dist/exception-context-B4kM-M53.mjs +429 -0
- package/dist/exception-context-B4kM-M53.mjs.map +1 -0
- package/dist/{gateway-context-CXmXtaUP.mjs → gateway-context-CFe6a9gz.mjs} +19 -31
- package/dist/gateway-context-CFe6a9gz.mjs.map +1 -0
- package/dist/guards/index.d.mts +3 -3
- package/dist/guards/index.d.mts.map +1 -1
- package/dist/guards/index.mjs +1 -1
- package/dist/{guards-DU1_J9YA.mjs → guards-Ced-uNIF.mjs} +6 -5
- package/dist/guards-Ced-uNIF.mjs.map +1 -0
- package/dist/{http-method.decorator-BrgHMdLQ.mjs → http-method.decorator-CdjKFJZZ.mjs} +7 -6
- package/dist/http-method.decorator-CdjKFJZZ.mjs.map +1 -0
- package/dist/i18n/index.d.mts +238 -3
- package/dist/i18n/index.d.mts.map +1 -0
- package/dist/i18n/index.mjs +39 -3
- package/dist/i18n/index.mjs.map +1 -0
- package/dist/i18n/messages/en/index.d.mts +2 -2
- package/dist/i18n/messages/en/index.mjs +2 -2
- package/dist/i18n/utils/index.d.mts +4 -26
- package/dist/i18n/utils/index.d.mts.map +1 -1
- package/dist/i18n/utils/index.mjs +2 -2
- package/dist/i18n/validation/index.d.mts +3 -2
- package/dist/i18n/validation/index.mjs +4 -2
- package/dist/i18n.module-BlXrtAlV.mjs +219 -0
- package/dist/i18n.module-BlXrtAlV.mjs.map +1 -0
- package/dist/i18n.tokens-hwRpmjRq.mjs +19 -0
- package/dist/i18n.tokens-hwRpmjRq.mjs.map +1 -0
- package/dist/{index-7-hU3GTV.d.mts → index-B4UBK-2T.d.mts} +1 -1
- package/dist/{index-7-hU3GTV.d.mts.map → index-B4UBK-2T.d.mts.map} +1 -1
- package/dist/index-BtlE9RuO.d.mts +124 -0
- package/dist/index-BtlE9RuO.d.mts.map +1 -0
- package/dist/{index-DUzWs0z7.d.mts → index-CW1YHSft.d.mts} +71 -167
- package/dist/index-CW1YHSft.d.mts.map +1 -0
- package/dist/{index-ByOyTmqf.d.mts → index-DEncMcC6.d.mts} +554 -2237
- package/dist/index-DEncMcC6.d.mts.map +1 -0
- package/dist/index-Dj5IMwtr.d.mts +44 -0
- package/dist/index-Dj5IMwtr.d.mts.map +1 -0
- package/dist/{index-C1KvMncZ.d.mts → index-KMgSCSM7.d.mts} +3 -108
- package/dist/index-KMgSCSM7.d.mts.map +1 -0
- package/dist/index.d.mts +5 -43
- package/dist/index.mjs +1 -1
- package/dist/{is-command-C6a7WTPw.mjs → is-command-CX5rAfZW.mjs} +2 -2
- package/dist/{is-command-C6a7WTPw.mjs.map → is-command-CX5rAfZW.mjs.map} +1 -1
- package/dist/{is-seeder-CebjZCDn.mjs → is-seeder-CYCtELlm.mjs} +1 -1
- package/dist/{is-seeder-CebjZCDn.mjs.map → is-seeder-CYCtELlm.mjs.map} +1 -1
- package/dist/logger/index.d.mts +2 -2
- package/dist/logger/index.mjs +170 -2
- package/dist/logger/index.mjs.map +1 -0
- package/dist/macroable/index.d.mts +1 -1
- package/dist/macroable/index.mjs +1 -1
- package/dist/{macroable-BmufBshB.mjs → macroable-DzlfzT50.mjs} +1 -1
- package/dist/{macroable-BmufBshB.mjs.map → macroable-DzlfzT50.mjs.map} +1 -1
- package/dist/metadata-BVkc4aUu.mjs +39 -0
- package/dist/metadata-BVkc4aUu.mjs.map +1 -0
- package/dist/module/index.d.mts +6 -24
- package/dist/module/index.d.mts.map +1 -1
- package/dist/module/index.mjs +2 -2
- package/dist/module-xYoHba6B.mjs +422 -0
- package/dist/module-xYoHba6B.mjs.map +1 -0
- package/dist/openapi/index.d.mts +3 -3
- package/dist/openapi/index.d.mts.map +1 -1
- package/dist/openapi/index.mjs +1 -2
- package/dist/openapi-C6lm0RmV.mjs +483 -0
- package/dist/openapi-C6lm0RmV.mjs.map +1 -0
- package/dist/{openapi.service-Bt9bCIrd.d.mts → openapi.service-CrLlsXAd.d.mts} +3 -3
- package/dist/openapi.service-CrLlsXAd.d.mts.map +1 -0
- package/dist/quarry/index.d.mts +5 -163
- package/dist/quarry/index.d.mts.map +1 -1
- package/dist/quarry/index.mjs +5 -5
- package/dist/quarry/runner.d.mts +184 -0
- package/dist/quarry/runner.d.mts.map +1 -0
- package/dist/quarry/runner.mjs +775 -0
- package/dist/quarry/runner.mjs.map +1 -0
- package/dist/quarry-registry-D4hIGScf.d.mts +69 -0
- package/dist/quarry-registry-D4hIGScf.d.mts.map +1 -0
- package/dist/quarry-registry-DkraZNwn.mjs +311 -0
- package/dist/quarry-registry-DkraZNwn.mjs.map +1 -0
- package/dist/queue/index.d.mts +3 -3
- package/dist/queue/index.mjs +26 -28
- package/dist/queue/index.mjs.map +1 -1
- package/dist/{queue.module-BhCjZp6H.mjs → queue.module-DeWJ0tQM.mjs} +59 -113
- package/dist/queue.module-DeWJ0tQM.mjs.map +1 -0
- package/dist/{r2-storage.provider-DuonKeYm.mjs → r2-storage.provider-Hfm6LdZQ.mjs} +5 -5
- package/dist/r2-storage.provider-Hfm6LdZQ.mjs.map +1 -0
- package/dist/{rate-limit.decorator-6qzNcSOt.mjs → rate-limit.decorator-D69zdZbp.mjs} +6 -11
- package/dist/rate-limit.decorator-D69zdZbp.mjs.map +1 -0
- package/dist/rate-limiter/index.d.mts +11 -50
- package/dist/rate-limiter/index.d.mts.map +1 -1
- package/dist/rate-limiter/index.mjs +16 -30
- package/dist/rate-limiter/index.mjs.map +1 -1
- package/dist/{resend.provider-DB4IlFjG.mjs → resend.provider-Ur6tU7fK.mjs} +7 -7
- package/dist/resend.provider-Ur6tU7fK.mjs.map +1 -0
- package/dist/router/index.d.mts +2 -2
- package/dist/router/index.mjs +8 -7
- package/dist/{i18n.module-CzXLW9Hy.mjs → router-Cy6DjkvP.mjs} +171 -851
- package/dist/router-Cy6DjkvP.mjs.map +1 -0
- package/dist/seeder/index.d.mts +6 -11
- package/dist/seeder/index.d.mts.map +1 -1
- package/dist/seeder/index.mjs +3 -3
- package/dist/{seeder-zoEfEw9i.mjs → seeder-BADTig4n.mjs} +14 -22
- package/dist/seeder-BADTig4n.mjs.map +1 -0
- package/dist/{signed-url-BQPbv2In.mjs → signed-url-BqUqt5dF.mjs} +1 -1
- package/dist/{signed-url-BQPbv2In.mjs.map → signed-url-BqUqt5dF.mjs.map} +1 -1
- package/dist/{smtp.provider-B6D7zuWX.mjs → smtp.provider-C129sNBT.mjs} +6 -6
- package/dist/smtp.provider-C129sNBT.mjs.map +1 -0
- package/dist/storage/index.d.mts +15 -39
- package/dist/storage/index.d.mts.map +1 -1
- package/dist/storage/index.mjs +3 -3
- package/dist/storage/providers/index.d.mts +2 -2
- package/dist/storage/providers/index.mjs +1 -1
- package/dist/{storage-D8CBP72Z.mjs → storage-BA3ppVYM.mjs} +65 -59
- package/dist/storage-BA3ppVYM.mjs.map +1 -0
- package/dist/{storage-provider.interface-Bd6vA4ak.d.mts → storage-provider.interface-DQMtT42e.d.mts} +2 -3
- package/dist/storage-provider.interface-DQMtT42e.d.mts.map +1 -0
- package/dist/storage.error-C6FY037a.mjs +8 -0
- package/dist/storage.error-C6FY037a.mjs.map +1 -0
- package/dist/{stratal-CNwpbSZl.mjs → stratal-Bdq4IdB3.mjs} +31 -185
- package/dist/stratal-Bdq4IdB3.mjs.map +1 -0
- package/dist/stratal-BsKmvP6J.d.mts +43 -0
- package/dist/stratal-BsKmvP6J.d.mts.map +1 -0
- package/dist/{types-cySNS_lp.d.mts → types-BaeHi67f.d.mts} +1 -1
- package/dist/types-BaeHi67f.d.mts.map +1 -0
- package/dist/{usage-generator-BUdlhnCK.mjs → usage-generator-DTqaUMR9.mjs} +6 -3
- package/dist/usage-generator-DTqaUMR9.mjs.map +1 -0
- package/dist/validation-DUzcjb8Q.mjs +49 -0
- package/dist/validation-DUzcjb8Q.mjs.map +1 -0
- package/dist/validation.context-XTysWJ3b.mjs +117 -0
- package/dist/validation.context-XTysWJ3b.mjs.map +1 -0
- package/dist/websocket/index.d.mts +7 -14
- package/dist/websocket/index.d.mts.map +1 -1
- package/dist/websocket/index.mjs +2 -2
- package/dist/workers/index.d.mts +2 -2
- package/dist/workers/index.mjs +3 -2
- package/dist/workers/index.mjs.map +1 -1
- package/dist/{index-Bnpfq6uk.d.mts → zod-DvWTfRpI.d.mts} +58 -133
- package/dist/zod-DvWTfRpI.d.mts.map +1 -0
- package/dist/zod-hMa3rSHV.mjs +72 -0
- package/dist/zod-hMa3rSHV.mjs.map +1 -0
- package/package.json +10 -10
- package/dist/command-BgSlsS4M.mjs.map +0 -1
- package/dist/command-Cmmf0oHX.d.mts.map +0 -1
- package/dist/controller.decorator-B9vwn0zK.mjs.map +0 -1
- package/dist/cron-manager-CmTimEjf.d.mts.map +0 -1
- package/dist/cron-manager-DQSK8uoV.mjs.map +0 -1
- package/dist/en-DSH_bhh6.mjs +0 -308
- package/dist/en-DSH_bhh6.mjs.map +0 -1
- package/dist/env-D1rcZ8_r.d.mts.map +0 -1
- package/dist/errors-COW9-Mar.mjs +0 -1739
- package/dist/errors-COW9-Mar.mjs.map +0 -1
- package/dist/errors-ORxu1-Bb.mjs +0 -74
- package/dist/errors-ORxu1-Bb.mjs.map +0 -1
- package/dist/events-CzCV8jI8.mjs.map +0 -1
- package/dist/gateway-context-CXmXtaUP.mjs.map +0 -1
- package/dist/guards-DU1_J9YA.mjs.map +0 -1
- package/dist/http-method.decorator-BrgHMdLQ.mjs.map +0 -1
- package/dist/i18n.module-CzXLW9Hy.mjs.map +0 -1
- package/dist/index-Bnpfq6uk.d.mts.map +0 -1
- package/dist/index-ByOyTmqf.d.mts.map +0 -1
- package/dist/index-C1KvMncZ.d.mts.map +0 -1
- package/dist/index-DBd_2wv8.d.mts +0 -263
- package/dist/index-DBd_2wv8.d.mts.map +0 -1
- package/dist/index-DUzWs0z7.d.mts.map +0 -1
- package/dist/index.d.mts.map +0 -1
- package/dist/logger-DlV7NtvD.mjs +0 -440
- package/dist/logger-DlV7NtvD.mjs.map +0 -1
- package/dist/module-BzLg57FK.mjs +0 -866
- package/dist/module-BzLg57FK.mjs.map +0 -1
- package/dist/openapi-tools.service-Zs-Ewv7F.mjs +0 -200
- package/dist/openapi-tools.service-Zs-Ewv7F.mjs.map +0 -1
- package/dist/openapi.service-Bt9bCIrd.d.mts.map +0 -1
- package/dist/quarry-registry-BwY2hOxm.mjs +0 -699
- package/dist/quarry-registry-BwY2hOxm.mjs.map +0 -1
- package/dist/queue.module-BhCjZp6H.mjs.map +0 -1
- package/dist/r2-storage.provider-DuonKeYm.mjs.map +0 -1
- package/dist/rate-limit.decorator-6qzNcSOt.mjs.map +0 -1
- package/dist/resend.provider-DB4IlFjG.mjs.map +0 -1
- package/dist/seeder-zoEfEw9i.mjs.map +0 -1
- package/dist/setup-CefZKV_e.mjs +0 -37
- package/dist/setup-CefZKV_e.mjs.map +0 -1
- package/dist/smtp.provider-B6D7zuWX.mjs.map +0 -1
- package/dist/storage-D8CBP72Z.mjs.map +0 -1
- package/dist/storage-provider.interface-Bd6vA4ak.d.mts.map +0 -1
- package/dist/stratal-CNwpbSZl.mjs.map +0 -1
- package/dist/types-cySNS_lp.d.mts.map +0 -1
- package/dist/usage-generator-BUdlhnCK.mjs.map +0 -1
- package/dist/validation-DtJwAv7O.mjs +0 -248
- package/dist/validation-DtJwAv7O.mjs.map +0 -1
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
import { a as ApplicationError, t as containerStorage } from "./container-storage-GpNNz79X.mjs";
|
|
2
|
+
import { n as getMetadata, t as defineMetadata } from "./metadata-BVkc4aUu.mjs";
|
|
3
|
+
//#region src/di/types.ts
|
|
4
|
+
let Scope = /* @__PURE__ */ function(Scope) {
|
|
5
|
+
Scope[Scope["Transient"] = 0] = "Transient";
|
|
6
|
+
Scope[Scope["Singleton"] = 1] = "Singleton";
|
|
7
|
+
Scope[Scope["Request"] = 2] = "Request";
|
|
8
|
+
return Scope;
|
|
9
|
+
}({});
|
|
10
|
+
//#endregion
|
|
11
|
+
//#region src/di/decorators/inject-param.decorator.ts
|
|
12
|
+
const INJECT_PARAM_METADATA_KEY = Symbol.for("stratal:inject:param");
|
|
13
|
+
function InjectParam(token) {
|
|
14
|
+
return (target, propertyKey, parameterIndex) => {
|
|
15
|
+
if (propertyKey === void 0) throw new Error("@InjectParam can only be used on method parameters, not constructor parameters");
|
|
16
|
+
const existing = getMetadata(INJECT_PARAM_METADATA_KEY, target, propertyKey) ?? [];
|
|
17
|
+
existing.push({
|
|
18
|
+
index: parameterIndex,
|
|
19
|
+
token
|
|
20
|
+
});
|
|
21
|
+
defineMetadata(INJECT_PARAM_METADATA_KEY, existing, target, propertyKey);
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function getMethodInjections(target, propertyKey) {
|
|
25
|
+
return (getMetadata(INJECT_PARAM_METADATA_KEY, target, propertyKey) ?? []).sort((a, b) => a.index - b.index);
|
|
26
|
+
}
|
|
27
|
+
//#endregion
|
|
28
|
+
//#region src/di/decorators/inject.decorator.ts
|
|
29
|
+
const INJECTION_TOKENS_KEY = Symbol.for("stratal:di:injection-tokens");
|
|
30
|
+
const g$1 = globalThis;
|
|
31
|
+
const INJECTION_TOKENS = g$1[INJECTION_TOKENS_KEY] ?? (g$1[INJECTION_TOKENS_KEY] = /* @__PURE__ */ new WeakMap());
|
|
32
|
+
function inject(token, options) {
|
|
33
|
+
return (target, _propertyKey, parameterIndex) => {
|
|
34
|
+
let params = INJECTION_TOKENS.get(target);
|
|
35
|
+
if (!params) {
|
|
36
|
+
params = /* @__PURE__ */ new Map();
|
|
37
|
+
INJECTION_TOKENS.set(target, params);
|
|
38
|
+
}
|
|
39
|
+
params.set(parameterIndex, {
|
|
40
|
+
token,
|
|
41
|
+
optional: options?.isOptional ?? false
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function getInjectionTokens(target) {
|
|
46
|
+
const direct = INJECTION_TOKENS.get(target);
|
|
47
|
+
if (direct && direct.size > 0) return direct;
|
|
48
|
+
let proto = Object.getPrototypeOf(target);
|
|
49
|
+
while (proto !== null && proto !== Function.prototype) {
|
|
50
|
+
const inherited = INJECTION_TOKENS.get(proto);
|
|
51
|
+
if (inherited && inherited.size > 0) return inherited;
|
|
52
|
+
proto = Object.getPrototypeOf(proto);
|
|
53
|
+
}
|
|
54
|
+
return /* @__PURE__ */ new Map();
|
|
55
|
+
}
|
|
56
|
+
//#endregion
|
|
57
|
+
//#region src/di/decorators.ts
|
|
58
|
+
const CLASS_METADATA_KEY = Symbol.for("stratal:di:class-metadata");
|
|
59
|
+
const g = globalThis;
|
|
60
|
+
const CLASS_METADATA = g[CLASS_METADATA_KEY] ?? (g[CLASS_METADATA_KEY] = /* @__PURE__ */ new WeakMap());
|
|
61
|
+
function scopeDecorator(scope) {
|
|
62
|
+
return (token) => (target) => {
|
|
63
|
+
CLASS_METADATA.set(target, {
|
|
64
|
+
scope,
|
|
65
|
+
token
|
|
66
|
+
});
|
|
67
|
+
return target;
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const Singleton = scopeDecorator(1);
|
|
71
|
+
const Request = scopeDecorator(2);
|
|
72
|
+
const Transient = scopeDecorator(0);
|
|
73
|
+
function getClassMetadata(target) {
|
|
74
|
+
const direct = CLASS_METADATA.get(target);
|
|
75
|
+
if (direct) return direct;
|
|
76
|
+
let proto = Object.getPrototypeOf(target);
|
|
77
|
+
while (proto !== null && proto !== Function.prototype) {
|
|
78
|
+
const inherited = CLASS_METADATA.get(proto);
|
|
79
|
+
if (inherited) return inherited;
|
|
80
|
+
proto = Object.getPrototypeOf(proto);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//#endregion
|
|
84
|
+
//#region src/di/tokens.ts
|
|
85
|
+
/**
|
|
86
|
+
* Token for the Container instance
|
|
87
|
+
* Used for injecting the Container into services that need dynamic resolution
|
|
88
|
+
*/
|
|
89
|
+
const CONTAINER_TOKEN = Symbol.for("stratal:di:container");
|
|
90
|
+
const DI_TOKENS = {
|
|
91
|
+
CloudflareEnv: Symbol.for("stratal:cloudflare:env"),
|
|
92
|
+
ExecutionContext: Symbol.for("stratal:execution:context"),
|
|
93
|
+
Container: CONTAINER_TOKEN,
|
|
94
|
+
Application: Symbol.for("stratal:application"),
|
|
95
|
+
ModuleRegistry: Symbol.for("stratal:module:registry"),
|
|
96
|
+
ExceptionHandler: Symbol.for("stratal:exception:handler"),
|
|
97
|
+
Database: Symbol.for("stratal:database:service"),
|
|
98
|
+
Queue: Symbol.for("stratal:queue:manager"),
|
|
99
|
+
ConsumerRegistry: Symbol.for("stratal:consumer:registry"),
|
|
100
|
+
Cron: Symbol.for("stratal:cron:manager"),
|
|
101
|
+
EventRegistry: Symbol.for("stratal:event:registry"),
|
|
102
|
+
Quarry: Symbol.for("stratal:quarry"),
|
|
103
|
+
/**
|
|
104
|
+
* AuthContext: Use for services that need user authentication (userId).
|
|
105
|
+
*/
|
|
106
|
+
AuthContext: Symbol.for("stratal:auth:context"),
|
|
107
|
+
DurableObjectState: Symbol.for("stratal:durable:object:state"),
|
|
108
|
+
DurableObjectId: Symbol.for("stratal:durable:object:id")
|
|
109
|
+
};
|
|
110
|
+
//#endregion
|
|
111
|
+
//#region src/router/router.tokens.ts
|
|
112
|
+
/**
|
|
113
|
+
* Dependency injection tokens for the router system
|
|
114
|
+
*/
|
|
115
|
+
const ROUTER_TOKENS = {
|
|
116
|
+
/**
|
|
117
|
+
* Token for RouterContext (request-scoped)
|
|
118
|
+
* Contains Hono context wrapper with helper methods
|
|
119
|
+
*/
|
|
120
|
+
RouterContext: Symbol.for("stratal:router:context"),
|
|
121
|
+
/**
|
|
122
|
+
* Token for RouteRegistry (singleton)
|
|
123
|
+
* Central registry of all application routes — source of truth for route:list, route:types, URL generation
|
|
124
|
+
*/
|
|
125
|
+
RouteRegistry: Symbol.for("stratal:router:route-registry"),
|
|
126
|
+
/**
|
|
127
|
+
* Token for VersioningService (singleton)
|
|
128
|
+
* Resolves version prefixes for route paths
|
|
129
|
+
*/
|
|
130
|
+
VersioningService: Symbol.for("stratal:router:versioning-service"),
|
|
131
|
+
/**
|
|
132
|
+
* Token for LocalePathService (singleton)
|
|
133
|
+
* Resolves locale path variants and computes LocalePathConfig
|
|
134
|
+
*/
|
|
135
|
+
LocalePathService: Symbol.for("stratal:router:locale-path-service"),
|
|
136
|
+
/**
|
|
137
|
+
* Token for RouterResolver (singleton, may be null)
|
|
138
|
+
* Internal resolver that computes effective Router config per controller
|
|
139
|
+
*/
|
|
140
|
+
RouterResolver: Symbol.for("stratal:router:router-resolver"),
|
|
141
|
+
/**
|
|
142
|
+
* Token for HonoApp (singleton)
|
|
143
|
+
* The Hono application instance with Stratal-specific setup
|
|
144
|
+
*/
|
|
145
|
+
HonoApp: Symbol.for("stratal:router:hono-app"),
|
|
146
|
+
/**
|
|
147
|
+
* Token for Uri (request-scoped)
|
|
148
|
+
* URL generation service — route URLs, signed URLs, current/previous URL access
|
|
149
|
+
*/
|
|
150
|
+
Uri: Symbol.for("stratal:router:uri")
|
|
151
|
+
};
|
|
152
|
+
//#endregion
|
|
153
|
+
//#region src/di/container.error.ts
|
|
154
|
+
var ContainerError = class extends ApplicationError {};
|
|
155
|
+
//#endregion
|
|
156
|
+
//#region src/di/conditional-binding-builder.ts
|
|
157
|
+
var ConditionalBindingBuilderImpl = class {
|
|
158
|
+
container;
|
|
159
|
+
predicate;
|
|
160
|
+
options;
|
|
161
|
+
constructor(container, predicate, options) {
|
|
162
|
+
this.container = container;
|
|
163
|
+
this.predicate = predicate;
|
|
164
|
+
this.options = options;
|
|
165
|
+
}
|
|
166
|
+
use(token) {
|
|
167
|
+
return new ConditionalBindingUseImpl(this.container, this.predicate, this.options, token);
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
var ConditionalBindingUseImpl = class {
|
|
171
|
+
container;
|
|
172
|
+
predicate;
|
|
173
|
+
options;
|
|
174
|
+
token;
|
|
175
|
+
constructor(container, predicate, options, token) {
|
|
176
|
+
this.container = container;
|
|
177
|
+
this.predicate = predicate;
|
|
178
|
+
this.options = options;
|
|
179
|
+
this.token = token;
|
|
180
|
+
}
|
|
181
|
+
give(trueImpl) {
|
|
182
|
+
this.registerConditional(trueImpl, void 0);
|
|
183
|
+
return { otherwise: (falseImpl) => {
|
|
184
|
+
this.registerConditional(trueImpl, falseImpl);
|
|
185
|
+
} };
|
|
186
|
+
}
|
|
187
|
+
registerConditional(trueImpl, falseImpl) {
|
|
188
|
+
const { predicate, container, options, token } = this;
|
|
189
|
+
let cachedResult;
|
|
190
|
+
container.register(trueImpl);
|
|
191
|
+
if (falseImpl) container.register(falseImpl);
|
|
192
|
+
container.registerFactory(token, (c) => {
|
|
193
|
+
let result;
|
|
194
|
+
if (options.cache && cachedResult !== void 0) result = cachedResult;
|
|
195
|
+
else {
|
|
196
|
+
result = predicate(c);
|
|
197
|
+
if (options.cache) cachedResult = result;
|
|
198
|
+
}
|
|
199
|
+
if (result) return c.resolve(trueImpl);
|
|
200
|
+
if (falseImpl) return c.resolve(falseImpl);
|
|
201
|
+
throw new ContainerError(`No fallback registered for conditional binding "${typeof token === "symbol" ? token.description ?? "unknown" : typeof token === "function" ? token.name : typeof token === "string" ? token : "lazy"}". Use .otherwise() or register a default implementation.`);
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
//#endregion
|
|
206
|
+
//#region src/di/lazy.ts
|
|
207
|
+
const LAZY_MARKER = Symbol.for("stratal:lazy");
|
|
208
|
+
function lazy(factory) {
|
|
209
|
+
return {
|
|
210
|
+
[LAZY_MARKER]: true,
|
|
211
|
+
factory
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
function isLazyToken(value) {
|
|
215
|
+
return typeof value === "object" && value !== null && LAZY_MARKER in value;
|
|
216
|
+
}
|
|
217
|
+
//#endregion
|
|
218
|
+
//#region src/di/container.ts
|
|
219
|
+
function tokenToString(token) {
|
|
220
|
+
if (typeof token === "symbol") return token.description ?? "Symbol";
|
|
221
|
+
if (typeof token === "function") return token.name;
|
|
222
|
+
if (typeof token === "object" && token !== null && "factory" in token) return "(lazy)";
|
|
223
|
+
return String(token);
|
|
224
|
+
}
|
|
225
|
+
var Container = class Container {
|
|
226
|
+
registrations = /* @__PURE__ */ new Map();
|
|
227
|
+
singletons = /* @__PURE__ */ new Map();
|
|
228
|
+
requestCache = /* @__PURE__ */ new Map();
|
|
229
|
+
parent;
|
|
230
|
+
isRequestScoped;
|
|
231
|
+
constructor(options = {}) {
|
|
232
|
+
this.parent = options.parent ?? null;
|
|
233
|
+
this.isRequestScoped = options.isRequestScoped ?? false;
|
|
234
|
+
if (!this.isRequestScoped) this.registrations.set(CONTAINER_TOKEN, {
|
|
235
|
+
kind: "value",
|
|
236
|
+
value: this
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
register(tokenOrClass, serviceClassOrLazy) {
|
|
240
|
+
if (serviceClassOrLazy !== void 0 && isLazyToken(serviceClassOrLazy)) {
|
|
241
|
+
const lazyToken = serviceClassOrLazy;
|
|
242
|
+
this.registrations.set(tokenOrClass, {
|
|
243
|
+
kind: "lazy",
|
|
244
|
+
factory: lazyToken.factory,
|
|
245
|
+
scope: 2
|
|
246
|
+
});
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
let token;
|
|
250
|
+
let impl;
|
|
251
|
+
if (serviceClassOrLazy !== void 0) {
|
|
252
|
+
token = tokenOrClass;
|
|
253
|
+
impl = serviceClassOrLazy;
|
|
254
|
+
} else {
|
|
255
|
+
token = tokenOrClass;
|
|
256
|
+
impl = tokenOrClass;
|
|
257
|
+
}
|
|
258
|
+
const meta = getClassMetadata(impl);
|
|
259
|
+
const scope = meta?.scope ?? 0;
|
|
260
|
+
const effectiveToken = serviceClassOrLazy === void 0 && meta?.token ? meta.token : token;
|
|
261
|
+
this.registrations.set(effectiveToken, {
|
|
262
|
+
kind: "class",
|
|
263
|
+
useClass: impl,
|
|
264
|
+
scope
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
registerSingleton(tokenOrClass, serviceClass) {
|
|
268
|
+
const token = serviceClass !== void 0 ? tokenOrClass : tokenOrClass;
|
|
269
|
+
const impl = serviceClass ?? tokenOrClass;
|
|
270
|
+
this.registrations.set(token, {
|
|
271
|
+
kind: "class",
|
|
272
|
+
useClass: impl,
|
|
273
|
+
scope: 1
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
registerValue(token, value) {
|
|
277
|
+
this.registrations.set(token, {
|
|
278
|
+
kind: "value",
|
|
279
|
+
value
|
|
280
|
+
});
|
|
281
|
+
if (this.isRequestScoped) this.requestCache.clear();
|
|
282
|
+
}
|
|
283
|
+
registerFactory(token, factory) {
|
|
284
|
+
this.registrations.set(token, {
|
|
285
|
+
kind: "factory",
|
|
286
|
+
factory
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
registerExisting(alias, target) {
|
|
290
|
+
this.registrations.set(alias, {
|
|
291
|
+
kind: "alias",
|
|
292
|
+
target
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
resolve(token) {
|
|
296
|
+
if (isLazyToken(token)) {
|
|
297
|
+
const realToken = token.factory();
|
|
298
|
+
return this.resolve(realToken);
|
|
299
|
+
}
|
|
300
|
+
if (this.isRequestScoped && this.requestCache.has(token)) return this.requestCache.get(token);
|
|
301
|
+
const reg = this.registrations.get(token);
|
|
302
|
+
if (reg) return this.resolveRegistration(token, reg);
|
|
303
|
+
if (this.parent) {
|
|
304
|
+
const parentReg = this.parent.findRegistration(token);
|
|
305
|
+
if (parentReg) {
|
|
306
|
+
if (this.isRequestScoped) return this.resolveRegistration(token, parentReg);
|
|
307
|
+
return this.parent.resolve(token);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
if (typeof token === "function") {
|
|
311
|
+
const classReg = {
|
|
312
|
+
kind: "class",
|
|
313
|
+
useClass: token,
|
|
314
|
+
scope: getClassMetadata(token)?.scope ?? 0
|
|
315
|
+
};
|
|
316
|
+
this.getRoot().registrations.set(token, classReg);
|
|
317
|
+
return this.resolveClass(token, classReg);
|
|
318
|
+
}
|
|
319
|
+
throw new ContainerError(`No provider for ${tokenToString(token)}. Did you forget to register it?`);
|
|
320
|
+
}
|
|
321
|
+
tryResolve(token) {
|
|
322
|
+
try {
|
|
323
|
+
return this.resolve(token);
|
|
324
|
+
} catch {
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
isRegistered(token) {
|
|
329
|
+
if (this.registrations.has(token)) return true;
|
|
330
|
+
return this.parent?.isRegistered(token) ?? false;
|
|
331
|
+
}
|
|
332
|
+
when(predicate, options = {}) {
|
|
333
|
+
return new ConditionalBindingBuilderImpl(this, predicate, options);
|
|
334
|
+
}
|
|
335
|
+
extend(token, decorator) {
|
|
336
|
+
const decorated = decorator(this.resolve(token), this);
|
|
337
|
+
this.registerValue(token, decorated);
|
|
338
|
+
}
|
|
339
|
+
async runInRequestScope(routerContext, callback) {
|
|
340
|
+
if (this.isRequestScoped) throw new ContainerError("Cannot call runInRequestScope on a request-scoped container");
|
|
341
|
+
const requestContainer = this.createRequestScope(routerContext);
|
|
342
|
+
return await containerStorage.run(requestContainer, () => callback(requestContainer));
|
|
343
|
+
}
|
|
344
|
+
createRequestScope(routerContext) {
|
|
345
|
+
if (this.isRequestScoped) throw new ContainerError("Cannot call createRequestScope on a request-scoped container");
|
|
346
|
+
const child = new Container({
|
|
347
|
+
parent: this,
|
|
348
|
+
isRequestScoped: true
|
|
349
|
+
});
|
|
350
|
+
child.registerValue(ROUTER_TOKENS.RouterContext, routerContext);
|
|
351
|
+
return child;
|
|
352
|
+
}
|
|
353
|
+
dispose() {
|
|
354
|
+
this.registrations.clear();
|
|
355
|
+
this.singletons.clear();
|
|
356
|
+
this.requestCache.clear();
|
|
357
|
+
}
|
|
358
|
+
resolveRegistration(token, reg) {
|
|
359
|
+
switch (reg.kind) {
|
|
360
|
+
case "value": return reg.value;
|
|
361
|
+
case "alias": return this.resolve(reg.target);
|
|
362
|
+
case "factory": return reg.factory(this);
|
|
363
|
+
case "lazy": {
|
|
364
|
+
const useClass = reg.factory();
|
|
365
|
+
return this.resolveClass(token, {
|
|
366
|
+
kind: "class",
|
|
367
|
+
useClass,
|
|
368
|
+
scope: reg.scope
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
case "class": return this.resolveClass(token, reg);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
resolveClass(token, reg) {
|
|
375
|
+
const { useClass, scope } = reg;
|
|
376
|
+
if (scope === 1) {
|
|
377
|
+
const root = this.getRoot();
|
|
378
|
+
if (root.singletons.has(token)) return root.singletons.get(token);
|
|
379
|
+
const instance = this.instantiate(useClass);
|
|
380
|
+
root.singletons.set(token, instance);
|
|
381
|
+
return instance;
|
|
382
|
+
}
|
|
383
|
+
if (scope === 2) {
|
|
384
|
+
if (this.isRequestScoped) {
|
|
385
|
+
if (this.requestCache.has(token)) return this.requestCache.get(token);
|
|
386
|
+
const instance = this.instantiate(useClass);
|
|
387
|
+
this.requestCache.set(token, instance);
|
|
388
|
+
return instance;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
return this.instantiate(useClass);
|
|
392
|
+
}
|
|
393
|
+
instantiate(Class) {
|
|
394
|
+
const injections = getInjectionTokens(Class);
|
|
395
|
+
if (injections.size === 0) return new Class();
|
|
396
|
+
const maxIndex = Math.max(...injections.keys());
|
|
397
|
+
const args = new Array(maxIndex + 1);
|
|
398
|
+
for (const [index, entry] of injections) if (entry.optional) args[index] = this.tryResolve(entry.token);
|
|
399
|
+
else args[index] = this.resolve(entry.token);
|
|
400
|
+
return new Class(...args);
|
|
401
|
+
}
|
|
402
|
+
findRegistration(token) {
|
|
403
|
+
const local = this.registrations.get(token);
|
|
404
|
+
if (local) return local;
|
|
405
|
+
return this.parent?.findRegistration(token);
|
|
406
|
+
}
|
|
407
|
+
getRoot() {
|
|
408
|
+
if (!this.parent) return this;
|
|
409
|
+
return this.parent.getRoot();
|
|
410
|
+
}
|
|
411
|
+
};
|
|
412
|
+
//#endregion
|
|
413
|
+
export { getMethodInjections as _, ContainerError as a, DI_TOKENS as c, Transient as d, getClassMetadata as f, InjectParam as g, INJECT_PARAM_METADATA_KEY as h, ConditionalBindingBuilderImpl as i, Request as l, inject as m, isLazyToken as n, ROUTER_TOKENS as o, getInjectionTokens as p, lazy as r, CONTAINER_TOKEN as s, Container as t, Singleton as u, Scope as v };
|
|
414
|
+
|
|
415
|
+
//# sourceMappingURL=di-BO1QIb5H.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"di-BO1QIb5H.mjs","names":["g"],"sources":["../src/di/types.ts","../src/di/decorators/inject-param.decorator.ts","../src/di/decorators/inject.decorator.ts","../src/di/decorators.ts","../src/di/tokens.ts","../src/router/router.tokens.ts","../src/di/container.error.ts","../src/di/conditional-binding-builder.ts","../src/di/lazy.ts","../src/di/container.ts"],"sourcesContent":["import type { Constructor } from '../types'\nimport type { LazyToken } from './lazy'\n\nexport type InjectionToken<T = unknown> = Constructor<T> | string | symbol | LazyToken<T>\n\nexport enum Scope {\n Transient = 0,\n Singleton = 1,\n Request = 2,\n}\n\nexport interface WhenOptions {\n cache?: boolean\n}\n\nexport type ExtensionDecorator<T> = (service: T, container: ContainerLike) => T\n\nexport interface ContainerLike {\n resolve<T>(token: InjectionToken<T>): T\n}\n","import type { InjectionToken } from '../types'\nimport { defineMetadata, getMetadata } from '../metadata'\n\nexport const INJECT_PARAM_METADATA_KEY = Symbol.for('stratal:inject:param')\n\nexport interface ParamInjection {\n index: number\n token: InjectionToken\n}\n\nexport function InjectParam<T>(token: InjectionToken<T>): ParameterDecorator {\n return (target: object, propertyKey: string | symbol | undefined, parameterIndex: number) => {\n if (propertyKey === undefined) {\n throw new Error('@InjectParam can only be used on method parameters, not constructor parameters')\n }\n\n const existing = getMetadata<ParamInjection[]>(INJECT_PARAM_METADATA_KEY, target, propertyKey) ?? []\n existing.push({ index: parameterIndex, token })\n defineMetadata(INJECT_PARAM_METADATA_KEY, existing, target, propertyKey)\n }\n}\n\nexport function getMethodInjections(target: object, propertyKey: string | symbol): ParamInjection[] {\n const injections = getMetadata<ParamInjection[]>(INJECT_PARAM_METADATA_KEY, target, propertyKey) ?? []\n return injections.sort((a, b) => a.index - b.index)\n}\n","import type { InjectionToken } from '../types'\n\ninterface InjectionEntry {\n token: InjectionToken\n optional: boolean\n}\n\nconst INJECTION_TOKENS_KEY = Symbol.for('stratal:di:injection-tokens')\nconst g = globalThis as Record<symbol, unknown>\nconst INJECTION_TOKENS: WeakMap<object, Map<number, InjectionEntry>> =\n (g[INJECTION_TOKENS_KEY] as WeakMap<object, Map<number, InjectionEntry>>) ??\n (g[INJECTION_TOKENS_KEY] = new WeakMap<object, Map<number, InjectionEntry>>())\n\nexport function inject<T>(\n token: InjectionToken<T>,\n options?: { isOptional?: boolean },\n): ParameterDecorator {\n return (target: object, _propertyKey: string | symbol | undefined, parameterIndex: number) => {\n let params = INJECTION_TOKENS.get(target)\n if (!params) {\n params = new Map()\n INJECTION_TOKENS.set(target, params)\n }\n params.set(parameterIndex, { token, optional: options?.isOptional ?? false })\n }\n}\n\nexport function getInjectionTokens(target: object): Map<number, InjectionEntry> {\n const direct = INJECTION_TOKENS.get(target)\n if (direct && direct.size > 0) return direct\n\n let proto = Object.getPrototypeOf(target) as object | null\n while (proto !== null && proto !== Function.prototype) {\n const inherited = INJECTION_TOKENS.get(proto)\n if (inherited && inherited.size > 0) return inherited\n proto = Object.getPrototypeOf(proto) as object | null\n }\n\n return new Map<number, InjectionEntry>()\n}\n","import type { InjectionToken } from './types'\nimport { Scope } from './types'\n\nexport {\n InjectParam,\n getMethodInjections,\n type ParamInjection,\n INJECT_PARAM_METADATA_KEY,\n} from './decorators/inject-param.decorator'\n\nexport { inject, getInjectionTokens } from './decorators/inject.decorator'\n\ninterface ClassMetadata {\n scope: Scope\n token?: InjectionToken\n}\n\nconst CLASS_METADATA_KEY = Symbol.for('stratal:di:class-metadata')\nconst g = globalThis as Record<symbol, unknown>\nconst CLASS_METADATA: WeakMap<object, ClassMetadata> =\n (g[CLASS_METADATA_KEY] as WeakMap<object, ClassMetadata>) ??\n (g[CLASS_METADATA_KEY] = new WeakMap<object, ClassMetadata>())\n\nfunction scopeDecorator(scope: Scope) {\n return <T>(token?: InjectionToken<T>) =>\n <TFunction extends abstract new (...args: never[]) => unknown>(target: TFunction): TFunction => {\n CLASS_METADATA.set(target, { scope, token })\n return target\n }\n}\n\nexport const Singleton = scopeDecorator(Scope.Singleton)\nexport const Request = scopeDecorator(Scope.Request)\nexport const Transient = scopeDecorator(Scope.Transient)\n\nexport function getClassMetadata(target: object): ClassMetadata | undefined {\n const direct = CLASS_METADATA.get(target)\n if (direct) return direct\n\n let proto = Object.getPrototypeOf(target) as object | null\n while (proto !== null && proto !== Function.prototype) {\n const inherited = CLASS_METADATA.get(proto)\n if (inherited) return inherited\n proto = Object.getPrototypeOf(proto) as object | null\n }\n\n return undefined\n}\n","/**\n * Token for the Container instance\n * Used for injecting the Container into services that need dynamic resolution\n */\nexport const CONTAINER_TOKEN = Symbol.for('stratal:di:container')\n\nexport const DI_TOKENS = {\n // Cloudflare\n CloudflareEnv: Symbol.for('stratal:cloudflare:env'),\n ExecutionContext: Symbol.for('stratal:execution:context'),\n\n // Infrastructure\n Container: CONTAINER_TOKEN,\n Application: Symbol.for('stratal:application'),\n ModuleRegistry: Symbol.for('stratal:module:registry'),\n ExceptionHandler: Symbol.for('stratal:exception:handler'),\n Database: Symbol.for('stratal:database:service'),\n Queue: Symbol.for('stratal:queue:manager'),\n ConsumerRegistry: Symbol.for('stratal:consumer:registry'),\n Cron: Symbol.for('stratal:cron:manager'),\n EventRegistry: Symbol.for('stratal:event:registry'),\n Quarry: Symbol.for('stratal:quarry'),\n\n // Context\n /**\n * AuthContext: Use for services that need user authentication (userId).\n */\n AuthContext: Symbol.for('stratal:auth:context'),\n\n // Workers\n DurableObjectState: Symbol.for('stratal:durable:object:state'),\n DurableObjectId: Symbol.for('stratal:durable:object:id'),\n} as const\n\nexport type DIToken = typeof DI_TOKENS[keyof typeof DI_TOKENS]\n","/**\n * Dependency injection tokens for the router system\n */\nexport const ROUTER_TOKENS = {\n /**\n * Token for RouterContext (request-scoped)\n * Contains Hono context wrapper with helper methods\n */\n RouterContext: Symbol.for('stratal:router:context'),\n\n /**\n * Token for RouteRegistry (singleton)\n * Central registry of all application routes — source of truth for route:list, route:types, URL generation\n */\n RouteRegistry: Symbol.for('stratal:router:route-registry'),\n\n /**\n * Token for VersioningService (singleton)\n * Resolves version prefixes for route paths\n */\n VersioningService: Symbol.for('stratal:router:versioning-service'),\n\n /**\n * Token for LocalePathService (singleton)\n * Resolves locale path variants and computes LocalePathConfig\n */\n LocalePathService: Symbol.for('stratal:router:locale-path-service'),\n\n /**\n * Token for RouterResolver (singleton, may be null)\n * Internal resolver that computes effective Router config per controller\n */\n RouterResolver: Symbol.for('stratal:router:router-resolver'),\n\n /**\n * Token for HonoApp (singleton)\n * The Hono application instance with Stratal-specific setup\n */\n HonoApp: Symbol.for('stratal:router:hono-app'),\n\n /**\n * Token for Uri (request-scoped)\n * URL generation service — route URLs, signed URLs, current/previous URL access\n */\n Uri: Symbol.for('stratal:router:uri'),\n} as const\n","import { ApplicationError } from '../errors/application-error';\n\nexport class ContainerError extends ApplicationError {\n}\n","import type { Container } from './container'\nimport { ContainerError } from './container.error'\nimport type { InjectionToken, WhenOptions } from './types'\nimport type { Constructor } from '../types'\n\nexport interface PredicateContainer {\n resolve<T>(token: InjectionToken<T>): T\n isRegistered<T>(token: InjectionToken<T>): boolean\n}\n\nexport interface ConditionalBindingBuilder {\n use<T extends object>(token: InjectionToken<T>): ConditionalBindingUse<T>\n}\n\nexport interface ConditionalBindingUse<T extends object> {\n give(implementation: Constructor<T>): ConditionalBindingGive<T>\n}\n\nexport interface ConditionalBindingGive<T extends object> {\n otherwise(implementation: Constructor<T>): void\n}\n\nexport class ConditionalBindingBuilderImpl implements ConditionalBindingBuilder {\n constructor(\n private readonly container: Container,\n private readonly predicate: (container: PredicateContainer) => boolean,\n private readonly options: WhenOptions,\n ) {}\n\n use<T extends object>(token: InjectionToken<T>): ConditionalBindingUse<T> {\n return new ConditionalBindingUseImpl<T>(\n this.container,\n this.predicate,\n this.options,\n token,\n )\n }\n}\n\nclass ConditionalBindingUseImpl<T extends object> implements ConditionalBindingUse<T> {\n constructor(\n private readonly container: Container,\n private readonly predicate: (container: PredicateContainer) => boolean,\n private readonly options: WhenOptions,\n private readonly token: InjectionToken<T>,\n ) {}\n\n give(trueImpl: Constructor<T>): ConditionalBindingGive<T> {\n this.registerConditional(trueImpl, undefined)\n\n return {\n otherwise: (falseImpl: Constructor<T>) => {\n this.registerConditional(trueImpl, falseImpl)\n },\n }\n }\n\n private registerConditional(trueImpl: Constructor<T>, falseImpl: Constructor<T> | undefined): void {\n const { predicate, container, options, token } = this\n let cachedResult: boolean | undefined\n\n // Register both implementations so the container can instantiate them\n container.register(trueImpl)\n if (falseImpl) container.register(falseImpl)\n\n container.registerFactory(token, (c) => {\n let result: boolean\n if (options.cache && cachedResult !== undefined) {\n result = cachedResult\n } else {\n result = predicate(c)\n if (options.cache) cachedResult = result\n }\n\n if (result) {\n return c.resolve(trueImpl as unknown as InjectionToken<T>)\n }\n\n if (falseImpl) {\n return c.resolve(falseImpl as unknown as InjectionToken<T>)\n }\n\n const tokenStr = typeof token === 'symbol'\n ? (token.description ?? 'unknown')\n : typeof token === 'function'\n ? token.name\n : typeof token === 'string'\n ? token\n : 'lazy'\n throw new ContainerError(`No fallback registered for conditional binding \"${tokenStr}\". Use .otherwise() or register a default implementation.`)\n })\n }\n}\n","import type { Constructor } from '../types'\n\nconst LAZY_MARKER = Symbol.for('stratal:lazy')\n\nexport interface LazyToken<T = unknown> {\n [LAZY_MARKER]: true\n factory: () => Constructor<T>\n}\n\nexport function lazy<T>(factory: () => Constructor<T>): LazyToken<T> {\n return { [LAZY_MARKER]: true, factory } as LazyToken<T>\n}\n\nexport function isLazyToken(value: unknown): value is LazyToken {\n return typeof value === 'object' && value !== null && LAZY_MARKER in value\n}\n","import type { RouterContext } from '../router/router-context';\nimport { ROUTER_TOKENS } from '../router/router.tokens';\nimport type { Constructor } from '../types';\nimport { ConditionalBindingBuilderImpl, type ConditionalBindingBuilder, type PredicateContainer } from './conditional-binding-builder';\nimport { containerStorage } from './container-storage';\nimport { ContainerError } from './container.error';\nimport { getClassMetadata } from './decorators';\nimport { getInjectionTokens } from './decorators/inject.decorator';\nimport { isLazyToken, type LazyToken } from './lazy';\nimport { CONTAINER_TOKEN } from './tokens';\nimport { Scope, type ExtensionDecorator, type InjectionToken, type WhenOptions } from './types';\n\ninterface ClassRegistration {\n kind: 'class'\n useClass: Constructor\n scope: Scope\n}\n\ninterface LazyClassRegistration {\n kind: 'lazy'\n factory: () => Constructor\n scope: Scope\n}\n\ninterface ValueRegistration {\n kind: 'value'\n value: unknown\n}\n\ninterface FactoryRegistration {\n kind: 'factory'\n factory: (container: Container) => unknown\n}\n\ninterface AliasRegistration {\n kind: 'alias'\n target: InjectionToken\n}\n\ntype Registration = ClassRegistration | LazyClassRegistration | ValueRegistration | FactoryRegistration | AliasRegistration\n\nfunction tokenToString(token: InjectionToken): string {\n if (typeof token === 'symbol') return token.description ?? 'Symbol'\n if (typeof token === 'function') return token.name\n if (typeof token === 'object' && token !== null && 'factory' in token) return '(lazy)'\n return String(token)\n}\n\nexport interface ContainerOptions {\n parent?: Container\n isRequestScoped?: boolean\n}\n\nexport class Container {\n private readonly registrations = new Map<InjectionToken, Registration>()\n private readonly singletons = new Map<InjectionToken, unknown>()\n private readonly requestCache = new Map<InjectionToken, unknown>()\n private readonly parent: Container | null\n private readonly isRequestScoped: boolean\n\n constructor(options: ContainerOptions = {}) {\n this.parent = options.parent ?? null\n this.isRequestScoped = options.isRequestScoped ?? false\n\n if (!this.isRequestScoped) {\n this.registrations.set(CONTAINER_TOKEN, { kind: 'value', value: this })\n }\n }\n\n // ── Registration ──────────────────────────────────────────────\n\n register<T extends object>(serviceClass: Constructor<T>): void\n register<T extends object>(token: InjectionToken<T>, serviceClassOrLazy: Constructor<T> | LazyToken<T>): void\n register<T extends object>(\n tokenOrClass: InjectionToken<T> | Constructor<T>,\n serviceClassOrLazy?: Constructor<T> | LazyToken<T>,\n ): void {\n if (serviceClassOrLazy !== undefined && isLazyToken(serviceClassOrLazy)) {\n const lazyToken = serviceClassOrLazy\n this.registrations.set(tokenOrClass, {\n kind: 'lazy',\n factory: lazyToken.factory,\n scope: Scope.Request,\n })\n return\n }\n\n let token: InjectionToken<T>\n let impl: Constructor<T>\n\n if (serviceClassOrLazy !== undefined) {\n token = tokenOrClass\n impl = serviceClassOrLazy\n } else {\n token = tokenOrClass as Constructor<T>\n impl = tokenOrClass as Constructor<T>\n }\n\n const meta = getClassMetadata(impl)\n const scope = meta?.scope ?? Scope.Transient\n const effectiveToken = (serviceClassOrLazy === undefined && meta?.token) ? meta.token : token\n\n this.registrations.set(effectiveToken, { kind: 'class', useClass: impl, scope })\n }\n\n registerSingleton<T extends object>(serviceClass: Constructor<T>): void\n registerSingleton<T extends object>(token: InjectionToken<T>, serviceClass: Constructor<T>): void\n registerSingleton<T extends object>(\n tokenOrClass: InjectionToken<T> | Constructor<T>,\n serviceClass?: Constructor<T>,\n ): void {\n const token = serviceClass !== undefined ? tokenOrClass : tokenOrClass as Constructor<T>\n const impl = serviceClass ?? tokenOrClass as Constructor<T>\n this.registrations.set(token, { kind: 'class', useClass: impl, scope: Scope.Singleton })\n }\n\n registerValue<T>(token: InjectionToken<T>, value: T): void {\n this.registrations.set(token, { kind: 'value', value })\n if (this.isRequestScoped) {\n this.requestCache.clear()\n }\n }\n\n registerFactory<T>(token: InjectionToken<T>, factory: (container: Container) => T): void {\n this.registrations.set(token, { kind: 'factory', factory })\n }\n\n registerExisting<T>(alias: InjectionToken<T>, target: InjectionToken<T>): void {\n this.registrations.set(alias, { kind: 'alias', target })\n }\n\n // ── Resolution ────────────────────────────────────────────────\n\n resolve<T>(token: InjectionToken<T>): T {\n if (isLazyToken(token)) {\n const realToken = token.factory() as InjectionToken<T>\n return this.resolve(realToken)\n }\n\n // Check request cache (request-scoped containers)\n if (this.isRequestScoped && this.requestCache.has(token)) {\n return this.requestCache.get(token) as T\n }\n\n // Check local registrations first\n const reg = this.registrations.get(token)\n if (reg) return this.resolveRegistration(token, reg) as T\n\n // Check parent chain — request-scoped containers resolve locally to access request values\n if (this.parent) {\n const parentReg = this.parent.findRegistration(token)\n if (parentReg) {\n if (this.isRequestScoped) {\n return this.resolveRegistration(token, parentReg) as T\n }\n return this.parent.resolve(token)\n }\n }\n\n // Auto-resolve class constructors: any class with DI decorators can be\n // instantiated without explicit registration\n if (typeof token === 'function') {\n const meta = getClassMetadata(token)\n const scope = meta?.scope ?? Scope.Transient\n const classReg: ClassRegistration = { kind: 'class', useClass: token as unknown as Constructor, scope }\n this.getRoot().registrations.set(token, classReg)\n return this.resolveClass(token, classReg) as T\n }\n\n throw new ContainerError(`No provider for ${tokenToString(token)}. Did you forget to register it?`)\n }\n\n tryResolve<T>(token: InjectionToken<T>): T | undefined {\n try {\n return this.resolve(token)\n } catch {\n return undefined\n }\n }\n\n isRegistered<T>(token: InjectionToken<T>): boolean {\n if (this.registrations.has(token)) return true\n return this.parent?.isRegistered(token) ?? false\n }\n\n // ── Conditional ───────────────────────────────────────────────\n\n when(\n predicate: (container: PredicateContainer) => boolean,\n options: WhenOptions = {},\n ): ConditionalBindingBuilder {\n return new ConditionalBindingBuilderImpl(this, predicate, options)\n }\n\n extend<T>(token: InjectionToken<T>, decorator: ExtensionDecorator<T>): void {\n const current = this.resolve<T>(token)\n const decorated = decorator(current, this)\n this.registerValue(token, decorated)\n }\n\n // ── Request Scope ─────────────────────────────────────────────\n\n async runInRequestScope<T>(\n routerContext: RouterContext,\n callback: (requestContainer: Container) => T | Promise<T>,\n ): Promise<T> {\n if (this.isRequestScoped) {\n throw new ContainerError('Cannot call runInRequestScope on a request-scoped container')\n }\n\n const requestContainer = this.createRequestScope(routerContext)\n return await containerStorage.run(requestContainer, () => callback(requestContainer))\n }\n\n createRequestScope(routerContext: RouterContext): Container {\n if (this.isRequestScoped) {\n throw new ContainerError('Cannot call createRequestScope on a request-scoped container')\n }\n\n const child = new Container({ parent: this, isRequestScoped: true })\n child.registerValue(ROUTER_TOKENS.RouterContext, routerContext)\n return child\n }\n\n // ── Lifecycle ─────────────────────────────────────────────────\n\n dispose(): void {\n this.registrations.clear()\n this.singletons.clear()\n this.requestCache.clear()\n }\n\n // ── Internal ──────────────────────────────────────────────────\n\n private resolveRegistration(token: InjectionToken, reg: Registration): unknown {\n switch (reg.kind) {\n case 'value':\n return reg.value\n\n case 'alias':\n return this.resolve(reg.target)\n\n case 'factory':\n return reg.factory(this)\n\n case 'lazy': {\n const useClass = reg.factory()\n return this.resolveClass(token, { kind: 'class', useClass, scope: reg.scope })\n }\n\n case 'class':\n return this.resolveClass(token, reg)\n }\n }\n\n private resolveClass(token: InjectionToken, reg: ClassRegistration): unknown {\n const { useClass, scope } = reg\n\n // Singleton: check global cache (root or current)\n if (scope === Scope.Singleton) {\n const root = this.getRoot()\n if (root.singletons.has(token)) return root.singletons.get(token)\n const instance = this.instantiate(useClass)\n root.singletons.set(token, instance)\n return instance\n }\n\n // Request: cache in the request-scoped container\n if (scope === Scope.Request) {\n if (this.isRequestScoped) {\n if (this.requestCache.has(token)) return this.requestCache.get(token)\n const instance = this.instantiate(useClass)\n this.requestCache.set(token, instance)\n return instance\n }\n // Resolving a request-scoped service from global container — treat as transient\n }\n\n // Transient: always new instance\n return this.instantiate(useClass)\n }\n\n private instantiate(Class: Constructor): unknown {\n const injections = getInjectionTokens(Class)\n\n if (injections.size === 0) {\n return new Class()\n }\n\n const maxIndex = Math.max(...injections.keys())\n const args: unknown[] = new Array(maxIndex + 1)\n\n for (const [index, entry] of injections) {\n if (entry.optional) {\n args[index] = this.tryResolve(entry.token)\n } else {\n args[index] = this.resolve(entry.token)\n }\n }\n\n return new Class(...args)\n }\n\n findRegistration(token: InjectionToken): Registration | undefined {\n const local = this.registrations.get(token)\n if (local) return local\n return this.parent?.findRegistration(token)\n }\n\n private getRoot(): Container {\n if (!this.parent) return this\n return this.parent.getRoot()\n }\n}\n"],"mappings":"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"}
|
package/dist/email/index.d.mts
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { Sn as AsyncModuleOptions, wn as DynamicModule, xr as ApplicationError } from "../index-DEncMcC6.mjs";
|
|
2
|
+
import { a as z } from "../zod-DvWTfRpI.mjs";
|
|
3
|
+
import { h as QueueBinding, m as IQueueSender } from "../index-CW1YHSft.mjs";
|
|
4
4
|
import { ReactElement } from "react";
|
|
5
5
|
|
|
6
|
+
//#region src/email/email.error.d.ts
|
|
7
|
+
declare class EmailError extends ApplicationError {}
|
|
8
|
+
//#endregion
|
|
6
9
|
//#region src/email/email.module.d.ts
|
|
7
10
|
/**
|
|
8
11
|
* SMTP configuration options
|
|
@@ -37,10 +40,10 @@ interface EmailModuleOptions {
|
|
|
37
40
|
/** Default reply-to address */
|
|
38
41
|
replyTo?: string;
|
|
39
42
|
/**
|
|
40
|
-
* Queue
|
|
41
|
-
* The
|
|
43
|
+
* Queue binding for email dispatch.
|
|
44
|
+
* The binding must be registered via QueueModule.registerQueue(binding).
|
|
42
45
|
*/
|
|
43
|
-
queue:
|
|
46
|
+
queue: QueueBinding;
|
|
44
47
|
}
|
|
45
48
|
declare class EmailModule {
|
|
46
49
|
/**
|
|
@@ -55,7 +58,7 @@ declare class EmailModule {
|
|
|
55
58
|
* provider: 'resend',
|
|
56
59
|
* apiKey: env.RESEND_API_KEY,
|
|
57
60
|
* from: { name: 'App', email: 'noreply@example.com' },
|
|
58
|
-
* queue: '
|
|
61
|
+
* queue: 'NOTIFICATIONS_QUEUE',
|
|
59
62
|
* })
|
|
60
63
|
* ```
|
|
61
64
|
*/
|
|
@@ -114,7 +117,7 @@ declare const EMAIL_TOKENS: {
|
|
|
114
117
|
readonly EmailProvider: symbol;
|
|
115
118
|
/**
|
|
116
119
|
* Queue sender for email dispatch.
|
|
117
|
-
* Bound via EmailModule.forRoot({ queue: '
|
|
120
|
+
* Bound via EmailModule.forRoot({ queue: 'QUEUE_BINDING_NAME' })
|
|
118
121
|
*/
|
|
119
122
|
readonly EmailQueue: symbol;
|
|
120
123
|
};
|
|
@@ -321,7 +324,7 @@ type SendBatchEmailInputWithTemplate = Omit<SendBatchEmailInput, 'messages'> & {
|
|
|
321
324
|
*
|
|
322
325
|
* Main facade for sending emails. Routes emails to queues for async processing.
|
|
323
326
|
* The queue is injected via EMAIL_TOKENS.EmailQueue, configured by the application
|
|
324
|
-
* via EmailModule.forRoot({ queue: '
|
|
327
|
+
* via EmailModule.forRoot({ queue: 'QUEUE_BINDING_NAME' }).
|
|
325
328
|
*
|
|
326
329
|
* @example Basic usage
|
|
327
330
|
* ```typescript
|
|
@@ -445,88 +448,10 @@ declare class EmailProviderFactory {
|
|
|
445
448
|
* Create email provider instance based on configuration
|
|
446
449
|
*
|
|
447
450
|
* @returns Email provider implementation
|
|
448
|
-
* @throws
|
|
451
|
+
* @throws EmailError if provider is not supported
|
|
449
452
|
*/
|
|
450
453
|
create(): Promise<IEmailProvider>;
|
|
451
454
|
}
|
|
452
455
|
//#endregion
|
|
453
|
-
|
|
454
|
-
/**
|
|
455
|
-
* ResendApiKeyMissingError
|
|
456
|
-
*
|
|
457
|
-
* Thrown when the Resend API key is not configured in environment variables.
|
|
458
|
-
* This prevents the Resend email provider from initializing.
|
|
459
|
-
*
|
|
460
|
-
* Resolution: Set the RESEND_EMAIL_API_KEY environment variable.
|
|
461
|
-
*/
|
|
462
|
-
declare class ResendApiKeyMissingError extends ApplicationError {
|
|
463
|
-
constructor();
|
|
464
|
-
}
|
|
465
|
-
//#endregion
|
|
466
|
-
//#region src/email/errors/smtp-configuration-missing.error.d.ts
|
|
467
|
-
/**
|
|
468
|
-
* SmtpConfigurationMissingError
|
|
469
|
-
*
|
|
470
|
-
* Thrown when SMTP configuration is not found in environment variables.
|
|
471
|
-
* This prevents the SMTP email provider from initializing.
|
|
472
|
-
*
|
|
473
|
-
* Resolution: Set the SMTP_URL environment variable with format: smtp://user:pass@host:port
|
|
474
|
-
*/
|
|
475
|
-
declare class SmtpConfigurationMissingError extends ApplicationError {
|
|
476
|
-
constructor();
|
|
477
|
-
}
|
|
478
|
-
//#endregion
|
|
479
|
-
//#region src/email/errors/smtp-host-missing.error.d.ts
|
|
480
|
-
/**
|
|
481
|
-
* SmtpHostMissingError
|
|
482
|
-
*
|
|
483
|
-
* Thrown when SMTP host could not be parsed from SMTP_URL or is empty.
|
|
484
|
-
* This prevents the SMTP email provider from initializing.
|
|
485
|
-
*
|
|
486
|
-
* Resolution: Ensure SMTP_URL is correctly formatted: smtp://user:pass@host:port
|
|
487
|
-
*/
|
|
488
|
-
declare class SmtpHostMissingError extends ApplicationError {
|
|
489
|
-
constructor();
|
|
490
|
-
}
|
|
491
|
-
//#endregion
|
|
492
|
-
//#region src/email/errors/email-smtp-connection-failed.error.d.ts
|
|
493
|
-
/**
|
|
494
|
-
* EmailSmtpConnectionFailedError
|
|
495
|
-
*
|
|
496
|
-
* Thrown when connection to SMTP server fails during email sending.
|
|
497
|
-
* This is a runtime error that may be temporary.
|
|
498
|
-
*
|
|
499
|
-
* Resolution: Check SMTP server availability, network connectivity, or wait and retry.
|
|
500
|
-
*/
|
|
501
|
-
declare class EmailSmtpConnectionFailedError extends ApplicationError {
|
|
502
|
-
constructor(smtpHost: string, smtpPort: number);
|
|
503
|
-
}
|
|
504
|
-
//#endregion
|
|
505
|
-
//#region src/email/errors/email-resend-api-failed.error.d.ts
|
|
506
|
-
/**
|
|
507
|
-
* EmailResendApiFailedError
|
|
508
|
-
*
|
|
509
|
-
* Thrown when Resend API returns an error during email sending.
|
|
510
|
-
* This is a runtime error from the Resend service.
|
|
511
|
-
*
|
|
512
|
-
* Resolution: Check Resend API status, API key validity, or wait and retry.
|
|
513
|
-
*/
|
|
514
|
-
declare class EmailResendApiFailedError extends ApplicationError {
|
|
515
|
-
constructor();
|
|
516
|
-
}
|
|
517
|
-
//#endregion
|
|
518
|
-
//#region src/email/errors/email-provider-not-supported.error.d.ts
|
|
519
|
-
/**
|
|
520
|
-
* EmailProviderNotSupportedError
|
|
521
|
-
*
|
|
522
|
-
* Thrown when an unsupported email provider is configured.
|
|
523
|
-
* Only 'resend' and 'smtp' providers are currently supported.
|
|
524
|
-
*
|
|
525
|
-
* Resolution: Set EMAIL_PROVIDER to either 'resend' or 'smtp'.
|
|
526
|
-
*/
|
|
527
|
-
declare class EmailProviderNotSupportedError extends ApplicationError {
|
|
528
|
-
constructor(provider: string);
|
|
529
|
-
}
|
|
530
|
-
//#endregion
|
|
531
|
-
export { EMAIL_TOKENS, EmailAddress, EmailAttachment, EmailMessage, EmailModule, EmailModuleOptions, EmailProviderFactory, EmailProviderNotSupportedError, EmailResendApiFailedError, EmailService, EmailSmtpConnectionFailedError, InlineEmailAttachment, ResendApiKeyMissingError, ResolvedEmailAttachment, ResolvedEmailMessage, SendBatchEmailInput, SendBatchEmailInputWithTemplate, SendEmailInput, SendEmailInputWithTemplate, SmtpConfig, SmtpConfigurationMissingError, SmtpHostMissingError, StorageEmailAttachment, emailAddressSchema, emailAttachmentSchema, emailMessageSchema, inlineEmailAttachmentSchema, sendBatchEmailInputSchema, sendEmailInputSchema, storageEmailAttachmentSchema };
|
|
456
|
+
export { EMAIL_TOKENS, EmailAddress, EmailAttachment, EmailError, EmailMessage, EmailModule, EmailModuleOptions, EmailProviderFactory, EmailService, InlineEmailAttachment, ResolvedEmailAttachment, ResolvedEmailMessage, SendBatchEmailInput, SendBatchEmailInputWithTemplate, SendEmailInput, SendEmailInputWithTemplate, SmtpConfig, StorageEmailAttachment, emailAddressSchema, emailAttachmentSchema, emailMessageSchema, inlineEmailAttachmentSchema, sendBatchEmailInputSchema, sendEmailInputSchema, storageEmailAttachmentSchema };
|
|
532
457
|
//# sourceMappingURL=index.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/email/email.module.ts","../../src/email/email.tokens.ts","../../src/email/contracts/email-attachment.ts","../../src/email/contracts/email-message.contract.ts","../../src/email/contracts/send-email.input.ts","../../src/email/services/email.service.ts","../../src/email/providers/email-provider.interface.ts","../../src/email/services/email-provider-factory.ts"
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/email/email.error.ts","../../src/email/email.module.ts","../../src/email/email.tokens.ts","../../src/email/contracts/email-attachment.ts","../../src/email/contracts/email-message.contract.ts","../../src/email/contracts/send-email.input.ts","../../src/email/services/email.service.ts","../../src/email/providers/email-provider.interface.ts","../../src/email/services/email-provider-factory.ts"],"mappings":"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"}
|