@hszrdm/core 1.4.0 → 1.6.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 (182) hide show
  1. package/.medusa/server/src/admin/index.js +6361 -3789
  2. package/.medusa/server/src/admin/index.mjs +6361 -3789
  3. package/.medusa/server/src/api/admin/back-in-stock/route.d.ts +2 -0
  4. package/.medusa/server/src/api/admin/back-in-stock/route.js +70 -0
  5. package/.medusa/server/src/api/admin/core-carts/[id]/items/[itemId]/route.d.ts +3 -0
  6. package/.medusa/server/src/api/admin/core-carts/[id]/items/[itemId]/route.js +64 -0
  7. package/.medusa/server/src/api/admin/core-carts/[id]/items/route.d.ts +2 -0
  8. package/.medusa/server/src/api/admin/core-carts/[id]/items/route.js +40 -0
  9. package/.medusa/server/src/api/admin/core-carts/[id]/promotions/[code]/route.d.ts +2 -0
  10. package/.medusa/server/src/api/admin/core-carts/[id]/promotions/[code]/route.js +40 -0
  11. package/.medusa/server/src/api/admin/core-carts/[id]/promotions/route.d.ts +2 -0
  12. package/.medusa/server/src/api/admin/core-carts/[id]/promotions/route.js +41 -0
  13. package/.medusa/server/src/api/admin/core-carts/[id]/route.d.ts +2 -0
  14. package/.medusa/server/src/api/admin/core-carts/[id]/route.js +28 -0
  15. package/.medusa/server/src/api/admin/core-carts/customer/[id]/route.d.ts +2 -0
  16. package/.medusa/server/src/api/admin/core-carts/customer/[id]/route.js +34 -0
  17. package/.medusa/server/src/api/admin/core-carts/route.d.ts +3 -0
  18. package/.medusa/server/src/api/admin/core-carts/route.js +69 -0
  19. package/.medusa/server/src/api/admin/customer-activation/route.d.ts +2 -0
  20. package/.medusa/server/src/api/admin/customer-activation/route.js +97 -0
  21. package/.medusa/server/src/api/admin/customer-import/route.d.ts +2 -0
  22. package/.medusa/server/src/api/admin/customer-import/route.js +166 -0
  23. package/.medusa/server/src/api/admin/order-export/route.d.ts +2 -0
  24. package/.medusa/server/src/api/admin/order-export/route.js +88 -0
  25. package/.medusa/server/src/api/admin/product-migration/inventory/route.d.ts +3 -0
  26. package/.medusa/server/src/api/admin/product-migration/inventory/route.js +164 -0
  27. package/.medusa/server/src/api/admin/product-migration/price-list-prices/route.d.ts +3 -0
  28. package/.medusa/server/src/api/admin/product-migration/price-list-prices/route.js +204 -0
  29. package/.medusa/server/src/api/admin/product-migration/products/route.d.ts +2 -0
  30. package/.medusa/server/src/api/admin/product-migration/products/route.js +24 -0
  31. package/.medusa/server/src/api/admin/product-reviews/[id]/route.js +36 -4
  32. package/.medusa/server/src/api/admin/product-reviews/settings/route.d.ts +3 -0
  33. package/.medusa/server/src/api/admin/product-reviews/settings/route.js +63 -0
  34. package/.medusa/server/src/api/admin/shared-cart/settings/route.d.ts +5 -0
  35. package/.medusa/server/src/api/admin/shared-cart/settings/route.js +31 -0
  36. package/.medusa/server/src/api/admin/system-runtime/route.d.ts +2 -0
  37. package/.medusa/server/src/api/admin/system-runtime/route.js +18 -0
  38. package/.medusa/server/src/api/hooks/packeta/status/route.d.ts +2 -0
  39. package/.medusa/server/src/api/hooks/packeta/status/route.js +55 -0
  40. package/.medusa/server/src/api/middlewares.js +24 -1
  41. package/.medusa/server/src/api/store/abandoned-cart/recover/route.d.ts +2 -0
  42. package/.medusa/server/src/api/store/abandoned-cart/recover/route.js +37 -0
  43. package/.medusa/server/src/api/store/back-in-stock/route.d.ts +8 -0
  44. package/.medusa/server/src/api/store/back-in-stock/route.js +124 -0
  45. package/.medusa/server/src/api/store/core-carts/me/active/route.d.ts +2 -0
  46. package/.medusa/server/src/api/store/core-carts/me/active/route.js +54 -0
  47. package/.medusa/server/src/api/store/customer-activation/complete/route.d.ts +2 -0
  48. package/.medusa/server/src/api/store/customer-activation/complete/route.js +96 -0
  49. package/.medusa/server/src/api/store/customer-activation/route.d.ts +2 -0
  50. package/.medusa/server/src/api/store/customer-activation/route.js +34 -0
  51. package/.medusa/server/src/api/store/products/[id]/reviews/route.d.ts +1 -0
  52. package/.medusa/server/src/api/store/products/[id]/reviews/route.js +76 -34
  53. package/.medusa/server/src/api/store/review-request/route.d.ts +2 -0
  54. package/.medusa/server/src/api/store/review-request/route.js +60 -0
  55. package/.medusa/server/src/api/store/shared-carts/[token]/route.d.ts +2 -0
  56. package/.medusa/server/src/api/store/shared-carts/[token]/route.js +52 -0
  57. package/.medusa/server/src/api/store/shared-carts/route.d.ts +13 -0
  58. package/.medusa/server/src/api/store/shared-carts/route.js +78 -0
  59. package/.medusa/server/src/core/abandoned-cart.d.ts +64 -0
  60. package/.medusa/server/src/core/abandoned-cart.js +197 -0
  61. package/.medusa/server/src/core/admin-cart-management.d.ts +18 -0
  62. package/.medusa/server/src/core/admin-cart-management.js +102 -0
  63. package/.medusa/server/src/core/admin-cart-visibility.d.ts +94 -0
  64. package/.medusa/server/src/core/admin-cart-visibility.js +192 -0
  65. package/.medusa/server/src/core/back-in-stock.d.ts +51 -0
  66. package/.medusa/server/src/core/back-in-stock.js +107 -0
  67. package/.medusa/server/src/core/cart-observability.d.ts +23 -0
  68. package/.medusa/server/src/core/cart-observability.js +54 -0
  69. package/.medusa/server/src/core/checkout-contract.d.ts +1 -0
  70. package/.medusa/server/src/core/checkout-contract.js +2 -1
  71. package/.medusa/server/src/core/customer-account-contract.d.ts +3 -0
  72. package/.medusa/server/src/core/customer-account-contract.js +4 -1
  73. package/.medusa/server/src/core/customer-activation.d.ts +120 -0
  74. package/.medusa/server/src/core/customer-activation.js +169 -0
  75. package/.medusa/server/src/core/customer-cart-resume.d.ts +21 -0
  76. package/.medusa/server/src/core/customer-cart-resume.js +72 -0
  77. package/.medusa/server/src/core/customer-email.d.ts +1 -1
  78. package/.medusa/server/src/core/customer-email.js +4 -1
  79. package/.medusa/server/src/core/native-migration-export.d.ts +6 -0
  80. package/.medusa/server/src/core/native-migration-export.js +105 -0
  81. package/.medusa/server/src/core/order-export.d.ts +11 -0
  82. package/.medusa/server/src/core/order-export.js +297 -0
  83. package/.medusa/server/src/core/review-request.d.ts +61 -0
  84. package/.medusa/server/src/core/review-request.js +105 -0
  85. package/.medusa/server/src/core/review-reward.d.ts +94 -0
  86. package/.medusa/server/src/core/review-reward.js +124 -0
  87. package/.medusa/server/src/core/runtime-health.d.ts +39 -0
  88. package/.medusa/server/src/core/runtime-health.js +250 -0
  89. package/.medusa/server/src/core/storefront-core-config.d.ts +10 -0
  90. package/.medusa/server/src/core/storefront-core-config.js +26 -1
  91. package/.medusa/server/src/core/version.d.ts +2 -2
  92. package/.medusa/server/src/core/version.js +2 -2
  93. package/.medusa/server/src/jobs/abandoned-cart-recovery.d.ts +23 -0
  94. package/.medusa/server/src/jobs/abandoned-cart-recovery.js +137 -0
  95. package/.medusa/server/src/jobs/back-in-stock-reconciliation.d.ts +15 -0
  96. package/.medusa/server/src/jobs/back-in-stock-reconciliation.js +90 -0
  97. package/.medusa/server/src/jobs/dpd-statusdata-sync.d.ts +17 -0
  98. package/.medusa/server/src/jobs/dpd-statusdata-sync.js +107 -0
  99. package/.medusa/server/src/jobs/mpl-push-tracking.d.ts +19 -0
  100. package/.medusa/server/src/jobs/mpl-push-tracking.js +183 -0
  101. package/.medusa/server/src/jobs/mpl-status-sync.d.ts +8 -2
  102. package/.medusa/server/src/jobs/mpl-status-sync.js +12 -7
  103. package/.medusa/server/src/jobs/product-review-request-dispatch.d.ts +28 -0
  104. package/.medusa/server/src/jobs/product-review-request-dispatch.js +84 -0
  105. package/.medusa/server/src/jobs/runtime-heartbeat.d.ts +12 -0
  106. package/.medusa/server/src/jobs/runtime-heartbeat.js +13 -0
  107. package/.medusa/server/src/jobs/shipping-status-sync.d.ts +8 -2
  108. package/.medusa/server/src/jobs/shipping-status-sync.js +11 -14
  109. package/.medusa/server/src/lib/modules/shipping/idempotency.js +3 -3
  110. package/.medusa/server/src/lib/modules/shipping/index.d.ts +1 -0
  111. package/.medusa/server/src/lib/modules/shipping/index.js +2 -1
  112. package/.medusa/server/src/lib/modules/shipping/tracking.d.ts +48 -0
  113. package/.medusa/server/src/lib/modules/shipping/tracking.js +368 -0
  114. package/.medusa/server/src/lib/modules/shipping/webhooks.d.ts +6 -9
  115. package/.medusa/server/src/lib/modules/shipping/webhooks.js +24 -137
  116. package/.medusa/server/src/modules/back-in-stock/index.d.ts +23 -0
  117. package/.medusa/server/src/modules/back-in-stock/index.js +16 -0
  118. package/.medusa/server/src/modules/back-in-stock/migrations/Migration20261101202000.d.ts +5 -0
  119. package/.medusa/server/src/modules/back-in-stock/migrations/Migration20261101202000.js +18 -0
  120. package/.medusa/server/src/modules/back-in-stock/models/back-in-stock-subscription.d.ts +13 -0
  121. package/.medusa/server/src/modules/back-in-stock/models/back-in-stock-subscription.js +23 -0
  122. package/.medusa/server/src/modules/back-in-stock/service.d.ts +22 -0
  123. package/.medusa/server/src/modules/back-in-stock/service.js +12 -0
  124. package/.medusa/server/src/modules/email-center/abandoned-cart-registration.d.ts +1 -0
  125. package/.medusa/server/src/modules/email-center/abandoned-cart-registration.js +27 -0
  126. package/.medusa/server/src/modules/email-center/back-in-stock-registration.d.ts +1 -0
  127. package/.medusa/server/src/modules/email-center/back-in-stock-registration.js +27 -0
  128. package/.medusa/server/src/modules/email-center/defaults.js +7 -1
  129. package/.medusa/server/src/modules/email-center/index.d.ts +2 -0
  130. package/.medusa/server/src/modules/email-center/index.js +3 -1
  131. package/.medusa/server/src/modules/integration-settings/abandoned-cart-registration.d.ts +1 -0
  132. package/.medusa/server/src/modules/integration-settings/abandoned-cart-registration.js +30 -0
  133. package/.medusa/server/src/modules/integration-settings/index.d.ts +1 -0
  134. package/.medusa/server/src/modules/integration-settings/index.js +2 -1
  135. package/.medusa/server/src/modules/integration-settings/storefront-public-registration.js +15 -1
  136. package/.medusa/server/src/modules/product-review/index.d.ts +14 -0
  137. package/.medusa/server/src/modules/product-review/migrations/Migration20261101113000.d.ts +5 -0
  138. package/.medusa/server/src/modules/product-review/migrations/Migration20261101113000.js +28 -0
  139. package/.medusa/server/src/modules/product-review/migrations/Migration20261101114500.d.ts +5 -0
  140. package/.medusa/server/src/modules/product-review/migrations/Migration20261101114500.js +20 -0
  141. package/.medusa/server/src/modules/product-review/migrations/Migration20261101121500.d.ts +5 -0
  142. package/.medusa/server/src/modules/product-review/migrations/Migration20261101121500.js +18 -0
  143. package/.medusa/server/src/modules/product-review/models/product-review-settings.d.ts +15 -0
  144. package/.medusa/server/src/modules/product-review/models/product-review-settings.js +19 -0
  145. package/.medusa/server/src/modules/product-review/models/product-review.d.ts +6 -2
  146. package/.medusa/server/src/modules/product-review/models/product-review.js +7 -3
  147. package/.medusa/server/src/modules/product-review/service.d.ts +22 -1
  148. package/.medusa/server/src/modules/product-review/service.js +3 -2
  149. package/.medusa/server/src/modules/shared-cart/index.d.ts +21 -0
  150. package/.medusa/server/src/modules/shared-cart/index.js +13 -0
  151. package/.medusa/server/src/modules/shared-cart/migrations/Migration20261102010000.d.ts +5 -0
  152. package/.medusa/server/src/modules/shared-cart/migrations/Migration20261102010000.js +16 -0
  153. package/.medusa/server/src/modules/shared-cart/models/shared-cart.d.ts +10 -0
  154. package/.medusa/server/src/modules/shared-cart/models/shared-cart.js +17 -0
  155. package/.medusa/server/src/modules/shared-cart/service.d.ts +14 -0
  156. package/.medusa/server/src/modules/shared-cart/service.js +11 -0
  157. package/.medusa/server/src/modules/shared-cart/settings.d.ts +7 -0
  158. package/.medusa/server/src/modules/shared-cart/settings.js +64 -0
  159. package/.medusa/server/src/providers/dpd/index.d.ts +2 -0
  160. package/.medusa/server/src/providers/dpd/index.js +3 -1
  161. package/.medusa/server/src/providers/dpd/statusdata-ftp.d.ts +16 -0
  162. package/.medusa/server/src/providers/dpd/statusdata-ftp.js +268 -0
  163. package/.medusa/server/src/providers/dpd/statusdata.d.ts +14 -0
  164. package/.medusa/server/src/providers/dpd/statusdata.js +161 -0
  165. package/.medusa/server/src/providers/mpl/client.d.ts +3 -1
  166. package/.medusa/server/src/providers/mpl/client.js +154 -2
  167. package/.medusa/server/src/providers/mpl/service.js +31 -20
  168. package/.medusa/server/src/providers/mpl/types.d.ts +25 -0
  169. package/.medusa/server/src/providers/mpl/types.js +1 -1
  170. package/.medusa/server/src/providers/packeta/index.d.ts +1 -0
  171. package/.medusa/server/src/providers/packeta/index.js +2 -1
  172. package/.medusa/server/src/providers/packeta/push-tracking.d.ts +8 -0
  173. package/.medusa/server/src/providers/packeta/push-tracking.js +96 -0
  174. package/.medusa/server/src/providers/packeta/service.js +22 -2
  175. package/.medusa/server/src/scripts/core-init.d.ts +1 -1
  176. package/.medusa/server/src/scripts/core-init.js +3 -2
  177. package/.medusa/server/src/subscribers/back-in-stock-inventory-changed.d.ts +7 -0
  178. package/.medusa/server/src/subscribers/back-in-stock-inventory-changed.js +65 -0
  179. package/.medusa/server/src/workflows/link-migrated-customer.d.ts +8 -0
  180. package/.medusa/server/src/workflows/link-migrated-customer.js +17 -0
  181. package/README.md +1 -1
  182. package/package.json +30 -8
