@reorderjs/reorder 1.0.7 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/.medusa/server/e2e/auth.setup.js +26 -0
  2. package/.medusa/server/e2e/cancellation-retention.spec.js +133 -0
  3. package/.medusa/server/e2e/pages/CancellationCaseDetailPage.js +69 -0
  4. package/.medusa/server/e2e/pages/CancellationsListPage.js +34 -0
  5. package/.medusa/server/e2e/pages/PlanFormPage.js +89 -0
  6. package/.medusa/server/e2e/pages/RenewalDetailPage.js +101 -0
  7. package/.medusa/server/e2e/pages/SubscriptionDetailPage.js +102 -0
  8. package/.medusa/server/e2e/plans-offers.spec.js +96 -0
  9. package/.medusa/server/e2e/renewal-force.spec.js +154 -0
  10. package/.medusa/server/e2e/seed.setup.js +80 -0
  11. package/.medusa/server/e2e/subscription-status.spec.js +109 -0
  12. package/.medusa/server/e2e/subscriptions-list.spec.js +84 -0
  13. package/.medusa/server/playwright.config.js +37 -0
  14. package/.medusa/server/scripts/reset-subscriptions-test-data.js +279 -0
  15. package/.medusa/server/scripts/seed-subscriptions-test-data.js +2425 -0
  16. package/.medusa/server/scripts/wipe-test-data.js +44 -0
  17. package/.medusa/server/src/admin/index.js +13142 -11709
  18. package/.medusa/server/src/admin/index.mjs +13136 -11703
  19. package/.medusa/server/src/admin/types/activity-log.js +2 -1
  20. package/.medusa/server/src/admin/types/analytics.js +2 -1
  21. package/.medusa/server/src/api/admin/cancellations/validators.js +2 -2
  22. package/.medusa/server/src/api/admin/dunning/validators.js +2 -2
  23. package/.medusa/server/src/api/admin/renewals/validators.js +2 -2
  24. package/.medusa/server/src/api/admin/subscription-analytics/validators.js +2 -2
  25. package/.medusa/server/src/api/admin/subscription-logs/validators.js +2 -2
  26. package/.medusa/server/src/api/admin/subscription-offers/validators.js +2 -2
  27. package/.medusa/server/src/api/admin/subscription-settings/validators.js +2 -2
  28. package/.medusa/server/src/api/admin/subscriptions/[id]/payment-method/route.js +19 -0
  29. package/.medusa/server/src/api/admin/subscriptions/[id]/payment-methods/route.js +10 -0
  30. package/.medusa/server/src/api/admin/subscriptions/middlewares.js +8 -1
  31. package/.medusa/server/src/api/admin/subscriptions/utils.js +5 -1
  32. package/.medusa/server/src/api/admin/subscriptions/validators.js +7 -3
  33. package/.medusa/server/src/api/store/customers/me/subscriptions/[id]/payment-method/route.js +26 -0
  34. package/.medusa/server/src/api/store/customers/me/subscriptions/[id]/payment-methods/route.js +15 -0
  35. package/.medusa/server/src/api/store/customers/me/subscriptions/middlewares.js +8 -1
  36. package/.medusa/server/src/api/store/customers/me/subscriptions/utils.js +72 -1
  37. package/.medusa/server/src/api/store/customers/me/subscriptions/validators.js +7 -3
  38. package/.medusa/server/src/api/store/products/validators.js +2 -2
  39. package/.medusa/server/src/modules/activity-log/__tests__/create-subscription-log-event.spec.js +257 -0
  40. package/.medusa/server/src/modules/activity-log/__tests__/normalize-log-event.spec.js +231 -0
  41. package/.medusa/server/src/modules/activity-log/migrations/Migration20260524220933.js +16 -0
  42. package/.medusa/server/src/modules/activity-log/migrations/Migration20260524225625.js +16 -0
  43. package/.medusa/server/src/modules/activity-log/migrations/Migration20260818120000.js +16 -0
  44. package/.medusa/server/src/modules/activity-log/types/index.js +4 -1
  45. package/.medusa/server/src/modules/activity-log/utils/admin-query.js +15 -1
  46. package/.medusa/server/src/modules/analytics/__tests__/admin-query.spec.js +560 -0
  47. package/.medusa/server/src/modules/analytics/index.js +2 -2
  48. package/.medusa/server/src/modules/analytics/utils/admin-query.js +157 -5
  49. package/.medusa/server/src/modules/plan-offer/__tests__/service.spec.js +94 -0
  50. package/.medusa/server/src/modules/renewal/__tests__/service.spec.js +89 -0
  51. package/.medusa/server/src/modules/settings/__tests__/normalize-settings.spec.js +86 -0
  52. package/.medusa/server/src/modules/settings/__tests__/service.spec.js +124 -0
  53. package/.medusa/server/src/modules/subscription/__tests__/payment-methods.spec.js +186 -0
  54. package/.medusa/server/src/modules/subscription/__tests__/service.spec.js +124 -0
  55. package/.medusa/server/src/modules/subscription/utils/admin-query.js +196 -14
  56. package/.medusa/server/src/modules/subscription/utils/payment-methods.js +146 -0
  57. package/.medusa/server/src/subscription-flows/create-subscription-from-cart.js +55 -2
  58. package/.medusa/server/src/workflows/__tests__/cancel-subscription.spec.js +20 -0
  59. package/.medusa/server/src/workflows/__tests__/pause-subscription.spec.js +20 -0
  60. package/.medusa/server/src/workflows/__tests__/update-subscription-shipping-address.spec.js +49 -0
  61. package/.medusa/server/src/workflows/cancel-subscription.js +21 -1
  62. package/.medusa/server/src/workflows/index.js +6 -2
  63. package/.medusa/server/src/workflows/pause-subscription.js +21 -1
  64. package/.medusa/server/src/workflows/steps/rebuild-analytics-daily-snapshots.js +33 -10
  65. package/.medusa/server/src/workflows/steps/update-subscription-payment-method.js +110 -0
  66. package/.medusa/server/src/workflows/steps/validate-subscription-cart.js +7 -22
  67. package/.medusa/server/src/workflows/update-subscription-payment-method.js +65 -0
  68. package/.medusa/server/src/workflows/utils/analytics-incremental.js +1 -1
  69. package/README.md +89 -36
  70. package/package.json +25 -23
