@lodashventure/medusa-campaign 1.4.1 → 1.4.3

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 (46) hide show
  1. package/.medusa/server/src/admin/index.js +741 -306
  2. package/.medusa/server/src/admin/index.mjs +742 -307
  3. package/.medusa/server/src/api/admin/buy-x-get-y/[id]/route.js +2 -6
  4. package/.medusa/server/src/api/admin/coupons/[id]/route.js +76 -0
  5. package/.medusa/server/src/api/admin/coupons/route.js +88 -0
  6. package/.medusa/server/src/api/middlewares.js +32 -1
  7. package/.medusa/server/src/api/store/campaigns/route.js +78 -7
  8. package/.medusa/server/src/api/store/coupons/public/route.js +110 -0
  9. package/.medusa/server/src/api/store/customers/me/coupons/route.js +148 -0
  10. package/.medusa/server/src/modules/custom-campaigns/migrations/Migration20251024000000.js +2 -2
  11. package/.medusa/server/src/modules/custom-campaigns/migrations/Migration20251025000000.js +2 -2
  12. package/.medusa/server/src/modules/custom-campaigns/migrations/Migration20251101000000.js +16 -0
  13. package/.medusa/server/src/modules/custom-campaigns/types/campaign-type.enum.js +2 -1
  14. package/.medusa/server/src/workflows/custom-campaign/createCouponCampaignWorkflow.js +105 -0
  15. package/.medusa/server/src/workflows/custom-campaign/updateCouponCampaignWorkflow.js +59 -0
  16. package/.medusa/server/src/workflows/index.js +6 -2
  17. package/package.json +15 -30
  18. package/src/admin/components/BuyXGetYForm.tsx +24 -13
  19. package/src/admin/components/CouponForm.tsx +352 -0
  20. package/src/admin/components/CouponPage.tsx +104 -0
  21. package/src/admin/components/ProductSelector.tsx +22 -11
  22. package/src/admin/hooks/useCouponById.ts +36 -0
  23. package/src/admin/hooks/useCoupons.ts +46 -0
  24. package/src/admin/hooks/useFlashSaleById.ts +36 -10
  25. package/src/admin/hooks/useFlashSales.ts +36 -10
  26. package/src/admin/routes/coupons/[id]/page.tsx +147 -0
  27. package/src/admin/routes/coupons/create/page.tsx +49 -0
  28. package/src/admin/routes/coupons/page.tsx +15 -0
  29. package/src/admin/routes/flash-sales/[id]/page.tsx +2 -11
  30. package/src/admin/routes/flash-sales/create/page.tsx +0 -6
  31. package/src/admin/widgets/campaign-detail-widget.tsx +33 -26
  32. package/src/api/admin/buy-x-get-y/[id]/route.ts +11 -15
  33. package/src/api/admin/coupons/[id]/route.ts +98 -0
  34. package/src/api/admin/coupons/route.ts +109 -0
  35. package/src/api/middlewares.ts +34 -0
  36. package/src/api/store/campaigns/route.ts +107 -24
  37. package/src/api/store/coupons/public/route.ts +165 -0
  38. package/src/api/store/customers/me/coupons/route.ts +244 -0
  39. package/src/modules/custom-campaigns/migrations/Migration20251024000000.ts +1 -1
  40. package/src/modules/custom-campaigns/migrations/Migration20251025000000.ts +1 -1
  41. package/src/modules/custom-campaigns/migrations/Migration20251101000000.ts +21 -0
  42. package/src/modules/custom-campaigns/types/campaign-type.enum.ts +1 -0
  43. package/src/workflows/custom-campaign/createCouponCampaignWorkflow.ts +176 -0
  44. package/src/workflows/custom-campaign/updateCouponCampaignWorkflow.ts +105 -0
  45. package/src/workflows/index.ts +3 -1
  46. package/src/admin/widgets/campaign-stats-widget.tsx +0 -238