@@ -0,0 +1,250 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveRuntimeProjectRoot = resolveRuntimeProjectRoot;
4
+ exports.runtimeStateDirectory = runtimeStateDirectory;
5
+ exports.writeRuntimeHeartbeat = writeRuntimeHeartbeat;
6
+ exports.collectRuntimeHealth = collectRuntimeHealth;
7
+ const node_fs_1 = require("node:fs");
8
+ const node_path_1 = require("node:path");
9
+ const HEARTBEAT_SCHEDULE = "*/5 * * * *";
10
+ const DEFAULT_HEARTBEAT_STALE_MINUTES = 15;
11
+ const DEFAULT_BACKUP_STALE_HOURS = 30;
12
+ function resolveRuntimeProjectRoot(env = process.env) {
13
+ const configured = String(env.CORE_PROJECT_DIR || "").trim();
14
+ if (configured)
15
+ return (0, node_path_1.resolve)(configured);
16
+ const candidates = ancestorPaths((0, node_path_1.resolve)(process.cwd()), 6);
17
+ // Prefer the operational backup script. In the monorepo this resolves to the
18
+ // repository root; in generated projects the script lives in backend/scripts,
19
+ // so it resolves to the backend runtime root. Backup status and heartbeat then
20
+ // always share the same .core directory.
21
+ const operationalRoot = candidates.find((candidate) => (0, node_fs_1.existsSync)((0, node_path_1.join)(candidate, "scripts", "core-backup.mjs")));
22
+ if (operationalRoot)
23
+ return operationalRoot;
24
+ const bootstrapRoot = candidates.find((candidate) => (0, node_fs_1.existsSync)((0, node_path_1.join)(candidate, ".core", "webshop-bootstrap.json")));
25
+ return bootstrapRoot || (0, node_path_1.resolve)(process.cwd());
26
+ }
27
+ function runtimeStateDirectory(env = process.env) {
28
+ const root = resolveRuntimeProjectRoot(env);
29
+ const configured = String(env.CORE_RUNTIME_STATE_DIR || "").trim();
30
+ if (!configured)
31
+ return (0, node_path_1.join)(root, ".core");
32
+ return (0, node_path_1.isAbsolute)(configured) ? configured : (0, node_path_1.resolve)(root, configured);
33
+ }
34
+ function writeRuntimeHeartbeat(env = process.env) {
35
+ const stateDir = runtimeStateDirectory(env);
36
+ const path = (0, node_path_1.join)(stateDir, "runtime-heartbeat.json");
37
+ const payload = {
38
+ schema_version: 1,
39
+ job: "runtime-heartbeat",
40
+ schedule: HEARTBEAT_SCHEDULE,
41
+ last_seen_at: new Date().toISOString(),
42
+ pid: process.pid,
43
+ };
44
+ writeJsonAtomic(path, payload);
45
+ return payload;
46
+ }
47
+ function collectRuntimeHealth(env = process.env, now = new Date()) {
48
+ const projectRoot = resolveRuntimeProjectRoot(env);
49
+ const stateDir = runtimeStateDirectory(env);
50
+ const heartbeatStaleMinutes = positiveNumber(env.CORE_CRON_HEARTBEAT_STALE_MINUTES, DEFAULT_HEARTBEAT_STALE_MINUTES);
51
+ const backupStaleHours = positiveNumber(env.CORE_BACKUP_STALE_HOURS, DEFAULT_BACKUP_STALE_HOURS);
52
+ const heartbeat = readJson((0, node_path_1.join)(stateDir, "runtime-heartbeat.json"));
53
+ const heartbeatAt = validDate(heartbeat?.last_seen_at);
54
+ const heartbeatAge = heartbeatAt
55
+ ? Math.max(0, (now.getTime() - heartbeatAt.getTime()) / 60_000)
56
+ : null;
57
+ const schedulerState = !heartbeatAt
58
+ ? "missing"
59
+ : heartbeatAge > heartbeatStaleMinutes
60
+ ? "error"
61
+ : "healthy";
62
+ const backupStatus = readJson((0, node_path_1.join)(stateDir, "backup-status.json"));
63
+ const backupRoot = resolveConfiguredPath(projectRoot, env.CORE_BACKUP_DIR, "backups");
64
+ const latestManifest = findLatestBackupManifest(backupRoot);
65
+ const statusSuccessAt = validDate(backupStatus?.status === "success"
66
+ ? backupStatus.created_at || backupStatus.finished_at
67
+ : undefined);
68
+ const manifestSuccessAt = validDate(latestManifest?.manifest.created_at);
69
+ const useStatusSuccess = Boolean(statusSuccessAt &&
70
+ (!manifestSuccessAt || statusSuccessAt.getTime() >= manifestSuccessAt.getTime()));
71
+ const successAt = useStatusSuccess ? statusSuccessAt : manifestSuccessAt;
72
+ const statusBundleDir = String(backupStatus?.bundle_dir || "").trim();
73
+ const latestBundleDir = useStatusSuccess && statusBundleDir
74
+ ? resolveConfiguredPath(projectRoot, statusBundleDir, statusBundleDir)
75
+ : latestManifest?.bundleDir || null;
76
+ const databaseDump = latestBundleDir
77
+ ? (0, node_fs_1.existsSync)((0, node_path_1.join)(latestBundleDir, "database.dump"))
78
+ : Boolean(backupStatus?.database_dump);
79
+ const manifestOk = latestBundleDir
80
+ ? (0, node_fs_1.existsSync)((0, node_path_1.join)(latestBundleDir, "manifest.json"))
81
+ : Boolean(latestManifest);
82
+ const backupAge = successAt
83
+ ? Math.max(0, (now.getTime() - successAt.getTime()) / 3_600_000)
84
+ : null;
85
+ const lastAttemptAt = validDate(backupStatus?.finished_at || backupStatus?.started_at);
86
+ const lastAttemptStatus = backupStatus?.status === "running" ||
87
+ backupStatus?.status === "success" ||
88
+ backupStatus?.status === "failed"
89
+ ? backupStatus.status
90
+ : "unknown";
91
+ let backupState = "healthy";
92
+ let backupMessage = "A legutóbbi backup rendben van.";
93
+ if (lastAttemptStatus === "failed") {
94
+ backupState = "error";
95
+ backupMessage = "A legutóbbi backup futás hibával leállt.";
96
+ }
97
+ else if (!successAt) {
98
+ backupState = "missing";
99
+ backupMessage = "Nem található sikeres backup.";
100
+ }
101
+ else if (!databaseDump || !manifestOk) {
102
+ backupState = "error";
103
+ backupMessage = "A legutóbbi backup hiányos: DB dump vagy manifest hiányzik.";
104
+ }
105
+ else if (backupAge > backupStaleHours) {
106
+ backupState = "warning";
107
+ backupMessage = `A legutóbbi sikeres backup ${Math.floor(backupAge)} órás.`;
108
+ }
109
+ else if (lastAttemptStatus === "running") {
110
+ backupState = "warning";
111
+ backupMessage = "Backup futás van folyamatban.";
112
+ }
113
+ const sizeBytes = useStatusSuccess && Number.isFinite(backupStatus?.size_bytes)
114
+ ? Number(backupStatus?.size_bytes)
115
+ : latestBundleDir
116
+ ? directorySize(latestBundleDir)
117
+ : null;
118
+ return {
119
+ generated_at: now.toISOString(),
120
+ project_root: projectRoot,
121
+ scheduler: {
122
+ state: schedulerState,
123
+ schedule: heartbeat?.schedule || HEARTBEAT_SCHEDULE,
124
+ last_seen_at: heartbeatAt?.toISOString() || null,
125
+ age_minutes: heartbeatAge == null ? null : round(heartbeatAge, 1),
126
+ stale_after_minutes: heartbeatStaleMinutes,
127
+ message: schedulerState === "healthy"
128
+ ? "A Medusa scheduled-job futtató aktív."
129
+ : schedulerState === "missing"
130
+ ? "Még nincs scheduler heartbeat."
131
+ : `A scheduler heartbeat több mint ${heartbeatStaleMinutes} perce nem frissült.`,
132
+ },
133
+ backup: {
134
+ state: backupState,
135
+ last_attempt_status: lastAttemptStatus,
136
+ last_attempt_at: lastAttemptAt?.toISOString() || null,
137
+ last_success_at: successAt?.toISOString() || null,
138
+ age_hours: backupAge == null ? null : round(backupAge, 1),
139
+ stale_after_hours: backupStaleHours,
140
+ bundle_name: useStatusSuccess && backupStatus?.bundle_name
141
+ ? backupStatus.bundle_name
142
+ : latestManifest?.bundleName || null,
143
+ size_bytes: sizeBytes,
144
+ database_dump: databaseDump,
145
+ manifest_ok: manifestOk,
146
+ error: backupStatus?.status === "failed"
147
+ ? String(backupStatus.error || "Ismeretlen backup hiba")
148
+ : null,
149
+ message: backupMessage,
150
+ },
151
+ };
152
+ }
153
+ function findLatestBackupManifest(root) {
154
+ if (!(0, node_fs_1.existsSync)(root))
155
+ return null;
156
+ let latest = null;
157
+ for (const entry of safeDirectories(root)) {
158
+ const bundleDir = (0, node_path_1.join)(root, entry);
159
+ const manifest = readJson((0, node_path_1.join)(bundleDir, "manifest.json"));
160
+ const created = validDate(manifest?.created_at);
161
+ if (!manifest || !created)
162
+ continue;
163
+ if (!latest || created.getTime() > latest.createdAt) {
164
+ latest = {
165
+ bundleDir,
166
+ bundleName: entry,
167
+ manifest,
168
+ createdAt: created.getTime(),
169
+ };
170
+ }
171
+ }
172
+ return latest;
173
+ }
174
+ function safeDirectories(root) {
175
+ try {
176
+ return (0, node_fs_1.readdirSync)(root, { withFileTypes: true })
177
+ .filter((entry) => entry.isDirectory())
178
+ .map((entry) => entry.name);
179
+ }
180
+ catch {
181
+ return [];
182
+ }
183
+ }
184
+ function directorySize(path) {
185
+ try {
186
+ const stat = (0, node_fs_1.statSync)(path);
187
+ if (stat.isFile())
188
+ return stat.size;
189
+ if (!stat.isDirectory())
190
+ return 0;
191
+ let total = 0;
192
+ for (const entry of (0, node_fs_1.readdirSync)(path)) {
193
+ const size = directorySize((0, node_path_1.join)(path, entry));
194
+ if (size != null)
195
+ total += size;
196
+ }
197
+ return total;
198
+ }
199
+ catch {
200
+ return null;
201
+ }
202
+ }
203
+ function readJson(path) {
204
+ try {
205
+ return JSON.parse((0, node_fs_1.readFileSync)(path, "utf8"));
206
+ }
207
+ catch {
208
+ return null;
209
+ }
210
+ }
211
+ function writeJsonAtomic(path, value) {
212
+ (0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(path), { recursive: true, mode: 0o700 });
213
+ const temp = `${path}.${process.pid}.tmp`;
214
+ (0, node_fs_1.writeFileSync)(temp, `${JSON.stringify(value, null, 2)}\n`, {
215
+ encoding: "utf8",
216
+ mode: 0o600,
217
+ });
218
+ (0, node_fs_1.renameSync)(temp, path);
219
+ }
220
+ function resolveConfiguredPath(root, value, fallback) {
221
+ const raw = String(value || fallback).trim();
222
+ return (0, node_path_1.isAbsolute)(raw) ? raw : (0, node_path_1.resolve)(root, raw);
223
+ }
224
+ function ancestorPaths(start, maxDepth) {
225
+ const result = [];
226
+ let current = start;
227
+ for (let depth = 0; depth <= maxDepth; depth++) {
228
+ result.push(current);
229
+ const parent = (0, node_path_1.dirname)(current);
230
+ if (parent === current)
231
+ break;
232
+ current = parent;
233
+ }
234
+ return result;
235
+ }
236
+ function validDate(value) {
237
+ if (!value)
238
+ return null;
239
+ const date = new Date(String(value));
240
+ return Number.isNaN(date.getTime()) ? null : date;
241
+ }
242
+ function positiveNumber(value, fallback) {
243
+ const number = Number(value);
244
+ return Number.isFinite(number) && number > 0 ? number : fallback;
245
+ }
246
+ function round(value, decimals) {
247
+ const multiplier = 10 ** decimals;
248
+ return Math.round(value * multiplier) / multiplier;
249
+ }
250
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS1oZWFsdGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29yZS9ydW50aW1lLWhlYWx0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXVFQSw4REFtQkM7QUFFRCxzREFLQztBQUVELHNEQVlDO0FBRUQsb0RBcUlDO0FBdFBELHFDQVFnQjtBQUNoQix5Q0FBOEQ7QUEwRDlELE1BQU0sa0JBQWtCLEdBQUcsYUFBYSxDQUFBO0FBQ3hDLE1BQU0sK0JBQStCLEdBQUcsRUFBRSxDQUFBO0FBQzFDLE1BQU0sMEJBQTBCLEdBQUcsRUFBRSxDQUFBO0FBRXJDLFNBQWdCLHlCQUF5QixDQUFDLE1BQXlCLE9BQU8sQ0FBQyxHQUFHO0lBQzVFLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDNUQsSUFBSSxVQUFVO1FBQUUsT0FBTyxJQUFBLG1CQUFPLEVBQUMsVUFBVSxDQUFDLENBQUE7SUFFMUMsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLElBQUEsbUJBQU8sRUFBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUUzRCw2RUFBNkU7SUFDN0UsOEVBQThFO0lBQzlFLCtFQUErRTtJQUMvRSx5Q0FBeUM7SUFDekMsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQ3BELElBQUEsb0JBQVUsRUFBQyxJQUFBLGdCQUFJLEVBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQzFELENBQUE7SUFDRCxJQUFJLGVBQWU7UUFBRSxPQUFPLGVBQWUsQ0FBQTtJQUUzQyxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FDbEQsSUFBQSxvQkFBVSxFQUFD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
@@ -31,6 +31,7 @@ export type StorefrontCoreConfig = {
31
31
  seo: true;
32
32
  analytics: boolean;
33
33
  merchant_feed: boolean;
34
+ google_ads: boolean;
34
35
  };