@@ -0,0 +1,560 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const utils_1 = require("@medusajs/framework/utils");
4
+ const analytics_1 = require("../../../admin/types/analytics");
5
+ const admin_query_1 = require("../utils/admin-query");
6
+ function buildRow(id, overrides) {
7
+ return {
8
+ id,
9
+ metric_date: "2026-04-01T00:00:00.000Z",
10
+ subscription_id: `sub_${id}`,
11
+ customer_id: `cus_${id}`,
12
+ product_id: "prod_coffee",
13
+ variant_id: "variant_monthly",
14
+ status: "active",
15
+ frequency_interval: "month",
16
+ frequency_value: 1,
17
+ currency_code: "USD",
18
+ is_active: true,
19
+ active_subscriptions_count: 1,
20
+ mrr_amount: 100,
21
+ churned_subscriptions_count: 0,
22
+ churn_reason_category: null,
23
+ source_snapshot: null,
24
+ metadata: null,
25
+ ...overrides,
26
+ };
27
+ }
28
+ function createSubscription(id, overrides = {}) {
29
+ return {
30
+ id,
31
+ product_id: "prod_coffee",
32
+ status: "active",
33
+ frequency_interval: "month",
34
+ frequency_value: 1,
35
+ created_at: "2026-04-01T00:00:00.000Z",
36
+ ...overrides,
37
+ };
38
+ }
39
+ function createContainer(rows, subscriptions = []) {
40
+ const graph = jest.fn(async (input) => {
41
+ const take = input.pagination?.take ?? 500;
42
+ const skip = input.pagination?.skip ?? 0;
43
+ const source = input.entity === "subscription"
44
+ ? subscriptions
45
+ .filter((subscription) => matchesSubscriptionFilters(subscription, input.filters ?? {}))
46
+ .sort((left, right) => left.created_at === right.created_at
47
+ ? left.id.localeCompare(right.id)
48
+ : left.created_at.localeCompare(right.created_at))
49
+ : rows
50
+ .filter((row) => matchesMetricsFilters(row, input.filters ?? {}))
51
+ .sort((left, right) => left.metric_date.localeCompare(right.metric_date));
52
+ const filtered = source;
53
+ const batch = filtered.slice(skip, skip + take);
54
+ return {
55
+ data: batch,
56
+ metadata: {
57
+ count: filtered.length,
58
+ take,
59
+ skip,
60
+ },
61
+ };
62
+ });
63
+ const container = {
64
+ resolve: jest.fn((key) => {
65
+ if (key === utils_1.ContainerRegistrationKeys.QUERY) {
66
+ return { graph };
67
+ }
68
+ if (key === "logger") {
69
+ return {
70
+ info: jest.fn(),
71
+ warn: jest.fn(),
72
+ error: jest.fn(),
73
+ };
74
+ }
75
+ throw new Error(`Unexpected container key: ${key}`);
76
+ }),
77
+ };
78
+ return {
79
+ container,
80
+ graph,
81
+ };
82
+ }
83
+ function matchesMetricsFilters(row, filters) {
84
+ const metricDateFilter = filters.metric_date;
85
+ if (metricDateFilter?.$gte && row.metric_date < metricDateFilter.$gte) {
86
+ return false;
87
+ }
88
+ if (metricDateFilter?.$lte && row.metric_date > metricDateFilter.$lte) {
89
+ return false;
90
+ }
91
+ const statusFilter = filters.status;
92
+ if (statusFilter?.length && !statusFilter.includes(row.status)) {
93
+ return false;
94
+ }
95
+ const productFilter = filters.product_id;
96
+ if (productFilter?.length && !productFilter.includes(row.product_id)) {
97
+ return false;
98
+ }
99
+ return true;
100
+ }
101
+ function matchesSubscriptionFilters(row, filters) {
102
+ const createdAtFilter = filters.created_at;
103
+ if (createdAtFilter?.$gte && row.created_at < createdAtFilter.$gte) {
104
+ return false;
105
+ }
106
+ if (createdAtFilter?.$lte && row.created_at > createdAtFilter.$lte) {
107
+ return false;
108
+ }
109
+ const statusFilter = filters.status;
110
+ if (statusFilter?.length && !statusFilter.includes(row.status)) {
111
+ return false;
112
+ }
113
+ const productFilter = filters.product_id;
114
+ if (productFilter?.length && !productFilter.includes(row.product_id)) {
115
+ return false;
116
+ }
117
+ const frequencyOrFilter = filters.$or;
118
+ if (frequencyOrFilter?.length) {
119
+ return frequencyOrFilter.some((frequency) => frequency.frequency_interval === row.frequency_interval &&
120
+ frequency.frequency_value === row.frequency_value);
121
+ }
122
+ return true;
123
+ }
124
+ describe("analytics admin-query read model", () => {
125
+ beforeEach(() => {
126
+ jest.useRealTimers();
127
+ });
128
+ it("computes KPI summaries for recurring revenue, churn, ltv, and active subscriptions", async () => {
129
+ const rows = [
130
+ buildRow("current_day_one", {
131
+ metric_date: "2026-04-01T00:00:00.000Z",
132
+ subscription_id: "sub_a",
133
+ mrr_amount: 100,
134
+ }),
135
+ buildRow("current_day_two", {
136
+ metric_date: "2026-04-02T00:00:00.000Z",
137
+ subscription_id: "sub_a",
138
+ mrr_amount: 120,
139
+ }),
140
+ buildRow("current_day_three", {
141
+ metric_date: "2026-04-02T00:00:00.000Z",
142
+ subscription_id: "sub_b",
143
+ mrr_amount: 80,
144
+ }),
145
+ buildRow("previous_day_one", {
146
+ metric_date: "2026-03-30T00:00:00.000Z",
147
+ subscription_id: "sub_prev_a",
148
+ mrr_amount: 90,
149
+ }),
150
+ buildRow("previous_day_two", {
151
+ metric_date: "2026-03-31T00:00:00.000Z",
152
+ subscription_id: "sub_prev_a",
153
+ mrr_amount: 100,
154
+ }),
155
+ buildRow("previous_day_three", {
156
+ metric_date: "2026-03-31T00:00:00.000Z",
157
+ subscription_id: "sub_prev_b",
158
+ mrr_amount: 50,
159
+ churned_subscriptions_count: 1,
160
+ }),
161
+ ];
162
+ const { container, graph } = createContainer(rows);
163
+ const response = await (0, admin_query_1.getAdminAnalyticsKpis)(container, {
164
+ date_from: "2026-04-01T00:00:00.000Z",
165
+ date_to: "2026-04-02T23:59:59.999Z",
166
+ group_by: analytics_1.AnalyticsGroupBy.DAY,
167
+ timezone: "UTC",
168
+ });
169
+ expect(graph).toHaveBeenCalled();
170
+ expect(graph).toHaveBeenNthCalledWith(1, expect.objectContaining({
171
+ entity: "subscription_metrics_daily",
172
+ filters: expect.objectContaining({
173
+ metric_date: {
174
+ $gte: "2026-04-01T00:00:00.000Z",
175
+ $lte: "2026-04-02T23:59:59.999Z",
176
+ },
177
+ }),
178
+ }));
179
+ expect(response.filters.group_by).toBe(analytics_1.AnalyticsGroupBy.DAY);
180
+ expect(response.kpis).toEqual([
181
+ expect.objectContaining({
182
+ key: analytics_1.AnalyticsMetricKey.MRR,
183
+ value: 200,
184
+ previous_value: 150,
185
+ currency_code: "USD",
186
+ }),
187
+ expect.objectContaining({
188
+ key: analytics_1.AnalyticsMetricKey.CHURN_RATE,
189
+ value: 0,
190
+ previous_value: 66.67,
191
+ }),
192
+ expect.objectContaining({
193
+ key: analytics_1.AnalyticsMetricKey.LTV,
194
+ value: null,
195
+ previous_value: 225,
196
+ currency_code: "USD",
197
+ }),
198
+ expect.objectContaining({
199
+ key: analytics_1.AnalyticsMetricKey.ACTIVE_SUBSCRIPTIONS_COUNT,
200
+ value: 2,
201
+ previous_value: 2,
202
+ }),
203
+ ]);
204
+ });
205
+ it("builds trend series for day, week, and month bucket groupings", async () => {
206
+ const rows = [
207
+ buildRow("day_one_a", {
208
+ metric_date: "2026-04-01T00:00:00.000Z",
209
+ subscription_id: "sub_a",
210
+ mrr_amount: 100,
211
+ }),
212
+ buildRow("day_one_b", {
213
+ metric_date: "2026-04-01T00:00:00.000Z",
214
+ subscription_id: "sub_b",
215
+ mrr_amount: 40,
216
+ }),
217
+ buildRow("day_two_a", {
218
+ metric_date: "2026-04-08T00:00:00.000Z",
219
+ subscription_id: "sub_a",
220
+ mrr_amount: 110,
221
+ }),
222
+ buildRow("day_two_b", {
223
+ metric_date: "2026-04-08T00:00:00.000Z",
224
+ subscription_id: "sub_b",
225
+ mrr_amount: 50,
226
+ churned_subscriptions_count: 1,
227
+ }),
228
+ buildRow("day_three_a", {
229
+ metric_date: "2026-05-01T00:00:00.000Z",
230
+ subscription_id: "sub_a",
231
+ mrr_amount: 125,
232
+ }),
233
+ ];
234
+ const { container } = createContainer(rows);
235
+ const dayResponse = await (0, admin_query_1.getAdminAnalyticsTrends)(container, {
236
+ date_from: "2026-04-01T00:00:00.000Z",
237
+ date_to: "2026-05-01T23:59:59.999Z",
238
+ group_by: analytics_1.AnalyticsGroupBy.DAY,
239
+ timezone: "UTC",
240
+ });
241
+ const weekResponse = await (0, admin_query_1.getAdminAnalyticsTrends)(container, {
242
+ date_from: "2026-04-01T00:00:00.000Z",
243
+ date_to: "2026-05-01T23:59:59.999Z",
244
+ group_by: analytics_1.AnalyticsGroupBy.WEEK,
245
+ timezone: "UTC",
246
+ });
247
+ const monthResponse = await (0, admin_query_1.getAdminAnalyticsTrends)(container, {
248
+ date_from: "2026-04-01T00:00:00.000Z",
249
+ date_to: "2026-05-01T23:59:59.999Z",
250
+ group_by: analytics_1.AnalyticsGroupBy.MONTH,
251
+ timezone: "UTC",
252
+ });
253
+ expect(dayResponse.series.find((series) => series.metric === analytics_1.AnalyticsMetricKey.MRR)
254
+ ?.points).toHaveLength(3);
255
+ expect(weekResponse.series.find((series) => series.metric === analytics_1.AnalyticsMetricKey.MRR)
256
+ ?.points).toHaveLength(3);
257
+ expect(monthResponse.series.find((series) => series.metric === analytics_1.AnalyticsMetricKey.MRR)
258
+ ?.points).toHaveLength(2);
259
+ expect(weekResponse.series.find((series) => series.metric === analytics_1.AnalyticsMetricKey.ACTIVE_SUBSCRIPTIONS_COUNT)?.points[1]).toEqual(expect.objectContaining({
260
+ value: 2,
261
+ }));
262
+ expect(dayResponse.series.find((series) => series.metric === analytics_1.AnalyticsMetricKey.CREATED_SUBSCRIPTIONS_COUNT)?.points).toHaveLength(31);
263
+ });
264
+ it("builds a daily created subscriptions series from subscription.created_at", async () => {
265
+ const subscriptions = [
266
+ createSubscription("sub_created_a", {
267
+ created_at: "2026-04-01T08:15:00.000Z",
268
+ product_id: "prod_target",
269
+ status: "cancelled",
270
+ }),
271
+ createSubscription("sub_created_b", {
272
+ created_at: "2026-04-01T14:45:00.000Z",
273
+ product_id: "prod_other",
274
+ status: "paused",
275
+ }),
276
+ createSubscription("sub_created_c", {
277
+ created_at: "2026-04-03T09:30:00.000Z",
278
+ frequency_interval: "year",
279
+ frequency_value: 1,
280
+ }),
281
+ ];
282
+ const { container } = createContainer([], subscriptions);
283
+ const response = await (0, admin_query_1.getAdminAnalyticsTrends)(container, {
284
+ date_from: "2026-04-01T00:00:00.000Z",
285
+ date_to: "2026-04-04T23:59:59.999Z",
286
+ status: ["active"],
287
+ product_id: ["prod_target"],
288
+ frequency: ["month:1"],
289
+ group_by: analytics_1.AnalyticsGroupBy.MONTH,
290
+ timezone: "UTC",
291
+ });
292
+ expect(response.series.find((series) => series.metric === analytics_1.AnalyticsMetricKey.CREATED_SUBSCRIPTIONS_COUNT)).toEqual(expect.objectContaining({
293
+ unit: "count",
294
+ precision: 0,
295
+ points: [
296
+ expect.objectContaining({
297
+ bucket_start: "2026-04-01T00:00:00.000Z",
298
+ value: 2,
299
+ }),
300
+ expect.objectContaining({
301
+ bucket_start: "2026-04-02T00:00:00.000Z",
302
+ value: 0,
303
+ }),
304
+ expect.objectContaining({
305
+ bucket_start: "2026-04-03T00:00:00.000Z",
306
+ value: 1,
307
+ }),
308
+ expect.objectContaining({
309
+ bucket_start: "2026-04-04T00:00:00.000Z",
310
+ value: 0,
311
+ }),
312
+ ],
313
+ }));
314
+ });
315
+ it("overrides the active trend point for the current UTC bucket with the live count", async () => {
316
+ jest.useFakeTimers().setSystemTime(new Date("2026-05-25T10:00:00.000Z"));
317
+ const rows = [
318
+ buildRow("prior_day_a", {
319
+ metric_date: "2026-05-24T00:00:00.000Z",
320
+ subscription_id: "sub_prior_a",
321
+ active_subscriptions_count: 2,
322
+ }),
323
+ buildRow("prior_day_b", {
324
+ metric_date: "2026-05-24T00:00:00.000Z",
325
+ subscription_id: "sub_prior_b",
326
+ active_subscriptions_count: 0,
327
+ }),
328
+ buildRow("today_snapshot", {
329
+ metric_date: "2026-05-25T00:00:00.000Z",
330
+ subscription_id: "sub_today_a",
331
+ active_subscriptions_count: 1,
332
+ }),
333
+ ];
334
+ const subscriptions = [
335
+ createSubscription("sub_today_a"),
336
+ createSubscription("sub_today_b"),
337
+ createSubscription("sub_today_c"),
338
+ ];
339
+ const { container } = createContainer(rows, subscriptions);
340
+ const response = await (0, admin_query_1.getAdminAnalyticsTrends)(container, {
341
+ date_from: "2026-05-24T00:00:00.000Z",
342
+ date_to: "2026-05-25T23:59:59.999Z",
343
+ group_by: analytics_1.AnalyticsGroupBy.DAY,
344
+ timezone: "UTC",
345
+ });
346
+ expect(response.series.find((series) => series.metric === analytics_1.AnalyticsMetricKey.ACTIVE_SUBSCRIPTIONS_COUNT)?.points).toEqual([
347
+ expect.objectContaining({
348
+ bucket_start: "2026-05-24T00:00:00.000Z",
349
+ value: 2,
350
+ }),
351
+ expect.objectContaining({
352
+ bucket_start: "2026-05-25T00:00:00.000Z",
353
+ value: 3,
354
+ }),
355
+ ]);
356
+ });
357
+ it("applies status, product, and frequency filters before computing metrics", async () => {
358
+ const rows = [
359
+ buildRow("keep_a", {
360
+ metric_date: "2026-04-02T00:00:00.000Z",
361
+ subscription_id: "sub_keep_a",
362
+ product_id: "prod_target",
363
+ status: "active",
364
+ frequency_interval: "month",
365
+ frequency_value: 1,
366
+ mrr_amount: 100,
367
+ }),
368
+ buildRow("keep_b", {
369
+ metric_date: "2026-04-02T00:00:00.000Z",
370
+ subscription_id: "sub_keep_b",
371
+ product_id: "prod_target",
372
+ status: "active",
373
+ frequency_interval: "month",
374
+ frequency_value: 1,
375
+ mrr_amount: 50,
376
+ }),
377
+ buildRow("filter_by_status", {
378
+ metric_date: "2026-04-02T00:00:00.000Z",
379
+ subscription_id: "sub_pause",
380
+ product_id: "prod_target",
381
+ status: "paused",
382
+ is_active: false,
383
+ active_subscriptions_count: 0,
384
+ mrr_amount: 999,
385
+ }),
386
+ buildRow("filter_by_product", {
387
+ metric_date: "2026-04-02T00:00:00.000Z",
388
+ subscription_id: "sub_other_product",
389
+ product_id: "prod_other",
390
+ mrr_amount: 999,
391
+ }),
392
+ buildRow("filter_by_frequency", {
393
+ metric_date: "2026-04-02T00:00:00.000Z",
394
+ subscription_id: "sub_yearly",
395
+ product_id: "prod_target",
396
+ frequency_interval: "year",
397
+ frequency_value: 1,
398
+ mrr_amount: 999,
399
+ }),
400
+ ];
401
+ const { container } = createContainer(rows);
402
+ const response = await (0, admin_query_1.getAdminAnalyticsKpis)(container, {
403
+ date_from: "2026-04-02T00:00:00.000Z",
404
+ date_to: "2026-04-02T23:59:59.999Z",
405
+ status: ["active"],
406
+ product_id: ["prod_target"],
407
+ frequency: ["month:1"],
408
+ timezone: "UTC",
409
+ });
410
+ expect(response.kpis).toEqual([
411
+ expect.objectContaining({
412
+ key: analytics_1.AnalyticsMetricKey.MRR,
413
+ value: 150,
414
+ }),
415
+ expect.objectContaining({
416
+ key: analytics_1.AnalyticsMetricKey.CHURN_RATE,
417
+ value: 0,
418
+ }),
419
+ expect.objectContaining({
420
+ key: analytics_1.AnalyticsMetricKey.LTV,
421
+ value: null,
422
+ }),
423
+ expect.objectContaining({
424
+ key: analytics_1.AnalyticsMetricKey.ACTIVE_SUBSCRIPTIONS_COUNT,
425
+ value: 2,
426
+ }),
427
+ ]);
428
+ });
429
+ it("returns null revenue metrics for mixed-currency datasets and empty series for empty datasets", async () => {
430
+ const mixedCurrencyRows = [
431
+ buildRow("usd", {
432
+ metric_date: "2026-04-02T00:00:00.000Z",
433
+ subscription_id: "sub_usd",
434
+ currency_code: "USD",
435
+ mrr_amount: 100,
436
+ }),
437
+ buildRow("eur", {
438
+ metric_date: "2026-04-02T00:00:00.000Z",
439
+ subscription_id: "sub_eur",
440
+ currency_code: "EUR",
441
+ mrr_amount: 80,
442
+ }),
443
+ ];
444
+ const mixedCurrencyContainer = createContainer(mixedCurrencyRows).container;
445
+ const kpis = await (0, admin_query_1.getAdminAnalyticsKpis)(mixedCurrencyContainer, {
446
+ date_from: "2026-04-02T00:00:00.000Z",
447
+ date_to: "2026-04-02T23:59:59.999Z",
448
+ timezone: "UTC",
449
+ });
450
+ expect(kpis.kpis.find((metric) => metric.key === analytics_1.AnalyticsMetricKey.MRR)).toEqual(expect.objectContaining({
451
+ value: null,
452
+ currency_code: null,
453
+ }));
454
+ expect(kpis.kpis.find((metric) => metric.key === analytics_1.AnalyticsMetricKey.LTV)).toEqual(expect.objectContaining({
455
+ value: null,
456
+ currency_code: null,
457
+ }));
458
+ const emptyContainer = createContainer([]).container;
459
+ const trends = await (0, admin_query_1.getAdminAnalyticsTrends)(emptyContainer, {
460
+ date_from: "2026-04-02T00:00:00.000Z",
461
+ date_to: "2026-04-02T23:59:59.999Z",
462
+ timezone: "UTC",
463
+ });
464
+ const exportResponse = await (0, admin_query_1.getAdminAnalyticsExport)(emptyContainer, {
465
+ date_from: "2026-04-02T00:00:00.000Z",
466
+ date_to: "2026-04-02T23:59:59.999Z",
467
+ format: "csv",
468
+ timezone: "UTC",
469
+ });
470
+ expect(trends.series
471
+ .filter((series) => series.metric !== analytics_1.AnalyticsMetricKey.CREATED_SUBSCRIPTIONS_COUNT)
472
+ .every((series) => series.points.length === 0)).toBe(true);
473
+ expect(trends.series.find((series) => series.metric === analytics_1.AnalyticsMetricKey.CREATED_SUBSCRIPTIONS_COUNT)?.points).toEqual([
474
+ expect.objectContaining({
475
+ bucket_start: "2026-04-02T00:00:00.000Z",
476
+ value: 0,
477
+ }),
478
+ ]);
479
+ expect(exportResponse.columns).toEqual([
480
+ "bucket_start",
481
+ "bucket_end",
482
+ "mrr",
483
+ "churn_rate",
484
+ "ltv",
485
+ "active_subscriptions_count",
486
+ ]);
487
+ expect(exportResponse.rows).toEqual([]);
488
+ });
489
+ it("uses live active subscription count when the requested window includes the current UTC day", async () => {
490
+ jest.useFakeTimers().setSystemTime(new Date("2026-05-25T10:00:00.000Z"));
491
+ const rows = [
492
+ buildRow("current_live_snapshot", {
493
+ metric_date: "2026-05-25T00:00:00.000Z",
494
+ subscription_id: "sub_live_a",
495
+ active_subscriptions_count: 1,
496
+ mrr_amount: 100,
497
+ }),
498
+ buildRow("previous_live_snapshot_a", {
499
+ metric_date: "2026-05-24T00:00:00.000Z",
500
+ subscription_id: "sub_prev_a",
501
+ active_subscriptions_count: 1,
502
+ mrr_amount: 100,
503
+ }),
504
+ buildRow("previous_live_snapshot_b", {
505
+ metric_date: "2026-05-24T00:00:00.000Z",
506
+ subscription_id: "sub_prev_b",
507
+ active_subscriptions_count: 1,
508
+ mrr_amount: 100,
509
+ }),
510
+ ];
511
+ const subscriptions = [
512
+ createSubscription("sub_live_a"),
513
+ createSubscription("sub_live_b"),
514
+ createSubscription("sub_live_c"),
515
+ ];
516
+ const { container } = createContainer(rows, subscriptions);
517
+ const response = await (0, admin_query_1.getAdminAnalyticsKpis)(container, {
518
+ date_from: "2026-05-25T00:00:00.000Z",
519
+ date_to: "2026-05-25T23:59:59.999Z",
520
+ timezone: "UTC",
521
+ });
522
+ expect(response.kpis.find((metric) => metric.key === analytics_1.AnalyticsMetricKey.ACTIVE_SUBSCRIPTIONS_COUNT)).toEqual(expect.objectContaining({
523
+ value: 3,
524
+ previous_value: 2,
525
+ }));
526
+ });
527
+ it("throws invalid_data for invalid ranges and unsupported filters", async () => {
528
+ const { container } = createContainer([]);
529
+ await expect((0, admin_query_1.getAdminAnalyticsKpis)(container, {
530
+ date_from: "2026-04-03T00:00:00.000Z",
531
+ date_to: "2026-04-02T23:59:59.999Z",
532
+ timezone: "UTC",
533
+ })).rejects.toMatchObject({
534
+ type: utils_1.MedusaError.Types.INVALID_DATA,
535
+ });
536
+ await expect((0, admin_query_1.getAdminAnalyticsKpis)(container, {
537
+ date_from: "2026-04-01T00:00:00.000Z",
538
+ date_to: "2028-04-05T23:59:59.999Z",
539
+ timezone: "UTC",
540
+ })).rejects.toMatchObject({
541
+ type: utils_1.MedusaError.Types.INVALID_DATA,
542
+ });
543
+ await expect((0, admin_query_1.getAdminAnalyticsKpis)(container, {
544
+ date_from: "2026-04-02T00:00:00.000Z",
545
+ date_to: "2026-04-02T23:59:59.999Z",
546
+ timezone: "Europe/Warsaw",
547
+ })).rejects.toMatchObject({
548
+ type: utils_1.MedusaError.Types.INVALID_DATA,
549
+ });
550
+ await expect((0, admin_query_1.getAdminAnalyticsKpis)(container, {
551
+ date_from: "2026-04-02T00:00:00.000Z",
552
+ date_to: "2026-04-02T23:59:59.999Z",
553
+ frequency: ["fortnight:1"],
554
+ timezone: "UTC",
555
+ })).rejects.toMatchObject({
556
+ type: utils_1.MedusaError.Types.INVALID_DATA,
557
+ });
558
+ });
559
+ });
560
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRtaW4tcXVlcnkuc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2FuYWx5dGljcy9fX3Rlc3RzX18vYWRtaW4tcXVlcnkuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHFEQUFrRjtBQUVsRiw4REFJdUM7QUFDdkMsc0RBSTZCO0FBMEM3QixTQUFTLFFBQVEsQ0FDZixFQUFVLEVBQ1YsU0FBa0Q7SUFFbEQsT0FBTztRQUNMLEVBQUU7UUFDRixXQUFXLEVBQUUsMEJBQTBCO1FBQ3ZDLGVBQWUsRUFBRSxPQUFPLEVBQUUsRUFBRTtRQUM1QixXQUFXLEVBQUUsT0FBTyxFQUFFLEVBQUU7UUFDeEIsVUFBVSxFQUFFLGFBQWE7UUFDekIsVUFBVSxFQUFFLGlCQUFpQjtRQUM3QixNQUFNLEVBQUUsUUFBUTtRQUNoQixrQkFBa0IsRUFBRSxPQUFPO1FBQzNCLGVBQWUsRUFBRSxDQUFDO1FBQ2xCLGFBQWEsRUFBRSxLQUFLO1FBQ3BCLFNBQVMsRUFBRSxJQUFJO1FBQ2YsMEJBQTBCLEVBQUUsQ0FBQztRQUM3QixVQUFVLEVBQUUsR0FBRztRQUNmLDJCQUEyQixFQUFFLENBQUM7UUFDOUIscUJBQXFCLEVBQUUsSUFBSTtRQUMzQixlQUFlLEVBQUUsSUFBSTtRQUNyQixRQUFRLEVBQUUsSUFBSTtRQUNkLEdBQUcsU0FBUztLQUNiLENBQUE7QUFDSCxDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FDekIsRUFBVSxFQUNWLFlBQXlDLEVBQUU7SUFFM0MsT0FBTztRQUNMLEVBQUU7UUFDRixVQUFVLEVBQUUsYUFBYTtRQUN6QixNQUFNLEVBQUUsUUFBUTtRQUNoQixrQkFBa0IsRUFBRSxPQUFPO1FBQzNCLGVBQWUsRUFBRSxDQUFDO1FBQ2xCLFVBQVUsRUFBRSwwQkFBMEI7UUFDdEMsR0FBRyxTQUFTO0tBQ2IsQ0FBQTtBQUNILENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FDdEIsSUFBc0Ms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
@@ -6,8 +6,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.ANALYTICS_MODULE = void 0;
7
7
  const utils_1 = require("@medusajs/framework/utils");