@@ -0,0 +1,148 @@
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.POST = exports.GET = exports.collectCouponSchema = void 0;
7
+ const framework_1 = require("@medusajs/framework");
8
+ const utils_1 = require("@medusajs/framework/utils");
9
+ const zod_1 = __importDefault(require("zod"));
10
+ const custom_campaigns_1 = require("../../../../../modules/custom-campaigns");
11
+ const campaign_type_enum_1 = require("../../../../../modules/custom-campaigns/types/campaign-type.enum");
12
+ const PROMOTION_CACHE_MODULE = "promotion_cache";
13
+ const USABLE_PROMO_MODULE = "usable_promotion";
14
+ const resolveOptional = (token) => {
15
+ try {
16
+ return framework_1.container.resolve(token);
17
+ }
18
+ catch {
19
+ return null;
20
+ }
21
+ };
22
+ exports.collectCouponSchema = zod_1.default.object({
23
+ coupon_id: zod_1.default.string().min(1, "coupon_id is required"),
24
+ });
25
+ const GET = async (req, res) => {
26
+ const customerId = req.auth_context.actor_id;
27
+ if (!customerId) {
28
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "Customer must be authenticated");
29
+ }
30
+ const promoCacheService = framework_1.container.resolve(PROMOTION_CACHE_MODULE);
31
+ const customCampaignModuleService = framework_1.container.resolve(custom_campaigns_1.CUSTOM_CAMPAIGN_MODULE);
32
+ const promotionService = framework_1.container.resolve(utils_1.Modules.PROMOTION);
33
+ const cacheKey = `user:${customerId}:promotion:*`;
34
+ const cachedPromotionIds = await promoCacheService.scan(cacheKey);
35
+ if (!cachedPromotionIds.length) {
36
+ return res.status(200).json({
37
+ coupons: [],
38
+ count: 0,
39
+ });
40
+ }
41
+ const promotions = await promotionService.listPromotions({
42
+ id: cachedPromotionIds,
43
+ }, {
44
+ relations: ["campaign", "application_method"],
45
+ });
46
+ const campaignIds = promotions
47
+ .map((promotion) => promotion.campaign_id)
48
+ .filter((id) => Boolean(id));
49
+ const campaignTypes = await customCampaignModuleService.listCustomCampaignTypes({
50
+ campaign_id: campaignIds,
51
+ });
52
+ const couponCampaignIds = new Set(campaignTypes
53
+ .filter((type) => type.type === campaign_type_enum_1.CampaignTypeEnum.Coupon)
54
+ .map((type) => type.campaign_id));
55
+ const campaignDetails = await customCampaignModuleService.listCampaignDetails({
56
+ campaign_id: Array.from(couponCampaignIds),
57
+ });
58
+ const detailMap = new Map(campaignDetails.map((detail) => [detail.campaign_id, detail]));
59
+ const coupons = promotions
60
+ .filter((promotion) => promotion.campaign_id && couponCampaignIds.has(promotion.campaign_id))
61
+ .map((promotion) => {
62
+ const campaign = promotion.campaign;
63
+ return {
64
+ id: promotion.id,
65
+ code: promotion.code,
66
+ name: campaign.name,
67
+ description: campaign.description,
68
+ starts_at: campaign.starts_at,
69
+ ends_at: campaign.ends_at,
70
+ discount_type: promotion.application_method?.type,
71
+ discount_value: promotion.application_method?.value,
72
+ allocation: promotion.application_method?.allocation,
73
+ target_type: promotion.application_method?.target_type,
74
+ currency_code: promotion.application_method?.currency_code,
75
+ campaign_id: campaign.id,
76
+ is_collectable: true,
77
+ is_collected: true,
78
+ detail: detailMap.get(campaign.id) ?? null,
79
+ };
80
+ });
81
+ res.status(200).json({
82
+ coupons,
83
+ count: coupons.length,
84
+ });
85
+ };
86
+ exports.GET = GET;
87
+ const POST = async (req, res) => {
88
+ const body = exports.collectCouponSchema.parse(req.body);
89
+ const customerId = req.auth_context.actor_id;
90
+ if (!customerId) {
91
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "Customer must be authenticated");
92
+ }
93
+ const promotionService = framework_1.container.resolve(utils_1.Modules.PROMOTION);
94
+ const customCampaignModuleService = framework_1.container.resolve(custom_campaigns_1.CUSTOM_CAMPAIGN_MODULE);
95
+ const promoCacheService = framework_1.container.resolve(PROMOTION_CACHE_MODULE);
96
+ const usablePromoService = resolveOptional(USABLE_PROMO_MODULE);
97
+ const promotion = await promotionService.retrievePromotion(body.coupon_id, {
98
+ relations: ["campaign", "application_method"],
99
+ });
100
+ if (!promotion?.campaign_id) {
101
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Coupon promotion not found");
102
+ }
103
+ const [campaignType] = await customCampaignModuleService.listCustomCampaignTypes({
104
+ campaign_id: promotion.campaign_id,
105
+ });
106
+ if (!campaignType || campaignType.type !== campaign_type_enum_1.CampaignTypeEnum.Coupon) {
107
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Promotion is not registered as a coupon");
108
+ }
109
+ if (promotion.is_automatic) {
110
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Automatic promotions cannot be collected");
111
+ }
112
+ if (promotion.status !== "active") {
113
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Promotion is not active");
114
+ }
115
+ if (usablePromoService) {
116
+ const [usable] = await usablePromoService.listUsablePromotions({
117
+ promotion_id: promotion.id,
118
+ });
119
+ if (!usable || !usable.enabled) {
120
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "This coupon is not available for collection");
121
+ }
122
+ }
123
+ const cacheKey = `user:${customerId}:promotion:${promotion.id}`;
124
+ const alreadyCollected = await promoCacheService.exists(cacheKey);
125
+ if (alreadyCollected) {
126
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Coupon already collected");
127
+ }
128
+ await promoCacheService.set(cacheKey, promotion.id);
129
+ res.status(201).json({
130
+ message: "Coupon collected",
131
+ coupon: {
132
+ id: promotion.id,
133
+ code: promotion.code,
134
+ name: promotion.campaign?.name,
135
+ description: promotion.campaign?.description,
136
+ starts_at: promotion.campaign?.starts_at,
137
+ ends_at: promotion.campaign?.ends_at,
138
+ discount_type: promotion.application_method?.type,
139
+ discount_value: promotion.application_method?.value,
140
+ allocation: promotion.application_method?.allocation,
141
+ target_type: promotion.application_method?.target_type,
142
+ currency_code: promotion.application_method?.currency_code,
143
+ campaign_id: promotion.campaign_id,
144
+ },
145
+ });
146
+ };
147
+ exports.POST = POST;
148
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL2N1c3RvbWVycy9tZS9jb3Vwb25zL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1EQUk2QjtBQUM3QixxREFBaUU7QUFDakUsOENBQW9CO0FBQ3BCLDhFQUFpRjtBQUVqRix5R0FBb0c7QUFvQnBHLE1BQU0sc0JBQXNCLEdBQUcsaUJBQWlCLENBQUM7QUFDakQsTUFBTSxtQkFBbUIsR0FBRyxrQkFBa0IsQ0FBQztBQUUvQyxNQUFNLGVBQWUsR0FBRyxDQUFJLEtBQWEsRUFBWSxFQUFFO0lBQ3JELElBQUksQ0FBQztRQUNILE9BQU8scUJBQVMsQ0FBQyxPQUFPLENBQUksS0FBSyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUMsQ0FBQztBQUVXLFFBQUEsbUJBQW1CLEdBQUcsYUFBQyxDQUFDLE1BQU0sQ0FBQztJQUMxQyxTQUFTLEVBQUUsYUFBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsdUJBQXVCLENBQUM7Q0FDdEQsQ0FBQyxDQUFDO0FBRUksTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUN0QixHQUErQixFQUMvQixHQUFtQixFQUNuQixFQUFFO0lBQ0YsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUM7SUFFN0MsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQzdCLGdDQUFnQyxDQUNqQyxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0saUJBQWlCLEdBQ3JCLHFCQUFTLENBQUMsT0FBTyxDQUF3QixzQkFBc0IsQ0FBQyxDQUFDO0lBQ25FLE1BQU0s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
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Migration20251024000000 = void 0;
4
- const migrations_1 = require("@mikro-orm/migrations");
4
+ const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
5
5
  class Migration20251024000000 extends migrations_1.Migration {
6
6
  async up() {
7
7
  // Create campaign_detail table
@@ -50,4 +50,4 @@ class Migration20251024000000 extends migrations_1.Migration {
50
50
  }
51
51
  }
52
52
  exports.Migration20251024000000 = Migration20251024000000;
53
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNTEwMjQwMDAwMDAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9jdXN0b20tY2FtcGFpZ25zL21pZ3JhdGlvbnMvTWlncmF0aW9uMjAyNTEwMjQwMDAwMDAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsc0RBQWtEO0FBRWxELE1BQWEsdUJBQXdCLFNBQVEsc0JBQVM7SUFDM0MsS0FBSyxDQUFDLEVBQUU7UUFDZiwrQkFBK0I7UUFDL0IsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0FvQlgsQ0FBQyxDQUFDO1FBRUgscUNBQXFDO1FBQ3JDLElBQUksQ0FBQyxNQUFNLENBQUM7Ozs7S0FJWCxDQUFDLENBQUM7UUFFSCw4QkFBOEI7UUFDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7OztLQUlYLENBQUMsQ0FBQztRQUVILGlDQUFpQztRQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDOzs7S0FHWCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRVEsS0FBSyxDQUFDLElBQUk7UUFDakIsNkJBQTZCO1FBQzdCLElBQUksQ0FBQyxNQUFNLENBQUMsaURBQWlELENBQUMsQ0FBQztJQUNqRSxDQUFDO0NBQ0Y7QUFsREQsMERBa0RDIn0=
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNTEwMjQwMDAwMDAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9jdXN0b20tY2FtcGFpZ25zL21pZ3JhdGlvbnMvTWlncmF0aW9uMjAyNTEwMjQwMDAwMDAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUVBQXFFO0FBRXJFLE1BQWEsdUJBQXdCLFNBQVEsc0JBQVM7SUFDM0MsS0FBSyxDQUFDLEVBQUU7UUFDZiwrQkFBK0I7UUFDL0IsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0FvQlgsQ0FBQyxDQUFDO1FBRUgscUNBQXFDO1FBQ3JDLElBQUksQ0FBQyxNQUFNLENBQUM7Ozs7S0FJWCxDQUFDLENBQUM7UUFFSCw4QkFBOEI7UUFDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7OztLQUlYLENBQUMsQ0FBQztRQUVILGlDQUFpQztRQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDOzs7S0FHWCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRVEsS0FBSyxDQUFDLElBQUk7UUFDakIsNkJBQTZCO1FBQzdCLElBQUksQ0FBQyxNQUFNLENBQUMsaURBQWlELENBQUMsQ0FBQztJQUNqRSxDQUFDO0NBQ0Y7QUFsREQsMERBa0RDIn0=
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Migration20251025000000 = void 0;
4
- const migrations_1 = require("@mikro-orm/migrations");
4
+ const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
5
5
  class Migration20251025000000 extends migrations_1.Migration {
6
6
  async up() {
7
7
  // Add meta_keywords column to campaign_detail table
@@ -19,4 +19,4 @@ class Migration20251025000000 extends migrations_1.Migration {
19
19
  }
20
20
  }
21
21
  exports.Migration20251025000000 = Migration20251025000000;
22
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNTEwMjUwMDAwMDAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9jdXN0b20tY2FtcGFpZ25zL21pZ3JhdGlvbnMvTWlncmF0aW9uMjAyNTEwMjUwMDAwMDAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsc0RBQWtEO0FBRWxELE1BQWEsdUJBQXdCLFNBQVEsc0JBQVM7SUFDM0MsS0FBSyxDQUFDLEVBQUU7UUFDZixvREFBb0Q7UUFDcEQsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7O0tBR1gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVRLEtBQUssQ0FBQyxJQUFJO1FBQ2pCLHlEQUF5RDtRQUN6RCxJQUFJLENBQUMsTUFBTSxDQUFDOzs7S0FHWCxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFoQkQsMERBZ0JDIn0=
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNTEwMjUwMDAwMDAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9jdXN0b20tY2FtcGFpZ25zL21pZ3JhdGlvbnMvTWlncmF0aW9uMjAyNTEwMjUwMDAwMDAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUVBQXFFO0FBRXJFLE1BQWEsdUJBQXdCLFNBQVEsc0JBQVM7SUFDM0MsS0FBSyxDQUFDLEVBQUU7UUFDZixvREFBb0Q7UUFDcEQsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7O0tBR1gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVRLEtBQUssQ0FBQyxJQUFJO1FBQ2pCLHlEQUF5RDtRQUN6RCxJQUFJLENBQUMsTUFBTSxDQUFDOzs7S0FHWCxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFoQkQsMERBZ0JDIn0=
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20251101000000 = void 0;
4
+ const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
5
+ class Migration20251101000000 extends migrations_1.Migration {
6
+ async up() {
7
+ this.addSql(`alter table if exists "custom_campaign_type" drop constraint if exists "custom_campaign_type_type_check";`);
8
+ this.addSql(`alter table if exists "custom_campaign_type" add constraint "custom_campaign_type_type_check" check ("type" in ('flash-sale', 'buy-x-get-y', 'coupon'));`);
9
+ }
10
+ async down() {
11
+ this.addSql(`alter table if exists "custom_campaign_type" drop constraint if exists "custom_campaign_type_type_check";`);
12
+ this.addSql(`alter table if exists "custom_campaign_type" add constraint "custom_campaign_type_type_check" check ("type" in ('flash-sale', 'buy-x-get-y'));`);
13
+ }
14
+ }
15
+ exports.Migration20251101000000 = Migration20251101000000;
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNTExMDEwMDAwMDAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9jdXN0b20tY2FtcGFpZ25zL21pZ3JhdGlvbnMvTWlncmF0aW9uMjAyNTExMDEwMDAwMDAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUVBQXFFO0FBRXJFLE1BQWEsdUJBQXdCLFNBQVEsc0JBQVM7SUFDM0MsS0FBSyxDQUFDLEVBQUU7UUFDZixJQUFJLENBQUMsTUFBTSxDQUNULDJHQUEyRyxDQUM1RyxDQUFDO1FBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FDVCwwSkFBMEosQ0FDM0osQ0FBQztJQUNKLENBQUM7SUFFUSxLQUFLLENBQUMsSUFBSTtRQUNqQixJQUFJLENBQUMsTUFBTSxDQUNULDJHQUEyRyxDQUM1RyxDQUFDO1FBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FDVCxnSkFBZ0osQ0FDakosQ0FBQztJQUNKLENBQUM7Q0FDRjtBQWxCRCwwREFrQkMifQ==
@@ -5,5 +5,6 @@ var CampaignTypeEnum;
5
5
  (function (CampaignTypeEnum) {
6
6
  CampaignTypeEnum["FlashSale"] = "flash-sale";
7
7
  CampaignTypeEnum["BuyXGetY"] = "buy-x-get-y";
8
+ CampaignTypeEnum["Coupon"] = "coupon";
8
9
  })(CampaignTypeEnum || (exports.CampaignTypeEnum = CampaignTypeEnum = {}));
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FtcGFpZ24tdHlwZS5lbnVtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvY3VzdG9tLWNhbXBhaWducy90eXBlcy9jYW1wYWlnbi10eXBlLmVudW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsSUFBWSxnQkFHWDtBQUhELFdBQVksZ0JBQWdCO0lBQzFCLDRDQUF3QixDQUFBO0lBQ3hCLDRDQUF3QixDQUFBO0FBQzFCLENBQUMsRUFIVyxnQkFBZ0IsZ0NBQWhCLGdCQUFnQixRQUczQiJ9
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FtcGFpZ24tdHlwZS5lbnVtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvY3VzdG9tLWNhbXBhaWducy90eXBlcy9jYW1wYWlnbi10eXBlLmVudW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsSUFBWSxnQkFJWDtBQUpELFdBQVksZ0JBQWdCO0lBQzFCLDRDQUF3QixDQUFBO0lBQ3hCLDRDQUF3QixDQUFBO0lBQ3hCLHFDQUFpQixDQUFBO0FBQ25CLENBQUMsRUFKVyxnQkFBZ0IsZ0NBQWhCLGdCQUFnQixRQUkzQiJ9
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createCouponCampaignWorkflow = void 0;
4
+ const framework_1 = require("@medusajs/framework");
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
7
+ const core_flows_1 = require("@medusajs/medusa/core-flows");
8
+ const custom_campaigns_1 = require("../../modules/custom-campaigns");
9
+ const createCouponCampaignStep = (0, workflows_sdk_1.createStep)("create-coupon-campaign-step", async (input) => {
10
+ if (new Date(input.ends_at) < new Date(input.starts_at)) {
11
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "End date must be after start date");
12
+ }
13
+ if (input.discount_type === "fixed" && !input.currency_code) {
14
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "currency_code is required for fixed discount type");
15
+ }
16
+ const link = framework_1.container.resolve(utils_1.ContainerRegistrationKeys.LINK);
17
+ const customCampaignModuleService = framework_1.container.resolve(custom_campaigns_1.CUSTOM_CAMPAIGN_MODULE);
18
+ const campaignIdentifier = `${input.type}-${Date.now()}`;
19
+ let campaign;
20
+ let promotion;
21
+ let customCampaignType;
22
+ try {
23
+ const { result: [createdCampaign], } = await core_flows_1.createCampaignsWorkflow.run({
24
+ input: {
25
+ campaignsData: [
26
+ {
27
+ name: input.name,
28
+ description: input.description,
29
+ campaign_identifier: campaignIdentifier,
30
+ starts_at: new Date(input.starts_at),
31
+ ends_at: new Date(input.ends_at),
32
+ },
33
+ ],
34
+ },
35
+ });
36
+ campaign = createdCampaign;
37
+ const { result: [createdPromotion], } = await core_flows_1.createPromotionsWorkflow.run({
38
+ input: {
39
+ promotionsData: [
40
+ {
41
+ code: input.code,
42
+ type: "standard",
43
+ status: "active",
44
+ is_automatic: false,
45
+ campaign_id: campaign.id,
46
+ application_method: {
47
+ target_type: input.target_type ?? "order",
48
+ allocation: (input.allocation ?? "across"),
49
+ type: input.discount_type,
50
+ value: input.discount_value,
51
+ currency_code: input.discount_type === "fixed" && input.currency_code
52
+ ? input.currency_code
53
+ : undefined,
54
+ },
55
+ },
56
+ ],
57
+ },
58
+ });
59
+ promotion = createdPromotion;
60
+ customCampaignType =
61
+ await customCampaignModuleService.createCustomCampaignTypes({
62
+ campaign_id: campaign.id,
63
+ type: input.type,
64
+ });
65
+ await link.create([
66
+ {
67
+ [utils_1.Modules.PROMOTION]: {
68
+ campaign_id: campaign.id,
69
+ },
70
+ [custom_campaigns_1.CUSTOM_CAMPAIGN_MODULE]: {
71
+ custom_campaign_type_id: customCampaignType.id,
72
+ },
73
+ },
74
+ ]);
75
+ return new workflows_sdk_1.StepResponse({
76
+ campaign,
77
+ promotion,
78
+ });
79
+ }
80
+ catch (error) {
81
+ if (campaign) {
82
+ await core_flows_1.deleteCampaignsWorkflow.run({
83
+ input: {
84
+ ids: campaign.id,
85
+ },
86
+ });
87
+ }
88
+ if (promotion) {
89
+ await core_flows_1.deletePromotionsWorkflow.run({
90
+ input: {
91
+ ids: promotion.id,
92
+ },
93
+ });
94
+ }
95
+ if (customCampaignType) {
96
+ await customCampaignModuleService.deleteCustomCampaignTypes(customCampaignType.id);
97
+ }
98
+ throw error;
99
+ }
100
+ });
101
+ exports.createCouponCampaignWorkflow = (0, workflows_sdk_1.createWorkflow)("create-coupon-campaign", (input) => {
102
+ const couponCampaign = createCouponCampaignStep(input);
103
+ return new workflows_sdk_1.WorkflowResponse(couponCampaign);
104
+ });
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlQ291cG9uQ2FtcGFpZ25Xb3JrZmxvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3MvY3VzdG9tLWNhbXBhaWduL2NyZWF0ZUNvdXBvbkNhbXBhaWduV29ya2Zsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQWdEO0FBT2hELHFEQUltQztBQUNuQyxxRUFLMkM7QUFDM0MsNERBS3FDO0FBQ3JDLHFFQUF3RTtBQWtCeEUsTUFBTSx3QkFBd0IsR0FBRyxJQUFBLDBCQUFVLEVBQ3pDLDZCQUE2QixFQUM3QixLQUFLLEVBQUUsS0FBZ0MsRUFBRSxFQUFFO0lBQ3pDLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQ3hELE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLG1DQUFtQyxDQUNwQyxDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksS0FBSyxDQUFDLGFBQWEsS0FBSyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDNUQsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsbURBQW1ELENBQ3BELENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcscUJBQVMsQ0FBQyxPQUFPLENBQUMsaUNBQXlCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0QsTUFBTSwyQkFBMkIsR0FDL0IscUJBQVMsQ0FBQyxPQUFPLENBQThCLHlDQUFzQixDQUFDLENBQUM7SUFFekUsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7SUFFekQsSUFBSSxRQUFpQyxD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
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.updateCouponCampaignWorkflow = void 0;
4
+ const framework_1 = require("@medusajs/framework");
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
7
+ const core_flows_1 = require("@medusajs/medusa/core-flows");
8
+ const updateCouponCampaignStep = (0, workflows_sdk_1.createStep)("update-coupon-campaign-step", async (input) => {
9
+ if (new Date(input.ends_at) < new Date(input.starts_at)) {
10
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "End date must be after start date");
11
+ }
12
+ if (input.discount_type === "fixed" && !input.currency_code) {
13
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "currency_code is required for fixed discount type");
14
+ }
15
+ const promotionService = framework_1.container.resolve(utils_1.Modules.PROMOTION);
16
+ const promotions = await promotionService.listPromotions({
17
+ campaign_id: input.id,
18
+ });
19
+ if (!promotions.length) {
20
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, "Coupon promotion not found for campaign");
21
+ }
22
+ const promotion = promotions[0];
23
+ await core_flows_1.updateCampaignsWorkflow.run({
24
+ input: {
25
+ campaignsData: [
26
+ {
27
+ id: input.id,
28
+ name: input.name,
29
+ description: input.description,
30
+ starts_at: new Date(input.starts_at),
31
+ ends_at: new Date(input.ends_at),
32
+ },
33
+ ],
34
+ },
35
+ });
36
+ const updateData = {
37
+ id: promotion.id,
38
+ code: input.code,
39
+ application_method: {
40
+ type: input.discount_type,
41
+ target_type: input.target_type ?? "order",
42
+ allocation: (input.allocation ?? "across"),
43
+ value: input.discount_value,
44
+ currency_code: input.discount_type === "fixed" && input.currency_code
45
+ ? input.currency_code
46
+ : undefined,
47
+ },
48
+ };
49
+ await promotionService.updatePromotions([updateData]);
50
+ return new workflows_sdk_1.StepResponse({
51
+ campaign_id: input.id,
52
+ promotion_id: promotion.id,
53
+ });
54
+ });
55
+ exports.updateCouponCampaignWorkflow = (0, workflows_sdk_1.createWorkflow)("update-coupon-campaign", (input) => {
56
+ const result = updateCouponCampaignStep(input);
57
+ return new workflows_sdk_1.WorkflowResponse(result);
58
+ });
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlQ291cG9uQ2FtcGFpZ25Xb3JrZmxvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy93b3JrZmxvd3MvY3VzdG9tLWNhbXBhaWduL3VwZGF0ZUNvdXBvbkNhbXBhaWduV29ya2Zsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQWdEO0FBS2hELHFEQUFpRTtBQUNqRSxxRUFLMkM7QUFDM0MsNERBQXNFO0FBZ0J0RSxNQUFNLHdCQUF3QixHQUFHLElBQUEsMEJBQVUsRUFDekMsNkJBQTZCLEVBQzdCLEtBQUssRUFBRSxLQUFnQyxFQUFFLEVBQUU7SUFDekMsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDeEQsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsbUNBQW1DLENBQ3BDLENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxLQUFLLENBQUMsYUFBYSxLQUFLLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUM1RCxNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixtREFBbUQsQ0FDcEQsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLGdCQUFnQixHQUFHLHFCQUFTLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUU5RCxNQUFNLFVBQVUsR0FBRyxNQUFNLGdCQUFnQixDQUFDLGNBQWMsQ0FBQztRQUN2RCxXQUFXLEVBQUUsS0FBSyxDQUFDLEVBQUU7S0FDZixDQUFDLENBQUM7SUFFVixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQzNCLHlDQUF5QyxDQUMxQyxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVoQyxNQUFNLG9DQUF1QixDQUFDLEdBQUcsQ0FBQztRQUNoQyxLQUFLLEVBQUU7WUFDTCxhQUFhLEVBQUU7Z0JBQ2I7b0JBQ0UsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFO29CQUNaLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtvQkFDaEIsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO29CQUM5QixTQUFTLEVBQUUsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztvQkFDcEMsT0FBTyxFQUFFLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7aUJBQ0w7YUFDOUI7U0FDRjtLQUNGLENBQUMsQ0FBQztJQUVILE1BQU0sVUFBVSxHQUF1QjtRQUNyQyxFQUFFLEVBQUUsU0FBUyxDQUFDLEVBQUU7UUFDaEIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1FBQ2hCLGtCQUFrQixFQUFFO1lBQ2xCLElBQUksRUFBRSxLQUFLLENBQUMsYUFBYTtZQUN6QixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVcsSUFBSSxPQUFPO1lBQ3pDLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksUUFBUSxDQUFRO1lBQ2pELEtBQUssRUFBRSxLQUFLLENBQUMsY0FBYztZQUMzQixhQUFhLEVBQ1gsS0FBSyxDQUFDLGFBQWEsS0FBSyxPQUFPLElBQUksS0FBSyxDQUFDLGFBQWE7Z0JBQ3BELENBQUMsQ0FBQyxLQUFLLENBQUMsYUFBYTtnQkFDckIsQ0FBQyxDQUFDLFNBQVM7U0FDaEI7S0FDRixDQUFDO0lBRUYsTUFBTSxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFFdEQsT0FBTyxJQUFJLDRCQUFZLENBQUM7UUFDdEIsV0FBVyxFQUFFLEtBQUssQ0FBQyxFQUFFO1FBQ3JCLFlBQVksRUFBRSxTQUFTLENBQUMsRUFBRTtLQUMzQixDQUFDLENBQUM7QUFDTCxDQUFDLENBQ0YsQ0FBQztBQUVXLFFBQUEsNEJBQTRCLEdBQUcsSUFBQSw4QkFBYyxFQUN4RCx3QkFBd0IsRUFDeEIsQ0FBQyxLQUFnQyxFQUFFLEVBQUU7SUFDbkMsTUFBTSxNQUFNLEdBQUcsd0JBQXdCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0MsT0FBTyxJQUFJLGdDQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3RDLENBQUMsQ0FDRixDQUFDIn0=
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.applyBuyXGetYToCartWorkflow = exports.updatePromotionUsageWorkflow = exports.updateCustomFlashSaleWorkflow = exports.createCustomFlashSaleWorkflow = exports.createCustomCampaignWorkflow = void 0;
3
+ exports.updateCouponCampaignWorkflow = exports.createCouponCampaignWorkflow = exports.applyBuyXGetYToCartWorkflow = exports.updatePromotionUsageWorkflow = exports.updateCustomFlashSaleWorkflow = exports.createCustomFlashSaleWorkflow = exports.createCustomCampaignWorkflow = void 0;
4
4
  var createCustomCampaignWorkflow_1 = require("./custom-campaign/createCustomCampaignWorkflow");
