@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,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.updateSubscriptionPaymentMethodStep = void 0;
4
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
5
+ const subscription_1 = require("../../modules/subscription");
6
+ const types_1 = require("../../modules/subscription/types");
7
+ const errors_1 = require("../../modules/subscription/utils/errors");
8
+ const payment_methods_1 = require("../../modules/subscription/utils/payment-methods");
9
+ const pause_subscription_1 = require("./pause-subscription");
10
+ const UPDATABLE_STATUSES = [
11
+ types_1.SubscriptionStatus.ACTIVE,
12
+ types_1.SubscriptionStatus.PAUSED,
13
+ types_1.SubscriptionStatus.PAST_DUE,
14
+ ];
15
+ exports.updateSubscriptionPaymentMethodStep = (0, workflows_sdk_1.createStep)("update-subscription-payment-method", async function (input, { container }) {
16
+ const subscriptionModuleService = container.resolve(subscription_1.SUBSCRIPTION_MODULE);
17
+ const subscription = await subscriptionModuleService.retrieveSubscription(input.id);
18
+ if (!UPDATABLE_STATUSES.includes(subscription.status)) {
19
+ throw errors_1.subscriptionErrors.invalidState(input.id, "update payment method", subscription.status);
20
+ }
21
+ if (!input.payment_method_id.trim()) {
22
+ throw errors_1.subscriptionErrors.invalidData("payment_method_id is required");
23
+ }
24
+ const paymentContext = (subscription.payment_context ??
25
+ null);
26
+ const providerId = input.provider_id?.trim() || paymentContext?.payment_provider_id || null;
27
+ if (!providerId) {
28
+ throw errors_1.subscriptionErrors.invalidData(`Subscription '${input.id}' has no payment provider configured, so 'provider_id' is required`);
29
+ }
30
+ const resolved = await (0, payment_methods_1.resolveCustomerPaymentMethod)(container, {
31
+ customer_id: subscription.customer_id,
32
+ provider_id: providerId,
33
+ payment_method_id: input.payment_method_id.trim(),
34
+ });
35
+ const previousPaymentMethod = await resolvePreviousPaymentMethod(container, subscription.customer_id, paymentContext);
36
+ const updatedAt = new Date().toISOString();
37
+ const updated = await subscriptionModuleService.updateSubscriptions({
38
+ id: input.id,
39
+ payment_context: {
40
+ payment_provider_id: providerId,
41
+ source_payment_collection_id: paymentContext?.source_payment_collection_id ?? null,
42
+ source_payment_session_id: paymentContext?.source_payment_session_id ?? null,
43
+ payment_method_reference: resolved.summary.id,
44
+ customer_payment_reference: readAccountHolderReference(resolved.account_holder) ??
45
+ paymentContext?.customer_payment_reference ??
46
+ null,
47
+ },
48
+ metadata: {
49
+ ...(subscription.metadata ?? {}),
50
+ payment_method_update_context: {
51
+ triggered_by: input.triggered_by ?? null,
52
+ updated_at: updatedAt,
53
+ },
54
+ },
55
+ });
56
+ return new workflows_sdk_1.StepResponse({
57
+ current: (0, pause_subscription_1.asSubscriptionWorkflowRecord)(updated),
58
+ previous: (0, pause_subscription_1.asSubscriptionWorkflowRecord)(subscription),
59
+ previous_payment_method: previousPaymentMethod,
60
+ current_payment_method: resolved.summary,
61
+ }, (0, pause_subscription_1.asSubscriptionWorkflowRecord)(subscription));
62
+ }, async function (subscription, { container }) {
63
+ if (!subscription) {
64
+ return;
65
+ }
66
+ const subscriptionModuleService = container.resolve(subscription_1.SUBSCRIPTION_MODULE);
67
+ await subscriptionModuleService.updateSubscriptions((0, pause_subscription_1.asSubscriptionUpdateInput)(subscription));
68
+ });
69
+ /**
70
+ * Resolves the card details of the currently stored payment method so the
71
+ * activity log can record what the payment method was changed from.
72
+ *
73
+ * The provider lookup is best effort: a removed or unreachable payment method
74
+ * must not block the update.
75
+ */
76
+ async function resolvePreviousPaymentMethod(container, customerId, paymentContext) {
77
+ if (!paymentContext?.payment_provider_id ||
78
+ !paymentContext.payment_method_reference) {
79
+ return null;
80
+ }
81
+ try {
82
+ const previous = await (0, payment_methods_1.resolveCustomerPaymentMethod)(container, {
83
+ customer_id: customerId,
84
+ provider_id: paymentContext.payment_provider_id,
85
+ payment_method_id: paymentContext.payment_method_reference,
86
+ });
87
+ return previous.summary;
88
+ }
89
+ catch {
90
+ return {
91
+ id: paymentContext.payment_method_reference,
92
+ provider_id: paymentContext.payment_provider_id,
93
+ type: null,
94
+ brand: null,
95
+ last4: null,
96
+ exp_month: null,
97
+ exp_year: null,
98
+ created_at: null,
99
+ };
100
+ }
101
+ }
102
+ function readAccountHolderReference(accountHolder) {
103
+ if (typeof accountHolder.external_id === "string" &&
104
+ accountHolder.external_id.trim()) {
105
+ return accountHolder.external_id.trim();
106
+ }
107
+ const data = accountHolder.data ?? {};
108
+ return typeof data.id === "string" && data.id.trim() ? data.id.trim() : null;
109
+ }
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLXN1YnNjcmlwdGlvbi1wYXltZW50LW1ldGhvZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3Mvc3RlcHMvdXBkYXRlLXN1YnNjcmlwdGlvbi1wYXltZW50LW1ldGhvZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxRUFBNEU7QUFDNUUsNkRBQWdFO0FBRWhFLDREQUl5QztBQUN6QyxvRUFBNEU7QUFDNUUsc0ZBQStGO0FBQy9GLDZEQUk2QjtBQWdCN0IsTUFBTSxrQkFBa0IsR0FBRztJQUN6QiwwQkFBa0IsQ0FBQyxNQUFNO0lBQ3pCLDBCQUFrQixDQUFDLE1BQU07SUFDekIsMEJBQWtCLENBQUMsUUFBUTtDQUM1QixDQUFBO0FBRVksUUFBQSxtQ0FBbUMsR0FBRyxJQUFBLDBCQUFVLEVBQzNELG9DQUFvQyxFQUNwQyxLQUFLLFdBQ0gsS0FBK0MsRUFDL0MsRUFBRSxTQUFTLEVBQUU7SUFFYixNQUFNLHlCQUF5QixHQUM3QixTQUFTLENBQUMsT0FBTyxDQUFDLGtDQUFtQixDQUFDLENBQUE7SUFFeEMsTUFBTSxZQUFZLEdBQUcsTUFBTSx5QkFBeUIsQ0FBQyxvQkFBb0IsQ0FDdkUsS0FBSyxDQUFDLEVBQUUsQ0FDVCxDQUFBO0lBRUQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsTUFBNEIsQ0FBQyxFQUFFLENBQUM7UUFDNUUsTUFBTSwyQkFBa0IsQ0FBQyxZQUFZLENBQ25DLEtBQUssQ0FBQyxFQUFFLEVBQ1IsdUJBQXVCLEVBQ3ZCLFlBQVksQ0FBQyxNQUFNLENBQ3BCLENBQUE7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sMkJBQWtCLENBQUMsV0FBVyxDQUFDLCtCQUErQixDQUFDLENBQUE7SUFDdkUsQ0FBQztJQUVELE1BQU0sY0FBYyxHQUFHLENBQUMsWUFBWSxDQUFDLGVBQWU7UUFDbEQsSUFBSSxDQUFzQyxDQUFBO0lBQzVDLE1BQU0sVUFBVSxHQUNkLEtBQUssQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLElBQUksY0FBYyxFQUFFLG1CQUFtQixJQUFJLElBQUksQ0FBQTtJQUUxRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEIsTUFBTSwyQkFBa0IsQ0FBQyxXQUFXLENBQ2xDLGlCQUFpQixLQUFLLENBQUMsRUFBRSxvRUFBb0UsQ0FDOUYsQ0FBQTtJQUNILENBQUM7SUFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUEsOENBQTRCLEVBQUMsU0FBUyxFQUFFO1FBQzdELFdBQVcsRUFBRSxZQUFZLENBQUMsV0FBVztRQUNyQyxXQUFXLEVBQUUsVUFBVTtRQUN2QixpQkFBaUIsRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFO0tBQ2xELENBQUMsQ0FBQTtJQUVGLE1BQU0scUJBQXFCLEdBQUcsTUFBTSw0QkFBNEIsQ0FDOUQsU0FBUyxFQUNULFlBQVksQ0FBQyxXQUFXLEVBQ3hCLGNBQWMsQ0FDZixDQUFBO0lBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUUxQyxNQUFNLE9BQU8sR0FBRyxNQUFNLHlCQUF5QixDQUFDLG1CQUFtQixDQUFDO1FBQ2xFLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRTtRQUNaLGVBQWUsRUFBRTtZQUNmLG1CQUFtQixFQUFFLFVBQVU7WUFDL0IsNEJBQTRCLEVBQzFCLGNBQWMsRUFBRSw0QkFBNEIsSUFBSSxJQUFJO1lBQ3RELHlCQUF5QixFQUN2QixjQUFjLEVBQUUseUJBQXlCLElBQUksSUFBSTtZQUNuRCx3QkFBd0IsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDN0MsMEJBQTBCLEVBQ3hCLDBCQUEwQixDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUM7Z0JBQ25ELGNBQWMsRUFBRSwwQkFBMEI7Z0JBQzFDLElBQUk7U0FDOEI7UUFDdEMsUUFBUSxFQUFFO1lBQ1IsR0FBRyxDQUFDLFlBQVksQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO1lBQ2hDLDZCQUE2QixFQUFFO2dCQUM3QixZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVksSUFBSSxJQUFJO2dCQUN4QyxVQUFVLEVBQUUsU0FBUzthQUN0QjtTQUNGO0tBQ0YsQ0FBQyxDQUFBO0lBRUYsT0FBTyxJQUFJLDRCQUFZLENBSXJCO1FBQ0UsT0FBTyxFQUFFLElBQUEsaURBQTRCLEVBQUMsT0FBTyxDQUFDO1FBQzlDLFFBQVEsRUFBRSxJQUFBLGlEQUE0QixFQUFDLFlBQVksQ0FBQztRQUNwRCx1QkFBdUIsRUFBRSxxQkFBcUI7UUFDOUMsc0JBQXNCLEVBQUUsUUFBUSxDQUFDLE9BQU87S0FDekMsRUFDRCxJQUFBLGlEQUE0QixFQUFDLFlBQVksQ0FBQyxDQUMzQyxDQUFBO0FBQ0gsQ0FBQyxFQUNELEtBQUssV0FBVyxZQUF3QyxFQUFFLEVBQUUsU0FBUyxFQUFFO0lBQ3JFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNsQixPQUFNO0lBQ1IsQ0FBQztJQUVELE1BQU0seUJBQXlCLEdBQzdCLFNBQVMsQ0FBQyxPQUFPLENBQUMsa0NBQW1CLENBQUMsQ0FBQTtJQUV4QyxNQUFNLHlCQUF5QixDQUFDLG1CQUFtQixDQUNqRCxJQUFBLDhDQUF5QixFQUFDLFlBQVksQ0FBQyxDQUN4QyxDQUFBO0FBQ0gsQ0FBQyxDQUNGLENBQUE7QUFFRDs7Ozs7O0dBTUc7QUFDSCxLQUFLLFVBQVUsNEJBQTRCLENBQ3pDLFNBQTBCLEVBQzFCLFVBQWtCLEVBQ2xCLGNBQWlEO0lBRWpELElBQ0UsQ0FBQyxjQUFjLEVBQUUsbUJBQW1CO1FBQ3BDLENBQUMsY0FBYyxDQUFDLHdCQUF3QixFQUN4QyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBRUQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFBLDhDQUE0QixFQUFDLFNBQVMsRUFBRTtZQUM3RCxXQUFXLEVBQUUsVUFBVTtZQUN2QixXQUFXLEVBQUUsY0FBYyxDQUFDLG1CQUFtQjtZQUMvQyxpQkFBaUIsRUFBRSxjQUFjLENBQUMsd0JBQXdCO1NBQzNELENBQUMsQ0FBQTtRQUVGLE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQTtJQUN6QixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTztZQUNMLEVBQUUsRUFBRSxjQUFjLENBQUMsd0JBQXdCO1lBQzNDLFdBQVcsRUFBRSxjQUFjLENBQUMsbUJBQW1CO1lBQy9DLElBQUksRUFBRSxJQUFJO1lBQ1YsS0FBSyxFQUFFLElBQUk7WUFDWCxLQUFLLEVBQUUsSUFBSTtZQUNYLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLElBQUk7WUFDZCxVQUFVLEVBQUUsSUFBSTtTQUNqQixDQUFBO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLDBCQUEwQixDQUFDLGFBR25DO0lBQ0MsSUFDRSxPQUFPLGFBQWEsQ0FBQyxXQUFXLEtBQUssUUFBUTtRQUM3QyxhQUFhLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxFQUNoQyxDQUFDO1FBQ0QsT0FBTyxhQUFhLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFBO0lBQ3pDLENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQTtJQUVyQyxPQUFPLE9BQU8sSUFBSSxDQUFDLEVBQUUsS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO0FBQzlFLENBQUMifQ==
@@ -6,6 +6,7 @@ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
6
6
  const effective_config_1 = require("../../modules/plan-offer/utils/effective-config");
