stratal 0.0.14 → 0.0.16

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.
Files changed (144) hide show
  1. package/dist/application-zG8b-pol.d.mts +116 -0
  2. package/dist/application-zG8b-pol.d.mts.map +1 -0
  3. package/dist/{base-email.provider-bzdAYp8Z.mjs → base-email.provider-Cuw4OAB0.mjs} +1 -1
  4. package/dist/{base-email.provider-bzdAYp8Z.mjs.map → base-email.provider-Cuw4OAB0.mjs.map} +1 -1
  5. package/dist/bin/cloudflare-workers-loader.mjs +34 -0
  6. package/dist/bin/cloudflare-workers-loader.mjs.map +1 -0
  7. package/dist/bin/quarry.mjs +168 -0
  8. package/dist/bin/quarry.mjs.map +1 -0
  9. package/dist/cache/index.d.mts +2 -2
  10. package/dist/cache/index.mjs +11 -6
  11. package/dist/cache/index.mjs.map +1 -1
  12. package/dist/colors-DJaRDXoS.mjs +16 -0
  13. package/dist/colors-DJaRDXoS.mjs.map +1 -0
  14. package/dist/command-B-QH-Vu3.d.mts +120 -0
  15. package/dist/command-B-QH-Vu3.d.mts.map +1 -0
  16. package/dist/command-BvCOD6df.mjs +193 -0
  17. package/dist/command-BvCOD6df.mjs.map +1 -0
  18. package/dist/config/index.d.mts +2 -2
  19. package/dist/config/index.mjs +11 -6
  20. package/dist/config/index.mjs.map +1 -1
  21. package/dist/cron/index.d.mts +1 -1
  22. package/dist/cron/index.mjs +4 -3
  23. package/dist/{cron-manager-CpS_hrDD.mjs → cron-manager-DR7fiG6o.mjs} +3 -3
  24. package/dist/{cron-manager-CpS_hrDD.mjs.map → cron-manager-DR7fiG6o.mjs.map} +1 -1
  25. package/dist/decorate-D5j-d9_z.mjs +171 -0
  26. package/dist/decorate-D5j-d9_z.mjs.map +1 -0
  27. package/dist/di/index.d.mts +1 -1
  28. package/dist/di/index.mjs +3 -2
  29. package/dist/email/index.d.mts +3 -3
  30. package/dist/email/index.mjs +17 -11
  31. package/dist/email/index.mjs.map +1 -1
  32. package/dist/{en-C9U5-ETs.mjs → en-DaewN8hc.mjs} +3 -1
  33. package/dist/en-DaewN8hc.mjs.map +1 -0
  34. package/dist/errors/index.d.mts +1 -1
  35. package/dist/errors/index.mjs +3 -2
  36. package/dist/{errors-BRJgVd5-.mjs → errors-CtCi1wn6.mjs} +6 -3
  37. package/dist/errors-CtCi1wn6.mjs.map +1 -0
  38. package/dist/errors-H3TZnVeX.mjs +67 -0
  39. package/dist/errors-H3TZnVeX.mjs.map +1 -0
  40. package/dist/events/index.d.mts +2 -2
  41. package/dist/events/index.mjs +3 -2
  42. package/dist/{events-CQyvSyrQ.mjs → events-CXl-o1Ad.mjs} +3 -2
  43. package/dist/{events-CQyvSyrQ.mjs.map → events-CXl-o1Ad.mjs.map} +1 -1
  44. package/dist/{gateway-context-D7TFPLi5.mjs → gateway-context-BkZ4UKaX.mjs} +4 -4
  45. package/dist/{gateway-context-D7TFPLi5.mjs.map → gateway-context-BkZ4UKaX.mjs.map} +1 -1
  46. package/dist/guards/index.d.mts +3 -3
  47. package/dist/guards/index.mjs +1 -1
  48. package/dist/{guards-B5o618bL.mjs → guards-DUk_Kzst.mjs} +1 -1
  49. package/dist/{guards-B5o618bL.mjs.map → guards-DUk_Kzst.mjs.map} +1 -1
  50. package/dist/i18n/index.d.mts +2 -2
  51. package/dist/i18n/index.mjs +15 -10
  52. package/dist/i18n/messages/en/index.d.mts +1 -1
  53. package/dist/i18n/messages/en/index.mjs +1 -1
  54. package/dist/i18n/validation/index.d.mts +1 -1
  55. package/dist/i18n/validation/index.mjs +1 -1
  56. package/dist/{i18n.module-C9wQr_2k.mjs → i18n.module-W8OJxg3d.mjs} +10 -11
  57. package/dist/i18n.module-W8OJxg3d.mjs.map +1 -0
  58. package/dist/{index-C9bIk5tt.d.mts → index-BJWm863C.d.mts} +9 -6
  59. package/dist/index-BJWm863C.d.mts.map +1 -0
  60. package/dist/{index-zKURVFOC.d.mts → index-D9iYu2Yc.d.mts} +3 -3
  61. package/dist/{index-zKURVFOC.d.mts.map → index-D9iYu2Yc.d.mts.map} +1 -1
  62. package/dist/{index-Dl4RvzNp.d.mts → index-DVhdhLvE.d.mts} +2 -2
  63. package/dist/{index-Dl4RvzNp.d.mts.map → index-DVhdhLvE.d.mts.map} +1 -1
  64. package/dist/{index-BWEwA_XK.d.mts → index-D_w_Rmtd.d.mts} +3 -1
  65. package/dist/{index-BWEwA_XK.d.mts.map → index-D_w_Rmtd.d.mts.map} +1 -1
  66. package/dist/{index-3TtGtYlJ.d.mts → index-Dp6A5ywM.d.mts} +1 -1
  67. package/dist/{index-3TtGtYlJ.d.mts.map → index-Dp6A5ywM.d.mts.map} +1 -1
  68. package/dist/index.d.mts +3 -106
  69. package/dist/index.d.mts.map +1 -1
  70. package/dist/index.mjs +20 -13
  71. package/dist/is-command-BfCgWAcQ.mjs +14 -0
  72. package/dist/is-command-BfCgWAcQ.mjs.map +1 -0
  73. package/dist/is-seeder-CebjZCDn.mjs +28 -0
  74. package/dist/is-seeder-CebjZCDn.mjs.map +1 -0
  75. package/dist/logger/index.d.mts +1 -1
  76. package/dist/logger/index.mjs +2 -1
  77. package/dist/{logger-Bg-CuidS.mjs → logger-BR1-s1Um.mjs} +4 -169
  78. package/dist/logger-BR1-s1Um.mjs.map +1 -0
  79. package/dist/middleware/index.d.mts +1 -1
  80. package/dist/middleware/index.mjs +5 -4
  81. package/dist/{middleware-B3tx1u1K.mjs → middleware-C0Ebzswy.mjs} +3 -3
  82. package/dist/{middleware-B3tx1u1K.mjs.map → middleware-C0Ebzswy.mjs.map} +1 -1
  83. package/dist/module/index.d.mts +21 -3
  84. package/dist/module/index.d.mts.map +1 -1
  85. package/dist/module/index.mjs +11 -6
  86. package/dist/{module-Dvzm4dhS.mjs → module-BgdxxzBe.mjs} +44 -5
  87. package/dist/module-BgdxxzBe.mjs.map +1 -0
  88. package/dist/openapi/index.d.mts +3 -3
  89. package/dist/openapi/index.mjs +15 -10
  90. package/dist/quarry/index.d.mts +120 -0
  91. package/dist/quarry/index.d.mts.map +1 -0
  92. package/dist/quarry/index.mjs +7 -0
  93. package/dist/quarry-registry-DCwqVcRp.mjs +310 -0
  94. package/dist/quarry-registry-DCwqVcRp.mjs.map +1 -0
  95. package/dist/queue/index.d.mts +1 -1
  96. package/dist/queue/index.mjs +12 -7
  97. package/dist/queue/index.mjs.map +1 -1
  98. package/dist/{queue.module-ZqaZ2iY0.mjs → queue.module-BZvmeAMj.mjs} +4 -4
  99. package/dist/{queue.module-ZqaZ2iY0.mjs.map → queue.module-BZvmeAMj.mjs.map} +1 -1
  100. package/dist/{resend.provider-BFGt6fS4.mjs → resend.provider-BCCACQAU.mjs} +5 -4
  101. package/dist/{resend.provider-BFGt6fS4.mjs.map → resend.provider-BCCACQAU.mjs.map} +1 -1
  102. package/dist/router/index.d.mts +1 -1
  103. package/dist/router/index.mjs +15 -10
  104. package/dist/{router-context-DlTxpJUG.mjs → router-context-BEJe9HEB.mjs} +2 -2
  105. package/dist/{router-context-DlTxpJUG.mjs.map → router-context-BEJe9HEB.mjs.map} +1 -1
  106. package/dist/s3-storage.provider-BLlzQYiJ.mjs +336 -0
  107. package/dist/s3-storage.provider-BLlzQYiJ.mjs.map +1 -0
  108. package/dist/seeder/index.d.mts +77 -0
  109. package/dist/seeder/index.d.mts.map +1 -0
  110. package/dist/seeder/index.mjs +8 -0
  111. package/dist/seeder-Cupi5jl-.mjs +132 -0
  112. package/dist/seeder-Cupi5jl-.mjs.map +1 -0
  113. package/dist/{smtp.provider-BYY-AdmU.mjs → smtp.provider-B8XtOcHU.mjs} +5 -4
  114. package/dist/{smtp.provider-BYY-AdmU.mjs.map → smtp.provider-B8XtOcHU.mjs.map} +1 -1
  115. package/dist/storage/index.d.mts +6 -272
  116. package/dist/storage/index.d.mts.map +1 -1
  117. package/dist/storage/index.mjs +15 -9
  118. package/dist/{storage-dgi7MG6z.mjs → storage-By_ow2o_.mjs} +35 -411
  119. package/dist/storage-By_ow2o_.mjs.map +1 -0
  120. package/dist/{stratal-D4MS_7pI.mjs → stratal-CE0iTz4f.mjs} +44 -9
  121. package/dist/stratal-CE0iTz4f.mjs.map +1 -0
  122. package/dist/types-CLhOhYsQ.d.mts +64 -0
  123. package/dist/types-CLhOhYsQ.d.mts.map +1 -0
  124. package/dist/{types-JUIHSW_a.d.mts → types-DahElfUw.d.mts} +1 -1
  125. package/dist/types-DahElfUw.d.mts.map +1 -0
  126. package/dist/usage-generator-C9hWziY4.mjs +158 -0
  127. package/dist/usage-generator-C9hWziY4.mjs.map +1 -0
  128. package/dist/{validation-DA5nptIp.mjs → validation-Bh875Lyg.mjs} +1 -1
  129. package/dist/{validation-DA5nptIp.mjs.map → validation-Bh875Lyg.mjs.map} +1 -1
  130. package/dist/websocket/index.d.mts +2 -2
  131. package/dist/websocket/index.mjs +5 -4
  132. package/dist/workers/index.d.mts +1 -1
  133. package/dist/workers/index.mjs +20 -13
  134. package/dist/workers/index.mjs.map +1 -1
  135. package/package.json +17 -7
  136. package/dist/en-C9U5-ETs.mjs.map +0 -1
  137. package/dist/errors-BRJgVd5-.mjs.map +0 -1
  138. package/dist/i18n.module-C9wQr_2k.mjs.map +0 -1
  139. package/dist/index-C9bIk5tt.d.mts.map +0 -1
  140. package/dist/logger-Bg-CuidS.mjs.map +0 -1
  141. package/dist/module-Dvzm4dhS.mjs.map +0 -1
  142. package/dist/storage-dgi7MG6z.mjs.map +0 -1
  143. package/dist/stratal-D4MS_7pI.mjs.map +0 -1
  144. package/dist/types-JUIHSW_a.d.mts.map +0 -1