35
36
  account: {
36
37
  enabled: true;
@@ -143,6 +144,15 @@ export type StorefrontCoreConfig = {
143
144
  enabled: boolean;
144
145
  feed_endpoint: "/store/feeds/google-merchant.xml";
145
146
  };
147
+ google_ads: {
148
+ enabled: boolean;
149
+ consent_required: true;
150
+ conversion_id: string | null;
151
+ purchase_conversion_label: string | null;
152
+ purchase_send_to: string | null;
153
+ remarketing_enabled: boolean;
154
+ google_tag_manager_enabled: boolean;
155
+ };
146
156
  };
147
157
  checkout: {
148
158
  payment_availability: "medusa_region";
@@ -15,6 +15,19 @@ function publicValue(item, name) {
15
15
  const raw = item.values?.[name];
16
16
  return typeof raw === "string" && raw.trim() ? raw.trim() : null;
17
17
  }
18
+ function publicBoolean(item, name) {
19
+ if (!item || !isAvailable(item))
20
+ return false;
21
+ const raw = item.values?.[name];
22
+ return raw === "true";
23
+ }
24
+ function googleAdsSendTo(item) {
25
+ const id = publicValue(item, "GOOGLE_ADS_CONVERSION_ID");
26
+ const label = publicValue(item, "GOOGLE_ADS_PURCHASE_CONVERSION_LABEL");
27
+ if (!id || !label)
28
+ return null;
29
+ return `${id}/${label}`;
30
+ }
18
31
  function buildStorefrontCoreConfig(input) {
19
32
  const stripe = integration(input.integrations, "stripe");
20
33
  const simplepay = integration(input.integrations, "simplepay");
@@ -27,11 +40,13 @@ function buildStorefrontCoreConfig(input) {
27
40
  const fogyasztobarat = integration(input.integrations, "fogyasztobarat");
28
41
  const googleAnalytics = integration(input.integrations, "google-analytics");
29
42
  const googleTagManager = integration(input.integrations, "google-tag-manager");
43
+ const googleAds = integration(input.integrations, "google-ads");
30
44
  const googleSearchConsole = integration(input.integrations, "google-search-console");
31
45
  const googleMerchant = integration(input.integrations, "google-merchant");
32
46
  const afterSalesEnabled = Boolean(input.afterSales.enabled);
33
47
  const analyticsEnabled = isAvailable(googleAnalytics) || isAvailable(googleTagManager);
34
48
  const merchantFeedEnabled = isAvailable(googleMerchant);
49
+ const googleAdsEnabled = isAvailable(googleAds);
35
50
  return {
36
51
  schema_version: 1,
37
52
  store: {
@@ -51,6 +66,7 @@ function buildStorefrontCoreConfig(input) {
51
66
  seo: true,
52
67
  analytics: analyticsEnabled,
53
68
  merchant_feed: merchantFeedEnabled,
69
+ google_ads: googleAdsEnabled,
54
70
  },
55
71
  account: {
56
72
  enabled: true,
@@ -153,6 +169,15 @@ function buildStorefrontCoreConfig(input) {
153
169
  enabled: merchantFeedEnabled,
154
170
  feed_endpoint: "/store/feeds/google-merchant.xml",
155
171
  },
172
+ google_ads: {
173
+ enabled: googleAdsEnabled,
174
+ consent_required: true,
175
+ conversion_id: publicValue(googleAds, "GOOGLE_ADS_CONVERSION_ID"),
176
+ purchase_conversion_label: publicValue(googleAds, "GOOGLE_ADS_PURCHASE_CONVERSION_LABEL"),
177
+ purchase_send_to: googleAdsSendTo(googleAds),
178
+ remarketing_enabled: publicBoolean(googleAds, "GOOGLE_ADS_REMARKETING_ENABLED"),
179
+ google_tag_manager_enabled: isAvailable(googleTagManager),
180
+ },
156
181
  },
157
182
  checkout: {
158
183
  payment_availability: checkout_contract_1.CHECKOUT_BEHAVIOR.payment_availability,
@@ -170,4 +195,4 @@ function buildStorefrontCoreConfig(input) {
170
195
  },
171
196
  };
172
197
  }
173
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVmcm9udC1jb3JlLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb3JlL3N0b3JlZnJvbnQtY29yZS1jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE2TEEsOERBaUtDO0FBN1ZELDJFQUtvQztBQUNwQywyREFNNEI7QUE0SjVCLFNBQVMsV0FBVyxDQUNsQixZQUE2QyxFQUM3QyxHQUFXO0lBRVgsT0FBTyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFBO0FBQ3RELENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxJQUErQztJQUNsRSxPQUFPLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtBQUNsRCxDQUFDO0FBRUQsU0FBUyxXQUFXLENBQ2xCLElBQStDLEVBQy9DLElBQVk7SUFFWixJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFBO0lBQzVDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUMvQixPQUFPLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO0FBQ2xFLENBQUM7QUFFRCxTQUFnQix5QkFBeUIsQ0FBQyxLQUt6QztJQUNDLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQ3hELE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBQzlELE1BQU0s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
198
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVmcm9udC1jb3JlLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb3JlL3N0b3JlZnJvbnQtY29yZS1jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUF1TkEsOERBbUxDO0FBellELDJFQUtvQztBQUNwQywyREFNNEI7QUFzSzVCLFNBQVMsV0FBVyxDQUNsQixZQUE2QyxFQUM3QyxHQUFXO0lBRVgsT0FBTyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFBO0FBQ3RELENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxJQUErQztJQUNsRSxPQUFPLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtBQUNsRCxDQUFDO0FBRUQsU0FBUyxXQUFXLENBQ2xCLElBQStDLEVBQy9DLElBQVk7SUFFWixJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFBO0lBQzVDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUMvQixPQUFPLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO0FBQ2xFLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FDcEIsSUFBK0MsRUFDL0MsSUFBWTtJQUVaLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFDN0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFBO0lB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
@@ -1,4 +1,4 @@
1
- export declare const CORE_VERSION = "1.3.0";
1
+ export declare const CORE_VERSION = "1.6.0";
2
2
  export declare const CORE_API_CONTRACT_VERSION = "1.0";
3
3
  export declare const STOREFRONT_CORE_CONFIG_SCHEMA_VERSION = 1;
4
- export declare const CORE_DB_SCHEMA_VERSION = 5;
4
+ export declare const CORE_DB_SCHEMA_VERSION = 7;
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CORE_DB_SCHEMA_VERSION = exports.STOREFRONT_CORE_CONFIG_SCHEMA_VERSION = exports.CORE_API_CONTRACT_VERSION = exports.CORE_VERSION = void 0;
4
- exports.CORE_VERSION = "1.3.0";
4
+ exports.CORE_VERSION = "1.6.0";
5
5
  exports.CORE_API_CONTRACT_VERSION = "1.0";
6
6
  exports.STOREFRONT_CORE_CONFIG_SCHEMA_VERSION = 1;
7
- exports.CORE_DB_SCHEMA_VERSION = 5;
7
+ exports.CORE_DB_SCHEMA_VERSION = 7;
8
8
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb3JlL3ZlcnNpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQWEsUUFBQSxZQUFZLEdBQUcsT0FBTyxDQUFBO0FBQ3RCLFFBQUEseUJBQXlCLEdBQUcsS0FBSyxDQUFBO0FBQ2pDLFFBQUEscUNBQXFDLEdBQUcsQ0FBQyxDQUFBO0FBQ3pDLFFBQUEsc0JBQXNCLEdBQUcsQ0FBQyxDQUFBIn0=
@@ -0,0 +1,23 @@
1
+ import type { MedusaContainer } from "@medusajs/framework/types";
2
+ export default function abandonedCartRecovery(container: MedusaContainer): Promise<{
3
+ scanned: number;
4
+ sent: number;
5
+ delayHours?: undefined;
6
+ } | {
7
+ scanned: number;
8
+ sent: number;
9
+ delayHours: number;
10
+ } | undefined>;
11
+ export declare function runBatch(container: MedusaContainer): Promise<{
12
+ scanned: number;
13
+ sent: number;
14
+ delayHours?: undefined;
15
+ } | {
16
+ scanned: number;
17
+ sent: number;
18
+ delayHours: number;
19
+ }>;
20
+ export declare const config: {
21
+ name: string;
22
+ schedule: string;
23
+ };
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.config = void 0;
4
+ exports.default = abandonedCartRecovery;
5
+ exports.runBatch = runBatch;
6
+ const utils_1 = require("@medusajs/framework/utils");
7
+ const integration_settings_1 = require("../modules/integration-settings");
8
+ const abandoned_cart_1 = require("../core/abandoned-cart");
9
+ const cart_observability_1 = require("../core/cart-observability");
10
+ const PAGE_SIZE = 100;
11
+ async function abandonedCartRecovery(container) {
12
+ const locking = container.resolve("locking");
13
+ try {
14
+ return await locking.execute("job:abandoned-cart-recovery", () => runBatch(container), { timeout: 1, expire: 3300 });
15
+ }
16
+ catch (error) {
17
+ const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
18
+ logger.info(JSON.stringify({
19
+ event: "scheduled_job_skipped_locked",
20
+ job: "abandoned-cart-recovery",
21
+ message: error instanceof Error ? error.message : String(error),
22
+ }));
23
+ }
24
+ }
25
+ async function runBatch(container) {
26
+ const settingsStore = container.resolve(integration_settings_1.INTEGRATION_SETTINGS_MODULE);
27
+ const resolved = await (0, integration_settings_1.resolvedIntegrationEnvironment)(settingsStore, "abandoned-cart");
28
+ const settings = (0, abandoned_cart_1.normalizeAbandonedCartConfig)(resolved.env);
29
+ if (!resolved.enabled || !settings.enabled)
30
+ return { scanned: 0, sent: 0 };
31
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
32
+ const cartService = container.resolve(utils_1.Modules.CART);
33
+ const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
34
+ const statusFilters = (0, cart_observability_1.abandonedCartQueryFilters)(settings.delayHours);
35
+ let cursor = null;
36
+ let scanned = 0;
37
+ let sent = 0;
38
+ while (true) {
39
+ const { data: carts } = await query.graph({
40
+ entity: "cart",
41
+ fields: [
42
+ "id",
43
+ "email",
44
+ "locale",
45
+ "currency_code",
46
+ "created_at",
47
+ "updated_at",
48
+ "completed_at",
49
+ "metadata",
50
+ "items.quantity",
51
+ ],
52
+ filters: {
53
+ ...statusFilters,
54
+ email: { $ne: null },
55
+ ...(cursor ? { id: { $gt: cursor } } : {}),
56
+ },
57
+ pagination: {
58
+ take: PAGE_SIZE,
59
+ order: { id: "ASC" },
60
+ },
61
+ });
62
+ if (!carts.length)
63
+ break;
64
+ for (const cart of carts) {
65
+ cursor = cart.id;
66
+ scanned += 1;
67
+ if (!cart.email)
68
+ continue;
69
+ if (!(0, cart_observability_1.isAbandonedCart)(cart, settings.delayHours))
70
+ continue;
71
+ if (cart.metadata?.abandoned_cart_recovery_sent_at)
72
+ continue;
73
+ try {
74
+ // Newsletter is the existing marketing-consent source of truth. Do not
75
+ // create a coupon or send a recovery message to unsubscribed addresses.
76
+ const subscriber = await (0, abandoned_cart_1.subscribedNewsletterRecipient)(container, cart.email);
77
+ if (!subscriber)
78
+ continue;
79
+ const existingCoupon = settings.couponEnabled
80
+ ? String(cart.metadata?.abandoned_cart_recovery_coupon_code || "").trim() || null
81
+ : null;
82
+ const coupon = settings.couponEnabled && !existingCoupon
83
+ ? await (0, abandoned_cart_1.issueAbandonedCartCoupon)({ container: container, cartId: cart.id, config: settings })
84
+ : existingCoupon
85
+ ? {
86
+ id: cart.metadata?.abandoned_cart_recovery_promotion_id || null,
87
+ code: existingCoupon,
88
+ existing: true,
89
+ }
90
+ : null;
91
+ if (coupon?.code && !existingCoupon) {
92
+ await cartService.updateCarts({
93
+ id: cart.id,
94
+ metadata: {
95
+ abandoned_cart_recovery_coupon_code: coupon.code,
96
+ abandoned_cart_recovery_promotion_id: coupon.id || null,
97
+ },
98
+ });
99
+ cart.metadata = {
100
+ ...(cart.metadata || {}),
101
+ abandoned_cart_recovery_coupon_code: coupon.code,
102
+ abandoned_cart_recovery_promotion_id: coupon.id || null,
103
+ };
104
+ }
105
+ const result = await (0, abandoned_cart_1.sendAbandonedCartRecoveryEmail)({
106
+ container: container,
107
+ cart,
108
+ config: settings,
109
+ couponCode: coupon?.code || null,
110
+ });
111
+ if (result?.skipped && "reason" in result && result.reason === "not-subscribed")
112
+ continue;
113
+ await cartService.updateCarts({
114
+ id: cart.id,
115
+ metadata: {
116
+ abandoned_cart_recovery_sent_at: new Date().toISOString(),
117
+ abandoned_cart_recovery_delay_hours: settings.delayHours,
118
+ ...(coupon?.code ? {
119
+ abandoned_cart_recovery_coupon_code: coupon.code,
120
+ abandoned_cart_recovery_promotion_id: coupon.id || null,
121
+ } : {}),
122
+ },
123
+ });
124
+ if (!result?.skipped)
125
+ sent += 1;
126
+ }
127
+ catch (error) {
128
+ logger.warn(`[abandoned-cart-recovery] ${cart.id}: ${error instanceof Error ? error.message : String(error)}`);
129
+ }
130
+ }
131
+ if (carts.length < PAGE_SIZE)
132
+ break;
133
+ }
134
+ return { scanned, sent, delayHours: settings.delayHours };
135
+ }
136
+ exports.config = { name: "abandoned-cart-recovery", schedule: "30 * * * *" };
137
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJhbmRvbmVkLWNhcnQtcmVjb3ZlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvam9icy9hYmFuZG9uZWQtY2FydC1yZWNvdmVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFvQ0Esd0NBbUJDO0FBRUQsNEJBaUhDO0FBektELHFEQUE4RTtBQUM5RSwwRUFJd0M7QUFDeEMsMkRBSytCO0FBQy9CLG1FQUdtQztBQUVuQyxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUE7QUFrQk4sS0FBSyxVQUFVLHFCQUFxQixDQUFDLFNBQTBCO0lBQzVFLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUUxQyxDQUFBO0lBRUQsSUFBSSxDQUFDO1FBQ0gsT0FBTyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQzFCLDZCQUE2QixFQUM3QixHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQ3pCLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQzdCLENBQUE7SUFDSCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDbEUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ3pCLEtBQUssRUFBRSw4QkFBOEI7WUFDckMsR0FBRyxFQUFFLHlCQUF5QjtZQUM5QixPQUFPLEVBQUUsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztTQUNoRSxDQUFDLENBQUMsQ0FBQTtJQUNMLENBQUM7QUFDSCxDQUFDO0FBRU0sS0FBSyxVQUFVLFFBQVEsQ0FBQyxTQUEwQjtJQUN2RCxNQUFNLGFBQWEsR0FBRyxTQUFT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
@@ -0,0 +1,15 @@
1
+ import type { MedusaContainer } from "@medusajs/framework/types";
2
+ export default function backInStockReconciliation(container: MedusaContainer): Promise<{
3
+ scanned: number;
4
+ variants: number;
5
+ sent: number;
6
+ } | undefined>;
7
+ export declare function runBatch(container: MedusaContainer): Promise<{
8
+ scanned: number;
9
+ variants: number;
10
+ sent: number;
11
+ }>;
12
+ export declare const config: {
13
+ name: string;
14
+ schedule: string;
15
+ };