5
5
  Object.defineProperty(exports, "createCustomCampaignWorkflow", { enumerable: true, get: function () { return createCustomCampaignWorkflow_1.createCustomCampaignWorkflow; } });
6
6
  Object.defineProperty(exports, "createCustomFlashSaleWorkflow", { enumerable: true, get: function () { return createCustomCampaignWorkflow_1.createCustomCampaignWorkflow; } });
@@ -10,4 +10,8 @@ var updatePromotionUsageWorkflow_1 = require("./custom-campaign/updatePromotionU
10
10
  Object.defineProperty(exports, "updatePromotionUsageWorkflow", { enumerable: true, get: function () { return updatePromotionUsageWorkflow_1.updatePromotionUsageWorkflow; } });
11
11
  var applyBuyXGetYToCartWorkflow_1 = require("./buy-x-get-y/applyBuyXGetYToCartWorkflow");
12
12
  Object.defineProperty(exports, "applyBuyXGetYToCartWorkflow", { enumerable: true, get: function () { return applyBuyXGetYToCartWorkflow_1.applyBuyXGetYToCartWorkflow; } });
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtGQUE2SjtBQUFwSiw0SUFBQSw0QkFBNEIsT0FBQTtBQUFFLDZJQUFBLDRCQUE0QixPQUFpQztBQUNwRyxpR0FBZ0c7QUFBdkYsOElBQUEsNkJBQTZCLE9BQUE7QUFDdEMsK0ZBQThGO0FBQXJGLDRJQUFBLDRCQUE0QixPQUFBO0FBQ3JDLHlGQUF3RjtBQUEvRSwwSUFBQSwyQkFBMkIsT0FBQSJ9
13
+ var createCouponCampaignWorkflow_1 = require("./custom-campaign/createCouponCampaignWorkflow");
14
+ Object.defineProperty(exports, "createCouponCampaignWorkflow", { enumerable: true, get: function () { return createCouponCampaignWorkflow_1.createCouponCampaignWorkflow; } });
15
+ var updateCouponCampaignWorkflow_1 = require("./custom-campaign/updateCouponCampaignWorkflow");
16
+ Object.defineProperty(exports, "updateCouponCampaignWorkflow", { enumerable: true, get: function () { return updateCouponCampaignWorkflow_1.updateCouponCampaignWorkflow; } });
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvd29ya2Zsb3dzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtGQUE2SjtBQUFwSiw0SUFBQSw0QkFBNEIsT0FBQTtBQUFFLDZJQUFBLDRCQUE0QixPQUFpQztBQUNwRyxpR0FBZ0c7QUFBdkYsOElBQUEsNkJBQTZCLE9BQUE7QUFDdEMsK0ZBQThGO0FBQXJGLDRJQUFBLDRCQUE0QixPQUFBO0FBQ3JDLHlGQUF3RjtBQUEvRSwwSUFBQSwyQkFBMkIsT0FBQTtBQUNwQywrRkFBOEY7QUFBckYsNElBQUEsNEJBQTRCLE9BQUE7QUFDckMsK0ZBQThGO0FBQXJGLDRJQUFBLDRCQUE0QixPQUFBIn0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lodashventure/medusa-campaign",
3
- "version": "1.4.1",
3
+ "version": "1.4.3",
4
4
  "description": "A starter for Medusa plugins.",
5
5
  "author": "Medusa (https://medusajs.com)",
6
6
  "license": "MIT",
@@ -30,25 +30,18 @@
30
30
  "prepublishOnly": "medusa plugin:build"
31
31
  },
