stratal 0.0.17 → 0.0.19
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 +8 -8
- package/dist/{base-email.provider-DypUAfWm.mjs → base-email.provider-mjynzewK.mjs} +1 -1
- package/dist/{base-email.provider-DypUAfWm.mjs.map → base-email.provider-mjynzewK.mjs.map} +1 -1
- package/dist/bin/cloudflare-workers-loader.mjs +33 -1
- package/dist/bin/cloudflare-workers-loader.mjs.map +1 -1
- package/dist/bin/quarry.mjs +169 -7
- package/dist/bin/quarry.mjs.map +1 -1
- package/dist/cache/index.d.mts +3 -2
- package/dist/cache/index.d.mts.map +1 -1
- package/dist/cache/index.mjs +3 -10
- package/dist/cache/index.mjs.map +1 -1
- package/dist/{colors-Y7WIFXs7.mjs → colors-DJaRDXoS.mjs} +1 -1
- package/dist/{colors-Y7WIFXs7.mjs.map → colors-DJaRDXoS.mjs.map} +1 -1
- package/dist/{command-B1CPgsrU.mjs → command-BgSlsS4M.mjs} +3 -3
- package/dist/command-BgSlsS4M.mjs.map +1 -0
- package/dist/{command-TnkPYWta.d.mts → command-DsQq56Lp.d.mts} +2 -2
- package/dist/{command-TnkPYWta.d.mts.map → command-DsQq56Lp.d.mts.map} +1 -1
- package/dist/config/index.d.mts +81 -37
- package/dist/config/index.d.mts.map +1 -1
- package/dist/config/index.mjs +135 -61
- package/dist/config/index.mjs.map +1 -1
- package/dist/{consumer-registry-Bymm6ff4.d.mts → consumer-registry-Doom7BEh.d.mts} +1 -1
- package/dist/{consumer-registry-Bymm6ff4.d.mts.map → consumer-registry-Doom7BEh.d.mts.map} +1 -1
- package/dist/controller.decorator-LZY9aHYG.mjs +66 -0
- package/dist/controller.decorator-LZY9aHYG.mjs.map +1 -0
- package/dist/cron/index.d.mts +4 -3
- package/dist/cron/index.d.mts.map +1 -1
- package/dist/cron/index.mjs +1 -3
- package/dist/{cron-manager-CFBamKKk.mjs → cron-manager-C30t9UZM.mjs} +29 -19
- package/dist/cron-manager-C30t9UZM.mjs.map +1 -0
- package/dist/{cron-manager-D7imGwUT.d.mts → cron-manager-RuPtFVLy.d.mts} +28 -14
- package/dist/cron-manager-RuPtFVLy.d.mts.map +1 -0
- package/dist/di/index.d.mts +2 -2
- package/dist/di/index.mjs +3 -3
- package/dist/email/index.d.mts +3 -3
- package/dist/email/index.mjs +87 -18
- package/dist/email/index.mjs.map +1 -1
- package/dist/{en-DaewN8hc.mjs → en-rHmW6vD9.mjs} +14 -31
- package/dist/en-rHmW6vD9.mjs.map +1 -0
- package/dist/env-CamWD-U1.d.mts +25 -0
- package/dist/env-CamWD-U1.d.mts.map +1 -0
- package/dist/errors/index.d.mts +2 -2
- package/dist/errors/index.mjs +2 -3
- package/dist/errors-B4pYgYON.mjs +1714 -0
- package/dist/errors-B4pYgYON.mjs.map +1 -0
- package/dist/{errors-DuAR5Wke.mjs → errors-BUyUfr2Z.mjs} +14 -7
- package/dist/errors-BUyUfr2Z.mjs.map +1 -0
- package/dist/events/index.d.mts +2 -2
- package/dist/events/index.mjs +1 -2
- package/dist/{events-CvUSgEuN.mjs → events-COKixqnG.mjs} +2 -2
- package/dist/{events-CvUSgEuN.mjs.map → events-COKixqnG.mjs.map} +1 -1
- package/dist/{gateway-context-CNOLkLUC.mjs → gateway-context-cqZ8wMoi.mjs} +4 -9
- package/dist/gateway-context-cqZ8wMoi.mjs.map +1 -0
- package/dist/guards/index.d.mts +14 -5
- package/dist/guards/index.d.mts.map +1 -1
- package/dist/guards/index.mjs +1 -1
- package/dist/{guards-DUk_Kzst.mjs → guards-DMbsAxSX.mjs} +1 -1
- package/dist/guards-DMbsAxSX.mjs.map +1 -0
- package/dist/http-method.decorator-BT3ufnz8.mjs +96 -0
- package/dist/http-method.decorator-BT3ufnz8.mjs.map +1 -0
- package/dist/i18n/index.d.mts +3 -3
- package/dist/i18n/index.mjs +3 -16
- package/dist/i18n/messages/en/index.d.mts +1 -1
- package/dist/i18n/messages/en/index.mjs +1 -1
- package/dist/i18n/utils/index.d.mts +30 -0
- package/dist/i18n/utils/index.d.mts.map +1 -0
- package/dist/i18n/utils/index.mjs +2 -0
- package/dist/i18n/validation/index.d.mts +1 -1
- package/dist/i18n/validation/index.mjs +1 -1
- package/dist/i18n.module-CI_prYFD.mjs +2340 -0
- package/dist/i18n.module-CI_prYFD.mjs.map +1 -0
- package/dist/{index-NGxg-KP_.d.mts → index-B437eK7p.d.mts} +59 -16
- package/dist/index-B437eK7p.d.mts.map +1 -0
- package/dist/{index-Dp6A5ywM.d.mts → index-CWRS7Ri3.d.mts} +1 -1
- package/dist/{index-Dp6A5ywM.d.mts.map → index-CWRS7Ri3.d.mts.map} +1 -1
- package/dist/{index-D_w_Rmtd.d.mts → index-DFhEeFfC.d.mts} +13 -30
- package/dist/{index-D_w_Rmtd.d.mts.map → index-DFhEeFfC.d.mts.map} +1 -1
- package/dist/index-DPFqRs8L.d.mts +4318 -0
- package/dist/index-DPFqRs8L.d.mts.map +1 -0
- package/dist/{index-DGRe6Yoa.d.mts → index-Dnqm9ZB6.d.mts} +5 -4
- package/dist/index-Dnqm9ZB6.d.mts.map +1 -0
- package/dist/index-SHx31sBJ.d.mts +101 -0
- package/dist/index-SHx31sBJ.d.mts.map +1 -0
- package/dist/index.d.mts +5 -3
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -20
- package/dist/{is-command-DJVI6wEJ.mjs → is-command-C6a7WTPw.mjs} +2 -2
- package/dist/{is-command-DJVI6wEJ.mjs.map → is-command-C6a7WTPw.mjs.map} +1 -1
- package/dist/{is-seeder-D5MIEcdz.mjs → is-seeder-CebjZCDn.mjs} +1 -1
- package/dist/{is-seeder-D5MIEcdz.mjs.map → is-seeder-CebjZCDn.mjs.map} +1 -1
- package/dist/logger/index.d.mts +1 -1
- package/dist/logger/index.mjs +1 -1
- package/dist/{logger-CGT91VY6.mjs → logger-V6Ms3QnQ.mjs} +63 -45
- package/dist/logger-V6Ms3QnQ.mjs.map +1 -0
- package/dist/macroable/index.d.mts +2 -0
- package/dist/macroable/index.mjs +2 -0
- package/dist/macroable-BmufBshB.mjs +122 -0
- package/dist/macroable-BmufBshB.mjs.map +1 -0
- package/dist/module/index.d.mts +3 -4
- package/dist/module/index.d.mts.map +1 -1
- package/dist/module/index.mjs +1 -10
- package/dist/module-qGE_1duv.mjs +732 -0
- package/dist/module-qGE_1duv.mjs.map +1 -0
- package/dist/openapi/index.d.mts +3 -3
- package/dist/openapi/index.mjs +2 -15
- package/dist/{openapi-tools.service-B3TxYKoQ.mjs → openapi-tools.service-CYWGuhue.mjs} +4 -1
- package/dist/{openapi-tools.service-B3TxYKoQ.mjs.map → openapi-tools.service-CYWGuhue.mjs.map} +1 -1
- package/dist/{openapi.service-DGnX3Fc4.d.mts → openapi.service-Bv_NioM9.d.mts} +9 -17
- package/dist/openapi.service-Bv_NioM9.d.mts.map +1 -0
- package/dist/quarry/index.d.mts +26 -12
- package/dist/quarry/index.d.mts.map +1 -1
- package/dist/quarry/index.mjs +4 -8
- package/dist/{quarry-registry-B2rkO-JS.mjs → quarry-registry-DFfRRkA7.mjs} +45 -40
- package/dist/quarry-registry-DFfRRkA7.mjs.map +1 -0
- package/dist/queue/index.d.mts +2 -2
- package/dist/queue/index.mjs +3 -13
- package/dist/queue/index.mjs.map +1 -1
- package/dist/{queue.module-BtI8f4Jo.mjs → queue.module-P-G-nCYz.mjs} +39 -42
- package/dist/queue.module-P-G-nCYz.mjs.map +1 -0
- package/dist/r2-storage.provider-LdzK9tfG.mjs +244 -0
- package/dist/r2-storage.provider-LdzK9tfG.mjs.map +1 -0
- package/dist/{resend.provider-bXMEkdRJ.mjs → resend.provider-bwILp0WI.mjs} +2 -4
- package/dist/{resend.provider-bXMEkdRJ.mjs.map → resend.provider-bwILp0WI.mjs.map} +1 -1
- package/dist/router/index.d.mts +2 -2
- package/dist/router/index.mjs +7 -16
- package/dist/seeder/index.d.mts +3 -4
- package/dist/seeder/index.d.mts.map +1 -1
- package/dist/seeder/index.mjs +2 -6
- package/dist/{seeder-R7RXJC35.mjs → seeder-BcqIFa2X.mjs} +5 -5
- package/dist/{seeder-R7RXJC35.mjs.map → seeder-BcqIFa2X.mjs.map} +1 -1
- package/dist/setup-CtekcwuO.mjs +37 -0
- package/dist/setup-CtekcwuO.mjs.map +1 -0
- package/dist/signed-url-COX7cCWR.mjs +74 -0
- package/dist/signed-url-COX7cCWR.mjs.map +1 -0
- package/dist/{smtp.provider-DrbHQztF.mjs → smtp.provider-B07yuARi.mjs} +2 -4
- package/dist/{smtp.provider-DrbHQztF.mjs.map → smtp.provider-B07yuARi.mjs.map} +1 -1
- package/dist/storage/index.d.mts +39 -17
- package/dist/storage/index.d.mts.map +1 -1
- package/dist/storage/index.mjs +3 -14
- package/dist/storage/providers/index.d.mts +30 -69
- package/dist/storage/providers/index.d.mts.map +1 -1
- package/dist/storage/providers/index.mjs +2 -5
- package/dist/{storage-CZKHOhci.mjs → storage-P6X4h9So.mjs} +102 -29
- package/dist/storage-P6X4h9So.mjs.map +1 -0
- package/dist/{storage-provider.interface-0IqcdhBf.d.mts → storage-provider.interface-CC1nniHk.d.mts} +20 -15
- package/dist/storage-provider.interface-CC1nniHk.d.mts.map +1 -0
- package/dist/stratal-BCiwCFN9.mjs +533 -0
- package/dist/stratal-BCiwCFN9.mjs.map +1 -0
- package/dist/{types-DahElfUw.d.mts → types-DIWemRad.d.mts} +2 -2
- package/dist/types-DIWemRad.d.mts.map +1 -0
- package/dist/{usage-generator-CVIsENuE.mjs → usage-generator-MBcRo0Q2.mjs} +2 -2
- package/dist/{usage-generator-CVIsENuE.mjs.map → usage-generator-MBcRo0Q2.mjs.map} +1 -1
- package/dist/{validation-DQTC259A.mjs → validation-Dbg3ehdP.mjs} +2 -2
- package/dist/{validation-DQTC259A.mjs.map → validation-Dbg3ehdP.mjs.map} +1 -1
- package/dist/websocket/index.d.mts +3 -3
- package/dist/websocket/index.d.mts.map +1 -1
- package/dist/websocket/index.mjs +1 -4
- package/dist/workers/index.d.mts +2 -1
- package/dist/workers/index.d.mts.map +1 -1
- package/dist/workers/index.mjs +2 -20
- package/dist/workers/index.mjs.map +1 -1
- package/package.json +41 -50
- package/dist/application-DfPtIzxF.d.mts +0 -177
- package/dist/application-DfPtIzxF.d.mts.map +0 -1
- package/dist/command-B1CPgsrU.mjs.map +0 -1
- package/dist/cron-manager-CFBamKKk.mjs.map +0 -1
- package/dist/cron-manager-D7imGwUT.d.mts.map +0 -1
- package/dist/en-DaewN8hc.mjs.map +0 -1
- package/dist/errors-DSKapqD8.mjs +0 -707
- package/dist/errors-DSKapqD8.mjs.map +0 -1
- package/dist/errors-DuAR5Wke.mjs.map +0 -1
- package/dist/gateway-context-CNOLkLUC.mjs.map +0 -1
- package/dist/guards-DUk_Kzst.mjs.map +0 -1
- package/dist/i18n.module-Dn9SrFdS.mjs +0 -1841
- package/dist/i18n.module-Dn9SrFdS.mjs.map +0 -1
- package/dist/index-BFCxSp_f.d.mts +0 -2625
- package/dist/index-BFCxSp_f.d.mts.map +0 -1
- package/dist/index-DGRe6Yoa.d.mts.map +0 -1
- package/dist/index-NGxg-KP_.d.mts.map +0 -1
- package/dist/logger-CGT91VY6.mjs.map +0 -1
- package/dist/middleware/index.d.mts +0 -2
- package/dist/middleware/index.mjs +0 -5
- package/dist/middleware-Bl-b5pkt.mjs +0 -362
- package/dist/middleware-Bl-b5pkt.mjs.map +0 -1
- package/dist/module-registry-CmjBX6ol.d.mts +0 -121
- package/dist/module-registry-CmjBX6ol.d.mts.map +0 -1
- package/dist/module-tUtyVJ5E.mjs +0 -371
- package/dist/module-tUtyVJ5E.mjs.map +0 -1
- package/dist/openapi.service-DGnX3Fc4.d.mts.map +0 -1
- package/dist/quarry-registry-B2rkO-JS.mjs.map +0 -1
- package/dist/queue.module-BtI8f4Jo.mjs.map +0 -1
- package/dist/router-context-D9R1v2Ac.mjs +0 -267
- package/dist/router-context-D9R1v2Ac.mjs.map +0 -1
- package/dist/s3-storage.provider-CttzNnDR.mjs +0 -335
- package/dist/s3-storage.provider-CttzNnDR.mjs.map +0 -1
- package/dist/storage-CZKHOhci.mjs.map +0 -1
- package/dist/storage-provider.interface-0IqcdhBf.d.mts.map +0 -1
- package/dist/stratal-D5smIU1y.mjs +0 -315
- package/dist/stratal-D5smIU1y.mjs.map +0 -1
- package/dist/types-DahElfUw.d.mts.map +0 -1
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
import "./errors-DSKapqD8.mjs";
|
|
2
|
-
import "./logger-CGT91VY6.mjs";
|
|
3
1
|
import { EmailResendApiFailedError, ResendApiKeyMissingError } from "./email/index.mjs";
|
|
4
|
-
import { t as BaseEmailProvider } from "./base-email.provider-
|
|
2
|
+
import { t as BaseEmailProvider } from "./base-email.provider-mjynzewK.mjs";
|
|
5
3
|
import { Resend } from "resend";
|
|
6
4
|
//#region src/email/providers/resend.provider.ts
|
|
7
5
|
/**
|
|
@@ -66,4 +64,4 @@ var ResendProvider = class extends BaseEmailProvider {
|
|
|
66
64
|
//#endregion
|
|
67
65
|
export { ResendProvider };
|
|
68
66
|
|
|
69
|
-
//# sourceMappingURL=resend.provider-
|
|
67
|
+
//# sourceMappingURL=resend.provider-bwILp0WI.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resend.provider-
|
|
1
|
+
{"version":3,"file":"resend.provider-bwILp0WI.mjs","names":[],"sources":["../src/email/providers/resend.provider.ts"],"sourcesContent":["import { Resend } from 'resend'\nimport type { ResolvedEmailAttachment, ResolvedEmailMessage } from '../contracts'\nimport type { EmailModuleOptions } from '../email.module'\nimport { EmailResendApiFailedError, ResendApiKeyMissingError } from '../errors'\nimport { BaseEmailProvider } from './base-email.provider'\nimport type { EmailSendResult } from './email-provider.interface'\n\n/**\n * Resend Email Provider\n *\n * Implementation of IEmailProvider using Resend API\n * Docs: https://resend.com/docs\n */\nexport class ResendProvider extends BaseEmailProvider {\n private readonly client: Resend\n private readonly defaultFrom: { name: string; email: string }\n\n constructor(\n private readonly options: EmailModuleOptions\n ) {\n super()\n\n // Validate Resend API key\n if (!this.options.apiKey) {\n throw new ResendApiKeyMissingError()\n }\n\n this.client = new Resend(this.options.apiKey)\n this.defaultFrom = this.options.from\n }\n\n async send(message: ResolvedEmailMessage): Promise<EmailSendResult> {\n try {\n const from = message.from\n ? `${message.from.name} <${message.from.email}>`\n : `${this.defaultFrom.name} <${this.defaultFrom.email}>`\n\n const to = Array.isArray(message.to) ? message.to : [message.to]\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument -- Resend SDK types\n const response = await this.client.emails.send({\n from,\n to,\n subject: message.subject,\n html: message.html,\n text: message.text,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment -- Resend template extension\n ...((message as any).template && { template: (message as any).template }),\n ...(message.replyTo && { replyTo: message.replyTo }),\n ...(message.cc && { cc: message.cc }),\n ...(message.bcc && { bcc: message.bcc }),\n ...(message.attachments && {\n attachments: await Promise.all(\n message.attachments.map(async attachment => ({\n filename: attachment.filename,\n content: await this.toBuffer(attachment.content),\n }))\n ),\n }),\n })\n\n if (response.error) {\n throw new EmailResendApiFailedError()\n }\n\n return {\n messageId: response.data.id,\n accepted: true,\n metadata: {\n provider: 'resend',\n },\n }\n } catch (error) {\n if (error instanceof EmailResendApiFailedError || error instanceof ResendApiKeyMissingError) {\n throw error\n }\n\n throw new EmailResendApiFailedError()\n }\n }\n\n /**\n * Convert attachment content to Buffer\n *\n * Resend SDK expects Buffer for attachment content.\n * If content is already a Buffer, return as-is.\n * If content is a ReadableStream, convert to Buffer.\n */\n private async toBuffer(content: ResolvedEmailAttachment['content']): Promise<Buffer> {\n if (Buffer.isBuffer(content)) {\n return content\n }\n // Convert ReadableStream to Buffer\n const response = new Response(content)\n const arrayBuffer = await response.arrayBuffer()\n return Buffer.from(arrayBuffer)\n }\n}\n"],"mappings":";;;;;;;;;;AAaA,IAAa,iBAAb,cAAoC,kBAAkB;CACpD;CACA;CAEA,YACE,SACA;AACA,SAAO;AAFU,OAAA,UAAA;AAKjB,MAAI,CAAC,KAAK,QAAQ,OAChB,OAAM,IAAI,0BAA0B;AAGtC,OAAK,SAAS,IAAI,OAAO,KAAK,QAAQ,OAAO;AAC7C,OAAK,cAAc,KAAK,QAAQ;;CAGlC,MAAM,KAAK,SAAyD;AAClE,MAAI;GACF,MAAM,OAAO,QAAQ,OACjB,GAAG,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,MAAM,KAC5C,GAAG,KAAK,YAAY,KAAK,IAAI,KAAK,YAAY,MAAM;GAExD,MAAM,KAAK,MAAM,QAAQ,QAAQ,GAAG,GAAG,QAAQ,KAAK,CAAC,QAAQ,GAAG;GAGhE,MAAM,WAAW,MAAM,KAAK,OAAO,OAAO,KAAK;IAC7C;IACA;IACA,SAAS,QAAQ;IACjB,MAAM,QAAQ;IACd,MAAM,QAAQ;IAEd,GAAK,QAAgB,YAAY,EAAE,UAAW,QAAgB,UAAU;IACxE,GAAI,QAAQ,WAAW,EAAE,SAAS,QAAQ,SAAS;IACnD,GAAI,QAAQ,MAAM,EAAE,IAAI,QAAQ,IAAI;IACpC,GAAI,QAAQ,OAAO,EAAE,KAAK,QAAQ,KAAK;IACvC,GAAI,QAAQ,eAAe,EACzB,aAAa,MAAM,QAAQ,IACzB,QAAQ,YAAY,IAAI,OAAM,gBAAe;KAC3C,UAAU,WAAW;KACrB,SAAS,MAAM,KAAK,SAAS,WAAW,QAAQ;KACjD,EAAE,CACJ,EACF;IACF,CAAC;AAEF,OAAI,SAAS,MACX,OAAM,IAAI,2BAA2B;AAGvC,UAAO;IACL,WAAW,SAAS,KAAK;IACzB,UAAU;IACV,UAAU,EACR,UAAU,UACX;IACF;WACM,OAAO;AACd,OAAI,iBAAiB,6BAA6B,iBAAiB,yBACjE,OAAM;AAGR,SAAM,IAAI,2BAA2B;;;;;;;;;;CAWzC,MAAc,SAAS,SAA8D;AACnF,MAAI,OAAO,SAAS,QAAQ,CAC1B,QAAO;EAIT,MAAM,cAAc,MAAM,IADL,SAAS,QACI,CAAC,aAAa;AAChD,SAAO,OAAO,KAAK,YAAY"}
|
package/dist/router/index.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export { All, Controller, ControllerOptions, ControllerRegistrationError, Delete, Get, HTTP_METHODS, HonoApp, HonoAppAlreadyConfiguredError,
|
|
1
|
+
import { $ as SSEMessage, $n as VersioningOptions, At as Route, Bn as ControllerOptions, Bt as getControllerOptions, Ct as commonErrorSchemas, Dt as successMessageSchema, Et as paginationQuerySchema, Ft as Get, G as buildRouteUrl, Gn as RouteBodyObject, Gt as extractParamNames, H as SignedUriOptions, Hn as ExplicitRouteMetadata, Ht as getControllerVersion, It as Patch, J as RouteRegistry, Jn as RouteResponse, Jt as sortRoutesBySpecificity, K as RegisteredRoute, Kn as RouteConfig, Kt as generateConventionRouteName, Ln as LocalePathService, Lt as Post, Mt as getRouteMetadata, Nt as All, Ot as uuidParamSchema, Pt as Delete, Qn as SecurityScheme, Qt as RouteRegistrationService, Rn as ResolvedPath, Rt as Put, Sr as StratalRouteMap, St as parseDomainPattern, Tt as paginatedResponseSchema, U as Uri, Un as LocalePathConfig, Ut as createMiddlewareChain, V as RouterContext, Vn as ConventionRouteMetadata, Vt as getControllerRoute, W as UriOptions, Wn as RouteBody, Wt as extractDomainParamNames, Xn as RouterEnv, Xt as route, Y as VersioningService, Yn as RouteResponseObject, Yt as toOpenAPIPath, Zn as RouterVariables, Zt as ROUTER_TOKENS, _t as SignedUrlOptions, an as IController, at as MiddlewareNextCalledMultipleTimesError, br as SerializedRoute, bt as VerifySignatureMiddleware, ct as ResponseValidationError, dt as SchemaValidationError, en as RouteConfigurable, er as HTTP_METHODS, et as SSEStreamingApi, ft as RouteNotFoundError, gt as ControllerRegistrationError, ht as HonoAppAlreadyConfiguredError, in as Next, ir as VERSION_NEUTRAL, it as InvalidSignatureError, jt as getRouteDecoratedMethods, kt as validationErrorResponseSchema, lt as RouteNameNotFoundError, mt as OpenAPIRouteRegistrationError, nn as RouterGroupConfig, nr as ROUTE_METADATA_KEYS, nt as DomainMismatchError, ot as MissingEnvironmentVariableError, pt as OpenAPIValidationError, q as RouteRegistrationInput, qn as RouteMetadata, qt as getPathSpecificityScore, rn as Middleware, rr as SECURITY_SCHEMES, rt as DuplicateRouteNameError, st as MissingRouteParamError, tn as Router, tr as ROUTER_CONTEXT_KEYS, tt as StreamingApi, ut as RouterUseScopeError, vr as RouteName, vt as signUrl, wt as errorResponseSchema, xr as SerializedRoutes, xt as createDomainMiddleware, yr as RouteParams, yt as verifySignedUrl, zn as HonoApp, zt as Controller } from "../index-DPFqRs8L.mjs";
|
|
2
|
+
export { All, Controller, ControllerOptions, ControllerRegistrationError, ConventionRouteMetadata, Delete, DomainMismatchError, DuplicateRouteNameError, ExplicitRouteMetadata, Get, HTTP_METHODS, HonoApp, HonoAppAlreadyConfiguredError, IController, InvalidSignatureError, LocalePathConfig, LocalePathService, Middleware, MiddlewareNextCalledMultipleTimesError, MissingEnvironmentVariableError, MissingRouteParamError, Next, OpenAPIRouteRegistrationError, OpenAPIValidationError, Patch, Post, Put, ROUTER_CONTEXT_KEYS, ROUTER_TOKENS, ROUTE_METADATA_KEYS, RegisteredRoute, ResolvedPath, ResponseValidationError, Route, RouteBody, RouteBodyObject, RouteConfig, RouteConfigurable, RouteMetadata, RouteName, RouteNameNotFoundError, RouteNotFoundError, RouteParams, RouteRegistrationInput, RouteRegistrationService, RouteRegistry, RouteResponse, RouteResponseObject, Router, RouterContext, RouterEnv, RouterGroupConfig, RouterUseScopeError, RouterVariables, SECURITY_SCHEMES, SSEMessage, SSEStreamingApi, SchemaValidationError, SecurityScheme, SerializedRoute, SerializedRoutes, SignedUriOptions, SignedUrlOptions, StratalRouteMap, StreamingApi, Uri, UriOptions, VERSION_NEUTRAL, VerifySignatureMiddleware, VersioningOptions, VersioningService, buildRouteUrl, commonErrorSchemas, createDomainMiddleware, createMiddlewareChain, errorResponseSchema, extractDomainParamNames, extractParamNames, generateConventionRouteName, getControllerOptions, getControllerRoute, getControllerVersion, getPathSpecificityScore, getRouteDecoratedMethods, getRouteMetadata, paginatedResponseSchema, paginationQuerySchema, parseDomainPattern, route, signUrl, sortRoutesBySpecificity, successMessageSchema, toOpenAPIPath, uuidParamSchema, validationErrorResponseSchema, verifySignedUrl };
|
package/dist/router/index.mjs
CHANGED
|
@@ -1,16 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import "../
|
|
3
|
-
import "../module-
|
|
4
|
-
import "../
|
|
5
|
-
import { a as
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
import "../command-B1CPgsrU.mjs";
|
|
9
|
-
import "../is-command-DJVI6wEJ.mjs";
|
|
10
|
-
import "../is-seeder-D5MIEcdz.mjs";
|
|
11
|
-
import "../validation-DQTC259A.mjs";
|
|
12
|
-
import { C as Get, D as getHttpDecoratedMethods, E as Put, O as getHttpRouteMetadata, S as Delete, T as Post, a as errorResponseSchema, b as getRouteConfig, c as successMessageSchema, d as RouteNotFoundError, f as OpenAPIValidationError, h as HonoAppAlreadyConfiguredError, i as commonErrorSchemas, l as uuidParamSchema, m as ControllerRegistrationError, n as HonoApp, o as paginatedResponseSchema, p as OpenAPIRouteRegistrationError, r as RouteRegistrationService, s as paginationQuerySchema, u as validationErrorResponseSchema, v as Route, w as Patch, x as All, y as getDecoratedMethods } from "../i18n.module-Dn9SrFdS.mjs";
|
|
13
|
-
import "../openapi-tools.service-B3TxYKoQ.mjs";
|
|
14
|
-
import "../guards-DUk_Kzst.mjs";
|
|
15
|
-
import "../gateway-context-CNOLkLUC.mjs";
|
|
16
|
-
export { All, Controller, ControllerRegistrationError, Delete, Get, HTTP_METHODS, HonoApp, HonoAppAlreadyConfiguredError, OpenAPIRouteRegistrationError, OpenAPIValidationError, Patch, Post, Put, ROUTER_CONTEXT_KEYS, ROUTER_TOKENS, ROUTE_METADATA_KEYS, Route, RouteNotFoundError, RouteRegistrationService, RouterContext, SECURITY_SCHEMES, VERSION_NEUTRAL, commonErrorSchemas, errorResponseSchema, getControllerOptions, getControllerRoute, getControllerVersion, getDecoratedMethods, getHttpDecoratedMethods, getHttpRouteMetadata, getRouteConfig, paginatedResponseSchema, paginationQuerySchema, successMessageSchema, uuidParamSchema, validationErrorResponseSchema };
|
|
1
|
+
import { V as ROUTER_TOKENS, d as ROUTER_CONTEXT_KEYS, f as ROUTE_METADATA_KEYS, l as HTTP_METHODS, m as VERSION_NEUTRAL, p as SECURITY_SCHEMES, s as RouterContext } from "../errors-B4pYgYON.mjs";
|
|
2
|
+
import { _ as OpenAPIValidationError, b as ControllerRegistrationError, c as InvalidSignatureError, d as MissingRouteParamError, f as ResponseValidationError, g as RouteNotFoundError, h as SchemaValidationError, l as MiddlewareNextCalledMultipleTimesError, m as RouterUseScopeError, n as Router, o as DomainMismatchError, p as RouteNameNotFoundError, s as DuplicateRouteNameError, u as MissingEnvironmentVariableError, v as OpenAPIRouteRegistrationError, y as HonoAppAlreadyConfiguredError } from "../module-qGE_1duv.mjs";
|
|
3
|
+
import { C as validationErrorResponseSchema, D as createMiddlewareChain, E as getRouteMetadata, O as createDomainMiddleware, S as uuidParamSchema, T as getRouteDecoratedMethods, _ as commonErrorSchemas, a as buildRouteUrl, b as paginationQuerySchema, c as LocalePathService, d as extractDomainParamNames, f as extractParamNames, g as toOpenAPIPath, h as sortRoutesBySpecificity, i as Uri, k as parseDomainPattern, l as HonoApp, m as getPathSpecificityScore, n as VerifySignatureMiddleware, o as RouteRegistry, p as generateConventionRouteName, r as route, s as VersioningService, u as RouteRegistrationService, v as errorResponseSchema, w as Route, x as successMessageSchema, y as paginatedResponseSchema } from "../i18n.module-CI_prYFD.mjs";
|
|
4
|
+
import { i as getControllerVersion, n as getControllerOptions, r as getControllerRoute, t as Controller } from "../controller.decorator-LZY9aHYG.mjs";
|
|
5
|
+
import { a as Post, i as Patch, n as Delete, o as Put, r as Get, t as All } from "../http-method.decorator-BT3ufnz8.mjs";
|
|
6
|
+
import { n as verifySignedUrl, t as signUrl } from "../signed-url-COX7cCWR.mjs";
|
|
7
|
+
export { All, Controller, ControllerRegistrationError, Delete, DomainMismatchError, DuplicateRouteNameError, Get, HTTP_METHODS, HonoApp, HonoAppAlreadyConfiguredError, InvalidSignatureError, LocalePathService, MiddlewareNextCalledMultipleTimesError, MissingEnvironmentVariableError, MissingRouteParamError, OpenAPIRouteRegistrationError, OpenAPIValidationError, Patch, Post, Put, ROUTER_CONTEXT_KEYS, ROUTER_TOKENS, ROUTE_METADATA_KEYS, ResponseValidationError, Route, RouteNameNotFoundError, RouteNotFoundError, RouteRegistrationService, RouteRegistry, Router, RouterContext, RouterUseScopeError, SECURITY_SCHEMES, SchemaValidationError, Uri, VERSION_NEUTRAL, VerifySignatureMiddleware, VersioningService, buildRouteUrl, commonErrorSchemas, createDomainMiddleware, createMiddlewareChain, errorResponseSchema, extractDomainParamNames, extractParamNames, generateConventionRouteName, getControllerOptions, getControllerRoute, getControllerVersion, getPathSpecificityScore, getRouteDecoratedMethods, getRouteMetadata, paginatedResponseSchema, paginationQuerySchema, parseDomainPattern, route, signUrl, sortRoutesBySpecificity, successMessageSchema, toOpenAPIPath, uuidParamSchema, validationErrorResponseSchema, verifySignedUrl };
|
package/dist/seeder/index.d.mts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as Constructor } from "../types-
|
|
3
|
-
import { t as
|
|
4
|
-
import { t as Command } from "../command-TnkPYWta.mjs";
|
|
1
|
+
import { Cr as Container, X as Application, d as ApplicationError } from "../index-DPFqRs8L.mjs";
|
|
2
|
+
import { t as Constructor } from "../types-DIWemRad.mjs";
|
|
3
|
+
import { t as Command } from "../command-DsQq56Lp.mjs";
|
|
5
4
|
|
|
6
5
|
//#region src/seeder/seeder.d.ts
|
|
7
6
|
declare const SEEDER_INTERNALS: unique symbol;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/seeder/seeder.ts","../../src/seeder/seeder-registry.ts","../../src/seeder/commands/db-seed-list.command.ts","../../src/seeder/commands/db-seed.command.ts","../../src/seeder/errors.ts","../../src/seeder/is-seeder.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/seeder/seeder.ts","../../src/seeder/seeder-registry.ts","../../src/seeder/commands/db-seed-list.command.ts","../../src/seeder/commands/db-seed.command.ts","../../src/seeder/errors.ts","../../src/seeder/is-seeder.ts"],"mappings":";;;;;cAGa,gBAAA;AAAA,UAEI,aAAA;EACf,GAAA,CAAI,WAAA,EAAa,WAAA,CAAY,MAAA,IAAU,OAAA;EACvC,SAAA,EAAW,SAAA;AAAA;AAAA,uBAGS,MAAA;EAAA,CACnB,gBAAA,GAAmB,aAAA;EAAA,SAKX,GAAA,CAAA,GAAO,OAAA;EAXD;EAAA,UAcC,IAAA,CAAK,WAAA,EAAa,WAAA,CAAY,MAAA,IAAU,OAAA;AAAA;;;cCb7C,aAAA;EAAA,SAEH,cAAA;AAAA;AAAA,cAEG,cAAA;EAAA,QAIS,GAAA;EAAA,QAHZ,OAAA;EAAA,QACA,SAAA;cAEY,GAAA,EAAK,WAAA;EAEzB,QAAA,CAAS,WAAA,EAAa,WAAA,CAAY,MAAA;EAS5B,GAAA,CAAI,WAAA,EAAa,WAAA,CAAY,MAAA,GAAS,OAAA;IAAY,SAAA,GAAY,SAAA;EAAA,IAAc,OAAA;EAsB5E,MAAA,CAAO,OAAA;IAAY,SAAA,GAAY,SAAA;EAAA,IAAc,OAAA;EAMnD,IAAA,CAAK,IAAA,WAAe,WAAA,CAAY,MAAA;EAIhC,GAAA,CAAI,WAAA,EAAa,WAAA,CAAY,MAAA;EAI7B,IAAA,CAAA;IAAU,SAAA;EAAA;AAAA;;;cCzDC,iBAAA,SAA0B,OAAA;EAAA,QAIqB,OAAA;EAAA,OAHnD,OAAA;EAAA,OACA,WAAA;cAEmD,OAAA,EAAS,cAAA;EAInE,MAAA,CAAA;AAAA;;;cCRW,aAAA,SAAsB,OAAA;EAAA,QAIyB,OAAA;EAAA,OAHnD,OAAA;EAAA,OACA,WAAA;cAEmD,OAAA,EAAS,cAAA;EAI7D,MAAA,CAAA,GAAU,OAAA;AAAA;;;cCVL,wBAAA,SAAiC,gBAAA;cAChC,IAAA;AAAA;AAAA,cASD,wBAAA,SAAiC,gBAAA;cAChC,IAAA;AAAA;;;;;;;AJVd;iBKKgB,QAAA,CAAS,MAAA,EAAQ,WAAA"}
|
package/dist/seeder/index.mjs
CHANGED
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
import "../
|
|
2
|
-
import "../
|
|
3
|
-
import "../colors-Y7WIFXs7.mjs";
|
|
4
|
-
import "../command-B1CPgsrU.mjs";
|
|
5
|
-
import { n as SEEDER_INTERNALS, r as Seeder, t as isSeeder } from "../is-seeder-D5MIEcdz.mjs";
|
|
6
|
-
import { a as SeederNameCollisionError, i as SeederRegistry, n as DbSeedListCommand, o as SeederNotRegisteredError, r as SEEDER_TOKENS, t as DbSeedCommand } from "../seeder-R7RXJC35.mjs";
|
|
1
|
+
import { n as SEEDER_INTERNALS, r as Seeder, t as isSeeder } from "../is-seeder-CebjZCDn.mjs";
|
|
2
|
+
import { a as SeederNameCollisionError, i as SeederRegistry, n as DbSeedListCommand, o as SeederNotRegisteredError, r as SEEDER_TOKENS, t as DbSeedCommand } from "../seeder-BcqIFa2X.mjs";
|
|
7
3
|
export { DbSeedCommand, DbSeedListCommand, SEEDER_INTERNALS, SEEDER_TOKENS, Seeder, SeederNameCollisionError, SeederNotRegisteredError, SeederRegistry, isSeeder };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { a as __decorate, o as __decorateParam, s as __decorateMetadata } from "./logger-
|
|
3
|
-
import { t as Command } from "./command-
|
|
4
|
-
import { n as SEEDER_INTERNALS } from "./is-seeder-
|
|
1
|
+
import { H as ApplicationError, k as ERROR_CODES } from "./errors-B4pYgYON.mjs";
|
|
2
|
+
import { a as __decorate, o as __decorateParam, s as __decorateMetadata } from "./logger-V6Ms3QnQ.mjs";
|
|
3
|
+
import { t as Command } from "./command-BgSlsS4M.mjs";
|
|
4
|
+
import { n as SEEDER_INTERNALS } from "./is-seeder-CebjZCDn.mjs";
|
|
5
5
|
import { inject } from "tsyringe";
|
|
6
6
|
//#region src/seeder/errors.ts
|
|
7
7
|
var SeederNotRegisteredError = class extends ApplicationError {
|
|
@@ -132,4 +132,4 @@ DbSeedCommand = __decorate([__decorateParam(0, inject(SEEDER_TOKENS.SeederRegist
|
|
|
132
132
|
//#endregion
|
|
133
133
|
export { SeederNameCollisionError as a, SeederRegistry as i, DbSeedListCommand as n, SeederNotRegisteredError as o, SEEDER_TOKENS as r, DbSeedCommand as t };
|
|
134
134
|
|
|
135
|
-
//# sourceMappingURL=seeder-
|
|
135
|
+
//# sourceMappingURL=seeder-BcqIFa2X.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seeder-
|
|
1
|
+
{"version":3,"file":"seeder-BcqIFa2X.mjs","names":[],"sources":["../src/seeder/errors.ts","../src/seeder/seeder-registry.ts","../src/seeder/commands/db-seed-list.command.ts","../src/seeder/commands/db-seed.command.ts"],"sourcesContent":["import { ApplicationError, ERROR_CODES } from '../errors'\n\nexport class SeederNotRegisteredError extends ApplicationError {\n constructor(name: string) {\n super(\n 'errors.seederNotRegistered',\n ERROR_CODES.SYSTEM.SEEDER_NOT_REGISTERED,\n { name },\n )\n }\n}\n\nexport class SeederNameCollisionError extends ApplicationError {\n constructor(name: string) {\n super(\n 'errors.seederNameCollision',\n ERROR_CODES.SYSTEM.SEEDER_NAME_COLLISION,\n { name },\n )\n }\n}\n","import type { Application } from '../application'\nimport type { Container } from '../di/container'\nimport type { Constructor } from '../types'\nimport { SeederNameCollisionError, SeederNotRegisteredError } from './errors'\nimport { type Seeder, SEEDER_INTERNALS } from './seeder'\n\nexport const SEEDER_TOKENS = {\n SeederRegistry: Symbol.for('stratal:seeders:registry'),\n} as const\n\nexport class SeederRegistry {\n private seeders = new Set<Constructor<Seeder>>()\n private nameIndex = new Map<string, Constructor<Seeder>>()\n\n constructor(private app: Application) { }\n\n register(SeederClass: Constructor<Seeder>): void {\n const existing = this.nameIndex.get(SeederClass.name)\n if (existing && existing !== SeederClass) {\n throw new SeederNameCollisionError(SeederClass.name)\n }\n this.seeders.add(SeederClass)\n this.nameIndex.set(SeederClass.name, SeederClass)\n }\n\n async run(SeederClass: Constructor<Seeder>, options?: { container?: Container }): Promise<void> {\n if (!this.seeders.has(SeederClass)) {\n throw new SeederNotRegisteredError(SeederClass.name)\n }\n\n const execute = async (container: Container) => {\n const seeder = container.resolve<Seeder>(SeederClass)\n seeder[SEEDER_INTERNALS] = {\n run: (cls) => this.run(cls, { container }),\n container,\n }\n await seeder.run()\n }\n\n if (options?.container) {\n await execute(options.container)\n } else {\n const mockContext = this.app.createMockRouterContext('en')\n await this.app.container.runInRequestScope(mockContext, execute)\n }\n }\n\n async runAll(options?: { container?: Container }): Promise<void> {\n for (const SeederClass of this.seeders) {\n await this.run(SeederClass, options)\n }\n }\n\n find(name: string): Constructor<Seeder> | undefined {\n return this.nameIndex.get(name)\n }\n\n has(SeederClass: Constructor<Seeder>): boolean {\n return this.seeders.has(SeederClass)\n }\n\n list(): { className: string }[] {\n return [...this.seeders].map(cls => ({ className: cls.name }))\n }\n}\n","import { inject } from 'tsyringe'\nimport { Command } from '../../quarry/command'\nimport { type SeederRegistry, SEEDER_TOKENS } from '../seeder-registry'\n\nexport class DbSeedListCommand extends Command {\n static command = 'db:seed:list'\n static description = 'List available database seeders'\n\n constructor(@inject(SEEDER_TOKENS.SeederRegistry) private seeders: SeederRegistry) {\n super()\n }\n\n handle(): undefined | number {\n const list = this.seeders.list()\n if (list.length === 0) {\n this.info('No seeders found')\n return 0\n }\n this.table(['Class'], list.map(s => [s.className]))\n\n return undefined\n }\n}\n","import { inject } from 'tsyringe'\nimport { Command } from '../../quarry/command'\nimport { type SeederRegistry, SEEDER_TOKENS } from '../seeder-registry'\n\nexport class DbSeedCommand extends Command {\n static command = 'db:seed {names* : Seeder class names} {--a|all : Run all seeders} {--dry-run : Preview without executing}'\n static description = 'Run database seeders'\n\n constructor(@inject(SEEDER_TOKENS.SeederRegistry) private seeders: SeederRegistry) {\n super()\n }\n\n async handle(): Promise<number | undefined> {\n const names = this.array('names')\n const all = this.boolean('all')\n const dryRun = this.boolean('dry-run')\n\n if (names.length > 0 && all) {\n this.warn(`Ignoring \"${names.join(', ')}\" because --all takes precedence`)\n }\n\n if (names.length === 0 && !all) {\n this.fail('Specify one or more seeder class names or use --all')\n return 1\n }\n\n if (dryRun) {\n if (all) {\n const list = this.seeders.list()\n this.info('Dry run — would execute:')\n for (const s of list) {\n this.info(` ${s.className}`)\n }\n } else {\n this.info('Dry run — would execute:')\n for (const name of names) {\n const SeederClass = this.seeders.find(name)\n if (!SeederClass) {\n this.fail(`Seeder \"${name}\" not found`)\n return 1\n }\n this.info(` ${SeederClass.name}`)\n }\n }\n return 0\n }\n\n if (all) {\n await this.seeders.runAll()\n this.success('All seeders completed')\n } else {\n for (const name of names) {\n const SeederClass = this.seeders.find(name)\n if (!SeederClass) {\n this.fail(`Seeder \"${name}\" not found`)\n return 1\n }\n await this.seeders.run(SeederClass)\n this.success(`Seeder \"${name}\" completed`)\n }\n }\n\n return 0\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { compile, registerMessageCompiler } from "@intlify/core-base";
|
|
2
|
+
//#region src/i18n/utils/setup.ts
|
|
3
|
+
/**
|
|
4
|
+
* I18n Setup - Message Compiler Registration
|
|
5
|
+
*
|
|
6
|
+
* Registers a JIT (Just-In-Time) message compiler for @intlify/core-base
|
|
7
|
+
* that works in Cloudflare Workers edge runtime.
|
|
8
|
+
*
|
|
9
|
+
* This must be called ONCE at application startup, before any I18nService instances are created.
|
|
10
|
+
*/
|
|
11
|
+
let isRegistered = false;
|
|
12
|
+
/**
|
|
13
|
+
* Setup JIT message compiler for i18n
|
|
14
|
+
*
|
|
15
|
+
* Registers a message compiler that uses JIT compilation mode.
|
|
16
|
+
* In @intlify/core-base v10+, JIT mode is enabled by default, which generates
|
|
17
|
+
* AST (Abstract Syntax Tree) instead of JavaScript code, making it compatible
|
|
18
|
+
* with CSP-restricted environments like Cloudflare Workers.
|
|
19
|
+
*
|
|
20
|
+
* **IMPORTANT:** Call this function once at application startup before creating
|
|
21
|
+
* any I18nService instances. Safe to call multiple times (only registers once).
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* // In application entry point (before app.initialize())
|
|
26
|
+
* setupI18nCompiler()
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
function setupI18nCompiler() {
|
|
30
|
+
if (isRegistered) return;
|
|
31
|
+
registerMessageCompiler(compile);
|
|
32
|
+
isRegistered = true;
|
|
33
|
+
}
|
|
34
|
+
//#endregion
|
|
35
|
+
export { setupI18nCompiler as t };
|
|
36
|
+
|
|
37
|
+
//# sourceMappingURL=setup-CtekcwuO.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-CtekcwuO.mjs","names":[],"sources":["../src/i18n/utils/setup.ts"],"sourcesContent":["/**\n * I18n Setup - Message Compiler Registration\n *\n * Registers a JIT (Just-In-Time) message compiler for @intlify/core-base\n * that works in Cloudflare Workers edge runtime.\n *\n * This must be called ONCE at application startup, before any I18nService instances are created.\n */\n\nimport { compile, registerMessageCompiler } from '@intlify/core-base'\n\nlet isRegistered = false\n\n/**\n * Setup JIT message compiler for i18n\n *\n * Registers a message compiler that uses JIT compilation mode.\n * In @intlify/core-base v10+, JIT mode is enabled by default, which generates\n * AST (Abstract Syntax Tree) instead of JavaScript code, making it compatible\n * with CSP-restricted environments like Cloudflare Workers.\n *\n * **IMPORTANT:** Call this function once at application startup before creating\n * any I18nService instances. Safe to call multiple times (only registers once).\n *\n * @example\n * ```typescript\n * // In application entry point (before app.initialize())\n * setupI18nCompiler()\n * ```\n */\nexport function setupI18nCompiler(): void {\n // Guard against multiple registrations\n if (isRegistered) {\n return\n }\n\n // Register the compile function from @intlify/core-base as the message compiler\n // In v11+, compile() uses JIT mode by default, generating AST instead of JavaScript code\n // This avoids CSP violations (no eval/new Function) in Cloudflare Workers\n registerMessageCompiler(compile)\n\n isRegistered = true\n}\n"],"mappings":";;;;;;;;;;AAWA,IAAI,eAAe;;;;;;;;;;;;;;;;;;AAmBnB,SAAgB,oBAA0B;AAExC,KAAI,aACF;AAMF,yBAAwB,QAAQ;AAEhC,gBAAe"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
//#region src/router/signed-url.ts
|
|
2
|
+
/**
|
|
3
|
+
* Import a signing key for HMAC-SHA256.
|
|
4
|
+
*/
|
|
5
|
+
async function importKey(secret) {
|
|
6
|
+
const encoder = new TextEncoder();
|
|
7
|
+
return crypto.subtle.importKey("raw", encoder.encode(secret), {
|
|
8
|
+
name: "HMAC",
|
|
9
|
+
hash: "SHA-256"
|
|
10
|
+
}, false, ["sign", "verify"]);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Encode an ArrayBuffer as base64url (URL-safe base64).
|
|
14
|
+
*/
|
|
15
|
+
function toBase64Url(buffer) {
|
|
16
|
+
const bytes = new Uint8Array(buffer);
|
|
17
|
+
let binary = "";
|
|
18
|
+
for (const byte of bytes) binary += String.fromCharCode(byte);
|
|
19
|
+
return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Sign a URL with HMAC-SHA256.
|
|
23
|
+
*
|
|
24
|
+
* Appends `signature` and optionally `expires` query parameters.
|
|
25
|
+
* The signature covers the pathname + search (excluding the signature params themselves).
|
|
26
|
+
*
|
|
27
|
+
* @param url - Full URL or path to sign
|
|
28
|
+
* @param secret - HMAC secret key (e.g., from env.APP_SECRET)
|
|
29
|
+
* @param options - Optional expiration
|
|
30
|
+
* @returns URL string with `signature` (and `expires`) query params appended
|
|
31
|
+
*/
|
|
32
|
+
async function signUrl(url, secret, options) {
|
|
33
|
+
const parsedUrl = new URL(url, "https://placeholder.local");
|
|
34
|
+
const key = await importKey(secret);
|
|
35
|
+
if (options?.expiresIn) {
|
|
36
|
+
const expires = Math.floor(Date.now() / 1e3) + options.expiresIn;
|
|
37
|
+
parsedUrl.searchParams.set("expires", String(expires));
|
|
38
|
+
}
|
|
39
|
+
const dataToSign = `${parsedUrl.pathname}?${parsedUrl.searchParams.toString()}`;
|
|
40
|
+
const encoder = new TextEncoder();
|
|
41
|
+
const signature = toBase64Url(await crypto.subtle.sign("HMAC", key, encoder.encode(dataToSign)));
|
|
42
|
+
parsedUrl.searchParams.set("signature", signature);
|
|
43
|
+
return url.startsWith("http") ? parsedUrl.toString() : `${parsedUrl.pathname}?${parsedUrl.searchParams.toString()}`;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Verify a signed URL using `crypto.subtle.verify()` (timing-attack-safe).
|
|
47
|
+
*
|
|
48
|
+
* @param url - Full URL or path with signature query param
|
|
49
|
+
* @param secret - HMAC secret key (same key used for signing)
|
|
50
|
+
* @returns true if signature is valid and not expired
|
|
51
|
+
*/
|
|
52
|
+
async function verifySignedUrl(url, secret) {
|
|
53
|
+
const parsedUrl = new URL(url, "https://placeholder.local");
|
|
54
|
+
const signature = parsedUrl.searchParams.get("signature");
|
|
55
|
+
if (!signature) return false;
|
|
56
|
+
const expires = parsedUrl.searchParams.get("expires");
|
|
57
|
+
if (expires) {
|
|
58
|
+
const expiryTime = parseInt(expires, 10);
|
|
59
|
+
if (isNaN(expiryTime) || Math.floor(Date.now() / 1e3) > expiryTime) return false;
|
|
60
|
+
}
|
|
61
|
+
parsedUrl.searchParams.delete("signature");
|
|
62
|
+
const dataToVerify = `${parsedUrl.pathname}?${parsedUrl.searchParams.toString()}`;
|
|
63
|
+
const base64 = signature.replace(/-/g, "+").replace(/_/g, "/");
|
|
64
|
+
const binaryStr = atob(base64);
|
|
65
|
+
const signatureBytes = new Uint8Array(binaryStr.length);
|
|
66
|
+
for (let i = 0; i < binaryStr.length; i++) signatureBytes[i] = binaryStr.charCodeAt(i);
|
|
67
|
+
const key = await importKey(secret);
|
|
68
|
+
const encoder = new TextEncoder();
|
|
69
|
+
return crypto.subtle.verify("HMAC", key, signatureBytes, encoder.encode(dataToVerify));
|
|
70
|
+
}
|
|
71
|
+
//#endregion
|
|
72
|
+
export { verifySignedUrl as n, signUrl as t };
|
|
73
|
+
|
|
74
|
+
//# sourceMappingURL=signed-url-COX7cCWR.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signed-url-COX7cCWR.mjs","names":[],"sources":["../src/router/signed-url.ts"],"sourcesContent":["/**\n * Signed URL utilities using HMAC-SHA256 via Web Crypto API.\n *\n * Follows the Cloudflare Workers signing pattern:\n * https://developers.cloudflare.com/workers/examples/signing-requests/\n *\n * Uses `crypto.subtle.verify()` for timing-attack-safe comparison.\n */\n\n/**\n * Options for signing a URL.\n */\nexport interface SignedUrlOptions {\n /** Time-to-live in seconds. URL expires after this duration. */\n expiresIn?: number\n}\n\n/**\n * Import a signing key for HMAC-SHA256.\n */\nasync function importKey(secret: string): Promise<CryptoKey> {\n const encoder = new TextEncoder()\n return crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign', 'verify']\n )\n}\n\n/**\n * Encode an ArrayBuffer as base64url (URL-safe base64).\n */\nfunction toBase64Url(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer)\n let binary = ''\n for (const byte of bytes) {\n binary += String.fromCharCode(byte)\n }\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '')\n}\n\n/**\n * Sign a URL with HMAC-SHA256.\n *\n * Appends `signature` and optionally `expires` query parameters.\n * The signature covers the pathname + search (excluding the signature params themselves).\n *\n * @param url - Full URL or path to sign\n * @param secret - HMAC secret key (e.g., from env.APP_SECRET)\n * @param options - Optional expiration\n * @returns URL string with `signature` (and `expires`) query params appended\n */\nexport async function signUrl(url: string, secret: string, options?: SignedUrlOptions): Promise<string> {\n const parsedUrl = new URL(url, 'https://placeholder.local')\n const key = await importKey(secret)\n\n // Add expiry if specified\n if (options?.expiresIn) {\n const expires = Math.floor(Date.now() / 1000) + options.expiresIn\n parsedUrl.searchParams.set('expires', String(expires))\n }\n\n // Sign: pathname + sorted search params (without signature)\n const dataToSign = `${parsedUrl.pathname}?${parsedUrl.searchParams.toString()}`\n const encoder = new TextEncoder()\n const signatureBuffer = await crypto.subtle.sign('HMAC', key, encoder.encode(dataToSign))\n const signature = toBase64Url(signatureBuffer)\n\n parsedUrl.searchParams.set('signature', signature)\n // Return just the path + query for relative URLs, full URL for absolute\n return url.startsWith('http') ? parsedUrl.toString() : `${parsedUrl.pathname}?${parsedUrl.searchParams.toString()}`\n}\n\n/**\n * Verify a signed URL using `crypto.subtle.verify()` (timing-attack-safe).\n *\n * @param url - Full URL or path with signature query param\n * @param secret - HMAC secret key (same key used for signing)\n * @returns true if signature is valid and not expired\n */\nexport async function verifySignedUrl(url: string, secret: string): Promise<boolean> {\n const parsedUrl = new URL(url, 'https://placeholder.local')\n const signature = parsedUrl.searchParams.get('signature')\n if (!signature) return false\n\n // Check expiry\n const expires = parsedUrl.searchParams.get('expires')\n if (expires) {\n const expiryTime = parseInt(expires, 10)\n if (isNaN(expiryTime) || Math.floor(Date.now() / 1000) > expiryTime) {\n return false\n }\n }\n\n // Reconstruct the data that was signed (without signature param)\n parsedUrl.searchParams.delete('signature')\n const dataToVerify = `${parsedUrl.pathname}?${parsedUrl.searchParams.toString()}`\n\n // Decode base64url signature\n const base64 = signature.replace(/-/g, '+').replace(/_/g, '/')\n const binaryStr = atob(base64)\n const signatureBytes = new Uint8Array(binaryStr.length)\n for (let i = 0; i < binaryStr.length; i++) {\n signatureBytes[i] = binaryStr.charCodeAt(i)\n }\n\n const key = await importKey(secret)\n const encoder = new TextEncoder()\n\n // Use crypto.subtle.verify() for timing-attack-safe comparison\n return crypto.subtle.verify('HMAC', key, signatureBytes, encoder.encode(dataToVerify))\n}\n"],"mappings":";;;;AAoBA,eAAe,UAAU,QAAoC;CAC3D,MAAM,UAAU,IAAI,aAAa;AACjC,QAAO,OAAO,OAAO,UACnB,OACA,QAAQ,OAAO,OAAO,EACtB;EAAE,MAAM;EAAQ,MAAM;EAAW,EACjC,OACA,CAAC,QAAQ,SAAS,CACnB;;;;;AAMH,SAAS,YAAY,QAA6B;CAChD,MAAM,QAAQ,IAAI,WAAW,OAAO;CACpC,IAAI,SAAS;AACb,MAAK,MAAM,QAAQ,MACjB,WAAU,OAAO,aAAa,KAAK;AAErC,QAAO,KAAK,OAAO,CAAC,QAAQ,OAAO,IAAI,CAAC,QAAQ,OAAO,IAAI,CAAC,QAAQ,OAAO,GAAG;;;;;;;;;;;;;AAchF,eAAsB,QAAQ,KAAa,QAAgB,SAA6C;CACtG,MAAM,YAAY,IAAI,IAAI,KAAK,4BAA4B;CAC3D,MAAM,MAAM,MAAM,UAAU,OAAO;AAGnC,KAAI,SAAS,WAAW;EACtB,MAAM,UAAU,KAAK,MAAM,KAAK,KAAK,GAAG,IAAK,GAAG,QAAQ;AACxD,YAAU,aAAa,IAAI,WAAW,OAAO,QAAQ,CAAC;;CAIxD,MAAM,aAAa,GAAG,UAAU,SAAS,GAAG,UAAU,aAAa,UAAU;CAC7E,MAAM,UAAU,IAAI,aAAa;CAEjC,MAAM,YAAY,YAAY,MADA,OAAO,OAAO,KAAK,QAAQ,KAAK,QAAQ,OAAO,WAAW,CAAC,CAC3C;AAE9C,WAAU,aAAa,IAAI,aAAa,UAAU;AAElD,QAAO,IAAI,WAAW,OAAO,GAAG,UAAU,UAAU,GAAG,GAAG,UAAU,SAAS,GAAG,UAAU,aAAa,UAAU;;;;;;;;;AAUnH,eAAsB,gBAAgB,KAAa,QAAkC;CACnF,MAAM,YAAY,IAAI,IAAI,KAAK,4BAA4B;CAC3D,MAAM,YAAY,UAAU,aAAa,IAAI,YAAY;AACzD,KAAI,CAAC,UAAW,QAAO;CAGvB,MAAM,UAAU,UAAU,aAAa,IAAI,UAAU;AACrD,KAAI,SAAS;EACX,MAAM,aAAa,SAAS,SAAS,GAAG;AACxC,MAAI,MAAM,WAAW,IAAI,KAAK,MAAM,KAAK,KAAK,GAAG,IAAK,GAAG,WACvD,QAAO;;AAKX,WAAU,aAAa,OAAO,YAAY;CAC1C,MAAM,eAAe,GAAG,UAAU,SAAS,GAAG,UAAU,aAAa,UAAU;CAG/E,MAAM,SAAS,UAAU,QAAQ,MAAM,IAAI,CAAC,QAAQ,MAAM,IAAI;CAC9D,MAAM,YAAY,KAAK,OAAO;CAC9B,MAAM,iBAAiB,IAAI,WAAW,UAAU,OAAO;AACvD,MAAK,IAAI,IAAI,GAAG,IAAI,UAAU,QAAQ,IACpC,gBAAe,KAAK,UAAU,WAAW,EAAE;CAG7C,MAAM,MAAM,MAAM,UAAU,OAAO;CACnC,MAAM,UAAU,IAAI,aAAa;AAGjC,QAAO,OAAO,OAAO,OAAO,QAAQ,KAAK,gBAAgB,QAAQ,OAAO,aAAa,CAAC"}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
import "./errors-DSKapqD8.mjs";
|
|
2
|
-
import "./logger-CGT91VY6.mjs";
|
|
3
1
|
import { EmailSmtpConnectionFailedError, SmtpConfigurationMissingError, SmtpHostMissingError } from "./email/index.mjs";
|
|
4
|
-
import { t as BaseEmailProvider } from "./base-email.provider-
|
|
2
|
+
import { t as BaseEmailProvider } from "./base-email.provider-mjynzewK.mjs";
|
|
5
3
|
import * as nodemailer from "nodemailer";
|
|
6
4
|
import { Readable } from "stream";
|
|
7
5
|
//#region src/email/providers/smtp.provider.ts
|
|
@@ -74,4 +72,4 @@ var SmtpProvider = class extends BaseEmailProvider {
|
|
|
74
72
|
//#endregion
|
|
75
73
|
export { SmtpProvider };
|
|
76
74
|
|
|
77
|
-
//# sourceMappingURL=smtp.provider-
|
|
75
|
+
//# sourceMappingURL=smtp.provider-B07yuARi.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smtp.provider-
|
|
1
|
+
{"version":3,"file":"smtp.provider-B07yuARi.mjs","names":[],"sources":["../src/email/providers/smtp.provider.ts"],"sourcesContent":["import type { Transporter } from 'nodemailer'\nimport * as nodemailer from 'nodemailer'\nimport type SMTPTransport from 'nodemailer/lib/smtp-transport'\nimport { Readable } from 'stream'\nimport type { ResolvedEmailAttachment, ResolvedEmailMessage } from '../contracts'\nimport type { EmailModuleOptions } from '../email.module'\nimport { EmailSmtpConnectionFailedError, SmtpConfigurationMissingError, SmtpHostMissingError } from '../errors'\nimport { BaseEmailProvider } from './base-email.provider'\nimport type { EmailSendResult } from './email-provider.interface'\n\n/**\n * SMTP Email Provider\n *\n * Implementation of IEmailProvider using SMTP/nodemailer\n * Supports any SMTP server configured via SMTP_URL\n */\nexport class SmtpProvider extends BaseEmailProvider {\n private readonly transporter: Transporter<SMTPTransport.SentMessageInfo>\n private readonly defaultFrom: { name: string; email: string }\n\n constructor(\n private readonly options: EmailModuleOptions\n ) {\n super()\n\n // Validate SMTP configuration\n if (!this.options.smtp) {\n throw new SmtpConfigurationMissingError()\n }\n\n if (!this.options.smtp.host) {\n throw new SmtpHostMissingError()\n }\n\n // Create nodemailer transporter\n this.transporter = nodemailer.createTransport({\n host: this.options.smtp.host,\n port: this.options.smtp.port,\n secure: this.options.smtp.secure,\n auth: this.options.smtp.username && this.options.smtp.password\n ? {\n user: this.options.smtp.username,\n pass: this.options.smtp.password,\n }\n : undefined,\n })\n\n this.defaultFrom = this.options.from\n }\n\n async send(message: ResolvedEmailMessage): Promise<EmailSendResult> {\n try {\n const from = message.from\n ? `${message.from.name} <${message.from.email}>`\n : `${this.defaultFrom.name} <${this.defaultFrom.email}>`\n\n const info = await this.transporter.sendMail({\n from,\n to: Array.isArray(message.to) ? message.to.join(', ') : message.to,\n subject: message.subject,\n html: message.html,\n text: message.text,\n replyTo: message.replyTo,\n cc: message.cc?.join(', '),\n bcc: message.bcc?.join(', '),\n attachments: message.attachments?.map(attachment => ({\n filename: attachment.filename,\n content: this.toNodeStream(attachment.content),\n contentType: attachment.contentType,\n })),\n })\n\n return {\n messageId: info.messageId,\n accepted: true,\n metadata: {\n provider: 'smtp',\n response: info.response,\n },\n }\n } catch {\n throw new EmailSmtpConnectionFailedError(\n this.options.smtp?.host ?? '',\n this.options.smtp?.port ?? 587\n )\n }\n }\n\n /**\n * Convert attachment content to Node.js stream format\n *\n * Nodemailer expects Node.js Readable streams, not web ReadableStream.\n * Buffer is passed through as-is since nodemailer supports it directly.\n */\n private toNodeStream(content: ResolvedEmailAttachment['content']): Buffer | Readable {\n if (Buffer.isBuffer(content)) {\n return content\n }\n // Convert web ReadableStream to Node.js Readable\n return Readable.fromWeb(content as unknown as Parameters<typeof Readable.fromWeb>[0])\n }\n}\n"],"mappings":";;;;;;;;;;;AAgBA,IAAa,eAAb,cAAkC,kBAAkB;CAClD;CACA;CAEA,YACE,SACA;AACA,SAAO;AAFU,OAAA,UAAA;AAKjB,MAAI,CAAC,KAAK,QAAQ,KAChB,OAAM,IAAI,+BAA+B;AAG3C,MAAI,CAAC,KAAK,QAAQ,KAAK,KACrB,OAAM,IAAI,sBAAsB;AAIlC,OAAK,cAAc,WAAW,gBAAgB;GAC5C,MAAM,KAAK,QAAQ,KAAK;GACxB,MAAM,KAAK,QAAQ,KAAK;GACxB,QAAQ,KAAK,QAAQ,KAAK;GAC1B,MAAM,KAAK,QAAQ,KAAK,YAAY,KAAK,QAAQ,KAAK,WAClD;IACA,MAAM,KAAK,QAAQ,KAAK;IACxB,MAAM,KAAK,QAAQ,KAAK;IACzB,GACC,KAAA;GACL,CAAC;AAEF,OAAK,cAAc,KAAK,QAAQ;;CAGlC,MAAM,KAAK,SAAyD;AAClE,MAAI;GACF,MAAM,OAAO,QAAQ,OACjB,GAAG,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,MAAM,KAC5C,GAAG,KAAK,YAAY,KAAK,IAAI,KAAK,YAAY,MAAM;GAExD,MAAM,OAAO,MAAM,KAAK,YAAY,SAAS;IAC3C;IACA,IAAI,MAAM,QAAQ,QAAQ,GAAG,GAAG,QAAQ,GAAG,KAAK,KAAK,GAAG,QAAQ;IAChE,SAAS,QAAQ;IACjB,MAAM,QAAQ;IACd,MAAM,QAAQ;IACd,SAAS,QAAQ;IACjB,IAAI,QAAQ,IAAI,KAAK,KAAK;IAC1B,KAAK,QAAQ,KAAK,KAAK,KAAK;IAC5B,aAAa,QAAQ,aAAa,KAAI,gBAAe;KACnD,UAAU,WAAW;KACrB,SAAS,KAAK,aAAa,WAAW,QAAQ;KAC9C,aAAa,WAAW;KACzB,EAAE;IACJ,CAAC;AAEF,UAAO;IACL,WAAW,KAAK;IAChB,UAAU;IACV,UAAU;KACR,UAAU;KACV,UAAU,KAAK;KAChB;IACF;UACK;AACN,SAAM,IAAI,+BACR,KAAK,QAAQ,MAAM,QAAQ,IAC3B,KAAK,QAAQ,MAAM,QAAQ,IAC5B;;;;;;;;;CAUL,aAAqB,SAAgE;AACnF,MAAI,OAAO,SAAS,QAAQ,CAC1B,QAAO;AAGT,SAAO,SAAS,QAAQ,QAA6D"}
|
package/dist/storage/index.d.mts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { V as RouterContext, d as ApplicationError, hn as DynamicModule, pn as AsyncModuleOptions } from "../index-DPFqRs8L.mjs";
|
|
2
|
+
import { t as StratalEnv } from "../env-CamWD-U1.mjs";
|
|
3
|
+
import { _ as StorageEntry, a as uploadResultSchema, c as getPresignedUrlInputSchema, d as fileExistsInputSchema, f as DownloadResult, g as StorageConfig, h as PresignedUrlConfig, i as UploadResult, l as presignedUrlResultSchema, m as deleteFileInputSchema, n as StreamingBlobPayloadInputTypes, o as GetPresignedUrlInput, p as DeleteFileInput, r as UploadOptions, s as PresignedUrlResult, t as IStorageProvider, u as FileExistsInput, v as StorageRouteConfig } from "../storage-provider.interface-CC1nniHk.mjs";
|
|
3
4
|
|
|
4
5
|
//#region src/storage/storage.module.d.ts
|
|
5
6
|
/**
|
|
@@ -11,13 +12,10 @@ declare class StorageModule {
|
|
|
11
12
|
/**
|
|
12
13
|
* Configure StorageModule with static options
|
|
13
14
|
*
|
|
14
|
-
* @param options - Storage configuration options
|
|
15
|
-
* @returns Dynamic module with storage infrastructure
|
|
16
|
-
*
|
|
17
15
|
* @example
|
|
18
16
|
* ```typescript
|
|
19
17
|
* StorageModule.forRoot({
|
|
20
|
-
* storage: [{ disk: 'uploads',
|
|
18
|
+
* storage: [{ disk: 'uploads', binding: 'MY_BUCKET', root: 'uploads' }],
|
|
21
19
|
* defaultStorageDisk: 'uploads',
|
|
22
20
|
* presignedUrl: { defaultExpiry: 3600, maxExpiry: 86400 }
|
|
23
21
|
* })
|
|
@@ -29,9 +27,6 @@ declare class StorageModule {
|
|
|
29
27
|
*
|
|
30
28
|
* Use when configuration depends on other services.
|
|
31
29
|
*
|
|
32
|
-
* @param options - Async configuration with factory and inject tokens
|
|
33
|
-
* @returns Dynamic module with storage infrastructure
|
|
34
|
-
*
|
|
35
30
|
* @example
|
|
36
31
|
* ```typescript
|
|
37
32
|
* StorageModule.forRootAsync({
|
|
@@ -62,14 +57,15 @@ declare const STORAGE_TOKENS: {
|
|
|
62
57
|
/**
|
|
63
58
|
* Storage Manager Service
|
|
64
59
|
* Manages multiple storage providers (one per disk)
|
|
65
|
-
* Handles lazy initialization and caching of
|
|
60
|
+
* Handles lazy initialization and caching of R2 providers
|
|
66
61
|
*/
|
|
67
62
|
declare class StorageManagerService {
|
|
68
63
|
private readonly options;
|
|
64
|
+
private readonly env;
|
|
69
65
|
private readonly providers;
|
|
70
66
|
private readonly creationPromises;
|
|
71
67
|
private readonly diskConfigs;
|
|
72
|
-
constructor(options: StorageConfig);
|
|
68
|
+
constructor(options: StorageConfig, env: StratalEnv);
|
|
73
69
|
/**
|
|
74
70
|
* Initialize disk configurations from options
|
|
75
71
|
*/
|
|
@@ -82,8 +78,8 @@ declare class StorageManagerService {
|
|
|
82
78
|
*/
|
|
83
79
|
getProvider(diskName: string): Promise<IStorageProvider>;
|
|
84
80
|
/**
|
|
85
|
-
* Create
|
|
86
|
-
* Dynamically imports
|
|
81
|
+
* Create an R2 provider instance
|
|
82
|
+
* Dynamically imports R2StorageProvider to support code splitting
|
|
87
83
|
* @param config - Storage entry configuration
|
|
88
84
|
* @returns Storage provider instance
|
|
89
85
|
*/
|
|
@@ -240,6 +236,27 @@ declare class StorageService {
|
|
|
240
236
|
}, disk?: string): Promise<UploadResult>;
|
|
241
237
|
}
|
|
242
238
|
//#endregion
|
|
239
|
+
//#region src/storage/controllers/storage.controller.d.ts
|
|
240
|
+
/**
|
|
241
|
+
* Storage Controller
|
|
242
|
+
*
|
|
243
|
+
* Auto-registered controller that proxies R2 operations behind signed URLs.
|
|
244
|
+
* Signature verification is applied via VerifySignatureMiddleware on the module's
|
|
245
|
+
* configureRoutes() method.
|
|
246
|
+
*
|
|
247
|
+
* Routes:
|
|
248
|
+
* - GET /storage/:disk/* → download file
|
|
249
|
+
* - PUT /storage/:disk/* → upload file
|
|
250
|
+
* - DELETE /storage/:disk/* → delete file
|
|
251
|
+
*/
|
|
252
|
+
declare class StorageController {
|
|
253
|
+
private readonly storage;
|
|
254
|
+
constructor(storage: StorageService);
|
|
255
|
+
download(ctx: RouterContext): Promise<Response>;
|
|
256
|
+
upload(ctx: RouterContext): Promise<Response>;
|
|
257
|
+
destroy(ctx: RouterContext): Promise<Response>;
|
|
258
|
+
}
|
|
259
|
+
//#endregion
|
|
243
260
|
//#region src/storage/errors/disk-not-configured.error.d.ts
|
|
244
261
|
declare class DiskNotConfiguredError extends ApplicationError {
|
|
245
262
|
constructor(disk: string);
|
|
@@ -270,9 +287,14 @@ declare class PresignedUrlInvalidExpiryError extends ApplicationError {
|
|
|
270
287
|
constructor(expiresIn: number, min: number, max: number);
|
|
271
288
|
}
|
|
272
289
|
//#endregion
|
|
273
|
-
//#region src/storage/errors/
|
|
274
|
-
declare class
|
|
275
|
-
constructor(
|
|
290
|
+
//#region src/storage/errors/r2-binding-not-found.error.d.ts
|
|
291
|
+
declare class R2BindingNotFoundError extends ApplicationError {
|
|
292
|
+
constructor(binding: string);
|
|
293
|
+
}
|
|
294
|
+
//#endregion
|
|
295
|
+
//#region src/storage/errors/r2-presigned-url-secret-missing.error.d.ts
|
|
296
|
+
declare class R2PresignedUrlSecretMissingError extends ApplicationError {
|
|
297
|
+
constructor();
|
|
276
298
|
}
|
|
277
299
|
//#endregion
|
|
278
300
|
//#region src/storage/errors/storage-response-body-missing.error.d.ts
|
|
@@ -280,5 +302,5 @@ declare class StorageResponseBodyMissingError extends ApplicationError {
|
|
|
280
302
|
constructor(path: string);
|
|
281
303
|
}
|
|
282
304
|
//#endregion
|
|
283
|
-
export { DeleteFileInput, DiskNotConfiguredError, DownloadResult, FileExistsInput, FileNotFoundError, FileTooLargeError, GetPresignedUrlInput, type IStorageProvider, InvalidDiskError, InvalidFileTypeError, type PresignedUrlConfig, PresignedUrlInvalidExpiryError, PresignedUrlResult, STORAGE_TOKENS, type StorageConfig, type StorageEntry, StorageManagerService, StorageModule,
|
|
305
|
+
export { DeleteFileInput, DiskNotConfiguredError, DownloadResult, FileExistsInput, FileNotFoundError, FileTooLargeError, GetPresignedUrlInput, type IStorageProvider, InvalidDiskError, InvalidFileTypeError, type PresignedUrlConfig, PresignedUrlInvalidExpiryError, PresignedUrlResult, R2BindingNotFoundError, R2PresignedUrlSecretMissingError, STORAGE_TOKENS, type StorageConfig, StorageController, type StorageEntry, StorageManagerService, StorageModule, StorageResponseBodyMissingError, type StorageRouteConfig, StorageService, type StreamingBlobPayloadInputTypes, UploadOptions, UploadResult, deleteFileInputSchema, fileExistsInputSchema, getPresignedUrlInputSchema, presignedUrlResultSchema, uploadResultSchema };
|
|
284
306
|
//# sourceMappingURL=index.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/storage/storage.module.ts","../../src/storage/storage.tokens.ts","../../src/storage/services/storage-manager.service.ts","../../src/storage/services/storage.service.ts","../../src/storage/errors/disk-not-configured.error.ts","../../src/storage/errors/file-not-found.error.ts","../../src/storage/errors/file-too-large.error.ts","../../src/storage/errors/invalid-disk.error.ts","../../src/storage/errors/invalid-file-type.error.ts","../../src/storage/errors/presigned-url-invalid-expiry.error.ts","../../src/storage/errors/
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/storage/storage.module.ts","../../src/storage/storage.tokens.ts","../../src/storage/services/storage-manager.service.ts","../../src/storage/services/storage.service.ts","../../src/storage/controllers/storage.controller.ts","../../src/storage/errors/disk-not-configured.error.ts","../../src/storage/errors/file-not-found.error.ts","../../src/storage/errors/file-too-large.error.ts","../../src/storage/errors/invalid-disk.error.ts","../../src/storage/errors/invalid-file-type.error.ts","../../src/storage/errors/presigned-url-invalid-expiry.error.ts","../../src/storage/errors/r2-binding-not-found.error.ts","../../src/storage/errors/r2-presigned-url-secret-missing.error.ts","../../src/storage/errors/storage-response-body-missing.error.ts"],"mappings":";;;;;;;;AAoBA;KAFY,oBAAA,GAAuB,aAAA;AAAA,cAQtB,aAAA;EAaa;;;;;;;;;;;;EAAA,OAAjB,OAAA,CAAQ,OAAA,EAAS,oBAAA,GAAuB,aAAA;EA0BC;;;;;;;;AC7DlD;;;;;;;;;ED6DkD,OAAzC,YAAA,CAAa,OAAA,EAAS,kBAAA,CAAmB,oBAAA,IAAwB,aAAA;AAAA;;;;;;;cC7D7D,cAAA;EAAA;;;;;;;;ADcb;;;cEHa,qBAAA;EAAA,iBAOQ,OAAA;EAAA,iBAEA,GAAA;EAAA,iBARF,SAAA;EAAA,iBACA,gBAAA;EAAA,iBACA,WAAA;cAIE,OAAA,EAAS,aAAA,EAET,GAAA,EAAK,UAAA;EFyCwB;;;EAAA,QEjCxC,qBAAA;EFiC6E;;;;;;EErB/E,WAAA,CAAY,QAAA,WAAmB,OAAA,CAAQ,gBAAA;EFqBG;;;;;;EAAA,QEmBlC,cAAA;;ADhFhB;;;;EC8FE,aAAA,CAAc,QAAA,WAAmB,YAAA;;;;;;EAajC,OAAA,CAAQ,QAAA;;AAjGV;;;EAyGE,iBAAA,CAAA;AAAA;;;;AFrGF;;;;;AAEA;;;;;;;;cGOa,cAAA;EAAA,mBAGU,cAAA,EAAgB,qBAAA;EAAA,mBAEhB,OAAA,EAAS,aAAA;cAFT,cAAA,EAAgB,qBAAA,EAEhB,OAAA,EAAS,aAAA;EHOf;;;;;;;;EGIT,MAAA,CACJ,IAAA,EAAM,8BAAA,EACN,YAAA,UACA,OAAA,EAAS,aAAA,EACT,IAAA,YACC,OAAA,CAAQ,YAAA;;;;AF5Cb;;;EE0DQ,QAAA,CAAS,YAAA,UAAsB,IAAA,YAAgB,OAAA,CAAQ,cAAA;;;;;;EAavD,MAAA,CAAO,YAAA,UAAsB,IAAA,YAAgB,OAAA;;;AD7DrD;;;;EC2EQ,MAAA,CAAO,YAAA,UAAsB,IAAA,YAAgB,OAAA;ED7CN;;;;;;;EC4DvC,uBAAA,CACJ,YAAA,UACA,SAAA,WACA,IAAA,YACC,OAAA,CAAQ,kBAAA;ED3FM;;;;;;;ECsGX,qBAAA,CACJ,YAAA,UACA,SAAA,WACA,IAAA,YACC,OAAA,CAAQ,kBAAA;ED/EL;;;;;;;EC0FA,qBAAA,CACJ,YAAA,UACA,SAAA,WACA,IAAA,YACC,OAAA,CAAQ,kBAAA;ED3BX;;;;;;;;EAAA,UCuCgB,eAAA,CACd,YAAA,UACA,MAAA,qCACA,SAAA,WACA,IAAA,YACC,OAAA,CAAQ,kBAAA;EAhIc;;;;;EAAA,UA8If,WAAA,CAAY,IAAA;EA7Hd;;;;;;EAAA,UA6IE,aAAA,CAAc,YAAA,UAAsB,QAAA;EAhGK;;;;;;;EAAA,UAoHzC,2BAAA,CAA4B,IAAA;EAlDnC;;;;;EAAA,UAmEO,iBAAA,CAAkB,SAAA;EA0ClB;;;;EAxBV,iBAAA,CAAA;EAhN8B;;;;;;;;;;;;;;;EAmOxB,aAAA,CACJ,IAAA,EAAM,8BAAA,EACN,YAAA,UACA,OAAA,EAAS,IAAA,CAAK,aAAA;IAA2B,IAAA;EAAA,GACzC,IAAA,YACC,OAAA,CAAQ,YAAA;AAAA;;;;;;AHtPb;;;;;AAEA;;;;cIMa,iBAAA;EAAA,iBAGQ,OAAA;cAAA,OAAA,EAAS,cAAA;EAItB,QAAA,CAAS,GAAA,EAAK,aAAA,GAAgB,OAAA,CAAQ,QAAA;EAoBtC,MAAA,CAAO,GAAA,EAAK,aAAA,GAAgB,OAAA,CAAQ,QAAA;EAiBpC,OAAA,CAAQ,GAAA,EAAK,aAAA,GAAgB,OAAA,CAAQ,QAAA;AAAA;;;cCpEhC,sBAAA,SAA+B,gBAAA;cAC9B,IAAA;AAAA;;;cCAD,iBAAA,SAA0B,gBAAA;cACzB,IAAA;AAAA;;;cCDD,iBAAA,SAA0B,gBAAA;cACzB,IAAA,UAAc,OAAA;AAAA;;;cCDf,gBAAA,SAAyB,gBAAA;cACxB,IAAA;AAAA;;;cCDD,oBAAA,SAA6B,gBAAA;cAC5B,QAAA;AAAA;;;cCDD,8BAAA,SAAuC,gBAAA;cACtC,SAAA,UAAmB,GAAA,UAAa,GAAA;AAAA;;;cCFjC,sBAAA,SAA+B,gBAAA;cAC9B,OAAA;AAAA;;;cCDD,gCAAA,SAAyC,gBAAA;EAAA,WAAA,CAAA;AAAA;;;cCCzC,+BAAA,SAAwC,gBAAA;cACvC,IAAA;AAAA"}
|
package/dist/storage/index.mjs
CHANGED
|
@@ -1,14 +1,3 @@
|
|
|
1
|
-
import "../errors-
|
|
2
|
-
import "../
|
|
3
|
-
|
|
4
|
-
import "../events-CvUSgEuN.mjs";
|
|
5
|
-
import "../middleware-Bl-b5pkt.mjs";
|
|
6
|
-
import "../router-context-D9R1v2Ac.mjs";
|
|
7
|
-
import "../colors-Y7WIFXs7.mjs";
|
|
8
|
-
import "../command-B1CPgsrU.mjs";
|
|
9
|
-
import "../is-command-DJVI6wEJ.mjs";
|
|
10
|
-
import "../is-seeder-D5MIEcdz.mjs";
|
|
11
|
-
import "../validation-DQTC259A.mjs";
|
|
12
|
-
import { a as InvalidDiskError, c as DiskNotConfiguredError, i as InvalidFileTypeError, n as StorageProviderNotSupportedError, o as FileTooLargeError, r as PresignedUrlInvalidExpiryError, s as FileNotFoundError, t as StorageResponseBodyMissingError } from "../errors-DuAR5Wke.mjs";
|
|
13
|
-
import { a as deleteFileInputSchema, c as StorageManagerService, i as fileExistsInputSchema, l as STORAGE_TOKENS, n as getPresignedUrlInputSchema, o as StorageModule, r as presignedUrlResultSchema, s as StorageService, t as uploadResultSchema } from "../storage-CZKHOhci.mjs";
|
|
14
|
-
export { DiskNotConfiguredError, FileNotFoundError, FileTooLargeError, InvalidDiskError, InvalidFileTypeError, PresignedUrlInvalidExpiryError, STORAGE_TOKENS, StorageManagerService, StorageModule, StorageProviderNotSupportedError, StorageResponseBodyMissingError, StorageService, deleteFileInputSchema, fileExistsInputSchema, getPresignedUrlInputSchema, presignedUrlResultSchema, uploadResultSchema };
|
|
1
|
+
import { a as InvalidFileTypeError, c as FileNotFoundError, i as PresignedUrlInvalidExpiryError, l as DiskNotConfiguredError, n as R2PresignedUrlSecretMissingError, o as InvalidDiskError, r as R2BindingNotFoundError, s as FileTooLargeError, t as StorageResponseBodyMissingError } from "../errors-BUyUfr2Z.mjs";
|
|
2
|
+
import { a as deleteFileInputSchema, c as StorageService, i as fileExistsInputSchema, l as StorageManagerService, n as getPresignedUrlInputSchema, o as StorageController, r as presignedUrlResultSchema, s as StorageModule, t as uploadResultSchema, u as STORAGE_TOKENS } from "../storage-P6X4h9So.mjs";
|
|
3
|
+
export { DiskNotConfiguredError, FileNotFoundError, FileTooLargeError, InvalidDiskError, InvalidFileTypeError, PresignedUrlInvalidExpiryError, R2BindingNotFoundError, R2PresignedUrlSecretMissingError, STORAGE_TOKENS, StorageController, StorageManagerService, StorageModule, StorageResponseBodyMissingError, StorageService, deleteFileInputSchema, fileExistsInputSchema, getPresignedUrlInputSchema, presignedUrlResultSchema, uploadResultSchema };
|