@mercurjs/core 2.3.9-canary.4 → 2.3.9-canary.6

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 (197) hide show
  1. package/.medusa/server/src/api/admin/middlewares.js +41 -39
  2. package/.medusa/server/src/api/admin/payout-accounts/[id]/refresh-link/route.d.ts +3 -0
  3. package/.medusa/server/src/api/admin/payout-accounts/[id]/refresh-link/route.js +14 -0
  4. package/.medusa/server/src/api/admin/payout-accounts/[id]/route.d.ts +3 -0
  5. package/.medusa/server/src/api/admin/payout-accounts/[id]/route.js +18 -0
  6. package/.medusa/server/src/api/admin/payout-accounts/[id]/sync/route.d.ts +3 -0
  7. package/.medusa/server/src/api/admin/payout-accounts/[id]/sync/route.js +14 -0
  8. package/.medusa/server/src/api/admin/payout-accounts/helpers.d.ts +2 -0
  9. package/.medusa/server/src/api/admin/payout-accounts/helpers.js +7 -0
  10. package/.medusa/server/src/api/admin/payout-accounts/middlewares.d.ts +2 -0
  11. package/.medusa/server/src/api/admin/payout-accounts/middlewares.js +45 -0
  12. package/.medusa/server/src/api/admin/payout-accounts/query-config.d.ts +11 -0
  13. package/.medusa/server/src/api/admin/payout-accounts/query-config.js +26 -0
  14. package/.medusa/server/src/api/admin/payout-accounts/route.d.ts +5 -0
  15. package/.medusa/server/src/api/admin/payout-accounts/route.js +31 -0
  16. package/.medusa/server/src/api/admin/payout-accounts/validators.d.ts +51 -0
  17. package/.medusa/server/src/api/admin/payout-accounts/validators.js +22 -0
  18. package/.medusa/server/src/api/admin/payouts/[id]/retry/route.d.ts +3 -0
  19. package/.medusa/server/src/api/admin/payouts/[id]/retry/route.js +14 -0
  20. package/.medusa/server/src/api/admin/payouts/helpers.d.ts +2 -0
  21. package/.medusa/server/src/api/admin/payouts/helpers.js +7 -0
  22. package/.medusa/server/src/api/admin/payouts/middlewares.js +16 -1
  23. package/.medusa/server/src/api/admin/payouts/query-config.js +10 -1
  24. package/.medusa/server/src/api/admin/payouts/validators.d.ts +2 -0
  25. package/.medusa/server/src/api/admin/payouts/validators.js +3 -1
  26. package/.medusa/server/src/api/hooks/payout/route.js +4 -6
  27. package/.medusa/server/src/api/middlewares.js +5 -1
  28. package/.medusa/server/src/api/payout/onboarding/refresh/route.d.ts +6 -0
  29. package/.medusa/server/src/api/payout/onboarding/refresh/route.js +21 -0
  30. package/.medusa/server/src/api/store/carts/middlewares.js +11 -1
  31. package/.medusa/server/src/api/utils/ensure-seller-middleware.js +2 -2
  32. package/.medusa/server/src/api/vendor/payout-accounts/[id]/onboarding/route.js +2 -8
  33. package/.medusa/server/src/api/vendor/payout-accounts/helpers.d.ts +2 -0
  34. package/.medusa/server/src/api/vendor/payout-accounts/helpers.js +7 -2
  35. package/.medusa/server/src/api/vendor/payout-accounts/me/route.d.ts +3 -0
  36. package/.medusa/server/src/api/vendor/payout-accounts/me/route.js +15 -0
  37. package/.medusa/server/src/api/vendor/payout-accounts/middlewares.js +9 -1
  38. package/.medusa/server/src/api/vendor/payout-accounts/query-config.d.ts +11 -0
  39. package/.medusa/server/src/api/vendor/payout-accounts/query-config.js +30 -2
  40. package/.medusa/server/src/api/vendor/payout-accounts/route.js +4 -9
  41. package/.medusa/server/src/api/vendor/payout-accounts/validators.d.ts +3 -1
  42. package/.medusa/server/src/api/vendor/payout-accounts/validators.js +5 -2
  43. package/.medusa/server/src/api/vendor/payouts/query-config.d.ts +2 -0
  44. package/.medusa/server/src/api/vendor/payouts/query-config.js +12 -2
  45. package/.medusa/server/src/api/vendor/payouts/validators.d.ts +1 -0
  46. package/.medusa/server/src/api/vendor/payouts/validators.js +2 -1
  47. package/.medusa/server/src/api/vendor/sellers/select/route.js +2 -2
  48. package/.medusa/server/src/modules/payout/index.d.ts +1 -45
  49. package/.medusa/server/src/modules/payout/loaders/provider.js +7 -3
  50. package/.medusa/server/src/modules/payout/migrations/Migration20261028120000.d.ts +5 -0
  51. package/.medusa/server/src/modules/payout/migrations/Migration20261028120000.js +97 -0
  52. package/.medusa/server/src/modules/payout/models/index.d.ts +1 -0
  53. package/.medusa/server/src/modules/payout/models/index.js +4 -2
  54. package/.medusa/server/src/modules/payout/models/onboarding.d.ts +22 -1
  55. package/.medusa/server/src/modules/payout/models/payout-account.d.ts +23 -2
  56. package/.medusa/server/src/modules/payout/models/payout-account.js +33 -7
  57. package/.medusa/server/src/modules/payout/models/payout-reversal.d.ts +48 -0
  58. package/.medusa/server/src/modules/payout/models/payout-reversal.js +37 -0
  59. package/.medusa/server/src/modules/payout/models/payout.d.ts +22 -1
  60. package/.medusa/server/src/modules/payout/models/payout.js +18 -2
  61. package/.medusa/server/src/modules/payout/providers/system.d.ts +11 -5
  62. package/.medusa/server/src/modules/payout/providers/system.js +33 -14
  63. package/.medusa/server/src/modules/payout/services/payout-module-service.d.ts +94 -100
  64. package/.medusa/server/src/modules/payout/services/payout-module-service.js +316 -109
  65. package/.medusa/server/src/modules/payout/services/provider-service.d.ts +11 -7
  66. package/.medusa/server/src/modules/payout/services/provider-service.js +33 -13
  67. package/.medusa/server/src/modules/payout/utils/abstract-payout-provider.d.ts +20 -0
  68. package/.medusa/server/src/modules/payout/utils/abstract-payout-provider.js +19 -0
  69. package/.medusa/server/src/modules/payout/utils/index.d.ts +1 -0
  70. package/.medusa/server/src/modules/payout/utils/index.js +18 -0
  71. package/.medusa/server/src/modules/telemetry/index.d.ts +21 -0
  72. package/.medusa/server/src/modules/telemetry/index.js +12 -0
  73. package/.medusa/server/src/modules/telemetry/migrations/Migration20261029000000.d.ts +5 -0
  74. package/.medusa/server/src/modules/telemetry/migrations/Migration20261029000000.js +27 -0
  75. package/.medusa/server/src/modules/telemetry/models/index.d.ts +1 -0
  76. package/.medusa/server/src/modules/telemetry/models/index.js +10 -0
  77. package/.medusa/server/src/modules/telemetry/models/installation.d.ts +9 -0
  78. package/.medusa/server/src/modules/telemetry/models/installation.js +14 -0
  79. package/.medusa/server/src/modules/telemetry/repositories/index.d.ts +1 -0
  80. package/.medusa/server/src/modules/telemetry/repositories/index.js +18 -0
  81. package/.medusa/server/src/modules/telemetry/repositories/telemetry-heartbeat.d.ts +10 -0
  82. package/.medusa/server/src/modules/telemetry/repositories/telemetry-heartbeat.js +28 -0
  83. package/.medusa/server/src/modules/telemetry/service.d.ts +25 -0
  84. package/.medusa/server/src/modules/telemetry/service.js +54 -0
  85. package/.medusa/server/src/subscribers/payout-webhook.d.ts +2 -2
  86. package/.medusa/server/src/subscribers/payout-webhook.js +9 -5
  87. package/.medusa/server/src/subscribers/telemetry-first-member-invited.d.ts +3 -0
  88. package/.medusa/server/src/subscribers/telemetry-first-member-invited.js +14 -0
  89. package/.medusa/server/src/subscribers/telemetry-first-offer.d.ts +3 -0
  90. package/.medusa/server/src/subscribers/telemetry-first-offer.js +14 -0
  91. package/.medusa/server/src/subscribers/telemetry-first-order.d.ts +3 -0
  92. package/.medusa/server/src/subscribers/telemetry-first-order.js +14 -0
  93. package/.medusa/server/src/subscribers/telemetry-first-payout-account.d.ts +5 -0
  94. package/.medusa/server/src/subscribers/telemetry-first-payout-account.js +24 -0
  95. package/.medusa/server/src/subscribers/telemetry-first-product-published.d.ts +3 -0
  96. package/.medusa/server/src/subscribers/telemetry-first-product-published.js +14 -0
  97. package/.medusa/server/src/subscribers/telemetry-first-seller-approved.d.ts +3 -0
  98. package/.medusa/server/src/subscribers/telemetry-first-seller-approved.js +14 -0
  99. package/.medusa/server/src/subscribers/telemetry-first-seller.d.ts +3 -0
  100. package/.medusa/server/src/subscribers/telemetry-first-seller.js +14 -0
  101. package/.medusa/server/src/utils/telemetry/boot.d.ts +7 -0
  102. package/.medusa/server/src/utils/telemetry/boot.js +117 -0
  103. package/.medusa/server/src/utils/telemetry/buckets.d.ts +2 -0
  104. package/.medusa/server/src/utils/telemetry/buckets.js +22 -0
  105. package/.medusa/server/src/utils/telemetry/config.d.ts +19 -0
  106. package/.medusa/server/src/utils/telemetry/config.js +60 -0
  107. package/.medusa/server/src/utils/telemetry/first-party.d.ts +11 -0
  108. package/.medusa/server/src/utils/telemetry/first-party.js +33 -0
  109. package/.medusa/server/src/utils/telemetry/identity.d.ts +6 -0
  110. package/.medusa/server/src/utils/telemetry/identity.js +32 -0
  111. package/.medusa/server/src/utils/telemetry/index.d.ts +8 -0
  112. package/.medusa/server/src/utils/telemetry/index.js +27 -0
  113. package/.medusa/server/src/utils/telemetry/milestones.d.ts +20 -0
  114. package/.medusa/server/src/utils/telemetry/milestones.js +60 -0
  115. package/.medusa/server/src/utils/telemetry/sender.d.ts +17 -0
  116. package/.medusa/server/src/utils/telemetry/sender.js +48 -0
  117. package/.medusa/server/src/utils/telemetry/snapshot.d.ts +13 -0
  118. package/.medusa/server/src/utils/telemetry/snapshot.js +193 -0
  119. package/.medusa/server/src/with-mercur.d.ts +6 -0
  120. package/.medusa/server/src/with-mercur.js +1 -1
  121. package/.medusa/server/src/workflows/payment/utils/split-order-payment-group.js +11 -3
  122. package/.medusa/server/src/workflows/payment/workflows/process-payment.js +10 -5
  123. package/.medusa/server/src/workflows/payout/steps/create-onboarding.d.ts +8 -2
  124. package/.medusa/server/src/workflows/payout/steps/create-onboarding.js +10 -4
  125. package/.medusa/server/src/workflows/payout/steps/create-payout-account.d.ts +3 -2
  126. package/.medusa/server/src/workflows/payout/steps/create-payout-account.js +9 -3
  127. package/.medusa/server/src/workflows/payout/steps/create-payout-accounts.d.ts +11 -0
  128. package/.medusa/server/src/workflows/payout/steps/create-payout-accounts.js +22 -0
  129. package/.medusa/server/src/workflows/payout/steps/create-payout-reversals.d.ts +4 -0
  130. package/.medusa/server/src/workflows/payout/steps/create-payout-reversals.js +23 -0
  131. package/.medusa/server/src/workflows/payout/steps/create-payouts.d.ts +4 -0
  132. package/.medusa/server/src/workflows/payout/steps/create-payouts.js +23 -0
  133. package/.medusa/server/src/workflows/payout/steps/index.d.ts +12 -5
  134. package/.medusa/server/src/workflows/payout/steps/index.js +13 -6
  135. package/.medusa/server/src/workflows/payout/steps/process-payout-reversals.d.ts +6 -0
  136. package/.medusa/server/src/workflows/payout/steps/process-payout-reversals.js +17 -0
  137. package/.medusa/server/src/workflows/payout/steps/process-payouts.d.ts +6 -0
  138. package/.medusa/server/src/workflows/payout/steps/process-payouts.js +17 -0
  139. package/.medusa/server/src/workflows/payout/steps/sync-payout-account.d.ts +8 -0
  140. package/.medusa/server/src/workflows/payout/steps/sync-payout-account.js +33 -0
  141. package/.medusa/server/src/workflows/payout/steps/update-payout-reversals.d.ts +4 -0
  142. package/.medusa/server/src/workflows/payout/steps/update-payout-reversals.js +29 -0
  143. package/.medusa/server/src/workflows/payout/steps/update-payouts.d.ts +4 -0
  144. package/.medusa/server/src/workflows/payout/steps/update-payouts.js +34 -0
  145. package/.medusa/server/src/workflows/payout/steps/validate-onboarding-token.d.ts +12 -0
  146. package/.medusa/server/src/workflows/payout/steps/validate-onboarding-token.js +23 -0
  147. package/.medusa/server/src/workflows/payout/steps/validate-payout-retry.d.ts +10 -0
  148. package/.medusa/server/src/workflows/payout/steps/validate-payout-retry.js +15 -0
  149. package/.medusa/server/src/workflows/payout/steps/validate-seller-without-payout-account.d.ts +10 -0
  150. package/.medusa/server/src/workflows/payout/steps/validate-seller-without-payout-account.js +13 -0
  151. package/.medusa/server/src/workflows/payout/utils/fulfillment-status.d.ts +26 -0
  152. package/.medusa/server/src/workflows/payout/utils/fulfillment-status.js +64 -0
  153. package/.medusa/server/src/workflows/payout/utils/index.d.ts +3 -0
  154. package/.medusa/server/src/workflows/payout/utils/index.js +20 -0
  155. package/.medusa/server/src/workflows/payout/utils/payout-amounts.d.ts +173 -0
  156. package/.medusa/server/src/workflows/payout/utils/payout-amounts.js +304 -0
  157. package/.medusa/server/src/workflows/payout/utils/sent-to-provider.d.ts +11 -0
  158. package/.medusa/server/src/workflows/payout/utils/sent-to-provider.js +15 -0
  159. package/.medusa/server/src/workflows/payout/workflows/create-onboarding.d.ts +5 -0
  160. package/.medusa/server/src/workflows/payout/workflows/create-onboarding.js +8 -3
  161. package/.medusa/server/src/workflows/payout/workflows/create-or-refresh-seller-payout-account.d.ts +16 -0
  162. package/.medusa/server/src/workflows/payout/workflows/create-or-refresh-seller-payout-account.js +38 -0
  163. package/.medusa/server/src/workflows/payout/workflows/create-order-payouts.d.ts +28 -0
  164. package/.medusa/server/src/workflows/payout/workflows/create-order-payouts.js +82 -0
  165. package/.medusa/server/src/workflows/payout/workflows/create-payout-account.d.ts +11 -5
  166. package/.medusa/server/src/workflows/payout/workflows/create-payout-account.js +42 -17
  167. package/.medusa/server/src/workflows/payout/workflows/create-payout-reversals.d.ts +14 -0
  168. package/.medusa/server/src/workflows/payout/workflows/create-payout-reversals.js +61 -0
  169. package/.medusa/server/src/workflows/payout/workflows/index.d.ts +11 -2
  170. package/.medusa/server/src/workflows/payout/workflows/index.js +12 -3
  171. package/.medusa/server/src/workflows/payout/workflows/link-payout-account.d.ts +11 -0
  172. package/.medusa/server/src/workflows/payout/workflows/link-payout-account.js +35 -0
  173. package/.medusa/server/src/workflows/payout/workflows/process-payout-for-webhook.d.ts +7 -3
  174. package/.medusa/server/src/workflows/payout/workflows/process-payout-for-webhook.js +50 -57
  175. package/.medusa/server/src/workflows/payout/workflows/process-payout-reversal.d.ts +9 -0
  176. package/.medusa/server/src/workflows/payout/workflows/process-payout-reversal.js +19 -0
  177. package/.medusa/server/src/workflows/payout/workflows/process-payout.d.ts +13 -0
  178. package/.medusa/server/src/workflows/payout/workflows/process-payout.js +23 -0
  179. package/.medusa/server/src/workflows/payout/workflows/refresh-onboarding.d.ts +13 -0
  180. package/.medusa/server/src/workflows/payout/workflows/refresh-onboarding.js +26 -0
  181. package/.medusa/server/src/workflows/payout/workflows/refresh-payout-account-link.d.ts +9 -0
  182. package/.medusa/server/src/workflows/payout/workflows/refresh-payout-account-link.js +15 -0
  183. package/.medusa/server/src/workflows/payout/workflows/retry-payout.d.ts +10 -0
  184. package/.medusa/server/src/workflows/payout/workflows/retry-payout.js +36 -0
  185. package/.medusa/server/src/workflows/payout/workflows/sync-payout-account.d.ts +9 -0
  186. package/.medusa/server/src/workflows/payout/workflows/sync-payout-account.js +24 -0
  187. package/package.json +3 -3
  188. package/.medusa/server/src/workflows/payout/steps/create-payout.d.ts +0 -3
  189. package/.medusa/server/src/workflows/payout/steps/create-payout.js +0 -12
  190. package/.medusa/server/src/workflows/payout/steps/update-payout-account.d.ts +0 -35
  191. package/.medusa/server/src/workflows/payout/steps/update-payout-account.js +0 -27
  192. package/.medusa/server/src/workflows/payout/steps/update-payout.d.ts +0 -35
  193. package/.medusa/server/src/workflows/payout/steps/update-payout.js +0 -27
  194. package/.medusa/server/src/workflows/payout/steps/validate-seller-payout-account.d.ts +0 -5
  195. package/.medusa/server/src/workflows/payout/steps/validate-seller-payout-account.js +0 -21
  196. package/.medusa/server/src/workflows/payout/workflows/create-payout.d.ts +0 -9
  197. package/.medusa/server/src/workflows/payout/workflows/create-payout.js +0 -87
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.scheduleTelemetryBoot = scheduleTelemetryBoot;
4
+ const framework_1 = require("@medusajs/framework");
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const types_1 = require("@mercurjs/types");
7
+ const config_1 = require("./config");
8
+ const milestones_1 = require("./milestones");
9
+ const sender_1 = require("./sender");
10
+ const snapshot_1 = require("./snapshot");
11
+ let scheduled = false;
12
+ const startedAt = Date.now();
13
+ const uptimeSeconds = () => Math.floor((Date.now() - startedAt) / 1_000);
14
+ const groupIdentify = (installation, snapshot) => {
15
+ const { $groups: _groups, ...properties } = snapshot;
16
+ return {
17
+ event: "$groupidentify",
18
+ distinct_id: installation.installation_id,
19
+ properties: {
20
+ $group_type: "installation",
21
+ $group_key: installation.installation_id,
22
+ $group_set: properties,
23
+ },
24
+ };
25
+ };
26
+ const bucketMilestones = [
27
+ ["payouts_paid", milestones_1.TelemetryMilestones.FIRST_PAYOUT_PAID],
28
+ ["commission_rules_total", milestones_1.TelemetryMilestones.FIRST_COMMISSION_RULE],
29
+ ];
30
+ async function report(container, event) {
31
+ const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
32
+ const service = container.resolve(types_1.MercurModules.TELEMETRY);
33
+ const sender = (0, sender_1.createTelemetrySender)({ logger });
34
+ const installation = await service.getOrCreateInstallation();
35
+ const snapshot = await (0, snapshot_1.collectSnapshot)(container, installation, uptimeSeconds());
36
+ const events = [
37
+ { event, distinct_id: installation.installation_id, properties: snapshot },
38
+ groupIdentify(installation, snapshot),
39
+ ];
40
+ const version = snapshot.mercur_version;
41
+ if (version && installation.last_reported_version && installation.last_reported_version !== version) {
42
+ events.push({
43
+ event: "instance_upgraded",
44
+ distinct_id: installation.installation_id,
45
+ properties: { ...snapshot, from_version: installation.last_reported_version, to_version: version },
46
+ });
47
+ }
48
+ const milestones = (installation.milestones ?? {});
49
+ const dueMilestones = [
50
+ ...(snapshot.node_env === "production" ? [milestones_1.TelemetryMilestones.FIRST_PRODUCTION_BOOT] : []),
51
+ ...bucketMilestones.filter(([key]) => snapshot[key] && snapshot[key] !== "0").map(([, m]) => m),
52
+ ].filter((m) => !milestones[m]);
53
+ for (const milestone of dueMilestones) {
54
+ if (await service.recordMilestone(milestone)) {
55
+ events.push({
56
+ event: "installation_milestone",
57
+ distinct_id: installation.installation_id,
58
+ properties: { ...snapshot, milestone, days_since_install: snapshot.instance_age_days },
59
+ });
60
+ }
61
+ }
62
+ await sender.capture(events);
63
+ if (version && installation.last_reported_version !== version) {
64
+ await service.setReportedVersion(version);
65
+ }
66
+ }
67
+ function scheduleHeartbeat(container) {
68
+ const delay = config_1.HEARTBEAT_INTERVAL_MS + Math.floor(Math.random() * config_1.HEARTBEAT_JITTER_MS);
69
+ const timer = setTimeout(async () => {
70
+ try {
71
+ const service = container.resolve(types_1.MercurModules.TELEMETRY);
72
+ if (await service.claimHeartbeat(config_1.HEARTBEAT_MIN_GAP_SECONDS)) {
73
+ await report(container, "instance_heartbeat");
74
+ }
75
+ }
76
+ catch (error) {
77
+ container.resolve(utils_1.ContainerRegistrationKeys.LOGGER).debug(`[telemetry] heartbeat skipped: ${error?.message}`);
78
+ }
79
+ finally {
80
+ scheduleHeartbeat(container);
81
+ }
82
+ }, delay);
83
+ timer.unref();
84
+ }
85
+ async function run(container) {
86
+ const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
87
+ const reason = (0, config_1.telemetryDisabledReason)({ configEnabled: (0, milestones_1.isTelemetryConfigEnabled)(container) });
88
+ if (reason) {
89
+ logger.debug(`[telemetry] disabled (${reason}). ${config_1.TELEMETRY_DOCS_URL}`);
90
+ return;
91
+ }
92
+ try {
93
+ const service = container.resolve(types_1.MercurModules.TELEMETRY);
94
+ await service.getOrCreateInstallation();
95
+ await service.claimHeartbeat(0);
96
+ await report(container, "instance_started");
97
+ }
98
+ catch (error) {
99
+ logger.debug(`[telemetry] boot report skipped: ${error?.message}`);
100
+ }
101
+ scheduleHeartbeat(container);
102
+ }
103
+ /**
104
+ * Called from the plugin's API middleware file, which Medusa only loads in
105
+ * processes that serve HTTP. Worker processes, `medusa exec` and migrations
106
+ * never import it, so a boot event means a real server came up.
107
+ */
108
+ function scheduleTelemetryBoot(container = framework_1.container) {
109
+ if (scheduled)
110
+ return;
111
+ scheduled = true;
112
+ const timer = setTimeout(() => {
113
+ run(container).catch(() => undefined);
114
+ }, (0, config_1.startupDelayMs)());
115
+ timer.unref();
116
+ }
117
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy91dGlscy90ZWxlbWV0cnkvYm9vdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQWdJQSxzREFRQztBQXhJRCxtREFBa0U7QUFFbEUscURBQXFFO0FBQ3JFLDJDQUErQztBQUcvQyxxQ0FPaUI7QUFDakIsNkNBQTRFO0FBQzVFLHFDQUFnRTtBQUNoRSx5Q0FBZ0U7QUFFaEUsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFBO0FBQ3JCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQTtBQUU1QixNQUFNLGFBQWEsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFNBQVMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFBO0FBRXhFLE1BQU0sYUFBYSxHQUFHLENBQUMsWUFBZ0MsRUFBRSxRQUFpQyxFQUFrQixFQUFFO0lBQzVHLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsVUFBVSxFQUFFLEdBQUcsUUFBUSxDQUFBO0lBQ3BELE9BQU87UUFDTCxLQUFLLEVBQUUsZ0JBQWdCO1FBQ3ZCLFdBQVcsRUFBRSxZQUFZLENBQUMsZUFBZTtRQUN6QyxVQUFVLEVBQUU7WUFDVixXQUFXLEVBQUUsY0FBYztZQUMzQixVQUFVLEVBQUUsWUFBWSxDQUFDLGVBQWU7WUFDeEMsVUFBVSxFQUFFLFVBQVU7U0FDdkI7S0FDRixDQUFBO0FBQ0gsQ0FBQyxDQUFBO0FBRUQsTUFBTSxnQkFBZ0IsR0FBb0Y7SUFDeEcsQ0FBQyxjQUFjLEVBQUUsZ0NBQW1CLENBQUMsaUJBQWlCLENBQUM7SUFDdkQsQ0FBQyx3QkFBd0IsRUFBRSxnQ0FBbUIsQ0FBQyxxQkFBcUIsQ0FBQztDQUN0RSxDQUFBO0FBRUQsS0FBSyxVQUFVLE1BQU0sQ0FBQyxTQUEwQixFQUFFLEtBQWdEO0lBQ2hH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
@@ -0,0 +1,2 @@
1
+ export type CountBucket = "0" | "1-10" | "11-100" | "101-1k" | "1k-10k" | "10k-100k" | "100k+";
2
+ export declare function toBucket(count: number | null | undefined): CountBucket | undefined;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toBucket = toBucket;
4
+ function toBucket(count) {
5
+ if (count === null || count === undefined || !Number.isFinite(count) || count < 0) {
6
+ return undefined;
7
+ }
8
+ if (count === 0)
9
+ return "0";
10
+ if (count <= 10)
11
+ return "1-10";
12
+ if (count <= 100)
13
+ return "11-100";
14
+ if (count <= 1_000)
15
+ return "101-1k";
16
+ if (count <= 10_000)
17
+ return "1k-10k";
18
+ if (count <= 100_000)
19
+ return "10k-100k";
20
+ return "100k+";
21
+ }
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVja2V0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy91dGlscy90ZWxlbWV0cnkvYnVja2V0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLDRCQVdDO0FBWEQsU0FBZ0IsUUFBUSxDQUFDLEtBQWdDO0lBQ3ZELElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbEYsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztJQUNELElBQUksS0FBSyxLQUFLLENBQUM7UUFBRSxPQUFPLEdBQUcsQ0FBQTtJQUMzQixJQUFJLEtBQUssSUFBSSxFQUFFO1FBQUUsT0FBTyxNQUFNLENBQUE7SUFDOUIsSUFBSSxLQUFLLElBQUksR0FBRztRQUFFLE9BQU8sUUFBUSxDQUFBO0lBQ2pDLElBQUksS0FBSyxJQUFJLEtBQUs7UUFBRSxPQUFPLFFBQVEsQ0FBQTtJQUNuQyxJQUFJLEtBQUssSUFBSSxNQUFNO1FBQUUsT0FBTyxRQUFRLENBQUE7SUFDcEMsSUFBSSxLQUFLLElBQUksT0FBTztRQUFFLE9BQU8sVUFBVSxDQUFBO0lBQ3ZDLE9BQU8sT0FBTyxDQUFBO0FBQ2hCLENBQUMifQ==
@@ -0,0 +1,19 @@
1
+ export declare const TELEMETRY_SCHEMA_VERSION = 1;
2
+ export declare const TELEMETRY_DOCS_URL = "https://docs.mercurjs.com/telemetry";
3
+ export declare const DEFAULT_TELEMETRY_HOST = "https://telemetry.mercurjs.com";
4
+ export declare const TELEMETRY_REQUEST_TIMEOUT_MS = 2000;
5
+ export declare const HEARTBEAT_INTERVAL_MS: number;
6
+ export declare const HEARTBEAT_JITTER_MS: number;
7
+ export declare const HEARTBEAT_MIN_GAP_SECONDS: number;
8
+ export declare const DEFAULT_STARTUP_DELAY_MS = 5000;
9
+ export declare const isCi: (env?: NodeJS.ProcessEnv) => boolean;
10
+ export type TelemetryEnablementInput = {
11
+ env?: NodeJS.ProcessEnv;
12
+ configEnabled?: boolean;
13
+ workerMode?: string;
14
+ };
15
+ export type TelemetryDisabledReason = "env" | "do_not_track" | "config" | "ci" | "test" | "worker";
16
+ export declare function telemetryDisabledReason({ env, configEnabled, workerMode, }?: TelemetryEnablementInput): TelemetryDisabledReason | null;
17
+ export declare const isTelemetryDebug: (env?: NodeJS.ProcessEnv) => boolean;
18
+ export declare const telemetryHost: (env?: NodeJS.ProcessEnv) => string;
19
+ export declare const startupDelayMs: (env?: NodeJS.ProcessEnv) => number;
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.startupDelayMs = exports.telemetryHost = exports.isTelemetryDebug = exports.isCi = exports.DEFAULT_STARTUP_DELAY_MS = exports.HEARTBEAT_MIN_GAP_SECONDS = exports.HEARTBEAT_JITTER_MS = exports.HEARTBEAT_INTERVAL_MS = exports.TELEMETRY_REQUEST_TIMEOUT_MS = exports.DEFAULT_TELEMETRY_HOST = exports.TELEMETRY_DOCS_URL = exports.TELEMETRY_SCHEMA_VERSION = void 0;
4
+ exports.telemetryDisabledReason = telemetryDisabledReason;
5
+ exports.TELEMETRY_SCHEMA_VERSION = 1;
6
+ exports.TELEMETRY_DOCS_URL = "https://docs.mercurjs.com/telemetry";
7
+ exports.DEFAULT_TELEMETRY_HOST = "https://telemetry.mercurjs.com";
8
+ exports.TELEMETRY_REQUEST_TIMEOUT_MS = 2_000;
9
+ exports.HEARTBEAT_INTERVAL_MS = 24 * 60 * 60 * 1_000;
10
+ exports.HEARTBEAT_JITTER_MS = 60 * 60 * 1_000;
11
+ exports.HEARTBEAT_MIN_GAP_SECONDS = 23 * 60 * 60;
12
+ exports.DEFAULT_STARTUP_DELAY_MS = 5_000;
13
+ const CI_ENV_KEYS = [
14
+ "CI",
15
+ "GITHUB_ACTIONS",
16
+ "GITLAB_CI",
17
+ "CIRCLECI",
18
+ "BUILDKITE",
19
+ "JENKINS_URL",
20
+ "TF_BUILD",
21
+ "TEAMCITY_VERSION",
22
+ "DRONE",
23
+ ];
24
+ const isTruthy = (value) => value !== undefined && ["1", "true", "yes"].includes(value.toLowerCase());
25
+ const isCi = (env = process.env) => CI_ENV_KEYS.some((key) => Boolean(env[key]));
26
+ exports.isCi = isCi;
27
+ function telemetryDisabledReason({ env = process.env, configEnabled = true, workerMode, } = {}) {
28
+ if (isTruthy(env.MERCUR_TELEMETRY_FORCE_ENABLED)) {
29
+ return null;
30
+ }
31
+ if (isTruthy(env.MERCUR_DISABLE_TELEMETRY)) {
32
+ return "env";
33
+ }
34
+ if (isTruthy(env.DO_NOT_TRACK)) {
35
+ return "do_not_track";
36
+ }
37
+ if (!configEnabled) {
38
+ return "config";
39
+ }
40
+ if (env.NODE_ENV === "test") {
41
+ return "test";
42
+ }
43
+ if ((0, exports.isCi)(env)) {
44
+ return "ci";
45
+ }
46
+ if (workerMode === "worker" || env.MEDUSA_WORKER_MODE === "worker") {
47
+ return "worker";
48
+ }
49
+ return null;
50
+ }
51
+ const isTelemetryDebug = (env = process.env) => isTruthy(env.MERCUR_TELEMETRY_DEBUG);
52
+ exports.isTelemetryDebug = isTelemetryDebug;
53
+ const telemetryHost = (env = process.env) => (env.MERCUR_TELEMETRY_PROXY_URL || exports.DEFAULT_TELEMETRY_HOST).replace(/\/+$/, "");
54
+ exports.telemetryHost = telemetryHost;
55
+ const startupDelayMs = (env = process.env) => {
56
+ const parsed = Number(env.MERCUR_TELEMETRY_STARTUP_DELAY_MS);
57
+ return Number.isFinite(parsed) && parsed >= 0 ? parsed : exports.DEFAULT_STARTUP_DELAY_MS;
58
+ };
59
+ exports.startupDelayMs = startupDelayMs;
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3RlbGVtZXRyeS9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBeUNBLDBEQTJCQztBQXBFWSxRQUFBLHdCQUF3QixHQUFHLENBQUMsQ0FBQTtBQUM1QixRQUFBLGtCQUFrQixHQUFHLHFDQUFxQyxDQUFBO0FBQzFELFFBQUEsc0JBQXNCLEdBQUcsZ0NBQWdDLENBQUE7QUFDekQsUUFBQSw0QkFBNEIsR0FBRyxLQUFLLENBQUE7QUFDcEMsUUFBQSxxQkFBcUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUE7QUFDNUMsUUFBQSxtQkFBbUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEtBQUssQ0FBQTtBQUNyQyxRQUFBLHlCQUF5QixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFBO0FBQ3hDLFFBQUEsd0JBQXdCLEdBQUcsS0FBSyxDQUFBO0FBRTdDLE1BQU0sV0FBVyxHQUFHO0lBQ2xCLElBQUk7SUFDSixnQkFBZ0I7SUFDaEIsV0FBVztJQUNYLFVBQVU7SUFDVixXQUFXO0lBQ1gsYUFBYTtJQUNiLFVBQVU7SUFDVixrQkFBa0I7SUFDbEIsT0FBTztDQUNSLENBQUE7QUFFRCxNQUFNLFFBQVEsR0FBRyxDQUFDLEtBQXlCLEVBQUUsRUFBRSxDQUM3QyxLQUFLLEtBQUssU0FBUyxJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUE7QUFFcEUsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUF5QixPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FDM0QsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFEakMsUUFBQSxJQUFJLFFBQzZCO0FBZ0I5QyxTQUFnQix1QkFBdUIsQ0FBQyxFQUN0QyxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFDakIsYUFBYSxHQUFHLElBQUksRUFDcEIsVUFBVSxNQUNrQixFQUFFO0lBQzlCLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxFQUFFLENBQUM7UUFDakQsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBQ0QsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLEVBQUUsQ0FBQztRQUMzQyxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7SUFDRCxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztRQUMvQixPQUFPLGNBQWMsQ0FBQTtJQUN2QixDQUFDO0lBQ0QsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ25CLE9BQU8sUUFBUSxDQUFBO0lBQ2pCLENBQUM7SUFDRCxJQUFJLEdBQUcsQ0FBQyxRQUFRLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDNUIsT0FBTyxNQUFNLENBQUE7SUFDZixDQUFDO0lBQ0QsSUFBSSxJQUFBLFlBQUksRUFBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2QsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBQ0QsSUFBSSxVQUFVLEtBQUssUUFBUSxJQUFJLEdBQUcsQ0FBQyxrQkFBa0IsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNuRSxPQUFPLFFBQVEsQ0FBQTtJQUNqQixDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDO0FBRU0sTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLE1BQXlCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUN2RSxRQUFRLENBQUMsR0FBRyxDQUFDLHNCQUFzQixDQUFDLENBQUE7QUFEekIsUUFBQSxnQkFBZ0Isb0JBQ1M7QUFFL0IsTUFBTSxhQUFhLEdBQUcsQ0FBQyxNQUF5QixPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FDcEUsQ0FBQyxHQUFHLENBQUMsMEJBQTBCLElBQUksOEJBQXNCLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0FBRG5FLFFBQUEsYUFBYSxpQkFDc0Q7QUFFekUsTUFBTSxjQUFjLEdBQUcsQ0FBQyxNQUF5QixPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUU7SUFDckUsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFBO0lBQzVELE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGdDQUF3QixDQUFBO0FBQ25GLENBQUMsQ0FBQTtBQUhZLFFBQUEsY0FBYyxrQkFHMUIifQ==
@@ -0,0 +1,11 @@
1
+ export declare const isFirstPartyName: (name: string) => boolean;
2
+ export type NameSplit = {
3
+ first_party: string[];
4
+ custom_count: number;
5
+ };
6
+ /**
7
+ * Keeps only package names Mercur or Medusa publish. Anything else is counted,
8
+ * never named, because a custom plugin or provider name can identify a company.
9
+ */
10
+ export declare function splitFirstParty(names: Array<string | undefined | null>): NameSplit;
11
+ export declare const providerIdLabel: (resolve: string | undefined, id: string | undefined) => string | undefined;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.providerIdLabel = exports.isFirstPartyName = void 0;
4
+ exports.splitFirstParty = splitFirstParty;
5
+ const FIRST_PARTY_PREFIXES = ["@mercurjs/", "@medusajs/"];
6
+ const isFirstPartyName = (name) => FIRST_PARTY_PREFIXES.some((prefix) => name.startsWith(prefix));
7
+ exports.isFirstPartyName = isFirstPartyName;
8
+ /**
9
+ * Keeps only package names Mercur or Medusa publish. Anything else is counted,
10
+ * never named, because a custom plugin or provider name can identify a company.
11
+ */
12
+ function splitFirstParty(names) {
13
+ const first_party = new Set();
14
+ let custom_count = 0;
15
+ for (const name of names) {
16
+ if (!name)
17
+ continue;
18
+ if ((0, exports.isFirstPartyName)(name)) {
19
+ first_party.add(name);
20
+ }
21
+ else {
22
+ custom_count += 1;
23
+ }
24
+ }
25
+ return { first_party: [...first_party].sort(), custom_count };
26
+ }
27
+ const providerIdLabel = (resolve, id) => {
28
+ if (!resolve || !id)
29
+ return undefined;
30
+ return (0, exports.isFirstPartyName)(resolve) ? `${resolve}#${id}` : "custom";
31
+ };
32
+ exports.providerIdLabel = providerIdLabel;
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlyc3QtcGFydHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvdXRpbHMvdGVsZW1ldHJ5L2ZpcnN0LXBhcnR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWNBLDBDQWNDO0FBNUJELE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQUE7QUFFbEQsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLElBQVksRUFBRSxFQUFFLENBQy9DLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO0FBRG5ELFFBQUEsZ0JBQWdCLG9CQUNtQztBQU9oRTs7O0dBR0c7QUFDSCxTQUFnQixlQUFlLENBQUMsS0FBdUM7SUFDckUsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQTtJQUNyQyxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUE7SUFFcEIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsSUFBSTtZQUFFLFNBQVE7UUFDbkIsSUFBSSxJQUFBLHdCQUFnQixFQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDM0IsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN2QixDQUFDO2FBQU0sQ0FBQztZQUNOLFlBQVksSUFBSSxDQUFDLENBQUE7UUFDbkIsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxZQUFZLEVBQUUsQ0FBQTtBQUMvRCxDQUFDO0FBRU0sTUFBTSxlQUFlLEdBQUcsQ0FBQyxPQUEyQixFQUFFLEVBQXNCLEVBQUUsRUFBRTtJQUNyRixJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsRUFBRTtRQUFFLE9BQU8sU0FBUyxDQUFBO0lBQ3JDLE9BQU8sSUFBQSx3QkFBZ0IsRUFBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQTtBQUNsRSxDQUFDLENBQUE7QUFIWSxRQUFBLGVBQWUsbUJBRzNCIn0=
@@ -0,0 +1,6 @@
1
+ export declare const hashProjectKey: (input: string) => string;
2
+ /**
3
+ * Stable, irreversible id for the codebase an instance was built from. Shared
4
+ * with the CLI so a scaffolded project can be matched to its running server.
5
+ */
6
+ export declare function resolveProjectId(cwd?: string): string;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hashProjectKey = void 0;
4
+ exports.resolveProjectId = resolveProjectId;
5
+ const node_child_process_1 = require("node:child_process");
6
+ const node_crypto_1 = require("node:crypto");
7
+ const PROJECT_ID_SALT = "mercur-telemetry-v1";
8
+ const hashProjectKey = (input) => (0, node_crypto_1.createHash)("sha256").update(`${PROJECT_ID_SALT}:${input}`).digest("base64url");
9
+ exports.hashProjectKey = hashProjectKey;
10
+ const gitRemote = (cwd) => {
11
+ try {
12
+ return (0, node_child_process_1.execSync)("git config --local --get remote.origin.url", {
13
+ cwd,
14
+ stdio: "pipe",
15
+ timeout: 1_000,
16
+ })
17
+ .toString()
18
+ .trim();
19
+ }
20
+ catch {
21
+ return null;
22
+ }
23
+ };
24
+ /**
25
+ * Stable, irreversible id for the codebase an instance was built from. Shared
26
+ * with the CLI so a scaffolded project can be matched to its running server.
27
+ */
28
+ function resolveProjectId(cwd = process.cwd()) {
29
+ const remote = gitRemote(cwd);
30
+ return (0, exports.hashProjectKey)(remote || cwd);
31
+ }
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvdXRpbHMvdGVsZW1ldHJ5L2lkZW50aXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTBCQSw0Q0FHQztBQTdCRCwyREFBNkM7QUFDN0MsNkNBQXdDO0FBRXhDLE1BQU0sZUFBZSxHQUFHLHFCQUFxQixDQUFBO0FBRXRDLE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FDOUMsSUFBQSx3QkFBVSxFQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLGVBQWUsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQTtBQURuRSxRQUFBLGNBQWMsa0JBQ3FEO0FBRWhGLE1BQU0sU0FBUyxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUU7SUFDaEMsSUFBSSxDQUFDO1FBQ0gsT0FBTyxJQUFBLDZCQUFRLEVBQUMsNENBQTRDLEVBQUU7WUFDNUQsR0FBRztZQUNILEtBQUssRUFBRSxNQUFNO1lBQ2IsT0FBTyxFQUFFLEtBQUs7U0FDZixDQUFDO2FBQ0MsUUFBUSxFQUFFO2FBQ1YsSUFBSSxFQUFFLENBQUE7SUFDWCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0FBQ0gsQ0FBQyxDQUFBO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsZ0JBQWdCLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUU7SUFDbEQsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQzdCLE9BQU8sSUFBQSxzQkFBYyxFQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQTtBQUN0QyxDQUFDIn0=
@@ -0,0 +1,8 @@
1
+ export * from "./buckets";
2
+ export * from "./config";
3
+ export * from "./first-party";
4
+ export * from "./identity";
5
+ export * from "./milestones";
6
+ export * from "./sender";
7
+ export * from "./snapshot";
8
+ export { scheduleTelemetryBoot } from "./boot";
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.scheduleTelemetryBoot = void 0;
18
+ __exportStar(require("./buckets"), exports);
19
+ __exportStar(require("./config"), exports);
20
+ __exportStar(require("./first-party"), exports);
21
+ __exportStar(require("./identity"), exports);
22
+ __exportStar(require("./milestones"), exports);
23
+ __exportStar(require("./sender"), exports);
24
+ __exportStar(require("./snapshot"), exports);
25
+ var boot_1 = require("./boot");
26
+ Object.defineProperty(exports, "scheduleTelemetryBoot", { enumerable: true, get: function () { return boot_1.scheduleTelemetryBoot; } });
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvdXRpbHMvdGVsZW1ldHJ5L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNENBQXlCO0FBQ3pCLDJDQUF3QjtBQUN4QixnREFBNkI7QUFDN0IsNkNBQTBCO0FBQzFCLCtDQUE0QjtBQUM1QiwyQ0FBd0I7QUFDeEIsNkNBQTBCO0FBQzFCLCtCQUE4QztBQUFyQyw2R0FBQSxxQkFBcUIsT0FBQSJ9
@@ -0,0 +1,20 @@
1
+ import { MedusaContainer } from "@medusajs/framework/types";
2
+ export declare const TelemetryMilestones: {
3
+ readonly FIRST_PRODUCTION_BOOT: "first_production_boot";
4
+ readonly FIRST_SELLER: "first_seller";
5
+ readonly FIRST_SELLER_APPROVED: "first_seller_approved";
6
+ readonly FIRST_MEMBER_INVITED: "first_member_invited";
7
+ readonly FIRST_OFFER: "first_offer";
8
+ readonly FIRST_PRODUCT_PUBLISHED: "first_product_published";
9
+ readonly FIRST_ORDER: "first_order";
10
+ readonly FIRST_PAYOUT_ACCOUNT: "first_payout_account";
11
+ readonly FIRST_PAYOUT_PAID: "first_payout_paid";
12
+ readonly FIRST_COMMISSION_RULE: "first_commission_rule";
13
+ };
14
+ export type TelemetryMilestone = (typeof TelemetryMilestones)[keyof typeof TelemetryMilestones];
15
+ export declare const isTelemetryConfigEnabled: (container: MedusaContainer) => boolean;
16
+ /**
17
+ * Milestones are recorded from subscribers, which in a split deployment run in
18
+ * the worker, so the worker-process rule that gates boot events does not apply.
19
+ */
20
+ export declare function recordMilestone(container: MedusaContainer, milestone: TelemetryMilestone): Promise<boolean>;
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isTelemetryConfigEnabled = exports.TelemetryMilestones = void 0;
4
+ exports.recordMilestone = recordMilestone;
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const types_1 = require("@mercurjs/types");
7
+ const config_1 = require("./config");
8
+ const sender_1 = require("./sender");
9
+ const snapshot_1 = require("./snapshot");
10
+ exports.TelemetryMilestones = {
11
+ FIRST_PRODUCTION_BOOT: "first_production_boot",
12
+ FIRST_SELLER: "first_seller",
13
+ FIRST_SELLER_APPROVED: "first_seller_approved",
14
+ FIRST_MEMBER_INVITED: "first_member_invited",
15
+ FIRST_OFFER: "first_offer",
16
+ FIRST_PRODUCT_PUBLISHED: "first_product_published",
17
+ FIRST_ORDER: "first_order",
18
+ FIRST_PAYOUT_ACCOUNT: "first_payout_account",
19
+ FIRST_PAYOUT_PAID: "first_payout_paid",
20
+ FIRST_COMMISSION_RULE: "first_commission_rule",
21
+ };
22
+ const isTelemetryConfigEnabled = (container) => {
23
+ const configModule = container.resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE);
24
+ const mercur = configModule.projectConfig.mercur;
25
+ return mercur?.telemetry !== false;
26
+ };
27
+ exports.isTelemetryConfigEnabled = isTelemetryConfigEnabled;
28
+ /**
29
+ * Milestones are recorded from subscribers, which in a split deployment run in
30
+ * the worker, so the worker-process rule that gates boot events does not apply.
31
+ */
32
+ async function recordMilestone(container, milestone) {
33
+ try {
34
+ const reason = (0, config_1.telemetryDisabledReason)({ configEnabled: (0, exports.isTelemetryConfigEnabled)(container) });
35
+ if (reason && reason !== "worker") {
36
+ return false;
37
+ }
38
+ const service = container.resolve(types_1.MercurModules.TELEMETRY);
39
+ const installation = await service.getOrCreateInstallation();
40
+ const isNew = await service.recordMilestone(milestone);
41
+ if (!isNew) {
42
+ return false;
43
+ }
44
+ const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
45
+ const sender = (0, sender_1.createTelemetrySender)({ logger });
46
+ const base = (0, snapshot_1.collectBaseProperties)(container, installation);
47
+ await sender.capture([
48
+ {
49
+ event: "installation_milestone",
50
+ distinct_id: installation.installation_id,
51
+ properties: { ...base, milestone, days_since_install: base.instance_age_days },
52
+ },
53
+ ]);
54
+ return true;
55
+ }
56
+ catch {
57
+ return false;
58
+ }
59
+ }
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlsZXN0b25lcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy91dGlscy90ZWxlbWV0cnkvbWlsZXN0b25lcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFrQ0EsMENBNkJDO0FBOURELHFEQUFxRTtBQUNyRSwyQ0FBK0M7QUFHL0MscUNBQWtEO0FBQ2xELHFDQUFnRDtBQUNoRCx5Q0FBa0Q7QUFFckMsUUFBQSxtQkFBbUIsR0FBRztJQUNqQyxxQkFBcUIsRUFBRSx1QkFBdUI7SUFDOUMsWUFBWSxFQUFFLGNBQWM7SUFDNUIscUJBQXFCLEVBQUUsdUJBQXVCO0lBQzlDLG9CQUFvQixFQUFFLHNCQUFzQjtJQUM1QyxXQUFXLEVBQUUsYUFBYTtJQUMxQix1QkFBdUIsRUFBRSx5QkFBeUI7SUFDbEQsV0FBVyxFQUFFLGFBQWE7SUFDMUIsb0JBQW9CLEVBQUUsc0JBQXNCO0lBQzVDLGlCQUFpQixFQUFFLG1CQUFtQjtJQUN0QyxxQkFBcUIsRUFBRSx1QkFBdUI7Q0FDdEMsQ0FBQTtBQUlILE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxTQUEwQixFQUFFLEVBQUU7SUFDckUsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBZSxpQ0FBeUIsQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUM3RixNQUFNLE1BQU0sR0FBSSxZQUFZLENBQUMsYUFBc0QsQ0FBQyxNQUFNLENBQUE7SUFDMUYsT0FBTyxNQUFNLEVBQUUsU0FBUyxLQUFLLEtBQUssQ0FBQTtBQUNwQyxDQUFDLENBQUE7QUFKWSxRQUFBLHdCQUF3Qiw0QkFJcEM7QUFFRDs7O0dBR0c7QUFDSSxLQUFLLFVBQVUsZUFBZSxDQUFDLFNBQTBCLEVBQUUsU0FBNkI7SUFDN0YsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBQSxnQ0FBdUIsRUFBQyxFQUFFLGFBQWEsRUFBRSxJQUFBLGdDQUF3QixFQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUM5RixJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDbEMsT0FBTyxLQUFLLENBQUE7UUFDZCxDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBeUIscUJBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUNsRixNQUFNLFlBQVksR0FBRyxNQUFNLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRSxDQUFBO1FBQzVELE1BQU0sS0FBSyxHQUFHLE1BQU0sT0FBTyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUN0RCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxPQUFPLEtBQUssQ0FBQTtRQUNkLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFTLGlDQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQzFFLE1BQU0sTUFBTSxHQUFHLElBQUEsOEJBQXFCLEVBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFBO1FBQ2hELE1BQU0sSUFBSSxHQUFHLElBQUEsZ0NBQXFCLEVBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFBO1FBRTNELE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQztZQUNuQjtnQkFDRSxLQUFLLEVBQUUsd0JBQXdCO2dCQUMvQixXQUFXLEVBQUUsWUFBWSxDQUFDLGVBQWU7Z0JBQ3pDLFVBQVUsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7YUFDL0U7U0FDRixDQUFDLENBQUE7UUFDRixPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7QUFDSCxDQUFDIn0=
@@ -0,0 +1,17 @@
1
+ import { Logger } from "@medusajs/framework/types";
2
+ export type TelemetryEvent = {
3
+ event: string;
4
+ distinct_id: string;
5
+ properties: Record<string, unknown>;
6
+ timestamp?: string;
7
+ };
8
+ export type TelemetrySender = {
9
+ capture: (events: TelemetryEvent[]) => Promise<void>;
10
+ };
11
+ type SenderOptions = {
12
+ logger?: Logger;
13
+ env?: NodeJS.ProcessEnv;
14
+ fetchImpl?: typeof fetch;
15
+ };
16
+ export declare function createTelemetrySender({ logger, env, fetchImpl, }?: SenderOptions): TelemetrySender;
17
+ export {};
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createTelemetrySender = createTelemetrySender;
4
+ const config_1 = require("./config");
5
+ /**
6
+ * The proxy swaps this for the real project key, so no PostHog credential
7
+ * ships inside the package.
8
+ */
9
+ const PLACEHOLDER_API_KEY = "mercur";
10
+ function createTelemetrySender({ logger, env = process.env, fetchImpl = fetch, } = {}) {
11
+ const url = `${(0, config_1.telemetryHost)(env)}/batch`;
12
+ const debug = (0, config_1.isTelemetryDebug)(env);
13
+ return {
14
+ async capture(events) {
15
+ if (!events.length)
16
+ return;
17
+ const body = {
18
+ api_key: PLACEHOLDER_API_KEY,
19
+ batch: events.map((event) => ({
20
+ ...event,
21
+ timestamp: event.timestamp ?? new Date().toISOString(),
22
+ properties: { ...event.properties, $geoip_disable: true },
23
+ })),
24
+ };
25
+ if (debug) {
26
+ logger?.info(`[telemetry] ${JSON.stringify(body.batch, null, 2)}`);
27
+ return;
28
+ }
29
+ const controller = new AbortController();
30
+ const timer = setTimeout(() => controller.abort(), config_1.TELEMETRY_REQUEST_TIMEOUT_MS);
31
+ try {
32
+ await fetchImpl(url, {
33
+ method: "POST",
34
+ headers: { "content-type": "application/json" },
35
+ body: JSON.stringify(body),
36
+ signal: controller.signal,
37
+ });
38
+ }
39
+ catch (error) {
40
+ logger?.debug(`[telemetry] send failed: ${error?.message}`);
41
+ }
42
+ finally {
43
+ clearTimeout(timer);
44
+ }
45
+ },
46
+ };
47
+ }
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3RlbGVtZXRyeS9zZW5kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUEyQkEsc0RBMENDO0FBbkVELHFDQUF3RjtBQUV4Rjs7O0dBR0c7QUFDSCxNQUFNLG1CQUFtQixHQUFHLFFBQVEsQ0FBQTtBQW1CcEMsU0FBZ0IscUJBQXFCLENBQUMsRUFDcEMsTUFBTSxFQUNOLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUNqQixTQUFTLEdBQUcsS0FBSyxNQUNBLEVBQUU7SUFDbkIsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFBLHNCQUFhLEVBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQTtJQUN6QyxNQUFNLEtBQUssR0FBRyxJQUFBLHlCQUFnQixFQUFDLEdBQUcsQ0FBQyxDQUFBO0lBRW5DLE9BQU87UUFDTCxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU07WUFDbEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNO2dCQUFFLE9BQU07WUFFMUIsTUFBTSxJQUFJLEdBQUc7Z0JBQ1gsT0FBTyxFQUFFLG1CQUFtQjtnQkFDNUIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQzVCLEdBQUcsS0FBSztvQkFDUixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVMsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtvQkFDdEQsVUFBVSxFQUFFLEVBQUUsR0FBRyxLQUFLLENBQUMsVUFBVSxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUU7aUJBQzFELENBQUMsQ0FBQzthQUNKLENBQUE7WUFFRCxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxJQUFJLENBQUMsZUFBZSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtnQkFDbEUsT0FBTTtZQUNSLENBQUM7WUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFBO1lBQ3hDLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUUscUNBQTRCLENBQUMsQ0FBQTtZQUNoRixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxTQUFTLENBQUMsR0FBRyxFQUFFO29CQUNuQixNQUFNLEVBQUUsTUFBTTtvQkFDZCxPQUFPLEVBQUUsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUU7b0JBQy9DLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztvQkFDMUIsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNO2lCQUMxQixDQUFDLENBQUE7WUFDSixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixNQUFNLEVBQUUsS0FBSyxDQUFDLDRCQUE2QixLQUFlLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQTtZQUN4RSxDQUFDO29CQUFTLENBQUM7Z0JBQ1QsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ3JCLENBQUM7UUFDSCxDQUFDO0tBQ0YsQ0FBQTtBQUNILENBQUMifQ==
@@ -0,0 +1,13 @@
1
+ import { MedusaContainer } from "@medusajs/framework/types";
2
+ export type InstallationRecord = {
3
+ installation_id: string;
4
+ created_at: Date | string;
5
+ };
6
+ export declare function collectBaseProperties(container: MedusaContainer, installation: InstallationRecord, env?: NodeJS.ProcessEnv): Record<string, unknown>;
7
+ export declare function collectStackProperties(container: MedusaContainer, env?: NodeJS.ProcessEnv): Record<string, unknown>;
8
+ /**
9
+ * Counts run one at a time on purpose: a heartbeat must never compete with
10
+ * request traffic for the connection pool.
11
+ */
12
+ export declare function collectMarketplaceProperties(container: MedusaContainer): Promise<Record<string, unknown>>;
13
+ export declare function collectSnapshot(container: MedusaContainer, installation: InstallationRecord, uptimeSeconds: number): Promise<Record<string, unknown>>;