32
32
  "devDependencies": {
33
- "@medusajs/admin-sdk": "2.11.0",
34
- "@medusajs/cli": "2.11.0",
35
- "@medusajs/framework": "2.11.0",
36
- "@medusajs/icons": "^2.11.0",
37
- "@medusajs/medusa": "2.11.0",
38
- "@medusajs/test-utils": "2.11.0",
33
+ "@medusajs/admin-sdk": "2.11.1",
34
+ "@medusajs/cli": "2.11.1",
35
+ "@medusajs/framework": "2.11.1",
36
+ "@medusajs/icons": "^2.11.1",
37
+ "@medusajs/medusa": "2.11.1",
38
+ "@medusajs/test-utils": "2.11.1",
39
39
  "@medusajs/ui": "^4.0.17",
40
- "@mikro-orm/cli": "6.4.3",
41
- "@mikro-orm/core": "6.4.3",
42
- "@mikro-orm/knex": "6.4.3",
43
- "@mikro-orm/migrations": "6.4.3",
44
- "@mikro-orm/postgresql": "6.4.3",
45
40
  "@swc/core": "1.5.7",
46
41
  "@types/lodash": "^4",
47
42
  "@types/node": "^20.0.0",
48
43
  "@types/react": "^18.3.2",
49
44
  "@types/react-dom": "^18.2.25",
50
- "awilix": "^8.0.1",
51
- "pg": "^8.13.0",
52
45
  "prop-types": "^15.8.1",
53
46
  "react": "^18.2.0",
54
47
  "react-dom": "^18.2.0",
@@ -58,22 +51,14 @@
58
51
  "yalc": "^1.0.0-pre.53"
59
52
  },
