stratal 0.0.20 → 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/cloudflare-workers-loader.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 +22 -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-Bu-PjJrX.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 +33 -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-DQzenvSN.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-7Symz_TE.mjs → cron-manager-9bpN9bu4.mjs} +42 -16
- package/dist/cron-manager-9bpN9bu4.mjs.map +1 -0
- package/dist/{cron-manager-BEsH1mjW.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 +30 -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-COKixqnG.mjs → events-D1KdDaiP.mjs} +13 -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-CdJjpUCW.mjs → gateway-context-CFe6a9gz.mjs} +20 -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-DUk_Kzst.mjs → guards-Ced-uNIF.mjs} +7 -5
- package/dist/guards-Ced-uNIF.mjs.map +1 -0
- package/dist/{http-method.decorator-DXwxAfb_.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-CjaQ6_tZ.d.mts → index-CW1YHSft.d.mts} +71 -167
- package/dist/index-CW1YHSft.d.mts.map +1 -0
- package/dist/{index-D0US0X14.d.mts → index-DEncMcC6.d.mts} +559 -2239
- 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-BLgvn3hJ.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 +27 -28
- package/dist/queue/index.mjs.map +1 -1
- package/dist/{queue.module-BCdCiySt.mjs → queue.module-DeWJ0tQM.mjs} +67 -112
- package/dist/queue.module-DeWJ0tQM.mjs.map +1 -0
- package/dist/{r2-storage.provider-Co6F0ZYV.mjs → r2-storage.provider-Hfm6LdZQ.mjs} +8 -5
- package/dist/r2-storage.provider-Hfm6LdZQ.mjs.map +1 -0
- package/dist/{rate-limit.decorator--o6Q6p9w.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 +25 -30
- package/dist/rate-limiter/index.mjs.map +1 -1
- package/dist/{resend.provider-M6qRLrcy.mjs → resend.provider-Ur6tU7fK.mjs} +8 -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-BBlNNlcG.mjs → router-Cy6DjkvP.mjs} +215 -855
- 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-CJAOHEIo.mjs → seeder-BADTig4n.mjs} +17 -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-w0Ve52Xg.mjs → smtp.provider-C129sNBT.mjs} +7 -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-1zw-6Yiz.mjs → storage-BA3ppVYM.mjs} +70 -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-DeEcGgdq.mjs → stratal-Bdq4IdB3.mjs} +31 -183
- 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 +20 -20
- package/dist/command-BgSlsS4M.mjs.map +0 -1
- package/dist/command-Bu-PjJrX.d.mts.map +0 -1
- package/dist/controller.decorator-DQzenvSN.mjs.map +0 -1
- package/dist/cron-manager-7Symz_TE.mjs.map +0 -1
- package/dist/cron-manager-BEsH1mjW.d.mts.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-BdyV5PnY.mjs +0 -1725
- package/dist/errors-BdyV5PnY.mjs.map +0 -1
- package/dist/errors-Da3Pz2X7.mjs +0 -74
- package/dist/errors-Da3Pz2X7.mjs.map +0 -1
- package/dist/events-COKixqnG.mjs.map +0 -1
- package/dist/gateway-context-CdJjpUCW.mjs.map +0 -1
- package/dist/guards-DUk_Kzst.mjs.map +0 -1
- package/dist/http-method.decorator-DXwxAfb_.mjs.map +0 -1
- package/dist/i18n.module-BBlNNlcG.mjs.map +0 -1
- package/dist/index-Bnpfq6uk.d.mts.map +0 -1
- package/dist/index-C1KvMncZ.d.mts.map +0 -1
- package/dist/index-CjaQ6_tZ.d.mts.map +0 -1
- package/dist/index-D0US0X14.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.d.mts.map +0 -1
- package/dist/logger-V6Ms3QnQ.mjs +0 -436
- package/dist/logger-V6Ms3QnQ.mjs.map +0 -1
- package/dist/module-Dk2qTa77.mjs +0 -860
- package/dist/module-Dk2qTa77.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-BLgvn3hJ.d.mts.map +0 -1
- package/dist/quarry-registry-DNEej-Db.mjs +0 -688
- package/dist/quarry-registry-DNEej-Db.mjs.map +0 -1
- package/dist/queue.module-BCdCiySt.mjs.map +0 -1
- package/dist/r2-storage.provider-Co6F0ZYV.mjs.map +0 -1
- package/dist/rate-limit.decorator--o6Q6p9w.mjs.map +0 -1
- package/dist/resend.provider-M6qRLrcy.mjs.map +0 -1
- package/dist/seeder-CJAOHEIo.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-w0Ve52Xg.mjs.map +0 -1
- package/dist/storage-1zw-6Yiz.mjs.map +0 -1
- package/dist/storage-provider.interface-Bd6vA4ak.d.mts.map +0 -1
- package/dist/stratal-DeEcGgdq.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,219 @@
|
|
|
1
|
+
import { l as Request, m as inject, o as ROUTER_TOKENS, u as Singleton } from "./di-BO1QIb5H.mjs";
|
|
2
|
+
import { n as __decorateParam, t as __decorate } from "./decorate-HgTKAYK8.mjs";
|
|
3
|
+
import { f as Module } from "./module-xYoHba6B.mjs";
|
|
4
|
+
import { t as I18N_TOKENS } from "./i18n.tokens-hwRpmjRq.mjs";
|
|
5
|
+
import { r as z } from "./zod-hMa3rSHV.mjs";
|
|
6
|
+
import "./router-Cy6DjkvP.mjs";
|
|
7
|
+
import { t as en_exports } from "./en-BPP6h6y5.mjs";
|
|
8
|
+
import { t as deepMerge } from "./deep-merge-C8NgcXw4.mjs";
|
|
9
|
+
import { t as zodErrorMap } from "./validation.context-XTysWJ3b.mjs";
|
|
10
|
+
import IntlMessageFormat from "intl-messageformat";
|
|
11
|
+
//#region src/i18n/services/i18n.service.ts
|
|
12
|
+
let I18nService = class I18nService {
|
|
13
|
+
loader;
|
|
14
|
+
routerContext;
|
|
15
|
+
constructor(loader, routerContext) {
|
|
16
|
+
this.loader = loader;
|
|
17
|
+
this.routerContext = routerContext;
|
|
18
|
+
}
|
|
19
|
+
t(key, params) {
|
|
20
|
+
return this.loader.translate(this.getLocale(), key, params);
|
|
21
|
+
}
|
|
22
|
+
getLocale() {
|
|
23
|
+
return this.routerContext?.getLocale() ?? "en";
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
I18nService = __decorate([
|
|
27
|
+
Request(I18N_TOKENS.I18nService),
|
|
28
|
+
__decorateParam(0, inject(I18N_TOKENS.MessageLoader)),
|
|
29
|
+
__decorateParam(1, inject(ROUTER_TOKENS.RouterContext, { isOptional: true }))
|
|
30
|
+
], I18nService);
|
|
31
|
+
//#endregion
|
|
32
|
+
//#region src/i18n/messages/index.ts
|
|
33
|
+
/**
|
|
34
|
+
* Core Messages
|
|
35
|
+
*
|
|
36
|
+
* Messages used by packages/modules infrastructure.
|
|
37
|
+
* These are automatically merged with application-specific messages.
|
|
38
|
+
*/
|
|
39
|
+
/**
|
|
40
|
+
* All locale messages
|
|
41
|
+
* Explicitly import and export (no filesystem scanning - Cloudflare Workers compatible)
|
|
42
|
+
*/
|
|
43
|
+
const messages = { en: en_exports };
|
|
44
|
+
/**
|
|
45
|
+
* Get messages for all locales
|
|
46
|
+
*/
|
|
47
|
+
function getMessages() {
|
|
48
|
+
return messages;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Get available locales
|
|
52
|
+
*/
|
|
53
|
+
function getLocales() {
|
|
54
|
+
return Object.keys(messages);
|
|
55
|
+
}
|
|
56
|
+
//#endregion
|
|
57
|
+
//#region src/i18n/services/message-loader.service.ts
|
|
58
|
+
let MessageLoaderService = class MessageLoaderService {
|
|
59
|
+
registry;
|
|
60
|
+
options;
|
|
61
|
+
cache;
|
|
62
|
+
compiledCache;
|
|
63
|
+
locales;
|
|
64
|
+
defaultLocale;
|
|
65
|
+
constructor(registry, options) {
|
|
66
|
+
this.registry = registry;
|
|
67
|
+
this.options = options;
|
|
68
|
+
this.defaultLocale = this.options?.defaultLocale ?? "en";
|
|
69
|
+
this.cache = /* @__PURE__ */ new Map();
|
|
70
|
+
this.compiledCache = /* @__PURE__ */ new Map();
|
|
71
|
+
const coreMessages = getMessages();
|
|
72
|
+
const coreLocales = getLocales();
|
|
73
|
+
const registryMessages = this.registry.getMergedMessages();
|
|
74
|
+
const registryLocales = Object.keys(registryMessages);
|
|
75
|
+
const allLocales = [...new Set([...coreLocales, ...registryLocales])];
|
|
76
|
+
this.locales = allLocales;
|
|
77
|
+
for (const locale of allLocales) {
|
|
78
|
+
const merged = deepMerge(coreMessages[locale] ?? {}, registryMessages[locale] ?? {});
|
|
79
|
+
this.cache.set(locale, merged);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
translate(locale, key, params) {
|
|
83
|
+
const fn = this.getCompiledMessages(locale)[key];
|
|
84
|
+
if (!fn) return key;
|
|
85
|
+
return fn(params);
|
|
86
|
+
}
|
|
87
|
+
getMessages(locale) {
|
|
88
|
+
return this.cache.get(locale) ?? this.cache.get(this.defaultLocale) ?? {};
|
|
89
|
+
}
|
|
90
|
+
getAvailableLocales() {
|
|
91
|
+
return this.locales;
|
|
92
|
+
}
|
|
93
|
+
isLocaleSupported(locale) {
|
|
94
|
+
return this.cache.has(locale);
|
|
95
|
+
}
|
|
96
|
+
getDefaultLocale() {
|
|
97
|
+
return this.defaultLocale;
|
|
98
|
+
}
|
|
99
|
+
getFilteredMessages(locale, options) {
|
|
100
|
+
const messages = this.getMessages(locale);
|
|
101
|
+
const flattened = this.flattenMessages(messages);
|
|
102
|
+
if (!options?.only?.length) return flattened;
|
|
103
|
+
const result = {};
|
|
104
|
+
for (const [key, value] of Object.entries(flattened)) if (options.only.some((prefix) => key === prefix || key.startsWith(`${prefix}.`))) result[key] = value;
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
getCompiledMessages(locale) {
|
|
108
|
+
const effectiveLocale = this.cache.has(locale) ? locale : this.defaultLocale;
|
|
109
|
+
const cached = this.compiledCache.get(effectiveLocale);
|
|
110
|
+
if (cached) return cached;
|
|
111
|
+
const messages = this.cache.get(effectiveLocale) ?? {};
|
|
112
|
+
const flattened = this.flattenMessages(messages);
|
|
113
|
+
const compiled = {};
|
|
114
|
+
for (const [key, value] of Object.entries(flattened)) {
|
|
115
|
+
const msg = new IntlMessageFormat(value, effectiveLocale);
|
|
116
|
+
compiled[key] = (params) => String(msg.format(params));
|
|
117
|
+
}
|
|
118
|
+
this.compiledCache.set(effectiveLocale, compiled);
|
|
119
|
+
return compiled;
|
|
120
|
+
}
|
|
121
|
+
flattenMessages(messages, prefix = "") {
|
|
122
|
+
const result = {};
|
|
123
|
+
for (const key of Object.keys(messages)) {
|
|
124
|
+
const value = messages[key];
|
|
125
|
+
const newKey = prefix ? `${prefix}.${key}` : key;
|
|
126
|
+
if (typeof value === "object" && value !== null && !Array.isArray(value)) Object.assign(result, this.flattenMessages(value, newKey));
|
|
127
|
+
else result[newKey] = String(value);
|
|
128
|
+
}
|
|
129
|
+
return result;
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
MessageLoaderService = __decorate([
|
|
133
|
+
Singleton(I18N_TOKENS.MessageLoader),
|
|
134
|
+
__decorateParam(0, inject(I18N_TOKENS.MessageRegistry)),
|
|
135
|
+
__decorateParam(1, inject(I18N_TOKENS.Options, { isOptional: true }))
|
|
136
|
+
], MessageLoaderService);
|
|
137
|
+
//#endregion
|
|
138
|
+
//#region src/i18n/services/message-registry.ts
|
|
139
|
+
/**
|
|
140
|
+
* Global key for the shared contributions array.
|
|
141
|
+
*
|
|
142
|
+
* When stratal is installed via portal/symlink (e.g., in monorepos), bundlers
|
|
143
|
+
* like esbuild may inline multiple copies of this module. Each copy gets its
|
|
144
|
+
* own static class fields, so messages registered by one copy are invisible
|
|
145
|
+
* to another. Using a `Symbol.for()` key on `globalThis` ensures all copies
|
|
146
|
+
* share the same contributions array.
|
|
147
|
+
*/
|
|
148
|
+
const CONTRIBUTIONS_KEY = Symbol.for("stratal:i18n:message-registry:contributions");
|
|
149
|
+
function getContributions() {
|
|
150
|
+
const g = globalThis;
|
|
151
|
+
g[CONTRIBUTIONS_KEY] ??= [];
|
|
152
|
+
return g[CONTRIBUTIONS_KEY];
|
|
153
|
+
}
|
|
154
|
+
let MessageRegistry = class MessageRegistry {
|
|
155
|
+
/**
|
|
156
|
+
* Add messages (called statically by I18nModule.registerMessages)
|
|
157
|
+
*/
|
|
158
|
+
static addMessages(messages) {
|
|
159
|
+
if (Boolean(messages) && typeof messages === "object" && Object.keys(messages).length > 0) getContributions().push(messages);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Get all messages deep-merged in registration order
|
|
163
|
+
*/
|
|
164
|
+
getMergedMessages() {
|
|
165
|
+
const merged = {};
|
|
166
|
+
for (const contribution of getContributions()) for (const locale of Object.keys(contribution)) merged[locale] = deepMerge(merged[locale] ?? {}, contribution[locale]);
|
|
167
|
+
return merged;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Reset registry (for testing)
|
|
171
|
+
* @internal
|
|
172
|
+
*/
|
|
173
|
+
static reset() {
|
|
174
|
+
globalThis[CONTRIBUTIONS_KEY] = [];
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
MessageRegistry = __decorate([Singleton(I18N_TOKENS.MessageRegistry)], MessageRegistry);
|
|
178
|
+
//#endregion
|
|
179
|
+
//#region src/i18n/i18n.module.ts
|
|
180
|
+
var _I18nModule;
|
|
181
|
+
let I18nModule = _I18nModule = class I18nModule {
|
|
182
|
+
onInitialize(_context) {
|
|
183
|
+
z.config({ customError: zodErrorMap });
|
|
184
|
+
}
|
|
185
|
+
static forRoot(options = {}) {
|
|
186
|
+
return {
|
|
187
|
+
module: _I18nModule,
|
|
188
|
+
providers: [{
|
|
189
|
+
provide: I18N_TOKENS.Options,
|
|
190
|
+
useValue: options
|
|
191
|
+
}]
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
static registerMessages(messages) {
|
|
195
|
+
MessageRegistry.addMessages(messages);
|
|
196
|
+
return {
|
|
197
|
+
module: _I18nModule,
|
|
198
|
+
providers: []
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
I18nModule = _I18nModule = __decorate([Module({ providers: [
|
|
203
|
+
{
|
|
204
|
+
provide: I18N_TOKENS.MessageRegistry,
|
|
205
|
+
useClass: MessageRegistry
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
provide: I18N_TOKENS.MessageLoader,
|
|
209
|
+
useClass: MessageLoaderService
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
provide: I18N_TOKENS.I18nService,
|
|
213
|
+
useClass: I18nService
|
|
214
|
+
}
|
|
215
|
+
] })], I18nModule);
|
|
216
|
+
//#endregion
|
|
217
|
+
export { getMessages as a, getLocales as i, MessageRegistry as n, messages as o, MessageLoaderService as r, I18nModule as t };
|
|
218
|
+
|
|
219
|
+
//# sourceMappingURL=i18n.module-BlXrtAlV.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.module-BlXrtAlV.mjs","names":[],"sources":["../src/i18n/services/i18n.service.ts","../src/i18n/messages/index.ts","../src/i18n/services/message-loader.service.ts","../src/i18n/services/message-registry.ts","../src/i18n/i18n.module.ts"],"sourcesContent":["import { inject } from '../../di'\nimport { Request } from '../../di/decorators'\nimport { ROUTER_TOKENS, type RouterContext } from '../../router'\nimport { I18N_TOKENS } from '../i18n.tokens'\nimport type { II18nService, MessageKeys, MessageParams } from '../i18n.types'\nimport type { MessageLoaderService } from './message-loader.service'\n\n@Request(I18N_TOKENS.I18nService)\nexport class I18nService implements II18nService {\n constructor(\n @inject(I18N_TOKENS.MessageLoader) private readonly loader: MessageLoaderService,\n @inject(ROUTER_TOKENS.RouterContext, { isOptional: true }) private readonly routerContext?: RouterContext\n ) {\n }\n\n t(key: MessageKeys, params?: MessageParams): string {\n return this.loader.translate(this.getLocale(), key, params as Record<string, unknown>)\n }\n\n getLocale(): string {\n return this.routerContext?.getLocale() ?? 'en'\n }\n}\n","/**\n * Core Messages\n *\n * Messages used by packages/modules infrastructure.\n * These are automatically merged with application-specific messages.\n */\n\nimport * as en from './en'\n\n/**\n * All locale messages\n * Explicitly import and export (no filesystem scanning - Cloudflare Workers compatible)\n */\nexport const messages = { en } as const\n\n/**\n * Type for all messages\n */\nexport type Messages = typeof messages\n\n/**\n * Get messages for all locales\n */\nexport function getMessages(): Record<string, Record<string, unknown>> {\n return messages\n}\n\n/**\n * Get available locales\n */\nexport function getLocales(): string[] {\n return Object.keys(messages)\n}\n","import IntlMessageFormat from 'intl-messageformat'\nimport { inject } from '../../di'\nimport { Singleton } from '../../di/decorators'\nimport type { I18nModuleOptions } from '../i18n.options'\nimport type { MessageKeyPrefix } from '../i18n.types'\nimport { I18N_TOKENS } from '../i18n.tokens'\nimport { getLocales, getMessages } from '../messages'\nimport { deepMerge } from '../utils/deep-merge'\nimport type { MessageRegistry } from './message-registry'\n\ntype CompiledMessages = Record<string, (params?: Record<string, unknown>) => string>\n\n@Singleton(I18N_TOKENS.MessageLoader)\nexport class MessageLoaderService {\n private readonly cache: Map<string, Record<string, unknown>>\n private readonly compiledCache: Map<string, CompiledMessages>\n private readonly locales: string[]\n private readonly defaultLocale: string\n\n constructor(\n @inject(I18N_TOKENS.MessageRegistry) private readonly registry: MessageRegistry,\n @inject(I18N_TOKENS.Options, { isOptional: true })\n private readonly options?: I18nModuleOptions\n ) {\n this.defaultLocale = this.options?.defaultLocale ?? 'en'\n this.cache = new Map()\n this.compiledCache = new Map()\n\n const coreMessages = getMessages()\n const coreLocales = getLocales()\n\n const registryMessages = this.registry.getMergedMessages()\n const registryLocales = Object.keys(registryMessages)\n\n const allLocales = [...new Set([...coreLocales, ...registryLocales])]\n this.locales = allLocales\n\n for (const locale of allLocales) {\n const coreLocaleMessages = coreMessages[locale] ?? {}\n const registryLocaleMessages = registryMessages[locale] ?? {}\n\n const merged = deepMerge(coreLocaleMessages, registryLocaleMessages)\n this.cache.set(locale, merged)\n }\n }\n\n translate(locale: string, key: string, params?: Record<string, unknown>): string {\n const compiled = this.getCompiledMessages(locale)\n const fn = compiled[key]\n if (!fn) return key\n return fn(params)\n }\n\n getMessages(locale: string): Record<string, unknown> {\n return this.cache.get(locale) ?? this.cache.get(this.defaultLocale) ?? {}\n }\n\n getAvailableLocales(): string[] {\n return this.locales\n }\n\n isLocaleSupported(locale: string): boolean {\n return this.cache.has(locale)\n }\n\n getDefaultLocale(): string {\n return this.defaultLocale\n }\n\n getFilteredMessages(\n locale: string,\n options?: { only?: MessageKeyPrefix[] }\n ): Record<string, string> {\n const messages = this.getMessages(locale)\n const flattened = this.flattenMessages(messages)\n\n if (!options?.only?.length) return flattened\n\n const result: Record<string, string> = {}\n for (const [key, value] of Object.entries(flattened)) {\n if (options.only.some((prefix) => key === prefix || key.startsWith(`${prefix}.`))) {\n result[key] = value\n }\n }\n return result\n }\n\n private getCompiledMessages(locale: string): CompiledMessages {\n const effectiveLocale = this.cache.has(locale) ? locale : this.defaultLocale\n\n const cached = this.compiledCache.get(effectiveLocale)\n if (cached) return cached\n\n const messages = this.cache.get(effectiveLocale) ?? {}\n const flattened = this.flattenMessages(messages)\n\n const compiled: CompiledMessages = {}\n for (const [key, value] of Object.entries(flattened)) {\n const msg = new IntlMessageFormat(value, effectiveLocale)\n compiled[key] = (params) => String(msg.format(params as Record<string, string | number | boolean>))\n }\n\n this.compiledCache.set(effectiveLocale, compiled)\n return compiled\n }\n\n private flattenMessages(\n messages: Record<string, unknown>,\n prefix = ''\n ): Record<string, string> {\n const result: Record<string, string> = {}\n\n for (const key of Object.keys(messages)) {\n const value = messages[key]\n const newKey = prefix ? `${prefix}.${key}` : key\n\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n Object.assign(result, this.flattenMessages(value as Record<string, unknown>, newKey))\n } else {\n result[newKey] = String(value)\n }\n }\n\n return result\n }\n}\n","import { Singleton } from '../../di/decorators'\nimport { I18N_TOKENS } from '../i18n.tokens'\nimport { deepMerge } from '../utils/deep-merge'\n\n/**\n * Global key for the shared contributions array.\n *\n * When stratal is installed via portal/symlink (e.g., in monorepos), bundlers\n * like esbuild may inline multiple copies of this module. Each copy gets its\n * own static class fields, so messages registered by one copy are invisible\n * to another. Using a `Symbol.for()` key on `globalThis` ensures all copies\n * share the same contributions array.\n */\nconst CONTRIBUTIONS_KEY = Symbol.for('stratal:i18n:message-registry:contributions')\n\ntype Contributions = Record<string, Record<string, unknown>>[]\n\nfunction getContributions(): Contributions {\n const g = globalThis as Record<symbol, unknown>\n g[CONTRIBUTIONS_KEY] ??= [];\n return g[CONTRIBUTIONS_KEY] as Contributions\n}\n\n/**\n * Message Registry\n *\n * Accumulates i18n messages from multiple `I18nModule.registerMessages()` calls.\n * Messages are collected statically (at module import time) and deep-merged\n * when `getMergedMessages()` is called by `MessageLoaderService`.\n *\n * Later registrations override earlier ones at leaf level.\n */\n@Singleton(I18N_TOKENS.MessageRegistry)\nexport class MessageRegistry {\n /**\n * Add messages (called statically by I18nModule.registerMessages)\n */\n static addMessages(messages: Record<string, Record<string, unknown>>): void {\n if (Boolean(messages) && typeof messages === 'object' && Object.keys(messages).length > 0) {\n getContributions().push(messages)\n }\n }\n\n /**\n * Get all messages deep-merged in registration order\n */\n getMergedMessages(): Record<string, Record<string, unknown>> {\n const merged: Record<string, Record<string, unknown>> = {}\n\n for (const contribution of getContributions()) {\n for (const locale of Object.keys(contribution)) {\n merged[locale] = deepMerge(\n (merged[locale] ?? {}),\n contribution[locale],\n )\n }\n }\n\n return merged\n }\n\n /**\n * Reset registry (for testing)\n * @internal\n */\n static reset(): void {\n (globalThis as Record<symbol, unknown>)[CONTRIBUTIONS_KEY] = []\n }\n}\n","import { Module } from '../module'\nimport type { DynamicModule, ModuleContext, OnInitialize } from '../module/types'\nimport type { I18nModuleOptions } from './i18n.options'\nimport { I18N_TOKENS } from './i18n.tokens'\nimport { I18nService } from './services/i18n.service'\nimport { MessageLoaderService } from './services/message-loader.service'\nimport { MessageRegistry } from './services/message-registry'\nimport { zodErrorMap } from './validation/validation.context'\nimport { z } from './validation/zod'\n\n@Module({\n providers: [\n { provide: I18N_TOKENS.MessageRegistry, useClass: MessageRegistry },\n { provide: I18N_TOKENS.MessageLoader, useClass: MessageLoaderService },\n { provide: I18N_TOKENS.I18nService, useClass: I18nService },\n ],\n})\nexport class I18nModule implements OnInitialize {\n onInitialize(_context: ModuleContext): void {\n z.config({ customError: zodErrorMap })\n }\n\n static forRoot(options: I18nModuleOptions = {}): DynamicModule {\n return {\n module: I18nModule,\n providers: [\n { provide: I18N_TOKENS.Options, useValue: options },\n ],\n }\n }\n\n static registerMessages(messages: Record<string, Record<string, unknown>>): DynamicModule {\n MessageRegistry.addMessages(messages)\n return {\n module: I18nModule,\n providers: [],\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//#region src/i18n/i18n.tokens.ts
|
|
2
|
+
/**
|
|
3
|
+
* I18n Module DI Tokens
|
|
4
|
+
* Symbol-based tokens to avoid string collisions
|
|
5
|
+
*/
|
|
6
|
+
const I18N_TOKENS = {
|
|
7
|
+
/** MessageLoaderService - loads and caches locale messages */
|
|
8
|
+
MessageLoader: Symbol.for("stratal:i18n:message:loader"),
|
|
9
|
+
/** I18nService - request-scoped translation service */
|
|
10
|
+
I18nService: Symbol.for("stratal:i18n:service"),
|
|
11
|
+
/** I18nModuleOptions - configuration options from forRoot() */
|
|
12
|
+
Options: Symbol.for("stratal:i18n:options"),
|
|
13
|
+
/** MessageRegistry - singleton accumulator for registerMessages() contributions */
|
|
14
|
+
MessageRegistry: Symbol.for("stratal:i18n:message:registry")
|
|
15
|
+
};
|
|
16
|
+
//#endregion
|
|
17
|
+
export { I18N_TOKENS as t };
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=i18n.tokens-hwRpmjRq.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.tokens-hwRpmjRq.mjs","names":[],"sources":["../src/i18n/i18n.tokens.ts"],"sourcesContent":["/**\n * I18n Module DI Tokens\n * Symbol-based tokens to avoid string collisions\n */\n\nexport const I18N_TOKENS = {\n /** MessageLoaderService - loads and caches locale messages */\n MessageLoader: Symbol.for('stratal:i18n:message:loader'),\n /** I18nService - request-scoped translation service */\n I18nService: Symbol.for('stratal:i18n:service'),\n /** I18nModuleOptions - configuration options from forRoot() */\n Options: Symbol.for('stratal:i18n:options'),\n /** MessageRegistry - singleton accumulator for registerMessages() contributions */\n MessageRegistry: Symbol.for('stratal:i18n:message:registry'),\n} as const\n"],"mappings":";;;;;AAKA,MAAa,cAAc;;CAEzB,eAAe,OAAO,IAAI,8BAA8B;;CAExD,aAAa,OAAO,IAAI,uBAAuB;;CAE/C,SAAS,OAAO,IAAI,uBAAuB;;CAE3C,iBAAiB,OAAO,IAAI,gCAAgC;CAC7D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-
|
|
1
|
+
{"version":3,"file":"index-B4UBK-2T.d.mts","names":[],"sources":["../src/macroable/types.ts","../src/macroable/macroable.ts"],"mappings":";KACY,aAAA,IAAiB,IAAA,UAAc,IAAA;;;KCEtC,WAAA,oBAA+B,IAAA;;;;;;;;AAHQ;;;;;AA+B5C;;;;;;;;;;;;;;uBAAsB,SAAA;EAAA,CACnB,GAAA;EAwE8D;;;;EAAA,iBAnE9C,cAAA,EAAc,GAAA;;;;EAyFsB;;;EAAA,iBApFpC,UAAA,EAAU,GAAA;EAuFL;;;EAAA,iBAlFL,WAAA,EAAW,GAAA;EAqFsB;;;;EAAA,eA/EnC,UAAA;EAhBgB;;;;;;;;;EAAA,OA6BxB,KAAA,WAAgB,WAAA,kBAA6B,YAAA,CAAa,CAAA,EAAA,CAC/D,IAAA,EAAM,CAAA,EACN,IAAA,EAAM,CAAA,EACN,KAAA,EAAO,YAAA,CAAa,CAAA,EAAG,CAAA;EAAA,OAElB,KAAA,CAAM,IAAA,mBAAuB,KAAA;EALA;;;;;;;;;EAAA,OAsC7B,gBAAA,WAA2B,WAAA,kBAA6B,YAAA,CAAa,CAAA,EAAA,CAC1E,IAAA,EAAM,CAAA,EACN,IAAA,EAAM,CAAA,EACN,KAAA,EAAO,YAAA,CAAa,CAAA,EAAG,CAAA;EAAA,OAElB,gBAAA,CAAiB,IAAA,mBAAuB,KAAA;EAtCxC;;;;;;;EAAA,OAuDA,MAAA,WAAiB,WAAA,kBAA6B,YAAA,CAAa,CAAA,EAAA,CAChE,IAAA,EAAM,CAAA,EACN,IAAA,EAAM,CAAA,EACN,WAAA,GAAc,IAAA,EAAM,YAAA,CAAa,CAAA,MAAO,YAAA,CAAa,CAAA,EAAG,CAAA,GACxD,SAAA;EAAA,OAEK,MAAA,CAAO,IAAA,mBAAuB,WAAA,EAAa,aAAA,EAAe,SAAA;EA3BzD;;;;;EAAA,OA+DD,QAAA,CAAS,IAAA;EA7DS;;;;EAAA,OA2ElB,WAAA,CAAA"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
//#region src/logger/logger.tokens.d.ts
|
|
2
|
+
declare const LOGGER_TOKENS: {
|
|
3
|
+
readonly LoggerService: symbol;
|
|
4
|
+
readonly Formatter: symbol;
|
|
5
|
+
readonly LogLevelOptions: symbol;
|
|
6
|
+
};
|
|
7
|
+
//#endregion
|
|
8
|
+
//#region src/logger/contracts/log-level.d.ts
|
|
9
|
+
/**
|
|
10
|
+
* Log severity levels
|
|
11
|
+
* Ordered from least to most severe
|
|
12
|
+
*/
|
|
13
|
+
declare enum LogLevel {
|
|
14
|
+
DEBUG = "debug",
|
|
15
|
+
INFO = "info",
|
|
16
|
+
WARN = "warn",
|
|
17
|
+
ERROR = "error"
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Map log levels to numeric priorities (for filtering)
|
|
21
|
+
* Higher numbers = more severe = higher priority
|
|
22
|
+
*/
|
|
23
|
+
declare const LOG_LEVEL_PRIORITY: Record<LogLevel, number>;
|
|
24
|
+
//#endregion
|
|
25
|
+
//#region src/logger/contracts/log-context.d.ts
|
|
26
|
+
/**
|
|
27
|
+
* Structured metadata attached to log entries
|
|
28
|
+
* Supports arbitrary key-value pairs for context enrichment
|
|
29
|
+
*/
|
|
30
|
+
type LogContext = Record<string, unknown>;
|
|
31
|
+
/**
|
|
32
|
+
* Internal context automatically added by LoggerService
|
|
33
|
+
* Contains request metadata, etc.
|
|
34
|
+
*/
|
|
35
|
+
interface InternalLogContext extends LogContext {
|
|
36
|
+
userId?: string;
|
|
37
|
+
timestamp: number;
|
|
38
|
+
}
|
|
39
|
+
//#endregion
|
|
40
|
+
//#region src/logger/contracts/log-entry.d.ts
|
|
41
|
+
/**
|
|
42
|
+
* Complete log entry structure passed to transports
|
|
43
|
+
* Combines message, level, and enriched context
|
|
44
|
+
*/
|
|
45
|
+
interface LogEntry {
|
|
46
|
+
level: LogLevel;
|
|
47
|
+
message: string;
|
|
48
|
+
context: InternalLogContext;
|
|
49
|
+
error?: {
|
|
50
|
+
message: string;
|
|
51
|
+
stack?: string;
|
|
52
|
+
name?: string;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
//#endregion
|
|
56
|
+
//#region src/logger/formatters/formatter.interface.d.ts
|
|
57
|
+
/**
|
|
58
|
+
* Formatter contract
|
|
59
|
+
* Transforms LogEntry into string representation for transport output
|
|
60
|
+
*/
|
|
61
|
+
interface ILogFormatter {
|
|
62
|
+
/**
|
|
63
|
+
* Format log entry into string
|
|
64
|
+
* @param entry - Complete log entry with context
|
|
65
|
+
* @returns Formatted string ready for transport
|
|
66
|
+
*/
|
|
67
|
+
format(entry: LogEntry): string;
|
|
68
|
+
}
|
|
69
|
+
//#endregion
|
|
70
|
+
//#region src/logger/services/logger.service.d.ts
|
|
71
|
+
declare class LoggerService {
|
|
72
|
+
private readonly logLevel;
|
|
73
|
+
private readonly formatter;
|
|
74
|
+
constructor(logLevel: LogLevel, formatter: ILogFormatter);
|
|
75
|
+
debug(message: string, context?: LogContext): void;
|
|
76
|
+
info(message: string, context?: LogContext): void;
|
|
77
|
+
warn(message: string, context?: LogContext): void;
|
|
78
|
+
error(message: string, error: Error, context?: LogContext): void;
|
|
79
|
+
error(message: string, context?: LogContext): void;
|
|
80
|
+
private log;
|
|
81
|
+
private writeToConsole;
|
|
82
|
+
private enrichContext;
|
|
83
|
+
private serializeError;
|
|
84
|
+
}
|
|
85
|
+
//#endregion
|
|
86
|
+
//#region src/logger/formatters/json-formatter.d.ts
|
|
87
|
+
/**
|
|
88
|
+
* JSON Formatter
|
|
89
|
+
*
|
|
90
|
+
* Produces structured JSON logs for production environments.
|
|
91
|
+
* Optimized for log aggregation systems (Cloudflare Analytics, Datadog, etc.)
|
|
92
|
+
*
|
|
93
|
+
* Output format:
|
|
94
|
+
* {
|
|
95
|
+
* "level": "info",
|
|
96
|
+
* "message": "User logged in",
|
|
97
|
+
* "timestamp": 1234567890,
|
|
98
|
+
* "userId": "user_456",
|
|
99
|
+
* "error": { "message": "...", "stack": "..." }
|
|
100
|
+
* }
|
|
101
|
+
*/
|
|
102
|
+
declare class JsonFormatter implements ILogFormatter {
|
|
103
|
+
format(entry: LogEntry): string;
|
|
104
|
+
}
|
|
105
|
+
//#endregion
|
|
106
|
+
//#region src/logger/formatters/pretty-formatter.d.ts
|
|
107
|
+
/**
|
|
108
|
+
* Pretty Formatter
|
|
109
|
+
*
|
|
110
|
+
* Human-readable colored output for development environments.
|
|
111
|
+
* Uses ANSI color codes for terminal output.
|
|
112
|
+
*
|
|
113
|
+
* Output format:
|
|
114
|
+
* [2024-01-15 10:30:45] INFO: User logged in
|
|
115
|
+
* userId: user_456
|
|
116
|
+
*/
|
|
117
|
+
declare class PrettyFormatter implements ILogFormatter {
|
|
118
|
+
private readonly colors;
|
|
119
|
+
private readonly reset;
|
|
120
|
+
format(entry: LogEntry): string;
|
|
121
|
+
}
|
|
122
|
+
//#endregion
|
|
123
|
+
export { InternalLogContext as a, LogLevel as c, LogEntry as i, LOGGER_TOKENS as l, JsonFormatter as n, LogContext as o, LoggerService as r, LOG_LEVEL_PRIORITY as s, PrettyFormatter as t };
|
|
124
|
+
//# sourceMappingURL=index-BtlE9RuO.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-BtlE9RuO.d.mts","names":[],"sources":["../src/logger/logger.tokens.ts","../src/logger/contracts/log-level.ts","../src/logger/contracts/log-context.ts","../src/logger/contracts/log-entry.ts","../src/logger/formatters/formatter.interface.ts","../src/logger/services/logger.service.ts","../src/logger/formatters/json-formatter.ts","../src/logger/formatters/pretty-formatter.ts"],"mappings":";cAAa,aAAA;EAAA;;;;;;;AAAb;;;aCIY,QAAA;EACV,KAAA;EACA,IAAA;EACA,IAAA;EACA,KAAA;AAAA;;;;AAJF;cAWa,kBAAA,EAAoB,MAAA,CAAO,QAAA;;;;ADfxC;;;KEIY,UAAA,GAAa,MAAA;;;;;UAMR,kBAAA,SAA2B,UAAA;EAC1C,MAAA;EACA,SAAA;AAAA;;;;;;;UCLe,QAAA;EACf,KAAA,EAAO,QAAA;EACP,OAAA;EACA,OAAA,EAAS,kBAAA;EACT,KAAA;IACE,OAAA;IACA,KAAA;IACA,IAAA;EAAA;AAAA;;;AHdJ;;;;AAAA,UIMiB,aAAA;;;;;;EAMf,MAAA,CAAO,KAAA,EAAO,QAAA;AAAA;;;cCJH,aAAA;EAAA,iBAGQ,QAAA;EAAA,iBAGA,SAAA;cAHA,QAAA,EAAU,QAAA,EAGV,SAAA,EAAW,aAAA;EAG9B,KAAA,CAAM,OAAA,UAAiB,OAAA,GAAU,UAAA;EAIjC,IAAA,CAAK,OAAA,UAAiB,OAAA,GAAU,UAAA;EAIhC,IAAA,CAAK,OAAA,UAAiB,OAAA,GAAU,UAAA;EAIhC,KAAA,CAAM,OAAA,UAAiB,KAAA,EAAO,KAAA,EAAO,OAAA,GAAU,UAAA;EAC/C,KAAA,CAAM,OAAA,UAAiB,OAAA,GAAU,UAAA;EAAA,QAezB,GAAA;EAAA,QAqBA,cAAA;EAAA,QAiBA,aAAA;EAAA,QAOA,cAAA;AAAA;;;;;;;;;;;;;;AJtFV;;;;cKca,aAAA,YAAyB,aAAA;EACpC,MAAA,CAAO,KAAA,EAAO,QAAA;AAAA;;;;;;;;;;;;;cCLH,eAAA,YAA2B,aAAA;EAAA,iBACrB,MAAA;EAAA,iBAOA,KAAA;EAEjB,MAAA,CAAO,KAAA,EAAO,QAAA;AAAA"}
|