stratal 0.0.21 → 0.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/{base-email.provider-CfQCA08m.mjs → base-email.provider-BWZHIjt8.mjs} +1 -1
- package/dist/{base-email.provider-CfQCA08m.mjs.map → base-email.provider-BWZHIjt8.mjs.map} +1 -1
- package/dist/bin/quarry.mjs +46 -109
- package/dist/bin/quarry.mjs.map +1 -1
- package/dist/cache/index.d.mts +6 -46
- package/dist/cache/index.d.mts.map +1 -1
- package/dist/cache/index.mjs +20 -67
- package/dist/cache/index.mjs.map +1 -1
- package/dist/{cache.service-DsnKuNyO.d.mts → cache.service-e34gV6tz.d.mts} +8 -8
- package/dist/{cache.service-DsnKuNyO.d.mts.map → cache.service-e34gV6tz.d.mts.map} +1 -1
- package/dist/{cache.tokens-B7Rw1C9Q.mjs → cache.tokens-ovi_c52J.mjs} +1 -1
- package/dist/{cache.tokens-B7Rw1C9Q.mjs.map → cache.tokens-ovi_c52J.mjs.map} +1 -1
- package/dist/{colors-DJaRDXoS.mjs → colors-axmupKdp.mjs} +1 -1
- package/dist/{colors-DJaRDXoS.mjs.map → colors-axmupKdp.mjs.map} +1 -1
- package/dist/{command-BgSlsS4M.mjs → command-BU4ApTo5.mjs} +2 -3
- package/dist/command-BU4ApTo5.mjs.map +1 -0
- package/dist/{command-Cmmf0oHX.d.mts → command-wXfvHbBZ.d.mts} +3 -2
- package/dist/command-wXfvHbBZ.d.mts.map +1 -0
- package/dist/config/index.d.mts +24 -11
- package/dist/config/index.d.mts.map +1 -1
- package/dist/config/index.mjs +31 -57
- package/dist/config/index.mjs.map +1 -1
- package/dist/{consumer-registry-B7yUNh0q.d.mts → consumer-registry-DHQtypr1.d.mts} +1 -1
- package/dist/{consumer-registry-B7yUNh0q.d.mts.map → consumer-registry-DHQtypr1.d.mts.map} +1 -1
- package/dist/container-storage-GpNNz79X.mjs +52 -0
- package/dist/container-storage-GpNNz79X.mjs.map +1 -0
- package/dist/{controller.decorator-B9vwn0zK.mjs → controller.decorator-DIUazNU7.mjs} +8 -8
- package/dist/controller.decorator-DIUazNU7.mjs.map +1 -0
- package/dist/cron/index.d.mts +26 -5
- package/dist/cron/index.d.mts.map +1 -1
- package/dist/cron/index.mjs +1 -1
- package/dist/{cron-manager-DQSK8uoV.mjs → cron-manager-9bpN9bu4.mjs} +35 -15
- package/dist/cron-manager-9bpN9bu4.mjs.map +1 -0
- package/dist/{cron-manager-CmTimEjf.d.mts → cron-manager-CSTIBPcM.d.mts} +6 -13
- package/dist/cron-manager-CSTIBPcM.d.mts.map +1 -0
- package/dist/decorate-HgTKAYK8.mjs +16 -0
- package/dist/deep-merge-C8NgcXw4.mjs +18 -0
- package/dist/deep-merge-C8NgcXw4.mjs.map +1 -0
- package/dist/di/index.d.mts +2 -2
- package/dist/di/index.mjs +4 -3
- package/dist/di-BO1QIb5H.mjs +415 -0
- package/dist/di-BO1QIb5H.mjs.map +1 -0
- package/dist/email/index.d.mts +14 -89
- package/dist/email/index.d.mts.map +1 -1
- package/dist/email/index.mjs +25 -125
- package/dist/email/index.mjs.map +1 -1
- package/dist/en-BPP6h6y5.mjs +202 -0
- package/dist/en-BPP6h6y5.mjs.map +1 -0
- package/dist/{env-D1rcZ8_r.d.mts → env-DKSbuBi5.d.mts} +1 -1
- package/dist/env-DKSbuBi5.d.mts.map +1 -0
- package/dist/errors/index.d.mts +2 -2
- package/dist/errors/index.mjs +4 -2
- package/dist/errors-BBZTnjdq.mjs +333 -0
- package/dist/errors-BBZTnjdq.mjs.map +1 -0
- package/dist/events/index.d.mts +2 -2
- package/dist/events/index.d.mts.map +1 -1
- package/dist/events/index.mjs +1 -1
- package/dist/{events-CzCV8jI8.mjs → events-D1KdDaiP.mjs} +11 -11
- package/dist/events-D1KdDaiP.mjs.map +1 -0
- package/dist/exception-context-B4kM-M53.mjs +429 -0
- package/dist/exception-context-B4kM-M53.mjs.map +1 -0
- package/dist/{gateway-context-CXmXtaUP.mjs → gateway-context-CFe6a9gz.mjs} +19 -31
- package/dist/gateway-context-CFe6a9gz.mjs.map +1 -0
- package/dist/guards/index.d.mts +3 -3
- package/dist/guards/index.d.mts.map +1 -1
- package/dist/guards/index.mjs +1 -1
- package/dist/{guards-DU1_J9YA.mjs → guards-Ced-uNIF.mjs} +6 -5
- package/dist/guards-Ced-uNIF.mjs.map +1 -0
- package/dist/{http-method.decorator-BrgHMdLQ.mjs → http-method.decorator-CdjKFJZZ.mjs} +7 -6
- package/dist/http-method.decorator-CdjKFJZZ.mjs.map +1 -0
- package/dist/i18n/index.d.mts +238 -3
- package/dist/i18n/index.d.mts.map +1 -0
- package/dist/i18n/index.mjs +39 -3
- package/dist/i18n/index.mjs.map +1 -0
- package/dist/i18n/messages/en/index.d.mts +2 -2
- package/dist/i18n/messages/en/index.mjs +2 -2
- package/dist/i18n/utils/index.d.mts +4 -26
- package/dist/i18n/utils/index.d.mts.map +1 -1
- package/dist/i18n/utils/index.mjs +2 -2
- package/dist/i18n/validation/index.d.mts +3 -2
- package/dist/i18n/validation/index.mjs +4 -2
- package/dist/i18n.module-BlXrtAlV.mjs +219 -0
- package/dist/i18n.module-BlXrtAlV.mjs.map +1 -0
- package/dist/i18n.tokens-hwRpmjRq.mjs +19 -0
- package/dist/i18n.tokens-hwRpmjRq.mjs.map +1 -0
- package/dist/{index-7-hU3GTV.d.mts → index-B4UBK-2T.d.mts} +1 -1
- package/dist/{index-7-hU3GTV.d.mts.map → index-B4UBK-2T.d.mts.map} +1 -1
- package/dist/index-BtlE9RuO.d.mts +124 -0
- package/dist/index-BtlE9RuO.d.mts.map +1 -0
- package/dist/{index-DUzWs0z7.d.mts → index-CW1YHSft.d.mts} +71 -167
- package/dist/index-CW1YHSft.d.mts.map +1 -0
- package/dist/{index-ByOyTmqf.d.mts → index-DEncMcC6.d.mts} +554 -2237
- package/dist/index-DEncMcC6.d.mts.map +1 -0
- package/dist/index-Dj5IMwtr.d.mts +44 -0
- package/dist/index-Dj5IMwtr.d.mts.map +1 -0
- package/dist/{index-C1KvMncZ.d.mts → index-KMgSCSM7.d.mts} +3 -108
- package/dist/index-KMgSCSM7.d.mts.map +1 -0
- package/dist/index.d.mts +5 -43
- package/dist/index.mjs +1 -1
- package/dist/{is-command-C6a7WTPw.mjs → is-command-CX5rAfZW.mjs} +2 -2
- package/dist/{is-command-C6a7WTPw.mjs.map → is-command-CX5rAfZW.mjs.map} +1 -1
- package/dist/{is-seeder-CebjZCDn.mjs → is-seeder-CYCtELlm.mjs} +1 -1
- package/dist/{is-seeder-CebjZCDn.mjs.map → is-seeder-CYCtELlm.mjs.map} +1 -1
- package/dist/logger/index.d.mts +2 -2
- package/dist/logger/index.mjs +170 -2
- package/dist/logger/index.mjs.map +1 -0
- package/dist/macroable/index.d.mts +1 -1
- package/dist/macroable/index.mjs +1 -1
- package/dist/{macroable-BmufBshB.mjs → macroable-DzlfzT50.mjs} +1 -1
- package/dist/{macroable-BmufBshB.mjs.map → macroable-DzlfzT50.mjs.map} +1 -1
- package/dist/metadata-BVkc4aUu.mjs +39 -0
- package/dist/metadata-BVkc4aUu.mjs.map +1 -0
- package/dist/module/index.d.mts +6 -24
- package/dist/module/index.d.mts.map +1 -1
- package/dist/module/index.mjs +2 -2
- package/dist/module-xYoHba6B.mjs +422 -0
- package/dist/module-xYoHba6B.mjs.map +1 -0
- package/dist/openapi/index.d.mts +3 -3
- package/dist/openapi/index.d.mts.map +1 -1
- package/dist/openapi/index.mjs +1 -2
- package/dist/openapi-C6lm0RmV.mjs +483 -0
- package/dist/openapi-C6lm0RmV.mjs.map +1 -0
- package/dist/{openapi.service-Bt9bCIrd.d.mts → openapi.service-CrLlsXAd.d.mts} +3 -3
- package/dist/openapi.service-CrLlsXAd.d.mts.map +1 -0
- package/dist/quarry/index.d.mts +5 -163
- package/dist/quarry/index.d.mts.map +1 -1
- package/dist/quarry/index.mjs +5 -5
- package/dist/quarry/runner.d.mts +184 -0
- package/dist/quarry/runner.d.mts.map +1 -0
- package/dist/quarry/runner.mjs +775 -0
- package/dist/quarry/runner.mjs.map +1 -0
- package/dist/quarry-registry-D4hIGScf.d.mts +69 -0
- package/dist/quarry-registry-D4hIGScf.d.mts.map +1 -0
- package/dist/quarry-registry-DkraZNwn.mjs +311 -0
- package/dist/quarry-registry-DkraZNwn.mjs.map +1 -0
- package/dist/queue/index.d.mts +3 -3
- package/dist/queue/index.mjs +26 -28
- package/dist/queue/index.mjs.map +1 -1
- package/dist/{queue.module-BhCjZp6H.mjs → queue.module-DeWJ0tQM.mjs} +59 -113
- package/dist/queue.module-DeWJ0tQM.mjs.map +1 -0
- package/dist/{r2-storage.provider-DuonKeYm.mjs → r2-storage.provider-Hfm6LdZQ.mjs} +5 -5
- package/dist/r2-storage.provider-Hfm6LdZQ.mjs.map +1 -0
- package/dist/{rate-limit.decorator-6qzNcSOt.mjs → rate-limit.decorator-D69zdZbp.mjs} +6 -11
- package/dist/rate-limit.decorator-D69zdZbp.mjs.map +1 -0
- package/dist/rate-limiter/index.d.mts +11 -50
- package/dist/rate-limiter/index.d.mts.map +1 -1
- package/dist/rate-limiter/index.mjs +16 -30
- package/dist/rate-limiter/index.mjs.map +1 -1
- package/dist/{resend.provider-DB4IlFjG.mjs → resend.provider-Ur6tU7fK.mjs} +7 -7
- package/dist/resend.provider-Ur6tU7fK.mjs.map +1 -0
- package/dist/router/index.d.mts +2 -2
- package/dist/router/index.mjs +8 -7
- package/dist/{i18n.module-CzXLW9Hy.mjs → router-Cy6DjkvP.mjs} +171 -851
- package/dist/router-Cy6DjkvP.mjs.map +1 -0
- package/dist/seeder/index.d.mts +6 -11
- package/dist/seeder/index.d.mts.map +1 -1
- package/dist/seeder/index.mjs +3 -3
- package/dist/{seeder-zoEfEw9i.mjs → seeder-BADTig4n.mjs} +14 -22
- package/dist/seeder-BADTig4n.mjs.map +1 -0
- package/dist/{signed-url-BQPbv2In.mjs → signed-url-BqUqt5dF.mjs} +1 -1
- package/dist/{signed-url-BQPbv2In.mjs.map → signed-url-BqUqt5dF.mjs.map} +1 -1
- package/dist/{smtp.provider-B6D7zuWX.mjs → smtp.provider-C129sNBT.mjs} +6 -6
- package/dist/smtp.provider-C129sNBT.mjs.map +1 -0
- package/dist/storage/index.d.mts +15 -39
- package/dist/storage/index.d.mts.map +1 -1
- package/dist/storage/index.mjs +3 -3
- package/dist/storage/providers/index.d.mts +2 -2
- package/dist/storage/providers/index.mjs +1 -1
- package/dist/{storage-D8CBP72Z.mjs → storage-BA3ppVYM.mjs} +65 -59
- package/dist/storage-BA3ppVYM.mjs.map +1 -0
- package/dist/{storage-provider.interface-Bd6vA4ak.d.mts → storage-provider.interface-DQMtT42e.d.mts} +2 -3
- package/dist/storage-provider.interface-DQMtT42e.d.mts.map +1 -0
- package/dist/storage.error-C6FY037a.mjs +8 -0
- package/dist/storage.error-C6FY037a.mjs.map +1 -0
- package/dist/{stratal-CNwpbSZl.mjs → stratal-Bdq4IdB3.mjs} +31 -185
- package/dist/stratal-Bdq4IdB3.mjs.map +1 -0
- package/dist/stratal-BsKmvP6J.d.mts +43 -0
- package/dist/stratal-BsKmvP6J.d.mts.map +1 -0
- package/dist/{types-cySNS_lp.d.mts → types-BaeHi67f.d.mts} +1 -1
- package/dist/types-BaeHi67f.d.mts.map +1 -0
- package/dist/{usage-generator-BUdlhnCK.mjs → usage-generator-DTqaUMR9.mjs} +6 -3
- package/dist/usage-generator-DTqaUMR9.mjs.map +1 -0
- package/dist/validation-DUzcjb8Q.mjs +49 -0
- package/dist/validation-DUzcjb8Q.mjs.map +1 -0
- package/dist/validation.context-XTysWJ3b.mjs +117 -0
- package/dist/validation.context-XTysWJ3b.mjs.map +1 -0
- package/dist/websocket/index.d.mts +7 -14
- package/dist/websocket/index.d.mts.map +1 -1
- package/dist/websocket/index.mjs +2 -2
- package/dist/workers/index.d.mts +2 -2
- package/dist/workers/index.mjs +3 -2
- package/dist/workers/index.mjs.map +1 -1
- package/dist/{index-Bnpfq6uk.d.mts → zod-DvWTfRpI.d.mts} +58 -133
- package/dist/zod-DvWTfRpI.d.mts.map +1 -0
- package/dist/zod-hMa3rSHV.mjs +72 -0
- package/dist/zod-hMa3rSHV.mjs.map +1 -0
- package/package.json +10 -10
- package/dist/command-BgSlsS4M.mjs.map +0 -1
- package/dist/command-Cmmf0oHX.d.mts.map +0 -1
- package/dist/controller.decorator-B9vwn0zK.mjs.map +0 -1
- package/dist/cron-manager-CmTimEjf.d.mts.map +0 -1
- package/dist/cron-manager-DQSK8uoV.mjs.map +0 -1
- package/dist/en-DSH_bhh6.mjs +0 -308
- package/dist/en-DSH_bhh6.mjs.map +0 -1
- package/dist/env-D1rcZ8_r.d.mts.map +0 -1
- package/dist/errors-COW9-Mar.mjs +0 -1739
- package/dist/errors-COW9-Mar.mjs.map +0 -1
- package/dist/errors-ORxu1-Bb.mjs +0 -74
- package/dist/errors-ORxu1-Bb.mjs.map +0 -1
- package/dist/events-CzCV8jI8.mjs.map +0 -1
- package/dist/gateway-context-CXmXtaUP.mjs.map +0 -1
- package/dist/guards-DU1_J9YA.mjs.map +0 -1
- package/dist/http-method.decorator-BrgHMdLQ.mjs.map +0 -1
- package/dist/i18n.module-CzXLW9Hy.mjs.map +0 -1
- package/dist/index-Bnpfq6uk.d.mts.map +0 -1
- package/dist/index-ByOyTmqf.d.mts.map +0 -1
- package/dist/index-C1KvMncZ.d.mts.map +0 -1
- package/dist/index-DBd_2wv8.d.mts +0 -263
- package/dist/index-DBd_2wv8.d.mts.map +0 -1
- package/dist/index-DUzWs0z7.d.mts.map +0 -1
- package/dist/index.d.mts.map +0 -1
- package/dist/logger-DlV7NtvD.mjs +0 -440
- package/dist/logger-DlV7NtvD.mjs.map +0 -1
- package/dist/module-BzLg57FK.mjs +0 -866
- package/dist/module-BzLg57FK.mjs.map +0 -1
- package/dist/openapi-tools.service-Zs-Ewv7F.mjs +0 -200
- package/dist/openapi-tools.service-Zs-Ewv7F.mjs.map +0 -1
- package/dist/openapi.service-Bt9bCIrd.d.mts.map +0 -1
- package/dist/quarry-registry-BwY2hOxm.mjs +0 -699
- package/dist/quarry-registry-BwY2hOxm.mjs.map +0 -1
- package/dist/queue.module-BhCjZp6H.mjs.map +0 -1
- package/dist/r2-storage.provider-DuonKeYm.mjs.map +0 -1
- package/dist/rate-limit.decorator-6qzNcSOt.mjs.map +0 -1
- package/dist/resend.provider-DB4IlFjG.mjs.map +0 -1
- package/dist/seeder-zoEfEw9i.mjs.map +0 -1
- package/dist/setup-CefZKV_e.mjs +0 -37
- package/dist/setup-CefZKV_e.mjs.map +0 -1
- package/dist/smtp.provider-B6D7zuWX.mjs.map +0 -1
- package/dist/storage-D8CBP72Z.mjs.map +0 -1
- package/dist/storage-provider.interface-Bd6vA4ak.d.mts.map +0 -1
- package/dist/stratal-CNwpbSZl.mjs.map +0 -1
- package/dist/types-cySNS_lp.d.mts.map +0 -1
- package/dist/usage-generator-BUdlhnCK.mjs.map +0 -1
- package/dist/validation-DtJwAv7O.mjs +0 -248
- package/dist/validation-DtJwAv7O.mjs.map +0 -1
|
@@ -1,77 +1,18 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { t as
|
|
1
|
+
import { r as runWithContainer } from "./container-storage-GpNNz79X.mjs";
|
|
2
|
+
import { c as DI_TOKENS, o as ROUTER_TOKENS, t as Container } from "./di-BO1QIb5H.mjs";
|
|
3
|
+
import { JsonFormatter, LOGGER_TOKENS, LoggerService, PrettyFormatter } from "./logger/index.mjs";
|
|
4
|
+
import { a as DefaultExceptionHandler, r as StratalNotInitializedError } from "./errors-BBZTnjdq.mjs";
|
|
5
|
+
import { i as createQueueExceptionContext, n as createCronExceptionContext, t as createCliExceptionContext } from "./exception-context-B4kM-M53.mjs";
|
|
6
|
+
import { a as getGroups, i as getGlobalMiddleware, r as getDefaultEntry, t as ModuleRegistry } from "./module-xYoHba6B.mjs";
|
|
7
|
+
import { r as getListenerHandlers, t as EventRegistry } from "./events-D1KdDaiP.mjs";
|
|
6
8
|
import { CacheModule } from "./cache/index.mjs";
|
|
7
|
-
import { t as CronManager } from "./cron-manager-
|
|
8
|
-
import {
|
|
9
|
-
import { a as
|
|
10
|
-
import { t as
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import "
|
|
14
|
-
import { writeFileSync } from "node:fs";
|
|
15
|
-
import { resolve } from "node:path";
|
|
16
|
-
//#region src/quarry/commands/route-types.command.ts
|
|
17
|
-
let RouteTypesCommand = class RouteTypesCommand extends Command {
|
|
18
|
-
registry;
|
|
19
|
-
localePathService;
|
|
20
|
-
static command = "route:types {--output=src/stratal.d.ts : Output file path}";
|
|
21
|
-
static description = "Generate TypeScript types for named routes";
|
|
22
|
-
constructor(registry, localePathService) {
|
|
23
|
-
super();
|
|
24
|
-
this.registry = registry;
|
|
25
|
-
this.localePathService = localePathService;
|
|
26
|
-
}
|
|
27
|
-
handle() {
|
|
28
|
-
const outputPath = resolve(this.string("output") || "src/stratal.d.ts");
|
|
29
|
-
const namedRoutes = this.registry.named();
|
|
30
|
-
if (namedRoutes.length === 0) {
|
|
31
|
-
this.warn("No named routes found. Add name to your @Route() or @Get()/@Post() decorators.");
|
|
32
|
-
return 0;
|
|
33
|
-
}
|
|
34
|
-
writeFileSync(outputPath, this.generateDeclaration(namedRoutes), "utf-8");
|
|
35
|
-
this.info(`Generated route types for ${namedRoutes.length} named routes → ${outputPath}`);
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Generate the StratalRouteMap declaration content.
|
|
39
|
-
*/
|
|
40
|
-
generateDeclaration(routes) {
|
|
41
|
-
const localeConfig = this.localePathService.enabled ? this.localePathService.localePathConfig : null;
|
|
42
|
-
const localeType = localeConfig ? localeConfig.allLocales.map((l) => `'${l}'`).join(" | ") : null;
|
|
43
|
-
const localeOptional = localeConfig ? this.localePathService.prefixDefaultLocale !== true : false;
|
|
44
|
-
const entries = routes.filter((r) => r.name !== void 0).sort((a, b) => a.name.localeCompare(b.name)).map((route) => {
|
|
45
|
-
const paramEntries = [...route.paramNames.map((p) => `${p}: string`), ...route.domainParamNames.map((p) => `${p}: string`)];
|
|
46
|
-
if (localeType && route.localePaths?.length) {
|
|
47
|
-
const optionalMarker = localeOptional ? "?" : "";
|
|
48
|
-
paramEntries.push(`locale${optionalMarker}: StratalLocale`);
|
|
49
|
-
}
|
|
50
|
-
const indexSignature = localeType && route.localePaths?.length ? "[key: string]: string | StratalLocale | undefined" : "[key: string]: string | undefined";
|
|
51
|
-
paramEntries.push(indexSignature);
|
|
52
|
-
const paramsType = `{ ${paramEntries.join("; ")} }`;
|
|
53
|
-
return ` '${route.name}': { params: ${paramsType} }`;
|
|
54
|
-
}).join("\n");
|
|
55
|
-
const lines = ["// Auto-generated by `quarry route:types` — do not edit manually", "declare module 'stratal/router' {"];
|
|
56
|
-
if (localeType) {
|
|
57
|
-
lines.push(` type StratalLocale = ${localeType}`);
|
|
58
|
-
lines.push("");
|
|
59
|
-
}
|
|
60
|
-
lines.push(" interface StratalRouteMap {", entries, " }", "}");
|
|
61
|
-
return [
|
|
62
|
-
...lines,
|
|
63
|
-
"",
|
|
64
|
-
"export {}",
|
|
65
|
-
""
|
|
66
|
-
].join("\n");
|
|
67
|
-
}
|
|
68
|
-
};
|
|
69
|
-
RouteTypesCommand = __decorate([
|
|
70
|
-
__decorateParam(0, inject(ROUTER_TOKENS.RouteRegistry)),
|
|
71
|
-
__decorateParam(1, inject(ROUTER_TOKENS.LocalePathService)),
|
|
72
|
-
__decorateMetadata("design:paramtypes", [Object, Object])
|
|
73
|
-
], RouteTypesCommand);
|
|
74
|
-
//#endregion
|
|
9
|
+
import { t as CronManager } from "./cron-manager-9bpN9bu4.mjs";
|
|
10
|
+
import { n as OpenAPIModule } from "./openapi-C6lm0RmV.mjs";
|
|
11
|
+
import { a as RouteRegistry, d as RouteRegistrationService, n as Uri, o as VersioningService, s as LocalePathService, u as HonoApp } from "./router-Cy6DjkvP.mjs";
|
|
12
|
+
import { t as I18nModule } from "./i18n.module-BlXrtAlV.mjs";
|
|
13
|
+
import { t as QuarryRegistry } from "./quarry-registry-DkraZNwn.mjs";
|
|
14
|
+
import { t as QueueModule } from "./queue.module-DeWJ0tQM.mjs";
|
|
15
|
+
import { i as SeederRegistry, r as SEEDER_TOKENS } from "./seeder-BADTig4n.mjs";
|
|
75
16
|
//#region src/router/router-resolver.ts
|
|
76
17
|
/**
|
|
77
18
|
* Internal resolver that computes the effective Router config for each controller.
|
|
@@ -157,30 +98,7 @@ var RouterResolver = class {
|
|
|
157
98
|
};
|
|
158
99
|
//#endregion
|
|
159
100
|
//#region src/application.ts
|
|
160
|
-
/**
|
|
161
|
-
* Application
|
|
162
|
-
*
|
|
163
|
-
* Main application class managing the two-tier container hierarchy:
|
|
164
|
-
* - Global Container: All services (singletons via tsyringe native)
|
|
165
|
-
* - Request Container: Child of global, context-enriched instances per request
|
|
166
|
-
*
|
|
167
|
-
* @example
|
|
168
|
-
* ```typescript
|
|
169
|
-
* const app = new Application({ module: AppModule, env, ctx })
|
|
170
|
-
* await app.initialize()
|
|
171
|
-
*
|
|
172
|
-
* // Access container via getter
|
|
173
|
-
* const service = app.container.resolve(MY_TOKEN)
|
|
174
|
-
*
|
|
175
|
-
* // Handle HTTP request (via HonoApp)
|
|
176
|
-
* // Handle queue batch
|
|
177
|
-
* await app.handleQueue(batch, 'my-queue')
|
|
178
|
-
* ```
|
|
179
|
-
*/
|
|
180
101
|
var Application = class {
|
|
181
|
-
/**
|
|
182
|
-
* Unified Container - manages all DI operations
|
|
183
|
-
*/
|
|
184
102
|
_container;
|
|
185
103
|
honoApp;
|
|
186
104
|
moduleRegistry;
|
|
@@ -195,37 +113,24 @@ var Application = class {
|
|
|
195
113
|
constructor({ env, ctx, ...config }) {
|
|
196
114
|
this.env = env;
|
|
197
115
|
this.appConfig = config;
|
|
198
|
-
|
|
199
|
-
this._container = new Container({ container: container.createChildContainer() });
|
|
116
|
+
this._container = new Container();
|
|
200
117
|
this._container.registerValue(DI_TOKENS.Application, this);
|
|
201
118
|
this._container.registerValue(DI_TOKENS.CloudflareEnv, env);
|
|
202
119
|
this._container.registerValue(DI_TOKENS.ExecutionContext, ctx);
|
|
120
|
+
this._container.registerValue(ROUTER_TOKENS.RouterContext, null);
|
|
203
121
|
this.registerLoggerService();
|
|
204
122
|
this.registerCoreServices();
|
|
205
123
|
const logger = this._container.resolve(LOGGER_TOKENS.LoggerService);
|
|
206
124
|
this.moduleRegistry = new ModuleRegistry(this._container, logger);
|
|
207
125
|
this._container.registerValue(DI_TOKENS.ModuleRegistry, this.moduleRegistry);
|
|
208
126
|
}
|
|
209
|
-
/**
|
|
210
|
-
* Get the Container instance
|
|
211
|
-
*/
|
|
212
127
|
get container() {
|
|
213
128
|
return this._container;
|
|
214
129
|
}
|
|
215
|
-
/**
|
|
216
|
-
* Lazily initialize routing and return the HonoApp instance.
|
|
217
|
-
*
|
|
218
|
-
* Routing (service registration, HonoApp resolution, route configuration)
|
|
219
|
-
* is deferred so that `scheduled` and `queue` handlers don't pay the CPU
|
|
220
|
-
* cost of route setup on cold start.
|
|
221
|
-
*/
|
|
222
130
|
async ensureHono() {
|
|
223
131
|
await this.initializeRouting();
|
|
224
132
|
return this.honoApp;
|
|
225
133
|
}
|
|
226
|
-
/**
|
|
227
|
-
* Get the application configuration
|
|
228
|
-
*/
|
|
229
134
|
get config() {
|
|
230
135
|
return this.appConfig;
|
|
231
136
|
}
|
|
@@ -242,45 +147,31 @@ var Application = class {
|
|
|
242
147
|
this.moduleRegistry.register(this.appConfig.module);
|
|
243
148
|
await this.moduleRegistry.initialize();
|
|
244
149
|
this.initializeExceptionHandler();
|
|
245
|
-
this.consumerRegistry = this._container.resolve(DI_TOKENS.ConsumerRegistry);
|
|
246
150
|
this.cronManager = this._container.resolve(DI_TOKENS.Cron);
|
|
247
|
-
this.quarry = this._container.resolve(DI_TOKENS.Quarry);
|
|
248
151
|
this.registerCronJobs();
|
|
249
152
|
this.registerSeeders();
|
|
250
153
|
this.registerCommands();
|
|
251
154
|
this.initialized = true;
|
|
252
155
|
}
|
|
253
|
-
/**
|
|
254
|
-
* Register routing services as singletons in the container.
|
|
255
|
-
* Called after module initialization so I18N_TOKENS.Options is available.
|
|
256
|
-
*/
|
|
257
156
|
registerRoutingServices() {
|
|
258
|
-
this._container.register(ROUTER_TOKENS.VersioningService, VersioningService
|
|
259
|
-
this._container.register(ROUTER_TOKENS.HonoApp, HonoApp
|
|
260
|
-
this._container.register(ROUTER_TOKENS.LocalePathService, LocalePathService
|
|
261
|
-
this._container.register(ROUTER_TOKENS.RouteRegistry, RouteRegistry
|
|
262
|
-
this._container.register(ROUTER_TOKENS.Uri, Uri
|
|
157
|
+
this._container.register(ROUTER_TOKENS.VersioningService, VersioningService);
|
|
158
|
+
this._container.register(ROUTER_TOKENS.HonoApp, HonoApp);
|
|
159
|
+
this._container.register(ROUTER_TOKENS.LocalePathService, LocalePathService);
|
|
160
|
+
this._container.register(ROUTER_TOKENS.RouteRegistry, RouteRegistry);
|
|
161
|
+
this._container.register(ROUTER_TOKENS.Uri, Uri);
|
|
263
162
|
const routerConfigs = this.moduleRegistry.getAllRouterConfigs();
|
|
264
|
-
|
|
265
|
-
this._container.registerValue(ROUTER_TOKENS.RouterResolver, routerResolver);
|
|
163
|
+
if (routerConfigs.length > 0) this._container.registerValue(ROUTER_TOKENS.RouterResolver, new RouterResolver(routerConfigs));
|
|
266
164
|
this._container.register(RouteRegistrationService, RouteRegistrationService);
|
|
267
165
|
}
|
|
268
|
-
|
|
269
|
-
* Wire up queue consumers and event listeners.
|
|
270
|
-
* Called lazily on first fetch/queue — not during scheduled handling.
|
|
271
|
-
*/
|
|
272
|
-
initializeHandlers() {
|
|
166
|
+
async initializeHandlers() {
|
|
273
167
|
this.handlerInitPromise ??= runWithContainer(this._container, () => {
|
|
168
|
+
this.consumerRegistry = this._container.resolve(DI_TOKENS.ConsumerRegistry);
|
|
274
169
|
this.registerQueueConsumers();
|
|
275
170
|
this.registerEventListeners();
|
|
276
171
|
return Promise.resolve();
|
|
277
172
|
});
|
|
278
173
|
return this.handlerInitPromise;
|
|
279
174
|
}
|
|
280
|
-
/**
|
|
281
|
-
* Register routing services, resolve HonoApp, and configure routes.
|
|
282
|
-
* Called lazily on first fetch — not during scheduled/queue handling.
|
|
283
|
-
*/
|
|
284
175
|
initializeRouting() {
|
|
285
176
|
this.routingInitPromise ??= runWithContainer(this._container, async () => {
|
|
286
177
|
await this.initializeHandlers();
|
|
@@ -291,9 +182,6 @@ var Application = class {
|
|
|
291
182
|
});
|
|
292
183
|
return this.routingInitPromise;
|
|
293
184
|
}
|
|
294
|
-
/**
|
|
295
|
-
* Resolve a service from the container
|
|
296
|
-
*/
|
|
297
185
|
resolve(token) {
|
|
298
186
|
try {
|
|
299
187
|
return this._container.resolve(token);
|
|
@@ -304,9 +192,6 @@ var Application = class {
|
|
|
304
192
|
throw error;
|
|
305
193
|
}
|
|
306
194
|
}
|
|
307
|
-
/**
|
|
308
|
-
* Handle queue batch processing
|
|
309
|
-
*/
|
|
310
195
|
async handleQueue(batch, queueName) {
|
|
311
196
|
await this.initializeHandlers();
|
|
312
197
|
const locale = (batch.messages[0]?.body)?.metadata?.locale ?? "en";
|
|
@@ -320,10 +205,8 @@ var Application = class {
|
|
|
320
205
|
}
|
|
321
206
|
});
|
|
322
207
|
}
|
|
323
|
-
/**
|
|
324
|
-
* Handle scheduled cron trigger
|
|
325
|
-
*/
|
|
326
208
|
async handleScheduled(controller) {
|
|
209
|
+
await this.initializeHandlers();
|
|
327
210
|
const mockRouterContext = this.createMockRouterContext("en");
|
|
328
211
|
await this._container.runInRequestScope(mockRouterContext, async (requestContainer) => {
|
|
329
212
|
try {
|
|
@@ -334,9 +217,6 @@ var Application = class {
|
|
|
334
217
|
}
|
|
335
218
|
});
|
|
336
219
|
}
|
|
337
|
-
/**
|
|
338
|
-
* Create mock RouterContext for queue/cron/seeder processing
|
|
339
|
-
*/
|
|
340
220
|
createMockRouterContext(locale = "en") {
|
|
341
221
|
return {
|
|
342
222
|
getLocale: () => locale,
|
|
@@ -349,39 +229,19 @@ var Application = class {
|
|
|
349
229
|
this.initialized = false;
|
|
350
230
|
await this.moduleRegistry.shutdown();
|
|
351
231
|
this._container.resolve(LOGGER_TOKENS.LoggerService).info("Disposing container...");
|
|
352
|
-
|
|
232
|
+
this._container.dispose();
|
|
353
233
|
}
|
|
354
|
-
/**
|
|
355
|
-
* Execute a command by name in a request-scoped container.
|
|
356
|
-
*/
|
|
357
234
|
async handleCommand(name, input) {
|
|
358
235
|
await this.initializeRouting();
|
|
236
|
+
this.quarry ??= this._container.resolve(DI_TOKENS.Quarry);
|
|
359
237
|
const mockContext = this.createMockRouterContext("en");
|
|
360
238
|
return this._container.runInRequestScope(mockContext, async () => {
|
|
361
239
|
return this.quarry.call(name, input);
|
|
362
240
|
});
|
|
363
241
|
}
|
|
364
242
|
registerCommands() {
|
|
365
|
-
|
|
366
|
-
HelpCommand,
|
|
367
|
-
DbSeedCommand,
|
|
368
|
-
DbSeedListCommand,
|
|
369
|
-
RouteListCommand,
|
|
370
|
-
RouteTypesCommand,
|
|
371
|
-
EventListCommand,
|
|
372
|
-
ScheduleListCommand,
|
|
373
|
-
QueueListCommand,
|
|
374
|
-
McpServeCommand,
|
|
375
|
-
McpToolsCommand,
|
|
376
|
-
ApiCommand
|
|
377
|
-
];
|
|
378
|
-
for (const Cmd of builtinCommands) {
|
|
379
|
-
injectable()(Cmd);
|
|
380
|
-
this._container.register(Cmd, Cmd, Scope.Singleton);
|
|
381
|
-
this.quarry.register(Cmd);
|
|
382
|
-
}
|
|
243
|
+
this.quarry ??= this._container.resolve(DI_TOKENS.Quarry);
|
|
383
244
|
const commands = this.moduleRegistry.getAllCommands();
|
|
384
|
-
if (commands.length === 0) return;
|
|
385
245
|
for (const CommandClass of commands) this.quarry.register(CommandClass);
|
|
386
246
|
}
|
|
387
247
|
registerSeeders() {
|
|
@@ -398,13 +258,10 @@ var Application = class {
|
|
|
398
258
|
}
|
|
399
259
|
registerCronJobs() {
|
|
400
260
|
for (const JobClass of this.moduleRegistry.getAllJobs()) {
|
|
401
|
-
const
|
|
402
|
-
this.cronManager.registerJob(
|
|
261
|
+
const schedule = JobClass.schedule;
|
|
262
|
+
if (schedule) this.cronManager.registerJob(schedule, JobClass);
|
|
403
263
|
}
|
|
404
264
|
}
|
|
405
|
-
/**
|
|
406
|
-
* Auto-wire `@Listener()` classes with the EventRegistry.
|
|
407
|
-
*/
|
|
408
265
|
registerEventListeners() {
|
|
409
266
|
const listeners = this.moduleRegistry.getAllListeners();
|
|
410
267
|
if (listeners.length === 0) return;
|
|
@@ -415,21 +272,13 @@ var Application = class {
|
|
|
415
272
|
for (const { methodName, event, options } of handlers) eventRegistry.on(event, instance[methodName].bind(instance), options);
|
|
416
273
|
}
|
|
417
274
|
}
|
|
418
|
-
/**
|
|
419
|
-
* Register LoggerService and dependencies
|
|
420
|
-
*/
|
|
421
275
|
registerLoggerService() {
|
|
422
276
|
const logLevel = this.appConfig.logging?.level ?? "info";
|
|
423
277
|
const formatter = this.appConfig.logging?.formatter ?? "json";
|
|
424
278
|
this._container.registerValue(LOGGER_TOKENS.LogLevelOptions, logLevel);
|
|
425
279
|
this._container.when(() => formatter === "pretty").use(LOGGER_TOKENS.Formatter).give(PrettyFormatter).otherwise(JsonFormatter);
|
|
426
|
-
this._container.registerSingleton(LOGGER_TOKENS.ConsoleTransport, ConsoleTransport);
|
|
427
|
-
this._container.registerFactory(LOGGER_TOKENS.Transports, (c) => [c.resolve(LOGGER_TOKENS.ConsoleTransport)]);
|
|
428
280
|
this._container.registerSingleton(LOGGER_TOKENS.LoggerService, LoggerService);
|
|
429
281
|
}
|
|
430
|
-
/**
|
|
431
|
-
* Register core services with explicit scope
|
|
432
|
-
*/
|
|
433
282
|
registerCoreServices() {
|
|
434
283
|
this._container.registerSingleton(DI_TOKENS.Cron, CronManager);
|
|
435
284
|
this._container.registerSingleton(DI_TOKENS.ExceptionHandler, this.appConfig.exceptionHandler ?? DefaultExceptionHandler);
|
|
@@ -437,9 +286,6 @@ var Application = class {
|
|
|
437
286
|
this._container.registerSingleton(DI_TOKENS.Quarry, QuarryRegistry);
|
|
438
287
|
this._container.registerValue(SEEDER_TOKENS.SeederRegistry, new SeederRegistry(this));
|
|
439
288
|
}
|
|
440
|
-
/**
|
|
441
|
-
* Initialize the ExceptionHandler: call register(), then module onException hooks.
|
|
442
|
-
*/
|
|
443
289
|
initializeExceptionHandler() {
|
|
444
290
|
const handler = this._container.resolve(DI_TOKENS.ExceptionHandler);
|
|
445
291
|
handler.register();
|
|
@@ -532,4 +378,4 @@ var Stratal = class Stratal {
|
|
|
532
378
|
//#endregion
|
|
533
379
|
export { Application as n, Stratal as t };
|
|
534
380
|
|
|
535
|
-
//# sourceMappingURL=stratal-
|
|
381
|
+
//# sourceMappingURL=stratal-Bdq4IdB3.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stratal-Bdq4IdB3.mjs","names":["internal.getGroups","internal.getDefaultEntry","internal.getGlobalMiddleware"],"sources":["../src/router/router-resolver.ts","../src/application.ts","../src/stratal.ts"],"sourcesContent":["import type { ZodObject } from '../i18n/validation/zod'\nimport type { Constructor } from '../types'\nimport type { Middleware } from './middleware.interface'\nimport type { Router, RouterEntry } from './router'\nimport * as internal from './router.internals'\n\n/**\n * Resolved configuration for a single controller.\n * Merges Router default entry, sub-group overrides, and inheritance rules.\n */\nexport interface ResolvedRouterConfig {\n prefix?: string\n domain?: string\n name?: string\n middleware: Constructor<Middleware>[]\n version?: string | string[]\n hideFromDocs?: boolean\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- ZodObject generics require any for flexible shape parameter\n params?: ZodObject<any>\n}\n\n/**\n * Internal resolver that computes the effective Router config for each controller.\n *\n * Inheritance rules:\n * - `middleware`: parent middleware runs first, then child (concatenated)\n * - `prefix`: concatenated (parent + child)\n * - `name`: concatenated (parent + child)\n * - `domain`: child overrides parent\n * - `version`: child overrides parent\n * - `hideFromDocs`: child overrides parent\n *\n * @internal — not exported from stratal/router\n */\nexport class RouterResolver {\n private readonly routers: { router: Router; controllers: Constructor[] }[]\n\n constructor(routers: { router: Router; controllers: Constructor[] }[]) {\n this.routers = routers\n }\n\n /**\n * Resolve the effective config for a given controller class.\n * Searches through all module routers to find the one owning this controller.\n */\n resolveForController(controller: Constructor): ResolvedRouterConfig {\n for (const { router, controllers: moduleControllers } of this.routers) {\n if (!moduleControllers.includes(controller)) continue\n\n // Check if controller is in a sub-group\n for (const group of router[internal.getGroups]()) {\n if (group.controllers?.includes(controller)) {\n return this.mergeEntries(router[internal.getDefaultEntry](), group)\n }\n }\n\n // Controller is in the default scope (not in any sub-group)\n // But only if it's not claimed by any sub-group in this module\n const groupedControllers = new Set(\n router[internal.getGroups]().flatMap(g => g.controllers ?? [])\n )\n if (!groupedControllers.has(controller)) {\n return this.entryToConfig(router[internal.getDefaultEntry]())\n }\n }\n\n // Controller not found in any module's router — return empty config\n return { middleware: [] }\n }\n\n /**\n * Collect all global middleware registered via `router.use()` across all modules.\n */\n getGlobalMiddleware(): Constructor<Middleware>[] {\n const global: Constructor<Middleware>[] = []\n for (const { router } of this.routers) {\n global.push(...router[internal.getGlobalMiddleware]())\n }\n return global\n }\n\n /**\n * Merge parent default entry with child group entry following inheritance rules.\n */\n private mergeEntries(parent: RouterEntry, child: RouterEntry): ResolvedRouterConfig {\n return {\n // Concatenate: parent prefix + child prefix\n prefix: this.concatPrefixes(parent.prefix, child.prefix),\n // Override: child domain wins\n domain: child.domain ?? parent.domain,\n // Concatenate: parent name + child name\n name: this.concatNames(parent.name, child.name),\n // Concatenate: parent middleware first, then child\n middleware: [...parent.middleware, ...child.middleware],\n // Override: child version wins\n version: child.version ?? parent.version,\n // Override: child hideFromDocs wins\n hideFromDocs: child.hideFromDocs ?? parent.hideFromDocs,\n // Extend: parent params extended with child params\n params: this.mergeParams(parent.params, child.params),\n }\n }\n\n private entryToConfig(entry: RouterEntry): ResolvedRouterConfig {\n return {\n prefix: entry.prefix,\n domain: entry.domain,\n name: entry.name,\n middleware: [...entry.middleware],\n version: entry.version,\n hideFromDocs: entry.hideFromDocs,\n params: entry.params,\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- ZodObject generics require any for flexible shape parameter\n private mergeParams(parent?: ZodObject<any>, child?: ZodObject<any>): ZodObject<any> | undefined {\n if (!parent && !child) return undefined\n if (!parent) return child\n if (!child) return parent\n // oxlint-disable-next-line typescript/no-explicit-any\n return parent.extend(child.shape) as ZodObject<any>\n }\n\n private concatPrefixes(parent?: string, child?: string): string | undefined {\n if (!parent && !child) return undefined\n if (!parent) return child\n if (!child) return parent\n // Normalize: remove trailing slash from parent, ensure child starts with /\n const p = parent.endsWith('/') ? parent.slice(0, -1) : parent\n const c = child.startsWith('/') ? child : `/${child}`\n return `${p}${c}`\n }\n\n private concatNames(parent?: string, child?: string): string | undefined {\n if (!parent && !child) return undefined\n if (!parent) return child\n if (!child) return parent\n return `${parent}${child}`\n }\n}\n","import { CacheModule } from './cache'\nimport type { CronJob } from './cron/cron-job'\nimport { CronManager } from './cron/cron-manager'\nimport { Container } from './di/container'\nimport { runWithContainer } from './di/container-storage'\nimport { DI_TOKENS } from './di/tokens'\nimport { type StratalEnv } from './env'\nimport { DefaultExceptionHandler } from './errors/default-exception-handler'\nimport { createCliExceptionContext, createCronExceptionContext, createQueueExceptionContext } from './errors/exception-context'\nimport type { ExceptionHandler } from './errors/exception-handler'\nimport type { EventHandler } from './events'\nimport { EventRegistry, getListenerHandlers } from './events'\nimport type { StratalExecutionContext } from './execution-context'\nimport { I18nModule } from './i18n/i18n.module'\nimport { JsonFormatter, LOGGER_TOKENS, LoggerService, LogLevel, PrettyFormatter } from './logger'\nimport { ModuleRegistry } from './module/module-registry'\nimport type { DynamicModule, ModuleClass } from './module/types'\nimport { OpenAPIModule } from './openapi'\nimport type { Command } from './quarry/command'\nimport { QuarryRegistry } from './quarry/quarry-registry'\nimport type { CommandInput, CommandResult } from './quarry/types'\nimport { type ConsumerRegistry } from './queue/consumer-registry'\nimport type { IQueueConsumer, QueueMessage } from './queue/queue-consumer'\nimport { type QueueManager } from './queue/queue-manager'\nimport { QueueModule } from './queue/queue.module'\nimport { type RouterContext } from './router'\nimport { HonoApp } from './router/hono-app'\nimport { RouteRegistry } from './router/route-registry'\nimport { RouterResolver } from './router/router-resolver'\nimport { ROUTER_TOKENS } from './router/router.tokens'\nimport { LocalePathService } from './router/services/locale-path.service'\nimport { RouteRegistrationService } from './router/services/route-registration.service'\nimport { VersioningService } from './router/services/versioning.service'\nimport type { TrailingSlashMode, VersioningOptions } from './router/types'\nimport { Uri } from './router/uri'\nimport { SEEDER_TOKENS, SeederRegistry, type Seeder } from './seeder'\nimport type { Constructor } from './types'\n\nexport interface ApplicationConfig {\n module: ModuleClass | DynamicModule\n logging?: {\n level?: LogLevel\n formatter?: 'json' | 'pretty'\n }\n versioning?: VersioningOptions\n trailingSlash?: TrailingSlashMode\n exceptionHandler?: Constructor<ExceptionHandler>\n}\n\nexport interface ApplicationOptions extends ApplicationConfig {\n env: StratalEnv\n ctx: StratalExecutionContext\n}\n\nexport class Application {\n private _container: Container\n private honoApp!: HonoApp\n private moduleRegistry: ModuleRegistry\n private consumerRegistry!: ConsumerRegistry\n private cronManager!: CronManager\n private quarry!: QuarryRegistry\n private initialized = false\n private routingInitPromise: Promise<void> | null = null\n private handlerInitPromise: Promise<void> | null = null\n\n readonly env: StratalEnv\n private readonly appConfig: ApplicationConfig\n\n constructor({ env, ctx, ...config }: ApplicationOptions) {\n this.env = env\n this.appConfig = config\n\n this._container = new Container()\n\n this._container.registerValue(DI_TOKENS.Application, this)\n this._container.registerValue(DI_TOKENS.CloudflareEnv, env)\n this._container.registerValue(DI_TOKENS.ExecutionContext, ctx)\n this._container.registerValue(ROUTER_TOKENS.RouterContext, null)\n\n this.registerLoggerService()\n this.registerCoreServices()\n\n const logger = this._container.resolve<LoggerService>(LOGGER_TOKENS.LoggerService)\n this.moduleRegistry = new ModuleRegistry(this._container, logger)\n\n this._container.registerValue(DI_TOKENS.ModuleRegistry, this.moduleRegistry)\n }\n\n get container(): Container {\n return this._container\n }\n\n async ensureHono(): Promise<HonoApp> {\n await this.initializeRouting()\n return this.honoApp\n }\n\n get config(): ApplicationConfig {\n return this.appConfig\n }\n\n async initialize(): Promise<void> {\n if (this.initialized) {\n return\n }\n\n await runWithContainer(this._container, () => this.initializeInternal())\n }\n\n private async initializeInternal(): Promise<void> {\n // Phase 1: Register core infrastructure modules\n this.moduleRegistry.registerAll([\n I18nModule,\n QueueModule,\n CacheModule,\n ])\n\n // Phase 2: Register user's root module (traverses imports)\n this.moduleRegistry.register(this.appConfig.module)\n\n // Phase 3: Initialize all modules (only those with lifecycle hooks)\n await this.moduleRegistry.initialize()\n\n // Phase 3.5: Initialize ExceptionHandler\n this.initializeExceptionHandler()\n\n // Phase 4: Resolve lightweight managers (CronManager only — others deferred)\n this.cronManager = this._container.resolve<CronManager>(DI_TOKENS.Cron)\n\n // Phase 5: Register cron jobs (static schedule, no resolve), seeders, commands\n this.registerCronJobs()\n this.registerSeeders()\n this.registerCommands()\n\n this.initialized = true\n }\n\n private registerRoutingServices(): void {\n this._container.register(ROUTER_TOKENS.VersioningService, VersioningService)\n this._container.register(ROUTER_TOKENS.HonoApp, HonoApp)\n this._container.register(ROUTER_TOKENS.LocalePathService, LocalePathService)\n this._container.register(ROUTER_TOKENS.RouteRegistry, RouteRegistry)\n this._container.register(ROUTER_TOKENS.Uri, Uri)\n\n const routerConfigs = this.moduleRegistry.getAllRouterConfigs()\n if (routerConfigs.length > 0) {\n this._container.registerValue(ROUTER_TOKENS.RouterResolver, new RouterResolver(routerConfigs))\n }\n\n this._container.register(RouteRegistrationService, RouteRegistrationService)\n }\n\n async initializeHandlers(): Promise<void> {\n this.handlerInitPromise ??= runWithContainer(this._container, () => {\n // Resolve ConsumerRegistry lazily (deferred from Phase 4)\n this.consumerRegistry = this._container.resolve<ConsumerRegistry>(DI_TOKENS.ConsumerRegistry)\n this.registerQueueConsumers()\n this.registerEventListeners()\n return Promise.resolve()\n })\n return this.handlerInitPromise\n }\n\n private initializeRouting(): Promise<void> {\n this.routingInitPromise ??= runWithContainer(this._container, async () => {\n await this.initializeHandlers()\n this.moduleRegistry.register(OpenAPIModule as unknown as ModuleClass)\n this.registerRoutingServices()\n this.honoApp = this._container.resolve<HonoApp>(ROUTER_TOKENS.HonoApp)\n await this.honoApp.configure()\n })\n return this.routingInitPromise\n }\n\n resolve<T>(token: symbol): T {\n try {\n return this._container.resolve(token)\n } catch (error) {\n const handler = this._container.resolve<ExceptionHandler>(DI_TOKENS.ExceptionHandler)\n const ctx = createCliExceptionContext('resolve')\n void handler.handle(error, ctx)\n throw error\n }\n }\n\n async handleQueue(batch: MessageBatch, queueName: string): Promise<void> {\n await this.initializeHandlers()\n\n const firstMessage = batch.messages[0]?.body as QueueMessage | undefined\n const locale = firstMessage?.metadata?.locale ?? 'en'\n const mockRouterContext = this.createMockRouterContext(locale)\n\n await this._container.runInRequestScope(mockRouterContext, async (requestContainer) => {\n try {\n const queueManager = requestContainer.resolve<QueueManager>(DI_TOKENS.Queue)\n await queueManager.processBatch(queueName, batch)\n } catch (error) {\n const handler = requestContainer.resolve<ExceptionHandler>(DI_TOKENS.ExceptionHandler)\n await handler.handle(error, createQueueExceptionContext(queueName))\n throw error\n }\n })\n }\n\n async handleScheduled(controller: ScheduledController): Promise<void> {\n await this.initializeHandlers()\n\n const mockRouterContext = this.createMockRouterContext('en')\n\n await this._container.runInRequestScope(mockRouterContext, async (requestContainer) => {\n try {\n await this.cronManager.executeScheduled(controller, requestContainer)\n } catch (error) {\n const handler = requestContainer.resolve<ExceptionHandler>(DI_TOKENS.ExceptionHandler)\n await handler.handle(error, createCronExceptionContext())\n throw error\n }\n })\n }\n\n createMockRouterContext(locale = 'en'): RouterContext {\n return {\n getLocale: () => locale,\n setLocale: () => { /* no-op */ },\n getContainer: () => this._container,\n } as unknown as RouterContext\n }\n\n async shutdown(): Promise<void> {\n if (!this.initialized) return\n this.initialized = false\n\n await this.moduleRegistry.shutdown()\n\n const logger = this._container.resolve<LoggerService>(LOGGER_TOKENS.LoggerService)\n logger.info('Disposing container...')\n\n this._container.dispose()\n }\n\n async handleCommand(name: string, input?: CommandInput): Promise<CommandResult> {\n await this.initializeRouting()\n // Resolve QuarryRegistry lazily (deferred from Phase 4)\n this.quarry ??= this._container.resolve<QuarryRegistry>(DI_TOKENS.Quarry)\n const mockContext = this.createMockRouterContext('en')\n return this._container.runInRequestScope(mockContext, async () => {\n return this.quarry.call(name, input)\n })\n }\n\n private registerCommands(): void {\n this.quarry ??= this._container.resolve<QuarryRegistry>(DI_TOKENS.Quarry)\n const commands = this.moduleRegistry.getAllCommands()\n for (const CommandClass of commands) {\n this.quarry.register(CommandClass as Constructor<Command>)\n }\n }\n\n private registerSeeders(): void {\n const seeders = this.moduleRegistry.getAllSeeders()\n if (seeders.length === 0) return\n const registry = this._container.resolve<SeederRegistry>(SEEDER_TOKENS.SeederRegistry)\n for (const SeederClass of seeders) {\n registry.register(SeederClass as Constructor<Seeder>)\n }\n }\n\n private registerQueueConsumers(): void {\n for (const ConsumerClass of this.moduleRegistry.getAllConsumers()) {\n const consumer = this._container.resolve(ConsumerClass) as IQueueConsumer\n this.consumerRegistry.register(consumer)\n }\n }\n\n private registerCronJobs(): void {\n for (const JobClass of this.moduleRegistry.getAllJobs()) {\n const schedule = (JobClass as unknown as { schedule: string }).schedule\n if (schedule) {\n this.cronManager.registerJob(schedule, JobClass as Constructor<CronJob>)\n }\n }\n }\n\n private registerEventListeners(): void {\n const listeners = this.moduleRegistry.getAllListeners()\n if (listeners.length === 0) {\n return\n }\n\n const eventRegistry = this._container.resolve<EventRegistry>(DI_TOKENS.EventRegistry)\n\n for (const ListenerClass of listeners) {\n const instance = this._container.resolve(ListenerClass) as Record<string, ((...args: unknown[]) => unknown)>\n const handlers = getListenerHandlers(ListenerClass)\n\n for (const { methodName, event, options } of handlers) {\n eventRegistry.on(event, instance[methodName].bind(instance) as EventHandler, options)\n }\n }\n }\n\n private registerLoggerService(): void {\n const logLevel = this.appConfig.logging?.level ?? LogLevel.INFO\n const formatter = this.appConfig.logging?.formatter ?? 'json'\n\n this._container.registerValue(LOGGER_TOKENS.LogLevelOptions, logLevel)\n\n this._container\n .when(() => formatter === 'pretty')\n .use(LOGGER_TOKENS.Formatter)\n .give(PrettyFormatter)\n .otherwise(JsonFormatter)\n\n this._container.registerSingleton(LOGGER_TOKENS.LoggerService, LoggerService)\n }\n\n private registerCoreServices(): void {\n this._container.registerSingleton(DI_TOKENS.Cron, CronManager)\n this._container.registerSingleton(\n DI_TOKENS.ExceptionHandler,\n (this.appConfig.exceptionHandler ?? DefaultExceptionHandler) as Constructor,\n )\n this._container.registerSingleton(DI_TOKENS.EventRegistry, EventRegistry)\n this._container.registerSingleton(DI_TOKENS.Quarry, QuarryRegistry)\n this._container.registerValue(SEEDER_TOKENS.SeederRegistry, new SeederRegistry(this))\n }\n\n private initializeExceptionHandler(): void {\n const handler = this._container.resolve<ExceptionHandler>(DI_TOKENS.ExceptionHandler)\n handler.register()\n this.moduleRegistry.configureExceptionHandlers(handler)\n }\n}\n","import { Application, type ApplicationConfig } from './application'\nimport type { StratalEnv } from './env'\nimport { StratalNotInitializedError } from './errors'\nimport type { HonoApp } from './router/hono-app'\n\n/**\n * Stratal — Hono-style entry point for Cloudflare Workers.\n *\n * Eagerly bootstraps the Application at construction time, dynamically\n * importing `cloudflare:workers` for env and waitUntil.\n *\n * @example\n * ```typescript\n * import { Stratal } from 'stratal'\n * import { AppModule } from './app.module'\n *\n * export default new Stratal({ module: AppModule })\n * ```\n */\nexport class Stratal<Env extends StratalEnv = StratalEnv> {\n private app: Application | null = null\n private initPromise: Promise<Application>\n\n private static _application: Promise<Application> | null = null\n private static _generation = 0\n private static _previousInstance: Stratal | null = null\n\n constructor(config: ApplicationConfig) {\n this.fetch = this.fetch.bind(this)\n this.queue = this.queue.bind(this)\n this.scheduled = this.scheduled.bind(this)\n\n // Invalidate any in-flight initialization from a previous instance (Vite HMR reload)\n const generation = ++Stratal._generation\n\n if (Stratal._previousInstance) {\n void Stratal._previousInstance.shutdown()\n }\n Stratal._previousInstance = this\n\n this.initPromise = this.prepareApp(config, generation)\n Stratal._application = this.initPromise\n }\n\n async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {\n const app = await this.ensureReady()\n const hono = await app.ensureHono()\n return hono.fetch(request, env, ctx)\n }\n\n async queue(batch: MessageBatch): Promise<void> {\n const app = await this.ensureReady()\n return app.handleQueue(batch, batch.queue)\n }\n\n async scheduled(controller: ScheduledController): Promise<void> {\n const app = await this.ensureReady()\n return app.handleScheduled(controller)\n }\n\n get hono(): Promise<HonoApp> {\n return this.initPromise.then(app => app.ensureHono())\n }\n\n async shutdown(): Promise<void> {\n try { this.app = await this.initPromise } catch { /* ignore */ }\n if (this.app) {\n await this.app.shutdown()\n this.app = null\n }\n }\n\n /**\n * @internal\n * Resolves the Application instance from the static singleton.\n * Used by worker base classes (DurableObject, Workflow, WorkerEntrypoint)\n * to access the DI container without going through Cloudflare RPC.\n */\n static resolveApplication(): Promise<Application> {\n if (!Stratal._application) {\n throw new StratalNotInitializedError()\n }\n return Stratal._application\n }\n\n private async ensureReady(): Promise<Application> {\n this.app ??= await this.initPromise;\n return this.app\n }\n\n private async prepareApp(config: ApplicationConfig, generation: number): Promise<Application> {\n const { env, waitUntil } = await import('cloudflare:workers')\n\n // After async import, check if a newer instance has replaced us (Vite HMR reload)\n if (generation !== Stratal._generation) {\n return new Promise<Application>(() => {\n //\n }) // Never resolves — avoids cross-request promise warning\n }\n\n const app = new Application({ ...config, env: env as Env, ctx: { waitUntil } })\n await app.initialize()\n\n // Check again after initialization completes\n if (generation !== Stratal._generation) {\n await app.shutdown()\n return new Promise<Application>(() => {\n //\n })\n }\n\n return app\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { ct as Application, dn as HonoApp, lt as ApplicationConfig } from "./index-DEncMcC6.mjs";
|
|
2
|
+
import { t as StratalEnv } from "./env-DKSbuBi5.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/stratal.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Stratal — Hono-style entry point for Cloudflare Workers.
|
|
7
|
+
*
|
|
8
|
+
* Eagerly bootstraps the Application at construction time, dynamically
|
|
9
|
+
* importing `cloudflare:workers` for env and waitUntil.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* import { Stratal } from 'stratal'
|
|
14
|
+
* import { AppModule } from './app.module'
|
|
15
|
+
*
|
|
16
|
+
* export default new Stratal({ module: AppModule })
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
declare class Stratal<Env extends StratalEnv = StratalEnv> {
|
|
20
|
+
private app;
|
|
21
|
+
private initPromise;
|
|
22
|
+
private static _application;
|
|
23
|
+
private static _generation;
|
|
24
|
+
private static _previousInstance;
|
|
25
|
+
constructor(config: ApplicationConfig);
|
|
26
|
+
fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response>;
|
|
27
|
+
queue(batch: MessageBatch): Promise<void>;
|
|
28
|
+
scheduled(controller: ScheduledController): Promise<void>;
|
|
29
|
+
get hono(): Promise<HonoApp>;
|
|
30
|
+
shutdown(): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* @internal
|
|
33
|
+
* Resolves the Application instance from the static singleton.
|
|
34
|
+
* Used by worker base classes (DurableObject, Workflow, WorkerEntrypoint)
|
|
35
|
+
* to access the DI container without going through Cloudflare RPC.
|
|
36
|
+
*/
|
|
37
|
+
static resolveApplication(): Promise<Application>;
|
|
38
|
+
private ensureReady;
|
|
39
|
+
private prepareApp;
|
|
40
|
+
}
|
|
41
|
+
//#endregion
|
|
42
|
+
export { Stratal as t };
|
|
43
|
+
//# sourceMappingURL=stratal-BsKmvP6J.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stratal-BsKmvP6J.d.mts","names":[],"sources":["../src/stratal.ts"],"mappings":";;;;;AAmBA;;;;;;;;;;;;;cAAa,OAAA,aAAoB,UAAA,GAAa,UAAA;EAAA,QACpC,GAAA;EAAA,QACA,WAAA;EAAA,eAEO,YAAA;EAAA,eACA,WAAA;EAAA,eACA,iBAAA;cAEH,MAAA,EAAQ,iBAAA;EAiBd,KAAA,CAAM,OAAA,EAAS,OAAA,EAAS,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,gBAAA,GAAmB,OAAA,CAAQ,QAAA;EAMlE,KAAA,CAAM,KAAA,EAAO,YAAA,GAAe,OAAA;EAK5B,SAAA,CAAU,UAAA,EAAY,mBAAA,GAAsB,OAAA;EAAA,IAK9C,IAAA,CAAA,GAAQ,OAAA,CAAQ,OAAA;EAId,QAAA,CAAA,GAAY,OAAA;EA5CV;;;;;;EAAA,OA0DD,kBAAA,CAAA,GAAsB,OAAA,CAAQ,WAAA;EAAA,QAOvB,WAAA;EAAA,QAKA,UAAA;AAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types-BaeHi67f.d.mts","names":[],"sources":["../src/types.ts"],"mappings":";;AAeA;;;;;;;;;;;;;KAAY,WAAA,uBAAkC,IAAA,YAAgB,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as __exportAll } from "./chunk-D1SwGrFN.mjs";
|
|
2
|
-
import { i as dimWhite, n as cyan, r as dim, s as yellow, t as bold } from "./colors-
|
|
2
|
+
import { i as dimWhite, n as cyan, r as dim, s as yellow, t as bold } from "./colors-axmupKdp.mjs";
|
|
3
3
|
//#region src/quarry/usage-generator.ts
|
|
4
4
|
var usage_generator_exports = /* @__PURE__ */ __exportAll({
|
|
5
5
|
generateListing: () => generateListing,
|
|
@@ -63,7 +63,10 @@ function generateListing(commands, signatures, options) {
|
|
|
63
63
|
lines.push(bold(`${label}${version ? ` v${version}` : ""}`));
|
|
64
64
|
lines.push("");
|
|
65
65
|
lines.push(bold(yellow("Usage")));
|
|
66
|
-
lines.push(` $ ${bin} <command> [options]`);
|
|
66
|
+
lines.push(` $ ${bin} [--env <name>] <command> [options]`);
|
|
67
|
+
lines.push("");
|
|
68
|
+
lines.push(bold(yellow("Global Options")));
|
|
69
|
+
lines.push(...formatTable([[`-e, --env ${cyan("<name>")}`, `Select a ${dim("wrangler.jsonc")} environment (e.g. staging, production)`]]));
|
|
67
70
|
lines.push("");
|
|
68
71
|
if (commands.length === 0) {
|
|
69
72
|
lines.push("No registered commands.");
|
|
@@ -155,4 +158,4 @@ function formatTable(rows) {
|
|
|
155
158
|
//#endregion
|
|
156
159
|
export { usage_generator_exports as n, generateUsage as t };
|
|
157
160
|
|
|
158
|
-
//# sourceMappingURL=usage-generator-
|
|
161
|
+
//# sourceMappingURL=usage-generator-DTqaUMR9.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-generator-DTqaUMR9.mjs","names":[],"sources":["../src/quarry/usage-generator.ts"],"sourcesContent":["import { bold, cyan, dim, dimWhite, yellow } from './colors'\nimport type { ParsedSignature } from './types'\n\n/**\n * Generate formatted help/usage text from a parsed signature.\n *\n * Pure function, edge-compatible.\n */\nexport function generateUsage(signature: ParsedSignature, description?: string): string {\n const lines: string[] = []\n\n // Usage line\n lines.push(`${bold('Usage:')} ${bold(cyan('quarry ' + buildUsageLine(signature)))}`)\n\n // Description\n if (description) {\n lines.push('')\n lines.push(description)\n }\n\n // Arguments section\n if (signature.arguments.length > 0) {\n lines.push('')\n lines.push(bold(yellow('Arguments:')))\n const argRows = signature.arguments.map((arg) => {\n const label = arg.name\n const parts: string[] = []\n\n if (arg.description) parts.push(arg.description)\n\n if (arg.isArray) {\n parts.push('(variadic)')\n } else if (arg.required) {\n parts.push('(required)')\n } else if (arg.default !== undefined) {\n parts.push(dim(`(default: ${arg.default})`))\n } else {\n parts.push('(optional)')\n }\n\n return [label, parts.join(' ')] as const\n })\n lines.push(...formatTable(argRows))\n }\n\n // Options section\n if (signature.options.length > 0) {\n lines.push('')\n lines.push(bold(yellow('Options:')))\n const optRows = signature.options.map((opt) => {\n const flagParts: string[] = []\n if (opt.alias) flagParts.push(`-${opt.alias},`)\n flagParts.push(`--${opt.name}`)\n\n const label = flagParts.join(' ')\n const parts: string[] = []\n\n if (opt.description) parts.push(opt.description)\n if (!opt.isFlag && !opt.description) parts.push('Accepts a value')\n if (opt.isFlag && !opt.description) parts.push('Boolean flag')\n if (opt.isArray) parts.push('(multiple)')\n if (opt.default !== undefined) parts.push(dim(`(default: ${opt.default})`))\n\n return [label, parts.join(' ')] as const\n })\n lines.push(...formatTable(optRows))\n }\n\n return lines.join('\\n')\n}\n\nexport interface ListingOptions {\n binaryName?: string\n binaryLabel?: string\n binaryVersion?: string\n}\n\n/**\n * Generate a compact command listing with visual hierarchy.\n */\nexport function generateListing(\n commands: { name: string; description?: string; aliases: string[] }[],\n signatures: Map<string, ParsedSignature>,\n options?: ListingOptions,\n): string {\n const bin = options?.binaryName ?? 'quarry'\n const label = options?.binaryLabel ?? 'Quarry CLI'\n const version = options?.binaryVersion\n\n const lines: string[] = []\n\n // Header\n lines.push(bold(`${label}${version ? ` v${version}` : ''}`))\n lines.push('')\n\n // Usage\n lines.push(bold(yellow('Usage')))\n lines.push(` $ ${bin} [--env <name>] <command> [options]`)\n lines.push('')\n\n // Global Options\n lines.push(bold(yellow('Global Options')))\n lines.push(...formatTable([\n [`-e, --env ${cyan('<name>')}`, `Select a ${dim('wrangler.jsonc')} environment (e.g. staging, production)`],\n ]))\n lines.push('')\n\n // Commands\n if (commands.length === 0) {\n lines.push('No registered commands.')\n return lines.join('\\n')\n }\n\n lines.push(bold(yellow('Commands')))\n\n const termWidth = typeof process !== 'undefined'\n ? (process.stdout.columns as number | undefined) ?? 80\n : 80\n\n for (let i = 0; i < commands.length; i++) {\n const cmd = commands[i]\n const sig = signatures.get(cmd.name)\n const sigParts: string[] = [cyan(cmd.name)]\n\n if (cmd.aliases.length > 0) {\n sigParts.push(cyan(`(alias: ${cmd.aliases.join(', ')})`))\n }\n\n if (sig) {\n const inlineParts: string[] = []\n for (const arg of sig.arguments) {\n inlineParts.push(formatArgPlaceholder(arg))\n }\n\n for (const opt of sig.options) {\n const flagStr = opt.alias ? `-${opt.alias},--${opt.name}` : `--${opt.name}`\n inlineParts.push(`[${flagStr}]`)\n }\n\n if (inlineParts.length > 0) {\n sigParts.push(dim(inlineParts.join(' ')))\n }\n }\n\n const sigLine = ' ' + sigParts.join(' ')\n lines.push(...wrapLine(sigLine, termWidth, ' '))\n\n if (cmd.description) {\n lines.push(` ${dimWhite(cmd.description)}`)\n }\n\n if (i < commands.length - 1) {\n lines.push('')\n }\n }\n\n lines.push('')\n\n // Footer\n lines.push(dimWhite(`Run ${bin} help <command> for detailed information.`))\n\n return lines.join('\\n')\n}\n\n/** Format a single argument into its placeholder representation (e.g. `<name>`, `[name=default]`). */\nfunction formatArgPlaceholder(arg: ParsedSignature['arguments'][number]): string {\n if (arg.isArray) return `<${arg.name}...>`\n if (arg.required) return `<${arg.name}>`\n if (arg.default !== undefined) return `[${arg.name}=${arg.default}]`\n return `[${arg.name}]`\n}\n\n/** Build the inline usage line showing the command name with argument and option placeholders. */\nfunction buildUsageLine(signature: ParsedSignature): string {\n const parts = [signature.name]\n\n for (const arg of signature.arguments) {\n parts.push(formatArgPlaceholder(arg))\n }\n\n for (const opt of signature.options) {\n const flagStr = opt.alias ? `-${opt.alias},--${opt.name}` : `--${opt.name}`\n\n if (opt.isFlag) {\n parts.push(`[${flagStr}]`)\n } else if (opt.isArray) {\n parts.push(`[${flagStr} <value...>]`)\n } else {\n parts.push(`[${flagStr} <value>]`)\n }\n }\n\n return parts.join(' ')\n}\n\n// eslint-disable-next-line no-control-regex\nconst ANSI_RE = /\\x1b\\[[0-9;]*m/g\n\n/** Remove ANSI escape sequences from a string. */\nfunction stripAnsi(s: string): string {\n return s.replace(ANSI_RE, '')\n}\n\n// eslint-disable-next-line no-control-regex\nconst TOKEN_RE = /(?:\\x1b\\[[0-9;]*m)*[^\\s\\x1b]+(?:\\x1b\\[[0-9;]*m)*/g\n\n/** Wrap a single line at word boundaries, preserving ANSI codes across wrapped segments. */\nfunction wrapLine(text: string, maxWidth: number, continuationIndent: string): string[] {\n const visibleLen = stripAnsi(text).length\n if (visibleLen <= maxWidth) return [text]\n\n const tokens = text.match(TOKEN_RE) ?? [text]\n\n const lines: string[] = []\n let currentLine = ''\n let currentVisibleLen = 0\n\n for (const token of tokens) {\n const tokenVisible = stripAnsi(token).length\n const separator = currentLine === '' ? '' : ' '\n const separatorLen = separator.length\n\n if (currentLine !== '' && currentVisibleLen + separatorLen + tokenVisible > maxWidth) {\n lines.push(currentLine)\n currentLine = continuationIndent + token\n currentVisibleLen = continuationIndent.length + tokenVisible\n } else {\n currentLine += separator + token\n currentVisibleLen += separatorLen + tokenVisible\n }\n }\n\n if (currentLine !== '') {\n lines.push(currentLine)\n }\n\n return lines\n}\n\n/** Format label/description pairs into aligned two-column table rows. */\nfunction formatTable(rows: readonly (readonly [string, string])[]): string[] {\n if (rows.length === 0) return []\n\n const maxLabel = Math.max(...rows.map(([label]) => stripAnsi(label).length))\n const padding = 4\n\n return rows.map(([label, desc]) => {\n const visibleLen = stripAnsi(label).length\n const pad = ' '.repeat(maxLabel - visibleLen + padding)\n return ` ${label}${pad}${desc}`\n })\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { n as __reExport, t as __exportAll } from "./chunk-D1SwGrFN.mjs";
|
|
2
|
+
import { n as getContainer } from "./container-storage-GpNNz79X.mjs";
|
|
3
|
+
import { t as I18N_TOKENS } from "./i18n.tokens-hwRpmjRq.mjs";
|
|
4
|
+
import { a as CUID2_REGEX, i as zod_exports, n as ZodError, o as cuid2, r as z, t as OpenAPIHono } from "./zod-hMa3rSHV.mjs";
|
|
5
|
+
import { t as zodErrorMap } from "./validation.context-XTysWJ3b.mjs";
|
|
6
|
+
//#region src/i18n/validation/with-zod-i18n.ts
|
|
7
|
+
/**
|
|
8
|
+
* Type-safe helper for creating custom Zod error messages with i18n support
|
|
9
|
+
*
|
|
10
|
+
* Usage with .refine():
|
|
11
|
+
* ```typescript
|
|
12
|
+
* const schema = z.string().refine(
|
|
13
|
+
* (val) => val.length > 5,
|
|
14
|
+
* withZodI18n('validation.minLength', { min: 5 })
|
|
15
|
+
* )
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* Usage with built-in validators:
|
|
19
|
+
* ```typescript
|
|
20
|
+
* const schema = z.string().min(5, withZodI18n('validation.minLength', { min: 5 }))
|
|
21
|
+
* const schema = z.string().email(withZodI18n('validation.email'))
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @param key - Message key from shared i18n messages (type-safe via MessageKeys)
|
|
25
|
+
* @param params - Optional interpolation parameters for the message
|
|
26
|
+
* @returns Zod error configuration object with translated message
|
|
27
|
+
*/
|
|
28
|
+
function withZodI18n(key, params) {
|
|
29
|
+
return { error: (_issue) => {
|
|
30
|
+
try {
|
|
31
|
+
return getContainer().resolve(I18N_TOKENS.I18nService).t(key, params);
|
|
32
|
+
} catch {
|
|
33
|
+
return "Invalid input";
|
|
34
|
+
}
|
|
35
|
+
} };
|
|
36
|
+
}
|
|
37
|
+
__reExport(/* @__PURE__ */ __exportAll({
|
|
38
|
+
CUID2_REGEX: () => CUID2_REGEX,
|
|
39
|
+
OpenAPIHono: () => OpenAPIHono,
|
|
40
|
+
ZodError: () => ZodError,
|
|
41
|
+
cuid2: () => cuid2,
|
|
42
|
+
withZodI18n: () => withZodI18n,
|
|
43
|
+
z: () => z,
|
|
44
|
+
zodErrorMap: () => zodErrorMap
|
|
45
|
+
}), zod_exports);
|
|
46
|
+
//#endregion
|
|
47
|
+
export { withZodI18n as t };
|
|
48
|
+
|
|
49
|
+
//# sourceMappingURL=validation-DUzcjb8Q.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation-DUzcjb8Q.mjs","names":[],"sources":["../src/i18n/validation/with-zod-i18n.ts","../src/i18n/validation/index.ts"],"sourcesContent":["import { type $ZodRawIssue } from 'zod/v4/core'\nimport { getContainer } from '../../di/container-storage'\nimport { I18N_TOKENS } from '../i18n.tokens'\nimport type { II18nService, MessageKeys } from '../i18n.types'\n\n/**\n * Type-safe helper for creating custom Zod error messages with i18n support\n *\n * Usage with .refine():\n * ```typescript\n * const schema = z.string().refine(\n * (val) => val.length > 5,\n * withZodI18n('validation.minLength', { min: 5 })\n * )\n * ```\n *\n * Usage with built-in validators:\n * ```typescript\n * const schema = z.string().min(5, withZodI18n('validation.minLength', { min: 5 }))\n * const schema = z.string().email(withZodI18n('validation.email'))\n * ```\n *\n * @param key - Message key from shared i18n messages (type-safe via MessageKeys)\n * @param params - Optional interpolation parameters for the message\n * @returns Zod error configuration object with translated message\n */\nexport function withZodI18n(\n key: MessageKeys,\n params?: Record<string, unknown>\n): { error: (_issue: $ZodRawIssue) => string } {\n return {\n error: (_issue: $ZodRawIssue) => {\n try {\n const container = getContainer()\n const i18n = container.resolve<II18nService>(I18N_TOKENS.I18nService)\n return i18n.t(key, params as Record<string, string | number> | undefined)\n } catch {\n return 'Invalid input'\n }\n },\n }\n}\n","export * from './zod'\nexport { withZodI18n } from './with-zod-i18n'\nexport { zodErrorMap } from './validation.context'\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,SAAgB,YACd,KACA,QAC6C;CAC7C,OAAO,EACL,QAAQ,WAAyB;EAC/B,IAAI;GAGF,OAFkB,cACI,CAAC,QAAsB,YAAY,YAC9C,CAAC,EAAE,KAAK,OAAsD;UACnE;GACN,OAAO;;IAGZ"}
|