8
8
  const service_1 = __importDefault(require("./service"));
9
- exports.ANALYTICS_MODULE = "analytics";
9
+ exports.ANALYTICS_MODULE = "subscriptionAnalytics";
10
10
  exports.default = (0, utils_1.Module)(exports.ANALYTICS_MODULE, {
11
11
  service: service_1.default,
12
12
  });
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9hbmFseXRpY3MvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEscURBQWtEO0FBQ2xELHdEQUE4QztBQUVqQyxRQUFBLGdCQUFnQixHQUFHLFdBQVcsQ0FBQTtBQUUzQyxrQkFBZSxJQUFBLGNBQU0sRUFBQyx3QkFBZ0IsRUFBRTtJQUN0QyxPQUFPLEVBQUUsaUJBQXNCO0NBQ2hDLENBQUMsQ0FBQSJ9
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9hbmFseXRpY3MvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEscURBQWtEO0FBQ2xELHdEQUE4QztBQUVqQyxRQUFBLGdCQUFnQixHQUFHLHVCQUF1QixDQUFBO0FBRXZELGtCQUFlLElBQUEsY0FBTSxFQUFDLHdCQUFnQixFQUFFO0lBQ3RDLE9BQU8sRUFBRSxpQkFBc0I7Q0FDaEMsQ0FBQyxDQUFBIn0=