@xbstracts/medusa-coupons 0.0.1

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 (84) hide show
  1. package/.medusa/server/src/admin/index.js +3207 -0
  2. package/.medusa/server/src/admin/index.mjs +3253 -0
  3. package/.medusa/server/src/api/admin/coupon-products/[product_id]/entitlements/route.js +9 -0
  4. package/.medusa/server/src/api/admin/coupon-products/[product_id]/mirror-promotion/route.js +132 -0
  5. package/.medusa/server/src/api/admin/coupon-products/[product_id]/preview/route.js +28 -0
  6. package/.medusa/server/src/api/admin/coupon-products/[product_id]/route.js +18 -0
  7. package/.medusa/server/src/api/admin/coupon-products/[product_id]/variants/[variant_config_id]/route.js +14 -0
  8. package/.medusa/server/src/api/admin/coupon-products/[product_id]/variants/route.js +14 -0
  9. package/.medusa/server/src/api/admin/coupon-products/configs/[id]/route.js +53 -0
  10. package/.medusa/server/src/api/admin/coupon-products/configs/[id]/variants/[variant_config_id]/route.js +26 -0
  11. package/.medusa/server/src/api/admin/coupon-products/configs/[id]/variants/route.js +27 -0
  12. package/.medusa/server/src/api/admin/coupon-products/configs/route.js +36 -0
  13. package/.medusa/server/src/api/admin/coupon-products/entitlements/[id]/cancel/route.js +15 -0
  14. package/.medusa/server/src/api/admin/coupon-products/entitlements/[id]/redeem/route.js +15 -0
  15. package/.medusa/server/src/api/admin/coupon-products/entitlements/[id]/route.js +16 -0
  16. package/.medusa/server/src/api/admin/coupon-products/entitlements/route.js +22 -0
  17. package/.medusa/server/src/api/admin/coupon-products/options/route.js +9 -0
  18. package/.medusa/server/src/api/admin/coupon-products/products/route.js +16 -0
  19. package/.medusa/server/src/api/admin/coupon-products/route.js +13 -0
  20. package/.medusa/server/src/api/admin/coupon-products/uploads/route.js +7 -0
  21. package/.medusa/server/src/api/coupon-product-routes.js +546 -0
  22. package/.medusa/server/src/api/entitlement-utils.js +90 -0
  23. package/.medusa/server/src/api/media-upload.js +57 -0
  24. package/.medusa/server/src/api/middlewares.js +92 -0
  25. package/.medusa/server/src/api/product-utils.js +304 -0
  26. package/.medusa/server/src/api/promotion-code-resolver.js +225 -0
  27. package/.medusa/server/src/api/seller-utils.js +101 -0
  28. package/.medusa/server/src/api/utils.js +25 -0
  29. package/.medusa/server/src/api/validators.js +199 -0
  30. package/.medusa/server/src/api/vendor/coupon-products/[product_id]/entitlements/route.js +9 -0
  31. package/.medusa/server/src/api/vendor/coupon-products/[product_id]/route.js +18 -0
  32. package/.medusa/server/src/api/vendor/coupon-products/[product_id]/variants/[variant_config_id]/route.js +14 -0
  33. package/.medusa/server/src/api/vendor/coupon-products/[product_id]/variants/route.js +14 -0
  34. package/.medusa/server/src/api/vendor/coupon-products/configs/[id]/route.js +60 -0
  35. package/.medusa/server/src/api/vendor/coupon-products/configs/[id]/variants/[variant_config_id]/route.js +41 -0
  36. package/.medusa/server/src/api/vendor/coupon-products/configs/[id]/variants/route.js +45 -0
  37. package/.medusa/server/src/api/vendor/coupon-products/configs/route.js +51 -0
  38. package/.medusa/server/src/api/vendor/coupon-products/entitlements/[id]/route.js +25 -0
  39. package/.medusa/server/src/api/vendor/coupon-products/entitlements/route.js +45 -0
  40. package/.medusa/server/src/api/vendor/coupon-products/options/route.js +9 -0
  41. package/.medusa/server/src/api/vendor/coupon-products/products/route.js +19 -0
  42. package/.medusa/server/src/api/vendor/coupon-products/route.js +13 -0
  43. package/.medusa/server/src/api/vendor/coupon-products/uploads/route.js +7 -0
  44. package/.medusa/server/src/jobs/retry-coupon-media-deletes.js +14 -0
  45. package/.medusa/server/src/links/coupon-issuance-order-line-item.js +17 -0
  46. package/.medusa/server/src/links/coupon-issuance-order.js +15 -0
  47. package/.medusa/server/src/links/coupon-product-config-product.js +17 -0
  48. package/.medusa/server/src/links/coupon-product-variant-config-variant.js +17 -0
  49. package/.medusa/server/src/links/coupon-promotion-mirror-promotion.js +17 -0
  50. package/.medusa/server/src/links/customer-coupon-entitlement-customer.js +15 -0
  51. package/.medusa/server/src/modules/coupon/constants.js +46 -0
  52. package/.medusa/server/src/modules/coupon/index.js +16 -0
  53. package/.medusa/server/src/modules/coupon/loaders/reconcile-coupon-products.js +65 -0
  54. package/.medusa/server/src/modules/coupon/migrations/Migration20260709000000.js +40 -0
  55. package/.medusa/server/src/modules/coupon/migrations/Migration20260710000000.js +22 -0
  56. package/.medusa/server/src/modules/coupon/migrations/Migration20260711000000.js +25 -0
  57. package/.medusa/server/src/modules/coupon/migrations/Migration20260712000000.js +78 -0
  58. package/.medusa/server/src/modules/coupon/migrations/Migration20260719000000.js +19 -0
  59. package/.medusa/server/src/modules/coupon/migrations/Migration20260722000000.js +17 -0
  60. package/.medusa/server/src/modules/coupon/migrations/Migration20260723000000.js +18 -0
  61. package/.medusa/server/src/modules/coupon/models/coupon-entitlement-promotion.js +31 -0
  62. package/.medusa/server/src/modules/coupon/models/coupon-entitlement-seller.js +28 -0
  63. package/.medusa/server/src/modules/coupon/models/coupon-issuance.js +35 -0
  64. package/.medusa/server/src/modules/coupon/models/coupon-media-asset.js +41 -0
  65. package/.medusa/server/src/modules/coupon/models/coupon-product-config.js +45 -0
  66. package/.medusa/server/src/modules/coupon/models/coupon-product-variant-config.js +36 -0
  67. package/.medusa/server/src/modules/coupon/models/coupon-promotion-mirror.js +27 -0
  68. package/.medusa/server/src/modules/coupon/models/customer-coupon-entitlement.js +56 -0
  69. package/.medusa/server/src/modules/coupon/models/index.js +23 -0
  70. package/.medusa/server/src/modules/coupon/payment-order-utils.js +76 -0
  71. package/.medusa/server/src/modules/coupon/product-metadata.js +24 -0
  72. package/.medusa/server/src/modules/coupon/purchase-conditions.js +138 -0
  73. package/.medusa/server/src/modules/coupon/service.js +628 -0
  74. package/.medusa/server/src/modules/coupon/types.js +3 -0
  75. package/.medusa/server/src/modules/coupon/utils.js +302 -0
  76. package/.medusa/server/src/subscribers/issue-coupons-from-order.js +88 -0
  77. package/.medusa/server/src/vendor/index.mjs +3237 -0
  78. package/.medusa/server/src/workflows/hooks/validate-coupon-add-to-cart.js +13 -0
  79. package/.medusa/server/src/workflows/hooks/validate-coupon-complete-cart.js +8 -0
  80. package/.medusa/server/src/workflows/index.js +21 -0
  81. package/.medusa/server/src/workflows/steps.js +27 -0
  82. package/.medusa/server/src/workflows/validate-coupon-purchase.js +85 -0
  83. package/README.md +84 -0
  84. package/package.json +102 -0
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const utils_1 = require("@medusajs/framework/utils");
4
+ const constants_1 = require("../constants");
5
+ const CustomerCouponEntitlement = utils_1.model
6
+ .define("customer_coupon_entitlement", {
7
+ id: utils_1.model.id({ prefix: "ccoup" }).primaryKey(),
8
+ origin: utils_1.model.enum([...constants_1.ENTITLEMENT_ORIGINS]).default("purchase"),
9
+ customer_id: utils_1.model.text().nullable(),
10
+ email: utils_1.model.text().nullable(),
11
+ code: utils_1.model.text().nullable(),
12
+ shared_code: utils_1.model.text().nullable(),
13
+ status: utils_1.model.enum([...constants_1.ENTITLEMENT_STATUSES]).default("issued"),
14
+ product_id: utils_1.model.text().nullable(),
15
+ variant_id: utils_1.model.text().nullable(),
16
+ order_id: utils_1.model.text().nullable(),
17
+ line_item_id: utils_1.model.text().nullable(),
18
+ issuance_id: utils_1.model.text().nullable(),
19
+ config_id: utils_1.model.text().nullable(),
20
+ variant_config_id: utils_1.model.text().nullable(),
21
+ benefit_snapshot: utils_1.model.json(),
22
+ source_snapshot: utils_1.model.json().nullable(),
23
+ expires_at: utils_1.model.dateTime().nullable(),
24
+ redeemed_at: utils_1.model.dateTime().nullable(),
25
+ external_reference: utils_1.model.text().nullable(),
26
+ metadata: utils_1.model.json().nullable(),
27
+ })
28
+ .indexes([
29
+ {
30
+ name: "IDX_customer_coupon_entitlement_customer_id",
31
+ on: ["customer_id"],
32
+ },
33
+ {
34
+ name: "IDX_customer_coupon_entitlement_code",
35
+ on: ["code"],
36
+ },
37
+ {
38
+ name: "IDX_customer_coupon_entitlement_order_id",
39
+ on: ["order_id"],
40
+ },
41
+ {
42
+ name: "IDX_customer_coupon_entitlement_issuance_id",
43
+ on: ["issuance_id"],
44
+ },
45
+ {
46
+ name: "IDX_customer_coupon_entitlement_status",
47
+ on: ["status"],
48
+ },
49
+ {
50
+ name: "IDX_customer_coupon_entitlement_external_reference_unique",
51
+ on: ["external_reference"],
52
+ unique: true,
53
+ },
54
+ ]);
55
+ exports.default = CustomerCouponEntitlement;
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tZXItY291cG9uLWVudGl0bGVtZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvY291cG9uL21vZGVscy9jdXN0b21lci1jb3Vwb24tZW50aXRsZW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxREFBaUQ7QUFDakQsNENBQXdFO0FBRXhFLE1BQU0seUJBQXlCLEdBQUcsYUFBSztLQUNwQyxNQUFNLENBQUMsNkJBQTZCLEVBQUU7SUFDckMsRUFBRSxFQUFFLGFBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUU7SUFDOUMsTUFBTSxFQUFFLGFBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLCtCQUFtQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO0lBQ2hFLFdBQVcsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3BDLEtBQUssRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQzlCLElBQUksRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQzdCLFdBQVcsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ3BDLE1BQU0sRUFBRSxhQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxnQ0FBb0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztJQUMvRCxVQUFVLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNuQyxVQUFVLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNuQyxRQUFRLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNqQyxZQUFZLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNyQyxXQUFXLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNwQyxTQUFTLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNsQyxpQkFBaUIsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQzFDLGdCQUFnQixFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUU7SUFDOUIsZUFBZSxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDeEMsVUFBVSxFQUFFLGFBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDdkMsV0FBVyxFQUFFLGFBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDeEMsa0JBQWtCLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUMzQyxRQUFRLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRTtDQUNsQyxDQUFDO0tBQ0QsT0FBTyxDQUFDO0lBQ1A7UUFDRSxJQUFJLEVBQUUsNkNBQTZDO1FBQ25ELEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQztLQUNwQjtJQUNEO1FBQ0UsSUFBSSxFQUFFLHNDQUFzQztRQUM1QyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUM7S0FDYjtJQUNEO1FBQ0UsSUFBSSxFQUFFLDBDQUEwQztRQUNoRCxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUM7S0FDakI7SUFDRDtRQUNFLElBQUksRUFBRSw2Q0FBNkM7UUFDbkQsRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDO0tBQ3BCO0lBQ0Q7UUFDRSxJQUFJLEVBQUUsd0NBQXdDO1FBQzlDLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQztLQUNmO0lBQ0Q7UUFDRSxJQUFJLEVBQUUsMkRBQTJEO1FBQ2pFLEVBQUUsRUFBRSxDQUFDLG9CQUFvQixDQUFDO1FBQzFCLE1BQU0sRUFBRSxJQUFJO0tBQ2I7Q0FDRixDQUFDLENBQUE7QUFFSixrQkFBZSx5QkFBeUIsQ0FBQSJ9
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.CustomerCouponEntitlement = exports.CouponPromotionMirror = exports.CouponProductVariantConfig = exports.CouponProductConfig = exports.CouponMediaAsset = exports.CouponEntitlementSeller = exports.CouponEntitlementPromotion = exports.CouponIssuance = void 0;
7
+ var coupon_issuance_1 = require("./coupon-issuance");
8
+ Object.defineProperty(exports, "CouponIssuance", { enumerable: true, get: function () { return __importDefault(coupon_issuance_1).default; } });
9
+ var coupon_entitlement_promotion_1 = require("./coupon-entitlement-promotion");
10
+ Object.defineProperty(exports, "CouponEntitlementPromotion", { enumerable: true, get: function () { return __importDefault(coupon_entitlement_promotion_1).default; } });
11
+ var coupon_entitlement_seller_1 = require("./coupon-entitlement-seller");
12
+ Object.defineProperty(exports, "CouponEntitlementSeller", { enumerable: true, get: function () { return __importDefault(coupon_entitlement_seller_1).default; } });
13
+ var coupon_media_asset_1 = require("./coupon-media-asset");
14
+ Object.defineProperty(exports, "CouponMediaAsset", { enumerable: true, get: function () { return __importDefault(coupon_media_asset_1).default; } });
15
+ var coupon_product_config_1 = require("./coupon-product-config");
16
+ Object.defineProperty(exports, "CouponProductConfig", { enumerable: true, get: function () { return __importDefault(coupon_product_config_1).default; } });
17
+ var coupon_product_variant_config_1 = require("./coupon-product-variant-config");
18
+ Object.defineProperty(exports, "CouponProductVariantConfig", { enumerable: true, get: function () { return __importDefault(coupon_product_variant_config_1).default; } });
19
+ var coupon_promotion_mirror_1 = require("./coupon-promotion-mirror");
20
+ Object.defineProperty(exports, "CouponPromotionMirror", { enumerable: true, get: function () { return __importDefault(coupon_promotion_mirror_1).default; } });
21
+ var customer_coupon_entitlement_1 = require("./customer-coupon-entitlement");
22
+ Object.defineProperty(exports, "CustomerCouponEntitlement", { enumerable: true, get: function () { return __importDefault(customer_coupon_entitlement_1).default; } });
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9jb3Vwb24vbW9kZWxzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHFEQUE2RDtBQUFwRCxrSUFBQSxPQUFPLE9BQWtCO0FBQ2xDLCtFQUFzRjtBQUE3RSwySkFBQSxPQUFPLE9BQThCO0FBQzlDLHlFQUFnRjtBQUF2RSxxSkFBQSxPQUFPLE9BQTJCO0FBQzNDLDJEQUFrRTtBQUF6RCx1SUFBQSxPQUFPLE9BQW9CO0FBQ3BDLGlFQUF3RTtBQUEvRCw2SUFBQSxPQUFPLE9BQXVCO0FBQ3ZDLGlGQUF1RjtBQUE5RSw0SkFBQSxPQUFPLE9BQThCO0FBQzlDLHFFQUE0RTtBQUFuRSxpSkFBQSxPQUFPLE9BQXlCO0FBQ3pDLDZFQUFvRjtBQUEzRSx5SkFBQSxPQUFPLE9BQTZCIn0=
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveOrderIdFromPaymentEvent = resolveOrderIdFromPaymentEvent;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ function id(value) {
6
+ return typeof value === "string" && value.trim() ? value.trim() : "";
7
+ }
8
+ async function graphId(container, entity, fields, filters, field) {
9
+ try {
10
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
11
+ const { data } = await query.graph({ entity, fields, filters });
12
+ return id(data?.[0]?.[field]);
13
+ }
14
+ catch {
15
+ return "";
16
+ }
17
+ }
18
+ async function databaseId(container, table, filters, field) {
19
+ try {
20
+ const db = container.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
21
+ const row = await db(table)
22
+ .where(filters)
23
+ .whereNull("deleted_at")
24
+ .first(field);
25
+ return id(row?.[field]);
26
+ }
27
+ catch {
28
+ return "";
29
+ }
30
+ }
31
+ async function paymentIdFromCapture(container, captureId) {
32
+ if (!captureId)
33
+ return "";
34
+ return ((await graphId(container, "capture", ["id", "payment_id"], { id: captureId }, "payment_id")) ||
35
+ (await databaseId(container, "capture", { id: captureId }, "payment_id")));
36
+ }
37
+ async function collectionIdFromPayment(container, paymentId) {
38
+ if (!paymentId)
39
+ return "";
40
+ return ((await graphId(container, "payment", ["id", "payment_collection_id"], { id: paymentId }, "payment_collection_id")) ||
41
+ (await databaseId(container, "payment", { id: paymentId }, "payment_collection_id")));
42
+ }
43
+ async function orderIdFromCollection(container, collectionId) {
44
+ if (!collectionId)
45
+ return "";
46
+ return ((await graphId(container, "order_payment_collection", ["order_id", "payment_collection_id"], { payment_collection_id: collectionId }, "order_id")) ||
47
+ (await databaseId(container, "order_payment_collection", { payment_collection_id: collectionId }, "order_id")));
48
+ }
49
+ async function resolveOrderIdFromPaymentEvent(data, container) {
50
+ const eventId = id(data.id);
51
+ const direct = id(data.order_id) ||
52
+ id(data.orderId) ||
53
+ id(data.order?.id) ||
54
+ id(data.metadata?.order_id) ||
55
+ (eventId.startsWith("order_") ? eventId : "");
56
+ if (direct)
57
+ return direct;
58
+ const captureId = id(data.capture_id) ||
59
+ id(data.captureId) ||
60
+ id(data.capture?.id) ||
61
+ (eventId.startsWith("capt_") ? eventId : "");
62
+ const paymentId = id(data.payment_id) ||
63
+ id(data.paymentId) ||
64
+ id(data.payment?.id) ||
65
+ id(data.capture?.payment_id) ||
66
+ id(data.capture?.paymentId) ||
67
+ (eventId.startsWith("pay_") ? eventId : "") ||
68
+ (await paymentIdFromCapture(container, captureId));
69
+ const collectionId = id(data.payment_collection_id) ||
70
+ id(data.paymentCollectionId) ||
71
+ id(data.payment?.payment_collection_id) ||
72
+ id(data.payment?.paymentCollectionId) ||
73
+ (await collectionIdFromPayment(container, paymentId));
74
+ return orderIdFromCollection(container, collectionId);
75
+ }
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5bWVudC1vcmRlci11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2NvdXBvbi9wYXltZW50LW9yZGVyLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBZ0hBLHdFQWtDQztBQWxKRCxxREFBcUU7QUFzQnJFLFNBQVMsRUFBRSxDQUFDLEtBQWM7SUFDeEIsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtBQUN0RSxDQUFDO0FBRUQsS0FBSyxVQUFVLE9BQU8sQ0FDcEIsU0FBYyxFQUNkLE1BQWMsRUFDZCxNQUFnQixFQUNoQixPQUFnQyxFQUNoQyxLQUFhO0lBRWIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNoRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFBO1FBQy9ELE9BQU8sRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUMvQixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxFQUFFLENBQUE7SUFDWCxDQUFDO0FBQ0gsQ0FBQztBQUVELEtBQUssVUFBVSxVQUFVLENBQ3ZCLFNBQWMsRUFDZCxLQUFhLEVBQ2IsT0FBZ0MsRUFDaEMsS0FBYTtJQUViLElBQUksQ0FBQztRQUNILE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsYUFBYSxDQUFRLENBQUE7UUFDNUUsTUFBTSxHQUFHLEdB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
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildCouponProductMarker = buildCouponProductMarker;
4
+ exports.hasCanonicalCouponProductMarker = hasCanonicalCouponProductMarker;
5
+ function buildCouponProductMarker(configId, enabled = true) {
6
+ return {
7
+ enabled,
8
+ config_id: configId || null,
9
+ item_type: "coupon",
10
+ fulfillment_type: "code_issuance",
11
+ requires_shipping: false,
12
+ };
13
+ }
14
+ function hasCanonicalCouponProductMarker(value, configId) {
15
+ if (!value || typeof value !== "object")
16
+ return false;
17
+ const marker = value;
18
+ return (marker.enabled === true &&
19
+ marker.config_id === configId &&
20
+ marker.item_type === "coupon" &&
21
+ marker.fulfillment_type === "code_issuance" &&
22
+ marker.requires_shipping === false);
23
+ }
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1tZXRhZGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2NvdXBvbi9wcm9kdWN0LW1ldGFkYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBUUEsNERBV0M7QUFFRCwwRUFjQztBQTNCRCxTQUFnQix3QkFBd0IsQ0FDdEMsUUFBd0IsRUFDeEIsT0FBTyxHQUFHLElBQUk7SUFFZCxPQUFPO1FBQ0wsT0FBTztRQUNQLFNBQVMsRUFBRSxRQUFRLElBQUksSUFBSTtRQUMzQixTQUFTLEVBQUUsUUFBUTtRQUNuQixnQkFBZ0IsRUFBRSxlQUFlO1FBQ2pDLGlCQUFpQixFQUFFLEtBQUs7S0FDekIsQ0FBQTtBQUNILENBQUM7QUFFRCxTQUFnQiwrQkFBK0IsQ0FDN0MsS0FBYyxFQUNkLFFBQWdCO0lBRWhCLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFBO0lBQ3JELE1BQU0sTUFBTSxHQUFHLEtBQWdDLENBQUE7SUFFL0MsT0FBTyxDQUNMLE1BQU0sQ0FBQyxPQUFPLEtBQUssSUFBSTtRQUN2QixNQUFNLENBQUMsU0FBUyxLQUFLLFFBQVE7UUFDN0IsTUFBTSxDQUFDLFNBQVMsS0FBSyxRQUFRO1FBQzdCLE1BQU0sQ0FBQyxnQkFBZ0IsS0FBSyxlQUFlO1FBQzNDLE1BQU0sQ0FBQyxpQkFBaUIsS0FBSyxLQUFLLENBQ25DLENBQUE7QUFDSCxDQUFDIn0=
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.COUPON_PURCHASE_CONDITION_OPERATORS = exports.COUPON_PURCHASE_CONDITION_ATTRIBUTES = void 0;
4
+ exports.normalizePurchaseConditions = normalizePurchaseConditions;
5
+ exports.findPurchaseCondition = findPurchaseCondition;
6
+ exports.resolveEffectiveConditionValues = resolveEffectiveConditionValues;
7
+ exports.buildCouponPurchaseContext = buildCouponPurchaseContext;
8
+ exports.evaluateCouponPurchaseConditions = evaluateCouponPurchaseConditions;
9
+ const utils_1 = require("@medusajs/framework/utils");
10
+ exports.COUPON_PURCHASE_CONDITION_ATTRIBUTES = [
11
+ "customer.groups.id",
12
+ "region.id",
13
+ "shipping_address.country_code",
14
+ "sales_channel_id",
15
+ "currency_code",
16
+ ];
17
+ exports.COUPON_PURCHASE_CONDITION_OPERATORS = [
18
+ "in",
19
+ "eq",
20
+ "ne",
21
+ ];
22
+ const ATTRIBUTE_SET = new Set(exports.COUPON_PURCHASE_CONDITION_ATTRIBUTES);
23
+ const OPERATOR_SET = new Set(exports.COUPON_PURCHASE_CONDITION_OPERATORS);
24
+ function invalid(message) {
25
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, message);
26
+ }
27
+ function normalizeConditionValue(attribute, value) {
28
+ const normalized = String(value ?? "").trim();
29
+ if (!normalized)
30
+ return "";
31
+ return attribute === "currency_code" ||
32
+ attribute === "shipping_address.country_code"
33
+ ? normalized.toLowerCase()
34
+ : normalized;
35
+ }
36
+ function normalizePurchaseConditions(input) {
37
+ if (input == null)
38
+ return [];
39
+ if (!Array.isArray(input)) {
40
+ return invalid("purchase_conditions must be an array");
41
+ }
42
+ const seen = new Set();
43
+ return input.map((raw, index) => {
44
+ const attribute = raw?.attribute;
45
+ const operator = raw?.operator;
46
+ if (!ATTRIBUTE_SET.has(attribute)) {
47
+ return invalid(`purchase_conditions[${index}].attribute is not supported`);
48
+ }
49
+ if (!OPERATOR_SET.has(operator)) {
50
+ return invalid(`purchase_conditions[${index}].operator is not supported`);
51
+ }
52
+ if (seen.has(attribute)) {
53
+ return invalid(`purchase condition attribute ${attribute} cannot be duplicated`);
54
+ }
55
+ seen.add(attribute);
56
+ if (!Array.isArray(raw.values)) {
57
+ return invalid(`purchase_conditions[${index}].values must be an array`);
58
+ }
59
+ const values = Array.from(new Set(raw.values
60
+ .map((value) => normalizeConditionValue(attribute, value))
61
+ .filter(Boolean)));
62
+ if (!values.length) {
63
+ return invalid(`purchase_conditions[${index}].values cannot be empty`);
64
+ }
65
+ if (operator === "eq" && values.length !== 1) {
66
+ return invalid("Equals purchase conditions require exactly one value");
67
+ }
68
+ return { attribute, operator, values };
69
+ });
70
+ }
71
+ function findPurchaseCondition(conditions, attribute) {
72
+ return (conditions || []).find((condition) => condition.attribute === attribute);
73
+ }
74
+ function resolveEffectiveConditionValues(condition, supportedValues) {
75
+ const supported = Array.from(new Set(supportedValues.filter(Boolean)));
76
+ if (!condition)
77
+ return supported;
78
+ const selected = new Set(condition.values);
79
+ if (condition.operator === "ne") {
80
+ return supported.filter((value) => !selected.has(value));
81
+ }
82
+ return supported.filter((value) => selected.has(value));
83
+ }
84
+ function buildCouponPurchaseContext(value) {
85
+ return {
86
+ customer_group_ids: Array.from(new Set((value.customer?.groups || [])
87
+ .map((group) => group?.id)
88
+ .filter(Boolean))),
89
+ region_id: value.region_id || value.region?.id || null,
90
+ country_code: value.shipping_address?.country_code
91
+ ? String(value.shipping_address.country_code).toLowerCase()
92
+ : null,
93
+ sales_channel_id: value.sales_channel_id || value.sales_channel?.id || null,
94
+ currency_code: value.currency_code
95
+ ? String(value.currency_code).toLowerCase()
96
+ : null,
97
+ };
98
+ }
99
+ function evaluateCouponPurchaseConditions(conditions, context, options = {}) {
100
+ const failed = new Set();
101
+ const deferred = new Set();
102
+ for (const condition of normalizePurchaseConditions(conditions || [])) {
103
+ const actual = condition.attribute === "customer.groups.id"
104
+ ? context.customer_group_ids
105
+ : condition.attribute === "region.id"
106
+ ? context.region_id
107
+ : condition.attribute === "shipping_address.country_code"
108
+ ? context.country_code
109
+ : condition.attribute === "sales_channel_id"
110
+ ? context.sales_channel_id
111
+ : context.currency_code;
112
+ if (condition.attribute === "shipping_address.country_code" &&
113
+ !actual &&
114
+ options.defer_missing_country) {
115
+ deferred.add(condition.attribute);
116
+ continue;
117
+ }
118
+ if (condition.attribute !== "customer.groups.id" && !actual) {
119
+ failed.add(condition.attribute);
120
+ continue;
121
+ }
122
+ const actualValues = Array.isArray(actual)
123
+ ? actual.filter(Boolean)
124
+ : actual
125
+ ? [actual]
126
+ : [];
127
+ const overlaps = actualValues.some((value) => condition.values.includes(value));
128
+ const matches = condition.operator === "ne" ? !overlaps : overlaps;
129
+ if (!matches)
130
+ failed.add(condition.attribute);
131
+ }
132
+ return {
133
+ eligible: failed.size === 0,
134
+ failed_attributes: Array.from(failed),
135
+ deferred_attributes: Array.from(deferred),
136
+ };
137
+ }
138
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVyY2hhc2UtY29uZGl0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2NvdXBvbi9wdXJjaGFzZS1jb25kaXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTJDQSxrRUEwQ0M7QUFFRCxzREFLQztBQUVELDBFQWFDO0FBRUQsZ0VBcUJDO0FBUUQsNEVBbURDO0FBN0xELHFEQUF1RDtBQVMxQyxRQUFBLG9DQUFvQyxHQUFHO0lBQ2xELG9CQUFvQjtJQUNwQixXQUFXO0lBQ1gsK0JBQStCO0lBQy9CLGtCQUFrQjtJQUNsQixlQUFlO0NBQytDLENBQUE7QUFFbkQsUUFBQSxtQ0FBbUMsR0FBRztJQUNqRCxJQUFJO0lBQ0osSUFBSTtJQUNKLElBQUk7Q0FDeUQsQ0FBQTtBQUUvRCxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsQ0FBUyw0Q0FBb0MsQ0FBQyxDQUFBO0FBQzNFLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxDQUFTLDJDQUFtQyxDQUFDLENBQUE7QUFFekUsU0FBUyxPQUFPLENBQUMsT0FBZTtJQUM5QixNQUFNLElBQUksbUJBQVcsQ0FBQyxtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUE7QUFDaEUsQ0FBQztBQUVELFNBQVMsdUJBQXVCLENBQzlCLFNBQTJDLEVBQzNDLEtBQWM7SUFFZCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFBO0lBQzdDLElBQUksQ0FBQyxVQUFVO1FBQUUsT0FBTyxFQUFFLENBQUE7SUFFMUIsT0FBTyxTQUFTLEtBQUssZUFBZTtRQUNsQyxTQUFTLEtBQUssK0JBQStCO1FBQzdDLENBQUMsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFO1FBQzFCLENBQUMsQ0FBQyxVQUFVLENBQUE7QUFDaEIsQ0FBQztBQUVELFNBQWdCLDJCQUEyQixDQUN6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