@hszrdm/core 1.1.0 → 1.3.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 (146) hide show
  1. package/.medusa/server/src/admin/index.js +4041 -2995
  2. package/.medusa/server/src/admin/index.mjs +4043 -2997
  3. package/.medusa/server/src/api/admin/ai-translations/apply/route.d.ts +11 -0
  4. package/.medusa/server/src/api/admin/ai-translations/apply/route.js +102 -0
  5. package/.medusa/server/src/api/admin/ai-translations/preview/route.d.ts +10 -0
  6. package/.medusa/server/src/api/admin/ai-translations/preview/route.js +141 -0
  7. package/.medusa/server/src/api/admin/ai-translations/route.d.ts +2 -0
  8. package/.medusa/server/src/api/admin/ai-translations/route.js +19 -0
  9. package/.medusa/server/src/api/admin/email/preview/route.d.ts +2 -0
  10. package/.medusa/server/src/api/admin/email/preview/route.js +20 -0
  11. package/.medusa/server/src/api/admin/email/templates/[id]/route.d.ts +4 -0
  12. package/.medusa/server/src/api/admin/email/templates/[id]/route.js +25 -0
  13. package/.medusa/server/src/api/admin/email/templates/route.d.ts +3 -0
  14. package/.medusa/server/src/api/admin/email/templates/route.js +40 -0
  15. package/.medusa/server/src/api/admin/email/test-send/route.d.ts +2 -0
  16. package/.medusa/server/src/api/admin/email/test-send/route.js +64 -0
  17. package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/cancel/route.d.ts +2 -0
  18. package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/cancel/route.js +15 -0
  19. package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/route.d.ts +4 -0
  20. package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/route.js +39 -0
  21. package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/send/route.d.ts +2 -0
  22. package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/send/route.js +14 -0
  23. package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/stats/route.d.ts +2 -0
  24. package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/stats/route.js +17 -0
  25. package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/test-send/route.d.ts +2 -0
  26. package/.medusa/server/src/api/admin/newsletter/campaigns/[id]/test-send/route.js +23 -0
  27. package/.medusa/server/src/api/admin/newsletter/campaigns/route.d.ts +3 -0
  28. package/.medusa/server/src/api/admin/newsletter/campaigns/route.js +40 -0
  29. package/.medusa/server/src/api/admin/newsletter/subscribers/export/route.d.ts +2 -0
  30. package/.medusa/server/src/api/admin/newsletter/subscribers/export/route.js +74 -0
  31. package/.medusa/server/src/api/admin/newsletter/subscribers/route.d.ts +2 -0
  32. package/.medusa/server/src/api/admin/newsletter/subscribers/route.js +57 -0
  33. package/.medusa/server/src/api/admin/product-reviews/[id]/route.d.ts +7 -0
  34. package/.medusa/server/src/api/admin/product-reviews/[id]/route.js +40 -0
  35. package/.medusa/server/src/api/admin/product-reviews/route.d.ts +2 -0
  36. package/.medusa/server/src/api/admin/product-reviews/route.js +31 -0
  37. package/.medusa/server/src/api/hooks/email/status/route.d.ts +2 -0
  38. package/.medusa/server/src/api/hooks/email/status/route.js +69 -0
  39. package/.medusa/server/src/api/middlewares.js +9 -1
  40. package/.medusa/server/src/api/store/account/wishlist/[productId]/route.d.ts +2 -0
  41. package/.medusa/server/src/api/store/account/wishlist/[productId]/route.js +18 -0
  42. package/.medusa/server/src/api/store/account/wishlist/merge/route.d.ts +6 -0
  43. package/.medusa/server/src/api/store/account/wishlist/merge/route.js +51 -0
  44. package/.medusa/server/src/api/store/account/wishlist/route.d.ts +7 -0
  45. package/.medusa/server/src/api/store/account/wishlist/route.js +76 -0
  46. package/.medusa/server/src/api/store/cms/entries/[slug]/route.js +4 -4
  47. package/.medusa/server/src/api/store/cms/entries/route.js +4 -4
  48. package/.medusa/server/src/api/store/email/track/click/[token]/route.d.ts +2 -0
  49. package/.medusa/server/src/api/store/email/track/click/[token]/route.js +19 -0
  50. package/.medusa/server/src/api/store/email/track/open/[token]/route.d.ts +2 -0
  51. package/.medusa/server/src/api/store/email/track/open/[token]/route.js +22 -0
  52. package/.medusa/server/src/api/store/leads/route.js +27 -93
  53. package/.medusa/server/src/api/store/newsletter/config/route.d.ts +2 -0
  54. package/.medusa/server/src/api/store/newsletter/config/route.js +14 -0
  55. package/.medusa/server/src/api/store/newsletter/confirm/route.d.ts +4 -0
  56. package/.medusa/server/src/api/store/newsletter/confirm/route.js +52 -0
  57. package/.medusa/server/src/api/store/newsletter/route.d.ts +4 -0
  58. package/.medusa/server/src/api/store/newsletter/route.js +89 -0
  59. package/.medusa/server/src/api/store/newsletter/unsubscribe/route.d.ts +4 -0
  60. package/.medusa/server/src/api/store/newsletter/unsubscribe/route.js +54 -0
  61. package/.medusa/server/src/api/store/products/[id]/reviews/route.d.ts +8 -0
  62. package/.medusa/server/src/api/store/products/[id]/reviews/route.js +174 -0
  63. package/.medusa/server/src/api/store/quote-requests/route.js +41 -129
  64. package/.medusa/server/src/config.js +38 -15
  65. package/.medusa/server/src/core/ai-translation.d.ts +26 -0
  66. package/.medusa/server/src/core/ai-translation.js +173 -0
  67. package/.medusa/server/src/core/customer-email.d.ts +5 -5
  68. package/.medusa/server/src/core/customer-email.js +55 -109
  69. package/.medusa/server/src/core/transactional-email.d.ts +9 -8
  70. package/.medusa/server/src/core/transactional-email.js +74 -244
  71. package/.medusa/server/src/core/version.d.ts +2 -2
  72. package/.medusa/server/src/core/version.js +2 -2
  73. package/.medusa/server/src/jobs/email-campaign-dispatch.d.ts +6 -0
  74. package/.medusa/server/src/jobs/email-campaign-dispatch.js +18 -0
  75. package/.medusa/server/src/modules/cms/config.d.ts +2 -1
  76. package/.medusa/server/src/modules/cms/config.js +27 -12
  77. package/.medusa/server/src/modules/cms/content-types.d.ts +24 -0
  78. package/.medusa/server/src/modules/cms/content-types.js +27 -0
  79. package/.medusa/server/src/modules/cms/index.d.ts +1 -0
  80. package/.medusa/server/src/modules/cms/index.js +6 -2
  81. package/.medusa/server/src/modules/email-center/campaign.d.ts +8 -0
  82. package/.medusa/server/src/modules/email-center/campaign.js +193 -0
  83. package/.medusa/server/src/modules/email-center/constants.d.ts +1 -0
  84. package/.medusa/server/src/modules/email-center/constants.js +5 -0
  85. package/.medusa/server/src/modules/email-center/defaults.d.ts +10 -0
  86. package/.medusa/server/src/modules/email-center/defaults.js +49 -0
  87. package/.medusa/server/src/modules/email-center/index.d.ts +11 -0
  88. package/.medusa/server/src/modules/email-center/index.js +42 -0
  89. package/.medusa/server/src/modules/email-center/migrations/Migration20261030173000.d.ts +5 -0
  90. package/.medusa/server/src/modules/email-center/migrations/Migration20261030173000.js +25 -0
  91. package/.medusa/server/src/modules/email-center/models/email-campaign.d.ts +22 -0
  92. package/.medusa/server/src/modules/email-center/models/email-campaign.js +37 -0
  93. package/.medusa/server/src/modules/email-center/models/email-delivery.d.ts +21 -0
  94. package/.medusa/server/src/modules/email-center/models/email-delivery.js +38 -0
  95. package/.medusa/server/src/modules/email-center/models/email-template.d.ts +13 -0
  96. package/.medusa/server/src/modules/email-center/models/email-template.js +20 -0
  97. package/.medusa/server/src/modules/email-center/render.d.ts +31 -0
  98. package/.medusa/server/src/modules/email-center/render.js +92 -0
  99. package/.medusa/server/src/modules/email-center/send.d.ts +27 -0
  100. package/.medusa/server/src/modules/email-center/send.js +67 -0
  101. package/.medusa/server/src/modules/email-center/service.d.ts +56 -0
  102. package/.medusa/server/src/modules/email-center/service.js +13 -0
  103. package/.medusa/server/src/modules/email-center/tracking.d.ts +9 -0
  104. package/.medusa/server/src/modules/email-center/tracking.js +92 -0
  105. package/.medusa/server/src/modules/newsletter/config.d.ts +14 -0
  106. package/.medusa/server/src/modules/newsletter/config.js +51 -0
  107. package/.medusa/server/src/modules/newsletter/email.d.ts +9 -0
  108. package/.medusa/server/src/modules/newsletter/email.js +38 -0
  109. package/.medusa/server/src/modules/newsletter/events.d.ts +10 -0
  110. package/.medusa/server/src/modules/newsletter/events.js +34 -0
  111. package/.medusa/server/src/modules/newsletter/index.d.ts +10 -0
  112. package/.medusa/server/src/modules/newsletter/index.js +33 -0
  113. package/.medusa/server/src/modules/newsletter/migrations/Migration20261030130000.d.ts +5 -0
  114. package/.medusa/server/src/modules/newsletter/migrations/Migration20261030130000.js +18 -0
  115. package/.medusa/server/src/modules/newsletter/models/newsletter-subscriber.d.ts +21 -0
  116. package/.medusa/server/src/modules/newsletter/models/newsletter-subscriber.js +35 -0
  117. package/.medusa/server/src/modules/newsletter/service.d.ts +24 -0
  118. package/.medusa/server/src/modules/newsletter/service.js +11 -0
  119. package/.medusa/server/src/modules/newsletter/token.d.ts +10 -0
  120. package/.medusa/server/src/modules/newsletter/token.js +97 -0
  121. package/.medusa/server/src/modules/product-review/config.d.ts +5 -0
  122. package/.medusa/server/src/modules/product-review/config.js +10 -0
  123. package/.medusa/server/src/modules/product-review/index.d.ts +7 -0
  124. package/.medusa/server/src/modules/product-review/index.js +18 -0
  125. package/.medusa/server/src/modules/product-review/migrations/Migration20261030160100.d.ts +5 -0
  126. package/.medusa/server/src/modules/product-review/migrations/Migration20261030160100.js +18 -0
  127. package/.medusa/server/src/modules/product-review/models/product-review.d.ts +16 -0
  128. package/.medusa/server/src/modules/product-review/models/product-review.js +26 -0
  129. package/.medusa/server/src/modules/product-review/service.d.ts +25 -0
  130. package/.medusa/server/src/modules/product-review/service.js +12 -0
  131. package/.medusa/server/src/modules/wishlist/index.d.ts +5 -0
  132. package/.medusa/server/src/modules/wishlist/index.js +14 -0
  133. package/.medusa/server/src/modules/wishlist/migrations/Migration20261030160000.d.ts +5 -0
  134. package/.medusa/server/src/modules/wishlist/migrations/Migration20261030160000.js +17 -0
  135. package/.medusa/server/src/modules/wishlist/models/wishlist-item.d.ts +6 -0
  136. package/.medusa/server/src/modules/wishlist/models/wishlist-item.js +14 -0
  137. package/.medusa/server/src/modules/wishlist/service.d.ts +15 -0
  138. package/.medusa/server/src/modules/wishlist/service.js +12 -0
  139. package/.medusa/server/src/providers/email/index.d.ts +2 -0
  140. package/.medusa/server/src/providers/email/index.js +11 -0
  141. package/.medusa/server/src/providers/email/service.d.ts +24 -0
  142. package/.medusa/server/src/providers/email/service.js +117 -0
  143. package/.medusa/server/src/scripts/core-init.js +20 -3
  144. package/.medusa/server/src/scripts/verify-bootstrap.js +1 -7
  145. package/.medusa/server/src/subscribers/transactional-email-shipment-created.js +6 -2
  146. package/package.json +4 -3
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.CmsTaxonomyTerm = exports.CmsEntry = exports.CMS_TAXONOMIES = exports.CMS_BODY_FORMATS = exports.CMS_ENTRY_STATUSES = exports.publicCmsEntry = exports.isCmsEntryPublic = exports.normalizeCmsTaxonomyInput = exports.normalizeCmsEntryInput = exports.slugifyCms = exports.loadCmsConfig = exports.CmsService = exports.CMS_MODULE = void 0;
6
+ exports.CmsTaxonomyTerm = exports.CmsEntry = exports.CMS_TAXONOMIES = exports.CMS_BODY_FORMATS = exports.CMS_ENTRY_STATUSES = exports.publicCmsEntry = exports.isCmsEntryPublic = exports.normalizeCmsTaxonomyInput = exports.normalizeCmsEntryInput = exports.slugifyCms = exports.isCoreCmsContentType = exports.CORE_CMS_CONTENT_TYPE_OPTIONS = exports.CORE_CMS_CONTENT_TYPES = exports.loadCmsConfig = exports.CmsService = exports.CMS_MODULE = void 0;
7
7
  const utils_1 = require("@medusajs/framework/utils");