7
7
  const types_1 = require("../../modules/subscription/types");
8
8
  const errors_1 = require("../../modules/subscription/utils/errors");
9
+ const payment_methods_1 = require("../../modules/subscription/utils/payment-methods");
9
10
  exports.validateSubscriptionCartStep = (0, workflows_sdk_1.createStep)("validate-subscription-cart", async function (input, { container }) {
10
11
  const cart = await loadCart(container, input.cart_id);
11
12
  if (cart.completed_at) {
@@ -235,7 +236,7 @@ async function resolveSavedPaymentMethodReference(container, customer, providerI
235
236
  throw errors_1.subscriptionErrors.invalidData(`Subscription checkout requires a saved payment account holder for provider '${providerId}'`);
236
237
  }
237
238
  const paymentModule = container.resolve(utils_1.Modules.PAYMENT);
238
- const paymentMethods = await paymentModule.listPaymentMethods({
239
+ const paymentMethods = (await paymentModule.listPaymentMethods({
239
240
  provider_id: providerId,
240
241
  context: {
241
242
  account_holder: {
@@ -243,31 +244,15 @@ async function resolveSavedPaymentMethodReference(container, customer, providerI
243
244
  data: accountHolder.data ?? {},
244
245
  },
245
246
  },
246
- });
247
- const latestPaymentMethod = paymentMethods
248
- .slice()
249
- .sort((left, right) => {
250
- const leftCreated = readNumericTimestamp(left.data?.created);
251
- const rightCreated = readNumericTimestamp(right.data?.created);
252
- return rightCreated - leftCreated;
253
- })[0];
247
+ }));
248
+ const latestPaymentMethod = (0, payment_methods_1.sortPaymentMethodSummaries)((paymentMethods ?? [])
249
+ .filter((paymentMethod) => !!paymentMethod?.id)
250
+ .map((paymentMethod) => (0, payment_methods_1.toPaymentMethodSummary)(paymentMethod, providerId)))[0];
254
251
  if (!latestPaymentMethod?.id) {
255
252
  throw errors_1.subscriptionErrors.invalidData(`Subscription checkout requires at least one saved payment method for provider '${providerId}'`);
256
253
  }
257
254
  return latestPaymentMethod.id;
258
255
  }
259
- function readNumericTimestamp(value) {
260
- if (typeof value === "number" && Number.isFinite(value)) {
261
- return value;
262
- }
263
- if (typeof value === "string") {
264
- const parsed = Number.parseInt(value, 10);
265
- if (Number.isFinite(parsed)) {
266
- return parsed;
267
- }
268
- }
269
- return 0;
270
- }
271
256
  function readString(value) {
272
257
  if (typeof value !== "string" || !value.trim()) {
273
258
  throw errors_1.subscriptionErrors.invalidData("Subscription checkout requires complete address data");
@@ -277,4 +262,4 @@ function readString(value) {
277
262
  function readNullableString(value) {
278
263
  return typeof value === "string" && value.trim() ? value.trim() : null;
279
264
  }
280
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUtc3Vic2NyaXB0aW9uLWNhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N0ZXBzL3ZhbGlkYXRlLXN1YnNjcmlwdGlvbi1jYXJ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUE4RTtBQUM5RSxxRUFBNEU7QUFFNUUsc0ZBQWtHO0FBQ2xHLDREQU15QztBQUN6QyxvRUFBNEU7QUFxRS9ELFFBQUEsNEJBQTRCLEdBQUcsSUFBQSwwQkFBVSxFQUNwRCw0QkFBNEIsRUFDNUIsS0FBSyxXQUNILEtBQXdDLEVBQ3hDLEVBQUUsU0FBUyxFQUFFO0lBRWIsTUFBTSxJQUFJLEdBQUcsTUFBTSxRQUFRLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUVyRCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0QixNQUFNLDJCQUFrQixDQUFDLFFBQVEsQ0FDL0IsU0FBUyxLQUFLLENBQUMsT0FBTyx3QkFBd0IsQ0FDL0MsQ0FBQTtJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3RCLE1BQU0sMkJBQWtCLENBQUMsV0FBVyxDQUNsQyw0REFBNEQsQ0FDN0QsQ0FBQTtJQUNILENBQUM7SUFFRCx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7SUFFdkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUE7SUFDOUIsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDOUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUNsQyxDQUFBO0lBRUQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzlCLE1BQU0sMkJBQWtCLENBQUMsV0FBVyxDQUNsQyx5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
265
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUtc3Vic2NyaXB0aW9uLWNhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL3N0ZXBzL3ZhbGlkYXRlLXN1YnNjcmlwdGlvbi1jYXJ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUE4RTtBQUM5RSxxRUFBNEU7QUFFNUUsc0ZBQWtHO0FBQ2xHLDREQU95QztBQUN6QyxvRUFBNEU7QUFDNUUsc0ZBR3lEO0FBcUU1QyxRQUFBLDRCQUE0QixHQUFHLElBQUEsMEJBQVUsRUFDcEQsNEJBQTRCLEVBQzVCLEtBQUssV0FDSCxLQUF3QyxFQUN4QyxFQUFFLFNBQVMsRUFBRTtJQUViLE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7SUFFckQsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdEIsTUFBTSwyQkFBa0IsQ0FBQyxRQUFRLENBQy9CLFNBQVMsS0FBSyxDQUFDLE9BQU8sd0JBQXdCLENBQy9DLENBQUE7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN0QixNQUFNLDJCQUFrQixDQUFDLFdBQVcsQ0FDbEMsNERBQTRELENBQzdELENBQUE7SUFDSCxDQUFDO0lBRUQsd0JBQXdCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBRXZDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFBO0lBQzlCLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQzlDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FDbEMsQ0FBQTtJQUVELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM5QixNQUFNLDJCQUFrQixDQUFD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
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.updateSubscriptionPaymentMethodWorkflow = void 0;
4
+ exports.toPaymentMethodLogState = toPaymentMethodLogState;
5
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
6
+ const create_subscription_log_event_1 = require("./steps/create-subscription-log-event");
7
+ const update_subscription_payment_method_1 = require("./steps/update-subscription-payment-method");
8
+ const normalize_log_event_1 = require("../modules/activity-log/utils/normalize-log-event");
9
+ const types_1 = require("../modules/activity-log/types");
10
+ const date_output_1 = require("./utils/date-output");
11
+ exports.updateSubscriptionPaymentMethodWorkflow = (0, workflows_sdk_1.createWorkflow)("update-subscription-payment-method", function (input) {
12
+ const subscriptionChange = (0, update_subscription_payment_method_1.updateSubscriptionPaymentMethodStep)(input);
13
+ const logInput = (0, workflows_sdk_1.transform)({ subscriptionChange, input }, function ({ subscriptionChange, input }) {
14
+ return {
15
+ log_event: (0, normalize_log_event_1.normalizeActivityLogEvent)({
16
+ subscription_id: subscriptionChange.current.id,
17
+ customer_id: subscriptionChange.current.customer_id,
18
+ event_type: types_1.ActivityLogEventType.SUBSCRIPTION_PAYMENT_METHOD_UPDATED,
19
+ actor_type: input.actor_type ?? types_1.ActivityLogActorType.USER,
20
+ actor_id: input.triggered_by ?? null,
21
+ display: {
22
+ subscription_reference: subscriptionChange.current.reference,
23
+ customer_name: subscriptionChange.current.customer_snapshot?.full_name ?? null,
24
+ product_title: subscriptionChange.current.product_snapshot?.product_title ?? null,
25
+ variant_title: subscriptionChange.current.product_snapshot?.variant_title ?? null,
26
+ },
27
+ previous_state: toPaymentMethodLogState(subscriptionChange.previous_payment_method),
28
+ new_state: toPaymentMethodLogState(subscriptionChange.current_payment_method),
29
+ metadata: {
30
+ source: input.actor_type === types_1.ActivityLogActorType.CUSTOMER
31
+ ? "storefront"
32
+ : "admin",
33
+ },
34
+ dedupe: {
35
+ scope: "subscription",
36
+ target_id: subscriptionChange.current.id,
37
+ qualifier: (0, date_output_1.toISOStringOrNull)(subscriptionChange.current.updated_at),
38
+ },
39
+ }),
40
+ };
41
+ });
42
+ (0, create_subscription_log_event_1.createSubscriptionLogEventStep)(logInput);
43
+ return new workflows_sdk_1.WorkflowResponse({
44
+ subscription: subscriptionChange.current,
45
+ payment_method: subscriptionChange.current_payment_method,
46
+ });
47
+ });
48
+ exports.default = exports.updateSubscriptionPaymentMethodWorkflow;
49
+ /**
50
+ * Only non-sensitive card identifiers are logged. Raw provider payloads never
51
+ * reach the activity log.
52
+ */
53
+ function toPaymentMethodLogState(paymentMethod) {
54
+ if (!paymentMethod) {
55
+ return null;
56
+ }
57
+ return {
58
+ payment_provider_id: paymentMethod.provider_id,
59
+ brand: paymentMethod.brand,
60
+ last4: paymentMethod.last4,
61
+ exp_month: paymentMethod.exp_month,
62
+ exp_year: paymentMethod.exp_year,
63
+ };
64
+ }
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLXN1YnNjcmlwdGlvbi1wYXltZW50LW1ldGhvZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3MvdXBkYXRlLXN1YnNjcmlwdGlvbi1wYXltZW50LW1ldGhvZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFpRkEsMERBY0M7QUEvRkQscUVBSTBDO0FBQzFDLHlGQUFzRjtBQUN0RixtR0FHbUQ7QUFDbkQsMkZBQTZGO0FBQzdGLHlEQUdzQztBQUV0QyxxREFBdUQ7QUFPMUMsUUFBQSx1Q0FBdUMsR0FBRyxJQUFBLDhCQUFjLEVBQ25FLG9DQUFvQyxFQUNwQyxVQUFVLEtBQW1EO0lBQzNELE1BQU0sa0JBQWtCLEdBQUcsSUFBQSx3RUFBbUMsRUFBQyxLQUFLLENBQUMsQ0FBQTtJQUNyRSxNQUFNLFFBQVEsR0FBRyxJQUFBLHlCQUFTLEVBQ3hCLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLEVBQzdCLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUU7UUFDckMsT0FBTztZQUNMLFNBQVMsRUFBRSxJQUFBLCtDQUF5QixFQUFDO2dCQUNuQyxlQUFlLEVBQUUsa0JBQWtCLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQzlDLFdBQVcsRUFBRSxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsV0FBVztnQkFDbkQsVUFBVSxFQUFFLDRCQUFvQixDQUFDLG1DQUFtQztnQkFDcEUsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLElBQUksNEJBQW9CLENBQUMsSUFBSTtnQkFDekQsUUFBUSxFQUFFLEtBQUssQ0FBQyxZQUFZLElBQUksSUFBSTtnQkFDcEMsT0FBTyxFQUFFO29CQUNQLHNCQUFzQixFQUFFLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxTQUFTO29CQUM1RCxhQUFhLEVBQ1gsa0JBQWtCLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLFNBQVMsSUFBSSxJQUFJO29CQUNqRSxhQUFhLEVBQ1gsa0JBQWtCLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLGFBQWEsSUFBSSxJQUFJO29CQUNwRSxhQUFhLEVBQ1gsa0JBQWtCLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLGFBQWEsSUFBSSxJQUFJO2lCQUNyRTtnQkFDRCxjQUFjLEVBQUUsdUJBQXVCLENBQ3JDLGtCQUFrQixDQUFDLHVCQUF1QixDQUMzQztnQkFDRCxTQUFTLEVBQUUsdUJBQXVCLENBQ2hDLGtCQUFrQixDQUFDLHNCQUFzQixDQUMxQztnQkFDRCxRQUFRLEVBQUU7b0JBQ1IsTUFBTSxFQUFFLEtBQUssQ0FBQyxVQUFVLEtBQUssNEJBQW9CLENBQUMsUUFBUTt3QkFDeEQsQ0FBQyxDQUFDLFlBQVk7d0JBQ2QsQ0FBQyxDQUFDLE9BQU87aUJBQ1o7Z0JBQ0QsTUFBTSxFQUFFO29CQUNOLEtBQUssRUFBRSxjQUFjO29CQUNyQixTQUFTLEVBQUUsa0JBQWtCLENBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ3hDLFNBQVMsRUFBRSxJQUFBLCtCQUFpQixFQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7aUJBQ3BFO2FBQ0YsQ0FBQztTQUNILENBQUE7SUFDSCxDQUFDLENBQ0YsQ0FBQTtJQUNELElBQUEsOERBQThCLEVBQUMsUUFBUSxDQUFDLENBQUE7SUFFeEMsT0FBTyxJQUFJLGdDQUFnQixDQUFDO1FBQzFCLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxPQUFPO1FBQ3hDLGNBQWMsRUFBRSxrQkFBa0IsQ0FBQyxzQkFBc0I7S0FDMUQsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUNGLENBQUE7QUFFRCxrQkFBZSwrQ0FBdUMsQ0FBQTtBQUV0RDs7O0dBR0c7QUFDSCxTQUFnQix1QkFBdUIsQ0FDckMsYUFBc0Q7SUFFdEQsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUVELE9BQU87UUFDTCxtQkFBbUIsRUFBRSxhQUFhLENBQUMsV0FBVztRQUM5QyxLQUFLLEVBQUUsYUFBYSxDQUFDLEtBQUs7UUFDMUIsS0FBSyxFQUFFLGFBQWEsQ0FBQyxLQUFLO1FBQzFCLFNBQVMsRUFBRSxhQUFhLENBQUMsU0FBUztRQUNsQyxRQUFRLEVBQUUsYUFBYSxDQUFDLFFBQVE7S0FDakMsQ0FBQTtBQUNILENBQUMifQ==
@@ -21,4 +21,4 @@ function buildAnalyticsIncrementalRebuildInput(input) {
21
21
  : null,
22
22
  };
23
23
  }
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbHl0aWNzLWluY3JlbWVudGFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy91dGlscy9hbmFseXRpY3MtaW5jcmVtZW50YWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUErQkEsc0ZBZUM7QUFyQ0QsU0FBUyxhQUFhLENBQUMsS0FBdUM7SUFDNUQsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQTtJQUVuRCxPQUFPLElBQUksSUFBSSxDQUNiLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FDN0UsQ0FBQTtBQUNILENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxRQUFjO0lBQ2pDLE9BQU8sSUFBSSxJQUFJLENBQ2IsSUFBSSxDQUFDLEdBQUcsQ0FDTixRQUFRLENBQUMsY0FBYyxFQUFFLEVBQ3pCLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFDdEIsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUNyQixFQUFFLEVBQ0YsRUFBRSxFQUNGLEVBQUUsRUFDRixHQUFHLENBQ0osQ0FDRixDQUFBO0FBQ0gsQ0FBQztBQUVELFNBQWdCLHFDQUFxQyxDQUNuRCxLQUE0QztJQUU1QyxNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBRWpELE9BQU87UUFDTCxTQUFTLEVBQUUsUUFBUTtRQUNuQixPQUFPLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQztRQUM5QixZQUFZLEVBQUUsYUFBYTtRQUMzQixZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVksSUFBSSxJQUFJO1FBQ3hDLE1BQU0sRUFBRSxLQUFLLENBQUMsY0FBYztRQUM1QixjQUFjLEVBQUUsS0FBSyxDQUFDLGNBQWM7WUFDbEMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLGNBQWMsWUFBWTtZQUNyQyxDQUFDLENBQUMsSUFBSTtLQUNULENBQUE7QUFDSCxDQUFDIn0=
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbHl0aWNzLWluY3JlbWVudGFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy91dGlscy9hbmFseXRpY3MtaW5jcmVtZW50YWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFvQ0Esc0ZBZUM7QUFyQ0QsU0FBUyxhQUFhLENBQUMsS0FBdUM7SUFDNUQsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQTtJQUVuRCxPQUFPLElBQUksSUFBSSxDQUNiLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FDN0UsQ0FBQTtBQUNILENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxRQUFjO0lBQ2pDLE9BQU8sSUFBSSxJQUFJLENBQ2IsSUFBSSxDQUFDLEdBQUcsQ0FDTixRQUFRLENBQUMsY0FBYyxFQUFFLEVBQ3pCLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFDdEIsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUNyQixFQUFFLEVBQ0YsRUFBRSxFQUNGLEVBQUUsRUFDRixHQUFHLENBQ0osQ0FDRixDQUFBO0FBQ0gsQ0FBQztBQUVELFNBQWdCLHFDQUFxQyxDQUNuRCxLQUE0QztJQUU1QyxNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBRWpELE9BQU87UUFDTCxTQUFTLEVBQUUsUUFBUTtRQUNuQixPQUFPLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQztRQUM5QixZQUFZLEVBQUUsYUFBYTtRQUMzQixZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVksSUFBSSxJQUFJO1FBQ3hDLE1BQU0sRUFBRSxLQUFLLENBQUMsY0FBYztRQUM1QixjQUFjLEVBQUUsS0FBSyxDQUFDLGNBQWM7WUFDbEMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLGNBQWMsWUFBWTtZQUNyQyxDQUFDLENBQUMsSUFBSTtLQUNULENBQUE7QUFDSCxDQUFDIn0=
package/README.md CHANGED
@@ -1,30 +1,55 @@
1
1
  <div align="center">
2
- <a href="https://www.reorderjs.com">
3
- <picture>
4
- <source media="(prefers-color-scheme: dark)" srcset="https://github.com/user-attachments/assets/f3420397-bfb7-4358-be41-aa2d9d22623c">
5
- <source media="(prefers-color-scheme: light)" srcset="https://github.com/user-attachments/assets/60cebea7-3f45-40cb-8382-301b52376e82">
6
- <img alt="Reorder logo" src="https://github.com/user-attachments/assets/f3420397-bfb7-4358-be41-aa2d9d22623c">
7
- </picture>
2
+ <img alt="Reorder — Subscriptions for Medusa, done right." src="assets/screenshots/reorder-hero-new.png" />
3
+ </div>
4
+
5
+ <h1 align="center">Open-source subscription plugin built on standard Medusa primitives</h1>
6
+
7
+ <div align="center">
8
+ <a href="https://medusajs.com/blog/reorder">
9
+ <img alt="Featured on Medusa Blog" src="https://img.shields.io/badge/Featured_on-Medusa_Blog-7C3AED.svg" />
8
10
  </a>
9
- <h1> Open Source Subscription Medusa Plugin </h1>
10
11
  <a href="https://github.com/reorder-js/reorder?tab=MIT-1-ov-file">
11
12
  <img alt="License" src="https://img.shields.io/badge/license-MIT-blue.svg" />
12
13
  </a>
13
14
  <a href="https://github.com/reorder-js/reorder/issues">
14
15
  <img src="https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat" alt="PRs welcome!" />
15
- <a href="https://www.reorderjs.com/contact">
16
+ </a>
17
+ <a href="https://www.reorderjs.com/get-started">
16
18
  <img alt="Support" src="https://img.shields.io/badge/support-contact%20author-blue.svg" />
17
19
  </a>
18
20
  </div>
19
21
 
20
- <h4 align="center">
21
- <a href="https://www.reorderjs.com">Website</a> |
22
- <a href="https://docs.reorderjs.com">Documentation</a>
23
-
24
- &nbsp;
25
-
26
- <img width="800" height="600" alt="subscriptions-page-crop" src="https://github.com/user-attachments/assets/a7817f86-7524-4ccf-90f2-9beca34b50c4" />
27
- </h4>
22
+ &nbsp;
23
+
24
+ <div align="center">
25
+ <a href="https://medusajs.com/blog/reorder">
26
+ <img width="800" alt="Nicklas Gellner, Co-founder & COO Medusa — featured on the Medusa Blog" src="assets/screenshots/reorder-social.png" />
27
+ </a>
28
+ </div>
29
+
30
+ &nbsp;
31
+
32
+ <div align="center">
33
+ <a href="https://www.reorderjs.com">Website</a> &nbsp;·&nbsp;
34
+ <a href="https://docs.reorderjs.com">Documentation</a> &nbsp;·&nbsp;
35
+ <a href="https://www.youtube.com/watch?v=KY43_6Q3560">Video Demo</a>
36
+ </div>
37
+
38
+ &nbsp;
39
+
40
+ ## Why Reorder?
41
+
42
+ - **Native Medusa plugin** — built entirely on Medusa modules, workflows, and Admin UI extensions. No second source of truth, no external subscription platform to sync with.
43
+ - **Open-source, MIT licensed** — no revenue cut, no per-transaction fees, no vendor lock-in.
44
+ - **AI-native** — every domain is mapped in `AGENTS.md`, documented with specs, and covered by HTTP integration tests. Designed for agentic development from day one.
45
+ - **Officially featured by Medusa** — recognized by the Medusa team as the reference example of how a Medusa plugin should be built.
46
+ - **Production-ready** — Roastloop launched coffee subscriptions in 7 days using Reorder. [See the full story →](https://medusajs.com/blog/reorder)
47
+
48
+ &nbsp;
49
+
50
+ <div align="center">
51
+ <img width="800" alt="Reorder Admin — subscriptions list" src="assets/screenshots/admin-subscriptions.png" />
52
+ </div>
28
53
 
29
54
  &nbsp;
30
55
 
@@ -40,33 +65,51 @@ It adds recurring commerce capabilities to a Medusa store, including subscriptio
40
65
 
41
66
  ## What it includes
42
67
 
43
- - `Subscriptions`
44
- - `Plans & Offers`
45
- - `Renewals`
46
- - `Dunning`
47
- - `Cancellation & Retention`
48
- - `Activity Log`
49
- - `Analytics`
68
+ - **Subscriptions** — Create, pause, resume, skip, and cancel subscriptions, with full lifecycle state tracked in the Admin.
69
+ - **Plans & Offers** — Configure frequencies, per-frequency discounts, trials, and minimum cycle rules per plan.
70
+ - **Renewals** — Scheduler-backed renewal execution with manual override, approval queues, and full attempt history.
71
+ - **Dunning** — Payment retry scheduling with configurable intervals and manual recovery tooling.
72
+ - **Cancellation & Retention** — Pause offers, discounts, and bonuses shown to subscribers before cancellation is final.
73
+ - **Activity Log** — A complete operational history of every subscription event, accessible in the Admin.
74
+ - **Analytics** — MRR, churn rate, LTV, and active subscription counts with filterable trend charts.
75
+ - **Self-service Store APIs** — Subscription checkout, offer selection, and customer portal endpoints for your storefront.
76
+ - **Storefront building blocks** — Cart, checkout, and customer portal integration guides for your own frontend.
50
77
 
51
78
  &nbsp;
52
79
 
53
- ## Current scope
80
+ <div align="center">
81
+ <img width="800" alt="Feature grid — everything the subscription lifecycle needs" src="assets/screenshots/feature-grid.png" />
82
+ </div>
54
83
 
55
- `Reorder` currently focuses on recurring commerce operations managed from the Medusa Admin.
84
+ &nbsp;
56
85
 
57
- Today, the plugin provides strong Admin coverage across the implemented domains. Customer self-service flows will be introduced in the near future as a `Reorder Subscription Starter`.
86
+ <div align="center">
87
+ <img width="800" alt="Storefront subscribe & save" src="assets/screenshots/storefront-subscribe-save.png" />
88
+ </div>
89
+
90
+ &nbsp;
91
+
92
+ ## AI-native
93
+
94
+ Every domain in `Reorder` is mapped in `AGENTS.md` — linking architecture, API contracts, workflow docs, and integration tests so an AI agent reads documented behavior before touching implementation files.
95
+
96
+ <div align="center">
97
+ <img width="800" alt="AI-native — optimized for agentic development" src="assets/screenshots/ai-native.png" />
98
+ </div>
58
99
 
59
100
  &nbsp;
60
101
 
61
- ## Feature highlights
102
+ ## Medusa Cloud compatible
62
103
 
63
- - Subscription lifecycle management
64
- - Configurable plans and offers
65
- - Renewal orchestration
66
- - Dunning retries and recovery tooling
67
- - Cancellation flows with retention offers
68
- - Operational activity logs
69
- - Subscription analytics and reporting
104
+ `Reorder` is compatible with Medusa Cloud. No self-hosting required deploy your Medusa project to Medusa Cloud and install the plugin as you would locally.
105
+
106
+ &nbsp;
107
+
108
+ ## Current scope
109
+
110
+ `Reorder` currently focuses on recurring commerce operations managed from the Medusa Admin.
111
+
112
+ Today, the plugin provides strong Admin coverage across the implemented domains. Customer self-service flows will be introduced in the near future as a `Reorder Subscription Starter`.
70
113
 
71
114
  &nbsp;
72
115
 
@@ -104,13 +147,13 @@ plugins: [
104
147
 
105
148
  With `npm`:
106
149
 
107
- ```bash npm
150
+ ```bash
108
151
  npx medusa db:migrate
109
152
  ```
110
153
 
111
154
  With `yarn`:
112
155
 
113
- ```bash yarn
156
+ ```bash
114
157
  yarn medusa db:migrate
115
158
  ```
116
159
 
@@ -118,6 +161,8 @@ yarn medusa db:migrate
118
161
 
119
162
  After adding the plugin, run your normal Medusa setup flow in your store project.
120
163
 
164
+ &nbsp;
165
+
121
166
  ## Local development
122
167
 
123
168
  If you want to work on the plugin itself locally:
@@ -192,6 +237,14 @@ yarn dev
192
237
 
193
238
  &nbsp;
194
239
 
240
+ ## Community & Support
241
+
242
+ - **GitHub Issues** — bug reports and feature requests: [github.com/reorder-js/reorder/issues](https://github.com/reorder-js/reorder/issues)
243
+ - **GitHub Discussions** — questions, ideas, and general help: [github.com/reorder-js/reorder/discussions](https://github.com/reorder-js/reorder/discussions)
244
+ - **Contact** — reach the author directly at [reorderjs.com/get-started](https://www.reorderjs.com/get-started)
245
+
246
+ &nbsp;
247
+
195
248
  ## Documentation
196
249
 
197
250
  Project documentation lives in `docs/`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reorderjs/reorder",
3
- "version": "1.0.7",
3
+ "version": "1.1.0",
4
4
  "description": "Open Source Subscription Medusa Plugin.",
5
5
  "author": "Reorder (https://reorderjs.com)",
6
6
  "license": "MIT",
@@ -32,43 +32,45 @@
32
32
  "build": "medusa plugin:build",
33
33
  "dev": "medusa plugin:develop",
34
34
  "prepublishOnly": "medusa plugin:build",
35
- "test:integration:http": "TEST_TYPE=integration:http NODE_OPTIONS=--experimental-vm-modules jest --silent=false --runInBand --forceExit",
36
- "test:integration:modules": "TEST_TYPE=integration:modules NODE_OPTIONS=--experimental-vm-modules jest --silent=false --runInBand --forceExit"
35
+ "test:integration:http": "TEST_TYPE=integration:http NODE_OPTIONS=--experimental-vm-modules jest --silent=false --maxWorkers=2 --forceExit",
36
+ "test:integration:modules": "TEST_TYPE=integration:modules NODE_OPTIONS=--experimental-vm-modules jest --silent=false --runInBand --forceExit",
37
+ "test:e2e": "npx playwright test"
37
38
  },
38
39
  "devDependencies": {
39
- "@medusajs/admin-sdk": "2.13.6",
40
- "@medusajs/cli": "2.13.6",
41
- "@medusajs/framework": "2.13.6",
42
- "@medusajs/icons": "2.13.6",
43
- "@medusajs/medusa": "2.13.6",
44
- "@medusajs/test-utils": "2.13.6",
45
- "@medusajs/ui": "4.0.25",
40
+ "@medusajs/admin-sdk": "2.19.0",
41
+ "@medusajs/cli": "2.19.0",
42
+ "@medusajs/framework": "2.19.0",
43
+ "@medusajs/icons": "2.19.0",
44
+ "@medusajs/medusa": "2.19.0",
45
+ "@medusajs/test-utils": "2.19.0",
46
+ "@medusajs/ui": "4.2.1",
47
+ "@playwright/test": "^1.62.1",
46
48
  "@swc/core": "^1.7.28",
47
49
  "@swc/jest": "^0.2.39",
48
50
  "@types/jest": "^29.5.14",
49
- "@types/node": "^20.0.0",
51
+ "@types/node": "^20.19.0",
50
52
  "@types/react": "^18.3.2",
51
- "@types/react-dom": "^18.2.25",
53
+ "@types/react-dom": "^18.3.0",
52
54
  "jest": "^29.7.0",
53
55
  "prop-types": "^15.8.1",
54
- "react": "^18.2.0",
55
- "react-dom": "^18.2.0",
56
+ "react": "^18.3.1",
57
+ "react-dom": "^18.3.1",
56
58
  "ts-node": "^10.9.2",
57
59
  "typescript": "^5.6.2",
58
- "vite": "^5.2.11",
60
+ "vite": "^7.3.6",
59
61
  "yalc": "^1.0.0-pre.53"
60
62
  },
61
63
  "peerDependencies": {
62
- "@medusajs/admin-sdk": "2.13.6",
63
- "@medusajs/cli": "2.13.6",
64
- "@medusajs/framework": "2.13.6",
65
- "@medusajs/icons": "2.13.6",
66
- "@medusajs/medusa": "2.13.6",
67
- "@medusajs/test-utils": "2.13.6",
68
- "@medusajs/ui": "4.0.25"
64
+ "@medusajs/admin-sdk": "2.19.0",
65
+ "@medusajs/cli": "2.19.0",
66
+ "@medusajs/framework": "2.19.0",
67
+ "@medusajs/icons": "2.19.0",
68
+ "@medusajs/medusa": "2.19.0",
69
+ "@medusajs/test-utils": "2.19.0",
70
+ "@medusajs/ui": "4.2.1"
69
71
  },
70
72
  "engines": {
71
- "node": ">=20"
73
+ "node": "^20.19.0 || >=22.12.0"
72
74
  },
73
75
  "packageManager": "yarn@4.4.1"
74
76
  }