60
53
  "peerDependencies": {
61
- "@medusajs/admin-sdk": "2.11.0",
62
- "@medusajs/cli": "2.11.0",
63
- "@medusajs/framework": "2.11.0",
64
- "@medusajs/icons": "^2.11.0",
65
- "@medusajs/js-sdk": "*",
66
- "@medusajs/medusa": "2.11.0",
67
- "@medusajs/test-utils": "2.11.0",
68
- "@medusajs/ui": "^4.0.17",
69
- "@mikro-orm/cli": "6.4.3",
70
- "@mikro-orm/core": "6.4.3",
71
- "@mikro-orm/knex": "6.4.3",
72
- "@mikro-orm/migrations": "6.4.3",
73
- "@mikro-orm/postgresql": "6.4.3",
74
- "@tanstack/react-query": "*",
75
- "awilix": "^8.0.1",
76
- "pg": "^8.13.0"
54
+ "@medusajs/admin-sdk": "2.11.1",
55
+ "@medusajs/cli": "2.11.1",
56
+ "@medusajs/framework": "2.11.1",
57
+ "@medusajs/icons": "^2.11.1",
58
+ "@medusajs/js-sdk": "2.11.1",
59
+ "@medusajs/medusa": "2.11.1",
60
+ "@medusajs/test-utils": "2.11.1",
61
+ "@medusajs/ui": "^4.0.17"
77
62
  },