8
8
  const service_1 = __importDefault(require("./service"));
9
9
  exports.CmsService = service_1.default;
@@ -13,6 +13,10 @@ exports.default = (0, utils_1.Module)(exports.CMS_MODULE, {
13
13
  });
14
14
  var config_1 = require("./config");
15
15
  Object.defineProperty(exports, "loadCmsConfig", { enumerable: true, get: function () { return config_1.loadCmsConfig; } });
16
+ var content_types_1 = require("./content-types");
17
+ Object.defineProperty(exports, "CORE_CMS_CONTENT_TYPES", { enumerable: true, get: function () { return content_types_1.CORE_CMS_CONTENT_TYPES; } });
18
+ Object.defineProperty(exports, "CORE_CMS_CONTENT_TYPE_OPTIONS", { enumerable: true, get: function () { return content_types_1.CORE_CMS_CONTENT_TYPE_OPTIONS; } });
19
+ Object.defineProperty(exports, "isCoreCmsContentType", { enumerable: true, get: function () { return content_types_1.isCoreCmsContentType; } });
16
20
  var utils_2 = require("./utils");
17
21
  Object.defineProperty(exports, "slugifyCms", { enumerable: true, get: function () { return utils_2.slugifyCms; } });
18
22
  Object.defineProperty(exports, "normalizeCmsEntryInput", { enumerable: true, get: function () { return utils_2.normalizeCmsEntryInput; } });
