@hartl-services/medusa-base 0.4.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. package/.medusa/server/src/admin/index.js +1517 -87
  2. package/.medusa/server/src/admin/index.mjs +1518 -88
  3. package/.medusa/server/src/api/admin/email/messages/[id]/resends/route.js +24 -0
  4. package/.medusa/server/src/api/admin/email/messages/[id]/route.js +12 -0
  5. package/.medusa/server/src/api/admin/email/messages/route.js +12 -0
  6. package/.medusa/server/src/api/admin/email/terms-versions/[id]/download/route.js +16 -0
  7. package/.medusa/server/src/api/admin/email/terms-versions/route.js +47 -0
  8. package/.medusa/server/src/api/admin/orders/[id]/documents/[document_id]/download/route.js +21 -0
  9. package/.medusa/server/src/api/admin/orders/[id]/documents/[document_id]/regenerate/route.js +38 -0
  10. package/.medusa/server/src/api/admin/orders/[id]/documents/regenerate/route.js +32 -0
  11. package/.medusa/server/src/api/admin/orders/[id]/documents/route.js +36 -0
  12. package/.medusa/server/src/api/admin/orders/[id]/packing-lists/[fulfillment_id]/download/route.js +24 -0
  13. package/.medusa/server/src/api/admin/orders/[id]/packing-lists/[fulfillment_id]/retry/route.js +44 -0
  14. package/.medusa/server/src/api/admin/orders/[id]/packing-lists/route.js +82 -0
  15. package/.medusa/server/src/api/document-download-response.js +16 -0
  16. package/.medusa/server/src/api/document-response.js +23 -0
  17. package/.medusa/server/src/api/files/[asset]/route.js +24 -0
  18. package/.medusa/server/src/api/files/file-response.js +43 -0
  19. package/.medusa/server/src/api/files/gateway-options.js +31 -0
  20. package/.medusa/server/src/api/files/private/[token]/route.js +29 -0
  21. package/.medusa/server/src/api/files/upload/[token]/route.js +66 -0
  22. package/.medusa/server/src/api/middlewares.js +168 -1
  23. package/.medusa/server/src/api/packing-list-response.js +22 -0
  24. package/.medusa/server/src/api/route.js +27 -0
  25. package/.medusa/server/src/api/store/documents/[id]/download/route.js +21 -0
  26. package/.medusa/server/src/api/store/documents/[id]/route.js +15 -0
  27. package/.medusa/server/src/api/store/documents/route.js +11 -0
  28. package/.medusa/server/src/api/terms-download-response.js +12 -0
  29. package/.medusa/server/src/documents/config/index.js +18 -0
  30. package/.medusa/server/src/documents/paths/documents.js +6 -0
  31. package/.medusa/server/src/documents/paths/index.js +18 -0
  32. package/.medusa/server/src/documents/plugin-features.js +24 -0
  33. package/.medusa/server/src/documents/schemas/documents.js +18 -0
  34. package/.medusa/server/src/documents/schemas/index.js +18 -0
  35. package/.medusa/server/src/documents/scripts/verify-documents-file-storage.js +55 -0
  36. package/.medusa/server/src/documents/templates/financial-document.js +142 -0
  37. package/.medusa/server/src/documents/templates/format.js +31 -0
  38. package/.medusa/server/src/documents/templates/html-factory.js +40 -0
  39. package/.medusa/server/src/documents/templates/html-utils.js +13 -0
  40. package/.medusa/server/src/documents/templates/layout.js +97 -0
  41. package/.medusa/server/src/documents/templates/packing-list.js +50 -0
  42. package/.medusa/server/src/documents/types/admin-api.js +3 -0
  43. package/.medusa/server/src/documents/types/document-summary.js +3 -0
  44. package/.medusa/server/src/documents/types/documents.js +3 -0
  45. package/.medusa/server/src/documents/types/html-factory.js +6 -0
  46. package/.medusa/server/src/documents/types/index.js +22 -0
  47. package/.medusa/server/src/documents/types/store-api.js +3 -0
  48. package/.medusa/server/src/documents/utils/document-merchant.js +22 -0
  49. package/.medusa/server/src/documents/utils/html-to-pdf.js +61 -0
  50. package/.medusa/server/src/documents/utils/private-file-storage.js +64 -0
  51. package/.medusa/server/src/documents/utils/resolve-services.js +7 -0
  52. package/.medusa/server/src/email/application/handle-invite-event.js +312 -0
  53. package/.medusa/server/src/email/application/handle-password-reset-event.js +354 -0
  54. package/.medusa/server/src/email/config/index.js +84 -0
  55. package/.medusa/server/src/email/config/notification-module.js +20 -0
  56. package/.medusa/server/src/email/domain/business-keys.js +50 -0
  57. package/.medusa/server/src/email/domain/documents-fact-fingerprint.js +7 -0
  58. package/.medusa/server/src/email/domain/event-schemas.js +36 -0
  59. package/.medusa/server/src/email/domain/failure-classification.js +53 -0
  60. package/.medusa/server/src/email/plugin-features.js +31 -0
  61. package/.medusa/server/src/email/rendering/default-templates.js +91 -0
  62. package/.medusa/server/src/email/rendering/render-email.js +37 -0
  63. package/.medusa/server/src/email/rendering/resolve-shop-configuration.js +48 -0
  64. package/.medusa/server/src/email/types/email-kinds.js +18 -0
  65. package/.medusa/server/src/email/types/index.js +21 -0
  66. package/.medusa/server/src/email/types/shop-configuration.js +3 -0
  67. package/.medusa/server/src/email/types/smtp-configuration.js +3 -0
  68. package/.medusa/server/src/email/types/template-data.js +79 -0
  69. package/.medusa/server/src/files/config/index.js +256 -0
  70. package/.medusa/server/src/files/gateway/index.js +115 -0
  71. package/.medusa/server/src/files/types/index.js +6 -0
  72. package/.medusa/server/src/files/types/public.js +6 -0
  73. package/.medusa/server/src/jobs/document-fact-publication-reconciliation.js +18 -0
  74. package/.medusa/server/src/jobs/document-resolution-reconciliation.js +20 -0
  75. package/.medusa/server/src/jobs/packing-list-reconciliation.js +49 -0
  76. package/.medusa/server/src/jobs/reconcile-email-attempts.js +63 -0
  77. package/.medusa/server/src/jobs/reconcile-pending-email-messages.js +41 -0
  78. package/.medusa/server/src/jobs/retry-email-messages.js +27 -0
  79. package/.medusa/server/src/migration-scripts/dismiss-orphaned-cart-promotion-links.js +26 -0
  80. package/.medusa/server/src/modules/documents/domain/cancellation-snapshot.js +97 -0
  81. package/.medusa/server/src/modules/documents/domain/document-number.js +36 -0
  82. package/.medusa/server/src/modules/documents/domain/document-resolution.js +24 -0
  83. package/.medusa/server/src/modules/documents/domain/issuance-rules.js +37 -0
  84. package/.medusa/server/src/modules/documents/domain/merchant.js +86 -0
  85. package/.medusa/server/src/modules/documents/domain/options.js +40 -0
  86. package/.medusa/server/src/modules/documents/domain/packing-list.js +90 -0
  87. package/.medusa/server/src/modules/documents/domain/snapshot-normalization.js +17 -0
  88. package/.medusa/server/src/modules/documents/domain/tax-breakdown.js +66 -0
  89. package/.medusa/server/src/modules/documents/index.js +15 -0
  90. package/.medusa/server/src/modules/documents/loaders/assert-private-file-storage.js +20 -0
  91. package/.medusa/server/src/modules/documents/migrations/Migration20260827061749.js +75 -0
  92. package/.medusa/server/src/modules/documents/migrations/Migration20260830111207.js +28 -0
  93. package/.medusa/server/src/modules/documents/models/document-artifact.js +25 -0
  94. package/.medusa/server/src/modules/documents/models/document-number-sequence.js +29 -0
  95. package/.medusa/server/src/modules/documents/models/document.js +82 -0
  96. package/.medusa/server/src/modules/documents/models/order-cancellation-resolution.js +51 -0
  97. package/.medusa/server/src/modules/documents/models/packing-list-revision.js +36 -0
  98. package/.medusa/server/src/modules/documents/models/packing-list.js +27 -0
  99. package/.medusa/server/src/modules/documents/models/refund-document-resolution.js +66 -0
  100. package/.medusa/server/src/modules/documents/models/shipment-invoice-assignment.js +51 -0
  101. package/.medusa/server/src/modules/documents/models/shipment-invoice-coordinator.js +44 -0
  102. package/.medusa/server/src/modules/documents/service.js +1701 -0
  103. package/.medusa/server/src/modules/email/domain/attachment.js +25 -0
  104. package/.medusa/server/src/modules/email/domain/message-state.js +69 -0
  105. package/.medusa/server/src/modules/email/index.js +13 -0
  106. package/.medusa/server/src/modules/email/migrations/Migration20260826173422.js +32 -0
  107. package/.medusa/server/src/modules/email/migrations/Migration20260827172945.js +16 -0
  108. package/.medusa/server/src/modules/email/migrations/Migration20260827194804.js +22 -0
  109. package/.medusa/server/src/modules/email/migrations/Migration20260906195205.js +16 -0
  110. package/.medusa/server/src/modules/email/models/email-attempt.js +56 -0
  111. package/.medusa/server/src/modules/email/models/email-message.js +71 -0
  112. package/.medusa/server/src/modules/email/models/email-terms-version.js +37 -0
  113. package/.medusa/server/src/modules/email/service.js +1285 -0
  114. package/.medusa/server/src/providers/s3-cache/cache/atomic-write.js +25 -0
  115. package/.medusa/server/src/providers/s3-cache/cache/cache-manager.js +115 -0
  116. package/.medusa/server/src/providers/s3-cache/cache/keyed-lock.js +28 -0
  117. package/.medusa/server/src/providers/s3-cache/index.js +8 -0
  118. package/.medusa/server/src/providers/s3-cache/object-key.js +53 -0
  119. package/.medusa/server/src/providers/s3-cache/s3-cache-file.js +229 -0
  120. package/.medusa/server/src/providers/s3-cache/s3-object-store.js +86 -0
  121. package/.medusa/server/src/providers/smtp/index.js +8 -0
  122. package/.medusa/server/src/providers/smtp/service.js +236 -0
  123. package/.medusa/server/src/providers/smtp/types.js +11 -0
  124. package/.medusa/server/src/public/config.js +186 -0
  125. package/.medusa/server/src/public/gateway.js +19 -0
  126. package/.medusa/server/src/public/instrumentation.js +56 -0
  127. package/.medusa/server/src/public/shop-config.js +12 -0
  128. package/.medusa/server/src/public/shop-types.js +24 -0
  129. package/.medusa/server/src/shop-config/build-food-shop-config.js +248 -0
  130. package/.medusa/server/src/shop-config/options.js +71 -0
  131. package/.medusa/server/src/subscribers/affiliate-consignment-reminder-due.js +26 -0
  132. package/.medusa/server/src/subscribers/documents-order-canceled.js +24 -0
  133. package/.medusa/server/src/subscribers/documents-order-cancellation-ready.js +26 -0
  134. package/.medusa/server/src/subscribers/documents-refund-ready.js +24 -0
  135. package/.medusa/server/src/subscribers/documents-shipment-created.js +36 -0
  136. package/.medusa/server/src/subscribers/documents-shipment-invoice-assignment-decided.js +26 -0
  137. package/.medusa/server/src/subscribers/email-order-canceled.js +28 -0
  138. package/.medusa/server/src/subscribers/email-shipment-created.js +32 -0
  139. package/.medusa/server/src/subscribers/order-placed.js +27 -0
  140. package/.medusa/server/src/subscribers/packing-list-allocation-revised.js +32 -0
  141. package/.medusa/server/src/subscribers/packing-list-fulfillment-canceled.js +54 -0
  142. package/.medusa/server/src/subscribers/packing-list-fulfillment-created.js +31 -0
  143. package/.medusa/server/src/subscribers/password-reset.js +23 -0
  144. package/.medusa/server/src/subscribers/payment-refunded.js +38 -0
  145. package/.medusa/server/src/subscribers/return-received.js +27 -0
  146. package/.medusa/server/src/subscribers/return-requested.js +27 -0
  147. package/.medusa/server/src/subscribers/user-invite.js +23 -0
  148. package/.medusa/server/src/utils/cart-promotion-links.js +101 -0
  149. package/.medusa/server/src/workflows/documents/issue-cancellation-after-refund.js +246 -0
  150. package/.medusa/server/src/workflows/documents/issue-document.js +163 -0
  151. package/.medusa/server/src/workflows/documents/issue-invoice-after-shipment.js +521 -0
  152. package/.medusa/server/src/workflows/documents/issue-packing-list.js +384 -0
  153. package/.medusa/server/src/workflows/documents/publish-document-facts.js +53 -0
  154. package/.medusa/server/src/workflows/documents/reconcile-document-resolutions.js +48 -0
  155. package/.medusa/server/src/workflows/documents/reconcile-order-cancellation.js +92 -0
  156. package/.medusa/server/src/workflows/documents/regenerate-issued-document.js +61 -0
  157. package/.medusa/server/src/workflows/email/dispatch-email-message.js +299 -0
  158. package/.medusa/server/src/workflows/email/documents-required-facts.js +30 -0
  159. package/.medusa/server/src/workflows/email/prepare-affiliate-reminder-email.js +58 -0
  160. package/.medusa/server/src/workflows/email/prepare-order-canceled-email.js +64 -0
  161. package/.medusa/server/src/workflows/email/prepare-order-received-email.js +56 -0
  162. package/.medusa/server/src/workflows/email/prepare-refund-email.js +47 -0
  163. package/.medusa/server/src/workflows/email/prepare-return-email.js +75 -0
  164. package/.medusa/server/src/workflows/email/prepare-shipment-email.js +82 -0
  165. package/.medusa/server/src/workflows/email/retry-email-messages.js +31 -0
  166. package/.medusa/server/src/workflows/hooks/dismiss-deleted-promotion-cart-links.js +23 -0
  167. package/README.md +1619 -7
  168. package/dist/documents/config/index.d.ts +11 -0
  169. package/dist/documents/config/index.js +17 -0
  170. package/dist/documents/templates/financial-document.d.ts +3 -0
  171. package/dist/documents/templates/financial-document.js +141 -0
  172. package/dist/documents/templates/format.d.ts +16 -0
  173. package/dist/documents/templates/format.js +30 -0
  174. package/dist/documents/templates/html-factory.d.ts +11 -0
  175. package/dist/documents/templates/html-factory.js +39 -0
  176. package/dist/documents/templates/html-utils.d.ts +2 -0
  177. package/dist/documents/templates/html-utils.js +12 -0
  178. package/dist/documents/templates/layout.d.ts +17 -0
  179. package/dist/documents/templates/layout.js +96 -0
  180. package/dist/documents/templates/packing-list.d.ts +3 -0
  181. package/dist/documents/templates/packing-list.js +49 -0
  182. package/dist/documents/types/admin-api.d.ts +1 -0
  183. package/dist/documents/types/admin-api.js +2 -0
  184. package/dist/documents/types/document-summary.d.ts +1 -0
  185. package/dist/documents/types/document-summary.js +2 -0
  186. package/dist/documents/types/documents.d.ts +174 -0
  187. package/dist/documents/types/documents.js +2 -0
  188. package/dist/documents/types/html-factory.d.ts +7 -0
  189. package/dist/documents/types/html-factory.js +5 -0
  190. package/dist/documents/types/index.d.ts +5 -0
  191. package/dist/documents/types/index.js +21 -0
  192. package/dist/documents/types/store-api.d.ts +1 -0
  193. package/dist/documents/types/store-api.js +2 -0
  194. package/dist/email/config/index.d.ts +17 -0
  195. package/dist/email/config/index.js +83 -0
  196. package/dist/email/config/notification-module.d.ts +22 -0
  197. package/dist/email/config/notification-module.js +19 -0
  198. package/dist/email/types/email-kinds.d.ts +15 -0
  199. package/dist/email/types/email-kinds.js +17 -0
  200. package/dist/email/types/index.d.ts +4 -0
  201. package/dist/email/types/index.js +20 -0
  202. package/dist/email/types/shop-configuration.d.ts +43 -0
  203. package/dist/email/types/shop-configuration.js +2 -0
  204. package/dist/email/types/smtp-configuration.d.ts +9 -0
  205. package/dist/email/types/smtp-configuration.js +2 -0
  206. package/dist/email/types/template-data.d.ts +100 -0
  207. package/dist/email/types/template-data.js +78 -0
  208. package/dist/files/config/index.d.ts +32 -0
  209. package/dist/files/config/index.js +255 -0
  210. package/dist/files/gateway/index.d.ts +30 -0
  211. package/dist/files/gateway/index.js +114 -0
  212. package/dist/files/types/index.d.ts +2 -0
  213. package/dist/files/types/index.js +5 -0
  214. package/dist/files/types/public.d.ts +90 -0
  215. package/dist/files/types/public.js +5 -0
  216. package/dist/modules/documents/domain/merchant.d.ts +22 -0
  217. package/dist/modules/documents/domain/merchant.js +85 -0
  218. package/dist/modules/documents/domain/options.d.ts +34 -0
  219. package/dist/modules/documents/domain/options.js +39 -0
  220. package/dist/public/config.d.ts +59 -0
  221. package/dist/public/config.js +185 -0
  222. package/dist/public/gateway.d.ts +2 -0
  223. package/dist/public/gateway.js +18 -0
  224. package/dist/public/instrumentation.d.ts +12 -0
  225. package/dist/public/instrumentation.js +55 -0
  226. package/dist/public/shop-config.d.ts +8 -0
  227. package/dist/public/shop-config.js +11 -0
  228. package/dist/public/shop-types.d.ts +7 -0
  229. package/dist/public/shop-types.js +23 -0
  230. package/dist/public/types.d.ts +17 -1
  231. package/dist/shop-config/build-food-shop-config.d.ts +44 -0
  232. package/dist/shop-config/build-food-shop-config.js +247 -0
  233. package/dist/shop-config/options.d.ts +41 -0
  234. package/dist/shop-config/options.js +70 -0
  235. package/package.json +48 -5
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.emailPluginFeatures = void 0;
4
+ const public_1 = require("../public");
5
+ exports.emailPluginFeatures = (0, public_1.definePluginFeatures)({
6
+ plugin_key: "email",
7
+ label: "E-Mail",
8
+ description: "Transaktionale E-Mails und das E-Mail-Protokoll im Admin. Aus: Für neue Ereignisse wird keine Mail erzeugt (Ereignisse werden später nicht nachgeholt), das E-Mail-Protokoll und die AGB-Versionen im Admin sind nicht erreichbar und die Versand-, Wiederholungs- und Abgleichsjobs laufen nicht; bereits eingereihte Mails bleiben liegen, bis das Plugin wieder eingeschaltet wird. Checkout und Bestellungen laufen unverändert weiter.",
9
+ features: [
10
+ {
11
+ key: "order_mails",
12
+ label: "Bestell-Mails",
13
+ description: "Bestelleingang, Versand, Stornierung, Retoure und Erstattung (inklusive der Mails zu Belegen aus dem Dokumente-Plugin). Sind im Dokumente-Plugin die Rechnungen & Stornos aus, gehen Versand- und Storno-Mails ohne Beleg hinaus; Erstattungs-Mails entstehen nur aus einem Erstattungsbeleg und werden dann nicht verschickt. Aus: Für diese Ereignisse wird keine Mail erzeugt und später auch nicht nachgeholt.",
14
+ default_enabled: true,
15
+ },
16
+ {
17
+ key: "account_mails",
18
+ label: "Konto-Mails",
19
+ description: "Passwort-Zurücksetzen für Kunden und Einladungen neuer Admin-Benutzer. Aus: Für diese Ereignisse wird keine Mail erzeugt.",
20
+ default_enabled: true,
21
+ },
22
+ {
23
+ key: "affiliate_reminders",
24
+ label: "Affiliate-Erinnerungen",
25
+ description: "Erinnerungsmails an Affiliates zur fälligen Konsignationsmeldung. Aus: Für diese Ereignisse wird keine Mail erzeugt.",
26
+ default_enabled: true,
27
+ },
28
+ ],
29
+ admin_page: "/settings/hartl-services/email",
30
+ });
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWZlYXR1cmVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2VtYWlsL3BsdWdpbi1mZWF0dXJlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxzQ0FBaUQ7QUFFcEMsUUFBQSxtQkFBbUIsR0FBRyxJQUFBLDZCQUFvQixFQUFDO0lBQ3RELFVBQVUsRUFBRSxPQUFPO0lBQ25CLEtBQUssRUFBRSxRQUFRO0lBQ2YsV0FBVyxFQUNULDZhQUE2YTtJQUMvYSxRQUFRLEVBQUU7UUFDUjtZQUNFLEdBQUcsRUFBRSxhQUFhO1lBQ2xCLEtBQUssRUFBRSxlQUFlO1lBQ3RCLFdBQVcsRUFDVCxvWkFBb1o7WUFDdFosZUFBZSxFQUFFLElBQUk7U0FDdEI7UUFDRDtZQUNFLEdBQUcsRUFBRSxlQUFlO1lBQ3BCLEtBQUssRUFBRSxhQUFhO1lBQ3BCLFdBQVcsRUFDVCwySEFBMkg7WUFDN0gsZUFBZSxFQUFFLElBQUk7U0FDdEI7UUFDRDtZQUNFLEdBQUcsRUFBRSxxQkFBcUI7WUFDMUIsS0FBSyxFQUFFLHdCQUF3QjtZQUMvQixXQUFXLEVBQ1Qsc0hBQXNIO1lBQ3hILGVBQWUsRUFBRSxJQUFJO1NBQ3RCO0tBQ0Y7SUFDRCxVQUFVLEVBQUUsZ0NBQWdDO0NBQzdDLENBQUMsQ0FBQyJ9
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createDefaultEmailRenderers = exports.createDefaultEmailLayout = void 0;
4
+ const escapeHtml = (value) => value
5
+ .replaceAll("&", "&")
6
+ .replaceAll("<", "&lt;")
7
+ .replaceAll(">", "&gt;")
8
+ .replaceAll('"', "&quot;")
9
+ .replaceAll("'", "&#039;");
10
+ /** Neutral default layout; the shop appears only as `displayName`. */
11
+ const createDefaultEmailLayout = (displayName) => {
12
+ const shop = escapeHtml(displayName);
13
+ return ({ bodyHtml, preheader, subject }) => `<!doctype html>
14
+ <html lang="de">
15
+ <head>
16
+ <meta charset="utf-8" />
17
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
18
+ <title>${escapeHtml(subject)}</title>
19
+ </head>
20
+ <body style="background: #f2f2f5; color: #24242b; font-family: Arial, sans-serif; margin: 0; padding: 24px 12px;">
21
+ <div style="display: none; max-height: 0; overflow: hidden; opacity: 0;">${escapeHtml(preheader)}</div>
22
+ <main style="background: #ffffff; margin: 0 auto; max-width: 600px; padding: 32px;">
23
+ <header>
24
+ <h1 style="color: #1f1f2e; margin: 0;">${shop}</h1>
25
+ <div style="background: #6b5bff; height: 2px; margin: 16px 0 24px;"></div>
26
+ </header>
27
+ ${bodyHtml}
28
+ <footer style="border-top: 1px solid #6b5bff; color: #6b6b74; font-size: 12px; margin-top: 28px; padding-top: 16px;">${shop}</footer>
29
+ </main>
30
+ </body>
31
+ </html>`;
32
+ };
33
+ exports.createDefaultEmailLayout = createDefaultEmailLayout;
34
+ /** Neutral German default renderers, one per accepted email kind. */
35
+ const createDefaultEmailRenderers = ({ affiliatePortalUrl, displayName, }) => {
36
+ const shop = escapeHtml(displayName);
37
+ return {
38
+ "order.received": ({ order_id }) => ({
39
+ bodyHtml: `<p>Vielen Dank für deine Bestellung <strong>${escapeHtml(order_id)}</strong>. Wir haben sie erhalten und bearbeiten sie jetzt.</p>`,
40
+ subject: "Wir haben deine Bestellung erhalten",
41
+ text: `Vielen Dank für deine Bestellung ${order_id}. Wir haben sie erhalten und bearbeiten sie jetzt.`,
42
+ }),
43
+ "order.received.admin": ({ order_id }) => ({
44
+ bodyHtml: `<p>Die neue Bestellung <strong>${escapeHtml(order_id)}</strong> ist eingegangen und kann jetzt bearbeitet werden.</p>`,
45
+ subject: "Neue Bestellung eingegangen",
46
+ text: `Die neue Bestellung ${order_id} ist eingegangen und kann jetzt bearbeitet werden.`,
47
+ }),
48
+ "order.shipped": ({ order_id, fulfillment_id }) => ({
49
+ bodyHtml: `<p>Deine Bestellung <strong>${escapeHtml(order_id)}</strong> ist unterwegs.</p><p>Versandreferenz: ${escapeHtml(fulfillment_id)}</p>`,
50
+ subject: "Deine Bestellung ist unterwegs",
51
+ text: `Deine Bestellung ${order_id} ist unterwegs. Versandreferenz: ${fulfillment_id}.`,
52
+ }),
53
+ "order.canceled": ({ order_id }) => ({
54
+ bodyHtml: `<p>Deine Bestellung <strong>${escapeHtml(order_id)}</strong> wurde storniert.</p>`,
55
+ subject: "Deine Bestellung wurde storniert",
56
+ text: `Deine Bestellung ${order_id} wurde storniert.`,
57
+ }),
58
+ "order.return_requested": ({ order_id, return_id }) => ({
59
+ bodyHtml: `<p>Wir haben deine Rücksendeanfrage <strong>${escapeHtml(return_id)}</strong> zur Bestellung ${escapeHtml(order_id)} erhalten.</p>`,
60
+ subject: "Wir haben deine Rücksendeanfrage erhalten",
61
+ text: `Wir haben deine Rücksendeanfrage ${return_id} zur Bestellung ${order_id} erhalten.`,
62
+ }),
63
+ "order.return_received": ({ order_id, return_id }) => ({
64
+ bodyHtml: `<p>Deine Rücksendung <strong>${escapeHtml(return_id)}</strong> zur Bestellung ${escapeHtml(order_id)} ist bei uns eingetroffen.</p>`,
65
+ subject: "Deine Rücksendung ist eingetroffen",
66
+ text: `Deine Rücksendung ${return_id} zur Bestellung ${order_id} ist bei uns eingetroffen.`,
67
+ }),
68
+ "order.refunded": ({ order_id, refund_id }) => ({
69
+ bodyHtml: `<p>Die Erstattung <strong>${escapeHtml(refund_id)}</strong> zur Bestellung ${escapeHtml(order_id)} wurde veranlasst.</p>`,
70
+ subject: "Deine Erstattung wurde veranlasst",
71
+ text: `Die Erstattung ${refund_id} zur Bestellung ${order_id} wurde veranlasst.`,
72
+ }),
73
+ "auth.password_reset": ({ reset_url }) => ({
74
+ bodyHtml: `<p>Du hast ein neues Passwort angefordert.</p><p><a href="${escapeHtml(reset_url)}">Passwort sicher zurücksetzen</a></p>`,
75
+ subject: `Setze dein ${displayName} Passwort zurück`,
76
+ text: `Du hast ein neues Passwort angefordert. Setze es hier zurück: ${reset_url}`,
77
+ }),
78
+ "affiliate.consignment_report_due": ({ affiliate_display_name, due_date, period_start, }) => ({
79
+ bodyHtml: `<p>Hallo ${escapeHtml(affiliate_display_name)}, bitte reiche deine Monatsmeldung für ${escapeHtml(period_start)} bis ${escapeHtml(due_date)} ein.</p><p><a href="${escapeHtml(affiliatePortalUrl)}">Zum Partnerbereich</a></p>`,
80
+ subject: "Erinnerung: Monatsmeldung einreichen",
81
+ text: `Hallo ${affiliate_display_name}, bitte reiche deine Monatsmeldung für ${period_start} bis ${due_date} ein: ${affiliatePortalUrl}`,
82
+ }),
83
+ "user.invite": ({ invite_url }) => ({
84
+ bodyHtml: `<p>Du wurdest eingeladen, dem ${shop}-Adminteam beizutreten.</p><p><a href="${escapeHtml(invite_url)}">Einladung annehmen</a></p>`,
85
+ subject: `Du wurdest zu ${displayName} eingeladen`,
86
+ text: `Du wurdest eingeladen, dem ${displayName}-Adminteam beizutreten. Einladung annehmen: ${invite_url}`,
87
+ }),
88
+ };
89
+ };
90
+ exports.createDefaultEmailRenderers = createDefaultEmailRenderers;
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC10ZW1wbGF0ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZW1haWwvcmVuZGVyaW5nL2RlZmF1bHQtdGVtcGxhdGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQU1BLE1BQU0sVUFBVSxHQUFHLENBQUMsS0FBYSxFQUFVLEVBQUUsQ0FDM0MsS0FBSztLQUNGLFVBQVUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDO0tBQ3hCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDO0tBQ3ZCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDO0tBQ3ZCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDO0tBQ3pCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFFL0Isc0VBQXNFO0FBQy9ELE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxXQUFtQixFQUFlLEVBQUU7SUFDM0UsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRXJDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDOzs7OzthQUtsQyxVQUFVLENBQUMsT0FBTyxDQUFDOzs7K0VBRytDLFVBQVUsQ0FBQyxTQUFTLENBQUM7OztpREFHbkQsSUFBSTs7O1FBRzdDLFFBQVE7NkhBQzZHLElBQUk7OztRQUd6SCxDQUFDO0FBQ1QsQ0FBQyxDQUFDO0FBdEJXLFFBQUEsd0JBQXdCLDRCQXNCbkM7QUFFRixxRUFBcUU7QUFDOUQsTUFBTSwyQkFBMkIsR0FBRyxDQUFDLEVBQzFDLGtCQUFrQixFQUNsQixXQUFXLEdBSVosRUFBb0IsRUFBRTtJQUNyQixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7SUFFckMsT0FBTztRQUNMLGdCQUFnQixFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMs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
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderEmail = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const types_1 = require("../types");
6
+ const invalidRenderInput = () => {
7
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Invalid email render input.");
8
+ };
9
+ const requireContent = (value) => {
10
+ if (typeof value !== "string" || !value.trim()) {
11
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Email renderer returned empty content.");
12
+ }
13
+ return value;
14
+ };
15
+ const renderEmail = (configuration, input) => {
16
+ const kindResult = types_1.EmailKindSchema.safeParse(input.kind);
17
+ if (!kindResult.success) {
18
+ return invalidRenderInput();
19
+ }
20
+ const kind = kindResult.data;
21
+ const dataResult = types_1.EmailRenderDataSchemas[kind].safeParse(input.data);
22
+ if (!dataResult.success) {
23
+ return invalidRenderInput();
24
+ }
25
+ const renderer = configuration.renderers[kind];
26
+ if (typeof renderer !== "function") {
27
+ return invalidRenderInput();
28
+ }
29
+ const rendered = renderer(dataResult.data);
30
+ const bodyHtml = requireContent(rendered?.bodyHtml);
31
+ const subject = requireContent(rendered?.subject);
32
+ const text = requireContent(rendered?.text);
33
+ const html = requireContent(configuration.layout({ bodyHtml, preheader: text, subject }));
34
+ return { bodyHtml, html, subject, text };
35
+ };
36
+ exports.renderEmail = renderEmail;
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLWVtYWlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2VtYWlsL3JlbmRlcmluZy9yZW5kZXItZW1haWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscURBQXdEO0FBRXhELG9DQU1rQjtBQWdCbEIsTUFBTSxrQkFBa0IsR0FBRyxHQUFVLEVBQUU7SUFDckMsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsNkJBQTZCLENBQzlCLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWMsRUFBVSxFQUFFO0lBQ2hELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7UUFDL0MsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUNsQyx3Q0FBd0MsQ0FDekMsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMsQ0FBQztBQUVLLE1BQU0sV0FBVyxHQUFHLENBQ3pCLGFBQTZDLEVBQzdDLEtBQXVCLEVBQ1IsRUFBRTtJQUNqQixNQUFNLFVBQVUsR0FBRyx1QkFBZSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN4QixPQUFPLGtCQUFrQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUNELE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7SUFDN0IsTUFBTSxVQUFVLEdBQUcsOEJBQXNCLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0RSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3hCLE9BQU8sa0JBQWtCLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBQ0QsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBRWpDLENBQUM7SUFDYixJQUFJLE9BQU8sUUFBUSxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ25DLE9BQU8sa0JBQWtCLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBQ0QsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQTRCLENBQUM7SUFDdEUsTUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNwRCxNQUFNLE9BQU8sR0FBRyxjQUFjLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2xELE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDNUMsTUFBTSxJQUFJLEdBQUcsY0FBYyxDQUN6QixhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FDN0QsQ0FBQztJQUVGLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUMzQyxDQUFDLENBQUM7QUE1QlcsUUFBQSxXQUFXLGVBNEJ0QiJ9
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveShopEmailConfiguration = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const types_1 = require("../types");
6
+ const default_templates_1 = require("./default-templates");
7
+ const invalidConfiguration = (message) => {
8
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Invalid email shop configuration: ${message}`);
9
+ };
10
+ /**
11
+ * Validates the shop configuration and merges the default layout and
12
+ * renderers into it. Runs once when the Email module boots, so a bad
13
+ * configuration fails at startup and not at the first send.
14
+ */
15
+ const resolveShopEmailConfiguration = (shop) => {
16
+ if (typeof shop?.displayName !== "string" || !shop.displayName.trim()) {
17
+ invalidConfiguration("displayName must be a non-empty string.");
18
+ }
19
+ if (shop.layout !== undefined && typeof shop.layout !== "function") {
20
+ invalidConfiguration("layout must be a function.");
21
+ }
22
+ if (shop.renderers !== undefined &&
23
+ (typeof shop.renderers !== "object" || shop.renderers === null)) {
24
+ invalidConfiguration("renderers must be an object.");
25
+ }
26
+ const overrides = { ...shop.renderers };
27
+ for (const kind of Object.keys(overrides)) {
28
+ if (!types_1.EMAIL_KINDS.includes(kind)) {
29
+ invalidConfiguration(`renderers contains the unknown kind "${kind}".`);
30
+ }
31
+ if (overrides[kind] === undefined) {
32
+ delete overrides[kind];
33
+ }
34
+ else if (typeof overrides[kind] !== "function") {
35
+ invalidConfiguration(`renderers["${kind}"] must be a function.`);
36
+ }
37
+ }
38
+ return {
39
+ ...shop,
40
+ layout: shop.layout ?? (0, default_templates_1.createDefaultEmailLayout)(shop.displayName),
41
+ renderers: {
42
+ ...(0, default_templates_1.createDefaultEmailRenderers)(shop),
43
+ ...overrides,
44
+ },
45
+ };
46
+ };
47
+ exports.resolveShopEmailConfiguration = resolveShopEmailConfiguration;
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS1zaG9wLWNvbmZpZ3VyYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZW1haWwvcmVuZGVyaW5nL3Jlc29sdmUtc2hvcC1jb25maWd1cmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFEQUF3RDtBQUV4RCxvQ0FJa0I7QUFDbEIsMkRBRzZCO0FBRTdCLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxPQUFlLEVBQVMsRUFBRTtJQUN0RCxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixxQ0FBcUMsT0FBTyxFQUFFLENBQy9DLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRjs7OztHQUlHO0FBQ0ksTUFBTSw2QkFBNkIsR0FBRyxDQUMzQyxJQUE0QixFQUNJLEVBQUU7SUFDbEMsSUFBSSxPQUFPLElBQUksRUFBRSxXQUFXLEtBQUssUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQ3RFLG9CQUFvQixDQUFDLHlDQUF5QyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksT0FBTyxJQUFJLENBQUMsTUFBTSxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ25FLG9CQUFvQixDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDckQsQ0FBQztJQUNELElBQ0UsSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTO1FBQzVCLENBQUMsT0FBTyxJQUFJLENBQUMsU0FBUyxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksQ0FBQyxFQUMvRCxDQUFDO1FBQ0Qsb0JBQW9CLENBQUMsOEJBQThCLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsTUFBTSxTQUFTLEdBQTRCLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDakUsS0FBSyxNQUFNLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDMUMsSUFBSSxDQUFFLG1CQUFpQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3ZELG9CQUFvQixDQUFDLHdDQUF3QyxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQ3pFLENBQUM7UUFDRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNsQyxPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixDQUFDO2FBQU0sSUFBSSxPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNqRCxvQkFBb0IsQ0FBQyxjQUFjLElBQUksd0JBQXdCLENBQUMsQ0FBQztRQUNuRSxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU87UUFDTCxHQUFHLElBQUk7UUFDUCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFBLDRDQUF3QixFQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDakUsU0FBUyxFQUFFO1lBQ1QsR0FBRyxJQUFBLCtDQUEyQixFQUFDLElBQUksQ0FBQztZQUNwQyxHQUFHLFNBQVM7U0FDYjtLQUNGLENBQUM7QUFDSixDQUFDLENBQUM7QUFwQ1csUUFBQSw2QkFBNkIsaUNBb0N4QyJ9
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EmailKindSchema = exports.EMAIL_KINDS = void 0;
4
+ const zod_1 = require("@medusajs/framework/zod");
5
+ exports.EMAIL_KINDS = [
6
+ "order.received",
7
+ "order.received.admin",
8
+ "order.shipped",
9
+ "order.canceled",
10
+ "order.return_requested",
11
+ "order.return_received",
12
+ "order.refunded",
13
+ "auth.password_reset",
14
+ "affiliate.consignment_report_due",
15
+ "user.invite",
16
+ ];
17
+ exports.EmailKindSchema = zod_1.z.enum(exports.EMAIL_KINDS);
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1haWwta2luZHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZW1haWwvdHlwZXMvZW1haWwta2luZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaURBQTRDO0FBRS9CLFFBQUEsV0FBVyxHQUFHO0lBQ3pCLGdCQUFnQjtJQUNoQixzQkFBc0I7SUFDdEIsZUFBZTtJQUNmLGdCQUFnQjtJQUNoQix3QkFBd0I7SUFDeEIsdUJBQXVCO0lBQ3ZCLGdCQUFnQjtJQUNoQixxQkFBcUI7SUFDckIsa0NBQWtDO0lBQ2xDLGFBQWE7Q0FDTCxDQUFDO0FBRUUsUUFBQSxlQUFlLEdBQUcsT0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBVyxDQUFDLENBQUMifQ==
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./email-kinds"), exports);
18
+ __exportStar(require("./shop-configuration"), exports);
19
+ __exportStar(require("./smtp-configuration"), exports);
20
+ __exportStar(require("./template-data"), exports);
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZW1haWwvdHlwZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGdEQUE4QjtBQUM5Qix1REFBcUM7QUFDckMsdURBQXFDO0FBQ3JDLGtEQUFnQyJ9
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hvcC1jb25maWd1cmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2VtYWlsL3R5cGVzL3Nob3AtY29uZmlndXJhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic210cC1jb25maWd1cmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2VtYWlsL3R5cGVzL3NtdHAtY29uZmlndXJhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EmailRenderDataSchemas = exports.EmailPersistedDataSchemas = void 0;
4
+ const zod_1 = require("@medusajs/framework/zod");
5
+ const affiliate_1 = require("@hartl-services/medusa-food-supplements-contracts/schemas/affiliate");
6
+ const NonEmptyStringSchema = zod_1.z.string().trim().min(1);
7
+ const NullableLocaleSchema = NonEmptyStringSchema.max(35).nullable();
8
+ const DocumentsFactFingerprintSchema = zod_1.z
9
+ .string()
10
+ .regex(/^[a-f0-9]{64}$/)
11
+ .optional();
12
+ exports.EmailPersistedDataSchemas = {
13
+ "order.received": zod_1.z
14
+ .object({
15
+ order_id: NonEmptyStringSchema,
16
+ })
17
+ .strict(),
18
+ "order.received.admin": zod_1.z
19
+ .object({
20
+ order_id: NonEmptyStringSchema,
21
+ })
22
+ .strict(),
23
+ "order.shipped": zod_1.z
24
+ .object({
25
+ order_id: NonEmptyStringSchema,
26
+ fulfillment_id: NonEmptyStringSchema,
27
+ documents_fact_fingerprint: DocumentsFactFingerprintSchema,
28
+ })
29
+ .strict(),
30
+ "order.canceled": zod_1.z
31
+ .object({
32
+ order_id: NonEmptyStringSchema,
33
+ documents_fact_fingerprint: DocumentsFactFingerprintSchema,
34
+ })
35
+ .strict(),
36
+ "order.return_requested": zod_1.z
37
+ .object({
38
+ order_id: NonEmptyStringSchema,
39
+ return_id: NonEmptyStringSchema,
40
+ })
41
+ .strict(),
42
+ "order.return_received": zod_1.z
43
+ .object({
44
+ order_id: NonEmptyStringSchema,
45
+ return_id: NonEmptyStringSchema,
46
+ })
47
+ .strict(),
48
+ "order.refunded": zod_1.z
49
+ .object({
50
+ order_id: NonEmptyStringSchema,
51
+ refund_id: NonEmptyStringSchema,
52
+ documents_fact_fingerprint: DocumentsFactFingerprintSchema,
53
+ })
54
+ .strict(),
55
+ "auth.password_reset": zod_1.z
56
+ .object({
57
+ locale: NullableLocaleSchema,
58
+ })
59
+ .strict(),
60
+ "affiliate.consignment_report_due": zod_1.z
61
+ .object({
62
+ affiliate_display_name: NonEmptyStringSchema,
63
+ period_start: affiliate_1.CalendarMonthSchema,
64
+ due_date: affiliate_1.CalendarDateSchema,
65
+ locale: NullableLocaleSchema,
66
+ })
67
+ .strict(),
68
+ "user.invite": zod_1.z.object({}).strict(),
69
+ };
70
+ exports.EmailRenderDataSchemas = {
71
+ ...exports.EmailPersistedDataSchemas,
72
+ "auth.password_reset": exports.EmailPersistedDataSchemas["auth.password_reset"].extend({
73
+ reset_url: zod_1.z.string().url(),
74
+ }),
75
+ "user.invite": exports.EmailPersistedDataSchemas["user.invite"].extend({
76
+ invite_url: zod_1.z.string().url(),
77
+ }),
78
+ };
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUtZGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9lbWFpbC90eXBlcy90ZW1wbGF0ZS1kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGlEQUE0QztBQUM1QyxtR0FHNkU7QUFJN0UsTUFBTSxvQkFBb0IsR0FBRyxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RELE1BQU0sb0JBQW9CLEdBQUcsb0JBQW9CLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ3JFLE1BQU0sOEJBQThCLEdBQUcsT0FBQztLQUNyQyxNQUFNLEVBQUU7S0FDUixLQUFLLENBQUMsZ0JBQWdCLENBQUM7S0FDdkIsUUFBUSxFQUFFLENBQUM7QUFFRCxRQUFBLHlCQUF5QixHQUFHO0lBQ3ZDLGdCQUFnQixFQUFFLE9BQUM7U0FDaEIsTUFBTSxDQUFDO1FBQ04sUUFBUSxFQUFFLG9CQUFvQjtLQUMvQixDQUFDO1NBQ0QsTUFBTSxFQUFFO0lBQ1gsc0JBQXNCLEVBQUUsT0FBQztTQUN0QixNQUFNLENBQUM7UUFDTixRQUFRLEVBQUUsb0JBQW9CO0tBQy9CLENBQUM7U0FDRCxNQUFNLEVBQUU7SUFDWCxlQUFlLEVBQUUsT0FBQztTQUNmLE1BQU0sQ0FBQztRQUNOLFFBQVEsRUFBRSxvQkFBb0I7UUFDOUIsY0FBYyxFQUFFLG9CQUFvQjtRQUNwQywwQkFBMEIsRUFBRSw4QkFBOEI7S0FDM0QsQ0FBQztTQUNELE1BQU0sRUFBRTtJQUNYLGdCQUFnQixFQUFFLE9BQUM7U0FDaEIsTUFBTSxDQUFDO1FBQ04sUUFBUSxFQUFFLG9CQUFvQjtRQUM5QiwwQkFBMEIsRUFBRSw4QkFBOEI7S0FDM0QsQ0FBQztTQUNELE1BQU0sRUFBRTtJQUNYLHdCQUF3QixFQUFFLE9BQUM7U0FDeEIsTUFBTSxDQUFDO1FBQ04sUUFBUSxFQUFFLG9CQUFvQjtRQUM5QixTQUFTLEVBQUUsb0JBQW9CO0tBQ2hDLENBQUM7U0FDRCxNQUFNLEVBQUU7SUFDWCx1QkFBdUIsRUFBRSxPQUFDO1NBQ3ZCLE1BQU0sQ0FBQztRQUNOLFFBQVEsRUFBRSxvQkFBb0I7UUFDOUIsU0FBUyxFQUFFLG9CQUFvQjtLQUNoQyxDQUFDO1NBQ0QsTUFBTSxFQUFFO0lBQ1gsZ0JBQWdCLEVBQUUsT0FBQztTQUNoQixNQUFNLENBQUM7UUFDTixRQUFRLEVBQUUsb0JBQW9CO1FBQzlCLFNBQVMsRUFBRSxvQkFBb0I7UUFDL0IsMEJBQTBCLEVBQUUsOEJBQThCO0tBQzNELENBQUM7U0FDRCxNQUFNLEVBQUU7SUFDWCxxQkFBcUIsRUFBRSxPQUFDO1NBQ3JCLE1BQU0sQ0FBQztRQUNOLE1BQU0sRUFBRSxvQkFBb0I7S0FDN0IsQ0FBQztTQUNELE1BQU0sRUFBRTtJQUNYLGtDQUFrQyxFQUFFLE9BQUM7U0FDbEMsTUFBTSxDQUFDO1FBQ04sc0JBQXNCLEVBQUUsb0JBQW9CO1FBQzVDLFlBQVksRUFBRSwrQkFBbUI7UUFDakMsUUFBUSxFQUFFLDhCQUFrQjtRQUM1QixNQUFNLEVBQUUsb0JBQW9CO0tBQzdCLENBQUM7U0FDRCxNQUFNLEVBQUU7SUFDWCxhQUFhLEVBQUUsT0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUU7Q0FDYyxDQUFDO0FBRXhDLFFBQUEsc0JBQXNCLEdBQUc7SUFDcEMsR0FBRyxpQ0FBeUI7SUFDNUIscUJBQXFCLEVBQUUsaUNBQXlCLENBQzlDLHFCQUFxQixDQUN0QixDQUFDLE1BQU0sQ0FBQztRQUNQLFNBQVMsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFO0tBQzVCLENBQUM7SUFDRixhQUFhLEVBQUUsaUNBQXlCLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQzdELFVBQVUsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFO0tBQzdCLENBQUM7Q0FDZ0QsQ0FBQyJ9
@@ -0,0 +1,256 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveExpirationStrategy = exports.resolveS3Credentials = exports.S3_BUILD_PLACEHOLDERS = exports.createS3CacheStorageConfig = exports.createS3CacheFileModuleConfig = exports.validateS3CacheProviderOptions = void 0;
4
+ const PACKAGE_NAME = "medusa-s3-cache-storage";
5
+ const DEFAULT_CACHE = {
6
+ cleanupIntervalMs: 900_000,
7
+ dir: "./.medusa-s3-cache",
8
+ expirationStrategy: "absolute",
9
+ ttlMs: 3_600_000,
10
+ };
11
+ const DEFAULT_PRIVATE_DOWNLOAD_DURATION_SECONDS = 3_600;
12
+ const invalid = (message) => {
13
+ throw new TypeError(`${PACKAGE_NAME}: ${message}`);
14
+ };
15
+ const requireNonBlankString = (value, field) => {
16
+ if (typeof value === "string") {
17
+ const trimmed = value.trim();
18
+ if (trimmed) {
19
+ return trimmed;
20
+ }
21
+ }
22
+ return invalid(`${field} must be a non-blank string`);
23
+ };
24
+ const validateHttpUrl = (value, field) => {
25
+ const url = requireNonBlankString(value, field);
26
+ try {
27
+ const parsed = new URL(url);
28
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
29
+ invalid(`${field} must be an HTTP(S) URL`);
30
+ }
31
+ if (parsed.username || parsed.password || parsed.search || parsed.hash) {
32
+ invalid(`${field} must not include credentials, a query, or a fragment`);
33
+ }
34
+ return parsed.toString().replace(/\/$/u, "");
35
+ }
36
+ catch (error) {
37
+ if (error instanceof TypeError && error.message.startsWith(PACKAGE_NAME)) {
38
+ throw error;
39
+ }
40
+ return invalid(`${field} must be an HTTP(S) URL`);
41
+ }
42
+ };
43
+ const validateSafePrefix = (value, field) => {
44
+ if (value === undefined) {
45
+ return "";
46
+ }
47
+ const prefix = requireNonBlankString(value, field).replaceAll("\\", "/");
48
+ const segments = prefix.split("/");
49
+ if (segments.some((segment) => !segment ||
50
+ segment === "." ||
51
+ segment === ".." ||
52
+ /[\u0000-\u001F\u007F]/u.test(segment))) {
53
+ invalid(`${field} must contain only safe path segments`);
54
+ }
55
+ return segments.join("/");
56
+ };
57
+ const validateFiniteNumber = (value, field, minimum, maximum, defaultValue) => {
58
+ if (value === undefined) {
59
+ return defaultValue;
60
+ }
61
+ if (typeof value !== "number") {
62
+ return invalid(`${field} must be an integer from ${minimum} through ${maximum}`);
63
+ }
64
+ if (!Number.isFinite(value) ||
65
+ !Number.isInteger(value) ||
66
+ value < minimum ||
67
+ value > maximum) {
68
+ return invalid(`${field} must be an integer from ${minimum} through ${maximum}`);
69
+ }
70
+ return value;
71
+ };
72
+ const validateCacheOptions = (cache) => {
73
+ const expirationStrategy = cache?.expirationStrategy ?? DEFAULT_CACHE.expirationStrategy;
74
+ if (expirationStrategy !== "absolute" && expirationStrategy !== "sliding") {
75
+ invalid("cache.expirationStrategy must be 'absolute' or 'sliding'");
76
+ }
77
+ return {
78
+ cleanupIntervalMs: validateFiniteNumber(cache?.cleanupIntervalMs, "cache.cleanupIntervalMs", 1, 86_400_000, DEFAULT_CACHE.cleanupIntervalMs),
79
+ dir: cache?.dir
80
+ ? requireNonBlankString(cache.dir, "cache.dir")
81
+ : DEFAULT_CACHE.dir,
82
+ expirationStrategy,
83
+ ttlMs: validateFiniteNumber(cache?.ttlMs, "cache.ttlMs", 0, 604_800_000, DEFAULT_CACHE.ttlMs),
84
+ };
85
+ };
86
+ const validateCredentials = (credentials) => {
87
+ if (!credentials) {
88
+ return undefined;
89
+ }
90
+ const accessKeyId = credentials.accessKeyId;
91
+ const secretAccessKey = credentials.secretAccessKey;
92
+ if (!accessKeyId && !secretAccessKey && !credentials.sessionToken) {
93
+ invalid("s3.credentials must contain accessKeyId and secretAccessKey");
94
+ }
95
+ return {
96
+ accessKeyId: requireNonBlankString(accessKeyId, "s3.credentials.accessKeyId"),
97
+ secretAccessKey: requireNonBlankString(secretAccessKey, "s3.credentials.secretAccessKey"),
98
+ ...(credentials.sessionToken
99
+ ? {
100
+ sessionToken: requireNonBlankString(credentials.sessionToken, "s3.credentials.sessionToken"),
101
+ }
102
+ : {}),
103
+ };
104
+ };
105
+ const validateGatewayOptions = (gateway) => {
106
+ if (!gateway) {
107
+ return invalid("gateway options are required when enabled is true");
108
+ }
109
+ return {
110
+ baseUrl: validateHttpUrl(gateway.baseUrl, "gateway.baseUrl"),
111
+ privateDownloadDurationSeconds: validateFiniteNumber(gateway.privateDownloadDurationSeconds, "gateway.privateDownloadDurationSeconds", 1, 604_800, DEFAULT_PRIVATE_DOWNLOAD_DURATION_SECONDS),
112
+ signingSecret: requireNonBlankString(gateway.signingSecret, "gateway.signingSecret"),
113
+ };
114
+ };
115
+ const validateS3CacheProviderOptions = (input) => {
116
+ const s3 = input.s3;
117
+ if (!s3) {
118
+ return invalid("s3 options are required when enabled is true");
119
+ }
120
+ if (s3.forcePathStyle !== undefined &&
121
+ typeof s3.forcePathStyle !== "boolean") {
122
+ invalid("s3.forcePathStyle must be a boolean");
123
+ }
124
+ if (s3.endpoint !== undefined) {
125
+ validateHttpUrl(s3.endpoint, "s3.endpoint");
126
+ }
127
+ return {
128
+ cache: validateCacheOptions(input.cache),
129
+ gateway: validateGatewayOptions(input.gateway),
130
+ s3: {
131
+ bucket: requireNonBlankString(s3.bucket, "s3.bucket"),
132
+ credentials: validateCredentials(s3.credentials),
133
+ endpoint: s3.endpoint === undefined
134
+ ? undefined
135
+ : validateHttpUrl(s3.endpoint, "s3.endpoint"),
136
+ forcePathStyle: s3.forcePathStyle ?? false,
137
+ region: requireNonBlankString(s3.region, "s3.region"),
138
+ storagePrefix: validateSafePrefix(s3.storagePrefix, "s3.storagePrefix"),
139
+ },
140
+ };
141
+ };
142
+ exports.validateS3CacheProviderOptions = validateS3CacheProviderOptions;
143
+ const buildLocalProviderOptions = (options) => ({
144
+ ...(options?.backendUrl ? { backend_url: options.backendUrl } : {}),
145
+ ...(options?.privateUploadDir
146
+ ? { private_upload_dir: options.privateUploadDir }
147
+ : {}),
148
+ ...(options?.uploadDir ? { upload_dir: options.uploadDir } : {}),
149
+ });
150
+ const createS3CacheFileModuleConfig = (options = {}) => {
151
+ if (options.enabled !== true) {
152
+ return {
153
+ options: {
154
+ providers: [
155
+ {
156
+ id: "local",
157
+ options: buildLocalProviderOptions(options.local),
158
+ resolve: "@medusajs/medusa/file-local",
159
+ },
160
+ ],
161
+ },
162
+ resolve: "@medusajs/medusa/file",
163
+ };
164
+ }
165
+ return s3FileModule((0, exports.validateS3CacheProviderOptions)(options));
166
+ };
167
+ exports.createS3CacheFileModuleConfig = createS3CacheFileModuleConfig;
168
+ const s3FileModule = (validated) => ({
169
+ options: {
170
+ providers: [
171
+ {
172
+ id: "s3-cache",
173
+ options: {
174
+ cache: validated.cache,
175
+ gateway: validated.gateway,
176
+ s3: validated.s3,
177
+ },
178
+ resolve: "@hartl-services/medusa-base/providers/s3-cache",
179
+ },
180
+ ],
181
+ },
182
+ resolve: "@medusajs/medusa/file",
183
+ });
184
+ /**
185
+ * Validates the options once and returns both parts S3 Cache Storage needs:
186
+ * the File Module with the S3 provider (under `modules`) and the `gateway`
187
+ * part of the base plugin's `files` option that serves its `/files` routes.
188
+ * Both carry the same signing secret, so every URL the provider signs is one
189
+ * the routes accept.
190
+ */
191
+ const createS3CacheStorageConfig = (options) => {
192
+ const validated = (0, exports.validateS3CacheProviderOptions)(options);
193
+ return {
194
+ fileModule: s3FileModule(validated),
195
+ gateway: { signingSecret: validated.gateway.signingSecret },
196
+ };
197
+ };
198
+ exports.createS3CacheStorageConfig = createS3CacheStorageConfig;
199
+ /**
200
+ * `medusa build` loads the configuration without deployment secrets. These
201
+ * placeholders only satisfy the required-variable checks of a build; they
202
+ * never reach a running server.
203
+ */
204
+ exports.S3_BUILD_PLACEHOLDERS = {
205
+ S3_CACHE_STORAGE_BUCKET: "build-bucket",
206
+ S3_CACHE_STORAGE_REGION: "build-placeholder",
207
+ };
208
+ const optionalEnvironment = (environment, name) => {
209
+ const value = environment[name]?.trim();
210
+ return value ? value : undefined;
211
+ };
212
+ /**
213
+ * Static S3 credentials are optional (the AWS credential chain applies
214
+ * otherwise) but must be complete when present. They are never read during
215
+ * a build.
216
+ */
217
+ const resolveS3Credentials = (environment, phase) => {
218
+ if (phase === "build") {
219
+ return undefined;
220
+ }
221
+ const accessKeyId = optionalEnvironment(environment, "S3_CACHE_STORAGE_ACCESS_KEY_ID");
222
+ const secretAccessKey = optionalEnvironment(environment, "S3_CACHE_STORAGE_SECRET_ACCESS_KEY");
223
+ const sessionToken = optionalEnvironment(environment, "S3_CACHE_STORAGE_SESSION_TOKEN");
224
+ // A declared but blank key still counts: it signals intended static
225
+ // credentials, which must then be complete.
226
+ if (!("S3_CACHE_STORAGE_ACCESS_KEY_ID" in environment) &&
227
+ !("S3_CACHE_STORAGE_SECRET_ACCESS_KEY" in environment) &&
228
+ !sessionToken) {
229
+ return undefined;
230
+ }
231
+ const missing = [
232
+ accessKeyId ? undefined : "S3_CACHE_STORAGE_ACCESS_KEY_ID",
233
+ secretAccessKey ? undefined : "S3_CACHE_STORAGE_SECRET_ACCESS_KEY",
234
+ ].filter((name) => name !== undefined);
235
+ if (missing.length > 0) {
236
+ throw new TypeError(`Missing required environment variables: ${missing.join(", ")}.`);
237
+ }
238
+ return {
239
+ accessKeyId: accessKeyId,
240
+ secretAccessKey: secretAccessKey,
241
+ ...(sessionToken ? { sessionToken } : {}),
242
+ };
243
+ };
244
+ exports.resolveS3Credentials = resolveS3Credentials;
245
+ const resolveExpirationStrategy = (environment, defaultValue) => {
246
+ const value = optionalEnvironment(environment, "S3_CACHE_STORAGE_EXPIRATION_STRATEGY");
247
+ if (value === undefined) {
248
+ return defaultValue;
249
+ }
250
+ if (value !== "absolute" && value !== "sliding") {
251
+ throw new TypeError('S3_CACHE_STORAGE_EXPIRATION_STRATEGY must be either "absolute" or "sliding".');
252
+ }
253
+ return value;
254
+ };
255
+ exports.resolveExpirationStrategy = resolveExpirationStrategy;
256
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZmlsZXMvY29uZmlnL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVlBLE1BQU0sWUFBWSxHQUFHLHlCQUF5QixDQUFDO0FBRS9DLE1BQU0sYUFBYSxHQUFrQztJQUNuRCxpQkFBaUIsRUFBRSxPQUFPO0lBQzFCLEdBQUcsRUFBRSxvQkFBb0I7SUFDekIsa0JBQWtCLEVBQUUsVUFBVTtJQUM5QixLQUFLLEVBQUUsU0FBUztDQUNqQixDQUFDO0FBRUYsTUFBTSx5Q0FBeUMsR0FBRyxLQUFLLENBQUM7QUFFeEQsTUFBTSxPQUFPLEdBQUcsQ0FBQyxPQUFlLEVBQVMsRUFBRTtJQUN6QyxNQUFNLElBQUksU0FBUyxDQUFDLEdBQUcsWUFBWSxLQUFLLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDckQsQ0FBQyxDQUFDO0FBRUYsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLEtBQWMsRUFBRSxLQUFhLEVBQVUsRUFBRTtJQUN0RSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM3QixJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1osT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLEtBQUssNkJBQTZCLENBQUMsQ0FBQztBQUN4RCxDQUFDLENBQUM7QUFFRixNQUFNLGVBQWUsR0FBRyxDQUFDLEtBQWMsRUFBRSxLQUFhLEVBQVUsRUFBRTtJQUNoRSxNQUFNLEdBQUcsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFaEQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUIsSUFBSSxNQUFNLENBQUMsUUFB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