@morojs/moro 1.6.8 → 1.7.0
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 +3 -1
- package/dist/core/auth/morojs-adapter.js +16 -6
- package/dist/core/auth/morojs-adapter.js.map +1 -1
- package/dist/core/config/config-sources.js +27 -15
- package/dist/core/config/config-sources.js.map +1 -1
- package/dist/core/config/config-validator.js +201 -6
- package/dist/core/config/config-validator.js.map +1 -1
- package/dist/core/docs/openapi-generator.js +8 -9
- package/dist/core/docs/openapi-generator.js.map +1 -1
- package/dist/core/events/event-bus.js +1 -1
- package/dist/core/events/event-bus.js.map +1 -1
- package/dist/core/framework.d.ts +4 -2
- package/dist/core/framework.js +25 -24
- package/dist/core/framework.js.map +1 -1
- package/dist/core/graphql/core.js +34 -8
- package/dist/core/graphql/core.js.map +1 -1
- package/dist/core/grpc/adapters/grpc-js-adapter.d.ts +28 -0
- package/dist/core/grpc/adapters/grpc-js-adapter.js +449 -0
- package/dist/core/grpc/adapters/grpc-js-adapter.js.map +1 -0
- package/dist/core/grpc/adapters/index.d.ts +1 -0
- package/dist/core/grpc/adapters/index.js +6 -0
- package/dist/core/grpc/adapters/index.js.map +1 -0
- package/dist/core/grpc/grpc-adapter.d.ts +47 -0
- package/dist/core/grpc/grpc-adapter.js +4 -0
- package/dist/core/grpc/grpc-adapter.js.map +1 -0
- package/dist/core/grpc/grpc-manager.d.ts +59 -0
- package/dist/core/grpc/grpc-manager.js +218 -0
- package/dist/core/grpc/grpc-manager.js.map +1 -0
- package/dist/core/grpc/index.d.ts +7 -0
- package/dist/core/grpc/index.js +10 -0
- package/dist/core/grpc/index.js.map +1 -0
- package/dist/core/grpc/middleware/auth.d.ts +22 -0
- package/dist/core/grpc/middleware/auth.js +126 -0
- package/dist/core/grpc/middleware/auth.js.map +1 -0
- package/dist/core/grpc/middleware/logging.d.ts +19 -0
- package/dist/core/grpc/middleware/logging.js +57 -0
- package/dist/core/grpc/middleware/logging.js.map +1 -0
- package/dist/core/grpc/middleware/validation.d.ts +18 -0
- package/dist/core/grpc/middleware/validation.js +126 -0
- package/dist/core/grpc/middleware/validation.js.map +1 -0
- package/dist/core/grpc/types.d.ts +233 -0
- package/dist/core/grpc/types.js +36 -0
- package/dist/core/grpc/types.js.map +1 -0
- package/dist/core/http/http-server.d.ts +13 -84
- package/dist/core/http/http-server.js +205 -792
- package/dist/core/http/http-server.js.map +1 -1
- package/dist/core/http/http2-server.d.ts +131 -0
- package/dist/core/http/http2-server.js +803 -0
- package/dist/core/http/http2-server.js.map +1 -0
- package/dist/core/http/index.d.ts +3 -1
- package/dist/core/http/index.js +2 -1
- package/dist/core/http/index.js.map +1 -1
- package/dist/core/http/uws-http-server.js +21 -26
- package/dist/core/http/uws-http-server.js.map +1 -1
- package/dist/core/jobs/job-executor.js +6 -1
- package/dist/core/jobs/job-executor.js.map +1 -1
- package/dist/core/jobs/job-scheduler.js +4 -1
- package/dist/core/jobs/job-scheduler.js.map +1 -1
- package/dist/core/jobs/leader-election.js +2 -1
- package/dist/core/jobs/leader-election.js.map +1 -1
- package/dist/core/logger/logger.js +41 -18
- package/dist/core/logger/logger.js.map +1 -1
- package/dist/core/logger/outputs.js +9 -3
- package/dist/core/logger/outputs.js.map +1 -1
- package/dist/core/mail/adapters/console-adapter.d.ts +14 -0
- package/dist/core/mail/adapters/console-adapter.js +89 -0
- package/dist/core/mail/adapters/console-adapter.js.map +1 -0
- package/dist/core/mail/adapters/index.d.ts +5 -0
- package/dist/core/mail/adapters/index.js +8 -0
- package/dist/core/mail/adapters/index.js.map +1 -0
- package/dist/core/mail/adapters/nodemailer-adapter.d.ts +18 -0
- package/dist/core/mail/adapters/nodemailer-adapter.js +188 -0
- package/dist/core/mail/adapters/nodemailer-adapter.js.map +1 -0
- package/dist/core/mail/adapters/resend-adapter.d.ts +18 -0
- package/dist/core/mail/adapters/resend-adapter.js +169 -0
- package/dist/core/mail/adapters/resend-adapter.js.map +1 -0
- package/dist/core/mail/adapters/sendgrid-adapter.d.ts +19 -0
- package/dist/core/mail/adapters/sendgrid-adapter.js +186 -0
- package/dist/core/mail/adapters/sendgrid-adapter.js.map +1 -0
- package/dist/core/mail/adapters/ses-adapter.d.ts +18 -0
- package/dist/core/mail/adapters/ses-adapter.js +167 -0
- package/dist/core/mail/adapters/ses-adapter.js.map +1 -0
- package/dist/core/mail/index.d.ts +5 -0
- package/dist/core/mail/index.js +8 -0
- package/dist/core/mail/index.js.map +1 -0
- package/dist/core/mail/mail-adapter.d.ts +62 -0
- package/dist/core/mail/mail-adapter.js +83 -0
- package/dist/core/mail/mail-adapter.js.map +1 -0
- package/dist/core/mail/mail-manager.d.ts +63 -0
- package/dist/core/mail/mail-manager.js +302 -0
- package/dist/core/mail/mail-manager.js.map +1 -0
- package/dist/core/mail/template-engine.d.ts +43 -0
- package/dist/core/mail/template-engine.js +239 -0
- package/dist/core/mail/template-engine.js.map +1 -0
- package/dist/core/mail/types.d.ts +237 -0
- package/dist/core/mail/types.js +4 -0
- package/dist/core/mail/types.js.map +1 -0
- package/dist/core/middleware/built-in/body-size/core.d.ts +12 -0
- package/dist/core/middleware/built-in/body-size/core.js +52 -0
- package/dist/core/middleware/built-in/body-size/core.js.map +1 -0
- package/dist/core/middleware/built-in/body-size/hook.d.ts +2 -0
- package/dist/core/middleware/built-in/body-size/hook.js +12 -0
- package/dist/core/middleware/built-in/body-size/hook.js.map +1 -0
- package/dist/core/middleware/built-in/body-size/index.d.ts +6 -0
- package/dist/core/middleware/built-in/body-size/index.js +7 -0
- package/dist/core/middleware/built-in/body-size/index.js.map +1 -0
- package/dist/core/middleware/built-in/body-size/middleware.d.ts +14 -0
- package/dist/core/middleware/built-in/body-size/middleware.js +22 -0
- package/dist/core/middleware/built-in/body-size/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/cache/core.d.ts +20 -1
- package/dist/core/middleware/built-in/cache/core.js.map +1 -1
- package/dist/core/middleware/built-in/cache/hook.d.ts +38 -1
- package/dist/core/middleware/built-in/cache/hook.js +202 -16
- package/dist/core/middleware/built-in/cache/hook.js.map +1 -1
- package/dist/core/middleware/built-in/cache/index.js +1 -1
- package/dist/core/middleware/built-in/cache/index.js.map +1 -1
- package/dist/core/middleware/built-in/compression/core.d.ts +16 -0
- package/dist/core/middleware/built-in/compression/core.js +75 -0
- package/dist/core/middleware/built-in/compression/core.js.map +1 -0
- package/dist/core/middleware/built-in/compression/hook.d.ts +2 -0
- package/dist/core/middleware/built-in/compression/hook.js +14 -0
- package/dist/core/middleware/built-in/compression/hook.js.map +1 -0
- package/dist/core/middleware/built-in/compression/index.d.ts +6 -0
- package/dist/core/middleware/built-in/compression/index.js +7 -0
- package/dist/core/middleware/built-in/compression/index.js.map +1 -0
- package/dist/core/middleware/built-in/compression/middleware.d.ts +20 -0
- package/dist/core/middleware/built-in/compression/middleware.js +28 -0
- package/dist/core/middleware/built-in/compression/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/cookie/core.js +37 -9
- package/dist/core/middleware/built-in/cookie/core.js.map +1 -1
- package/dist/core/middleware/built-in/helmet/core.d.ts +19 -0
- package/dist/core/middleware/built-in/helmet/core.js +70 -0
- package/dist/core/middleware/built-in/helmet/core.js.map +1 -0
- package/dist/core/middleware/built-in/helmet/hook.d.ts +2 -0
- package/dist/core/middleware/built-in/helmet/hook.js +12 -0
- package/dist/core/middleware/built-in/helmet/hook.js.map +1 -0
- package/dist/core/middleware/built-in/helmet/index.d.ts +6 -0
- package/dist/core/middleware/built-in/helmet/index.js +7 -0
- package/dist/core/middleware/built-in/helmet/index.js.map +1 -0
- package/dist/core/middleware/built-in/helmet/middleware.d.ts +22 -0
- package/dist/core/middleware/built-in/helmet/middleware.js +28 -0
- package/dist/core/middleware/built-in/helmet/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/http2/core.d.ts +35 -0
- package/dist/core/middleware/built-in/http2/core.js +128 -0
- package/dist/core/middleware/built-in/http2/core.js.map +1 -0
- package/dist/core/middleware/built-in/http2/hook.d.ts +5 -0
- package/dist/core/middleware/built-in/http2/hook.js +34 -0
- package/dist/core/middleware/built-in/http2/hook.js.map +1 -0
- package/dist/core/middleware/built-in/http2/index.d.ts +8 -0
- package/dist/core/middleware/built-in/http2/index.js +10 -0
- package/dist/core/middleware/built-in/http2/index.js.map +1 -0
- package/dist/core/middleware/built-in/http2/middleware.d.ts +20 -0
- package/dist/core/middleware/built-in/http2/middleware.js +31 -0
- package/dist/core/middleware/built-in/http2/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/index.d.ts +18 -0
- package/dist/core/middleware/built-in/index.js +28 -0
- package/dist/core/middleware/built-in/index.js.map +1 -1
- package/dist/core/middleware/built-in/range/core.d.ts +16 -0
- package/dist/core/middleware/built-in/range/core.js +112 -0
- package/dist/core/middleware/built-in/range/core.js.map +1 -0
- package/dist/core/middleware/built-in/range/hook.d.ts +2 -0
- package/dist/core/middleware/built-in/range/hook.js +12 -0
- package/dist/core/middleware/built-in/range/hook.js.map +1 -0
- package/dist/core/middleware/built-in/range/index.d.ts +6 -0
- package/dist/core/middleware/built-in/range/index.js +7 -0
- package/dist/core/middleware/built-in/range/index.js.map +1 -0
- package/dist/core/middleware/built-in/range/middleware.d.ts +21 -0
- package/dist/core/middleware/built-in/range/middleware.js +27 -0
- package/dist/core/middleware/built-in/range/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/session/core.js +14 -1
- package/dist/core/middleware/built-in/session/core.js.map +1 -1
- package/dist/core/middleware/built-in/static/core.d.ts +20 -0
- package/dist/core/middleware/built-in/static/core.js +143 -0
- package/dist/core/middleware/built-in/static/core.js.map +1 -0
- package/dist/core/middleware/built-in/static/hook.d.ts +2 -0
- package/dist/core/middleware/built-in/static/hook.js +12 -0
- package/dist/core/middleware/built-in/static/hook.js.map +1 -0
- package/dist/core/middleware/built-in/static/index.d.ts +6 -0
- package/dist/core/middleware/built-in/static/index.js +7 -0
- package/dist/core/middleware/built-in/static/index.js.map +1 -0
- package/dist/core/middleware/built-in/static/middleware.d.ts +18 -0
- package/dist/core/middleware/built-in/static/middleware.js +26 -0
- package/dist/core/middleware/built-in/static/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/template/core.d.ts +19 -0
- package/dist/core/middleware/built-in/template/core.js +108 -0
- package/dist/core/middleware/built-in/template/core.js.map +1 -0
- package/dist/core/middleware/built-in/template/hook.d.ts +2 -0
- package/dist/core/middleware/built-in/template/hook.js +12 -0
- package/dist/core/middleware/built-in/template/hook.js.map +1 -0
- package/dist/core/middleware/built-in/template/index.d.ts +6 -0
- package/dist/core/middleware/built-in/template/index.js +7 -0
- package/dist/core/middleware/built-in/template/index.js.map +1 -0
- package/dist/core/middleware/built-in/template/middleware.d.ts +21 -0
- package/dist/core/middleware/built-in/template/middleware.js +27 -0
- package/dist/core/middleware/built-in/template/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/upload/core.d.ts +29 -0
- package/dist/core/middleware/built-in/upload/core.js +66 -0
- package/dist/core/middleware/built-in/upload/core.js.map +1 -0
- package/dist/core/middleware/built-in/upload/hook.d.ts +2 -0
- package/dist/core/middleware/built-in/upload/hook.js +25 -0
- package/dist/core/middleware/built-in/upload/hook.js.map +1 -0
- package/dist/core/middleware/built-in/upload/index.d.ts +6 -0
- package/dist/core/middleware/built-in/upload/index.js +7 -0
- package/dist/core/middleware/built-in/upload/index.js.map +1 -0
- package/dist/core/middleware/built-in/upload/middleware.d.ts +18 -0
- package/dist/core/middleware/built-in/upload/middleware.js +41 -0
- package/dist/core/middleware/built-in/upload/middleware.js.map +1 -0
- package/dist/core/middleware/built-in/validation/middleware.js +2 -1
- package/dist/core/middleware/built-in/validation/middleware.js.map +1 -1
- package/dist/core/networking/adapters/uws-adapter.js +54 -6
- package/dist/core/networking/adapters/uws-adapter.js.map +1 -1
- package/dist/core/networking/adapters/ws-adapter.js +56 -17
- package/dist/core/networking/adapters/ws-adapter.js.map +1 -1
- package/dist/core/pooling/object-pool-manager.js +9 -1
- package/dist/core/pooling/object-pool-manager.js.map +1 -1
- package/dist/core/queue/adapters/bull-adapter.d.ts +86 -0
- package/dist/core/queue/adapters/bull-adapter.js +330 -0
- package/dist/core/queue/adapters/bull-adapter.js.map +1 -0
- package/dist/core/queue/adapters/index.d.ts +9 -0
- package/dist/core/queue/adapters/index.js +10 -0
- package/dist/core/queue/adapters/index.js.map +1 -0
- package/dist/core/queue/adapters/kafka-adapter.d.ts +86 -0
- package/dist/core/queue/adapters/kafka-adapter.js +462 -0
- package/dist/core/queue/adapters/kafka-adapter.js.map +1 -0
- package/dist/core/queue/adapters/memory-adapter.d.ts +87 -0
- package/dist/core/queue/adapters/memory-adapter.js +415 -0
- package/dist/core/queue/adapters/memory-adapter.js.map +1 -0
- package/dist/core/queue/adapters/rabbitmq-adapter.d.ts +86 -0
- package/dist/core/queue/adapters/rabbitmq-adapter.js +436 -0
- package/dist/core/queue/adapters/rabbitmq-adapter.js.map +1 -0
- package/dist/core/queue/adapters/sqs-adapter.d.ts +102 -0
- package/dist/core/queue/adapters/sqs-adapter.js +522 -0
- package/dist/core/queue/adapters/sqs-adapter.js.map +1 -0
- package/dist/core/queue/index.d.ts +11 -0
- package/dist/core/queue/index.js +14 -0
- package/dist/core/queue/index.js.map +1 -0
- package/dist/core/queue/middleware/index.d.ts +7 -0
- package/dist/core/queue/middleware/index.js +8 -0
- package/dist/core/queue/middleware/index.js.map +1 -0
- package/dist/core/queue/middleware/monitoring.d.ts +84 -0
- package/dist/core/queue/middleware/monitoring.js +145 -0
- package/dist/core/queue/middleware/monitoring.js.map +1 -0
- package/dist/core/queue/middleware/priority.d.ts +61 -0
- package/dist/core/queue/middleware/priority.js +90 -0
- package/dist/core/queue/middleware/priority.js.map +1 -0
- package/dist/core/queue/middleware/rate-limit.d.ts +34 -0
- package/dist/core/queue/middleware/rate-limit.js +109 -0
- package/dist/core/queue/middleware/rate-limit.js.map +1 -0
- package/dist/core/queue/queue-adapter.d.ts +73 -0
- package/dist/core/queue/queue-adapter.js +20 -0
- package/dist/core/queue/queue-adapter.js.map +1 -0
- package/dist/core/queue/queue-manager.d.ts +92 -0
- package/dist/core/queue/queue-manager.js +327 -0
- package/dist/core/queue/queue-manager.js.map +1 -0
- package/dist/core/queue/types.d.ts +205 -0
- package/dist/core/queue/types.js +6 -0
- package/dist/core/queue/types.js.map +1 -0
- package/dist/core/routing/index.js +41 -10
- package/dist/core/routing/index.js.map +1 -1
- package/dist/core/routing/radix-tree.d.ts +48 -0
- package/dist/core/routing/radix-tree.js +211 -0
- package/dist/core/routing/radix-tree.js.map +1 -0
- package/dist/core/routing/router.d.ts +10 -9
- package/dist/core/routing/router.js +3 -1
- package/dist/core/routing/router.js.map +1 -1
- package/dist/core/routing/unified-router.d.ts +18 -12
- package/dist/core/routing/unified-router.js +220 -163
- package/dist/core/routing/unified-router.js.map +1 -1
- package/dist/core/runtime/aws-lambda-adapter.js +21 -10
- package/dist/core/runtime/aws-lambda-adapter.js.map +1 -1
- package/dist/core/runtime/base-adapter.js +15 -5
- package/dist/core/runtime/base-adapter.js.map +1 -1
- package/dist/core/runtime/cloudflare-workers-adapter.js +35 -12
- package/dist/core/runtime/cloudflare-workers-adapter.js.map +1 -1
- package/dist/core/runtime/vercel-edge-adapter.js +16 -6
- package/dist/core/runtime/vercel-edge-adapter.js.map +1 -1
- package/dist/core/utilities/container.js +3 -1
- package/dist/core/utilities/container.js.map +1 -1
- package/dist/core/workers/facade.d.ts +74 -0
- package/dist/core/workers/facade.js +98 -0
- package/dist/core/workers/facade.js.map +1 -0
- package/dist/core/workers/index.d.ts +2 -0
- package/dist/core/workers/index.js +6 -0
- package/dist/core/workers/index.js.map +1 -0
- package/dist/core/workers/worker-manager.d.ts +124 -0
- package/dist/core/workers/worker-manager.js +299 -0
- package/dist/core/workers/worker-manager.js.map +1 -0
- package/dist/core/workers/worker.d.ts +1 -0
- package/dist/core/workers/worker.js +225 -0
- package/dist/core/workers/worker.js.map +1 -0
- package/dist/index.d.ts +8 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/moro.d.ts +345 -13
- package/dist/moro.js +803 -214
- package/dist/moro.js.map +1 -1
- package/dist/types/cache.d.ts +4 -0
- package/dist/types/config.d.ts +42 -0
- package/dist/types/core.d.ts +18 -1
- package/package.json +94 -20
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { MailAdapter, MailOptions, MailResult } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Abstract base class for mail adapters
|
|
4
|
+
* Provides common functionality and interface
|
|
5
|
+
*/
|
|
6
|
+
export declare abstract class BaseMailAdapter implements MailAdapter {
|
|
7
|
+
protected config: any;
|
|
8
|
+
protected initialized: boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Initialize adapter with configuration
|
|
11
|
+
*/
|
|
12
|
+
initialize(config: any): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Send an email (must be implemented by subclasses)
|
|
15
|
+
*/
|
|
16
|
+
abstract send(options: MailOptions): Promise<MailResult>;
|
|
17
|
+
/**
|
|
18
|
+
* Get adapter name (must be implemented by subclasses)
|
|
19
|
+
*/
|
|
20
|
+
abstract getName(): string;
|
|
21
|
+
/**
|
|
22
|
+
* Send multiple emails in bulk
|
|
23
|
+
* Default implementation sends one by one
|
|
24
|
+
* Override for better performance
|
|
25
|
+
*/
|
|
26
|
+
sendBulk(options: MailOptions[]): Promise<MailResult[]>;
|
|
27
|
+
/**
|
|
28
|
+
* Verify adapter connection (optional)
|
|
29
|
+
*/
|
|
30
|
+
verify(): Promise<boolean>;
|
|
31
|
+
/**
|
|
32
|
+
* Close adapter connections (optional)
|
|
33
|
+
*/
|
|
34
|
+
close(): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Normalize email address
|
|
37
|
+
*/
|
|
38
|
+
protected normalizeAddress(address: string | {
|
|
39
|
+
name?: string;
|
|
40
|
+
email: string;
|
|
41
|
+
}): {
|
|
42
|
+
name?: string;
|
|
43
|
+
email: string;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Normalize email addresses array
|
|
47
|
+
*/
|
|
48
|
+
protected normalizeAddresses(addresses: string | string[] | {
|
|
49
|
+
name?: string;
|
|
50
|
+
email: string;
|
|
51
|
+
} | {
|
|
52
|
+
name?: string;
|
|
53
|
+
email: string;
|
|
54
|
+
}[]): {
|
|
55
|
+
name?: string;
|
|
56
|
+
email: string;
|
|
57
|
+
}[];
|
|
58
|
+
/**
|
|
59
|
+
* Check if adapter is initialized
|
|
60
|
+
*/
|
|
61
|
+
protected ensureInitialized(): void;
|
|
62
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// Base Mail Adapter Interface
|
|
2
|
+
// ESM-first module
|
|
3
|
+
/**
|
|
4
|
+
* Abstract base class for mail adapters
|
|
5
|
+
* Provides common functionality and interface
|
|
6
|
+
*/
|
|
7
|
+
export class BaseMailAdapter {
|
|
8
|
+
config;
|
|
9
|
+
initialized = false;
|
|
10
|
+
/**
|
|
11
|
+
* Initialize adapter with configuration
|
|
12
|
+
*/
|
|
13
|
+
async initialize(config) {
|
|
14
|
+
this.config = config;
|
|
15
|
+
this.initialized = true;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Send multiple emails in bulk
|
|
19
|
+
* Default implementation sends one by one
|
|
20
|
+
* Override for better performance
|
|
21
|
+
*/
|
|
22
|
+
async sendBulk(options) {
|
|
23
|
+
if (!this.initialized) {
|
|
24
|
+
throw new Error(`${this.getName()} adapter not initialized`);
|
|
25
|
+
}
|
|
26
|
+
const results = [];
|
|
27
|
+
for (const mailOptions of options) {
|
|
28
|
+
try {
|
|
29
|
+
const result = await this.send(mailOptions);
|
|
30
|
+
results.push(result);
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
results.push({
|
|
34
|
+
success: false,
|
|
35
|
+
error: error instanceof Error ? error.message : String(error),
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return results;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Verify adapter connection (optional)
|
|
43
|
+
*/
|
|
44
|
+
async verify() {
|
|
45
|
+
return this.initialized;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Close adapter connections (optional)
|
|
49
|
+
*/
|
|
50
|
+
async close() {
|
|
51
|
+
this.initialized = false;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Normalize email address
|
|
55
|
+
*/
|
|
56
|
+
normalizeAddress(address) {
|
|
57
|
+
if (typeof address === 'string') {
|
|
58
|
+
return { email: address };
|
|
59
|
+
}
|
|
60
|
+
return address;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Normalize email addresses array
|
|
64
|
+
*/
|
|
65
|
+
normalizeAddresses(addresses) {
|
|
66
|
+
if (!addresses) {
|
|
67
|
+
return [];
|
|
68
|
+
}
|
|
69
|
+
if (Array.isArray(addresses)) {
|
|
70
|
+
return addresses.map(addr => this.normalizeAddress(addr));
|
|
71
|
+
}
|
|
72
|
+
return [this.normalizeAddress(addresses)];
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Check if adapter is initialized
|
|
76
|
+
*/
|
|
77
|
+
ensureInitialized() {
|
|
78
|
+
if (!this.initialized) {
|
|
79
|
+
throw new Error(`${this.getName()} adapter not initialized. Call initialize() first.`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=mail-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mail-adapter.js","sourceRoot":"","sources":["../../../src/core/mail/mail-adapter.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,mBAAmB;AAInB;;;GAGG;AACH,MAAM,OAAgB,eAAe;IACzB,MAAM,CAAM;IACZ,WAAW,GAAG,KAAK,CAAC;IAE9B;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,MAAW;QAC1B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAYD;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,OAAsB;QACnC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,0BAA0B,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,OAAO,GAAiB,EAAE,CAAC;QAEjC,KAAK,MAAM,WAAW,IAAI,OAAO,EAAE,CAAC;YAClC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC5C,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC;oBACX,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAC9D,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM;QACV,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED;;OAEG;IACO,gBAAgB,CAAC,OAAkD;QAI3E,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAC5B,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACO,kBAAkB,CAC1B,SAIsC;QAEtC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,OAAO,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACO,iBAAiB;QACzB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,oDAAoD,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { MailConfig, MailOptions, MailResult, MailAdapter } from './types.js';
|
|
2
|
+
import { TemplateEngineManager } from './template-engine.js';
|
|
3
|
+
/**
|
|
4
|
+
* Main mail manager class
|
|
5
|
+
* Coordinates adapters, templates, and queue integration
|
|
6
|
+
*/
|
|
7
|
+
export declare class MailManager {
|
|
8
|
+
private config;
|
|
9
|
+
private adapter?;
|
|
10
|
+
private templateEngine?;
|
|
11
|
+
private logger;
|
|
12
|
+
private defaultFrom?;
|
|
13
|
+
private queueManager?;
|
|
14
|
+
constructor(config?: MailConfig);
|
|
15
|
+
/**
|
|
16
|
+
* Initialize mail manager
|
|
17
|
+
*/
|
|
18
|
+
initialize(): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Load email adapter based on configuration
|
|
21
|
+
*/
|
|
22
|
+
private loadAdapter;
|
|
23
|
+
/**
|
|
24
|
+
* Send an email
|
|
25
|
+
*/
|
|
26
|
+
send(options: MailOptions): Promise<MailResult>;
|
|
27
|
+
/**
|
|
28
|
+
* Send email directly (synchronous)
|
|
29
|
+
*/
|
|
30
|
+
private sendDirect;
|
|
31
|
+
/**
|
|
32
|
+
* Send email via queue (asynchronous)
|
|
33
|
+
*/
|
|
34
|
+
private sendViaQueue;
|
|
35
|
+
/**
|
|
36
|
+
* Send multiple emails in bulk
|
|
37
|
+
*/
|
|
38
|
+
sendBulk(options: MailOptions[]): Promise<MailResult[]>;
|
|
39
|
+
/**
|
|
40
|
+
* Send bulk emails via queue
|
|
41
|
+
*/
|
|
42
|
+
private sendBulkViaQueue;
|
|
43
|
+
/**
|
|
44
|
+
* Set queue manager for async email sending
|
|
45
|
+
*/
|
|
46
|
+
setQueueManager(queueManager: any): void;
|
|
47
|
+
/**
|
|
48
|
+
* Verify adapter connection
|
|
49
|
+
*/
|
|
50
|
+
verify(): Promise<boolean>;
|
|
51
|
+
/**
|
|
52
|
+
* Close connections and clean up
|
|
53
|
+
*/
|
|
54
|
+
close(): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Get template engine
|
|
57
|
+
*/
|
|
58
|
+
getTemplateEngine(): TemplateEngineManager | undefined;
|
|
59
|
+
/**
|
|
60
|
+
* Get adapter
|
|
61
|
+
*/
|
|
62
|
+
getAdapter(): MailAdapter | undefined;
|
|
63
|
+
}
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
// Mail Manager - Main Email System Controller
|
|
2
|
+
// ESM-first module
|
|
3
|
+
import { TemplateEngineManager } from './template-engine.js';
|
|
4
|
+
import { createFrameworkLogger } from '../logger/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* Main mail manager class
|
|
7
|
+
* Coordinates adapters, templates, and queue integration
|
|
8
|
+
*/
|
|
9
|
+
export class MailManager {
|
|
10
|
+
config;
|
|
11
|
+
adapter;
|
|
12
|
+
templateEngine;
|
|
13
|
+
logger;
|
|
14
|
+
defaultFrom;
|
|
15
|
+
queueManager;
|
|
16
|
+
constructor(config = {}) {
|
|
17
|
+
this.config = config;
|
|
18
|
+
this.logger = createFrameworkLogger('Mail');
|
|
19
|
+
this.defaultFrom = config.from;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Initialize mail manager
|
|
23
|
+
*/
|
|
24
|
+
async initialize() {
|
|
25
|
+
this.logger.info('Initializing mail system', 'Mail', {
|
|
26
|
+
adapter: this.config.adapter || 'console',
|
|
27
|
+
templates: !!this.config.templates?.path,
|
|
28
|
+
queue: this.config.queue?.enabled || false,
|
|
29
|
+
});
|
|
30
|
+
// Load adapter
|
|
31
|
+
await this.loadAdapter();
|
|
32
|
+
// Initialize template engine if configured
|
|
33
|
+
if (this.config.templates) {
|
|
34
|
+
this.templateEngine = new TemplateEngineManager(this.config.templates);
|
|
35
|
+
if (this.config.templates.engine && this.config.templates.engine !== 'moro') {
|
|
36
|
+
await this.templateEngine.loadExternalEngine(this.config.templates.engine);
|
|
37
|
+
}
|
|
38
|
+
if (this.config.templates.partials) {
|
|
39
|
+
await this.templateEngine.loadPartials();
|
|
40
|
+
}
|
|
41
|
+
if (this.config.templates.helpers) {
|
|
42
|
+
for (const [name, fn] of Object.entries(this.config.templates.helpers)) {
|
|
43
|
+
this.templateEngine.registerHelper(name, fn);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
this.logger.info('Mail system initialized successfully', 'Mail');
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Load email adapter based on configuration
|
|
51
|
+
*/
|
|
52
|
+
async loadAdapter() {
|
|
53
|
+
const adapterType = (this.config.adapter || 'console');
|
|
54
|
+
this.logger.debug(`Loading ${adapterType} adapter`, 'Mail');
|
|
55
|
+
try {
|
|
56
|
+
if (adapterType === 'console') {
|
|
57
|
+
const { ConsoleAdapter } = await import('./adapters/console-adapter.js');
|
|
58
|
+
this.adapter = new ConsoleAdapter();
|
|
59
|
+
}
|
|
60
|
+
else if (adapterType === 'nodemailer') {
|
|
61
|
+
const { NodemailerAdapter } = await import('./adapters/nodemailer-adapter.js');
|
|
62
|
+
this.adapter = new NodemailerAdapter();
|
|
63
|
+
}
|
|
64
|
+
else if (adapterType === 'sendgrid') {
|
|
65
|
+
const { SendGridAdapter } = await import('./adapters/sendgrid-adapter.js');
|
|
66
|
+
this.adapter = new SendGridAdapter();
|
|
67
|
+
}
|
|
68
|
+
else if (adapterType === 'ses') {
|
|
69
|
+
const { SESAdapter } = await import('./adapters/ses-adapter.js');
|
|
70
|
+
this.adapter = new SESAdapter();
|
|
71
|
+
}
|
|
72
|
+
else if (adapterType === 'resend') {
|
|
73
|
+
const { ResendAdapter } = await import('./adapters/resend-adapter.js');
|
|
74
|
+
this.adapter = new ResendAdapter();
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
throw new Error(`Unknown mail adapter: ${adapterType}`);
|
|
78
|
+
}
|
|
79
|
+
await this.adapter.initialize(this.config.connection || {});
|
|
80
|
+
this.logger.info(`${this.adapter.getName()} adapter loaded successfully`, 'Mail');
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
this.logger.error(`Failed to load ${adapterType} adapter`, 'Mail', { error });
|
|
84
|
+
throw error;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Send an email
|
|
89
|
+
*/
|
|
90
|
+
async send(options) {
|
|
91
|
+
if (!this.adapter) {
|
|
92
|
+
throw new Error('Mail adapter not initialized');
|
|
93
|
+
}
|
|
94
|
+
if (!options.from && !this.defaultFrom) {
|
|
95
|
+
throw new Error('Email "from" address not specified');
|
|
96
|
+
}
|
|
97
|
+
const mailOptions = {
|
|
98
|
+
...options,
|
|
99
|
+
from: options.from || this.defaultFrom,
|
|
100
|
+
};
|
|
101
|
+
if (!mailOptions.from) {
|
|
102
|
+
throw new Error('Email "from" address could not be determined');
|
|
103
|
+
}
|
|
104
|
+
if (options.template && this.templateEngine) {
|
|
105
|
+
try {
|
|
106
|
+
const rendered = await this.templateEngine.renderFile(options.template, options.data || {});
|
|
107
|
+
if (rendered.html) {
|
|
108
|
+
mailOptions.html = rendered.html;
|
|
109
|
+
}
|
|
110
|
+
if (rendered.text) {
|
|
111
|
+
mailOptions.text = rendered.text;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
this.logger.error('Template rendering failed', 'Mail', {
|
|
116
|
+
error,
|
|
117
|
+
template: options.template,
|
|
118
|
+
});
|
|
119
|
+
throw error;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (this.config.queue?.enabled && this.queueManager) {
|
|
123
|
+
return this.sendViaQueue(mailOptions);
|
|
124
|
+
}
|
|
125
|
+
return this.sendDirect(mailOptions);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Send email directly (synchronous)
|
|
129
|
+
*/
|
|
130
|
+
async sendDirect(options) {
|
|
131
|
+
if (!this.adapter) {
|
|
132
|
+
throw new Error('Mail adapter not initialized');
|
|
133
|
+
}
|
|
134
|
+
try {
|
|
135
|
+
this.logger.debug('Sending email', 'Mail', {
|
|
136
|
+
to: options.to,
|
|
137
|
+
subject: options.subject,
|
|
138
|
+
});
|
|
139
|
+
const result = await this.adapter.send(options);
|
|
140
|
+
if (result.success) {
|
|
141
|
+
this.logger.info('Email sent successfully', 'Mail', {
|
|
142
|
+
to: options.to,
|
|
143
|
+
subject: options.subject,
|
|
144
|
+
messageId: result.messageId,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
this.logger.warn('Email send failed', 'Mail', {
|
|
149
|
+
to: options.to,
|
|
150
|
+
subject: options.subject,
|
|
151
|
+
error: result.error,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
return result;
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
this.logger.error('Email send error', 'Mail', {
|
|
158
|
+
error,
|
|
159
|
+
to: options.to,
|
|
160
|
+
subject: options.subject,
|
|
161
|
+
});
|
|
162
|
+
return {
|
|
163
|
+
success: false,
|
|
164
|
+
error: error instanceof Error ? error.message : String(error),
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Send email via queue (asynchronous)
|
|
170
|
+
*/
|
|
171
|
+
async sendViaQueue(options) {
|
|
172
|
+
if (!this.queueManager) {
|
|
173
|
+
throw new Error('Queue manager not set. Call setQueueManager() first.');
|
|
174
|
+
}
|
|
175
|
+
const queueName = this.config.queue?.name || 'emails';
|
|
176
|
+
try {
|
|
177
|
+
const job = await this.queueManager.addToQueue(queueName, options, {
|
|
178
|
+
priority: this.config.queue?.priority || 0,
|
|
179
|
+
delay: this.config.queue?.delay || 0,
|
|
180
|
+
attempts: this.config.queue?.attempts || 3,
|
|
181
|
+
});
|
|
182
|
+
this.logger.info('Email queued for sending', 'Mail', {
|
|
183
|
+
jobId: job.id,
|
|
184
|
+
to: options.to,
|
|
185
|
+
subject: options.subject,
|
|
186
|
+
});
|
|
187
|
+
return {
|
|
188
|
+
success: true,
|
|
189
|
+
messageId: job.id,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
this.logger.error('Failed to queue email', 'Mail', { error });
|
|
194
|
+
return {
|
|
195
|
+
success: false,
|
|
196
|
+
error: error instanceof Error ? error.message : String(error),
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Send multiple emails in bulk
|
|
202
|
+
*/
|
|
203
|
+
async sendBulk(options) {
|
|
204
|
+
if (!this.adapter) {
|
|
205
|
+
throw new Error('Mail adapter not initialized');
|
|
206
|
+
}
|
|
207
|
+
const mailOptions = options.map(opts => ({
|
|
208
|
+
...opts,
|
|
209
|
+
from: opts.from || this.defaultFrom,
|
|
210
|
+
}));
|
|
211
|
+
if (mailOptions.some(opts => !opts.from)) {
|
|
212
|
+
throw new Error('Email "from" address not specified for one or more emails');
|
|
213
|
+
}
|
|
214
|
+
if (this.config.queue?.enabled && this.queueManager) {
|
|
215
|
+
return this.sendBulkViaQueue(mailOptions);
|
|
216
|
+
}
|
|
217
|
+
if (this.adapter.sendBulk) {
|
|
218
|
+
return this.adapter.sendBulk(mailOptions);
|
|
219
|
+
}
|
|
220
|
+
const results = [];
|
|
221
|
+
for (const opts of mailOptions) {
|
|
222
|
+
results.push(await this.send(opts));
|
|
223
|
+
}
|
|
224
|
+
return results;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Send bulk emails via queue
|
|
228
|
+
*/
|
|
229
|
+
async sendBulkViaQueue(options) {
|
|
230
|
+
if (!this.queueManager) {
|
|
231
|
+
throw new Error('Queue manager not set');
|
|
232
|
+
}
|
|
233
|
+
const queueName = this.config.queue?.name || 'emails';
|
|
234
|
+
const jobs = options.map(opts => ({
|
|
235
|
+
data: opts,
|
|
236
|
+
options: {
|
|
237
|
+
priority: this.config.queue?.priority || 0,
|
|
238
|
+
delay: this.config.queue?.delay || 0,
|
|
239
|
+
attempts: this.config.queue?.attempts || 3,
|
|
240
|
+
},
|
|
241
|
+
}));
|
|
242
|
+
try {
|
|
243
|
+
const queuedJobs = await this.queueManager.addBulkToQueue(queueName, jobs);
|
|
244
|
+
return queuedJobs.map((job) => ({
|
|
245
|
+
success: true,
|
|
246
|
+
messageId: job.id,
|
|
247
|
+
}));
|
|
248
|
+
}
|
|
249
|
+
catch (error) {
|
|
250
|
+
this.logger.error('Failed to queue bulk emails', 'Mail', { error });
|
|
251
|
+
return options.map(() => ({
|
|
252
|
+
success: false,
|
|
253
|
+
error: error instanceof Error ? error.message : String(error),
|
|
254
|
+
}));
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Set queue manager for async email sending
|
|
259
|
+
*/
|
|
260
|
+
setQueueManager(queueManager) {
|
|
261
|
+
this.queueManager = queueManager;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Verify adapter connection
|
|
265
|
+
*/
|
|
266
|
+
async verify() {
|
|
267
|
+
if (!this.adapter || !this.adapter.verify) {
|
|
268
|
+
return false;
|
|
269
|
+
}
|
|
270
|
+
try {
|
|
271
|
+
return await this.adapter.verify();
|
|
272
|
+
}
|
|
273
|
+
catch (error) {
|
|
274
|
+
this.logger.error('Adapter verification failed', 'Mail', { error });
|
|
275
|
+
return false;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Close connections and clean up
|
|
280
|
+
*/
|
|
281
|
+
async close() {
|
|
282
|
+
if (this.adapter?.close) {
|
|
283
|
+
await this.adapter.close();
|
|
284
|
+
}
|
|
285
|
+
if (this.templateEngine) {
|
|
286
|
+
this.templateEngine.clearCache();
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Get template engine
|
|
291
|
+
*/
|
|
292
|
+
getTemplateEngine() {
|
|
293
|
+
return this.templateEngine;
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Get adapter
|
|
297
|
+
*/
|
|
298
|
+
getAdapter() {
|
|
299
|
+
return this.adapter;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
//# sourceMappingURL=mail-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mail-manager.js","sourceRoot":"","sources":["../../../src/core/mail/mail-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { TemplateConfig, TemplateEngine, TemplateResult } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Main template engine manager
|
|
4
|
+
*/
|
|
5
|
+
export declare class TemplateEngineManager {
|
|
6
|
+
private config;
|
|
7
|
+
private engine;
|
|
8
|
+
private cache;
|
|
9
|
+
private engineType;
|
|
10
|
+
constructor(config?: TemplateConfig);
|
|
11
|
+
/**
|
|
12
|
+
* Create template engine instance
|
|
13
|
+
*/
|
|
14
|
+
private createEngine;
|
|
15
|
+
/**
|
|
16
|
+
* Render a template file with data
|
|
17
|
+
*/
|
|
18
|
+
renderFile(templateName: string, data: Record<string, any>): Promise<TemplateResult>;
|
|
19
|
+
/**
|
|
20
|
+
* Render a template string with data
|
|
21
|
+
*/
|
|
22
|
+
renderString(template: string, data: Record<string, any>): Promise<string>;
|
|
23
|
+
/**
|
|
24
|
+
* Load external template engine (Handlebars, EJS)
|
|
25
|
+
*/
|
|
26
|
+
loadExternalEngine(type: TemplateEngine): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Register a helper function
|
|
29
|
+
*/
|
|
30
|
+
registerHelper(name: string, fn: (...args: any[]) => any): void;
|
|
31
|
+
/**
|
|
32
|
+
* Register a partial template
|
|
33
|
+
*/
|
|
34
|
+
registerPartial(name: string, template: string): void;
|
|
35
|
+
/**
|
|
36
|
+
* Clear template cache
|
|
37
|
+
*/
|
|
38
|
+
clearCache(): void;
|
|
39
|
+
/**
|
|
40
|
+
* Load partials from directory
|
|
41
|
+
*/
|
|
42
|
+
loadPartials(): Promise<void>;
|
|
43
|
+
}
|