stratal 0.0.2 → 0.0.5
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/CHANGELOG.md +121 -0
- package/dist/application.d.ts +6 -0
- package/dist/application.d.ts.map +1 -1
- package/dist/application.js +27 -2
- package/dist/application.js.map +1 -1
- package/dist/di/container.d.ts +2 -4
- package/dist/di/container.d.ts.map +1 -1
- package/dist/di/container.js +4 -14
- package/dist/di/container.js.map +1 -1
- package/dist/di/decorators/inject-param.decorator.d.ts.map +1 -1
- package/dist/di/decorators/inject-param.decorator.js +1 -1
- package/dist/di/decorators/inject-param.decorator.js.map +1 -1
- package/dist/di/tokens.d.ts +0 -1
- package/dist/di/tokens.d.ts.map +1 -1
- package/dist/di/tokens.js +0 -1
- package/dist/di/tokens.js.map +1 -1
- package/dist/errors/application-error.d.ts +6 -0
- package/dist/errors/application-error.d.ts.map +1 -1
- package/dist/errors/application-error.js +8 -1
- package/dist/errors/application-error.js.map +1 -1
- package/dist/errors/global-error-handler.d.ts.map +1 -1
- package/dist/errors/global-error-handler.js +4 -6
- package/dist/errors/global-error-handler.js.map +1 -1
- package/dist/events/constants.d.ts +11 -0
- package/dist/events/constants.d.ts.map +1 -0
- package/dist/events/constants.js +11 -0
- package/dist/events/constants.js.map +1 -0
- package/dist/events/decorators/index.d.ts +3 -0
- package/dist/events/decorators/index.d.ts.map +1 -0
- package/dist/events/decorators/index.js +3 -0
- package/dist/events/decorators/index.js.map +1 -0
- package/dist/events/decorators/listener.decorator.d.ts +24 -0
- package/dist/events/decorators/listener.decorator.d.ts.map +1 -0
- package/dist/events/decorators/listener.decorator.js +33 -0
- package/dist/events/decorators/listener.decorator.js.map +1 -0
- package/dist/events/decorators/on.decorator.d.ts +28 -0
- package/dist/events/decorators/on.decorator.d.ts.map +1 -0
- package/dist/events/decorators/on.decorator.js +41 -0
- package/dist/events/decorators/on.decorator.js.map +1 -0
- package/dist/events/event-registry.d.ts +26 -0
- package/dist/events/event-registry.d.ts.map +1 -0
- package/dist/events/event-registry.js +156 -0
- package/dist/events/event-registry.js.map +1 -0
- package/dist/events/index.d.ts +5 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +4 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/types.d.ts +116 -0
- package/dist/events/types.d.ts.map +1 -0
- package/dist/events/types.js +23 -0
- package/dist/events/types.js.map +1 -0
- package/dist/guards/types.d.ts.map +1 -1
- package/dist/guards/types.js +1 -1
- package/dist/guards/types.js.map +1 -1
- package/dist/i18n/messages/en/errors.d.ts +2 -0
- package/dist/i18n/messages/en/errors.d.ts.map +1 -1
- package/dist/i18n/messages/en/errors.js +2 -0
- package/dist/i18n/messages/en/errors.js.map +1 -1
- package/dist/i18n/services/i18n.service.d.ts +1 -13
- package/dist/i18n/services/i18n.service.d.ts.map +1 -1
- package/dist/i18n/services/i18n.service.js +3 -39
- package/dist/i18n/services/i18n.service.js.map +1 -1
- package/dist/i18n/services/message-loader.service.d.ts +18 -0
- package/dist/i18n/services/message-loader.service.d.ts.map +1 -1
- package/dist/i18n/services/message-loader.service.js +56 -2
- package/dist/i18n/services/message-loader.service.js.map +1 -1
- package/dist/module/module-registry.d.ts +9 -0
- package/dist/module/module-registry.d.ts.map +1 -1
- package/dist/module/module-registry.js +21 -0
- package/dist/module/module-registry.js.map +1 -1
- package/dist/module/module.decorator.d.ts.map +1 -1
- package/dist/module/module.decorator.js +1 -1
- package/dist/module/module.decorator.js.map +1 -1
- package/dist/router/constants.js +6 -6
- package/dist/router/constants.js.map +1 -1
- package/package.json +10 -9
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listener.decorator.js","sourceRoot":"","sources":["../../../src/events/decorators/listener.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAE/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAA;AAErD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,QAAQ;IACtB,OAAO,UAAiC,MAAS;QAC/C,SAAS,EAAE,CAAC,MAAM,CAAC,CAAA;QACnB,OAAO,CAAC,cAAc,CAAC,sBAAsB,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;QACxE,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,MAAmB;IAC5C,OAAO,OAAO,CAAC,WAAW,CAAC,sBAAsB,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,IAAI,CAAA;AACjF,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { EventName, EventOptions, ListenerHandlerMetadata } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Register a method as an event handler within a `@Listener()` class.
|
|
4
|
+
*
|
|
5
|
+
* Accumulates handler metadata on the class so the framework can
|
|
6
|
+
* auto-wire handlers with the EventRegistry at bootstrap time.
|
|
7
|
+
*
|
|
8
|
+
* @param event - Event name to listen for (fully typed with autocomplete)
|
|
9
|
+
* @param options - Optional handler options (priority, blocking)
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* @Listener()
|
|
14
|
+
* export class AuditListener {
|
|
15
|
+
* @On('after.User.create')
|
|
16
|
+
* async logCreate(context: EventContext<'after.User.create'>) { ... }
|
|
17
|
+
*
|
|
18
|
+
* @On('after.User.delete', { priority: 10 })
|
|
19
|
+
* async logDelete(context: EventContext<'after.User.delete'>) { ... }
|
|
20
|
+
* }
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export declare function On<E extends EventName>(event: E, options?: EventOptions): (target: object, propertyKey: string, _descriptor: PropertyDescriptor) => void;
|
|
24
|
+
/**
|
|
25
|
+
* Get all `@On()` handler metadata from a listener class
|
|
26
|
+
*/
|
|
27
|
+
export declare function getListenerHandlers(target: object): ListenerHandlerMetadata[];
|
|
28
|
+
//# sourceMappingURL=on.decorator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"on.decorator.d.ts","sourceRoot":"","sources":["../../../src/events/decorators/on.decorator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAA;AAEhF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,EAAE,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,IAEpE,QAAQ,MAAM,EACd,aAAa,MAAM,EACnB,aAAa,kBAAkB,UAiBlC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,uBAAuB,EAAE,CAG7E"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { LISTENER_METADATA_KEYS } from '../constants';
|
|
2
|
+
/**
|
|
3
|
+
* Register a method as an event handler within a `@Listener()` class.
|
|
4
|
+
*
|
|
5
|
+
* Accumulates handler metadata on the class so the framework can
|
|
6
|
+
* auto-wire handlers with the EventRegistry at bootstrap time.
|
|
7
|
+
*
|
|
8
|
+
* @param event - Event name to listen for (fully typed with autocomplete)
|
|
9
|
+
* @param options - Optional handler options (priority, blocking)
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* @Listener()
|
|
14
|
+
* export class AuditListener {
|
|
15
|
+
* @On('after.User.create')
|
|
16
|
+
* async logCreate(context: EventContext<'after.User.create'>) { ... }
|
|
17
|
+
*
|
|
18
|
+
* @On('after.User.delete', { priority: 10 })
|
|
19
|
+
* async logDelete(context: EventContext<'after.User.delete'>) { ... }
|
|
20
|
+
* }
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export function On(event, options) {
|
|
24
|
+
return function (target, propertyKey, _descriptor) {
|
|
25
|
+
const existingHandlers = Reflect.getMetadata(LISTENER_METADATA_KEYS.EVENT_HANDLERS, target.constructor) ?? [];
|
|
26
|
+
existingHandlers.push({
|
|
27
|
+
methodName: propertyKey,
|
|
28
|
+
event: event,
|
|
29
|
+
options,
|
|
30
|
+
});
|
|
31
|
+
Reflect.defineMetadata(LISTENER_METADATA_KEYS.EVENT_HANDLERS, existingHandlers, target.constructor);
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get all `@On()` handler metadata from a listener class
|
|
36
|
+
*/
|
|
37
|
+
export function getListenerHandlers(target) {
|
|
38
|
+
const metadataTarget = typeof target === 'function' ? target : target.constructor;
|
|
39
|
+
return Reflect.getMetadata(LISTENER_METADATA_KEYS.EVENT_HANDLERS, metadataTarget) ?? [];
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=on.decorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"on.decorator.js","sourceRoot":"","sources":["../../../src/events/decorators/on.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAA;AAGrD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,EAAE,CAAsB,KAAQ,EAAE,OAAsB;IACtE,OAAO,UACL,MAAc,EACd,WAAmB,EACnB,WAA+B;QAE/B,MAAM,gBAAgB,GACnB,OAAO,CAAC,WAAW,CAAC,sBAAsB,CAAC,cAAc,EAAE,MAAM,CAAC,WAAW,CAA2C,IAAI,EAAE,CAAA;QAEjI,gBAAgB,CAAC,IAAI,CAAC;YACpB,UAAU,EAAE,WAAW;YACvB,KAAK,EAAE,KAAe;YACtB,OAAO;SACR,CAAC,CAAA;QAEF,OAAO,CAAC,cAAc,CACpB,sBAAsB,CAAC,cAAc,EACrC,gBAAgB,EAChB,MAAM,CAAC,WAAW,CACnB,CAAA;IACH,CAAC,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAChD,MAAM,cAAc,GAAG,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAA;IACjF,OAAQ,OAAO,CAAC,WAAW,CAAC,sBAAsB,CAAC,cAAc,EAAE,cAAc,CAA2C,IAAI,EAAE,CAAA;AACpI,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type LoggerService } from '../logger';
|
|
2
|
+
import type { EventContext, EventHandler, EventName, EventOptions, IEventRegistry } from './types';
|
|
3
|
+
export declare class EventRegistry implements IEventRegistry {
|
|
4
|
+
private readonly ctx;
|
|
5
|
+
private readonly logger;
|
|
6
|
+
private handlers;
|
|
7
|
+
constructor(ctx: ExecutionContext, logger: LoggerService);
|
|
8
|
+
on<E extends EventName>(event: E, handler: EventHandler<E>, options?: EventOptions): void;
|
|
9
|
+
emit<E extends EventName>(event: E, context?: Partial<EventContext<E>>): Promise<void>;
|
|
10
|
+
off<E extends EventName>(event: E, handler: EventHandler<E>): void;
|
|
11
|
+
once<E extends EventName>(event: E, handler: EventHandler<E>, options?: EventOptions): void;
|
|
12
|
+
/**
|
|
13
|
+
* Find all handlers matching the event using pattern matching.
|
|
14
|
+
* Order: exact match -> model wildcard -> operation wildcard -> global wildcard
|
|
15
|
+
*/
|
|
16
|
+
private findMatchingHandlers;
|
|
17
|
+
/**
|
|
18
|
+
* Determine if we should use ctx.waitUntil (non-blocking) or await (blocking)
|
|
19
|
+
*/
|
|
20
|
+
private shouldUseWaitUntil;
|
|
21
|
+
/**
|
|
22
|
+
* Execute a single handler with error isolation
|
|
23
|
+
*/
|
|
24
|
+
private executeHandler;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=event-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-registry.d.ts","sourceRoot":"","sources":["../../src/events/event-registry.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,WAAW,CAAA;AAC7D,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,cAAc,EAEf,MAAM,SAAS,CAAA;AAEhB,qBACa,aAAc,YAAW,cAAc;IAIZ,OAAO,CAAC,QAAQ,CAAC,GAAG;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJ9D,OAAO,CAAC,QAAQ,CAAyC;gBAGF,GAAG,EAAE,gBAAgB,EACpB,MAAM,EAAE,aAAa;IAG7E,EAAE,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI;IAkBnF,IAAI,CAAC,CAAC,SAAS,SAAS,EAC5B,KAAK,EAAE,CAAC,EACR,OAAO,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC;IAmChB,GAAG,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;IAclE,IAAI,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI;IAS3F;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAkC5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAgB1B;;OAEG;YACW,cAAc;CAe7B"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
import { inject } from 'tsyringe';
|
|
14
|
+
import { Transient } from '../di/decorators';
|
|
15
|
+
import { DI_TOKENS } from '../di/tokens';
|
|
16
|
+
import { LOGGER_TOKENS } from '../logger';
|
|
17
|
+
let EventRegistry = class EventRegistry {
|
|
18
|
+
ctx;
|
|
19
|
+
logger;
|
|
20
|
+
handlers = new Map();
|
|
21
|
+
constructor(ctx, logger) {
|
|
22
|
+
this.ctx = ctx;
|
|
23
|
+
this.logger = logger;
|
|
24
|
+
}
|
|
25
|
+
on(event, handler, options) {
|
|
26
|
+
const registered = {
|
|
27
|
+
handler: handler,
|
|
28
|
+
priority: options?.priority ?? 0,
|
|
29
|
+
blocking: options?.blocking
|
|
30
|
+
};
|
|
31
|
+
const existingHandlers = this.handlers.get(event) ?? [];
|
|
32
|
+
existingHandlers.push(registered);
|
|
33
|
+
this.handlers.set(event, existingHandlers);
|
|
34
|
+
this.logger.debug('Event handler registered', {
|
|
35
|
+
event,
|
|
36
|
+
priority: registered.priority,
|
|
37
|
+
blocking: registered.blocking
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
async emit(event, context) {
|
|
41
|
+
// Build full context with caller-provided fields
|
|
42
|
+
const fullContext = {
|
|
43
|
+
...context
|
|
44
|
+
};
|
|
45
|
+
// Find matching handlers using pattern matching
|
|
46
|
+
const matchingHandlers = this.findMatchingHandlers(event);
|
|
47
|
+
if (matchingHandlers.length === 0) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
// Sort by priority (higher first)
|
|
51
|
+
const sortedHandlers = [...matchingHandlers].sort((a, b) => b.priority - a.priority);
|
|
52
|
+
// Determine if we should use waitUntil
|
|
53
|
+
const shouldUseWaitUntil = this.shouldUseWaitUntil(event, sortedHandlers);
|
|
54
|
+
// Execute handlers
|
|
55
|
+
const promises = sortedHandlers.map((registered) => this.executeHandler(registered.handler, fullContext, event));
|
|
56
|
+
if (shouldUseWaitUntil) {
|
|
57
|
+
// Non-blocking: use ctx.waitUntil
|
|
58
|
+
this.ctx.waitUntil(Promise.all(promises));
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
// Blocking: await all handlers
|
|
62
|
+
await Promise.all(promises);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
off(event, handler) {
|
|
66
|
+
const existingHandlers = this.handlers.get(event);
|
|
67
|
+
if (!existingHandlers)
|
|
68
|
+
return;
|
|
69
|
+
const filtered = existingHandlers.filter((h) => h.handler !== handler);
|
|
70
|
+
if (filtered.length > 0) {
|
|
71
|
+
this.handlers.set(event, filtered);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
this.handlers.delete(event);
|
|
75
|
+
}
|
|
76
|
+
this.logger.debug('Event handler unregistered', { event });
|
|
77
|
+
}
|
|
78
|
+
once(event, handler, options) {
|
|
79
|
+
const wrappedHandler = (async (context) => {
|
|
80
|
+
await handler(context);
|
|
81
|
+
this.off(event, wrappedHandler);
|
|
82
|
+
});
|
|
83
|
+
this.on(event, wrappedHandler, options);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Find all handlers matching the event using pattern matching.
|
|
87
|
+
* Order: exact match -> model wildcard -> operation wildcard -> global wildcard
|
|
88
|
+
*/
|
|
89
|
+
findMatchingHandlers(event) {
|
|
90
|
+
const handlers = [];
|
|
91
|
+
const parts = event.split('.');
|
|
92
|
+
if (parts.length === 3) {
|
|
93
|
+
// Database event: "phase.model.operation"
|
|
94
|
+
const [phase, model, operation] = parts;
|
|
95
|
+
// 1. Exact match: "after.user.create"
|
|
96
|
+
handlers.push(...(this.handlers.get(event) ?? []));
|
|
97
|
+
// 2. Model wildcard: "after.user"
|
|
98
|
+
handlers.push(...(this.handlers.get(`${phase}.${model}`) ?? []));
|
|
99
|
+
// 3. Operation wildcard: "after.create"
|
|
100
|
+
handlers.push(...(this.handlers.get(`${phase}.${operation}`) ?? []));
|
|
101
|
+
// 4. Global wildcard: "after"
|
|
102
|
+
handlers.push(...(this.handlers.get(phase) ?? []));
|
|
103
|
+
}
|
|
104
|
+
else if (parts.length === 2) {
|
|
105
|
+
// Could be wildcard like "after.user" or custom event like "auth.verified"
|
|
106
|
+
handlers.push(...(this.handlers.get(event) ?? []));
|
|
107
|
+
if (parts[0] === 'before' || parts[0] === 'after') {
|
|
108
|
+
handlers.push(...(this.handlers.get(parts[0]) ?? []));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
handlers.push(...(this.handlers.get(event) ?? []));
|
|
113
|
+
}
|
|
114
|
+
return handlers;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Determine if we should use ctx.waitUntil (non-blocking) or await (blocking)
|
|
118
|
+
*/
|
|
119
|
+
shouldUseWaitUntil(event, handlers) {
|
|
120
|
+
const hasBlockingHandler = handlers.some((h) => h.blocking === true);
|
|
121
|
+
if (hasBlockingHandler)
|
|
122
|
+
return false;
|
|
123
|
+
const hasNonBlockingHandler = handlers.some((h) => h.blocking === false);
|
|
124
|
+
if (hasNonBlockingHandler)
|
|
125
|
+
return true;
|
|
126
|
+
const phase = event.split('.')[0];
|
|
127
|
+
if (phase === 'before')
|
|
128
|
+
return false;
|
|
129
|
+
if (phase === 'after')
|
|
130
|
+
return true;
|
|
131
|
+
return false; // Custom events block by default
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Execute a single handler with error isolation
|
|
135
|
+
*/
|
|
136
|
+
async executeHandler(handler, context, event) {
|
|
137
|
+
try {
|
|
138
|
+
await handler(context);
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
this.logger.error('Event handler error', {
|
|
142
|
+
event,
|
|
143
|
+
error: error instanceof Error ? error.message : String(error),
|
|
144
|
+
stack: error instanceof Error ? error.stack : undefined,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
EventRegistry = __decorate([
|
|
150
|
+
Transient(),
|
|
151
|
+
__param(0, inject(DI_TOKENS.ExecutionContext)),
|
|
152
|
+
__param(1, inject(LOGGER_TOKENS.LoggerService)),
|
|
153
|
+
__metadata("design:paramtypes", [Object, Function])
|
|
154
|
+
], EventRegistry);
|
|
155
|
+
export { EventRegistry };
|
|
156
|
+
//# sourceMappingURL=event-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-registry.js","sourceRoot":"","sources":["../../src/events/event-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { LISTENER_METADATA_KEYS } from './constants';
|
|
2
|
+
export { Listener, isListener, On, getListenerHandlers } from './decorators';
|
|
3
|
+
export { EventRegistry } from './event-registry';
|
|
4
|
+
export type { CustomEventContext, CustomEventRegistry, EventContext, EventHandler, EventName, EventOptions, IEventRegistry, ListenerHandlerMetadata, RegisteredHandler, } from './types';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,YAAY,EACV,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,cAAc,EACd,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,SAAS,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/events/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core Event System Types
|
|
3
|
+
*
|
|
4
|
+
* Provides a generic, augmentable event system for Stratal.
|
|
5
|
+
* Core owns the base types; framework's database module augments
|
|
6
|
+
* `CustomEventRegistry` with richly typed database event contexts.
|
|
7
|
+
*
|
|
8
|
+
* ## Custom Events
|
|
9
|
+
*
|
|
10
|
+
* Custom application events can be added via module augmentation:
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* declare module 'stratal/events' {
|
|
15
|
+
* interface CustomEventRegistry {
|
|
16
|
+
* 'user.verified': CustomEventContext<{ userId: string; email: string }>
|
|
17
|
+
* 'email.sent': CustomEventContext<{ to: string; subject: string }>
|
|
18
|
+
* }
|
|
19
|
+
* }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* Augmentable event registry.
|
|
24
|
+
* Maps event name -> full context type.
|
|
25
|
+
*
|
|
26
|
+
* Framework's database module augments this with `DatabaseEvents<K>`.
|
|
27
|
+
* Users augment for custom events using `CustomEventContext<TData>`.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* declare module 'stratal/events' {
|
|
32
|
+
* interface CustomEventRegistry {
|
|
33
|
+
* 'user.verified': CustomEventContext<{ userId: string; email: string }>
|
|
34
|
+
* }
|
|
35
|
+
* }
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export interface CustomEventRegistry {
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* All valid event names.
|
|
42
|
+
* Falls back to `string` when no events are registered in CustomEventRegistry.
|
|
43
|
+
*/
|
|
44
|
+
export type EventName = keyof CustomEventRegistry extends never ? string : Extract<keyof CustomEventRegistry, string>;
|
|
45
|
+
/**
|
|
46
|
+
* Helper for user-defined custom events.
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```typescript
|
|
50
|
+
* declare module 'stratal/events' {
|
|
51
|
+
* interface CustomEventRegistry {
|
|
52
|
+
* 'user.verified': CustomEventContext<{ userId: string; email: string }>
|
|
53
|
+
* }
|
|
54
|
+
* }
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
export interface CustomEventContext<TData = unknown> {
|
|
58
|
+
data: TData;
|
|
59
|
+
metadata?: Record<string, unknown>;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Event context — looks up the full context type from CustomEventRegistry.
|
|
63
|
+
* For database events, this includes typed data and result from ZenStack schema.
|
|
64
|
+
* Falls back to a generic context shape for unregistered events.
|
|
65
|
+
*/
|
|
66
|
+
export type EventContext<E extends EventName = EventName> = E extends keyof CustomEventRegistry ? CustomEventRegistry[E] : {
|
|
67
|
+
data?: unknown;
|
|
68
|
+
result?: unknown;
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Options for registering event handlers
|
|
72
|
+
*/
|
|
73
|
+
export interface EventOptions {
|
|
74
|
+
/** Handler execution priority. Higher values execute first. @default 0 */
|
|
75
|
+
priority?: number;
|
|
76
|
+
/**
|
|
77
|
+
* Whether to force blocking (await) vs non-blocking (waitUntil) behavior.
|
|
78
|
+
*
|
|
79
|
+
* Default behavior:
|
|
80
|
+
* - `before.*` events: Always blocking (true)
|
|
81
|
+
* - `after.*` events: Non-blocking via waitUntil (false)
|
|
82
|
+
* - Custom events: Blocking (true)
|
|
83
|
+
*/
|
|
84
|
+
blocking?: boolean;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Event handler function signature with typed context
|
|
88
|
+
*/
|
|
89
|
+
export type EventHandler<E extends EventName = EventName> = (context: EventContext<E>) => Promise<void> | void;
|
|
90
|
+
/**
|
|
91
|
+
* Internal structure for storing registered handlers
|
|
92
|
+
* @internal
|
|
93
|
+
*/
|
|
94
|
+
export interface RegisteredHandler {
|
|
95
|
+
handler: EventHandler;
|
|
96
|
+
priority: number;
|
|
97
|
+
blocking?: boolean;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* EventRegistry interface — main API for event system
|
|
101
|
+
*/
|
|
102
|
+
export interface IEventRegistry {
|
|
103
|
+
on<E extends EventName>(event: E, handler: EventHandler<E>, options?: EventOptions): void;
|
|
104
|
+
emit<E extends EventName>(event: E, context?: Partial<EventContext<E>>): Promise<void>;
|
|
105
|
+
off<E extends EventName>(event: E, handler: EventHandler<E>): void;
|
|
106
|
+
once<E extends EventName>(event: E, handler: EventHandler<E>, options?: EventOptions): void;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Metadata stored by `@On()` decorator for each handler method
|
|
110
|
+
*/
|
|
111
|
+
export interface ListenerHandlerMetadata {
|
|
112
|
+
methodName: string;
|
|
113
|
+
event: string;
|
|
114
|
+
options?: EventOptions;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/events/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAMH;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,mBAAmB;CAAI;AAExC;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,mBAAmB,SAAS,KAAK,GAC3D,MAAM,GACN,OAAO,CAAC,MAAM,mBAAmB,EAAE,MAAM,CAAC,CAAA;AAM9C;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,kBAAkB,CAAC,KAAK,GAAG,OAAO;IACjD,IAAI,EAAE,KAAK,CAAA;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnC;AAED;;;;GAIG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,IACtD,CAAC,SAAS,MAAM,mBAAmB,GACjC,mBAAmB,CAAC,CAAC,CAAC,GACtB;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,CAAA;AAMxC;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,IAAI,CAC1D,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,KACrB,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;AAEzB;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,YAAY,CAAA;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,EAAE,CAAC,CAAC,SAAS,SAAS,EACpB,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EACxB,OAAO,CAAC,EAAE,YAAY,GACrB,IAAI,CAAA;IAEP,IAAI,CAAC,CAAC,SAAS,SAAS,EACtB,KAAK,EAAE,CAAC,EACR,OAAO,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC,CAAA;IAEhB,GAAG,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;IAElE,IAAI,CAAC,CAAC,SAAS,SAAS,EACtB,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EACxB,OAAO,CAAC,EAAE,YAAY,GACrB,IAAI,CAAA;CACR;AAMD;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,YAAY,CAAA;CACvB"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core Event System Types
|
|
3
|
+
*
|
|
4
|
+
* Provides a generic, augmentable event system for Stratal.
|
|
5
|
+
* Core owns the base types; framework's database module augments
|
|
6
|
+
* `CustomEventRegistry` with richly typed database event contexts.
|
|
7
|
+
*
|
|
8
|
+
* ## Custom Events
|
|
9
|
+
*
|
|
10
|
+
* Custom application events can be added via module augmentation:
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* declare module 'stratal/events' {
|
|
15
|
+
* interface CustomEventRegistry {
|
|
16
|
+
* 'user.verified': CustomEventContext<{ userId: string; email: string }>
|
|
17
|
+
* 'email.sent': CustomEventContext<{ to: string; subject: string }>
|
|
18
|
+
* }
|
|
19
|
+
* }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/events/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/guards/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAE3C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;OAKG;IACH,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CAChE;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,CAAC,CAAA;AAEjD;;;GAGG;AACH,MAAM,MAAM,KAAK,GAAG,UAAU,GAAG,WAAW,CAAA;AAE5C;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,KAAK,EAAE,CAAA;CAChB;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/guards/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAE3C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;OAKG;IACH,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CAChE;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,CAAC,CAAA;AAEjD;;;GAGG;AACH,MAAM,MAAM,KAAK,GAAG,UAAU,GAAG,WAAW,CAAA;AAE5C;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,KAAK,EAAE,CAAA;CAChB;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,eAA+B,CAAA"}
|
package/dist/guards/types.js
CHANGED
package/dist/guards/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/guards/types.ts"],"names":[],"mappings":"AA6DA;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/guards/types.ts"],"names":[],"mappings":"AA6DA;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA"}
|
|
@@ -87,7 +87,9 @@ export declare const errors: {
|
|
|
87
87
|
readonly accountAlreadyExists: "An account with this email already exists";
|
|
88
88
|
readonly failedToCreateUser: "Failed to create user account. Please try again.";
|
|
89
89
|
readonly failedToCreateSession: "Failed to create session. Please try again.";
|
|
90
|
+
readonly failedToGetSession: "Failed to retrieve session. Please try again.";
|
|
90
91
|
readonly failedToUpdateUser: "Failed to update user information. Please try again.";
|
|
92
|
+
readonly failedToGetUserInfo: "Failed to retrieve user information. Please try again.";
|
|
91
93
|
readonly socialAccountLinked: "This social account is already linked to another user";
|
|
92
94
|
readonly providerNotFound: "Authentication provider not found";
|
|
93
95
|
readonly userEmailNotFound: "User email address not found";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../../src/i18n/messages/en/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,MAAM
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../../src/i18n/messages/en/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqIT,CAAA"}
|
|
@@ -102,7 +102,9 @@ export const errors = {
|
|
|
102
102
|
accountAlreadyExists: 'An account with this email already exists',
|
|
103
103
|
failedToCreateUser: 'Failed to create user account. Please try again.',
|
|
104
104
|
failedToCreateSession: 'Failed to create session. Please try again.',
|
|
105
|
+
failedToGetSession: 'Failed to retrieve session. Please try again.',
|
|
105
106
|
failedToUpdateUser: 'Failed to update user information. Please try again.',
|
|
107
|
+
failedToGetUserInfo: 'Failed to retrieve user information. Please try again.',
|
|
106
108
|
socialAccountLinked: 'This social account is already linked to another user',
|
|
107
109
|
providerNotFound: 'Authentication provider not found',
|
|
108
110
|
userEmailNotFound: 'User email address not found',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../src/i18n/messages/en/errors.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../src/i18n/messages/en/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Request-scoped service for translations.
|
|
5
5
|
* Injects RouterContext to access request-specific locale.
|
|
6
|
+
* Uses pre-built CoreContext from MessageLoaderService (singleton) for zero-cost lookups.
|
|
6
7
|
*/
|
|
7
8
|
import { RouterContext } from '../../router';
|
|
8
9
|
import type { II18nService, MessageKeys, MessageParams } from '../i18n.types';
|
|
@@ -30,7 +31,6 @@ import type { MessageLoaderService } from './message-loader.service';
|
|
|
30
31
|
export declare class I18nService implements II18nService {
|
|
31
32
|
private readonly loader;
|
|
32
33
|
private readonly routerContext?;
|
|
33
|
-
private intlContext;
|
|
34
34
|
constructor(loader: MessageLoaderService, routerContext?: RouterContext | undefined);
|
|
35
35
|
/**
|
|
36
36
|
* Translate a message key
|
|
@@ -46,17 +46,5 @@ export declare class I18nService implements II18nService {
|
|
|
46
46
|
* @returns Current locale code from RouterContext or default locale
|
|
47
47
|
*/
|
|
48
48
|
getLocale(): string;
|
|
49
|
-
/**
|
|
50
|
-
* Get or create intlify CoreContext
|
|
51
|
-
* Lazily initializes on first translation call
|
|
52
|
-
*/
|
|
53
|
-
private getIntlContext;
|
|
54
|
-
/**
|
|
55
|
-
* Flatten nested messages to dot-notation
|
|
56
|
-
*
|
|
57
|
-
* Converts { auth: { login: { title: 'Sign In' } } }
|
|
58
|
-
* to { 'auth.login.title': 'Sign In' }
|
|
59
|
-
*/
|
|
60
|
-
private flattenMessages;
|
|
61
49
|
}
|
|
62
50
|
//# sourceMappingURL=i18n.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.service.d.ts","sourceRoot":"","sources":["../../../src/i18n/services/i18n.service.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"i18n.service.d.ts","sourceRoot":"","sources":["../../../src/i18n/services/i18n.service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,EAAiB,aAAa,EAAE,MAAM,cAAc,CAAA;AAE3D,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC7E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AAEpE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBACa,WAAY,YAAW,YAAY;IAET,OAAO,CAAC,QAAQ,CAAC,MAAM;IACC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;gBADtC,MAAM,EAAE,oBAAoB,EACJ,aAAa,CAAC,EAAE,aAAa,YAAA;IAI3G;;;;;;OAMG;IACH,CAAC,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,MAAM;IAUnD;;;;OAIG;IACH,SAAS,IAAI,MAAM;CAGpB"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Request-scoped service for translations.
|
|
5
5
|
* Injects RouterContext to access request-specific locale.
|
|
6
|
+
* Uses pre-built CoreContext from MessageLoaderService (singleton) for zero-cost lookups.
|
|
6
7
|
*/
|
|
7
8
|
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
8
9
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
@@ -16,7 +17,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
16
17
|
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
17
18
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
18
19
|
};
|
|
19
|
-
import {
|
|
20
|
+
import { translate } from '@intlify/core-base';
|
|
20
21
|
import { inject } from 'tsyringe';
|
|
21
22
|
import { Transient } from '../../di/decorators';
|
|
22
23
|
import { ROUTER_TOKENS, RouterContext } from '../../router';
|
|
@@ -44,7 +45,6 @@ import { I18N_TOKENS } from '../i18n.tokens';
|
|
|
44
45
|
let I18nService = class I18nService {
|
|
45
46
|
loader;
|
|
46
47
|
routerContext;
|
|
47
|
-
intlContext;
|
|
48
48
|
constructor(loader, routerContext) {
|
|
49
49
|
this.loader = loader;
|
|
50
50
|
this.routerContext = routerContext;
|
|
@@ -57,7 +57,7 @@ let I18nService = class I18nService {
|
|
|
57
57
|
* @returns Translated string
|
|
58
58
|
*/
|
|
59
59
|
t(key, params) {
|
|
60
|
-
const context = this.
|
|
60
|
+
const context = this.loader.getCoreContext(this.getLocale());
|
|
61
61
|
const result = params !== undefined
|
|
62
62
|
? translate(context, key, params)
|
|
63
63
|
: translate(context, key);
|
|
@@ -71,42 +71,6 @@ let I18nService = class I18nService {
|
|
|
71
71
|
getLocale() {
|
|
72
72
|
return this.routerContext?.getLocale() ?? 'en';
|
|
73
73
|
}
|
|
74
|
-
/**
|
|
75
|
-
* Get or create intlify CoreContext
|
|
76
|
-
* Lazily initializes on first translation call
|
|
77
|
-
*/
|
|
78
|
-
getIntlContext() {
|
|
79
|
-
if (!this.intlContext) {
|
|
80
|
-
const locale = this.getLocale();
|
|
81
|
-
const messages = this.loader.getMessages(locale);
|
|
82
|
-
this.intlContext = createCoreContext({
|
|
83
|
-
locale,
|
|
84
|
-
messages: { [locale]: this.flattenMessages(messages) },
|
|
85
|
-
missingWarn: false,
|
|
86
|
-
fallbackWarn: false
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
return this.intlContext;
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Flatten nested messages to dot-notation
|
|
93
|
-
*
|
|
94
|
-
* Converts { auth: { login: { title: 'Sign In' } } }
|
|
95
|
-
* to { 'auth.login.title': 'Sign In' }
|
|
96
|
-
*/
|
|
97
|
-
flattenMessages(messages, prefix = '') {
|
|
98
|
-
return Object.keys(messages).reduce((acc, key) => {
|
|
99
|
-
const value = messages[key];
|
|
100
|
-
const newKey = prefix ? `${prefix}.${key}` : key;
|
|
101
|
-
if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
|
|
102
|
-
Object.assign(acc, this.flattenMessages(value, newKey));
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
acc[newKey] = String(value);
|
|
106
|
-
}
|
|
107
|
-
return acc;
|
|
108
|
-
}, {});
|
|
109
|
-
}
|
|
110
74
|
};
|
|
111
75
|
I18nService = __decorate([
|
|
112
76
|
Transient(I18N_TOKENS.I18nService),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.service.js","sourceRoot":"","sources":["../../../src/i18n/services/i18n.service.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"i18n.service.js","sourceRoot":"","sources":["../../../src/i18n/services/i18n.service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;;;;;;;;;;;;;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAI5C;;;;;;;;;;;;;;;;;;;GAmBG;AAEI,IAAM,WAAW,GAAjB,MAAM,WAAW;IAEgC;IACwB;IAF9E,YACsD,MAA4B,EACJ,aAA6B;QADrD,WAAM,GAAN,MAAM,CAAsB;QACJ,kBAAa,GAAb,aAAa,CAAgB;IAE3G,CAAC;IAED;;;;;;OAMG;IACH,CAAC,CAAC,GAAgB,EAAE,MAAsB;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAA;QAE5D,MAAM,MAAM,GAAG,MAAM,KAAK,SAAS;YACjC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC;YACjC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QAE3B,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAA;IAClD,CAAC;IAED;;;;OAIG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,IAAI,IAAI,CAAA;IAChD,CAAC;CACF,CAAA;AAhCY,WAAW;IADvB,SAAS,CAAC,WAAW,CAAC,WAAW,CAAC;IAG9B,WAAA,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,CAAA;IACjC,WAAA,MAAM,CAAC,aAAa,CAAC,aAAa,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAA;+CAAkC,aAAa;GAHhG,WAAW,CAgCvB"}
|