@@ -25,4 +29,4 @@ Object.defineProperty(exports, "CMS_BODY_FORMATS", { enumerable: true, get: func
25
29
  Object.defineProperty(exports, "CMS_TAXONOMIES", { enumerable: true, get: function () { return cms_1.CMS_TAXONOMIES; } });
26
30
  Object.defineProperty(exports, "CmsEntry", { enumerable: true, get: function () { return cms_1.CmsEntry; } });
27
31
  Object.defineProperty(exports, "CmsTaxonomyTerm", { enumerable: true, get: function () { return cms_1.CmsTaxonomyTerm; } });
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9jbXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEscURBQWtEO0FBQ2xELHdEQUFrQztBQVF6QixxQkFSRixpQkFBVSxDQVFFO0FBTk4sUUFBQSxVQUFVLEdBQUcsS0FBSyxDQUFBO0FBRS9CLGtCQUFlLElBQUEsY0FBTSxFQUFDLGtCQUFVLEVBQUU7SUFDaEMsT0FBTyxFQUFFLGlCQUFVO0NBQ3BCLENBQUMsQ0FBQTtBQUdGLG1DQUF1RjtBQUE5RSx1R0FBQSxhQUFhLE9BQUE7QUFDdEIsaUNBTWdCO0FBTGQsbUdBQUEsVUFBVSxPQUFBO0FBQ1YsK0dBQUEsc0JBQXNCLE9BQUE7QUFDdEIsa0hBQUEseUJBQXlCLE9BQUE7QUFDekIseUdBQUEsZ0JBQWdCLE9BQUE7QUFDaEIsdUdBQUEsY0FBYyxPQUFBO0FBRWhCLG9DQU1xQjtBQUxuQix5R0FBQSxrQkFBa0IsT0FBQTtBQUNsQix1R0FBQSxnQkFBZ0IsT0FBQTtBQUNoQixxR0FBQSxjQUFjLE9BQUE7QUFDZCwrRkFBQSxRQUFRLE9BQUE7QUFDUixzR0FBQSxlQUFlLE9BQUEifQ==
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9jbXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEscURBQWtEO0FBQ2xELHdEQUFrQztBQVF6QixxQkFSRixpQkFBVSxDQVFFO0FBTk4sUUFBQSxVQUFVLEdBQUcsS0FBSyxDQUFBO0FBRS9CLGtCQUFlLElBQUEsY0FBTSxFQUFDLGtCQUFVLEVBQUU7SUFDaEMsT0FBTyxFQUFFLGlCQUFVO0NBQ3BCLENBQUMsQ0FBQTtBQUdGLG1DQUF1RjtBQUE5RSx1R0FBQSxhQUFhLE9BQUE7QUFDdEIsaURBTXdCO0FBTHRCLHVIQUFBLHNCQUFzQixPQUFBO0FBQ3RCLDhIQUFBLDZCQUE2QixPQUFBO0FBQzdCLHFIQUFBLG9CQUFvQixPQUFBO0FBSXRCLGlDQU1nQjtBQUxkLG1HQUFBLFVBQVUsT0FBQTtBQUNWLCtHQUFBLHNCQUFzQixPQUFBO0FBQ3RCLGtIQUFBLHlCQUF5QixPQUFBO0FBQ3pCLHlHQUFBLGdCQUFnQixPQUFBO0FBQ2hCLHVHQUFBLGNBQWMsT0FBQTtBQUVoQixvQ0FNcUI7QUFMbkIseUdBQUEsa0JBQWtCLE9BQUE7QUFDbEIsdUdBQUEsZ0JBQWdCLE9BQUE7QUFDaEIscUdBQUEsY0FBYyxPQUFBO0FBQ2QsK0ZBQUEsUUFBUSxPQUFBO0FBQ1Isc0dBQUEsZUFBZSxPQUFBIn0=
@@ -0,0 +1,8 @@
1
+ type Container = {
2
+ resolve: (key: string) => unknown;
3
+ };
4
+ export declare function prepareCampaign(container: Container, campaignId: string): Promise<any>;
5
+ export declare function processCampaignBatch(container: Container, campaignId: string, batchSize?: number): Promise<any>;
6
+ export declare function refreshCampaignStats(container: Container, campaignId: string): Promise<InferEntityType<T[Key]>>;
7
+ export declare function dispatchDueCampaigns(container: Container): Promise<void>;
8
+ export {};
@@ -0,0 +1,193 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.prepareCampaign = prepareCampaign;
4
+ exports.processCampaignBatch = processCampaignBatch;
5
+ exports.refreshCampaignStats = refreshCampaignStats;
6
+ exports.dispatchDueCampaigns = dispatchDueCampaigns;
7
+ const utils_1 = require("@medusajs/framework/utils");
8
+ const constants_1 = require("./constants");
9
+ const newsletter_1 = require("../newsletter");
10
+ const render_1 = require("./render");
11
+ const send_1 = require("./send");
12
+ async function prepareCampaign(container, campaignId) {
13
+ const email = container.resolve(constants_1.EMAIL_CENTER_MODULE);
14
+ const newsletter = container.resolve(newsletter_1.NEWSLETTER_MODULE);
15
+ const campaign = await email.retrieveEmailCampaign(campaignId);
16
+ const metadata = record(campaign.metadata);
17
+ if (metadata.recipient_snapshot_complete === true)
18
+ return campaign;
19
+ // Snapshot creation is resumable. If the process dies after creating only a
20
+ // subset of delivery rows, the next locked run scans existing subscriber IDs
21
+ // and fills only the missing recipients instead of assuming the snapshot is complete.
22
+ const existingSubscriberIds = new Set();
23
+ let deliverySkip = 0;
24
+ const deliveryPageSize = 1000;
25
+ while (true) {
26
+ const page = await email.listEmailDeliveries({ campaign_id: campaignId }, { take: deliveryPageSize, skip: deliverySkip, order: { created_at: "ASC" } });
27
+ for (const delivery of page) {
28
+ const subscriberId = delivery.metadata?.subscriber_id || subscriberIdFromDelivery(delivery.idempotency_key, campaignId);
29
+ if (subscriberId)
30
+ existingSubscriberIds.add(String(subscriberId));
31
+ }
32
+ if (page.length < deliveryPageSize)
33
+ break;
34
+ deliverySkip += deliveryPageSize;
35
+ }
36
+ const pageSize = 1000;
37
+ let skip = 0;
38
+ let totalRecipients = existingSubscriberIds.size;
39
+ while (true) {
40
+ const subscribers = await newsletter.listNewsletterSubscribers({ status: "subscribed" }, { take: pageSize, skip, order: { created_at: "ASC" } });
41
+ if (!subscribers.length)
42
+ break;
43
+ const recipients = subscribers.filter((subscriber) => matchesSegment(subscriber, campaign.segment || {}) && !existingSubscriberIds.has(String(subscriber.id)));
44
+ for (let offset = 0; offset < recipients.length; offset += 500) {
45
+ const slice = recipients.slice(offset, offset + 500);
46
+ const batch = slice.map((subscriber) => ({
47
+ campaign_id: campaignId,
48
+ template_key: campaign.template_key || null,
49
+ recipient_email: subscriber.email,
50
+ locale: (0, render_1.normalizeLocale)(campaign.locale),
51
+ status: "queued",
52
+ idempotency_key: `email-campaign:${campaignId}:${subscriber.id}`,
53
+ metadata: { subscriber_id: subscriber.id },
54
+ }));
55
+ if (batch.length) {
56
+ await email.createEmailDeliveries(batch);
57
+ for (const subscriber of slice)
58
+ existingSubscriberIds.add(String(subscriber.id));
59
+ totalRecipients += batch.length;
60
+ }
61
+ }
62
+ if (subscribers.length < pageSize)
63
+ break;
64
+ skip += pageSize;
65
+ }
66
+ return email.updateEmailCampaigns({
67
+ id: campaignId,
68
+ total_recipients: totalRecipients,
69
+ status: "sending",
70
+ started_at: campaign.started_at || new Date(),
71
+ metadata: { ...metadata, recipient_snapshot_complete: true },
72
+ });
73
+ }
74
+ async function processCampaignBatch(container, campaignId, batchSize = 50) {
75
+ const locking = container.resolve("locking");
76
+ return locking.execute(`email-campaign:${campaignId}`, () => processCampaignBatchUnlocked(container, campaignId, batchSize), { timeout: 1, expire: 300 });
77
+ }
78
+ async function processCampaignBatchUnlocked(container, campaignId, batchSize) {
79
+ const service = container.resolve(constants_1.EMAIL_CENTER_MODULE);
80
+ const beforePrepare = await service.retrieveEmailCampaign(campaignId);
81
+ if (["cancelled", "sent", "failed"].includes(beforePrepare.status))
82
+ return beforePrepare;
83
+ const campaign = await prepareCampaign(container, campaignId);
84
+ if (["cancelled", "sent", "failed"].includes(campaign.status))
85
+ return campaign;
86
+ const deliveries = await service.listEmailDeliveries({ campaign_id: campaignId, status: "queued" }, { take: batchSize, order: { created_at: "ASC" } });
87
+ const newsletterConfig = (0, newsletter_1.loadNewsletterConfig)();
88
+ for (const delivery of deliveries) {
89
+ const subscriberId = delivery.metadata?.subscriber_id;
90
+ const unsubscribeToken = subscriberId
91
+ ? (0, newsletter_1.createNewsletterUnsubscribeToken)(String(subscriberId), delivery.recipient_email)
92
+ : null;
93
+ const unsubscribeUrl = unsubscribeToken
94
+ ? (0, newsletter_1.newsletterUnsubscribeUrl)(unsubscribeToken, newsletterConfig)
95
+ : "";
96
+ const data = (0, render_1.emailVariables)({
97
+ email: delivery.recipient_email,
98
+ unsubscribe_url: unsubscribeUrl,
99
+ });
100
+ let content = {
101
+ subject: (0, render_1.renderTemplateString)(campaign.subject, data, false),
102
+ html: (0, render_1.renderTemplateString)(campaign.html, data, true),
103
+ text: (0, render_1.renderTemplateString)(campaign.text, data, false),
104
+ };
105
+ content = (0, render_1.ensureMarketingUnsubscribe)(content, unsubscribeUrl, campaign.locale);
106
+ content.html = (0, render_1.renderEmailHtmlDocument)(content.html, data);
107
+ try {
108
+ await (0, send_1.sendManagedEmail)({
109
+ container,
110
+ to: delivery.recipient_email,
111
+ locale: campaign.locale,
112
+ content,
113
+ idempotencyKey: delivery.idempotency_key,
114
+ campaignId,
115
+ deliveryId: delivery.id,
116
+ track: true,
117
+ });
118
+ }
119
+ catch {
120
+ // sendManagedEmail persists the failure. Continue so one recipient cannot block the batch.
121
+ }
122
+ }
123
+ return refreshCampaignStats(container, campaignId);
124
+ }
125
+ async function refreshCampaignStats(container, campaignId) {
126
+ const service = container.resolve(constants_1.EMAIL_CENTER_MODULE);
127
+ const campaign = await service.retrieveEmailCampaign(campaignId);
128
+ const statuses = ["queued", "sent", "delivered", "opened", "clicked", "failed", "bounced"];
129
+ const counts = {};
130
+ for (const status of statuses) {
131
+ const [, count] = await service.listAndCountEmailDeliveries({ campaign_id: campaignId, status }, { take: 1 });
132
+ counts[status] = count;
133
+ }
134
+ const sent = counts.sent + counts.delivered + counts.opened + counts.clicked;
135
+ const failed = counts.failed + counts.bounced;
136
+ const complete = counts.queued === 0 && record(campaign.metadata).recipient_snapshot_complete === true;
137
+ const total = Object.values(counts).reduce((sum, count) => sum + count, 0);
138
+ const terminalStatus = complete ? (total > 0 && failed === total ? "failed" : "sent") : undefined;
139
+ return service.updateEmailCampaigns({
140
+ id: campaignId,
141
+ total_recipients: total,
142
+ sent_count: sent,
143
+ failed_count: failed,
144
+ opened_count: counts.opened + counts.clicked,
145
+ clicked_count: counts.clicked,
146
+ ...(terminalStatus ? { status: terminalStatus, completed_at: new Date() } : {}),
147
+ });
148
+ }
149
+ async function dispatchDueCampaigns(container) {
150
+ const service = container.resolve(constants_1.EMAIL_CENTER_MODULE);
151
+ const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
152
+ const scheduled = await service.listEmailCampaigns({ status: "scheduled" }, { take: 50, order: { scheduled_at: "ASC" } });
153
+ const due = scheduled.filter((campaign) => campaign.scheduled_at && new Date(campaign.scheduled_at).getTime() <= Date.now());
154
+ const sending = await service.listEmailCampaigns({ status: "sending" }, { take: 50, order: { updated_at: "ASC" } });
155
+ for (const campaign of [...due, ...sending]) {
156
+ try {
157
+ await processCampaignBatch(container, campaign.id);
158
+ }
159
+ catch (error) {
160
+ logger.error(`Email campaign ${campaign.id} batch failed: ${error instanceof Error ? error.message : String(error)}`);
161
+ }
162
+ }
163
+ }
164
+ function matchesSegment(subscriber, segment) {
165
+ const allowedSources = [
166
+ ...(segment.sources || []),
167
+ ...(segment.source ? [segment.source] : []),
168
+ ].filter(Boolean);
169
+ if (allowedSources.length && !allowedSources.includes(subscriber.source || ""))
170
+ return false;
171
+ if (segment.created_from && new Date(subscriber.created_at).getTime() < new Date(segment.created_from).getTime())
172
+ return false;
173
+ if (segment.created_to && new Date(subscriber.created_at).getTime() > new Date(segment.created_to).getTime())
174
+ return false;
175
+ if (segment.utm) {
176
+ const actual = subscriber.utm && typeof subscriber.utm === "object" ? subscriber.utm : {};
177
+ if (Object.entries(segment.utm).some(([key, value]) => String(actual[key] || "") !== String(value)))
178
+ return false;
179
+ }
180
+ return true;
181
+ }
182
+ function subscriberIdFromDelivery(idempotencyKey, campaignId) {
183
+ if (typeof idempotencyKey !== "string")
184
+ return null;
185
+ const prefix = `email-campaign:${campaignId}:`;
186
+ return idempotencyKey.startsWith(prefix) ? idempotencyKey.slice(prefix.length) || null : null;
187
+ }
188
+ function record(value) {
189
+ return value && typeof value === "object" && !Array.isArray(value)
190
+ ? value
191
+ : {};
192
+ }
193
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FtcGFpZ24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9lbWFpbC1jZW50ZXIvY2FtcGFpZ24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFXQSwwQ0FtRUM7QUFFRCxvREFPQztBQXNERCxvREEwQkM7QUFFRCxvREF1QkM7QUFoTUQscURBQXFFO0FBQ3JFLDJDQUFpRDtBQUVqRCw4Q0FBMko7QUFDM0oscUNBQXFJO0FBQ3JJLGlDQUF5QztBQU1sQyxLQUFLLFVBQVUsZUFBZSxDQUFDLFNBQW9CLEVBQUUsVUFBa0I7SUFDNUUsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQywrQkFBbUIsQ0FBdUIsQ0FBQTtJQUMxRSxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLDhCQUFpQixDQUFzQixDQUFBO0lBQzVFLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBbUMsQ0FBQTtJQUNoRyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQzFDLElBQUksUUFBUSxDQUFDLDJCQUEyQixLQUFLLElBQUk7UUFBRSxPQUFPLFFBQVEsQ0FBQTtJQUVsRSw0RUFBNEU7SUFDNUUsNkVBQTZFO0lBQzdFLHNGQUFzRjtJQUN0RixNQUFNLHFCQUFxQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUE7SUFDL0MsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFBO0lBQ3BCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFBO0lBQzdCLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDWixNQUFNLElBQUksR0FBRyxNQUFNLEtBQUssQ0FBQyxtQkFBbUIsQ0FDMUMsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFXLEVBQ3BDLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFF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
@@ -0,0 +1 @@
1
+ export declare const EMAIL_CENTER_MODULE = "emailCenter";
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EMAIL_CENTER_MODULE = void 0;
4
+ exports.EMAIL_CENTER_MODULE = "emailCenter";
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvZW1haWwtY2VudGVyL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBYSxRQUFBLG1CQUFtQixHQUFHLGFBQWEsQ0FBQSJ9
@@ -0,0 +1,10 @@
1
+ export type DefaultEmailTemplate = {
2
+ key: string;
3
+ locale: "hu-HU" | "en-US";
4
+ name: string;
5
+ subject: string;
6
+ html: string;
7
+ text: string;
8
+ };
9
+ export declare const DEFAULT_EMAIL_TEMPLATES: DefaultEmailTemplate[];
10
+ export declare function defaultEmailTemplate(key: string, locale: string): DefaultEmailTemplate | null;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_EMAIL_TEMPLATES = void 0;
4
+ exports.defaultEmailTemplate = defaultEmailTemplate;
5
+ const hu = (key, name, subject, body) => ({ key, locale: "hu-HU", name, subject, html: `<h1>${subject}</h1><p>${body}</p>`, text: `${subject}\n\n${body}` });
6
+ const en = (key, name, subject, body) => ({ key, locale: "en-US", name, subject, html: `<h1>${subject}</h1><p>${body}</p>`, text: `${subject}\n\n${body}` });
7
+ exports.DEFAULT_EMAIL_TEMPLATES = [
8
+ hu("customer.registered", "Regisztráció", "Sikeres regisztráció – {{store_name}}", "Kedves {{first_name}}! A fiókod elkészült."),
9
+ en("customer.registered", "Registration", "Welcome to {{store_name}}", "Hi {{first_name}}! Your account is ready."),
10
+ hu("customer.email_verification", "E-mail megerősítés", "E-mail-cím megerősítése – {{store_name}}", "A megerősítő kódod: {{verification_code}}"),
11
+ en("customer.email_verification", "Email verification", "Verify your email – {{store_name}}", "Your verification code: {{verification_code}}"),
12
+ hu("customer.password_reset", "Jelszó visszaállítás", "Jelszó visszaállítása – {{store_name}}", "Új jelszó beállítása: {{reset_url}}"),
13
+ en("customer.password_reset", "Password reset", "Reset your password – {{store_name}}", "Set a new password here: {{reset_url}}"),
14
+ hu("customer.password_changed", "Jelszó megváltozott", "A jelszavad megváltozott – {{store_name}}", "A fiókod jelszava sikeresen megváltozott."),
15
+ en("customer.password_changed", "Password changed", "Your password was changed – {{store_name}}", "Your account password was changed successfully."),
16
+ hu("customer.email_changed", "E-mail-cím megváltozott", "Az e-mail-címed megváltozott – {{store_name}}", "A fiókodhoz tartozó e-mail-cím sikeresen megváltozott."),
17
+ en("customer.email_changed", "Email changed", "Your email was changed – {{store_name}}", "The email address on your account was changed successfully."),
18
+ hu("customer.account_deleted", "Fiók törölve", "Fiók törölve – {{store_name}}", "A fiókod törlését feldolgoztuk."),
19
+ en("customer.account_deleted", "Account deleted", "Account deleted – {{store_name}}", "Your account deletion has been processed."),
20
+ hu("order.placed", "Rendelés beérkezett", "Rendelésed beérkezett – #{{order_number}}", "Köszönjük a rendelésed! Összeg: {{total}} {{currency_code}}."),
21
+ en("order.placed", "Order received", "We received your order – #{{order_number}}", "Thank you for your order. Total: {{total}} {{currency_code}}."),
22
+ hu("order.paid", "Fizetés sikeres", "Sikeres fizetés – #{{order_number}}", "A rendelésed fizetése sikeresen megtörtént."),
23
+ en("order.paid", "Payment received", "Payment received – #{{order_number}}", "Your payment was received successfully."),
24
+ hu("order.fulfilled", "Rendelés összekészítve", "Rendelésed összekészítve – #{{order_number}}", "A rendelésed teljesítése megkezdődött."),
25
+ en("order.fulfilled", "Order fulfilled", "Your order is being prepared – #{{order_number}}", "Your order fulfillment has started."),
26
+ hu("order.shipped", "Rendelés feladva", "Rendelésed úton van – #{{order_number}}", "A csomagod feladásra került. Nyomkövetés: {{tracking_url}}"),
27
+ en("order.shipped", "Order shipped", "Your order is on the way – #{{order_number}}", "Your package has shipped. Tracking: {{tracking_url}}"),
28
+ hu("order.cancelled", "Rendelés törölve", "Rendelés törölve – #{{order_number}}", "A rendelésed törlésre került."),
29
+ en("order.cancelled", "Order cancelled", "Order cancelled – #{{order_number}}", "Your order has been cancelled."),
30
+ hu("order.refunded", "Visszatérítés", "Visszatérítés – #{{order_number}}", "A visszatérítést rögzítettük. Összeg: {{refund_amount}} {{currency_code}}."),
31
+ en("order.refunded", "Refund", "Refund – #{{order_number}}", "Your refund has been recorded. Amount: {{refund_amount}} {{currency_code}}."),
32
+ hu("quote_request.created", "Árajánlatkérés – ügyfél", "Árajánlatkérés beérkezett – {{store_name}}", "Kedves {{contact_name}}! Köszönjük az árajánlatkérést. Hamarosan jelentkezünk."),
33
+ en("quote_request.created", "Quote request – customer", "Quote request received – {{store_name}}", "Hi {{contact_name}}! Thank you for your quote request. We will contact you soon."),
34
+ hu("quote_request.created.admin", "Árajánlatkérés – admin", "Új árajánlatkérés – {{contact_name}}", "Új árajánlatkérés érkezett. E-mail: {{contact_email}}, cég: {{company_name}}, azonosító: {{quote_request_id}}."),
35
+ en("quote_request.created.admin", "Quote request – admin", "New quote request – {{contact_name}}", "A new quote request arrived. Email: {{contact_email}}, company: {{company_name}}, ID: {{quote_request_id}}."),
36
+ hu("lead.created", "Kapcsolatfelvétel – ügyfél", "Megkeresés beérkezett – {{store_name}}", "Kedves {{name}}! Köszönjük a megkeresést. Hamarosan válaszolunk."),
37
+ en("lead.created", "Contact request – customer", "Message received – {{store_name}}", "Hi {{name}}! Thank you for contacting us. We will reply soon."),
38
+ hu("lead.created.admin", "Kapcsolatfelvétel – admin", "Új megkeresés – {{name}}", "Új lead érkezett. E-mail: {{email}}, telefon: {{phone}}, űrlap: {{form_key}}, azonosító: {{lead_id}}."),
39
+ en("lead.created.admin", "Contact request – admin", "New lead – {{name}}", "A new lead arrived. Email: {{email}}, phone: {{phone}}, form: {{form_key}}, ID: {{lead_id}}."),
40
+ hu("newsletter.confirmation", "Hírlevél megerősítés", "Erősítsd meg a feliratkozást – {{store_name}}", "Feliratkozás megerősítése: {{confirm_url}}"),
41
+ en("newsletter.confirmation", "Newsletter confirmation", "Confirm your subscription – {{store_name}}", "Confirm your subscription: {{confirm_url}}"),
42
+ ];
43
+ function defaultEmailTemplate(key, locale) {
44
+ const normalized = locale.toLowerCase().startsWith("en") ? "en-US" : "hu-HU";
45
+ return exports.DEFAULT_EMAIL_TEMPLATES.find((item) => item.key === key && item.locale === normalized)
46
+ || exports.DEFAULT_EMAIL_TEMPLATES.find((item) => item.key === key)
47
+ || null;
48
+ }
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9lbWFpbC1jZW50ZXIvZGVmYXVsdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBaURBLG9EQUtDO0FBN0NELE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBVyxFQUFFLElBQVksRUFBRSxPQUFlLEVBQUUsSUFBWSxFQUF3QixFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sT0FBTyxXQUFXLElBQUksTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLE9BQU8sT0FBTyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUE7QUFDbE4sTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFXLEVBQUUsSUFBWSxFQUFFLE9BQWUsRUFBRSxJQUFZLEVBQXdCLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxPQUFPLFdBQVcsSUFBSSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsT0FBTyxPQUFPLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQTtBQUVyTSxRQUFBLHVCQUF1QixHQUEyQjtJQUM3RCxFQUFFLENBQUMscUJBQXFCLEVBQUUsY0FBYyxFQUFFLHVDQUF1QyxFQUFFLDRDQUE0QyxDQUFDO0lBQ2hJLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSxjQUFjLEVBQUUsMkJBQTJCLEVBQUUsMkNBQTJDLENBQUM7SUFDbkgsRUFBRSxDQUFDLDZCQUE2QixFQUFFLG9CQUFvQixFQUFFLDBDQUEwQyxFQUFFLDJDQUEyQyxDQUFDO0lBQ2hKLEVBQUUsQ0FBQyw2QkFBNkIsRUFBRSxvQkFBb0IsRUFBRSxvQ0FBb0MsRUFBRSwrQ0FBK0MsQ0FBQztJQUM5SSxFQUFFLENBQUMs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
@@ -0,0 +1,11 @@
1
+ declare const _default: any;
2
+ export default _default;
3
+ export { EMAIL_CENTER_MODULE } from "./constants";
4
+ export { default as EmailCenterService } from "./service";
5
+ export { EMAIL_CAMPAIGN_STATUSES } from "./models/email-campaign";
6
+ export { EMAIL_DELIVERY_STATUSES } from "./models/email-delivery";
7
+ export { DEFAULT_EMAIL_TEMPLATES, defaultEmailTemplate } from "./defaults";
8
+ export { resolveEmailContent, renderTemplateString, normalizeLocale, emailVariables, renderEmailHtmlDocument, ensureMarketingUnsubscribe } from "./render";
9
+ export { createEmailTrackingToken, verifyEmailTrackingToken, injectEmailTracking, trackingEnabled, trackingBaseUrl } from "./tracking";
10
+ export { sendManagedEmail } from "./send";
11
+ export { prepareCampaign, processCampaignBatch, refreshCampaignStats, dispatchDueCampaigns } from "./campaign";
@@ -0,0 +1,42 @@
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.dispatchDueCampaigns = exports.refreshCampaignStats = exports.processCampaignBatch = exports.prepareCampaign = exports.sendManagedEmail = exports.trackingBaseUrl = exports.trackingEnabled = exports.injectEmailTracking = exports.verifyEmailTrackingToken = exports.createEmailTrackingToken = exports.ensureMarketingUnsubscribe = exports.renderEmailHtmlDocument = exports.emailVariables = exports.normalizeLocale = exports.renderTemplateString = exports.resolveEmailContent = exports.defaultEmailTemplate = exports.DEFAULT_EMAIL_TEMPLATES = exports.EMAIL_DELIVERY_STATUSES = exports.EMAIL_CAMPAIGN_STATUSES = exports.EmailCenterService = exports.EMAIL_CENTER_MODULE = void 0;
7
+ const utils_1 = require("@medusajs/framework/utils");
8
+ const service_1 = __importDefault(require("./service"));
9
+ const constants_1 = require("./constants");
10
+ exports.default = (0, utils_1.Module)(constants_1.EMAIL_CENTER_MODULE, { service: service_1.default });
11
+ var constants_2 = require("./constants");
12
+ Object.defineProperty(exports, "EMAIL_CENTER_MODULE", { enumerable: true, get: function () { return constants_2.EMAIL_CENTER_MODULE; } });
13
+ var service_2 = require("./service");
14
+ Object.defineProperty(exports, "EmailCenterService", { enumerable: true, get: function () { return __importDefault(service_2).default; } });
15
+ var email_campaign_1 = require("./models/email-campaign");
16
+ Object.defineProperty(exports, "EMAIL_CAMPAIGN_STATUSES", { enumerable: true, get: function () { return email_campaign_1.EMAIL_CAMPAIGN_STATUSES; } });
17
+ var email_delivery_1 = require("./models/email-delivery");
18
+ Object.defineProperty(exports, "EMAIL_DELIVERY_STATUSES", { enumerable: true, get: function () { return email_delivery_1.EMAIL_DELIVERY_STATUSES; } });
19
+ var defaults_1 = require("./defaults");
20
+ Object.defineProperty(exports, "DEFAULT_EMAIL_TEMPLATES", { enumerable: true, get: function () { return defaults_1.DEFAULT_EMAIL_TEMPLATES; } });
21
+ Object.defineProperty(exports, "defaultEmailTemplate", { enumerable: true, get: function () { return defaults_1.defaultEmailTemplate; } });
22
+ var render_1 = require("./render");
23
+ Object.defineProperty(exports, "resolveEmailContent", { enumerable: true, get: function () { return render_1.resolveEmailContent; } });
24
+ Object.defineProperty(exports, "renderTemplateString", { enumerable: true, get: function () { return render_1.renderTemplateString; } });
25
+ Object.defineProperty(exports, "normalizeLocale", { enumerable: true, get: function () { return render_1.normalizeLocale; } });
26
+ Object.defineProperty(exports, "emailVariables", { enumerable: true, get: function () { return render_1.emailVariables; } });
27
+ Object.defineProperty(exports, "renderEmailHtmlDocument", { enumerable: true, get: function () { return render_1.renderEmailHtmlDocument; } });
28
+ Object.defineProperty(exports, "ensureMarketingUnsubscribe", { enumerable: true, get: function () { return render_1.ensureMarketingUnsubscribe; } });
29
+ var tracking_1 = require("./tracking");
30
+ Object.defineProperty(exports, "createEmailTrackingToken", { enumerable: true, get: function () { return tracking_1.createEmailTrackingToken; } });
31
+ Object.defineProperty(exports, "verifyEmailTrackingToken", { enumerable: true, get: function () { return tracking_1.verifyEmailTrackingToken; } });
32
+ Object.defineProperty(exports, "injectEmailTracking", { enumerable: true, get: function () { return tracking_1.injectEmailTracking; } });
33
+ Object.defineProperty(exports, "trackingEnabled", { enumerable: true, get: function () { return tracking_1.trackingEnabled; } });
34
+ Object.defineProperty(exports, "trackingBaseUrl", { enumerable: true, get: function () { return tracking_1.trackingBaseUrl; } });
35
+ var send_1 = require("./send");
36
+ Object.defineProperty(exports, "sendManagedEmail", { enumerable: true, get: function () { return send_1.sendManagedEmail; } });
37
+ var campaign_1 = require("./campaign");
38
+ Object.defineProperty(exports, "prepareCampaign", { enumerable: true, get: function () { return campaign_1.prepareCampaign; } });
39
+ Object.defineProperty(exports, "processCampaignBatch", { enumerable: true, get: function () { return campaign_1.processCampaignBatch; } });
40
+ Object.defineProperty(exports, "refreshCampaignStats", { enumerable: true, get: function () { return campaign_1.refreshCampaignStats; } });
41
+ Object.defineProperty(exports, "dispatchDueCampaigns", { enumerable: true, get: function () { return campaign_1.dispatchDueCampaigns; } });
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9lbWFpbC1jZW50ZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEscURBQWtEO0FBQ2xELHdEQUEwQztBQUMxQywyQ0FBaUQ7QUFFakQsa0JBQWUsSUFBQSxjQUFNLEVBQUMsK0JBQW1CLEVBQUUsRUFBRSxPQUFPLEVBQUUsaUJBQWtCLEVBQUUsQ0FBQyxDQUFBO0FBQzNFLHlDQUFpRDtBQUF4QyxnSEFBQSxtQkFBbUIsT0FBQTtBQUM1QixxQ0FBeUQ7QUFBaEQsOEhBQUEsT0FBTyxPQUFzQjtBQUN0QywwREFBaUU7QUFBeEQseUhBQUEsdUJBQXVCLE9BQUE7QUFDaEMsMERBQWlFO0FBQXhELHlIQUFBLHVCQUF1QixPQUFBO0FBQ2hDLHVDQUEwRTtBQUFqRSxtSEFBQSx1QkFBdUIsT0FBQTtBQUFFLGdIQUFBLG9CQUFvQixPQUFBO0FBQ3RELG1DQUEwSjtBQUFqSiw2R0FBQSxtQkFBbUIsT0FBQTtBQUFFLDhHQUFBLG9CQUFvQixPQUFBO0FBQUUseUdBQUEsZUFBZSxPQUFBO0FBQUUsd0dBQUEsY0FBYyxPQUFBO0FBQUUsaUhBQUEsdUJBQXVCLE9BQUE7QUFBRSxvSEFBQSwwQkFBMEIsT0FBQTtBQUN4SSx1Q0FBc0k7QUFBN0gsb0hBQUEsd0JBQXdCLE9BQUE7QUFBRSxvSEFBQSx3QkFBd0IsT0FBQTtBQUFFLCtHQUFBLG1CQUFtQixPQUFBO0FBQUUsMkdBQUEsZUFBZSxPQUFBO0FBQUUsMkdBQUEsZUFBZSxPQUFBO0FBQ2xILCtCQUF5QztBQUFoQyx3R0FBQSxnQkFBZ0IsT0FBQTtBQUN6Qix1Q0FBOEc7QUFBckcsMkdBQUEsZUFBZSxPQUFBO0FBQUUsZ0hBQUEsb0JBQW9CLE9BQUE7QUFBRSxnSEFBQSxvQkFBb0IsT0FBQTtBQUFFLGdIQUFBLG9CQUFvQixPQUFBIn0=
@@ -0,0 +1,5 @@
1
+ import { Migration } from "@medusajs/framework/mikro-orm/migrations";
2
+ export declare class Migration20261030173000 extends Migration {
3
+ up(): Promise<void>;
4
+ down(): Promise<void>;
5
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20261030173000 = void 0;
4
+ const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
5
+ class Migration20261030173000 extends migrations_1.Migration {
6
+ async up() {
7
+ this.addSql(`create table if not exists "email_template" ("id" text not null, "key" text not null, "locale" text not null default 'hu-HU', "name" text not null, "subject" text not null, "html" text not null, "text" text not null, "enabled" boolean not null default true, "system" boolean not null default false, "metadata" jsonb null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "email_template_pkey" primary key ("id"));`);
8
+ this.addSql(`create unique index if not exists "IDX_email_template_key_locale" on "email_template" ("key", "locale") where deleted_at is null;`);
9
+ this.addSql(`create index if not exists "IDX_email_template_enabled_updated" on "email_template" ("enabled", "updated_at") where deleted_at is null;`);
10
+ this.addSql(`create table if not exists "email_campaign" ("id" text not null, "name" text not null, "status" text check ("status" in ('draft','scheduled','sending','sent','cancelled','failed')) not null default 'draft', "locale" text not null default 'hu-HU', "template_key" text null, "subject" text not null, "html" text not null, "text" text not null, "segment" jsonb null, "scheduled_at" timestamptz null, "started_at" timestamptz null, "completed_at" timestamptz null, "total_recipients" integer not null default 0, "sent_count" integer not null default 0, "failed_count" integer not null default 0, "opened_count" integer not null default 0, "clicked_count" integer not null default 0, "metadata" jsonb null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "email_campaign_pkey" primary key ("id"));`);
11
+ this.addSql(`create index if not exists "IDX_email_campaign_status_schedule" on "email_campaign" ("status", "scheduled_at") where deleted_at is null;`);
12
+ this.addSql(`create index if not exists "IDX_email_campaign_created" on "email_campaign" ("created_at") where deleted_at is null;`);
13
+ this.addSql(`create table if not exists "email_delivery" ("id" text not null, "campaign_id" text null, "template_key" text null, "recipient_email" text not null, "locale" text not null default 'hu-HU', "status" text check ("status" in ('queued','sent','delivered','opened','clicked','failed','bounced')) not null default 'queued', "idempotency_key" text not null, "provider_message_id" text null, "sent_at" timestamptz null, "delivered_at" timestamptz null, "failed_at" timestamptz null, "opened_at" timestamptz null, "clicked_at" timestamptz null, "open_count" integer not null default 0, "click_count" integer not null default 0, "error" text null, "metadata" jsonb null, "created_at" timestamptz not null default now(), "updated_at" timestamptz not null default now(), "deleted_at" timestamptz null, constraint "email_delivery_pkey" primary key ("id"));`);
14
+ this.addSql(`create unique index if not exists "IDX_email_delivery_idempotency" on "email_delivery" ("idempotency_key") where deleted_at is null;`);
15
+ this.addSql(`create index if not exists "IDX_email_delivery_campaign_status" on "email_delivery" ("campaign_id", "status") where deleted_at is null;`);
16
+ this.addSql(`create index if not exists "IDX_email_delivery_recipient_created" on "email_delivery" ("recipient_email", "created_at") where deleted_at is null;`);
17
+ }
18
+ async down() {
19
+ this.addSql(`drop table if exists "email_delivery" cascade;`);
20
+ this.addSql(`drop table if exists "email_campaign" cascade;`);
21
+ this.addSql(`drop table if exists "email_template" cascade;`);
22
+ }
23
+ }
24
+ exports.Migration20261030173000 = Migration20261030173000;
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjEwMzAxNzMwMDAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9lbWFpbC1jZW50ZXIvbWlncmF0aW9ucy9NaWdyYXRpb24yMDI2MTAzMDE3MzAwMC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5RUFBb0U7QUFFcEUsTUFBYSx1QkFBd0IsU0FBUSxzQkFBUztJQUNwRCxLQUFLLENBQUMsRUFBRTtRQUNOLElBQUksQ0FBQyxNQUFNLENBQUMsMGZBQTBmLENBQUMsQ0FBQTtRQUN2Z0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtSUFBbUksQ0FBQyxDQUFBO1FBQ2hKLElBQUksQ0FBQyxNQUFNLENBQUMseUlBQXlJLENBQUMsQ0FBQTtRQUN0SixJQUFJLENBQUMsTUFBTSxDQUFDLHMzQkFBczNCLENBQUMsQ0FBQTtRQUNuNEIsSUFBSSxDQUFDLE1BQU0sQ0FBQywwSUFBMEksQ0FBQyxDQUFBO1FBQ3ZKLElBQUksQ0FBQyxNQUFNLENBQUMsc0hBQXNILENBQUMsQ0FBQTtRQUNuSSxJQUFJLENBQUMsTUFBTSxDQUFDLDYwQkFBNjBCLENBQUMsQ0FBQTtRQUMxMUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxzSUFBc0ksQ0FBQyxDQUFBO1FBQ25KLElBQUksQ0FBQyxNQUFNLENBQUMseUlBQXlJLENBQUMsQ0FBQTtRQUN0SixJQUFJLENBQUMsTUFBTSxDQUFDLG1KQUFtSixDQUFDLENBQUE7SUFDbEssQ0FBQztJQUNELEtBQUssQ0FBQyxJQUFJO1FBQ1IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnREFBZ0QsQ0FBQyxDQUFBO1FBQzdELElBQUksQ0FBQyxNQUFNLENBQUMsZ0RBQWdELENBQUMsQ0FBQTtRQUM3RCxJQUFJLENBQUMsTUFBTSxDQUFDLGdEQUFnRCxDQUFDLENBQUE7SUFDL0QsQ0FBQztDQUNGO0FBbEJELDBEQWtCQyJ9
@@ -0,0 +1,22 @@
1
+ export declare const EMAIL_CAMPAIGN_STATUSES: readonly ["draft", "scheduled", "sending", "sent", "cancelled", "failed"];
2
+ declare const EmailCampaign: import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder<{
3
+ id: import("@medusajs/framework/utils").PrimaryKeyModifier<string, import("@medusajs/framework/utils").IdProperty>;
4
+ name: import("@medusajs/framework/utils").TextProperty;
5
+ status: import("@medusajs/framework/utils").EnumProperty<["draft", "scheduled", "sending", "sent", "cancelled", "failed"]>;
6
+ locale: import("@medusajs/framework/utils").TextProperty;
7
+ template_key: import("@medusajs/framework/utils").NullableModifier<string, import("@medusajs/framework/utils").TextProperty>;
8
+ subject: import("@medusajs/framework/utils").TextProperty;
9
+ html: import("@medusajs/framework/utils").TextProperty;
10
+ text: import("@medusajs/framework/utils").TextProperty;
11
+ segment: import("@medusajs/framework/utils").NullableModifier<NoInfer<Record<string, unknown>>, import("@medusajs/framework/utils").JSONProperty<NoInfer<Record<string, unknown>>>>;
12
+ scheduled_at: import("@medusajs/framework/utils").NullableModifier<Date, import("@medusajs/framework/utils").DateTimeProperty>;
13
+ started_at: import("@medusajs/framework/utils").NullableModifier<Date, import("@medusajs/framework/utils").DateTimeProperty>;
14
+ completed_at: import("@medusajs/framework/utils").NullableModifier<Date, import("@medusajs/framework/utils").DateTimeProperty>;
15
+ total_recipients: import("@medusajs/framework/utils").NumberProperty;
16
+ sent_count: import("@medusajs/framework/utils").NumberProperty;
17
+ failed_count: import("@medusajs/framework/utils").NumberProperty;
18
+ opened_count: import("@medusajs/framework/utils").NumberProperty;
19
+ clicked_count: import("@medusajs/framework/utils").NumberProperty;
20
+ metadata: import("@medusajs/framework/utils").NullableModifier<NoInfer<Record<string, unknown>>, import("@medusajs/framework/utils").JSONProperty<NoInfer<Record<string, unknown>>>>;
21
+ }>, "email_campaign">;
22
+ export default EmailCampaign;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EMAIL_CAMPAIGN_STATUSES = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ exports.EMAIL_CAMPAIGN_STATUSES = [
6
+ "draft",
7
+ "scheduled",
8
+ "sending",
9
+ "sent",
10
+ "cancelled",
11
+ "failed",
12
+ ];
13
+ const EmailCampaign = utils_1.model.define("email_campaign", {
14
+ id: utils_1.model.id().primaryKey(),
15
+ name: utils_1.model.text(),
16
+ status: utils_1.model.enum(["draft", "scheduled", "sending", "sent", "cancelled", "failed"]).default("draft"),
17
+ locale: utils_1.model.text().default("hu-HU"),
18
+ template_key: utils_1.model.text().nullable(),
19
+ subject: utils_1.model.text(),
20
+ html: utils_1.model.text(),
21
+ text: utils_1.model.text(),
22
+ segment: utils_1.model.json().nullable(),
23
+ scheduled_at: utils_1.model.dateTime().nullable(),
24
+ started_at: utils_1.model.dateTime().nullable(),
25
+ completed_at: utils_1.model.dateTime().nullable(),
26
+ total_recipients: utils_1.model.number().default(0),
27
+ sent_count: utils_1.model.number().default(0),
28
+ failed_count: utils_1.model.number().default(0),
29
+ opened_count: utils_1.model.number().default(0),
30
+ clicked_count: utils_1.model.number().default(0),
31
+ metadata: utils_1.model.json().nullable(),
32
+ }).indexes([
33
+ { on: ["status", "scheduled_at"] },
34
+ { on: ["created_at"] },
35
+ ]);
36
+ exports.default = EmailCampaign;
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1haWwtY2FtcGFpZ24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9lbWFpbC1jZW50ZXIvbW9kZWxzL2VtYWlsLWNhbXBhaWduLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFEQUFpRDtBQUVwQyxRQUFBLHVCQUF1QixHQUFHO0lBQ3JDLE9BQU87SUFDUCxXQUFXO0lBQ1gsU0FBUztJQUNULE1BQU07SUFDTixXQUFXO0lBQ1gsUUFBUTtDQUNBLENBQUE7QUFFVixNQUFNLGFBQWEsR0FBRyxhQUFLLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFO0lBQ25ELEVBQUUsRUFBRSxhQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFO0lBQzNCLElBQUksRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQ2xCLE1BQU0sRUFBRSxhQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7SUFDckcsTUFBTSxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO0lBQ3JDLFlBQVksRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3JDLE9BQU8sRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQ3JCLElBQUksRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQ2xCLElBQUksRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQ2xCLE9BQU8sRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ2hDLFlBQVksRUFBRSxhQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3pDLFVBQVUsRUFBRSxhQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3ZDLFlBQVksRUFBRSxhQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3pDLGdCQUFnQixFQUFFLGFBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzNDLFVBQVUsRUFBRSxhQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNyQyxZQUFZLEVBQUUsYUFBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDdkMsWUFBWSxFQUFFLGFBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLGFBQWEsRUFBRSxhQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUN4QyxRQUFRLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtDQUNsQyxDQUFDLENBQUMsT0FBTyxDQUFDO0lBQ1QsRUFBRSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsY0FBYyxDQUFDLEVBQUU7SUFDbEMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRTtDQUN2QixDQUFDLENBQUE7QUFFRixrQkFBZSxhQUFhLENBQUEifQ==
@@ -0,0 +1,21 @@
1
+ export declare const EMAIL_DELIVERY_STATUSES: readonly ["queued", "sent", "delivered", "opened", "clicked", "failed", "bounced"];
2
+ declare const EmailDelivery: import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder<{
3
+ id: import("@medusajs/framework/utils").PrimaryKeyModifier<string, import("@medusajs/framework/utils").IdProperty>;
4
+ campaign_id: import("@medusajs/framework/utils").NullableModifier<string, import("@medusajs/framework/utils").TextProperty>;
5
+ template_key: import("@medusajs/framework/utils").NullableModifier<string, import("@medusajs/framework/utils").TextProperty>;
6
+ recipient_email: import("@medusajs/framework/utils").TextProperty;
7
+ locale: import("@medusajs/framework/utils").TextProperty;
8
+ status: import("@medusajs/framework/utils").EnumProperty<["queued", "sent", "delivered", "opened", "clicked", "failed", "bounced"]>;
9
+ idempotency_key: import("@medusajs/framework/utils").TextProperty;
10
+ provider_message_id: import("@medusajs/framework/utils").NullableModifier<string, import("@medusajs/framework/utils").TextProperty>;
11
+ sent_at: import("@medusajs/framework/utils").NullableModifier<Date, import("@medusajs/framework/utils").DateTimeProperty>;
12
+ delivered_at: import("@medusajs/framework/utils").NullableModifier<Date, import("@medusajs/framework/utils").DateTimeProperty>;
13
+ failed_at: import("@medusajs/framework/utils").NullableModifier<Date, import("@medusajs/framework/utils").DateTimeProperty>;
14
+ opened_at: import("@medusajs/framework/utils").NullableModifier<Date, import("@medusajs/framework/utils").DateTimeProperty>;
15
+ clicked_at: import("@medusajs/framework/utils").NullableModifier<Date, import("@medusajs/framework/utils").DateTimeProperty>;
16
+ open_count: import("@medusajs/framework/utils").NumberProperty;
17
+ click_count: import("@medusajs/framework/utils").NumberProperty;
18
+ error: import("@medusajs/framework/utils").NullableModifier<string, import("@medusajs/framework/utils").TextProperty>;
19
+ metadata: import("@medusajs/framework/utils").NullableModifier<NoInfer<Record<string, unknown>>, import("@medusajs/framework/utils").JSONProperty<NoInfer<Record<string, unknown>>>>;
20
+ }>, "email_delivery">;
21
+ export default EmailDelivery;
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EMAIL_DELIVERY_STATUSES = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ exports.EMAIL_DELIVERY_STATUSES = [
6
+ "queued",
7
+ "sent",
8
+ "delivered",
9
+ "opened",
10
+ "clicked",
11
+ "failed",
12
+ "bounced",
13
+ ];
14
+ const EmailDelivery = utils_1.model.define("email_delivery", {
15
+ id: utils_1.model.id().primaryKey(),
16
+ campaign_id: utils_1.model.text().nullable(),
17
+ template_key: utils_1.model.text().nullable(),
18
+ recipient_email: utils_1.model.text(),
19
+ locale: utils_1.model.text().default("hu-HU"),
20
+ status: utils_1.model.enum(["queued", "sent", "delivered", "opened", "clicked", "failed", "bounced"]).default("queued"),
21
+ idempotency_key: utils_1.model.text(),
22
+ provider_message_id: utils_1.model.text().nullable(),
23
+ sent_at: utils_1.model.dateTime().nullable(),
24
+ delivered_at: utils_1.model.dateTime().nullable(),
25
+ failed_at: utils_1.model.dateTime().nullable(),
26
+ opened_at: utils_1.model.dateTime().nullable(),
27
+ clicked_at: utils_1.model.dateTime().nullable(),
28
+ open_count: utils_1.model.number().default(0),
29
+ click_count: utils_1.model.number().default(0),
30
+ error: utils_1.model.text().nullable(),
31
+ metadata: utils_1.model.json().nullable(),
32
+ }).indexes([
33
+ { on: ["idempotency_key"], unique: true },
34
+ { on: ["campaign_id", "status"] },
35
+ { on: ["recipient_email", "created_at"] },
36
+ ]);
37
+ exports.default = EmailDelivery;
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1haWwtZGVsaXZlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9lbWFpbC1jZW50ZXIvbW9kZWxzL2VtYWlsLWRlbGl2ZXJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFEQUFpRDtBQUVwQyxRQUFBLHVCQUF1QixHQUFHO0lBQ3JDLFFBQVE7SUFDUixNQUFNO0lBQ04sV0FBVztJQUNYLFFBQVE7SUFDUixTQUFTO0lBQ1QsUUFBUTtJQUNSLFNBQVM7Q0FDRCxDQUFBO0FBRVYsTUFBTSxhQUFhLEdBQUcsYUFBSyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRTtJQUNuRCxFQUFFLEVBQUUsYUFBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRTtJQUMzQixXQUFXLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNwQyxZQUFZLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNyQyxlQUFlLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRTtJQUM3QixNQUFNLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7SUFDckMsTUFBTSxFQUFFLGFBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7SUFDL0csZUFBZSxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUU7SUFDN0IsbUJBQW1CLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUM1QyxPQUFPLEVBQUUsYUFBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNwQyxZQUFZLEVBQUUsYUFBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUN6QyxTQUFTLEVBQUUsYUFBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUN0QyxTQUFTLEVBQUUsYUFBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUN0QyxVQUFVLEVBQUUsYUFBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUN2QyxVQUFVLEVBQUUsYUFBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDckMsV0FBVyxFQUFFLGFBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLEtBQUssRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQzlCLFFBQVEsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0NBQ2xDLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDVCxFQUFFLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtJQUN6QyxFQUFFLEVBQUUsRUFBRSxDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsRUFBRTtJQUNqQyxFQUFFLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixFQUFFLFlBQVksQ0FBQyxFQUFFO0NBQzFDLENBQUMsQ0FBQTtBQUVGLGtCQUFlLGFBQWEsQ0FBQSJ9
@@ -0,0 +1,13 @@
1
+ declare const EmailTemplate: import("@medusajs/framework/utils").DmlEntity<import("@medusajs/framework/utils").DMLEntitySchemaBuilder<{
2
+ id: import("@medusajs/framework/utils").PrimaryKeyModifier<string, import("@medusajs/framework/utils").IdProperty>;
3
+ key: import("@medusajs/framework/utils").TextProperty;
4
+ locale: import("@medusajs/framework/utils").TextProperty;
5
+ name: import("@medusajs/framework/utils").TextProperty;
6
+ subject: import("@medusajs/framework/utils").TextProperty;
7
+ html: import("@medusajs/framework/utils").TextProperty;
8
+ text: import("@medusajs/framework/utils").TextProperty;
9
+ enabled: import("@medusajs/framework/utils").BooleanProperty;
10
+ system: import("@medusajs/framework/utils").BooleanProperty;
11
+ metadata: import("@medusajs/framework/utils").NullableModifier<NoInfer<Record<string, unknown>>, import("@medusajs/framework/utils").JSONProperty<NoInfer<Record<string, unknown>>>>;
12
+ }>, "email_template">;
13
+ export default EmailTemplate;