stratal 0.0.1 → 0.0.4
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 +115 -0
- package/README.md +101 -25
- package/dist/application.d.ts +0 -1
- package/dist/application.d.ts.map +1 -1
- package/dist/application.js +3 -2
- package/dist/application.js.map +1 -1
- package/dist/cache/errors/cache-delete.error.d.ts +1 -1
- package/dist/cache/errors/cache-delete.error.d.ts.map +1 -1
- package/dist/cache/errors/cache-delete.error.js +1 -1
- package/dist/cache/errors/cache-delete.error.js.map +1 -1
- package/dist/cache/errors/cache-get.error.d.ts +1 -1
- package/dist/cache/errors/cache-get.error.d.ts.map +1 -1
- package/dist/cache/errors/cache-get.error.js +1 -1
- package/dist/cache/errors/cache-get.error.js.map +1 -1
- package/dist/cache/errors/cache-list.error.d.ts +1 -1
- package/dist/cache/errors/cache-list.error.d.ts.map +1 -1
- package/dist/cache/errors/cache-list.error.js +1 -1
- package/dist/cache/errors/cache-list.error.js.map +1 -1
- package/dist/cache/errors/cache-put.error.d.ts +1 -1
- package/dist/cache/errors/cache-put.error.d.ts.map +1 -1
- package/dist/cache/errors/cache-put.error.js +1 -1
- package/dist/cache/errors/cache-put.error.js.map +1 -1
- package/dist/config/config.types.d.ts +2 -2
- package/dist/config/errors/config-not-initialized.error.d.ts +1 -1
- package/dist/config/errors/config-not-initialized.error.d.ts.map +1 -1
- package/dist/config/errors/config-not-initialized.error.js +1 -1
- package/dist/config/errors/config-not-initialized.error.js.map +1 -1
- package/dist/config/services/config.service.d.ts +6 -5
- package/dist/config/services/config.service.d.ts.map +1 -1
- package/dist/config/services/config.service.js +25 -8
- package/dist/config/services/config.service.js.map +1 -1
- package/dist/cron/cron-job.d.ts +5 -6
- package/dist/cron/cron-job.d.ts.map +1 -1
- package/dist/cron/errors/cron-execution.error.d.ts +1 -1
- package/dist/cron/errors/cron-execution.error.d.ts.map +1 -1
- package/dist/cron/errors/cron-execution.error.js +1 -1
- package/dist/cron/errors/cron-execution.error.js.map +1 -1
- package/dist/di/container.d.ts +0 -4
- package/dist/di/container.d.ts.map +1 -1
- package/dist/di/container.js +0 -4
- 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/decorators.d.ts +1 -1
- package/dist/di/decorators.js +1 -1
- package/dist/di/errors/conditional-binding-fallback.error.d.ts +1 -1
- package/dist/di/errors/conditional-binding-fallback.error.d.ts.map +1 -1
- package/dist/di/errors/conditional-binding-fallback.error.js +1 -1
- package/dist/di/errors/conditional-binding-fallback.error.js.map +1 -1
- package/dist/di/errors/request-scope-operation-not-allowed.error.d.ts +1 -1
- package/dist/di/errors/request-scope-operation-not-allowed.error.d.ts.map +1 -1
- package/dist/di/errors/request-scope-operation-not-allowed.error.js +1 -1
- package/dist/di/errors/request-scope-operation-not-allowed.error.js.map +1 -1
- package/dist/email/consumers/email.consumer.d.ts.map +1 -1
- package/dist/email/consumers/email.consumer.js +1 -5
- package/dist/email/consumers/email.consumer.js.map +1 -1
- package/dist/email/services/email.service.d.ts +1 -1
- package/dist/email/services/email.service.js +1 -1
- package/dist/errors/application-error.d.ts +7 -1
- 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/error-codes.d.ts +0 -2
- package/dist/errors/error-codes.d.ts.map +1 -1
- package/dist/errors/error-codes.js +0 -2
- package/dist/errors/error-codes.js.map +1 -1
- package/dist/errors/error-response.d.ts.map +1 -0
- package/dist/errors/error-response.js.map +1 -0
- package/dist/{infrastructure/error-handler → errors}/global-error-handler.d.ts +3 -3
- package/dist/errors/global-error-handler.d.ts.map +1 -0
- package/dist/{infrastructure/error-handler → errors}/global-error-handler.js +9 -11
- package/dist/errors/global-error-handler.js.map +1 -0
- package/dist/errors/index.d.ts +4 -0
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +4 -0
- package/dist/errors/index.js.map +1 -1
- package/dist/{infrastructure/error-handler → errors}/internal-error.d.ts +1 -1
- package/dist/errors/internal-error.d.ts.map +1 -0
- package/dist/{infrastructure/error-handler → errors}/internal-error.js +2 -2
- package/dist/errors/internal-error.js.map +1 -0
- package/dist/{infrastructure/errors → errors}/request-container-not-initialized.error.d.ts +1 -1
- package/dist/errors/request-container-not-initialized.error.d.ts.map +1 -0
- package/dist/{infrastructure/errors → errors}/request-container-not-initialized.error.js +2 -2
- package/dist/errors/request-container-not-initialized.error.js.map +1 -0
- package/dist/guards/types.d.ts +1 -1
- 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/guards/use-guards.decorator.d.ts +4 -4
- package/dist/guards/use-guards.decorator.js +4 -4
- package/dist/i18n/errors/locale-not-supported.error.d.ts +1 -1
- package/dist/i18n/errors/locale-not-supported.error.d.ts.map +1 -1
- package/dist/i18n/errors/locale-not-supported.error.js +1 -1
- package/dist/i18n/errors/locale-not-supported.error.js.map +1 -1
- package/dist/i18n/errors/translation-missing.error.d.ts +1 -1
- package/dist/i18n/errors/translation-missing.error.d.ts.map +1 -1
- package/dist/i18n/errors/translation-missing.error.js +1 -2
- package/dist/i18n/errors/translation-missing.error.js.map +1 -1
- package/dist/i18n/i18n.module.d.ts +3 -3
- package/dist/i18n/i18n.module.d.ts.map +1 -1
- package/dist/i18n/i18n.module.js +3 -3
- package/dist/i18n/i18n.module.js.map +1 -1
- package/dist/i18n/i18n.options.d.ts +2 -2
- package/dist/i18n/i18n.options.js +1 -1
- package/dist/i18n/i18n.tokens.d.ts +1 -1
- package/dist/i18n/i18n.tokens.d.ts.map +1 -1
- package/dist/i18n/i18n.tokens.js +1 -1
- package/dist/i18n/i18n.tokens.js.map +1 -1
- package/dist/i18n/messages/en/common.d.ts +1 -5
- package/dist/i18n/messages/en/common.d.ts.map +1 -1
- package/dist/i18n/messages/en/common.js +1 -5
- package/dist/i18n/messages/en/common.js.map +1 -1
- package/dist/i18n/messages/en/errors.d.ts +0 -7
- package/dist/i18n/messages/en/errors.d.ts.map +1 -1
- package/dist/i18n/messages/en/errors.js +0 -8
- package/dist/i18n/messages/en/errors.js.map +1 -1
- package/dist/i18n/messages/en/zod.js +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 +19 -1
- package/dist/i18n/services/message-loader.service.d.ts.map +1 -1
- package/dist/i18n/services/message-loader.service.js +57 -3
- package/dist/i18n/services/message-loader.service.js.map +1 -1
- package/dist/index.d.ts +0 -18
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -19
- package/dist/index.js.map +1 -1
- package/dist/logger/contracts/log-context.d.ts +1 -3
- package/dist/logger/contracts/log-context.d.ts.map +1 -1
- package/dist/logger/formatters/json-formatter.d.ts +0 -1
- package/dist/logger/formatters/json-formatter.d.ts.map +1 -1
- package/dist/logger/formatters/json-formatter.js +0 -1
- package/dist/logger/formatters/json-formatter.js.map +1 -1
- package/dist/logger/formatters/pretty-formatter.d.ts +0 -1
- package/dist/logger/formatters/pretty-formatter.d.ts.map +1 -1
- package/dist/logger/formatters/pretty-formatter.js +0 -1
- package/dist/logger/formatters/pretty-formatter.js.map +1 -1
- package/dist/logger/services/logger.service.d.ts +2 -2
- package/dist/logger/services/logger.service.js +2 -2
- package/dist/middleware/middleware-consumer.d.ts +3 -3
- package/dist/middleware/middleware-consumer.js +4 -4
- package/dist/middleware/types.d.ts +2 -2
- package/dist/module/errors/invalid-module-provider.error.d.ts +1 -1
- package/dist/module/errors/invalid-module-provider.error.d.ts.map +1 -1
- package/dist/module/errors/invalid-module-provider.error.js +1 -2
- package/dist/module/errors/invalid-module-provider.error.js.map +1 -1
- package/dist/module/errors/module-already-registered.error.d.ts +1 -1
- package/dist/module/errors/module-already-registered.error.d.ts.map +1 -1
- package/dist/module/errors/module-already-registered.error.js +1 -2
- package/dist/module/errors/module-already-registered.error.js.map +1 -1
- package/dist/module/errors/module-circular-dependency.error.d.ts +1 -1
- package/dist/module/errors/module-circular-dependency.error.d.ts.map +1 -1
- package/dist/module/errors/module-circular-dependency.error.js +1 -2
- package/dist/module/errors/module-circular-dependency.error.js.map +1 -1
- package/dist/module/errors/module-dependency-not-found.error.d.ts +1 -1
- package/dist/module/errors/module-dependency-not-found.error.d.ts.map +1 -1
- package/dist/module/errors/module-dependency-not-found.error.js +1 -2
- package/dist/module/errors/module-dependency-not-found.error.js.map +1 -1
- package/dist/module/module-registry.d.ts +1 -1
- package/dist/module/module-registry.js +2 -2
- package/dist/module/module-registry.js.map +1 -1
- package/dist/module/module.decorator.d.ts +3 -3
- package/dist/module/module.decorator.d.ts.map +1 -1
- package/dist/module/module.decorator.js +4 -4
- package/dist/module/module.decorator.js.map +1 -1
- package/dist/module/types.d.ts +11 -11
- package/dist/module/types.d.ts.map +1 -1
- package/dist/openapi/openapi.module.d.ts +1 -1
- package/dist/openapi/openapi.module.js +1 -1
- package/dist/openapi/services/openapi-config.service.d.ts +1 -1
- package/dist/openapi/services/openapi-config.service.js +1 -1
- package/dist/queue/errors/queue-binding-not-found.error.d.ts +1 -1
- package/dist/queue/errors/queue-binding-not-found.error.d.ts.map +1 -1
- package/dist/queue/errors/queue-binding-not-found.error.js +1 -2
- package/dist/queue/errors/queue-binding-not-found.error.js.map +1 -1
- package/dist/queue/errors/queue-provider-not-supported.error.d.ts +1 -1
- package/dist/queue/errors/queue-provider-not-supported.error.d.ts.map +1 -1
- package/dist/queue/errors/queue-provider-not-supported.error.js +1 -2
- package/dist/queue/errors/queue-provider-not-supported.error.js.map +1 -1
- package/dist/queue/queue-consumer.d.ts +0 -2
- package/dist/queue/queue-consumer.d.ts.map +1 -1
- package/dist/queue/queue-name.d.ts +2 -2
- package/dist/queue/queue-name.js +1 -1
- package/dist/queue/queue.module.d.ts +1 -1
- package/dist/queue/queue.module.js +1 -1
- package/dist/router/constants.js +6 -6
- package/dist/router/constants.js.map +1 -1
- package/dist/router/controller.d.ts +1 -1
- package/dist/router/decorators/controller.decorator.d.ts +2 -18
- package/dist/router/decorators/controller.decorator.d.ts.map +1 -1
- package/dist/router/decorators/controller.decorator.js +2 -18
- package/dist/router/decorators/controller.decorator.js.map +1 -1
- package/dist/router/decorators/index.js +0 -2
- package/dist/router/decorators/index.js.map +1 -1
- package/dist/router/errors/controller-method-not-found.error.d.ts +1 -1
- package/dist/router/errors/controller-method-not-found.error.d.ts.map +1 -1
- package/dist/router/errors/controller-method-not-found.error.js +1 -2
- package/dist/router/errors/controller-method-not-found.error.js.map +1 -1
- package/dist/router/errors/controller-registration.error.d.ts +2 -2
- package/dist/router/errors/controller-registration.error.d.ts.map +1 -1
- package/dist/router/errors/controller-registration.error.js +2 -3
- package/dist/router/errors/controller-registration.error.js.map +1 -1
- package/dist/router/errors/index.js +0 -2
- package/dist/router/errors/index.js.map +1 -1
- package/dist/router/errors/openapi-route-registration.error.d.ts +1 -1
- package/dist/router/errors/openapi-route-registration.error.d.ts.map +1 -1
- package/dist/router/errors/openapi-route-registration.error.js +1 -2
- package/dist/router/errors/openapi-route-registration.error.js.map +1 -1
- package/dist/router/errors/openapi-validation.error.d.ts +1 -1
- package/dist/router/errors/openapi-validation.error.d.ts.map +1 -1
- package/dist/router/errors/openapi-validation.error.js +1 -2
- package/dist/router/errors/openapi-validation.error.js.map +1 -1
- package/dist/router/errors/route-not-found.error.d.ts +1 -1
- package/dist/router/errors/route-not-found.error.d.ts.map +1 -1
- package/dist/router/errors/route-not-found.error.js +1 -2
- package/dist/router/errors/route-not-found.error.js.map +1 -1
- package/dist/router/errors/schema-validation.error.d.ts +1 -1
- package/dist/router/errors/schema-validation.error.d.ts.map +1 -1
- package/dist/router/errors/schema-validation.error.js +1 -2
- package/dist/router/errors/schema-validation.error.js.map +1 -1
- package/dist/router/router-context.js +1 -1
- package/dist/router/router-context.js.map +1 -1
- package/dist/router/router.service.d.ts +1 -1
- package/dist/router/router.service.d.ts.map +1 -1
- package/dist/router/router.service.js +2 -2
- package/dist/router/router.service.js.map +1 -1
- package/dist/router/services/request-scope.service.d.ts +2 -4
- package/dist/router/services/request-scope.service.d.ts.map +1 -1
- package/dist/router/services/request-scope.service.js +2 -4
- package/dist/router/services/request-scope.service.js.map +1 -1
- package/dist/router/types.d.ts.map +1 -1
- package/dist/storage/dom.polyfill.d.ts.map +1 -0
- package/dist/storage/dom.polyfill.js.map +1 -0
- package/dist/storage/providers/s3-storage.provider.d.ts +1 -1
- package/dist/storage/providers/s3-storage.provider.d.ts.map +1 -1
- package/dist/storage/services/storage.service.d.ts +2 -5
- package/dist/storage/services/storage.service.d.ts.map +1 -1
- package/dist/storage/services/storage.service.js +2 -5
- package/dist/storage/services/storage.service.js.map +1 -1
- package/dist/storage/storage.module.d.ts +1 -1
- package/dist/storage/storage.module.js +1 -1
- package/dist/worker/stratal-worker.d.ts +2 -1
- package/dist/worker/stratal-worker.d.ts.map +1 -1
- package/dist/worker/stratal-worker.js +1 -0
- package/dist/worker/stratal-worker.js.map +1 -1
- package/package.json +36 -30
- package/dist/infrastructure/error-handler/error-response.d.ts.map +0 -1
- package/dist/infrastructure/error-handler/error-response.js.map +0 -1
- package/dist/infrastructure/error-handler/global-error-handler.d.ts.map +0 -1
- package/dist/infrastructure/error-handler/global-error-handler.js.map +0 -1
- package/dist/infrastructure/error-handler/index.d.ts +0 -6
- package/dist/infrastructure/error-handler/index.d.ts.map +0 -1
- package/dist/infrastructure/error-handler/index.js +0 -5
- package/dist/infrastructure/error-handler/index.js.map +0 -1
- package/dist/infrastructure/error-handler/internal-error.d.ts.map +0 -1
- package/dist/infrastructure/error-handler/internal-error.js.map +0 -1
- package/dist/infrastructure/errors/index.d.ts +0 -2
- package/dist/infrastructure/errors/index.d.ts.map +0 -1
- package/dist/infrastructure/errors/index.js +0 -2
- package/dist/infrastructure/errors/index.js.map +0 -1
- package/dist/infrastructure/errors/request-container-not-initialized.error.d.ts.map +0 -1
- package/dist/infrastructure/errors/request-container-not-initialized.error.js.map +0 -1
- package/dist/infrastructure/index.d.ts +0 -3
- package/dist/infrastructure/index.d.ts.map +0 -1
- package/dist/infrastructure/index.js +0 -3
- package/dist/infrastructure/index.js.map +0 -1
- package/dist/polyfills/dom.polyfill.d.ts.map +0 -1
- package/dist/polyfills/dom.polyfill.js.map +0 -1
- package/dist/polyfills/index.d.ts +0 -8
- package/dist/polyfills/index.d.ts.map +0 -1
- package/dist/polyfills/index.js +0 -8
- package/dist/polyfills/index.js.map +0 -1
- package/dist/worker/module-worker.d.ts +0 -48
- package/dist/worker/module-worker.d.ts.map +0 -1
- package/dist/worker/module-worker.js +0 -88
- package/dist/worker/module-worker.js.map +0 -1
- /package/dist/{infrastructure/error-handler → errors}/error-response.d.ts +0 -0
- /package/dist/{infrastructure/error-handler → errors}/error-response.js +0 -0
- /package/dist/{polyfills → storage}/dom.polyfill.d.ts +0 -0
- /package/dist/{polyfills → storage}/dom.polyfill.js +0 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# stratal
|
|
2
|
+
|
|
3
|
+
## 0.0.4
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- **Lazy i18n context building** — `MessageLoaderService` now lazily builds and caches `CoreContext` per locale on first access instead of eagerly at startup, reducing initialization overhead.
|
|
8
|
+
- **Pre-build i18n contexts at startup** — Moved `CoreContext` creation and message flattening from per-request `I18nService` to the singleton `MessageLoaderService`, eliminating repeated work on every `t()` call.
|
|
9
|
+
- **Skip stack traces in production** — Added a static flag on `ApplicationError` to disable stack trace capture in production, where traces are stripped from responses anyway.
|
|
10
|
+
|
|
11
|
+
- **Cross-realm metadata keys** — Migrated all internal metadata symbols from `Symbol()` to `Symbol.for()` with a `stratal:` prefix for reliable cross-realm identity in Cloudflare Workers.
|
|
12
|
+
- **Benchmark configuration** — Added a benchmark section to the Vitest config and updated Wrangler compatibility flags for Node.js modules.
|
|
13
|
+
- **i18n integration tests** — Added localization integratnning in the workerd pool.
|
|
14
|
+
|
|
15
|
+
- **Consistent zod imports** — Updated zod imports across benchmark files to use the i18n validation module.
|
|
16
|
+
- **Cleaner error handling** — `GlobalErrorHandler` now passes the translated message directly to the logger, avoiding double-translation.
|
|
17
|
+
|
|
18
|
+
## 0.0.3
|
|
19
|
+
|
|
20
|
+
### Patch Changes
|
|
21
|
+
|
|
22
|
+
- - **Lazy i18n context building** — `MessageLoaderService` now lazily builds and caches `CoreContext` per locale on first access instead of eagerly at startup, reducing initialization overhead.
|
|
23
|
+
- **Pre-build i18n contexts at startup** — Moved `CoreContext` creation and message flattening from per-request `I18nService` to the singleton `MessageLoaderService`, eliminating repeated work on every `t()` call.
|
|
24
|
+
- **Skip stack traces in production** — Added a static flag on `ApplicationError` to disable stack trace capture in production, where traces are stripped from responses anyway.
|
|
25
|
+
|
|
26
|
+
- **Cross-realm metadata keys** — Migrated all internal metadata symbols from `Symbol()` to `Symbol.for()` with a `stratal:` prefix for reliable cross-realm identity in Cloudflare Workers.
|
|
27
|
+
- **Benchmark configuration** — Added a benchmark section to the Vitest config and updated Wrangler compatibility flags for Node.js modules.
|
|
28
|
+
- **i18n integration tests** — Added localization integratnning in the workerd pool.
|
|
29
|
+
|
|
30
|
+
- **Consistent zod imports** — Updated zod imports across benchmark files to use the i18n validation module.
|
|
31
|
+
- **Cleaner error handling** — `GlobalErrorHandler` now passes the translated message directly to the logger, avoiding double-translation.
|
|
32
|
+
|
|
33
|
+
## 0.0.2
|
|
34
|
+
|
|
35
|
+
### Patch Changes
|
|
36
|
+
|
|
37
|
+
#### `stratal` (core)
|
|
38
|
+
|
|
39
|
+
##### Breaking Changes
|
|
40
|
+
|
|
41
|
+
- **`withRoot`/`withRootAsync` renamed to `forRoot`/`forRootAsync`** — All dynamic module configuration methods have been renamed for consistency. Update every `SomeModule.withRoot(...)` call to `SomeModule.forRoot(...)` and `SomeModule.withRootAsync(...)` to `SomeModule.forRootAsync(...)`. ([`152913a`](https://github.com/strataljs/stratal/commit/152913a))
|
|
42
|
+
|
|
43
|
+
- **Barrel export removed — use sub-path imports** — The top-level `stratal` barrel export has been removed. Consumers must now import from sub-paths (`stratal/di`, `stratal/router`, `stratal/cache`, `stratal/validation`, etc.). ([`af073d8`](https://github.com/strataljs/stratal/commit/af073d8))
|
|
44
|
+
|
|
45
|
+
##### Features
|
|
46
|
+
|
|
47
|
+
- **DOM polyfill for Cloudflare Workers** — Added a DOM polyfill to support AWS SDK v3 XML parsing in Cloudflare Workers environments. ([`f3b2cb9`](https://github.com/strataljs/stratal/commit/f3b2cb9))
|
|
48
|
+
|
|
49
|
+
- **Benchmark suite** — Added benchmark functionality for measuring framework performa30438`](https://github.com/strataljs/stratal/commit/7230438))
|
|
50
|
+
|
|
51
|
+
##### Security
|
|
52
|
+
|
|
53
|
+
- **ConfigService blocks prototype pollution** — `ConfigService` now rejects dangerous keys (`__proto__`, `constructor`, `prototype`) to prevent prototype pollution attacks. ([`567139c`](https://github.com/strataljs/stratal/commit/567139c), [`e64b4e7`](https://github.com/strataljs/stratal/commit/e64b4e7))
|
|
54
|
+
|
|
55
|
+
##### Bug Fixes
|
|
56
|
+
|
|
57
|
+
- **`reflect-metadata` import moved to vitest setup** — Removed unused `reflect-metadata` imports from example files and centralized the import in `vitest.setup.ts`. ([`f3b2cb9`](https://github.com/strataljs/stratal/commit/f3b2cb9))
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
#### `@stratal/testing`
|
|
62
|
+
|
|
63
|
+
##### Breaking Changes
|
|
64
|
+
|
|
65
|
+
- **Import paths updated** — Import paths updated to match the new core sub-path exports (e.g. `stratal/di` instead of the barrel `stratal`). ([`af073d8`](https://github.com/strataljs/stratal/commit/af073d8))
|
|
66
|
+
|
|
67
|
+
- Updated dependencies []:
|
|
68
|
+
- stratal@0.0.2
|
|
69
|
+
|
|
70
|
+
## 0.0.1
|
|
71
|
+
|
|
72
|
+
### Patch Changes
|
|
73
|
+
|
|
74
|
+
- Initial release of the Stratal framework — a modular Cloudflare Workers framework built on Hono and tsyringe.
|
|
75
|
+
|
|
76
|
+
**Core Infrastructure**
|
|
77
|
+
|
|
78
|
+
- NestJS-style module system with `@Module()` decorator, dynamic modules (`withRoot`, `withRootAsync`), and lifecycle hooks (`OnInitialize`, `OnShutdown`)
|
|
79
|
+
- Two-tier dependency injection container (global singletons + request-scoped) powered by tsyringe with conditional registration and service decoration
|
|
80
|
+
- `StratalWorker` entry point extending Cloudflare's `WorkerEntrypoint` for HTTP fetch, queue batches, and scheduled cron triggers
|
|
81
|
+
|
|
82
|
+
**Routing & API**
|
|
83
|
+
|
|
84
|
+
- Hono-based routing with `@Controller()` and `@Route()` decorators, automatic controller discovery, and route guards via `@UseGuards()`
|
|
85
|
+
- OpenAPI schema generation with `@hono/zod-openapi` and Scalar API reference integration
|
|
86
|
+
- NestJS-like middleware configuration with route-specific application and exclusion
|
|
87
|
+
|
|
88
|
+
**Background Processing**
|
|
89
|
+
|
|
90
|
+
- Queue consumerfor Cloudflare Queues with `@Consumer()` and `@QueueJob()` decorators and batch processing
|
|
91
|
+
- Cron job scheduling via `CronManager` integrated with Cloudflare's scheduled events
|
|
92
|
+
|
|
93
|
+
**Services & Integrations**
|
|
94
|
+
|
|
95
|
+
- Email module with pluggable providers (Nodemailer, Resend) and queue-based sending
|
|
96
|
+
- Storage module with AWS S3 / Cloudflare R2 support, multipart uploads, presigned URLs, and TUS resumable uploads
|
|
97
|
+
- Internationalization (i18n) module with locale detection, message compilation, and request-scoped translations
|
|
98
|
+
- Cache module with pluggable providers and Cloudflare KV integration
|
|
99
|
+
- Configuration module with `registerAs()` namespaces and Zod-based validation
|
|
100
|
+
- Structured logging with JSON and pretty formatters
|
|
101
|
+
|
|
102
|
+
**Developer Experience**
|
|
103
|
+
|
|
104
|
+
- Zod-powered request/response validation with type inference
|
|
105
|
+
- Custom `ApplicationError` class with HTTP status mapping
|
|
106
|
+
- ESM-only with full TypeScript decorator support (`emitDecoratorMetadata`)
|
|
107
|
+
- Sub-path exports for tree-shakeable imports (`stratal/di`, `stratal/router`, `stratal/cache`, etc.)
|
|
108
|
+
|
|
109
|
+
- `TestingModule` and `TestingModuleBuilder` for bootstrapping isolated module environments in tests
|
|
110
|
+
- `TestHttpClient` with request builder and response wrapper for integration testing
|
|
111
|
+
- `FetchMock` for mocking HTTP fetch calls
|
|
112
|
+
- `FakeStorageService` for in-memory storage testing without S3/R2
|
|
113
|
+
- `ProviderOverrideBuilder` for replacing providers with test doubles
|
|
114
|
+
- Nodemailer mock for email testing
|
|
115
|
+
- Test environment utilities via `getTestEnv()`
|
package/README.md
CHANGED
|
@@ -1,50 +1,126 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Stratal
|
|
2
2
|
|
|
3
|
-
A modular Cloudflare Workers
|
|
3
|
+
A modular framework for building Cloudflare Workers with dependency injection, OpenAPI documentation, queues, cron jobs, and more.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
[](https://www.npmjs.com/package/stratal)
|
|
6
|
+
[](https://github.com/strataljs/stratal/actions/workflows/ci.yml)
|
|
7
|
+
[](https://github.com/strataljs/stratal/actions/workflows/benchmark.yml)
|
|
8
|
+
[](https://opensource.org/licenses/MIT)
|
|
9
|
+
[](https://securityscorecards.dev/viewer/?uri=github.com/strataljs/stratal)
|
|
10
|
+
[](https://snyk.io/test/github/strataljs/stratal)
|
|
11
|
+
[](https://www.npmjs.com/package/stratal)
|
|
12
|
+
[](https://www.typescriptlang.org/)
|
|
13
|
+
[](https://bundlephobia.com/package/stratal)
|
|
14
|
+
[](https://github.com/strataljs/stratal/pulls)
|
|
15
|
+
[](https://github.com/strataljs/stratal)
|
|
16
|
+
|
|
17
|
+
## Documentation
|
|
18
|
+
|
|
19
|
+
Full guides and examples are available at **[stratal.dev](https://stratal.dev)**. API reference lives at **[api-reference.stratal.dev](https://api-reference.stratal.dev)**.
|
|
20
|
+
|
|
21
|
+
## Features
|
|
22
|
+
|
|
23
|
+
- **Dependency Injection** — Two-tier DI container (global + request-scoped) powered by tsyringe
|
|
24
|
+
- **OpenAPI Documentation** — Define Zod schemas once and get a full OpenAPI 3.0 spec with interactive docs
|
|
25
|
+
- **Modular Architecture** — NestJS-style modules with lifecycle hooks, dynamic configuration, and middleware
|
|
26
|
+
- **Hono Routing** — Convention-based RESTful controllers with automatic HTTP method mapping
|
|
27
|
+
- **Queue Consumers** — Typed Cloudflare Queue consumers with message-type filtering
|
|
28
|
+
- **Cron Jobs** — Scheduled tasks via Cloudflare Workers cron triggers
|
|
29
|
+
- **Storage** — S3-compatible file storage with presigned URLs and TUS upload support
|
|
30
|
+
- **Email** — Resend and SMTP providers with React Email template support
|
|
31
|
+
- **i18n** — Type-safe internationalization with locale detection from request headers
|
|
32
|
+
- **Guards and Middleware** — Route protection and per-module middleware configuration
|
|
33
|
+
|
|
34
|
+
> **Note:** Stratal is in active development and APIs may change before v1. It is okay to use in projects, but consider pinning your dependency version so that a new patch does not break your existing code.
|
|
6
35
|
|
|
7
36
|
## Installation
|
|
8
37
|
|
|
38
|
+
Scaffold a new project from an official template:
|
|
39
|
+
|
|
9
40
|
```bash
|
|
10
|
-
npm
|
|
41
|
+
npm create stratal my-app
|
|
42
|
+
# or
|
|
43
|
+
yarn create stratal my-app
|
|
11
44
|
# or
|
|
12
|
-
|
|
45
|
+
pnpm create stratal my-app
|
|
13
46
|
```
|
|
14
47
|
|
|
15
|
-
|
|
48
|
+
Available templates:
|
|
49
|
+
|
|
50
|
+
| Template | Description | Example |
|
|
51
|
+
|---|---|---|
|
|
52
|
+
| `hello-world` | A minimal Stratal app with a single GET endpoint | [Source](https://github.com/strataljs/stratal/tree/main/examples/01-hello-world) |
|
|
53
|
+
| `crud-api` | RESTful notes API with full CRUD operations and DI | [Source](https://github.com/strataljs/stratal/tree/main/examples/02-crud-api) |
|
|
54
|
+
| `testing` | Vitest + @stratal/testing with Cloudflare worker pool | [Source](https://github.com/strataljs/stratal/tree/main/examples/03-testing) |
|
|
55
|
+
| `guards` | Route protection with @UseGuards and CanActivate | [Source](https://github.com/strataljs/stratal/tree/main/examples/04-guards) |
|
|
56
|
+
| `middleware` | Middleware configuration with apply/exclude/forRoutes | [Source](https://github.com/strataljs/stratal/tree/main/examples/05-middleware) |
|
|
57
|
+
| `queues` | Queue producer/consumer pattern with Cloudflare Queues | [Source](https://github.com/strataljs/stratal/tree/main/examples/06-queues) |
|
|
58
|
+
| `scheduled-tasks` | Cron job scheduling with the CronJob interface | [Source](https://github.com/strataljs/stratal/tree/main/examples/07-scheduled-tasks) |
|
|
59
|
+
| `openapi` | OpenAPI docs with Scalar UI and Zod schema integration | [Source](https://github.com/strataljs/stratal/tree/main/examples/08-openapi) |
|
|
60
|
+
|
|
61
|
+
For benchmarks, see the [main README](https://github.com/strataljs/stratal#benchmarks).
|
|
62
|
+
|
|
63
|
+
You can also specify a template directly:
|
|
16
64
|
|
|
17
|
-
|
|
65
|
+
```bash
|
|
66
|
+
npm create stratal my-app -- -t crud-api
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Or add Stratal to an existing project:
|
|
18
70
|
|
|
19
71
|
```bash
|
|
20
|
-
|
|
21
|
-
|
|
72
|
+
npm install stratal
|
|
73
|
+
```
|
|
22
74
|
|
|
23
|
-
|
|
24
|
-
npm install resend react react-dom @react-email/components
|
|
75
|
+
### AI Agent Skills
|
|
25
76
|
|
|
26
|
-
|
|
27
|
-
npm install nodemailer
|
|
77
|
+
Stratal provides [Agent Skills](https://agentskills.io) for AI coding assistants like Claude Code and Cursor. Install to give your AI agent knowledge of Stratal patterns, conventions, and APIs:
|
|
28
78
|
|
|
29
|
-
|
|
30
|
-
|
|
79
|
+
```bash
|
|
80
|
+
npx skills add strataljs/stratal
|
|
31
81
|
```
|
|
32
82
|
|
|
33
|
-
##
|
|
83
|
+
## Quick Start
|
|
34
84
|
|
|
35
|
-
|
|
85
|
+
Define a module with a controller and wire it up as a Cloudflare Worker:
|
|
36
86
|
|
|
37
87
|
```typescript
|
|
38
|
-
import {
|
|
39
|
-
import {
|
|
40
|
-
import {
|
|
41
|
-
import {
|
|
42
|
-
import {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
88
|
+
import { type ApplicationConfig } from 'stratal'
|
|
89
|
+
import { Module } from 'stratal/module'
|
|
90
|
+
import { Controller, Route, type RouterContext } from 'stratal/router'
|
|
91
|
+
import { StratalWorker } from 'stratal/worker'
|
|
92
|
+
import { z } from 'stratal/validation'
|
|
93
|
+
|
|
94
|
+
// Define a controller
|
|
95
|
+
@Controller('/api/greetings')
|
|
96
|
+
class GreetingsController {
|
|
97
|
+
@Route({
|
|
98
|
+
summary: 'Say hello',
|
|
99
|
+
response: z.object({ message: z.string() }),
|
|
100
|
+
})
|
|
101
|
+
async index(ctx: RouterContext) {
|
|
102
|
+
return ctx.json({ message: 'Hello from Stratal!' })
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Create the root module
|
|
107
|
+
@Module({
|
|
108
|
+
controllers: [GreetingsController],
|
|
109
|
+
})
|
|
110
|
+
class AppModule {}
|
|
111
|
+
|
|
112
|
+
// Worker entry point
|
|
113
|
+
export default class Backend extends StratalWorker {
|
|
114
|
+
protected configure(): ApplicationConfig {
|
|
115
|
+
return { module: AppModule }
|
|
116
|
+
}
|
|
117
|
+
}
|
|
46
118
|
```
|
|
47
119
|
|
|
120
|
+
## Contributing
|
|
121
|
+
|
|
122
|
+
Contributions are welcome! Please see [CONTRIBUTING.md](https://github.com/strataljs/stratal/blob/main/CONTRIBUTING.md) for guidelines.
|
|
123
|
+
|
|
48
124
|
## License
|
|
49
125
|
|
|
50
126
|
MIT
|
package/dist/application.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"application.d.ts","sourceRoot":"","sources":["../src/application.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"application.d.ts","sourceRoot":"","sources":["../src/application.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE1C,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,OAAO,CAAA;AAGvC,OAAO,EAAiE,QAAQ,EAAmB,MAAM,UAAU,CAAA;AAEnH,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAMhE,OAAO,EAAkD,KAAK,aAAa,EAAE,MAAM,UAAU,CAAA;AAG7F,MAAM,WAAW,iBAAiB;IAChC,8BAA8B;IAC9B,MAAM,EAAE,WAAW,GAAG,aAAa,CAAA;IACnC,oEAAoE;IACpE,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,QAAQ,CAAA;QAChB,SAAS,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAA;KAC9B,CAAA;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,qBAAa,WAAW;IAapB,QAAQ,CAAC,GAAG,EAAE,UAAU;IACxB,QAAQ,CAAC,GAAG,EAAE,gBAAgB;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAd5B;;;OAGG;IACH,OAAO,CAAC,UAAU,CAAW;IAE7B,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,WAAW,CAAQ;gBAGhB,GAAG,EAAE,UAAU,EACf,GAAG,EAAE,gBAAgB,EACb,SAAS,EAAE,iBAAiB;IAwB/C;;;;;;;OAOG;IACH,IAAI,SAAS,IAAI,SAAS,CAEzB;IAEK,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAqCjC;;;;;OAKG;IACH,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC;IAU5B;;;;;OAKG;IACG,WAAW,CAAC,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBxE;;OAEG;IACG,eAAe,CAAC,UAAU,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAerE;;;;;;;OAOG;IACH,uBAAuB,CAAC,MAAM,SAAO,GAAG,aAAa;IAQ/C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAK/B,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,sBAAsB;IAO9B,OAAO,CAAC,gBAAgB;IAOxB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAoB7B;;;;;;;OAOG;IACH,OAAO,CAAC,oBAAoB;CAO7B"}
|
package/dist/application.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import 'reflect-metadata';
|
|
2
1
|
import { container as tsyringeRootContainer } from 'tsyringe';
|
|
3
2
|
import { CacheModule } from './cache';
|
|
4
3
|
import { CronManager } from './cron/cron-manager';
|
|
5
4
|
import { Container } from './di/container';
|
|
6
5
|
import { DI_TOKENS } from './di/tokens';
|
|
6
|
+
import { ApplicationError, GlobalErrorHandler } from './errors';
|
|
7
7
|
import { I18nModule } from './i18n/i18n.module';
|
|
8
|
-
import { GlobalErrorHandler } from './infrastructure/error-handler';
|
|
9
8
|
import { ConsoleTransport, JsonFormatter, LOGGER_TOKENS, LoggerService, LogLevel, PrettyFormatter } from './logger';
|
|
10
9
|
import { ModuleRegistry } from './module/module-registry';
|
|
11
10
|
import { OpenAPIModule } from './openapi';
|
|
@@ -93,6 +92,8 @@ export class Application {
|
|
|
93
92
|
if (this.initialized) {
|
|
94
93
|
return;
|
|
95
94
|
}
|
|
95
|
+
// Disable stack trace capture in production (expensive and stripped from responses)
|
|
96
|
+
ApplicationError.captureStackTraces = this.env.ENVIRONMENT !== 'production';
|
|
96
97
|
// Phase 1: Register core infrastructure modules (internal)
|
|
97
98
|
this.moduleRegistry.registerAll([
|
|
98
99
|
I18nModule,
|
package/dist/application.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"application.js","sourceRoot":"","sources":["../src/application.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"application.js","sourceRoot":"","sources":["../src/application.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,IAAI,qBAAqB,EAAE,MAAM,UAAU,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAErC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvC,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AACnH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAEzD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAIzC,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAwC,MAAM,UAAU,CAAA;AAa7F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,OAAO,WAAW;IAaX;IACA;IACQ;IAdnB;;;OAGG;IACK,UAAU,CAAW;IAErB,cAAc,CAAgB;IAC9B,gBAAgB,CAAmB;IACnC,WAAW,CAAc;IACzB,WAAW,GAAG,KAAK,CAAA;IAE3B,YACW,GAAe,EACf,GAAqB,EACb,SAA4B;QAFpC,QAAG,GAAH,GAAG,CAAY;QACf,QAAG,GAAH,GAAG,CAAkB;QACb,cAAS,GAAT,SAAS,CAAmB;QAE7C,yDAAyD;QACzD,IAAI,CAAC,UAAU,GAAG,IAAI,SAAS,CAAC;YAC9B,GAAG;YACH,GAAG;YACH,SAAS,EAAE,qBAAqB,CAAC,oBAAoB,EAAE;SACxD,CAAC,CAAA;QAEF,gCAAgC;QAChC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,CAAA;QAE1D,sCAAsC;QACtC,IAAI,CAAC,qBAAqB,EAAE,CAAA;QAC5B,IAAI,CAAC,oBAAoB,EAAE,CAAA;QAE3B,2CAA2C;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAgB,aAAa,CAAC,aAAa,CAAC,CAAA;QAClF,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;QAEjE,gFAAgF;QAChF,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAA;IAC9E,CAAC;IAED;;;;;;;OAOG;IACH,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAA;IACxB,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,OAAM;QACR,CAAC;QAED,oFAAoF;QACpF,gBAAgB,CAAC,kBAAkB,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,KAAK,YAAY,CAAA;QAE3E,2DAA2D;QAC3D,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC;YAC9B,UAAU;YACV,aAAa,EAAG,qCAAqC;YACrD,WAAW,EAAG,uCAAuC;YACrD,WAAW;SACZ,CAAC,CAAA;QAEF,2DAA2D;QAC3D,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;QAEnD,kCAAkC;QAClC,MAAM,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAA;QAEtC,2CAA2C;QAC3C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAmB,SAAS,CAAC,gBAAgB,CAAC,CAAA;QAC7F,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAc,SAAS,CAAC,IAAI,CAAC,CAAA;QAEvE,kCAAkC;QAClC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,aAAa,CAAC,aAAa,EAAE,aAAa,CAAC,CAAA;QAE7E,mDAAmD;QACnD,IAAI,CAAC,cAAc,EAAE,CAAA;QACrB,IAAI,CAAC,sBAAsB,EAAE,CAAA;QAC7B,IAAI,CAAC,gBAAgB,EAAE,CAAA;QAEvB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;IACzB,CAAC;IAED;;;;;OAKG;IACH,OAAO,CAAI,KAAa;QACtB,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAqB,SAAS,CAAC,YAAY,CAAC,CAAA;YACxF,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YAChD,MAAM,aAAiC,CAAA;QACzC,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,WAAW,CAAC,KAAmB,EAAE,SAAiB;QACtD,6CAA6C;QAC7C,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAgC,CAAA;QACxE,MAAM,MAAM,GAAG,YAAY,EAAE,QAAQ,EAAE,MAAM,IAAI,IAAI,CAAA;QAErD,8CAA8C;QAC9C,MAAM,iBAAiB,GAAG,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAA;QAE9D,qCAAqC;QACrC,MAAM,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;YACpE,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAe,SAAS,CAAC,KAAK,CAAC,CAAA;gBAC3E,MAAM,YAAY,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;YACnD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAqB,SAAS,CAAC,YAAY,CAAC,CAAA;gBACxF,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;gBAC1B,MAAM,KAAK,CAAA;YACb,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,UAA+B;QACnD,MAAM,MAAM,GAAG,IAAI,CAAA;QACnB,MAAM,iBAAiB,GAAG,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAA;QAE9D,MAAM,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;YACpE,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAA;YACrD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAqB,SAAS,CAAC,YAAY,CAAC,CAAA;gBACxF,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;gBAC1B,MAAM,KAAK,CAAA;YACb,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED;;;;;;;OAOG;IACH,uBAAuB,CAAC,MAAM,GAAG,IAAI;QACnC,OAAO;YACL,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM;YACvB,SAAS,EAAE,GAAG,EAAE,GAAe,CAAC;YAChC,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU;SACR,CAAA;IAC/B,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAA;QACpC,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;IAClC,CAAC;IAEO,cAAc;QACpB,MAAM,iBAAiB,GAAG,IAAI,CAAC,cAAc,CAAC,uBAAuB,EAAE,CAAA;QACvE,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,iBAAiB,EAAgC,CAAA;QAEzF,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAgB,aAAa,CAAC,aAAa,CAAC,CAAA;QAClF,MAAM,CAAC,SAAS,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAA;IAClD,CAAC;IAEO,sBAAsB;QAC5B,KAAK,MAAM,aAAa,IAAI,IAAI,CAAC,cAAc,CAAC,eAAe,EAAE,EAAE,CAAC;YAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,aAAa,CAAmB,CAAA;YACzE,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QAC1C,CAAC;IACH,CAAC;IAEO,gBAAgB;QACtB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,EAAE,CAAC;YACxD,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAY,CAAA;YACxD,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;QACnC,CAAC;IACH,CAAC;IAED;;OAEG;IACK,qBAAqB;QAC3B,mCAAmC;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,IAAI,QAAQ,CAAC,IAAI,CAAA;QAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,IAAI,MAAM,CAAA;QAE7D,mCAAmC;QACnC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAA;QAEtE,qCAAqC;QACrC,IAAI,CAAC,UAAU;aACZ,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,KAAK,QAAQ,CAAC;aAClC,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC;aAC5B,IAAI,CAAC,eAAe,CAAC;aACrB,SAAS,CAAC,aAAa,CAAC,CAAA;QAE3B,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,aAAa,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAA;QACnF,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAA;QAC7G,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,aAAa,CAAC,aAAa,EAAE,aAAa,CAAC,CAAA;IAC/E,CAAC;IAED;;;;;;;OAOG;IACK,oBAAoB;QAC1B,2BAA2B;QAC3B,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;QAE9D,yEAAyE;QACzE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAA;IACtE,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-delete.error.d.ts","sourceRoot":"","sources":["../../../src/cache/errors/cache-delete.error.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"cache-delete.error.d.ts","sourceRoot":"","sources":["../../../src/cache/errors/cache-delete.error.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAE/C;;;;;GAKG;AACH,qBAAa,gBAAiB,SAAQ,gBAAgB;gBACxC,GAAG,EAAE,MAAM;CAGxB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-delete.error.js","sourceRoot":"","sources":["../../../src/cache/errors/cache-delete.error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"cache-delete.error.js","sourceRoot":"","sources":["../../../src/cache/errors/cache-delete.error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAE/C;;;;;GAKG;AACH,MAAM,OAAO,gBAAiB,SAAQ,gBAAgB;IACpD,YAAY,GAAW;QACrB,KAAK,CAAC,2BAA2B,EAAE,WAAW,CAAC,MAAM,CAAC,oBAAoB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;IACtF,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-get.error.d.ts","sourceRoot":"","sources":["../../../src/cache/errors/cache-get.error.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"cache-get.error.d.ts","sourceRoot":"","sources":["../../../src/cache/errors/cache-get.error.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAE/C;;;;;GAKG;AACH,qBAAa,aAAc,SAAQ,gBAAgB;gBACrC,GAAG,EAAE,MAAM;CAGxB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-get.error.js","sourceRoot":"","sources":["../../../src/cache/errors/cache-get.error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"cache-get.error.js","sourceRoot":"","sources":["../../../src/cache/errors/cache-get.error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAE/C;;;;;GAKG;AACH,MAAM,OAAO,aAAc,SAAQ,gBAAgB;IACjD,YAAY,GAAW;QACrB,KAAK,CAAC,wBAAwB,EAAE,WAAW,CAAC,MAAM,CAAC,oBAAoB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;IACnF,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-list.error.d.ts","sourceRoot":"","sources":["../../../src/cache/errors/cache-list.error.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"cache-list.error.d.ts","sourceRoot":"","sources":["../../../src/cache/errors/cache-list.error.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAE/C;;;;GAIG;AACH,qBAAa,cAAe,SAAQ,gBAAgB;;CAInD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-list.error.js","sourceRoot":"","sources":["../../../src/cache/errors/cache-list.error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"cache-list.error.js","sourceRoot":"","sources":["../../../src/cache/errors/cache-list.error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAE/C;;;;GAIG;AACH,MAAM,OAAO,cAAe,SAAQ,gBAAgB;IAClD;QACE,KAAK,CAAC,yBAAyB,EAAE,WAAW,CAAC,MAAM,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAA;IAC/E,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-put.error.d.ts","sourceRoot":"","sources":["../../../src/cache/errors/cache-put.error.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"cache-put.error.d.ts","sourceRoot":"","sources":["../../../src/cache/errors/cache-put.error.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAE/C;;;;;GAKG;AACH,qBAAa,aAAc,SAAQ,gBAAgB;gBACrC,GAAG,EAAE,MAAM;CAGxB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-put.error.js","sourceRoot":"","sources":["../../../src/cache/errors/cache-put.error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"cache-put.error.js","sourceRoot":"","sources":["../../../src/cache/errors/cache-put.error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAE/C;;;;;GAKG;AACH,MAAM,OAAO,aAAc,SAAQ,gBAAgB;IACjD,YAAY,GAAW;QACrB,KAAK,CAAC,wBAAwB,EAAE,WAAW,CAAC,MAAM,CAAC,oBAAoB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;IACnF,CAAC;CACF"}
|
|
@@ -47,8 +47,8 @@ export interface IConfigService<T extends object = ModuleConfig> {
|
|
|
47
47
|
*/
|
|
48
48
|
get<P extends ConfigPath<T>>(path: P): ConfigPathValue<T, P>;
|
|
49
49
|
/**
|
|
50
|
-
* Set config value at runtime (for
|
|
51
|
-
* @example config.set('email.from.name', '
|
|
50
|
+
* Set config value at runtime (for runtime overrides)
|
|
51
|
+
* @example config.set('email.from.name', 'Custom Name')
|
|
52
52
|
*/
|
|
53
53
|
set<P extends ConfigPath<T>>(path: P, value: ConfigPathValue<T, P>): void;
|
|
54
54
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-not-initialized.error.d.ts","sourceRoot":"","sources":["../../../src/config/errors/config-not-initialized.error.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"config-not-initialized.error.d.ts","sourceRoot":"","sources":["../../../src/config/errors/config-not-initialized.error.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAE/C;;;;;;GAMG;AACH,qBAAa,yBAA0B,SAAQ,gBAAgB;;CAO9D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-not-initialized.error.js","sourceRoot":"","sources":["../../../src/config/errors/config-not-initialized.error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"config-not-initialized.error.js","sourceRoot":"","sources":["../../../src/config/errors/config-not-initialized.error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAE/C;;;;;;GAMG;AACH,MAAM,OAAO,yBAA0B,SAAQ,gBAAgB;IAC7D;QACE,KAAK,CACH,6BAA6B,EAC7B,WAAW,CAAC,MAAM,CAAC,sBAAsB,CAC1C,CAAA;IACH,CAAC;CACF"}
|
|
@@ -2,7 +2,7 @@ import type { ConfigPath, ConfigPathValue, IConfigService, ModuleConfig } from '
|
|
|
2
2
|
/**
|
|
3
3
|
* ConfigService with dot notation support for get/set operations
|
|
4
4
|
*
|
|
5
|
-
* Supports runtime overrides via set() - useful for
|
|
5
|
+
* Supports runtime overrides via set() - useful for request-specific config overrides.
|
|
6
6
|
* Use reset() to restore original values.
|
|
7
7
|
*
|
|
8
8
|
* @example
|
|
@@ -11,8 +11,8 @@ import type { ConfigPath, ConfigPathValue, IConfigService, ModuleConfig } from '
|
|
|
11
11
|
* const url = config.get('database.url')
|
|
12
12
|
* const fromName = config.get('email.from.name')
|
|
13
13
|
*
|
|
14
|
-
* // Set at runtime (e.g., in middleware for
|
|
15
|
-
* config.set('email.from.name',
|
|
14
|
+
* // Set at runtime (e.g., in middleware for runtime override)
|
|
15
|
+
* config.set('email.from.name', 'Custom Name')
|
|
16
16
|
*
|
|
17
17
|
* // Reset to original
|
|
18
18
|
* config.reset('email.from.name') // reset specific path
|
|
@@ -33,8 +33,8 @@ export declare class ConfigService<T extends object = ModuleConfig> implements I
|
|
|
33
33
|
*/
|
|
34
34
|
get<P extends ConfigPath<T>>(path: P): ConfigPathValue<T, P>;
|
|
35
35
|
/**
|
|
36
|
-
* Set config value at runtime (for
|
|
37
|
-
* @example config.set('email.from.name', '
|
|
36
|
+
* Set config value at runtime (for runtime overrides)
|
|
37
|
+
* @example config.set('email.from.name', 'Custom Name')
|
|
38
38
|
*/
|
|
39
39
|
set<P extends ConfigPath<T>>(path: P, value: ConfigPathValue<T, P>): void;
|
|
40
40
|
/**
|
|
@@ -52,6 +52,7 @@ export declare class ConfigService<T extends object = ModuleConfig> implements I
|
|
|
52
52
|
has(path: ConfigPath<T>): boolean;
|
|
53
53
|
private getByPath;
|
|
54
54
|
private setByPath;
|
|
55
|
+
private isDangerousKey;
|
|
55
56
|
private ensureInitialized;
|
|
56
57
|
private deepClone;
|
|
57
58
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.service.d.ts","sourceRoot":"","sources":["../../../src/config/services/config.service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAGhG;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBACa,aAAa,CAAC,CAAC,SAAS,MAAM,GAAG,YAAY,CAAE,YAAW,cAAc,CAAC,CAAC,CAAC;IACtF,OAAO,CAAC,cAAc,CAAe;IACrC,OAAO,CAAC,aAAa,CAAe;IAEpC;;;OAGG;IACH,UAAU,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI;IAK3B;;;OAGG;IACH,GAAG,CAAC,CAAC,SAAS,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC;IAK5D;;;OAGG;IACH,GAAG,CAAC,CAAC,SAAS,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI;IAKzE;;;OAGG;IACH,KAAK,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI;IAUjC;;OAEG;IACH,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC;IAKlB;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,OAAO;IAKjC,OAAO,CAAC,SAAS;
|
|
1
|
+
{"version":3,"file":"config.service.d.ts","sourceRoot":"","sources":["../../../src/config/services/config.service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAGhG;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBACa,aAAa,CAAC,CAAC,SAAS,MAAM,GAAG,YAAY,CAAE,YAAW,cAAc,CAAC,CAAC,CAAC;IACtF,OAAO,CAAC,cAAc,CAAe;IACrC,OAAO,CAAC,aAAa,CAAe;IAEpC;;;OAGG;IACH,UAAU,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI;IAK3B;;;OAGG;IACH,GAAG,CAAC,CAAC,SAAS,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC;IAK5D;;;OAGG;IACH,GAAG,CAAC,CAAC,SAAS,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI;IAKzE;;;OAGG;IACH,KAAK,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI;IAUjC;;OAEG;IACH,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC;IAKlB;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,OAAO;IAKjC,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,SAAS;IAwBjB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,SAAS;CAMlB"}
|
|
@@ -10,7 +10,7 @@ import { ConfigNotInitializedError } from '../errors';
|
|
|
10
10
|
/**
|
|
11
11
|
* ConfigService with dot notation support for get/set operations
|
|
12
12
|
*
|
|
13
|
-
* Supports runtime overrides via set() - useful for
|
|
13
|
+
* Supports runtime overrides via set() - useful for request-specific config overrides.
|
|
14
14
|
* Use reset() to restore original values.
|
|
15
15
|
*
|
|
16
16
|
* @example
|
|
@@ -19,8 +19,8 @@ import { ConfigNotInitializedError } from '../errors';
|
|
|
19
19
|
* const url = config.get('database.url')
|
|
20
20
|
* const fromName = config.get('email.from.name')
|
|
21
21
|
*
|
|
22
|
-
* // Set at runtime (e.g., in middleware for
|
|
23
|
-
* config.set('email.from.name',
|
|
22
|
+
* // Set at runtime (e.g., in middleware for runtime override)
|
|
23
|
+
* config.set('email.from.name', 'Custom Name')
|
|
24
24
|
*
|
|
25
25
|
* // Reset to original
|
|
26
26
|
* config.reset('email.from.name') // reset specific path
|
|
@@ -47,8 +47,8 @@ let ConfigService = class ConfigService {
|
|
|
47
47
|
return this.getByPath(this.currentConfig, path);
|
|
48
48
|
}
|
|
49
49
|
/**
|
|
50
|
-
* Set config value at runtime (for
|
|
51
|
-
* @example config.set('email.from.name', '
|
|
50
|
+
* Set config value at runtime (for runtime overrides)
|
|
51
|
+
* @example config.set('email.from.name', 'Custom Name')
|
|
52
52
|
*/
|
|
53
53
|
set(path, value) {
|
|
54
54
|
this.ensureInitialized();
|
|
@@ -86,6 +86,8 @@ let ConfigService = class ConfigService {
|
|
|
86
86
|
const keys = path.split('.');
|
|
87
87
|
let current = obj;
|
|
88
88
|
for (const key of keys) {
|
|
89
|
+
if (this.isDangerousKey(key))
|
|
90
|
+
return undefined;
|
|
89
91
|
if (current === null || current === undefined)
|
|
90
92
|
return undefined;
|
|
91
93
|
current = current[key];
|
|
@@ -94,15 +96,30 @@ let ConfigService = class ConfigService {
|
|
|
94
96
|
}
|
|
95
97
|
setByPath(obj, path, value) {
|
|
96
98
|
const keys = path.split('.');
|
|
99
|
+
if (keys.some((key) => this.isDangerousKey(key)))
|
|
100
|
+
return;
|
|
97
101
|
let current = obj;
|
|
98
102
|
for (let i = 0; i < keys.length - 1; i++) {
|
|
99
103
|
const key = keys[i];
|
|
100
|
-
if (!(key
|
|
101
|
-
current
|
|
104
|
+
if (!Object.hasOwn(current, key) || typeof current[key] !== 'object' || current[key] === null) {
|
|
105
|
+
Object.defineProperty(current, key, {
|
|
106
|
+
value: {},
|
|
107
|
+
writable: true,
|
|
108
|
+
enumerable: true,
|
|
109
|
+
configurable: true,
|
|
110
|
+
});
|
|
102
111
|
}
|
|
103
112
|
current = current[key];
|
|
104
113
|
}
|
|
105
|
-
current
|
|
114
|
+
Object.defineProperty(current, keys[keys.length - 1], {
|
|
115
|
+
value,
|
|
116
|
+
writable: true,
|
|
117
|
+
enumerable: true,
|
|
118
|
+
configurable: true,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
isDangerousKey(key) {
|
|
122
|
+
return key === '__proto__' || key === 'constructor' || key === 'prototype';
|
|
106
123
|
}
|
|
107
124
|
ensureInitialized() {
|
|
108
125
|
if (!this.currentConfig) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.service.js","sourceRoot":"","sources":["../../../src/config/services/config.service.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAEhD,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAA;AAErD;;;;;;;;;;;;;;;;;;;GAmBG;AAEI,IAAM,aAAa,GAAnB,MAAM,aAAa;IAChB,cAAc,CAAe;IAC7B,aAAa,CAAe;IAEpC;;;OAGG;IACH,UAAU,CAAC,MAAS;QAClB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;QAC5C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IAC7C,CAAC;IAED;;;OAGG;IACH,GAAG,CAA0B,IAAO;QAClC,IAAI,CAAC,iBAAiB,EAAE,CAAA;QACxB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAA0B,CAAA;IAC1E,CAAC;IAED;;;OAGG;IACH,GAAG,CAA0B,IAAO,EAAE,KAA4B;QAChE,IAAI,CAAC,iBAAiB,EAAE,CAAA;QACxB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;IACjD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAoB;QACxB,IAAI,CAAC,iBAAiB,EAAE,CAAA;QACxB,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAA;YAC/D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAA;QACzE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QAC1D,CAAC;IACH,CAAC;IAED;;OAEG;IACH,GAAG;QACD,IAAI,CAAC,iBAAiB,EAAE,CAAA;QACxB,OAAO,IAAI,CAAC,aAA4B,CAAA;IAC1C,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,IAAmB;QACrB,IAAI,CAAC,iBAAiB,EAAE,CAAA;QACxB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,KAAK,SAAS,CAAA;IAC/D,CAAC;IAEO,SAAS,CAAC,GAAY,EAAE,IAAY;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC5B,IAAI,OAAO,GAAG,GAAG,CAAA;QACjB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAA;YAC/D,OAAO,GAAI,OAAmC,CAAC,GAAG,CAAC,CAAA;QACrD,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IAEO,SAAS,CAAC,GAAY,EAAE,IAAY,EAAE,KAAc;QAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC5B,IAAI,OAAO,GAAG,GAA8B,CAAA;QAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;YACnB,IAAI,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"config.service.js","sourceRoot":"","sources":["../../../src/config/services/config.service.ts"],"names":[],"mappings":"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"}
|