@@ -0,0 +1,116 @@
1
+ import { $t as Container, Ht as StratalEnv, It as VersioningOptions, Tt as RouterContext, U as HonoApp, ct as ModuleClass, it as DynamicModule } from "./index-BJWm863C.mjs";
2
+ import { l as LogLevel } from "./index-Dp6A5ywM.mjs";
3
+ import { r as CommandResult, t as CommandInput } from "./types-CLhOhYsQ.mjs";
4
+
5
+ //#region src/execution-context.d.ts
6
+ interface StratalExecutionContext {
7
+ waitUntil(promise: Promise<unknown>): void;
8
+ }
9
+ //#endregion
10
+ //#region src/application.d.ts
11
+ interface ApplicationConfig {
12
+ /** Root application module */
13
+ module: ModuleClass | DynamicModule;
14
+ /** Logging configuration. Defaults: level=INFO, formatter='json' */
15
+ logging?: {
16
+ level?: LogLevel;
17
+ formatter?: 'json' | 'pretty';
18
+ };
19
+ /**
20
+ * API versioning configuration.
21
+ * When provided, enables URI-based versioning for controllers.
22
+ */
23
+ versioning?: VersioningOptions;
24
+ }
25
+ interface ApplicationOptions extends ApplicationConfig {
26
+ env: StratalEnv;
27
+ ctx: StratalExecutionContext;
28
+ }
29
+ /**
30
+ * Application
31
+ *
32
+ * Main application class managing the two-tier container hierarchy:
33
+ * - Global Container: All services (singletons via tsyringe native)
34
+ * - Request Container: Child of global, context-enriched instances per request
35
+ *
36
+ * @example
37
+ * ```typescript
38
+ * const app = new Application({ module: AppModule, env, ctx })
39
+ * await app.initialize()
40
+ *
41
+ * // Access container via getter
42
+ * const service = app.container.resolve(MY_TOKEN)
43
+ *
44
+ * // Handle HTTP request (via HonoApp)
45
+ * // Handle queue batch
46
+ * await app.handleQueue(batch, 'my-queue')
47
+ * ```
48
+ */
49
+ declare class Application {
50
+ /**
51
+ * Unified Container - manages all DI operations
52
+ */
53
+ private _container;
54
+ private honoApp;
55
+ private moduleRegistry;
56
+ private consumerRegistry;
57
+ private cronManager;
58
+ private quarry;
59
+ private initialized;
60
+ readonly env: StratalEnv;
61
+ private readonly appConfig;
62
+ constructor({
63
+ env,
64
+ ctx,
65
+ ...config
66
+ }: ApplicationOptions);
67
+ /**
68
+ * Get the Container instance
69
+ */
70
+ get container(): Container;
71
+ /**
72
+ * Get the HonoApp instance
73
+ */
74
+ get hono(): HonoApp;
75
+ initialize(): Promise<void>;
76
+ /**
77
+ * Resolve a service from the container
78
+ */
79
+ resolve<T>(token: symbol): T;
80
+ /**
81
+ * Handle queue batch processing
82
+ */
83
+ handleQueue(batch: MessageBatch, queueName: string): Promise<void>;
84
+ /**
85
+ * Handle scheduled cron trigger
86
+ */
87
+ handleScheduled(controller: ScheduledController): Promise<void>;
88
+ /**
89
+ * Create mock RouterContext for queue/cron/seeder processing
90
+ */
91
+ createMockRouterContext(locale?: string): RouterContext;
92
+ shutdown(): Promise<void>;
93
+ /**
94
+ * Execute a command by name in a request-scoped container.
95
+ */
96
+ handleCommand(name: string, input?: CommandInput): Promise<CommandResult>;
97
+ private registerCommands;
98
+ private registerSeeders;
99
+ private registerQueueConsumers;
100
+ private registerCronJobs;
101
+ /**
102
+ * Auto-wire `@Listener()` classes with the EventRegistry.
103
+ */
104
+ private registerEventListeners;
105
+ /**
106
+ * Register LoggerService and dependencies
107
+ */
108
+ private registerLoggerService;
109
+ /**
110
+ * Register core services with explicit scope
111
+ */
112
+ private registerCoreServices;
113
+ }
114
+ //#endregion
115
+ export { StratalExecutionContext as i, ApplicationConfig as n, ApplicationOptions as r, Application as t };
116
+ //# sourceMappingURL=application-zG8b-pol.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"application-zG8b-pol.d.mts","names":[],"sources":["../src/execution-context.ts","../src/application.ts"],"mappings":";;;;;UAAiB,uBAAA;EACf,SAAA,CAAU,OAAA,EAAS,OAAA;AAAA;;;UC6BJ,iBAAA;ED7BI;EC+BnB,MAAA,EAAQ,WAAA,GAAc,aAAA;ED/Ba;ECiCnC,OAAA;IACE,KAAA,GAAQ,QAAA;IACR,SAAA;EAAA;EANa;;;;EAYf,UAAA,GAAa,iBAAA;AAAA;AAAA,UAGE,kBAAA,SAA2B,iBAAA;EAC1C,GAAA,EAAK,UAAA;EACL,GAAA,EAAK,uBAAA;AAAA;;;;;;;;;;;AAFP;;;;;;;;;;cAyBa,WAAA;EAvBX;;;EAAA,QA2BQ,UAAA;EAAA,QAEA,OAAA;EAAA,QACA,cAAA;EAAA,QACA,gBAAA;EAAA,QACA,WAAA;EAAA,QACA,MAAA;EAAA,QACA,WAAA;EAAA,SAEC,GAAA,EAAK,UAAA;EAAA,iBACG,SAAA;;IAEH,GAAA;IAAK,GAAA;IAAA,GAAQ;EAAA,GAAU,kBAAA;EA0CjB;;;EAAA,IAXhB,SAAA,CAAA,GAAa,SAAA;EAwFiB;;;EAAA,IAjF9B,IAAA,CAAA,GAAQ,OAAA;EAIN,UAAA,CAAA,GAAc,OAAA;EAqH6C;;;EAzEjE,OAAA,GAAA,CAAW,KAAA,WAAgB,CAAA;EAlGnB;;;EA+GF,WAAA,CAAY,KAAA,EAAO,YAAA,EAAc,SAAA,WAAoB,OAAA;EA1GnD;;;EA8HF,eAAA,CAAgB,UAAA,EAAY,mBAAA,GAAsB,OAAA;EA1H1C;;;EA2Id,uBAAA,CAAwB,MAAA,YAAgB,aAAA;EAQlC,QAAA,CAAA,GAAY,OAAA;EAhJC;;;EA+Jb,aAAA,CAAc,IAAA,UAAc,KAAA,GAAQ,YAAA,GAAe,OAAA,CAAQ,aAAA;EAAA,QAOzD,gBAAA;EAAA,QAoBA,eAAA;EAAA,QASA,sBAAA;EAAA,QAOA,gBAAA;EAhKF;;;EAAA,QA0KE,sBAAA;EA9HG;;;EAAA,QAmJH,qBAAA;EAtIU;;;EAAA,QA0JV,oBAAA;AAAA"}
@@ -39,4 +39,4 @@ var BaseEmailProvider = class {
39
39
  //#endregion
40
40
  export { BaseEmailProvider as t };
41
41
 
42
- //# sourceMappingURL=base-email.provider-bzdAYp8Z.mjs.map
42
+ //# sourceMappingURL=base-email.provider-Cuw4OAB0.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"base-email.provider-bzdAYp8Z.mjs","names":[],"sources":["../src/email/providers/base-email.provider.ts"],"sourcesContent":["import type { ResolvedEmailMessage } from '../contracts'\nimport type { EmailBatchSendResult, EmailSendResult, IEmailProvider } from './email-provider.interface'\n\n/**\n * Base Email Provider\n *\n * Abstract base class for email providers.\n * Provides shared implementation of sendBatch() to reduce code duplication.\n */\nexport abstract class BaseEmailProvider implements IEmailProvider {\n /**\n * Send a single email - must be implemented by concrete providers\n */\n abstract send(message: ResolvedEmailMessage): Promise<EmailSendResult>\n\n /**\n * Send multiple emails in a batch\n *\n * Default implementation sends emails sequentially.\n * Concrete providers can override for optimized batch sending.\n */\n async sendBatch(messages: ResolvedEmailMessage[]): Promise<EmailBatchSendResult> {\n const results: EmailSendResult[] = []\n let successful = 0\n let failed = 0\n\n for (const message of messages) {\n try {\n const result = await this.send(message)\n results.push(result)\n successful++\n }\n catch (error) {\n results.push({\n messageId: '',\n accepted: false,\n metadata: {\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n })\n failed++\n }\n }\n\n return {\n total: messages.length,\n successful,\n failed,\n results,\n }\n }\n}\n"],"mappings":";;;;;;;AASA,IAAsB,oBAAtB,MAAkE;;;;;;;CAYhE,MAAM,UAAU,UAAiE;EAC/E,MAAM,UAA6B,EAAE;EACrC,IAAI,aAAa;EACjB,IAAI,SAAS;AAEb,OAAK,MAAM,WAAW,SACpB,KAAI;GACF,MAAM,SAAS,MAAM,KAAK,KAAK,QAAQ;AACvC,WAAQ,KAAK,OAAO;AACpB;WAEK,OAAO;AACZ,WAAQ,KAAK;IACX,WAAW;IACX,UAAU;IACV,UAAU,EACR,OAAO,iBAAiB,QAAQ,MAAM,UAAU,iBACjD;IACF,CAAC;AACF;;AAIJ,SAAO;GACL,OAAO,SAAS;GAChB;GACA;GACA;GACD"}
1
+ {"version":3,"file":"base-email.provider-Cuw4OAB0.mjs","names":[],"sources":["../src/email/providers/base-email.provider.ts"],"sourcesContent":["import type { ResolvedEmailMessage } from '../contracts'\nimport type { EmailBatchSendResult, EmailSendResult, IEmailProvider } from './email-provider.interface'\n\n/**\n * Base Email Provider\n *\n * Abstract base class for email providers.\n * Provides shared implementation of sendBatch() to reduce code duplication.\n */\nexport abstract class BaseEmailProvider implements IEmailProvider {\n /**\n * Send a single email - must be implemented by concrete providers\n */\n abstract send(message: ResolvedEmailMessage): Promise<EmailSendResult>\n\n /**\n * Send multiple emails in a batch\n *\n * Default implementation sends emails sequentially.\n * Concrete providers can override for optimized batch sending.\n */\n async sendBatch(messages: ResolvedEmailMessage[]): Promise<EmailBatchSendResult> {\n const results: EmailSendResult[] = []\n let successful = 0\n let failed = 0\n\n for (const message of messages) {\n try {\n const result = await this.send(message)\n results.push(result)\n successful++\n }\n catch (error) {\n results.push({\n messageId: '',\n accepted: false,\n metadata: {\n error: error instanceof Error ? error.message : 'Unknown error',\n },\n })\n failed++\n }\n }\n\n return {\n total: messages.length,\n successful,\n failed,\n results,\n }\n }\n}\n"],"mappings":";;;;;;;AASA,IAAsB,oBAAtB,MAAkE;;;;;;;CAYhE,MAAM,UAAU,UAAiE;EAC/E,MAAM,UAA6B,EAAE;EACrC,IAAI,aAAa;EACjB,IAAI,SAAS;AAEb,OAAK,MAAM,WAAW,SACpB,KAAI;GACF,MAAM,SAAS,MAAM,KAAK,KAAK,QAAQ;AACvC,WAAQ,KAAK,OAAO;AACpB;WAEK,OAAO;AACZ,WAAQ,KAAK;IACX,WAAW;IACX,UAAU;IACV,UAAU,EACR,OAAO,iBAAiB,QAAQ,MAAM,UAAU,iBACjD;IACF,CAAC;AACF;;AAIJ,SAAO;GACL,OAAO,SAAS;GAChB;GACA;GACA;GACD"}
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env -S node --no-warnings
2
+ //#region src/bin/cloudflare-workers-loader.ts
3
+ /**
4
+ * ESM loader hook that provides a virtual `cloudflare:workers` module.
5
+ *
6
+ * When registered via `node --import` or `register()`, this intercepts
7
+ * `import('cloudflare:workers')` and returns a module that reads `env`
8
+ * and `waitUntil` from `globalThis.__stratalPlatformProxy`.
9
+ */
10
+ const VIRTUAL_URL = "cloudflare-workers:virtual";
11
+ async function resolve(specifier, context, nextResolve) {
12
+ if (specifier === "cloudflare:workers") return {
13
+ url: VIRTUAL_URL,
14
+ shortCircuit: true
15
+ };
16
+ return nextResolve(specifier, context);
17
+ }
18
+ async function load(url, context, nextLoad) {
19
+ if (url === VIRTUAL_URL) return {
20
+ format: "module",
21
+ shortCircuit: true,
22
+ source: `
23
+ const proxy = globalThis.__stratalPlatformProxy;
24
+ if (!proxy) throw new Error('globalThis.__stratalPlatformProxy not set — Quarry CLI must initialize it before importing the app entry.');
25
+ export const env = proxy.env;
26
+ export const waitUntil = proxy.waitUntil;
27
+ `
28
+ };
29
+ return nextLoad(url, context);
30
+ }
31
+ //#endregion
32
+ export { load, resolve };
33
+
34
+ //# sourceMappingURL=cloudflare-workers-loader.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloudflare-workers-loader.mjs","names":[],"sources":["../../src/bin/cloudflare-workers-loader.ts"],"sourcesContent":["/**\n * ESM loader hook that provides a virtual `cloudflare:workers` module.\n *\n * When registered via `node --import` or `register()`, this intercepts\n * `import('cloudflare:workers')` and returns a module that reads `env`\n * and `waitUntil` from `globalThis.__stratalPlatformProxy`.\n */\n\nconst VIRTUAL_URL = 'cloudflare-workers:virtual'\n\ninterface ResolveContext {\n parentURL?: string\n conditions: string[]\n}\n\ninterface ResolveResult {\n url: string\n shortCircuit?: boolean\n}\n\ntype NextResolve = (specifier: string, context: ResolveContext) => Promise<ResolveResult>\n\nexport async function resolve(\n specifier: string,\n context: ResolveContext,\n nextResolve: NextResolve,\n): Promise<ResolveResult> {\n if (specifier === 'cloudflare:workers') {\n return { url: VIRTUAL_URL, shortCircuit: true }\n }\n return nextResolve(specifier, context)\n}\n\ninterface LoadContext {\n format?: string\n conditions: string[]\n}\n\ninterface LoadResult {\n format: string\n source: string\n shortCircuit?: boolean\n}\n\ntype NextLoad = (url: string, context: LoadContext) => Promise<LoadResult>\n\nexport async function load(\n url: string,\n context: LoadContext,\n nextLoad: NextLoad,\n): Promise<LoadResult> {\n if (url === VIRTUAL_URL) {\n return {\n format: 'module',\n shortCircuit: true,\n source: `\nconst proxy = globalThis.__stratalPlatformProxy;\nif (!proxy) throw new Error('globalThis.__stratalPlatformProxy not set — Quarry CLI must initialize it before importing the app entry.');\nexport const env = proxy.env;\nexport const waitUntil = proxy.waitUntil;\n`,\n }\n }\n return nextLoad(url, context)\n}\n"],"mappings":";;;;;;;;;AAQA,MAAM,cAAc;AAcpB,eAAsB,QACpB,WACA,SACA,aACwB;AACxB,KAAI,cAAc,qBAChB,QAAO;EAAE,KAAK;EAAa,cAAc;EAAM;AAEjD,QAAO,YAAY,WAAW,QAAQ;;AAgBxC,eAAsB,KACpB,KACA,SACA,UACqB;AACrB,KAAI,QAAQ,YACV,QAAO;EACL,QAAQ;EACR,cAAc;EACd,QAAQ;;;;;;EAMT;AAEH,QAAO,SAAS,KAAK,QAAQ"}
@@ -0,0 +1,168 @@
1
+ #!/usr/bin/env -S node --no-warnings
2
+ import { createRequire, register } from "node:module";
3
+ import "reflect-metadata";
4
+ import { existsSync } from "node:fs";
5
+ import { dirname, join, resolve } from "node:path";
6
+ import { pathToFileURL } from "node:url";
7
+ import { Command, Option } from "clipanion";
8
+ //#region src/bin/commands/dynamic-command.ts
9
+ /** Create Clipanion command classes from Quarry-registered commands. */
10
+ function createDynamicCommands(quarry, parseSignature, app) {
11
+ const commands = [];
12
+ for (const entry of quarry.list()) {
13
+ const commandClass = quarry.get(entry.name);
14
+ const signature = parseSignature(commandClass.command);
15
+ const paths = [entry.name.split(" ")];
16
+ if (commandClass.aliases) for (const alias of commandClass.aliases) paths.push(alias.split(" "));
17
+ class DynCmd extends Command {
18
+ static paths = paths;
19
+ static usage = commandClass.description ? Command.Usage({ description: commandClass.description }) : void 0;
20
+ async execute() {
21
+ const input = {};
22
+ for (const arg of signature.arguments) {
23
+ const value = this[arg.name];
24
+ if (value !== void 0) input[arg.name] = value;
25
+ }
26
+ for (const opt of signature.options) {
27
+ const value = this[opt.name];
28
+ if (value !== void 0) input[opt.name] = value;
29
+ }
30
+ const result = await app.handleCommand(entry.name, input);
31
+ for (const line of result.output) this.context.stdout.write(line + "\n");
32
+ for (const err of result.errors) this.context.stderr.write(err + "\n");
33
+ return result.exitCode;
34
+ }
35
+ }
36
+ const proto = DynCmd.prototype;
37
+ for (const arg of signature.arguments) if (arg.isArray) proto[arg.name] = Option.Rest({
38
+ name: arg.name,
39
+ required: arg.required ? 1 : 0
40
+ });
41
+ else proto[arg.name] = Option.String({
42
+ name: arg.name,
43
+ required: arg.required
44
+ });
45
+ for (const opt of signature.options) {
46
+ const optName = opt.alias ? `-${opt.alias},--${opt.name}` : `--${opt.name}`;
47
+ const optDescParts = [];
48
+ if (opt.description) optDescParts.push(opt.description);
49
+ if (opt.default !== void 0) optDescParts.push(`(default: ${opt.default})`);
50
+ const optDesc = optDescParts.length > 0 ? optDescParts.join(" ") : void 0;
51
+ if (opt.isFlag) proto[opt.name] = Option.Boolean(optName, { description: optDesc });
52
+ else if (opt.isArray) if (opt.default !== void 0) proto[opt.name] = Option.Array(optName, [opt.default], { description: optDesc });
53
+ else proto[opt.name] = Option.Array(optName, { description: optDesc });
54
+ else if (opt.default !== void 0) proto[opt.name] = Option.String(optName, opt.default, { description: optDesc });
55
+ else proto[opt.name] = Option.String(optName, { description: optDesc });
56
+ }
57
+ commands.push(DynCmd);
58
+ }
59
+ return commands;
60
+ }
61
+ //#endregion
62
+ //#region src/quarry/errors/command-not-found.error.ts
63
+ /**
64
+ * Thrown when a command is not found in the Quarry registry.
65
+ */
66
+ var CommandNotFoundError = class extends Error {
67
+ constructor(name) {
68
+ super(`Command "${name}" is not registered.`);
69
+ this.name = "CommandNotFoundError";
70
+ }
71
+ };
72
+ //#endregion
73
+ //#region src/bin/commands/help-command.ts
74
+ /** Create the built-in `help`/`list` Clipanion command that delegates to Quarry's usage generator. */
75
+ function createHelpCommand(quarry) {
76
+ class HelpCommand extends Command {
77
+ static paths = [
78
+ [],
79
+ ["help"],
80
+ ["list"]
81
+ ];
82
+ static usage = Command.Usage({ description: "Show help for a command" });
83
+ commandPath = Option.Rest();
84
+ async execute() {
85
+ const commandName = this.commandPath.join(" ");
86
+ if (this.help || !commandName) {
87
+ const listing = await quarry.listUsage({
88
+ binaryName: this.cli.binaryName,
89
+ binaryLabel: this.cli.binaryLabel,
90
+ binaryVersion: this.cli.binaryVersion
91
+ });
92
+ this.context.stdout.write(listing + "\n");
93
+ return 0;
94
+ }
95
+ try {
96
+ const usage = await quarry.usage(commandName);
97
+ this.context.stdout.write(usage + "\n");
98
+ return 0;
99
+ } catch (error) {
100
+ if (error instanceof CommandNotFoundError) {
101
+ this.context.stderr.write(`Unknown command: ${commandName}\n`);
102
+ return 1;
103
+ }
104
+ throw error;
105
+ }
106
+ }
107
+ }
108
+ return HelpCommand;
109
+ }
110
+ //#endregion
111
+ //#region src/bin/quarry.ts
112
+ const require = createRequire(import.meta.url);
113
+ register(pathToFileURL(join(dirname(require.resolve("@swc-node/register")), "esm/esm.mjs")), pathToFileURL("./"));
114
+ register(new URL("./cloudflare-workers-loader.mjs", import.meta.url), pathToFileURL("./"));
115
+ const DEFAULT_ENTRY = "./src/index.ts";
116
+ const firstArg = process.argv[2];
117
+ let entryFile = DEFAULT_ENTRY;
118
+ if (firstArg && (firstArg.includes("/") || firstArg.includes("\\") || /\.(ts|js|mts|mjs)$/.test(firstArg))) {
119
+ entryFile = firstArg;
120
+ process.argv.splice(2, 1);
121
+ }
122
+ const entryPath = resolve(process.cwd(), entryFile);
123
+ if (!existsSync(entryPath)) {
124
+ console.error(`Error: Entry file not found: ${entryFile}`);
125
+ console.error("");
126
+ console.error("Create src/index.ts with a default Stratal export, or specify a custom path:");
127
+ console.error(" npx quarry ./path/to/entry.ts <command> [options]");
128
+ process.exit(1);
129
+ }
130
+ async function main() {
131
+ const { getPlatformProxy } = await import(createRequire(join(process.cwd(), "package.json")).resolve("wrangler"));
132
+ const { env, ctx, dispose } = await getPlatformProxy();
133
+ let app;
134
+ try {
135
+ globalThis.__stratalPlatformProxy = {
136
+ env,
137
+ waitUntil: ctx.waitUntil.bind(ctx)
138
+ };
139
+ await import(pathToFileURL(entryPath).href);
140
+ const [{ Stratal }, { DI_TOKENS }, { parseSignature }] = await Promise.all([
141
+ import("stratal"),
142
+ import("stratal/di"),
143
+ import("stratal/quarry")
144
+ ]);
145
+ app = await Stratal.resolveApplication();
146
+ const quarry = app.container.resolve(DI_TOKENS.Quarry);
147
+ const { Cli } = await import("clipanion");
148
+ const cli = new Cli({
149
+ binaryName: "quarry",
150
+ binaryLabel: "Quarry CLI",
151
+ binaryVersion: require("../../package.json").version
152
+ });
153
+ cli.register(createHelpCommand(quarry));
154
+ for (const cmd of createDynamicCommands(quarry, parseSignature, app)) cli.register(cmd);
155
+ await cli.runExit(process.argv.slice(2), { ...Cli.defaultContext });
156
+ } finally {
157
+ await app?.shutdown();
158
+ await dispose();
159
+ }
160
+ }
161
+ main().catch((error) => {
162
+ console.error("Fatal error:", error instanceof Error ? error.message : String(error));
163
+ process.exit(1);
164
+ });
165
+ //#endregion
166
+ export {};
167
+
168
+ //# sourceMappingURL=quarry.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quarry.mjs","names":[],"sources":["../../src/bin/commands/dynamic-command.ts","../../src/quarry/errors/command-not-found.error.ts","../../src/bin/commands/help-command.ts","../../src/bin/quarry.ts"],"sourcesContent":["import { Command, type CommandClass, Option, type Usage } from 'clipanion'\n\nimport type { Application } from 'stratal'\nimport type { QuarryRegistry } from 'stratal/quarry'\nimport type { ParsedSignature } from 'stratal/quarry'\n\n/** Create Clipanion command classes from Quarry-registered commands. */\nexport function createDynamicCommands(\n quarry: QuarryRegistry,\n parseSignature: (command: string) => ParsedSignature,\n app: Application,\n) {\n const commands: CommandClass[] = []\n\n for (const entry of quarry.list()) {\n const commandClass = quarry.get(entry.name)! as unknown as { command: string; description?: string; aliases?: string[] }\n const signature = parseSignature(commandClass.command)\n\n const paths: string[][] = [entry.name.split(' ')]\n if (commandClass.aliases) {\n for (const alias of commandClass.aliases) {\n paths.push(alias.split(' '))\n }\n }\n\n class DynCmd extends Command {\n static override paths = paths\n static override usage: Usage | undefined = commandClass.description\n ? Command.Usage({ description: commandClass.description })\n : undefined\n\n async execute(): Promise<number> {\n const input: Record<string, unknown> = {}\n\n for (const arg of signature.arguments) {\n const value = (this as Record<string, unknown>)[arg.name]\n if (value !== undefined) input[arg.name] = value\n }\n\n for (const opt of signature.options) {\n const value = (this as Record<string, unknown>)[opt.name]\n if (value !== undefined) input[opt.name] = value\n }\n\n const result = await app.handleCommand(entry.name, input)\n\n for (const line of result.output) {\n this.context.stdout.write(line + '\\n')\n }\n\n for (const err of result.errors) {\n this.context.stderr.write(err + '\\n')\n }\n\n return result.exitCode\n }\n }\n\n // Define Clipanion options/arguments as class property defaults\n const proto = DynCmd.prototype as unknown as Record<string, unknown>\n for (const arg of signature.arguments) {\n if (arg.isArray) {\n proto[arg.name] = Option.Rest({ name: arg.name, required: arg.required ? 1 : 0 })\n } else {\n proto[arg.name] = Option.String({ name: arg.name, required: arg.required })\n }\n }\n\n for (const opt of signature.options) {\n const optName = opt.alias ? `-${opt.alias},--${opt.name}` : `--${opt.name}`\n const optDescParts: string[] = []\n if (opt.description) optDescParts.push(opt.description)\n if (opt.default !== undefined) optDescParts.push(`(default: ${opt.default})`)\n const optDesc = optDescParts.length > 0 ? optDescParts.join(' ') : undefined\n\n if (opt.isFlag) {\n proto[opt.name] = Option.Boolean(optName, { description: optDesc })\n } else if (opt.isArray) {\n if (opt.default !== undefined) {\n proto[opt.name] = Option.Array(optName, [opt.default], { description: optDesc })\n } else {\n proto[opt.name] = Option.Array(optName, { description: optDesc })\n }\n } else {\n if (opt.default !== undefined) {\n proto[opt.name] = Option.String(optName, opt.default, { description: optDesc })\n } else {\n proto[opt.name] = Option.String(optName, { description: optDesc })\n }\n }\n }\n\n commands.push(DynCmd)\n }\n\n return commands\n}\n","/**\n * Thrown when a command is not found in the Quarry registry.\n */\nexport class CommandNotFoundError extends Error {\n constructor(name: string) {\n super(`Command \"${name}\" is not registered.`)\n this.name = 'CommandNotFoundError'\n }\n}\n","import { Command, Option, type Usage } from 'clipanion'\nimport { CommandNotFoundError } from '../../quarry/errors/command-not-found.error'\nimport type { QuarryRegistry } from '../../quarry/quarry-registry'\n\n/** Create the built-in `help`/`list` Clipanion command that delegates to Quarry's usage generator. */\nexport function createHelpCommand(quarry: QuarryRegistry) {\n class HelpCommand extends Command {\n static override paths = [[], ['help'], ['list']]\n static override usage: Usage = Command.Usage({ description: 'Show help for a command' })\n\n commandPath = Option.Rest()\n\n async execute(): Promise<number> {\n const commandName = this.commandPath.join(' ')\n\n if (this.help || !commandName) {\n const listing = await quarry.listUsage({\n binaryName: this.cli.binaryName,\n binaryLabel: this.cli.binaryLabel,\n binaryVersion: this.cli.binaryVersion,\n })\n this.context.stdout.write(listing + '\\n')\n return 0\n }\n\n try {\n const usage = await quarry.usage(commandName)\n this.context.stdout.write(usage + '\\n')\n return 0\n } catch (error) {\n if (error instanceof CommandNotFoundError) {\n this.context.stderr.write(`Unknown command: ${commandName}\\n`)\n return 1\n }\n throw error\n }\n }\n }\n\n return HelpCommand\n}\n","import 'reflect-metadata'\n\nimport { existsSync } from 'node:fs'\nimport { createRequire, register } from 'node:module'\nimport { dirname, join, resolve } from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport type { QuarryRegistry } from 'stratal/quarry'\n\nimport { type Application } from '../application'\nimport { createDynamicCommands } from './commands/dynamic-command'\nimport { createHelpCommand } from './commands/help-command'\n\nconst require = createRequire(import.meta.url)\n\n// Register @swc-node/register for TypeScript + decorator support\nconst swcRegisterPath = join(dirname(require.resolve('@swc-node/register')), 'esm/esm.mjs')\nregister(pathToFileURL(swcRegisterPath), pathToFileURL('./'))\n\n// Register cloudflare:workers virtual module loader\nregister(new URL('./cloudflare-workers-loader.mjs', import.meta.url), pathToFileURL('./'))\n\nconst DEFAULT_ENTRY = './src/index.ts'\n\n// Determine entry file: if first arg looks like a file path, use it; otherwise use default\nconst firstArg = process.argv[2]\nlet entryFile = DEFAULT_ENTRY\n\nif (firstArg && (firstArg.includes('/') || firstArg.includes('\\\\') || /\\.(ts|js|mts|mjs)$/.test(firstArg))) {\n entryFile = firstArg\n // Remove the entry file from argv so Clipanion sees: [node, script, command, ...options]\n process.argv.splice(2, 1)\n}\n\n// Resolve and validate the entry file\nconst entryPath = resolve(process.cwd(), entryFile)\n\nif (!existsSync(entryPath)) {\n console.error(`Error: Entry file not found: ${entryFile}`)\n console.error('')\n console.error('Create src/index.ts with a default Stratal export, or specify a custom path:')\n console.error(' npx quarry ./path/to/entry.ts <command> [options]')\n process.exit(1)\n}\n\nasync function main(): Promise<void> {\n const cwdRequire = createRequire(join(process.cwd(), 'package.json'))\n // eslint-disable-next-line @typescript-eslint/consistent-type-imports\n const { getPlatformProxy } = await import(cwdRequire.resolve('wrangler')) as typeof import('wrangler')\n const { env, ctx, dispose } = await getPlatformProxy()\n\n let app: Application | undefined\n try {\n // Store platform proxy on globalThis so the cloudflare:workers virtual module can read it\n (globalThis as Record<string, unknown>).__stratalPlatformProxy = {\n env,\n waitUntil: ctx.waitUntil.bind(ctx),\n }\n\n // Import user's entry file — triggers `new Stratal(...)` + full Application init\n await import(pathToFileURL(entryPath).href)\n\n // Parallel import of stratal modules\n const [\n { Stratal },\n { DI_TOKENS },\n { parseSignature },\n ] = await Promise.all([\n import('stratal'),\n import('stratal/di'),\n import('stratal/quarry'),\n ])\n\n app = await Stratal.resolveApplication()\n const quarry = app.container.resolve<QuarryRegistry>(DI_TOKENS.Quarry)\n\n // Build Clipanion CLI\n const { Cli } = await import('clipanion')\n const pkg = require('../../package.json') as { version: string }\n\n const cli = new Cli({\n binaryName: 'quarry',\n binaryLabel: 'Quarry CLI',\n binaryVersion: pkg.version,\n })\n\n cli.register(createHelpCommand(quarry))\n\n for (const cmd of createDynamicCommands(quarry, parseSignature, app)) {\n cli.register(cmd)\n }\n\n await cli.runExit(process.argv.slice(2), { ...Cli.defaultContext })\n } finally {\n await app?.shutdown()\n await dispose()\n }\n}\n\nmain().catch((error: unknown) => {\n console.error('Fatal error:', error instanceof Error ? error.message : String(error))\n process.exit(1)\n})\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { Ht as StratalEnv, s as ApplicationError } from "../index-C9bIk5tt.mjs";
2
- import { i as LoggerService } from "../index-3TtGtYlJ.mjs";
1
+ import { Ht as StratalEnv, s as ApplicationError } from "../index-BJWm863C.mjs";
2
+ import { i as LoggerService } from "../index-Dp6A5ywM.mjs";
3
3
 
4
4
  //#region src/cache/cache.module.d.ts
5
5
  /**
@@ -1,9 +1,14 @@
1
- import { S as ApplicationError, b as ERROR_CODES } from "../errors-BRJgVd5-.mjs";
2
- import { a as __decorate, d as Transient, g as DI_TOKENS, o as __decorateParam, s as __decorateMetadata, u as LOGGER_TOKENS } from "../logger-Bg-CuidS.mjs";
3
- import { r as Module } from "../module-Dvzm4dhS.mjs";
4
- import "../events-CQyvSyrQ.mjs";
5
- import "../middleware-B3tx1u1K.mjs";
6
- import "../router-context-DlTxpJUG.mjs";
1
+ import { S as ApplicationError, b as ERROR_CODES } from "../errors-CtCi1wn6.mjs";
2
+ import { i as Transient, l as DI_TOKENS, n as __decorateParam, r as __decorateMetadata, t as __decorate } from "../decorate-D5j-d9_z.mjs";
3
+ import { s as LOGGER_TOKENS } from "../logger-BR1-s1Um.mjs";
4
+ import { r as Module } from "../module-BgdxxzBe.mjs";
5
+ import "../events-CXl-o1Ad.mjs";
6
+ import "../colors-DJaRDXoS.mjs";
7
+ import "../command-BvCOD6df.mjs";
8
+ import "../is-command-BfCgWAcQ.mjs";
9
+ import "../is-seeder-CebjZCDn.mjs";
10
+ import "../middleware-C0Ebzswy.mjs";
11
+ import "../router-context-BEJe9HEB.mjs";
7
12
  import { inject } from "tsyringe";
8
13
  //#region src/cache/cache.tokens.ts
9
14
  const CACHE_TOKENS = { CacheService: Symbol.for("stratal:cache:service") };
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../src/cache/cache.tokens.ts","../../src/cache/errors/cache-get.error.ts","../../src/cache/errors/cache-put.error.ts","../../src/cache/errors/cache-delete.error.ts","../../src/cache/errors/cache-list.error.ts","../../src/cache/services/cache.service.ts","../../src/cache/cache.module.ts"],"sourcesContent":["export const CACHE_TOKENS = {\n CacheService: Symbol.for('stratal:cache:service'),\n} as const\n\nexport type CacheToken = (typeof CACHE_TOKENS)[keyof typeof CACHE_TOKENS]\n","import { ERROR_CODES } from '../../errors'\nimport { ApplicationError } from '../../errors'\n\n/**\n * Error thrown when a cache get operation fails\n *\n * Raw error details are logged via LoggerService for security.\n * Only the key is included in the user-facing error message.\n */\nexport class CacheGetError extends ApplicationError {\n constructor(key: string) {\n super('errors.cache.getFailed', ERROR_CODES.SYSTEM.INFRASTRUCTURE_ERROR, { key })\n }\n}\n","import { ERROR_CODES } from '../../errors'\nimport { ApplicationError } from '../../errors'\n\n/**\n * Error thrown when a cache put operation fails\n *\n * Raw error details are logged via LoggerService for security.\n * Only the key is included in the user-facing error message.\n */\nexport class CachePutError extends ApplicationError {\n constructor(key: string) {\n super('errors.cache.putFailed', ERROR_CODES.SYSTEM.INFRASTRUCTURE_ERROR, { key })\n }\n}\n","import { ERROR_CODES } from '../../errors'\nimport { ApplicationError } from '../../errors'\n\n/**\n * Error thrown when a cache delete operation fails\n *\n * Raw error details are logged via LoggerService for security.\n * Only the key is included in the user-facing error message.\n */\nexport class CacheDeleteError extends ApplicationError {\n constructor(key: string) {\n super('errors.cache.deleteFailed', ERROR_CODES.SYSTEM.INFRASTRUCTURE_ERROR, { key })\n }\n}\n","import { ERROR_CODES } from '../../errors'\nimport { ApplicationError } from '../../errors'\n\n/**\n * Error thrown when a cache list operation fails\n *\n * Raw error details are logged via LoggerService for security.\n */\nexport class CacheListError extends ApplicationError {\n constructor() {\n super('errors.cache.listFailed', ERROR_CODES.SYSTEM.INFRASTRUCTURE_ERROR, {})\n }\n}\n","import { inject } from 'tsyringe'\nimport { Transient } from '../../di/decorators'\nimport { DI_TOKENS } from '../../di/tokens'\nimport { type StratalEnv } from '../../env'\nimport { LOGGER_TOKENS, type LoggerService } from '../../logger'\nimport { CACHE_TOKENS } from '../cache.tokens'\nimport {\n CacheDeleteError,\n CacheGetError,\n CacheListError,\n CachePutError,\n} from '../errors'\n\n/**\n * Cache Service\n *\n * Type-safe wrapper around Cloudflare KV namespaces for caching operations.\n *\n * **Features:**\n * - Mirrors all KVNamespace methods with full type safety\n * - Supports multiple KV bindings via `withBinding()`\n * - Automatic error handling with logging\n * - Security: Raw errors are logged, not exposed to users\n *\n * **Usage:**\n * ```typescript\n * class MyService {\n * private readonly uploadsCache: CacheService\n *\n * constructor(\n * @inject(CACHE_TOKENS.CacheService) private readonly cache: CacheService,\n * @inject(DI_TOKENS.CloudflareEnv) private readonly env: Env\n * ) {\n * // Initialize specialized caches in constructor\n * this.uploadsCache = this.cache.withBinding(this.env.UPLOADS_CACHE)\n * }\n *\n * async cacheData(key: string, value: string) {\n * await this.cache.put(key, value, { expirationTtl: 3600 })\n * await this.uploadsCache.put(`upload:${key}`, value)\n * }\n * }\n * ```\n *\n * @see https://developers.cloudflare.com/kv/api/\n */\n@Transient(CACHE_TOKENS.CacheService)\nexport class CacheService {\n private kv: KVNamespace\n\n constructor(\n @inject(DI_TOKENS.CloudflareEnv) private readonly env: StratalEnv,\n @inject(LOGGER_TOKENS.LoggerService) private readonly logger: LoggerService\n ) {\n this.kv = env.CACHE\n }\n\n /**\n * Set the KV namespace binding\n *\n * Used internally by `withBinding()` to configure different KV instances.\n *\n * @param kv - KV namespace to use\n */\n setKV(kv: KVNamespace): void {\n this.kv = kv\n }\n\n /**\n * Create a new CacheService instance with a different KV binding\n *\n * **Pattern:** Returns a new instance (immutable)\n *\n * **Best Practice:** Initialize specialized caches as class properties in constructor\n *\n * @example\n * ```typescript\n * class MyService {\n * private readonly uploadsCache: CacheService\n * private readonly systemCache: CacheService\n *\n * constructor(\n * @inject(CACHE_TOKENS.CacheService) private readonly cache: CacheService,\n * @inject(DI_TOKENS.CloudflareEnv) private readonly env: Env\n * ) {\n * this.uploadsCache = this.cache.withBinding(this.env.UPLOADS_CACHE)\n * this.systemCache = this.cache.withBinding(this.env.SYSTEM_CONFIG_KV)\n * }\n * }\n * ```\n *\n * @param kv - KV namespace to use\n * @returns New CacheService instance with the specified binding\n */\n withBinding(kv: KVNamespace): CacheService {\n const instance = new CacheService(this.env, this.logger)\n instance.setKV(kv)\n return instance\n }\n\n // ==================== GET METHODS ====================\n\n /**\n * Get a value from cache\n *\n * @param key - Cache key\n * @param typeOrOptions - Type string or options object (defaults to 'text')\n * @returns Value in specified type, or null if not found\n * @throws {CacheGetError} If operation fails\n */\n async get(key: string, typeOrOptions?: 'text' | KVNamespaceGetOptions<'text'>): Promise<string | null>\n async get<ExpectedValue = unknown>(key: string, typeOrOptions: 'json' | KVNamespaceGetOptions<'json'>): Promise<ExpectedValue | null>\n async get(key: string, typeOrOptions: 'arrayBuffer' | KVNamespaceGetOptions<'arrayBuffer'>): Promise<ArrayBuffer | null>\n async get(key: string, typeOrOptions: 'stream' | KVNamespaceGetOptions<'stream'>): Promise<ReadableStream | null>\n\n async get<ExpectedValue = unknown>(\n key: string,\n typeOrOptions?: string | KVNamespaceGetOptions<'text' | 'json' | 'arrayBuffer' | 'stream'>\n ): Promise<string | ExpectedValue | ArrayBuffer | ReadableStream | null> {\n try {\n if (typeof typeOrOptions === 'string') {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any -- bridging KV overloaded API\n return await this.kv.get(key, typeOrOptions as any)\n }\n\n if (typeOrOptions) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any -- bridging KV overloaded API\n return await this.kv.get(key, typeOrOptions as any)\n }\n\n return await this.kv.get(key)\n } catch (error) {\n this.logger.error('Cache get operation failed', { key, error })\n throw new CacheGetError(key)\n }\n }\n\n // ==================== GET WITH METADATA METHODS ====================\n\n /**\n * Get a value with metadata from cache\n *\n * @param key - Cache key\n * @param typeOrOptions - Type string or options object (defaults to 'text')\n * @returns Object with value, metadata, and cacheStatus\n * @throws {CacheGetError} If operation fails\n */\n async getWithMetadata<Metadata = unknown>(\n key: string,\n typeOrOptions?: 'text' | KVNamespaceGetOptions<'text'>\n ): Promise<KVNamespaceGetWithMetadataResult<string, Metadata>>\n async getWithMetadata<ExpectedValue = unknown, Metadata = unknown>(\n key: string,\n typeOrOptions: 'json' | KVNamespaceGetOptions<'json'>\n ): Promise<KVNamespaceGetWithMetadataResult<ExpectedValue, Metadata>>\n async getWithMetadata<Metadata = unknown>(\n key: string,\n typeOrOptions: 'arrayBuffer' | KVNamespaceGetOptions<'arrayBuffer'>\n ): Promise<KVNamespaceGetWithMetadataResult<ArrayBuffer, Metadata>>\n async getWithMetadata<Metadata = unknown>(\n key: string,\n typeOrOptions: 'stream' | KVNamespaceGetOptions<'stream'>\n ): Promise<KVNamespaceGetWithMetadataResult<ReadableStream, Metadata>>\n\n async getWithMetadata<ExpectedValue = unknown, Metadata = unknown>(\n key: string,\n typeOrOptions?: string | KVNamespaceGetOptions<'text' | 'json' | 'arrayBuffer' | 'stream'>\n ): Promise<\n KVNamespaceGetWithMetadataResult<\n string | ExpectedValue | ArrayBuffer | ReadableStream,\n Metadata\n >\n > {\n try {\n if (typeof typeOrOptions === 'string') {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any -- bridging KV overloaded API\n return await this.kv.getWithMetadata(key, typeOrOptions as any)\n }\n\n if (typeOrOptions) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any -- bridging KV overloaded API\n return await this.kv.getWithMetadata(key, typeOrOptions as any)\n }\n\n return await this.kv.getWithMetadata(key)\n } catch (error) {\n this.logger.error('Cache getWithMetadata operation failed', { key, error })\n throw new CacheGetError(key)\n }\n }\n\n // ==================== PUT METHOD ====================\n\n /**\n * Store a value in cache\n *\n * @param key - Cache key\n * @param value - Value to store (string, ArrayBuffer, ArrayBufferView, or ReadableStream)\n * @param options - Put options (expiration, expirationTtl, metadata)\n * @throws {CachePutError} If operation fails\n *\n * @example\n * ```typescript\n * // Simple put\n * await cache.put('key', 'value')\n *\n * // With TTL\n * await cache.put('key', 'value', { expirationTtl: 3600 })\n *\n * // With metadata\n * await cache.put('key', 'value', { metadata: { created: Date.now() } })\n * ```\n */\n async put(\n key: string,\n value: string | ArrayBuffer | ArrayBufferView | ReadableStream,\n options?: KVNamespacePutOptions\n ): Promise<void> {\n try {\n await this.kv.put(key, value as string, options)\n } catch (error) {\n this.logger.error('Cache put operation failed', { key, error })\n throw new CachePutError(key)\n }\n }\n\n // ==================== DELETE METHODS ====================\n\n /**\n * Delete a value from cache\n *\n * @param key - Cache key to delete\n * @throws {CacheDeleteError} If operation fails\n */\n async delete(key: string): Promise<void> {\n try {\n await this.kv.delete(key)\n } catch (error) {\n this.logger.error('Cache delete operation failed', { key, error })\n throw new CacheDeleteError(key)\n }\n }\n\n\n // ==================== LIST METHOD ====================\n\n /**\n * List keys in cache\n *\n * @param options - List options (limit, prefix, cursor)\n * @returns List result with keys and pagination info\n * @throws {CacheListError} If operation fails\n *\n * @example\n * ```typescript\n * // List all keys\n * const result = await cache.list()\n *\n * // List with prefix\n * const result = await cache.list({ prefix: 'user:' })\n *\n * // Paginated list\n * const result = await cache.list({ limit: 100 })\n * if (!result.list_complete) {\n * const nextPage = await cache.list({ cursor: result.cursor })\n * }\n * ```\n */\n async list<Metadata = unknown>(\n options?: KVNamespaceListOptions\n ): Promise<KVNamespaceListResult<Metadata>> {\n try {\n return await this.kv.list<Metadata>(options)\n } catch (error) {\n this.logger.error('Cache list operation failed', { options, error })\n throw new CacheListError()\n }\n }\n}\n","/**\n * Cache Module\n *\n * Provides key-value caching capabilities using Cloudflare KV namespaces.\n *\n * **Features:**\n * - Type-safe KV wrapper with full method coverage\n * - Multiple KV binding support via `withBinding()`\n * - Automatic error handling with security-focused logging\n * - Singleton service for optimal performance\n */\n\nimport { Module } from '../module'\nimport { CACHE_TOKENS } from './cache.tokens'\nimport { CacheService } from './services'\n\n@Module({\n providers: [\n // Singleton - CacheService has no request dependencies\n { provide: CACHE_TOKENS.CacheService, useClass: CacheService },\n ],\n})\nexport class CacheModule {}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/cache/cache.tokens.ts","../../src/cache/errors/cache-get.error.ts","../../src/cache/errors/cache-put.error.ts","../../src/cache/errors/cache-delete.error.ts","../../src/cache/errors/cache-list.error.ts","../../src/cache/services/cache.service.ts","../../src/cache/cache.module.ts"],"sourcesContent":["export const CACHE_TOKENS = {\n CacheService: Symbol.for('stratal:cache:service'),\n} as const\n\nexport type CacheToken = (typeof CACHE_TOKENS)[keyof typeof CACHE_TOKENS]\n","import { ERROR_CODES } from '../../errors'\nimport { ApplicationError } from '../../errors'\n\n/**\n * Error thrown when a cache get operation fails\n *\n * Raw error details are logged via LoggerService for security.\n * Only the key is included in the user-facing error message.\n */\nexport class CacheGetError extends ApplicationError {\n constructor(key: string) {\n super('errors.cache.getFailed', ERROR_CODES.SYSTEM.INFRASTRUCTURE_ERROR, { key })\n }\n}\n","import { ERROR_CODES } from '../../errors'\nimport { ApplicationError } from '../../errors'\n\n/**\n * Error thrown when a cache put operation fails\n *\n * Raw error details are logged via LoggerService for security.\n * Only the key is included in the user-facing error message.\n */\nexport class CachePutError extends ApplicationError {\n constructor(key: string) {\n super('errors.cache.putFailed', ERROR_CODES.SYSTEM.INFRASTRUCTURE_ERROR, { key })\n }\n}\n","import { ERROR_CODES } from '../../errors'\nimport { ApplicationError } from '../../errors'\n\n/**\n * Error thrown when a cache delete operation fails\n *\n * Raw error details are logged via LoggerService for security.\n * Only the key is included in the user-facing error message.\n */\nexport class CacheDeleteError extends ApplicationError {\n constructor(key: string) {\n super('errors.cache.deleteFailed', ERROR_CODES.SYSTEM.INFRASTRUCTURE_ERROR, { key })\n }\n}\n","import { ERROR_CODES } from '../../errors'\nimport { ApplicationError } from '../../errors'\n\n/**\n * Error thrown when a cache list operation fails\n *\n * Raw error details are logged via LoggerService for security.\n */\nexport class CacheListError extends ApplicationError {\n constructor() {\n super('errors.cache.listFailed', ERROR_CODES.SYSTEM.INFRASTRUCTURE_ERROR, {})\n }\n}\n","import { inject } from 'tsyringe'\nimport { Transient } from '../../di/decorators'\nimport { DI_TOKENS } from '../../di/tokens'\nimport { type StratalEnv } from '../../env'\nimport { LOGGER_TOKENS, type LoggerService } from '../../logger'\nimport { CACHE_TOKENS } from '../cache.tokens'\nimport {\n CacheDeleteError,\n CacheGetError,\n CacheListError,\n CachePutError,\n} from '../errors'\n\n/**\n * Cache Service\n *\n * Type-safe wrapper around Cloudflare KV namespaces for caching operations.\n *\n * **Features:**\n * - Mirrors all KVNamespace methods with full type safety\n * - Supports multiple KV bindings via `withBinding()`\n * - Automatic error handling with logging\n * - Security: Raw errors are logged, not exposed to users\n *\n * **Usage:**\n * ```typescript\n * class MyService {\n * private readonly uploadsCache: CacheService\n *\n * constructor(\n * @inject(CACHE_TOKENS.CacheService) private readonly cache: CacheService,\n * @inject(DI_TOKENS.CloudflareEnv) private readonly env: Env\n * ) {\n * // Initialize specialized caches in constructor\n * this.uploadsCache = this.cache.withBinding(this.env.UPLOADS_CACHE)\n * }\n *\n * async cacheData(key: string, value: string) {\n * await this.cache.put(key, value, { expirationTtl: 3600 })\n * await this.uploadsCache.put(`upload:${key}`, value)\n * }\n * }\n * ```\n *\n * @see https://developers.cloudflare.com/kv/api/\n */\n@Transient(CACHE_TOKENS.CacheService)\nexport class CacheService {\n private kv: KVNamespace\n\n constructor(\n @inject(DI_TOKENS.CloudflareEnv) private readonly env: StratalEnv,\n @inject(LOGGER_TOKENS.LoggerService) private readonly logger: LoggerService\n ) {\n this.kv = env.CACHE\n }\n\n /**\n * Set the KV namespace binding\n *\n * Used internally by `withBinding()` to configure different KV instances.\n *\n * @param kv - KV namespace to use\n */\n setKV(kv: KVNamespace): void {\n this.kv = kv\n }\n\n /**\n * Create a new CacheService instance with a different KV binding\n *\n * **Pattern:** Returns a new instance (immutable)\n *\n * **Best Practice:** Initialize specialized caches as class properties in constructor\n *\n * @example\n * ```typescript\n * class MyService {\n * private readonly uploadsCache: CacheService\n * private readonly systemCache: CacheService\n *\n * constructor(\n * @inject(CACHE_TOKENS.CacheService) private readonly cache: CacheService,\n * @inject(DI_TOKENS.CloudflareEnv) private readonly env: Env\n * ) {\n * this.uploadsCache = this.cache.withBinding(this.env.UPLOADS_CACHE)\n * this.systemCache = this.cache.withBinding(this.env.SYSTEM_CONFIG_KV)\n * }\n * }\n * ```\n *\n * @param kv - KV namespace to use\n * @returns New CacheService instance with the specified binding\n */\n withBinding(kv: KVNamespace): CacheService {\n const instance = new CacheService(this.env, this.logger)\n instance.setKV(kv)\n return instance\n }\n\n // ==================== GET METHODS ====================\n\n /**\n * Get a value from cache\n *\n * @param key - Cache key\n * @param typeOrOptions - Type string or options object (defaults to 'text')\n * @returns Value in specified type, or null if not found\n * @throws {CacheGetError} If operation fails\n */\n async get(key: string, typeOrOptions?: 'text' | KVNamespaceGetOptions<'text'>): Promise<string | null>\n async get<ExpectedValue = unknown>(key: string, typeOrOptions: 'json' | KVNamespaceGetOptions<'json'>): Promise<ExpectedValue | null>\n async get(key: string, typeOrOptions: 'arrayBuffer' | KVNamespaceGetOptions<'arrayBuffer'>): Promise<ArrayBuffer | null>\n async get(key: string, typeOrOptions: 'stream' | KVNamespaceGetOptions<'stream'>): Promise<ReadableStream | null>\n\n async get<ExpectedValue = unknown>(\n key: string,\n typeOrOptions?: string | KVNamespaceGetOptions<'text' | 'json' | 'arrayBuffer' | 'stream'>\n ): Promise<string | ExpectedValue | ArrayBuffer | ReadableStream | null> {\n try {\n if (typeof typeOrOptions === 'string') {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any -- bridging KV overloaded API\n return await this.kv.get(key, typeOrOptions as any)\n }\n\n if (typeOrOptions) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any -- bridging KV overloaded API\n return await this.kv.get(key, typeOrOptions as any)\n }\n\n return await this.kv.get(key)\n } catch (error) {\n this.logger.error('Cache get operation failed', { key, error })\n throw new CacheGetError(key)\n }\n }\n\n // ==================== GET WITH METADATA METHODS ====================\n\n /**\n * Get a value with metadata from cache\n *\n * @param key - Cache key\n * @param typeOrOptions - Type string or options object (defaults to 'text')\n * @returns Object with value, metadata, and cacheStatus\n * @throws {CacheGetError} If operation fails\n */\n async getWithMetadata<Metadata = unknown>(\n key: string,\n typeOrOptions?: 'text' | KVNamespaceGetOptions<'text'>\n ): Promise<KVNamespaceGetWithMetadataResult<string, Metadata>>\n async getWithMetadata<ExpectedValue = unknown, Metadata = unknown>(\n key: string,\n typeOrOptions: 'json' | KVNamespaceGetOptions<'json'>\n ): Promise<KVNamespaceGetWithMetadataResult<ExpectedValue, Metadata>>\n async getWithMetadata<Metadata = unknown>(\n key: string,\n typeOrOptions: 'arrayBuffer' | KVNamespaceGetOptions<'arrayBuffer'>\n ): Promise<KVNamespaceGetWithMetadataResult<ArrayBuffer, Metadata>>\n async getWithMetadata<Metadata = unknown>(\n key: string,\n typeOrOptions: 'stream' | KVNamespaceGetOptions<'stream'>\n ): Promise<KVNamespaceGetWithMetadataResult<ReadableStream, Metadata>>\n\n async getWithMetadata<ExpectedValue = unknown, Metadata = unknown>(\n key: string,\n typeOrOptions?: string | KVNamespaceGetOptions<'text' | 'json' | 'arrayBuffer' | 'stream'>\n ): Promise<\n KVNamespaceGetWithMetadataResult<\n string | ExpectedValue | ArrayBuffer | ReadableStream,\n Metadata\n >\n > {\n try {\n if (typeof typeOrOptions === 'string') {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any -- bridging KV overloaded API\n return await this.kv.getWithMetadata(key, typeOrOptions as any)\n }\n\n if (typeOrOptions) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-explicit-any -- bridging KV overloaded API\n return await this.kv.getWithMetadata(key, typeOrOptions as any)\n }\n\n return await this.kv.getWithMetadata(key)\n } catch (error) {\n this.logger.error('Cache getWithMetadata operation failed', { key, error })\n throw new CacheGetError(key)\n }\n }\n\n // ==================== PUT METHOD ====================\n\n /**\n * Store a value in cache\n *\n * @param key - Cache key\n * @param value - Value to store (string, ArrayBuffer, ArrayBufferView, or ReadableStream)\n * @param options - Put options (expiration, expirationTtl, metadata)\n * @throws {CachePutError} If operation fails\n *\n * @example\n * ```typescript\n * // Simple put\n * await cache.put('key', 'value')\n *\n * // With TTL\n * await cache.put('key', 'value', { expirationTtl: 3600 })\n *\n * // With metadata\n * await cache.put('key', 'value', { metadata: { created: Date.now() } })\n * ```\n */\n async put(\n key: string,\n value: string | ArrayBuffer | ArrayBufferView | ReadableStream,\n options?: KVNamespacePutOptions\n ): Promise<void> {\n try {\n await this.kv.put(key, value as string, options)\n } catch (error) {\n this.logger.error('Cache put operation failed', { key, error })\n throw new CachePutError(key)\n }\n }\n\n // ==================== DELETE METHODS ====================\n\n /**\n * Delete a value from cache\n *\n * @param key - Cache key to delete\n * @throws {CacheDeleteError} If operation fails\n */\n async delete(key: string): Promise<void> {\n try {\n await this.kv.delete(key)\n } catch (error) {\n this.logger.error('Cache delete operation failed', { key, error })\n throw new CacheDeleteError(key)\n }\n }\n\n\n // ==================== LIST METHOD ====================\n\n /**\n * List keys in cache\n *\n * @param options - List options (limit, prefix, cursor)\n * @returns List result with keys and pagination info\n * @throws {CacheListError} If operation fails\n *\n * @example\n * ```typescript\n * // List all keys\n * const result = await cache.list()\n *\n * // List with prefix\n * const result = await cache.list({ prefix: 'user:' })\n *\n * // Paginated list\n * const result = await cache.list({ limit: 100 })\n * if (!result.list_complete) {\n * const nextPage = await cache.list({ cursor: result.cursor })\n * }\n * ```\n */\n async list<Metadata = unknown>(\n options?: KVNamespaceListOptions\n ): Promise<KVNamespaceListResult<Metadata>> {\n try {\n return await this.kv.list<Metadata>(options)\n } catch (error) {\n this.logger.error('Cache list operation failed', { options, error })\n throw new CacheListError()\n }\n }\n}\n","/**\n * Cache Module\n *\n * Provides key-value caching capabilities using Cloudflare KV namespaces.\n *\n * **Features:**\n * - Type-safe KV wrapper with full method coverage\n * - Multiple KV binding support via `withBinding()`\n * - Automatic error handling with security-focused logging\n * - Singleton service for optimal performance\n */\n\nimport { Module } from '../module'\nimport { CACHE_TOKENS } from './cache.tokens'\nimport { CacheService } from './services'\n\n@Module({\n providers: [\n // Singleton - CacheService has no request dependencies\n { provide: CACHE_TOKENS.CacheService, useClass: CacheService },\n ],\n})\nexport class CacheModule {}\n"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ //#region src/quarry/colors.ts
2
+ /** Minimal ANSI color helpers that respect the `NO_COLOR` convention. */
3
+ const isEnabled = () => typeof process !== "undefined" ? !process.env.NO_COLOR : true;
4
+ /** Create an ANSI formatter that wraps text with the given open/close SGR codes. */
5
+ const code = (open, close) => (s) => isEnabled() ? `\x1b[${open}m${s}\x1b[${close}m` : s;
6
+ const bold = code(1, 22);
7
+ const dim = code(2, 22);
8
+ const cyan = code(36, 39);
9
+ const green = code(32, 39);
10
+ const red = code(31, 39);
11
+ const yellow = code(33, 39);
12
+ const dimWhite = (s) => isEnabled() ? `\x1b[2;37m${s}\x1b[22;39m` : s;
13
+ //#endregion
14
+ export { green as a, dimWhite as i, cyan as n, red as o, dim as r, yellow as s, bold as t };
15
+
16
+ //# sourceMappingURL=colors-DJaRDXoS.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors-DJaRDXoS.mjs","names":[],"sources":["../src/quarry/colors.ts"],"sourcesContent":["/** Minimal ANSI color helpers that respect the `NO_COLOR` convention. */\nconst isEnabled = () => typeof process !== 'undefined' ? !process.env.NO_COLOR : true\n\n/** Create an ANSI formatter that wraps text with the given open/close SGR codes. */\nconst code = (open: number, close: number) => (s: string) =>\n isEnabled() ? `\\x1b[${open}m${s}\\x1b[${close}m` : s\n\nexport const bold = code(1, 22)\nexport const dim = code(2, 22)\nexport const cyan = code(36, 39)\nexport const green = code(32, 39)\nexport const red = code(31, 39)\nexport const yellow = code(33, 39)\nexport const dimWhite = (s: string) =>\n isEnabled() ? `\\x1b[2;37m${s}\\x1b[22;39m` : s\n"],"mappings":";;AACA,MAAM,kBAAkB,OAAO,YAAY,cAAc,CAAC,QAAQ,IAAI,WAAW;;AAGjF,MAAM,QAAQ,MAAc,WAAmB,MAC7C,WAAW,GAAG,QAAQ,KAAK,GAAG,EAAE,OAAO,MAAM,KAAK;AAEpD,MAAa,OAAO,KAAK,GAAG,GAAG;AAC/B,MAAa,MAAM,KAAK,GAAG,GAAG;AAC9B,MAAa,OAAO,KAAK,IAAI,GAAG;AAChC,MAAa,QAAQ,KAAK,IAAI,GAAG;AACjC,MAAa,MAAM,KAAK,IAAI,GAAG;AAC/B,MAAa,SAAS,KAAK,IAAI,GAAG;AAClC,MAAa,YAAY,MACvB,WAAW,GAAG,aAAa,EAAE,eAAe"}
@@ -0,0 +1,120 @@
1
+ import { n as CommandInternals, r as CommandResult, t as CommandInput } from "./types-CLhOhYsQ.mjs";
2
+ //#region src/quarry/constants.d.ts
3
+ /**
4
+ * Symbol key for storing internal mutable state on Command instances.
5
+ * Keeps internal state hidden from user-facing autocomplete.
6
+ */
7
+ declare const COMMAND_INTERNALS: unique symbol;
8
+ //#endregion
9
+ //#region src/quarry/command.d.ts
10
+ /**
11
+ * Abstract base class for Quarry commands.
12
+ *
13
+ * Subclasses define a static `command` signature string and implement `handle()`.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * export class GreetCommand extends Command {
18
+ * static command = 'greet {name : The name to greet} {--loud}'
19
+ * static description = 'Greet someone'
20
+ *
21
+ * async handle(): Promise<void> {
22
+ * const name = this.string('name')
23
+ * const loud = this.boolean('loud')
24
+ * this.info(loud ? `HELLO, ${name.toUpperCase()}!` : `Hello, ${name}!`)
25
+ * }
26
+ * }
27
+ * ```
28
+ */
29
+ declare abstract class Command {
30
+ /**
31
+ * Laravel-style command signature string.
32
+ *
33
+ * **Command names:**
34
+ * - `'greet'` — flat command (`quarry greet`)
35
+ * - `'task add'` — subcommand hierarchy via spaces (`quarry task add`)
36
+ * - `'task:add'` — namespaced flat command via colons (`quarry task:add`)
37
+ *
38
+ * **Arguments:**
39
+ * - `{name}` — required argument
40
+ * - `{name?}` — optional argument
41
+ * - `{name=default}` — argument with default value
42
+ * - `{name*}` — array/variadic argument
43
+ * - `{name : description}` — argument with description
44
+ *
45
+ * **Options:**
46
+ * - `{--flag}` — boolean flag
47
+ * - `{--name=}` — option that accepts a value
48
+ * - `{--name=default}` — option with default value
49
+ * - `{--name=*}` — array option (multiple values)
50
+ * - `{--A|name}` — option with single-char alias
51
+ * - `{--name= : description}` — option with description
52
+ *
53
+ * @example
54
+ * ```typescript
55
+ * // Namespaced flat command: `quarry users:create ...`
56
+ * static command = 'users:create {email : The user email} {--A|admin} {--R|role= : Assign a role}'
57
+ *
58
+ * // Subcommand hierarchy: `quarry users create ...`
59
+ * static command = 'users create {email : The user email} {--A|admin} {--R|role= : Assign a role}'
60
+ * ```
61
+ */
62
+ static command: string;
63
+ /** Human-readable description */
64
+ static description?: string;
65
+ /** Alternative command names */
66
+ static aliases?: string[];
67
+ [COMMAND_INTERNALS]: CommandInternals;
68
+ constructor();
69
+ /**
70
+ * Implement this method with the command's logic.
71
+ * Return a number to set the exit code, or void for exit code 0.
72
+ */
73
+ abstract handle(): number | void | Promise<number | void>;
74
+ /**
75
+ * Get an input value with generic type.
76
+ */
77
+ input<T>(name: string): T;
78
+ /**
79
+ * Get a string input. Throws CommandError if present but not a string.
80
+ */
81
+ string(name: string): string;
82
+ /**
83
+ * Get a boolean input. Throws CommandError if present but not a boolean.
84
+ */
85
+ boolean(name: string): boolean;
86
+ /**
87
+ * Get a number input. Coerces strings to numbers. Throws CommandError on NaN.
88
+ */
89
+ number(name: string): number;
90
+ /**
91
+ * Get an array input. Throws CommandError if present but not an array.
92
+ */
93
+ array(name: string): string[];
94
+ /** Write an informational message to output */
95
+ info(message: string): void;
96
+ /** Write a success message to output */
97
+ success(message: string): void;
98
+ /** Write a warning message to output */
99
+ warn(message: string): void;
100
+ /** Write an error message to errors */
101
+ error(message: string): void;
102
+ /** Write a plain line to output */
103
+ line(message?: string): void;
104
+ /** Write an empty line to output */
105
+ newLine(): void;
106
+ /** Write a comment-style line to output */
107
+ comment(message: string): void;
108
+ /** Write a formatted table to output */
109
+ table(headers: string[], rows: string[][]): void;
110
+ /** Write an error message and set exit code */
111
+ fail(message: string, exitCode?: number): void;
112
+ /**
113
+ * Call another command from within this command.
114
+ * Delegates to Quarry.call() via internal reference.
115
+ */
116
+ call(name: string, input?: CommandInput): Promise<CommandResult>;
117
+ }
118
+ //#endregion
119
+ export { Command as t };
120
+ //# sourceMappingURL=command-B-QH-Vu3.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-B-QH-Vu3.d.mts","names":[],"sources":["../src/quarry/constants.ts","../src/quarry/command.ts"],"mappings":";;;;;;cAIa,iBAAA;;;;AAAb;;;;;;;;ACsBA;;;;;;;;;;uBAAsB,OAAA;EA8LmC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAA,OA7JhD,OAAA;EA4HC;EAAA,OA1HD,WAAA;EA+HD;EAAA,OA7HC,OAAA;EAAA,CAEN,iBAAA,GAAoB,gBAAA;;EA4IC;;;;EAAA,SA3Hb,MAAA,CAAA,mBAA0B,OAAA;EAsIa;;;EA/HhD,KAAA,GAAA,CAAS,IAAA,WAAe,CAAA;;;;EAOxB,MAAA,CAAO,IAAA;;;;EAcP,OAAA,CAAQ,IAAA;;;;EAcR,MAAA,CAAO,IAAA;;;;EAeP,KAAA,CAAM,IAAA;;EAcN,IAAA,CAAK,OAAA;;EAKL,OAAA,CAAQ,OAAA;;EAKR,IAAA,CAAK,OAAA;;EAKL,KAAA,CAAM,OAAA;;EAKN,IAAA,CAAK,OAAA;;EAKL,OAAA,CAAA;;EAKA,OAAA,CAAQ,OAAA;;EAKR,KAAA,CAAM,OAAA,YAAmB,IAAA;;EAiBzB,IAAA,CAAK,OAAA,UAAiB,QAAA;;;;;EAWhB,IAAA,CAAK,IAAA,UAAc,KAAA,GAAQ,YAAA,GAAe,OAAA,CAAQ,aAAA;AAAA"}