@hartl-services/medusa-base 0.4.0 → 1.1.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 (258) hide show
  1. package/.medusa/server/src/admin/index.js +1657 -111
  2. package/.medusa/server/src/admin/index.mjs +1647 -101
  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 +38 -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 +160 -0
  37. package/.medusa/server/src/documents/templates/format.js +73 -0
  38. package/.medusa/server/src/documents/templates/html-factory.js +42 -0
  39. package/.medusa/server/src/documents/templates/html-utils.js +23 -0
  40. package/.medusa/server/src/documents/templates/layout.js +142 -0
  41. package/.medusa/server/src/documents/templates/packing-list.js +52 -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/document-render-settings.js +59 -0
  50. package/.medusa/server/src/documents/utils/html-to-pdf.js +61 -0
  51. package/.medusa/server/src/documents/utils/private-file-storage.js +64 -0
  52. package/.medusa/server/src/documents/utils/resolve-services.js +7 -0
  53. package/.medusa/server/src/email/application/handle-invite-event.js +318 -0
  54. package/.medusa/server/src/email/application/handle-password-reset-event.js +366 -0
  55. package/.medusa/server/src/email/config/index.js +84 -0
  56. package/.medusa/server/src/email/config/notification-module.js +20 -0
  57. package/.medusa/server/src/email/domain/business-keys.js +50 -0
  58. package/.medusa/server/src/email/domain/documents-fact-fingerprint.js +7 -0
  59. package/.medusa/server/src/email/domain/event-schemas.js +36 -0
  60. package/.medusa/server/src/email/domain/failure-classification.js +53 -0
  61. package/.medusa/server/src/email/domain/order-summary.js +103 -0
  62. package/.medusa/server/src/email/domain/refund-summary.js +43 -0
  63. package/.medusa/server/src/email/domain/return-summary.js +118 -0
  64. package/.medusa/server/src/email/domain/shipment-summary.js +74 -0
  65. package/.medusa/server/src/email/plugin-features.js +39 -0
  66. package/.medusa/server/src/email/rendering/default-templates.js +719 -0
  67. package/.medusa/server/src/email/rendering/load-email-shop-details.js +36 -0
  68. package/.medusa/server/src/email/rendering/render-email.js +50 -0
  69. package/.medusa/server/src/email/rendering/resolve-shop-configuration.js +67 -0
  70. package/.medusa/server/src/email/types/email-kinds.js +18 -0
  71. package/.medusa/server/src/email/types/index.js +21 -0
  72. package/.medusa/server/src/email/types/shop-configuration.js +3 -0
  73. package/.medusa/server/src/email/types/smtp-configuration.js +3 -0
  74. package/.medusa/server/src/email/types/template-data.js +232 -0
  75. package/.medusa/server/src/files/config/index.js +256 -0
  76. package/.medusa/server/src/files/gateway/index.js +115 -0
  77. package/.medusa/server/src/files/types/index.js +6 -0
  78. package/.medusa/server/src/files/types/public.js +6 -0
  79. package/.medusa/server/src/jobs/document-fact-publication-reconciliation.js +18 -0
  80. package/.medusa/server/src/jobs/document-resolution-reconciliation.js +20 -0
  81. package/.medusa/server/src/jobs/packing-list-reconciliation.js +49 -0
  82. package/.medusa/server/src/jobs/reconcile-email-attempts.js +63 -0
  83. package/.medusa/server/src/jobs/reconcile-pending-email-messages.js +41 -0
  84. package/.medusa/server/src/jobs/retry-email-messages.js +27 -0
  85. package/.medusa/server/src/migration-scripts/dismiss-orphaned-cart-promotion-links.js +26 -0
  86. package/.medusa/server/src/modules/documents/domain/cancellation-snapshot.js +97 -0
  87. package/.medusa/server/src/modules/documents/domain/document-number.js +36 -0
  88. package/.medusa/server/src/modules/documents/domain/document-resolution.js +24 -0
  89. package/.medusa/server/src/modules/documents/domain/issuance-rules.js +37 -0
  90. package/.medusa/server/src/modules/documents/domain/merchant.js +86 -0
  91. package/.medusa/server/src/modules/documents/domain/options.js +40 -0
  92. package/.medusa/server/src/modules/documents/domain/packing-list.js +90 -0
  93. package/.medusa/server/src/modules/documents/domain/snapshot-normalization.js +17 -0
  94. package/.medusa/server/src/modules/documents/domain/tax-breakdown.js +66 -0
  95. package/.medusa/server/src/modules/documents/index.js +15 -0
  96. package/.medusa/server/src/modules/documents/loaders/assert-private-file-storage.js +20 -0
  97. package/.medusa/server/src/modules/documents/migrations/Migration20260827061749.js +75 -0
  98. package/.medusa/server/src/modules/documents/migrations/Migration20260830111207.js +28 -0
  99. package/.medusa/server/src/modules/documents/models/document-artifact.js +25 -0
  100. package/.medusa/server/src/modules/documents/models/document-number-sequence.js +29 -0
  101. package/.medusa/server/src/modules/documents/models/document.js +82 -0
  102. package/.medusa/server/src/modules/documents/models/order-cancellation-resolution.js +51 -0
  103. package/.medusa/server/src/modules/documents/models/packing-list-revision.js +36 -0
  104. package/.medusa/server/src/modules/documents/models/packing-list.js +27 -0
  105. package/.medusa/server/src/modules/documents/models/refund-document-resolution.js +66 -0
  106. package/.medusa/server/src/modules/documents/models/shipment-invoice-assignment.js +51 -0
  107. package/.medusa/server/src/modules/documents/models/shipment-invoice-coordinator.js +44 -0
  108. package/.medusa/server/src/modules/documents/service.js +1701 -0
  109. package/.medusa/server/src/modules/email/domain/attachment.js +25 -0
  110. package/.medusa/server/src/modules/email/domain/message-state.js +69 -0
  111. package/.medusa/server/src/modules/email/index.js +13 -0
  112. package/.medusa/server/src/modules/email/migrations/Migration20260826173422.js +32 -0
  113. package/.medusa/server/src/modules/email/migrations/Migration20260827172945.js +16 -0
  114. package/.medusa/server/src/modules/email/migrations/Migration20260827194804.js +22 -0
  115. package/.medusa/server/src/modules/email/migrations/Migration20260906195205.js +16 -0
  116. package/.medusa/server/src/modules/email/models/email-attempt.js +56 -0
  117. package/.medusa/server/src/modules/email/models/email-message.js +71 -0
  118. package/.medusa/server/src/modules/email/models/email-terms-version.js +37 -0
  119. package/.medusa/server/src/modules/email/service.js +1285 -0
  120. package/.medusa/server/src/modules/plugin-features/domain/plugin-settings.js +4 -3
  121. package/.medusa/server/src/providers/s3-cache/cache/atomic-write.js +25 -0
  122. package/.medusa/server/src/providers/s3-cache/cache/cache-manager.js +115 -0
  123. package/.medusa/server/src/providers/s3-cache/cache/keyed-lock.js +28 -0
  124. package/.medusa/server/src/providers/s3-cache/index.js +8 -0
  125. package/.medusa/server/src/providers/s3-cache/object-key.js +53 -0
  126. package/.medusa/server/src/providers/s3-cache/s3-cache-file.js +229 -0
  127. package/.medusa/server/src/providers/s3-cache/s3-object-store.js +86 -0
  128. package/.medusa/server/src/providers/smtp/index.js +8 -0
  129. package/.medusa/server/src/providers/smtp/service.js +236 -0
  130. package/.medusa/server/src/providers/smtp/types.js +11 -0
  131. package/.medusa/server/src/public/config.js +186 -0
  132. package/.medusa/server/src/public/descriptor.js +3 -1
  133. package/.medusa/server/src/public/gateway.js +19 -0
  134. package/.medusa/server/src/public/instrumentation.js +56 -0
  135. package/.medusa/server/src/public/shop-config.js +12 -0
  136. package/.medusa/server/src/public/shop-master-data.js +2 -2
  137. package/.medusa/server/src/public/shop-types.js +24 -0
  138. package/.medusa/server/src/shop-config/build-food-shop-config.js +252 -0
  139. package/.medusa/server/src/shop-config/options.js +75 -0
  140. package/.medusa/server/src/subscribers/affiliate-consignment-reminder-due.js +26 -0
  141. package/.medusa/server/src/subscribers/documents-order-canceled.js +24 -0
  142. package/.medusa/server/src/subscribers/documents-order-cancellation-ready.js +26 -0
  143. package/.medusa/server/src/subscribers/documents-refund-ready.js +24 -0
  144. package/.medusa/server/src/subscribers/documents-shipment-created.js +36 -0
  145. package/.medusa/server/src/subscribers/documents-shipment-invoice-assignment-decided.js +26 -0
  146. package/.medusa/server/src/subscribers/email-order-canceled.js +28 -0
  147. package/.medusa/server/src/subscribers/email-shipment-created.js +32 -0
  148. package/.medusa/server/src/subscribers/order-placed.js +27 -0
  149. package/.medusa/server/src/subscribers/packing-list-allocation-revised.js +32 -0
  150. package/.medusa/server/src/subscribers/packing-list-fulfillment-canceled.js +54 -0
  151. package/.medusa/server/src/subscribers/packing-list-fulfillment-created.js +31 -0
  152. package/.medusa/server/src/subscribers/password-reset.js +23 -0
  153. package/.medusa/server/src/subscribers/payment-refunded.js +38 -0
  154. package/.medusa/server/src/subscribers/return-received.js +27 -0
  155. package/.medusa/server/src/subscribers/return-requested.js +27 -0
  156. package/.medusa/server/src/subscribers/user-invite.js +23 -0
  157. package/.medusa/server/src/utils/cart-promotion-links.js +101 -0
  158. package/.medusa/server/src/workflows/documents/issue-cancellation-after-refund.js +246 -0
  159. package/.medusa/server/src/workflows/documents/issue-document.js +165 -0
  160. package/.medusa/server/src/workflows/documents/issue-invoice-after-shipment.js +521 -0
  161. package/.medusa/server/src/workflows/documents/issue-packing-list.js +390 -0
  162. package/.medusa/server/src/workflows/documents/publish-document-facts.js +53 -0
  163. package/.medusa/server/src/workflows/documents/reconcile-document-resolutions.js +48 -0
  164. package/.medusa/server/src/workflows/documents/reconcile-order-cancellation.js +92 -0
  165. package/.medusa/server/src/workflows/documents/regenerate-issued-document.js +61 -0
  166. package/.medusa/server/src/workflows/email/dispatch-email-message.js +301 -0
  167. package/.medusa/server/src/workflows/email/documents-required-facts.js +30 -0
  168. package/.medusa/server/src/workflows/email/prepare-affiliate-reminder-email.js +58 -0
  169. package/.medusa/server/src/workflows/email/prepare-order-canceled-email.js +102 -0
  170. package/.medusa/server/src/workflows/email/prepare-order-received-email.js +82 -0
  171. package/.medusa/server/src/workflows/email/prepare-refund-email.js +71 -0
  172. package/.medusa/server/src/workflows/email/prepare-return-email.js +136 -0
  173. package/.medusa/server/src/workflows/email/prepare-shipment-email.js +115 -0
  174. package/.medusa/server/src/workflows/email/retry-email-messages.js +31 -0
  175. package/.medusa/server/src/workflows/hooks/dismiss-deleted-promotion-cart-links.js +23 -0
  176. package/README.md +1777 -8
  177. package/dist/admin-components/features/plugin-features/components/ImageSettingInput.d.ts +15 -0
  178. package/dist/admin-components/features/plugin-features/components/ImageSettingInput.js +42 -0
  179. package/dist/admin-components/features/plugin-features/components/PluginSettingsForm.js +4 -2
  180. package/dist/admin-components/features/plugin-features/hooks/usePluginFeatureEnabled.d.ts +1 -1
  181. package/dist/admin-components/features/plugin-features/hooks/usePluginFeatures.d.ts +4 -4
  182. package/dist/admin-components/features/plugin-features/hooks/usePluginSettingsForm.d.ts +1 -1
  183. package/dist/admin-components/features/plugin-features/lib/image-upload.d.ts +6 -0
  184. package/dist/admin-components/features/plugin-features/lib/image-upload.js +17 -0
  185. package/dist/admin-components/features/plugin-features/lib/plugin-features-admin-client.d.ts +4 -4
  186. package/dist/admin-components/i18n/texts.d.ts +6 -0
  187. package/dist/admin-components/i18n/texts.js +6 -0
  188. package/dist/documents/config/index.d.ts +11 -0
  189. package/dist/documents/config/index.js +17 -0
  190. package/dist/documents/templates/financial-document.d.ts +3 -0
  191. package/dist/documents/templates/financial-document.js +159 -0
  192. package/dist/documents/templates/format.d.ts +30 -0
  193. package/dist/documents/templates/format.js +72 -0
  194. package/dist/documents/templates/html-factory.d.ts +15 -0
  195. package/dist/documents/templates/html-factory.js +41 -0
  196. package/dist/documents/templates/html-utils.d.ts +8 -0
  197. package/dist/documents/templates/html-utils.js +22 -0
  198. package/dist/documents/templates/layout.d.ts +35 -0
  199. package/dist/documents/templates/layout.js +141 -0
  200. package/dist/documents/templates/packing-list.d.ts +3 -0
  201. package/dist/documents/templates/packing-list.js +51 -0
  202. package/dist/documents/types/admin-api.d.ts +1 -0
  203. package/dist/documents/types/admin-api.js +2 -0
  204. package/dist/documents/types/document-summary.d.ts +1 -0
  205. package/dist/documents/types/document-summary.js +2 -0
  206. package/dist/documents/types/documents.d.ts +191 -0
  207. package/dist/documents/types/documents.js +2 -0
  208. package/dist/documents/types/html-factory.d.ts +8 -0
  209. package/dist/documents/types/html-factory.js +5 -0
  210. package/dist/documents/types/index.d.ts +5 -0
  211. package/dist/documents/types/index.js +21 -0
  212. package/dist/documents/types/store-api.d.ts +1 -0
  213. package/dist/documents/types/store-api.js +2 -0
  214. package/dist/email/config/index.d.ts +17 -0
  215. package/dist/email/config/index.js +83 -0
  216. package/dist/email/config/notification-module.d.ts +22 -0
  217. package/dist/email/config/notification-module.js +19 -0
  218. package/dist/email/types/email-kinds.d.ts +15 -0
  219. package/dist/email/types/email-kinds.js +17 -0
  220. package/dist/email/types/index.d.ts +4 -0
  221. package/dist/email/types/index.js +20 -0
  222. package/dist/email/types/shop-configuration.d.ts +68 -0
  223. package/dist/email/types/shop-configuration.js +2 -0
  224. package/dist/email/types/smtp-configuration.d.ts +9 -0
  225. package/dist/email/types/smtp-configuration.js +2 -0
  226. package/dist/email/types/template-data.d.ts +609 -0
  227. package/dist/email/types/template-data.js +231 -0
  228. package/dist/files/config/index.d.ts +32 -0
  229. package/dist/files/config/index.js +255 -0
  230. package/dist/files/gateway/index.d.ts +30 -0
  231. package/dist/files/gateway/index.js +114 -0
  232. package/dist/files/types/index.d.ts +2 -0
  233. package/dist/files/types/index.js +5 -0
  234. package/dist/files/types/public.d.ts +90 -0
  235. package/dist/files/types/public.js +5 -0
  236. package/dist/modules/documents/domain/merchant.d.ts +22 -0
  237. package/dist/modules/documents/domain/merchant.js +85 -0
  238. package/dist/modules/documents/domain/options.d.ts +34 -0
  239. package/dist/modules/documents/domain/options.js +39 -0
  240. package/dist/public/config.d.ts +59 -0
  241. package/dist/public/config.js +185 -0
  242. package/dist/public/descriptor.js +2 -0
  243. package/dist/public/gateway.d.ts +2 -0
  244. package/dist/public/gateway.js +18 -0
  245. package/dist/public/instrumentation.d.ts +12 -0
  246. package/dist/public/instrumentation.js +55 -0
  247. package/dist/public/shop-config.d.ts +8 -0
  248. package/dist/public/shop-config.js +11 -0
  249. package/dist/public/shop-master-data.d.ts +1 -1
  250. package/dist/public/shop-master-data.js +1 -1
  251. package/dist/public/shop-types.d.ts +7 -0
  252. package/dist/public/shop-types.js +23 -0
  253. package/dist/public/types.d.ts +19 -2
  254. package/dist/shop-config/build-food-shop-config.d.ts +44 -0
  255. package/dist/shop-config/build-food-shop-config.js +251 -0
  256. package/dist/shop-config/options.d.ts +48 -0
  257. package/dist/shop-config/options.js +74 -0
  258. package/package.json +48 -5