78
63
  "engines": {
79
64
  "node": ">=20"
@@ -44,13 +44,11 @@ export type BuyXGetYRule = z.infer<typeof buyXGetYRuleSchema>;
44
44
 
45
45
  export const buyXGetYDataSchema = buyXGetYCampaignSchema
46
46
  .extend({
47
- rules: z
48
- .array(buyXGetYRuleSchema)
49
- .min(1, "At least one rule is required"),
47
+ rules: z.array(buyXGetYRuleSchema).min(1, "At least one rule is required"),
50
48
  })
51
49
  .refine(
52
50
  (data) => new Date(data.starts_at) < new Date(data.ends_at),
53
- "End date must be after start date"
51
+ "End date must be after start date",
54
52
  );
55
53
 
56
54
  export type BuyXGetYData = z.infer<typeof buyXGetYDataSchema>;
@@ -94,8 +92,12 @@ export const BuyXGetYForm: FC<BuyXGetYFormProps> = ({
94
92
  name: "rules",
95
93
  });
96
94
 
97
- const [openTriggerProductModal, setOpenTriggerProductModal] = useState<number | null>(null);
98
- const [openRewardProductModal, setOpenRewardProductModal] = useState<number | null>(null);
95
+ const [openTriggerProductModal, setOpenTriggerProductModal] = useState<
96
+ number | null
97
+ >(null);
98
+ const [openRewardProductModal, setOpenRewardProductModal] = useState<
99
+ number | null
100
+ >(null);
99
101
 
100
102
  const startsAt = watch("starts_at");
101
103
  const endsAt = watch("ends_at");
@@ -103,7 +105,7 @@ export const BuyXGetYForm: FC<BuyXGetYFormProps> = ({
103
105
  const handleDateTimeChange = (
104
106
  field: "starts_at" | "ends_at",
105
107
  type: "date" | "time",
106
- value: string
108
+ value: string,
107
109
  ) => {
108
110
  const currentValue = watch(field);
109
111
 
@@ -111,8 +113,8 @@ export const BuyXGetYForm: FC<BuyXGetYFormProps> = ({
111
113
  const time = currentValue
112
114
  ? dayjs(currentValue).format("HH:mm")
113
115
  : field === "starts_at"
114
- ? "00:00"
115
- : "23:59";
116
+ ? "00:00"
117
+ : "23:59";
116
118
  setValue(field, `${value}T${time}`);
117
119
  } else {
118
120
  const date = currentValue
@@ -133,8 +135,11 @@ export const BuyXGetYForm: FC<BuyXGetYFormProps> = ({
133
135
  return value
134
136
  .map((item, index) =>
135
137
  item
136
- ? `Rule ${index + 1}: ${Object.values(item).map(v => v?.message).filter(Boolean).join(", ")}`
137
- : ""
138
+ ? `Rule ${index + 1}: ${Object.values(item)
139
+ .map((v) => v?.message)
140
+ .filter(Boolean)
141
+ .join(", ")}`
142
+ : "",
138
143
  )
139
144
  .filter(Boolean)
140
145
  .join(", ");
@@ -285,7 +290,10 @@ export const BuyXGetYForm: FC<BuyXGetYFormProps> = ({
285
290
  <Table.Cell>
286
291
  <div className="flex flex-col">
287
292
  <Input
288
- value={watch(`rules.${index}.triggerProduct.title`) || "Select product"}
293
+ value={
294
+ watch(`rules.${index}.triggerProduct.title`) ||
295
+ "Select product"
296
+ }
289
297
  onClick={() => setOpenTriggerProductModal(index)}
290
298
  readOnly
291
299
  disabled={disabled}
@@ -317,7 +325,10 @@ export const BuyXGetYForm: FC<BuyXGetYFormProps> = ({
317
325
  <Table.Cell>
318
326
  <div className="flex flex-col">
319
327
  <Input
320
- value={watch(`rules.${index}.rewardProduct.title`) || "Select product"}
328
+ value={
329
+ watch(`rules.${index}.rewardProduct.title`) ||
330
+ "Select product"
331
+ }
321
332
  onClick={() => setOpenRewardProductModal(index)}
322
333
  readOnly
323
334
  disabled={disabled}