@@ -0,0 +1,366 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.handlePasswordResetEvent = exports.PASSWORD_RESET_RETRY_SENTINEL = exports.PASSWORD_RESET_MAX_ATTEMPTS = void 0;
7
+ const utils_1 = require("@medusajs/framework/utils");
8
+ const zod_1 = require("@medusajs/framework/zod");
9
+ const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
10
+ const failure_classification_1 = require("../domain/failure-classification");
11
+ const business_keys_1 = require("../domain/business-keys");
12
+ const event_schemas_1 = require("../domain/event-schemas");
13
+ const email_1 = require("../../modules/email");
14
+ const load_email_shop_details_1 = require("../rendering/load-email-shop-details");
15
+ const render_email_1 = require("../rendering/render-email");
16
+ const dispatch_email_message_1 = require("../../workflows/email/dispatch-email-message");
17
+ exports.PASSWORD_RESET_MAX_ATTEMPTS = 2;
18
+ exports.PASSWORD_RESET_RETRY_SENTINEL = "EMAIL_PASSWORD_RESET_RETRY";
19
+ const emailAddressPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
20
+ const PasswordResetClaimsSchema = zod_1.z
21
+ .object({
22
+ actor_type: zod_1.z.literal("customer"),
23
+ entity_id: zod_1.z.string().trim().min(1),
24
+ exp: zod_1.z.number().int().positive(),
25
+ jti: zod_1.z.string().trim().min(1),
26
+ provider: zod_1.z.literal("emailpass"),
27
+ purpose: zod_1.z.literal("reset"),
28
+ })
29
+ .passthrough();
30
+ const retry = () => {
31
+ throw new Error(exports.PASSWORD_RESET_RETRY_SENTINEL);
32
+ };
33
+ const resultForMessage = (message, code) => ({
34
+ ...(code ? { code } : {}),
35
+ message_id: message.id,
36
+ status: message.status === "sent"
37
+ ? "sent"
38
+ : message.status === "unknown"
39
+ ? "unknown"
40
+ : message.status === "failed" || message.status === "suppressed"
41
+ ? "failed"
42
+ : "in_progress",
43
+ });
44
+ const asNotificationRecord = (value) => {
45
+ if (!value || typeof value !== "object") {
46
+ return null;
47
+ }
48
+ const record = value;
49
+ if (typeof record.id !== "string" ||
50
+ !record.id.trim() ||
51
+ (record.status !== "failure" &&
52
+ record.status !== "pending" &&
53
+ record.status !== "success")) {
54
+ return null;
55
+ }
56
+ return { id: record.id, status: record.status };
57
+ };
58
+ const verifyClaims = (token, secret, entityId) => {
59
+ let verified;
60
+ try {
61
+ verified = jsonwebtoken_1.default.verify(token, secret, {
62
+ algorithms: ["HS256"],
63
+ ignoreExpiration: true,
64
+ });
65
+ }
66
+ catch {
67
+ return null;
68
+ }
69
+ const parsed = PasswordResetClaimsSchema.safeParse(verified);
70
+ if (!parsed.success || parsed.data.entity_id !== entityId) {
71
+ return null;
72
+ }
73
+ return parsed.data;
74
+ };
75
+ const localeFromMetadata = (metadata) => {
76
+ const locale = metadata.locale;
77
+ return typeof locale === "string" &&
78
+ locale.trim() &&
79
+ locale.trim().length <= 35
80
+ ? locale.trim()
81
+ : null;
82
+ };
83
+ const resolveCustomerId = async (container, email) => {
84
+ const customers = container.resolve(utils_1.Modules.CUSTOMER);
85
+ const matches = await customers.listCustomers({ email }, { select: ["id", "email"], take: 2 });
86
+ const exact = matches.filter((customer) => customer.email?.trim().toLowerCase() === email.toLowerCase());
87
+ return exact.length === 1 ? exact[0].id : null;
88
+ };
89
+ const reconcileSendingMessage = async (container, email, message, now) => {
90
+ const attempts = await email.listEmailAttempts({ message_id: message.id });
91
+ const current = [...attempts]
92
+ .sort((left, right) => right.attempt_number - left.attempt_number)
93
+ .find((attempt) => attempt.status === "processing");
94
+ if (!current?.attempt_token || !current.lease_expires_at) {
95
+ return retry();
96
+ }
97
+ const notification = await (0, dispatch_email_message_1.findAttemptNotification)(container, current.id);
98
+ if (notification?.status === "success") {
99
+ const completed = await email.markAttemptSent({
100
+ attempt_id: current.id,
101
+ attempt_token: current.attempt_token,
102
+ finished_at: now,
103
+ notification_id: notification.id,
104
+ });
105
+ return {
106
+ attempt_id: current.id,
107
+ message_id: completed.message.id,
108
+ status: "sent",
109
+ };
110
+ }
111
+ if (current.lease_expires_at.getTime() <= now.getTime()) {
112
+ const completed = await email.completeStaleAttempt({
113
+ attempt_id: current.id,
114
+ attempt_token: current.attempt_token,
115
+ now,
116
+ notification_id: notification?.id ?? null,
117
+ outcome: "unknown",
118
+ });
119
+ return {
120
+ attempt_id: current.id,
121
+ code: "lease_expired",
122
+ message_id: completed.message.id,
123
+ status: "unknown",
124
+ };
125
+ }
126
+ return retry();
127
+ };
128
+ const failClaim = async (email, claim, code, now, notificationId = null) => {
129
+ const completed = await email.markAttemptFailed({
130
+ attempt_id: claim.attempt.id,
131
+ attempt_token: claim.attempt_token,
132
+ failure_code: code,
133
+ finished_at: now,
134
+ notification_id: notificationId,
135
+ });
136
+ return {
137
+ attempt_id: claim.attempt.id,
138
+ code,
139
+ message_id: completed.message.id,
140
+ status: "failed",
141
+ };
142
+ };
143
+ const deliverPasswordReset = async (container, email, claim, token, expiresAt, validMinutes, getNow) => {
144
+ const shop = await (0, load_email_shop_details_1.loadEmailShopDetails)(container);
145
+ let rendered;
146
+ try {
147
+ const configuration = email.getDispatchConfiguration();
148
+ const resetData = claim.message.template_data;
149
+ const resetUrl = new URL(configuration.passwordResetUrl({
150
+ locale: resetData?.locale ?? null,
151
+ }));
152
+ resetUrl.hash = new URLSearchParams({ token }).toString();
153
+ rendered = (0, render_email_1.renderEmail)(configuration, {
154
+ kind: "auth.password_reset",
155
+ data: {
156
+ locale: resetData?.locale ?? null,
157
+ reset_url: resetUrl.toString(),
158
+ ...(validMinutes ? { valid_minutes: validMinutes } : {}),
159
+ },
160
+ }, shop);
161
+ }
162
+ catch {
163
+ return await failClaim(email, claim, "render_failed", getNow());
164
+ }
165
+ const beforeNotification = getNow();
166
+ if (expiresAt.getTime() <= beforeNotification.getTime()) {
167
+ return await failClaim(email, claim, "payload_expired", beforeNotification);
168
+ }
169
+ try {
170
+ await email.renewAttemptLease({
171
+ attempt_id: claim.attempt.id,
172
+ attempt_token: claim.attempt_token,
173
+ now: beforeNotification,
174
+ });
175
+ }
176
+ catch {
177
+ return retry();
178
+ }
179
+ const notifications = container.resolve(utils_1.Modules.NOTIFICATION);
180
+ const safeData = {
181
+ attempt_id: claim.attempt.id,
182
+ kind: claim.message.kind,
183
+ message_id: claim.message.id,
184
+ };
185
+ let creationError;
186
+ let created = null;
187
+ try {
188
+ created = asNotificationRecord(await notifications.createNotifications({
189
+ channel: "email",
190
+ content: {
191
+ html: rendered.html,
192
+ subject: rendered.subject,
193
+ text: rendered.text,
194
+ },
195
+ data: safeData,
196
+ idempotency_key: (0, failure_classification_1.emailAttemptNotificationKey)(claim.attempt.id),
197
+ ...(claim.previous_notification_id
198
+ ? { original_notification_id: claim.previous_notification_id }
199
+ : {}),
200
+ provider_data: safeData,
201
+ ...(claim.message.resource_id
202
+ ? { resource_id: claim.message.resource_id }
203
+ : {}),
204
+ resource_type: "customer",
205
+ template: claim.message.kind,
206
+ to: claim.message.recipient,
207
+ trigger_type: "email.password_reset.dispatch",
208
+ }));
209
+ }
210
+ catch (error) {
211
+ creationError = error;
212
+ }
213
+ let persisted = null;
214
+ let lookupFailed = false;
215
+ if (!created || creationError) {
216
+ try {
217
+ persisted = await (0, dispatch_email_message_1.findAttemptNotification)(container, claim.attempt.id);
218
+ }
219
+ catch {
220
+ lookupFailed = true;
221
+ }
222
+ }
223
+ const notification = created ?? persisted;
224
+ const finishedAt = getNow();
225
+ if (notification?.status === "success") {
226
+ const completed = await email.markAttemptSent({
227
+ attempt_id: claim.attempt.id,
228
+ attempt_token: claim.attempt_token,
229
+ finished_at: finishedAt,
230
+ notification_id: notification.id,
231
+ });
232
+ return {
233
+ attempt_id: claim.attempt.id,
234
+ message_id: completed.message.id,
235
+ status: "sent",
236
+ };
237
+ }
238
+ const failure = creationError && notification?.status === "failure" && !lookupFailed
239
+ ? (0, failure_classification_1.classifyNotificationFailure)(creationError)
240
+ : { code: "outcome_unknown", outcome: "unknown" };
241
+ if (failure.outcome === "retryable") {
242
+ const nextAttemptAt = new Date(finishedAt.getTime() + 1_000);
243
+ if (claim.attempt.attempt_number < exports.PASSWORD_RESET_MAX_ATTEMPTS &&
244
+ nextAttemptAt.getTime() < expiresAt.getTime()) {
245
+ await email.markAttemptRetryable({
246
+ attempt_id: claim.attempt.id,
247
+ attempt_token: claim.attempt_token,
248
+ failure_code: failure.code,
249
+ finished_at: finishedAt,
250
+ next_attempt_at: nextAttemptAt,
251
+ notification_id: notification?.id ?? null,
252
+ });
253
+ return retry();
254
+ }
255
+ return await failClaim(email, claim, expiresAt.getTime() <= nextAttemptAt.getTime()
256
+ ? "payload_expired"
257
+ : "retry_exhausted", finishedAt, notification?.id ?? null);
258
+ }
259
+ if (failure.outcome === "failed") {
260
+ return await failClaim(email, claim, failure.code, finishedAt, notification?.id ?? null);
261
+ }
262
+ const completed = await email.markAttemptUnknown({
263
+ attempt_id: claim.attempt.id,
264
+ attempt_token: claim.attempt_token,
265
+ failure_code: failure.code,
266
+ finished_at: finishedAt,
267
+ notification_id: notification?.id ?? null,
268
+ });
269
+ return {
270
+ attempt_id: claim.attempt.id,
271
+ code: failure.code,
272
+ message_id: completed.message.id,
273
+ status: "unknown",
274
+ };
275
+ };
276
+ /** The token's full lifetime in minutes (`exp` − `iat`); unknown without `iat`. */
277
+ const tokenValidMinutes = (claims) => {
278
+ const issuedAt = claims.iat;
279
+ if (typeof issuedAt !== "number" || !Number.isFinite(issuedAt)) {
280
+ return undefined;
281
+ }
282
+ const minutes = Math.round((claims.exp - issuedAt) / 60);
283
+ return minutes > 0 ? minutes : undefined;
284
+ };
285
+ const handleVerifiedPasswordReset = async (container, event, claims, getNow) => {
286
+ const now = getNow();
287
+ const expiresAt = new Date(claims.exp * 1_000);
288
+ const email = container.resolve(email_1.EMAIL_MODULE);
289
+ const businessKey = (0, business_keys_1.passwordResetBusinessKey)(event.token);
290
+ let message = await email.findMessageByBusinessKey(businessKey);
291
+ if (!message) {
292
+ const customerId = expiresAt.getTime() <= now.getTime()
293
+ ? null
294
+ : await resolveCustomerId(container, event.entity_id);
295
+ message = await email.upsertMessageFact({
296
+ kind: "auth.password_reset",
297
+ business_key: businessKey,
298
+ resource_type: "customer",
299
+ resource_id: customerId,
300
+ recipient: event.entity_id,
301
+ required_facts: ["reset"],
302
+ fact: "reset",
303
+ template_data: { locale: localeFromMetadata(event.metadata ?? {}) },
304
+ payload_expires_at: expiresAt,
305
+ });
306
+ }
307
+ if (message.status === "sent" ||
308
+ message.status === "failed" ||
309
+ message.status === "unknown" ||
310
+ message.status === "suppressed") {
311
+ return resultForMessage(message);
312
+ }
313
+ if (message.status === "sending") {
314
+ return await reconcileSendingMessage(container, email, message, now);
315
+ }
316
+ if (message.status === "retry_pending" &&
317
+ message.next_attempt_at &&
318
+ message.next_attempt_at.getTime() > now.getTime()) {
319
+ return retry();
320
+ }
321
+ const claim = await email.claimReadyMessage({
322
+ message_id: message.id,
323
+ now,
324
+ });
325
+ if (!claim) {
326
+ if (expiresAt.getTime() <= now.getTime()) {
327
+ return {
328
+ code: "payload_expired",
329
+ message_id: message.id,
330
+ status: "failed",
331
+ };
332
+ }
333
+ return retry();
334
+ }
335
+ return await deliverPasswordReset(container, email, claim, event.token, expiresAt, tokenValidMinutes(claims), getNow);
336
+ };
337
+ const handlePasswordResetEvent = async (container, payload, clock = () => new Date()) => {
338
+ const event = event_schemas_1.NativePasswordResetEventSchema.safeParse(payload);
339
+ if (!event.success ||
340
+ event.data.actor_type !== "customer" ||
341
+ !emailAddressPattern.test(event.data.entity_id)) {
342
+ return { code: "invalid_event", status: "ignored" };
343
+ }
344
+ const getNow = clock instanceof Date ? () => clock : clock;
345
+ let jwtSecret;
346
+ try {
347
+ jwtSecret = container
348
+ .resolve(email_1.EMAIL_MODULE)
349
+ .getJwtSecret();
350
+ }
351
+ catch {
352
+ return retry();
353
+ }
354
+ const claims = verifyClaims(event.data.token, jwtSecret, event.data.entity_id);
355
+ if (!claims) {
356
+ return { code: "invalid_token", status: "ignored" };
357
+ }
358
+ try {
359
+ return await handleVerifiedPasswordReset(container, event.data, claims, getNow);
360
+ }
361
+ catch {
362
+ return retry();
363
+ }
364
+ };
365
+ exports.handlePasswordResetEvent = handlePasswordResetEvent;
366
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlLXBhc3N3b3JkLXJlc2V0LWV2ZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2VtYWlsL2FwcGxpY2F0aW9uL2hhbmRsZS1wYXNzd29yZC1yZXNldC1ldmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFLQSxxREFBb0Q7QUFDcEQsaURBQTRDO0FBQzVDLGdFQUFvRDtBQUVwRCw2RUFHMEM7QUFDMUMsMkRBQW1FO0FBQ25FLDJEQUdpQztBQUNqQywrQ0FBbUQ7QUFNbkQsa0ZBQTRFO0FBQzVFLDREQUF3RDtBQUV4RCx5RkFBdUY7QUFFMUUsUUFBQSwyQkFBMkIsR0FBRyxDQUFDLENBQUM7QUFDaEMsUUFBQSw2QkFBNkIsR0FBRyw0QkFBNEIsQ0FBQztBQUUxRSxNQUFNLG1CQUFtQixHQUFHLDRCQUE0QixDQUFDO0FBRXpELE1BQU0seUJBQXlCLEdBQUcsT0FBQztLQUNoQyxNQUFNLENBQUM7SUFDTixVQUFVLEVBQUUsT0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7SUFDakMsU0FBUyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ25DLEdBQUcsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ2hDLEdBQUcsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM3QixRQUFRLEVBQUUsT0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7SUFDaEMsT0FBTyxFQUFFLE9BQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO0NBQzVCLENBQUM7S0FDRCxXQUFXLEVBQUUsQ0FBQztBQWVqQixNQUFNLEtBQUssR0FBRyxHQUFVLEVBQUU7SUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxx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
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveSmtp = exports.SMTP_BUILD_PLACEHOLDERS = exports.SMTP_ENVIRONMENT_VARIABLES = exports.defineShopEmailConfiguration = exports.createSmtpNotificationModuleConfig = void 0;
4
+ var notification_module_1 = require("./notification-module");
5
+ Object.defineProperty(exports, "createSmtpNotificationModuleConfig", { enumerable: true, get: function () { return notification_module_1.createSmtpNotificationModuleConfig; } });
6
+ const defineShopEmailConfiguration = (configuration) => configuration;
7
+ exports.defineShopEmailConfiguration = defineShopEmailConfiguration;
8
+ exports.SMTP_ENVIRONMENT_VARIABLES = [
9
+ "SMTP_HOST",
10
+ "SMTP_PORT",
11
+ "SMTP_SECURE",
12
+ "SMTP_USER",
13
+ "SMTP_PASSWORD",
14
+ "SMTP_FROM",
15
+ "SMTP_REQUIRE_TLS",
16
+ ];
17
+ /**
18
+ * `medusa build` loads the configuration without deployment secrets. These
19
+ * placeholders only satisfy the required-variable checks of a build; they
20
+ * never reach a running server.
21
+ */
22
+ exports.SMTP_BUILD_PLACEHOLDERS = {
23
+ SMTP_FROM: "no-reply@smtp.build.invalid",
24
+ SMTP_HOST: "smtp.build.invalid",
25
+ SMTP_PASSWORD: "build-password",
26
+ SMTP_PORT: "2525",
27
+ SMTP_REQUIRE_TLS: "false",
28
+ SMTP_SECURE: "false",
29
+ SMTP_USER: "build-user",
30
+ };
31
+ const optionalValue = (values, name) => {
32
+ const value = values[name]?.trim();
33
+ return value ? value : undefined;
34
+ };
35
+ const integerValue = (values, name, minimum, maximum) => {
36
+ const value = optionalValue(values, name);
37
+ if (value === undefined) {
38
+ return undefined;
39
+ }
40
+ const parsed = Number(value);
41
+ if (!Number.isInteger(parsed) || parsed < minimum || parsed > maximum) {
42
+ throw new TypeError(`${name} must be an integer from ${minimum} through ${maximum}.`);
43
+ }
44
+ return parsed;
45
+ };
46
+ const booleanValue = (values, name, defaultValue) => {
47
+ const value = optionalValue(values, name);
48
+ if (value === undefined) {
49
+ return defaultValue;
50
+ }
51
+ if (value !== "true" && value !== "false") {
52
+ throw new TypeError(`${name} must be either "true" or "false".`);
53
+ }
54
+ return value === "true";
55
+ };
56
+ /**
57
+ * Validates the SMTP environment values and returns the transport
58
+ * configuration. `allowInsecure` permits plain SMTP for development, tests
59
+ * and builds; otherwise `SMTP_SECURE` or `SMTP_REQUIRE_TLS` must be `true`.
60
+ */
61
+ const resolveSmtp = (values, allowInsecure) => {
62
+ const port = integerValue(values, "SMTP_PORT", 1, 65535);
63
+ if (port === undefined) {
64
+ throw new TypeError("SMTP_PORT is required.");
65
+ }
66
+ if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(values.SMTP_FROM)) {
67
+ throw new TypeError("SMTP_FROM must be a valid email address.");
68
+ }
69
+ const smtp = {
70
+ from: values.SMTP_FROM,
71
+ host: values.SMTP_HOST,
72
+ password: values.SMTP_PASSWORD,
73
+ port,
74
+ requireTls: booleanValue(values, "SMTP_REQUIRE_TLS", false),
75
+ secure: booleanValue(values, "SMTP_SECURE", false),
76
+ user: values.SMTP_USER,
77
+ };
78
+ if (!smtp.secure && !smtp.requireTls && !allowInsecure) {
79
+ throw new TypeError("SMTP must use SMTP_SECURE=true or SMTP_REQUIRE_TLS=true outside development and test.");
80
+ }
81
+ return smtp;
82
+ };
83
+ exports.resolveSmtp = resolveSmtp;
84
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZW1haWwvY29uZmlnL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUtBLDZEQUEyRTtBQUFsRSx5SUFBQSxrQ0FBa0MsT0FBQTtBQUVwQyxNQUFNLDRCQUE0QixHQUFHLENBRzFDLGFBQTRCLEVBQ2IsRUFBRSxDQUFDLGFBQWEsQ0FBQztBQUpyQixRQUFBLDRCQUE0QixnQ0FJUDtBQU9yQixRQUFBLDBCQUEwQixHQUFHO0lBQ3hDLFdBQVc7SUFDWCxXQUFXO0lBQ1gsYUFBYTtJQUNiLFdBQVc7SUFDWCxlQUFlO0lBQ2YsV0FBVztJQUNYLGtCQUFrQjtDQUNWLENBQUM7QUFFWDs7OztHQUlHO0FBQ1UsUUFBQSx1QkFBdUIsR0FBcUM7SUFDdkUsU0FBUyxFQUFFLDZCQUE2QjtJQUN4QyxTQUFTLEVBQUUsb0JBQW9CO0lBQy9CLGFBQWEsRUFBRSxnQkFBZ0I7SUFDL0IsU0FBUyxFQUFFLE1BQU07SUFDakIsZ0JBQWdCLEVBQUUsT0FBTztJQUN6QixXQUFXLEVBQUUsT0FBTztJQUNwQixTQUFTLEVBQUUsWUFBWTtDQUN4QixDQUFDO0FBRUYsTUFBTSxhQUFhLEdBQUcsQ0FDcEIsTUFBb0QsRUFDcEQsSUFBWSxFQUNRLEVBQUU7SUFDdEIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ25DLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNuQyxDQUFDLENBQUM7QUFFRixNQUFNLFlBQVksR0FBRyxDQUNuQixNQUFvRCxFQUNwRCxJQUFZLEVBQ1osT0FBZSxFQUNmLE9BQWUsRUFDSyxFQUFFO0lBQ3RCLE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDMUMsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDeEIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLEdBQUcsT0FBTyxJQUFJLE1BQU0sR0FBRyxPQUFPLEVBQUUsQ0FBQztRQUN0RSxNQUFNLElBQUksU0FBUyxDQUNqQixHQUFHLElBQUksNEJBQTRCLE9BQU8sWUFBWSxPQUFPLEdBQUcsQ0FDakUsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLENBQUM7QUFFRixNQUFNLFlBQVksR0FBRyxDQUNuQixNQUFvRCxFQUNwRCxJQUFZLEVBQ1osWUFBcUIsRUFDWixFQUFFO0lBQ1gsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMxQyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN4QixPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBQ0QsSUFBSSxLQUFLLEtBQUssTUFBTSxJQUFJLEtBQUssS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUMxQyxNQUFNLElBQUksU0FBUyxDQUFDLEdBQUcsSUFBSSxvQ0FBb0MsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFDRCxPQUFPLEtBQUssS0FBSyxNQUFNLENBQUM7QUFDMUIsQ0FBQyxDQUFDO0FBRUY7Ozs7R0FJRztBQUNJLE1BQU0sV0FBVyxHQUFHLENBQ3pCLE1BQTZFLEVBQzdFLGFBQXNCLEVBQ0ssRUFBRTtJQUM3QixNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDekQsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDdkIsTUFBTSxJQUFJLFNBQVMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFDRCxJQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQ3pELE1BQU0sSUFBSSxTQUFTLENBQUMsMENBQTBDLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUc7UUFDWCxJQUFJLEVBQUUsTUFBTSxDQUFDLFNBQVM7UUFDdEIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxTQUFTO1FBQ3RCLFFBQVEsRUFBRSxNQUFNLENBQUMsYUFBYTtRQUM5QixJQUFJO1FBQ0osVUFBVSxFQUFFLFlBQVksQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxDQUFDO1FBQzNELE1BQU0sRUFBRSxZQUFZLENBQUMsTUFBTSxFQUFFLGFBQWEsRUFBRSxLQUFLLENBQUM7UUFDbEQsSUFBSSxFQUFFLE1BQU0sQ0FBQyxTQUFTO0tBQ3ZCLENBQUM7SUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2RCxNQUFNLElBQUksU0FBUyxDQUNqQix1RkFBdUYsQ0FDeEYsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMsQ0FBQztBQTNCVyxRQUFBLFdBQVcsZUEyQnRCIn0=
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createSmtpNotificationModuleConfig = void 0;
4
+ const createSmtpNotificationModuleConfig = (smtp) => ({
5
+ resolve: "@medusajs/medusa/notification",
6
+ options: {
7
+ providers: [
8
+ {
9
+ id: "smtp",
10
+ options: {
11
+ channels: ["email"],
12
+ smtp,
13
+ },
14
+ resolve: "@hartl-services/medusa-base/providers/smtp",
15
+ },
16
+ ],
17
+ },
18
+ });
19
+ exports.createSmtpNotificationModuleConfig = createSmtpNotificationModuleConfig;
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLW1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9lbWFpbC9jb25maWcvbm90aWZpY2F0aW9uLW1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFTyxNQUFNLGtDQUFrQyxHQUFHLENBQ2hELElBQStCLEVBQy9CLEVBQUUsQ0FBQyxDQUFDO0lBQ0osT0FBTyxFQUFFLCtCQUErQjtJQUN4QyxPQUFPLEVBQUU7UUFDUCxTQUFTLEVBQUU7WUFDVDtnQkFDRSxFQUFFLEVBQUUsTUFBTTtnQkFDVixPQUFPLEVBQUU7b0JBQ1AsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDO29CQUNuQixJQUFJO2lCQUNMO2dCQUNELE9BQU8sRUFBRSw0Q0FBNEM7YUFDdEQ7U0FDRjtLQUNGO0NBQ0YsQ0FBQyxDQUFDO0FBaEJVLFFBQUEsa0NBQWtDLHNDQWdCNUMifQ==
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.adminResendBusinessKey = exports.affiliateConsignmentBusinessKey = exports.userInviteBusinessKey = exports.passwordResetBusinessKey = exports.orderRefundedBusinessKey = exports.returnReceivedBusinessKey = exports.returnRequestedBusinessKey = exports.orderCanceledBusinessKey = exports.orderShippedBusinessKey = exports.orderReceivedAdminBusinessKey = exports.orderReceivedBusinessKey = void 0;
4
+ const node_crypto_1 = require("node:crypto");
5
+ const affiliate_1 = require("@hartl-services/medusa-food-supplements-contracts/events/affiliate");
6
+ const normalizedIdentifier = (value, name) => {
7
+ const normalized = value.trim();
8
+ if (!normalized) {
9
+ throw new Error(`${name} must not be empty.`);
10
+ }
11
+ return normalized;
12
+ };
13
+ const orderReceivedBusinessKey = (orderId) => `order-received:${normalizedIdentifier(orderId, "orderId")}`;
14
+ exports.orderReceivedBusinessKey = orderReceivedBusinessKey;
15
+ const orderReceivedAdminBusinessKey = (orderId) => `order-received-admin:${normalizedIdentifier(orderId, "orderId")}`;
16
+ exports.orderReceivedAdminBusinessKey = orderReceivedAdminBusinessKey;
17
+ const orderShippedBusinessKey = (fulfillmentId) => `order-shipped:${normalizedIdentifier(fulfillmentId, "fulfillmentId")}`;
18
+ exports.orderShippedBusinessKey = orderShippedBusinessKey;
19
+ const orderCanceledBusinessKey = (orderId) => `order-canceled:${normalizedIdentifier(orderId, "orderId")}`;
20
+ exports.orderCanceledBusinessKey = orderCanceledBusinessKey;
21
+ const returnRequestedBusinessKey = (returnId) => `return-requested:${normalizedIdentifier(returnId, "returnId")}`;
22
+ exports.returnRequestedBusinessKey = returnRequestedBusinessKey;
23
+ const returnReceivedBusinessKey = (returnId) => `return-received:${normalizedIdentifier(returnId, "returnId")}`;
24
+ exports.returnReceivedBusinessKey = returnReceivedBusinessKey;
25
+ const orderRefundedBusinessKey = (refundId) => `refund:${normalizedIdentifier(refundId, "refundId")}`;
26
+ exports.orderRefundedBusinessKey = orderRefundedBusinessKey;
27
+ const passwordResetBusinessKey = (token) => {
28
+ if (!token) {
29
+ throw new Error("token must not be empty.");
30
+ }
31
+ const tokenHash = (0, node_crypto_1.createHash)("sha256").update(token, "utf8").digest("hex");
32
+ return `password-reset:${tokenHash}`;
33
+ };
34
+ exports.passwordResetBusinessKey = passwordResetBusinessKey;
35
+ const userInviteBusinessKey = (token) => {
36
+ if (!token) {
37
+ throw new Error("token must not be empty.");
38
+ }
39
+ // Keyed by token, not invite ID: a resend (invite.resent) issues a new
40
+ // token for the same invite and must produce a new message, the same way
41
+ // password-reset keys by token rather than customer ID.
42
+ const tokenHash = (0, node_crypto_1.createHash)("sha256").update(token, "utf8").digest("hex");
43
+ return `user-invite:${tokenHash}`;
44
+ };
45
+ exports.userInviteBusinessKey = userInviteBusinessKey;
46
+ const affiliateConsignmentBusinessKey = (affiliateId, periodStart) => (0, affiliate_1.createAffiliateConsignmentReminderKey)(affiliateId, periodStart);
47
+ exports.affiliateConsignmentBusinessKey = affiliateConsignmentBusinessKey;
48
+ const adminResendBusinessKey = (originalMessageId, requestId) => `admin-resend:${normalizedIdentifier(originalMessageId, "originalMessageId")}:${normalizedIdentifier(requestId, "requestId")}`;
49
+ exports.adminResendBusinessKey = adminResendBusinessKey;
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVzaW5lc3Mta2V5cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9lbWFpbC9kb21haW4vYnVzaW5lc3Mta2V5cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBeUM7QUFFekMsa0dBQTJIO0FBRTNILE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxLQUFhLEVBQUUsSUFBWSxFQUFVLEVBQUU7SUFDbkUsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2hDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsSUFBSSxxQkFBcUIsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFDRCxPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDLENBQUM7QUFFSyxNQUFNLHdCQUF3QixHQUFHLENBQUMsT0FBZSxFQUFVLEVBQUUsQ0FDbEUsa0JBQWtCLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDO0FBRGxELFFBQUEsd0JBQXdCLDRCQUMwQjtBQUV4RCxNQUFNLDZCQUE2QixHQUFHLENBQUMsT0FBZSxFQUFVLEVBQUUsQ0FDdkUsd0JBQXdCLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDO0FBRHhELFFBQUEsNkJBQTZCLGlDQUMyQjtBQUU5RCxNQUFNLHVCQUF1QixHQUFHLENBQUMsYUFBcUIsRUFBVSxFQUFFLENBQ3ZFLGlCQUFpQixvQkFBb0IsQ0FBQyxhQUFhLEVBQUUsZUFBZSxDQUFDLEVBQUUsQ0FBQztBQUQ3RCxRQUFBLHVCQUF1QiwyQkFDc0M7QUFFbkUsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLE9BQWUsRUFBVSxFQUFFLENBQ2xFLGtCQUFrQixvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQztBQURsRCxRQUFBLHdCQUF3Qiw0QkFDMEI7QUFFeEQsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLFFBQWdCLEVBQVUsRUFBRSxDQUNyRSxvQkFBb0Isb0JBQW9CLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUM7QUFEdEQsUUFBQSwwQkFBMEIsOEJBQzRCO0FBRTVELE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxRQUFnQixFQUFVLEVBQUUsQ0FDcEUsbUJBQW1CLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDO0FBRHJELFFBQUEseUJBQXlCLDZCQUM0QjtBQUUzRCxNQUFNLHdCQUF3QixHQUFHLENBQUMsUUFBZ0IsRUFBVSxFQUFFLENBQ25FLFVBQVUsb0JBQW9CLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUM7QUFENUMsUUFBQSx3QkFBd0IsNEJBQ29CO0FBRWxELE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxLQUFhLEVBQVUsRUFBRTtJQUNoRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUNELE1BQU0sU0FBUyxHQUFHLElBQUEsd0JBQVUsRUFBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzRSxPQUFPLGtCQUFrQixTQUFTLEVBQUUsQ0FBQztBQUN2QyxDQUFDLENBQUM7QUFOVyxRQUFBLHdCQUF3Qiw0QkFNbkM7QUFFSyxNQUFNLHFCQUFxQixHQUFHLENBQUMsS0FBYSxFQUFVLEVBQUU7SUFDN0QsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRCx1RUFBdUU7SUFDdkUseUVBQXlFO0lBQ3pFLHdEQUF3RDtJQUN4RCxNQUFNLFNBQVMsR0FBRyxJQUFBLHdCQUFVLEVBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0UsT0FBTyxlQUFlLFNBQVMsRUFBRSxDQUFDO0FBQ3BDLENBQUMsQ0FBQztBQVRXLFFBQUEscUJBQXFCLHlCQVNoQztBQUVLLE1BQU0sK0JBQStCLEdBQUcsQ0FDN0MsV0FBbUIsRUFDbkIsV0FBbUIsRUFDWCxFQUFFLENBQUMsSUFBQSxpREFBcUMsRUFBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFIaEUsUUFBQSwrQkFBK0IsbUNBR2lDO0FBRXRFLE1BQU0sc0JBQXNCLEdBQUcsQ0FDcEMsaUJBQXlCLEVBQ3pCLFNBQWlCLEVBQ1QsRUFBRSxDQUNWLGdCQUFnQixvQkFBb0IsQ0FDbEMsaUJBQWlCLEVBQ2pCLG1CQUFtQixDQUNwQixJQUFJLG9CQUFvQixDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDO0FBUHpDLFFBQUEsc0JBQXNCLDBCQU9tQiJ9
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fingerprintDocumentsFact = void 0;
4
+ const node_crypto_1 = require("node:crypto");
5
+ const fingerprintDocumentsFact = (value) => (0, node_crypto_1.createHash)("sha256").update(JSON.stringify(value)).digest("hex");
6
+ exports.fingerprintDocumentsFact = fingerprintDocumentsFact;
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnRzLWZhY3QtZmluZ2VycHJpbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvZW1haWwvZG9tYWluL2RvY3VtZW50cy1mYWN0LWZpbmdlcnByaW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUF5QztBQUVsQyxNQUFNLHdCQUF3QixHQUFHLENBQUMsS0FBYyxFQUFVLEVBQUUsQ0FDakUsSUFBQSx3QkFBVSxFQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBRHRELFFBQUEsd0JBQXdCLDRCQUM4QiJ9
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NativeInviteEventSchema = exports.NativePasswordResetEventSchema = exports.NativeShipmentCreatedEventSchema = exports.NativeReturnEventSchema = exports.NativeOrderEventSchema = void 0;
4
+ const zod_1 = require("@medusajs/framework/zod");
5
+ const NonEmptyStringSchema = zod_1.z.string().trim().min(1);
6
+ exports.NativeOrderEventSchema = zod_1.z
7
+ .object({
8
+ id: NonEmptyStringSchema,
9
+ })
10
+ .strict();
11
+ exports.NativeReturnEventSchema = zod_1.z
12
+ .object({
13
+ order_id: NonEmptyStringSchema,
14
+ return_id: NonEmptyStringSchema,
15
+ })
16
+ .strict();
17
+ exports.NativeShipmentCreatedEventSchema = zod_1.z
18
+ .object({
19
+ id: NonEmptyStringSchema,
20
+ no_notification: zod_1.z.boolean().optional(),
21
+ })
22
+ .strict();
23
+ exports.NativePasswordResetEventSchema = zod_1.z
24
+ .object({
25
+ entity_id: NonEmptyStringSchema,
26
+ actor_type: NonEmptyStringSchema,
27
+ token: NonEmptyStringSchema,
28
+ metadata: zod_1.z.record(zod_1.z.string(), zod_1.z.unknown()).optional(),
29
+ })
30
+ .strict();
31
+ exports.NativeInviteEventSchema = zod_1.z
32
+ .object({
33
+ id: NonEmptyStringSchema,
34
+ })
35
+ .strict();
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtc2NoZW1hcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9lbWFpbC9kb21haW4vZXZlbnQtc2NoZW1hcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpREFBNEM7QUFFNUMsTUFBTSxvQkFBb0IsR0FBRyxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRXpDLFFBQUEsc0JBQXNCLEdBQUcsT0FBQztLQUNwQyxNQUFNLENBQUM7SUFDTixFQUFFLEVBQUUsb0JBQW9CO0NBQ3pCLENBQUM7S0FDRCxNQUFNLEVBQUUsQ0FBQztBQUVDLFFBQUEsdUJBQXVCLEdBQUcsT0FBQztLQUNyQyxNQUFNLENBQUM7SUFDTixRQUFRLEVBQUUsb0JBQW9CO0lBQzlCLFNBQVMsRUFBRSxvQkFBb0I7Q0FDaEMsQ0FBQztLQUNELE1BQU0sRUFBRSxDQUFDO0FBRUMsUUFBQSxnQ0FBZ0MsR0FBRyxPQUFDO0tBQzlDLE1BQU0sQ0FBQztJQUNOLEVBQUUsRUFBRSxvQkFBb0I7SUFDeEIsZUFBZSxFQUFFLE9BQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Q0FDeEMsQ0FBQztLQUNELE1BQU0sRUFBRSxDQUFDO0FBRUMsUUFBQSw4QkFBOEIsR0FBRyxPQUFDO0tBQzVDLE1BQU0sQ0FBQztJQUNOLFNBQVMsRUFBRSxvQkFBb0I7SUFDL0IsVUFBVSxFQUFFLG9CQUFvQjtJQUNoQyxLQUFLLEVBQUUsb0JBQW9CO0lBQzNCLFFBQVEsRUFBRSxPQUFDLENBQUMsTUFBTSxDQUFDLE9BQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxPQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUU7Q0FDdkQsQ0FBQztLQUNELE1BQU0sRUFBRSxDQUFDO0FBRUMsUUFBQSx1QkFBdUIsR0FBRyxPQUFDO0tBQ3JDLE1BQU0sQ0FBQztJQUNOLEVBQUUsRUFBRSxvQkFBb0I7Q0FDekIsQ0FBQztLQUNELE1BQU0sRUFBRSxDQUFDIn0=