@lodashventure/medusa-campaign 1.1.4 → 1.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/.medusa/server/src/api/admin/buy-x-get-y/[id]/route.js +116 -0
  2. package/.medusa/server/src/api/admin/buy-x-get-y/route.js +83 -0
  3. package/.medusa/server/src/api/admin/campaigns/fix-dates/route.js +103 -0
  4. package/.medusa/server/src/api/admin/campaigns/sync/route.js +138 -0
  5. package/.medusa/server/src/api/admin/flash-sales/[id]/route.js +49 -34
  6. package/.medusa/server/src/api/admin/flash-sales/route.js +46 -19
  7. package/.medusa/server/src/api/admin/force-fix/route.js +176 -0
  8. package/.medusa/server/src/api/admin/test-campaign/route.js +132 -0
  9. package/.medusa/server/src/api/store/buy-x-get-y/[id]/route.js +109 -0
  10. package/.medusa/server/src/api/store/buy-x-get-y/products/[productId]/route.js +94 -0
  11. package/.medusa/server/src/api/store/buy-x-get-y/route.js +114 -0
  12. package/.medusa/server/src/api/store/campaigns/[id]/route.js +132 -70
  13. package/.medusa/server/src/api/store/campaigns/route.js +119 -26
  14. package/.medusa/server/src/index.js +15 -0
  15. package/.medusa/server/src/modules/custom-campaigns/migrations/Migration20251018000000.js +40 -0
  16. package/.medusa/server/src/modules/custom-campaigns/models/buy-x-get-y-config.js +20 -0
  17. package/.medusa/server/src/modules/custom-campaigns/service.js +3 -1
  18. package/.medusa/server/src/modules/custom-campaigns/types/campaign-type.enum.js +2 -1
  19. package/.medusa/server/src/subscribers/cart-updated.js +23 -0
  20. package/.medusa/server/src/subscribers/order-placed.js +9 -2
  21. package/.medusa/server/src/workflows/buy-x-get-y/applyBuyXGetYToCartWorkflow.js +150 -0
  22. package/.medusa/server/src/workflows/custom-campaign/createBuyXGetYCampaignWorkflow.js +127 -0
  23. package/.medusa/server/src/workflows/custom-campaign/updateBuyXGetYCampaignWorkflow.js +114 -0
  24. package/.medusa/server/src/workflows/custom-campaign/updateBuyXGetYUsageWorkflow.js +51 -0
  25. package/package.json +2 -2
  26. package/src/admin/components/BuyXGetYForm.tsx +422 -0
  27. package/src/api/admin/buy-x-get-y/[id]/route.ts +164 -0
  28. package/src/api/admin/buy-x-get-y/route.ts +104 -0
  29. package/src/api/admin/campaigns/fix-dates/route.ts +107 -0
  30. package/src/api/admin/campaigns/sync/route.ts +153 -0
  31. package/src/api/admin/flash-sales/[id]/route.ts +62 -36
  32. package/src/api/admin/flash-sales/route.ts +57 -21
  33. package/src/api/admin/force-fix/route.ts +184 -0
  34. package/src/api/admin/test-campaign/route.ts +141 -0
  35. package/src/api/store/buy-x-get-y/[id]/route.ts +146 -0
  36. package/src/api/store/buy-x-get-y/products/[productId]/route.ts +129 -0
  37. package/src/api/store/buy-x-get-y/route.ts +134 -0
  38. package/src/api/store/campaigns/[id]/route.ts +159 -79
  39. package/src/api/store/campaigns/route.ts +141 -30
  40. package/src/index.ts +10 -0
  41. package/src/modules/custom-campaigns/migrations/Migration20251018000000.ts +42 -0
  42. package/src/modules/custom-campaigns/models/buy-x-get-y-config.ts +19 -0
  43. package/src/modules/custom-campaigns/service.ts +2 -0
  44. package/src/modules/custom-campaigns/types/campaign-type.enum.ts +1 -0
  45. package/src/subscribers/cart-updated.ts +23 -0
  46. package/src/subscribers/order-placed.ts +9 -1
  47. package/src/workflows/buy-x-get-y/applyBuyXGetYToCartWorkflow.ts +222 -0
  48. package/src/workflows/custom-campaign/createBuyXGetYCampaignWorkflow.ts +210 -0
  49. package/src/workflows/custom-campaign/updateBuyXGetYCampaignWorkflow.ts +190 -0
  50. package/src/workflows/custom-campaign/updateBuyXGetYUsageWorkflow.ts +86 -0
@@ -6,10 +6,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const utils_1 = require("@medusajs/framework/utils");
7
7
  const custom_campaign_type_1 = __importDefault(require("./models/custom-campaign-type"));
8
8
  const promotion_usage_limit_1 = __importDefault(require("./models/promotion-usage-limit"));
9
+ const buy_x_get_y_config_1 = __importDefault(require("./models/buy-x-get-y-config"));
9
10
  class CustomCampaignModuleService extends (0, utils_1.MedusaService)({
10
11
  CustomCampaignType: custom_campaign_type_1.default,
11
12
  PromotionUsageLimit: promotion_usage_limit_1.default,
13
+ BuyXGetYConfig: buy_x_get_y_config_1.default,
12
14
  }) {
13
15
  }
14
16
  exports.default = CustomCampaignModuleService;
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2N1c3RvbS1jYW1wYWlnbnMvc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFEQUEwRDtBQUMxRCx5RkFBK0Q7QUFDL0QsMkZBQWlFO0FBRWpFLE1BQU0sMkJBQTRCLFNBQVEsSUFBQSxxQkFBYSxFQUFDO0lBQ3RELGtCQUFrQixFQUFsQiw4QkFBa0I7SUFDbEIsbUJBQW1CLEVBQW5CLCtCQUFtQjtDQUNwQixDQUFDO0NBQUc7QUFFTCxrQkFBZSwyQkFBMkIsQ0FBQyJ9
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL2N1c3RvbS1jYW1wYWlnbnMvc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHFEQUEwRDtBQUMxRCx5RkFBK0Q7QUFDL0QsMkZBQWlFO0FBQ2pFLHFGQUF5RDtBQUV6RCxNQUFNLDJCQUE0QixTQUFRLElBQUEscUJBQWEsRUFBQztJQUN0RCxrQkFBa0IsRUFBbEIsOEJBQWtCO0lBQ2xCLG1CQUFtQixFQUFuQiwrQkFBbUI7SUFDbkIsY0FBYyxFQUFkLDRCQUFjO0NBQ2YsQ0FBQztDQUFHO0FBRUwsa0JBQWUsMkJBQTJCLENBQUMifQ==
@@ -4,5 +4,6 @@ exports.CampaignTypeEnum = void 0;
4
4
  var CampaignTypeEnum;
5
5
  (function (CampaignTypeEnum) {
6
6
  CampaignTypeEnum["FlashSale"] = "flash-sale";
7
+ CampaignTypeEnum["BuyXGetY"] = "buy-x-get-y";
7
8
  })(CampaignTypeEnum || (exports.CampaignTypeEnum = CampaignTypeEnum = {}));
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FtcGFpZ24tdHlwZS5lbnVtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvY3VzdG9tLWNhbXBhaWducy90eXBlcy9jYW1wYWlnbi10eXBlLmVudW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsSUFBWSxnQkFFWDtBQUZELFdBQVksZ0JBQWdCO0lBQzFCLDRDQUF3QixDQUFBO0FBQzFCLENBQUMsRUFGVyxnQkFBZ0IsZ0NBQWhCLGdCQUFnQixRQUUzQiJ9
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FtcGFpZ24tdHlwZS5lbnVtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvY3VzdG9tLWNhbXBhaWducy90eXBlcy9jYW1wYWlnbi10eXBlLmVudW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsSUFBWSxnQkFHWDtBQUhELFdBQVksZ0JBQWdCO0lBQzFCLDRDQUF3QixDQUFBO0lBQ3hCLDRDQUF3QixDQUFBO0FBQzFCLENBQUMsRUFIVyxnQkFBZ0IsZ0NBQWhCLGdCQUFnQixRQUczQiJ9
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.config = void 0;
4
+ exports.default = handleCartUpdated;
5
+ const applyBuyXGetYToCartWorkflow_1 = require("../workflows/buy-x-get-y/applyBuyXGetYToCartWorkflow");
6
+ async function handleCartUpdated({ event: { data }, }) {
7
+ // Apply Buy X Get Y rules to the cart
8
+ await applyBuyXGetYToCartWorkflow_1.applyBuyXGetYToCartWorkflow.run({
9
+ input: {
10
+ cart_id: data.id,
11
+ },
12
+ });
13
+ }
14
+ exports.config = {
15
+ event: [
16
+ "cart.updated",
17
+ "cart.created",
18
+ "cart-line-item.created",
19
+ "cart-line-item.updated",
20
+ "cart-line-item.deleted",
21
+ ],
22
+ };
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FydC11cGRhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3N1YnNjcmliZXJzL2NhcnQtdXBkYXRlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSxvQ0FTQztBQVhELHNHQUFtRztBQUVwRixLQUFLLFVBQVUsaUJBQWlCLENBQUMsRUFDOUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQ2dCO0lBQy9CLHNDQUFzQztJQUN0QyxNQUFNLHlEQUEyQixDQUFDLEdBQUcsQ0FBQztRQUNwQyxLQUFLLEVBQUU7WUFDTCxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUU7U0FDakI7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRVksUUFBQSxNQUFNLEdBQXFCO0lBQ3RDLEtBQUssRUFBRTtRQUNMLGNBQWM7UUFDZCxjQUFjO1FBQ2Qsd0JBQXdCO1FBQ3hCLHdCQUF3QjtRQUN4Qix3QkFBd0I7S0FDekI7Q0FDRixDQUFDIn0=
@@ -3,15 +3,22 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.config = void 0;
4
4
  exports.default = updatePromotionUsage;
5
5
  const updatePromotionUsageWorkflow_1 = require("../workflows/custom-campaign/updatePromotionUsageWorkflow");
6
+ const updateBuyXGetYUsageWorkflow_1 = require("../workflows/custom-campaign/updateBuyXGetYUsageWorkflow");
6
7
  async function updatePromotionUsage({ event: { data }, }) {
7
- // update promotion usage
8
+ // update promotion usage for flash sales
8
9
  await updatePromotionUsageWorkflow_1.updatePromotionUsageWorkflow.run({
9
10
  input: {
10
11
  order_id: data.id,
11
12
  },
12
13
  });
14
+ // update promotion usage for Buy X Get Y campaigns
15
+ await updateBuyXGetYUsageWorkflow_1.updateBuyXGetYUsageWorkflow.run({
16
+ input: {
17
+ order_id: data.id,
18
+ },
19
+ });
13
20
  }
14
21
  exports.config = {
15
22
  event: `order.placed`,
16
23
  };
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItcGxhY2VkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3N1YnNjcmliZXJzL29yZGVyLXBsYWNlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSx1Q0FTQztBQVhELDRHQUF5RztBQUUxRixLQUFLLFVBQVUsb0JBQW9CLENBQUMsRUFDakQsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQ2dCO0lBQy9CLHlCQUF5QjtJQUN6QixNQUFNLDJEQUE0QixDQUFDLEdBQUcsQ0FBQztRQUNyQyxLQUFLLEVBQUU7WUFDTCxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUU7U0FDbEI7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRVksUUFBQSxNQUFNLEdBQXFCO0lBQ3RDLEtBQUssRUFBRSxjQUFjO0NBQ3RCLENBQUMifQ==
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItcGxhY2VkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3N1YnNjcmliZXJzL29yZGVyLXBsYWNlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFJQSx1Q0FnQkM7QUFuQkQsNEdBQXlHO0FBQ3pHLDBHQUF1RztBQUV4RixLQUFLLFVBQVUsb0JBQW9CLENBQUMsRUFDakQsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQ2dCO0lBQy9CLHlDQUF5QztJQUN6QyxNQUFNLDJEQUE0QixDQUFDLEdBQUcsQ0FBQztRQUNyQyxLQUFLLEVBQUU7WUFDTCxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUU7U0FDbEI7S0FDRixDQUFDLENBQUM7SUFFSCxtREFBbUQ7SUFDbkQsTUFBTSx5REFBMkIsQ0FBQyxHQUFHLENBQUM7UUFDcEMsS0FBSyxFQUFFO1lBQ0wsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFO1NBQ2xCO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVZLFFBQUEsTUFBTSxHQUFxQjtJQUN0QyxLQUFLLEVBQUUsY0FBYztDQUN0QixDQUFDIn0=
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.applyBuyXGetYToCartWorkflow = 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 custom_campaigns_1 = require("../../modules/custom-campaigns");
8
+ const campaign_type_enum_1 = require("../../modules/custom-campaigns/types/campaign-type.enum");
9
+ const applyBuyXGetYToCartStep = (0, workflows_sdk_1.createStep)("apply-buy-x-get-y-to-cart-step", async (data) => {
10
+ const customCampaignModuleService = framework_1.container.resolve(custom_campaigns_1.CUSTOM_CAMPAIGN_MODULE);
11
+ const cartService = framework_1.container.resolve(utils_1.Modules.CART);
12
+ const productService = framework_1.container.resolve(utils_1.Modules.PRODUCT);
13
+ const linkService = framework_1.container.resolve("linkModuleService");
14
+ // Fetch the cart with items
15
+ const cart = await cartService.retrieve(data.cart_id, {
16
+ relations: ["items", "items.variant", "items.product"],
17
+ });
18
+ if (!cart || !cart.items || cart.items.length === 0) {
19
+ return new workflows_sdk_1.StepResponse({ rewardItemsAdded: [] });
20
+ }
21
+ // Get all active Buy X Get Y campaigns
22
+ const now = new Date();
23
+ const campaignTypes = await customCampaignModuleService.listCustomCampaignTypes({
24
+ type: campaign_type_enum_1.CampaignTypeEnum.BuyXGetY,
25
+ });
26
+ if (campaignTypes.length === 0) {
27
+ return new workflows_sdk_1.StepResponse({ rewardItemsAdded: [] });
28
+ }
29
+ // Get campaigns through link service
30
+ const campaignLinks = await linkService.list({
31
+ [custom_campaigns_1.CUSTOM_CAMPAIGN_MODULE]: {
32
+ custom_campaign_type_id: campaignTypes.map((ct) => ct.id),
33
+ },
34
+ });
35
+ const campaignIds = campaignLinks.map((link) => link[utils_1.Modules.PROMOTION].campaign_id);
36
+ const promotionService = framework_1.container.resolve(utils_1.Modules.PROMOTION);
37
+ const campaigns = await promotionService.listCampaigns({
38
+ id: campaignIds,
39
+ });
40
+ // Filter active campaigns
41
+ const activeCampaigns = campaigns.filter((campaign) => new Date(campaign.starts_at) <= now &&
42
+ new Date(campaign.ends_at) >= now);
43
+ if (activeCampaigns.length === 0) {
44
+ return new workflows_sdk_1.StepResponse({ rewardItemsAdded: [] });
45
+ }
46
+ // Get BOGO configurations for active campaigns
47
+ const buyXGetYConfigs = await customCampaignModuleService.listBuyXGetYConfigs({
48
+ campaign_id: activeCampaigns.map((c) => c.id),
49
+ });
50
+ // Remove ALL existing BOGO reward items to recalculate from scratch
51
+ const existingBogoItems = cart.items.filter((item) => item.metadata?.is_bogo_reward === true);
52
+ const removedItemIds = [];
53
+ for (const bogoItem of existingBogoItems) {
54
+ try {
55
+ await cartService.removeLineItems(data.cart_id, [bogoItem.id]);
56
+ removedItemIds.push(bogoItem.id);
57
+ }
58
+ catch (error) {
59
+ console.error(`Failed to remove existing BOGO item:`, error);
60
+ }
61
+ }
62
+ // Group cart items by product (excluding BOGO items which are now removed)
63
+ const cartItemsByProduct = new Map();
64
+ cart.items.forEach((item) => {
65
+ if (item.metadata?.is_bogo_reward)
66
+ return; // Skip BOGO items (should be none now)
67
+ const productId = item.product_id;
68
+ if (!cartItemsByProduct.has(productId)) {
69
+ cartItemsByProduct.set(productId, []);
70
+ }
71
+ cartItemsByProduct.get(productId).push(item);
72
+ });
73
+ const rewardItemsToAdd = [];
74
+ // Check each BOGO configuration
75
+ for (const config of buyXGetYConfigs) {
76
+ // Check if usage limit reached
77
+ if (config.limit && config.used >= config.limit) {
78
+ continue;
79
+ }
80
+ // Get cart items for the trigger product
81
+ const triggerItems = cartItemsByProduct.get(config.trigger_product_id);
82
+ if (!triggerItems || triggerItems.length === 0) {
83
+ continue;
84
+ }
85
+ // Calculate total quantity of trigger product
86
+ const totalTriggerQuantity = triggerItems.reduce((sum, item) => sum + item.quantity, 0);
87
+ // Check if trigger quantity is met
88
+ if (totalTriggerQuantity >= config.trigger_quantity) {
89
+ // Calculate how many times the reward should be given
90
+ const rewardMultiplier = Math.floor(totalTriggerQuantity / config.trigger_quantity);
91
+ const totalRewardQuantity = config.reward_quantity * rewardMultiplier;
92
+ // Get the reward product's default variant
93
+ const rewardProduct = await productService.retrieveProduct(config.reward_product_id, {
94
+ relations: ["variants"],
95
+ });
96
+ if (!rewardProduct.variants || rewardProduct.variants.length === 0) {
97
+ console.warn(`No variants found for reward product ${config.reward_product_id}`);
98
+ continue;
99
+ }
100
+ const defaultVariant = rewardProduct.variants[0];
101
+ rewardItemsToAdd.push({
102
+ product_id: config.reward_product_id,
103
+ variant_id: defaultVariant.id,
104
+ quantity: totalRewardQuantity,
105
+ metadata: {
106
+ is_bogo_reward: true,
107
+ bogo_config_id: config.id,
108
+ reward_type: config.reward_type,
109
+ reward_value: config.reward_value ?? undefined,
110
+ },
111
+ });
112
+ }
113
+ }
114
+ // Add reward items to cart
115
+ const addedItems = [];
116
+ for (const rewardItem of rewardItemsToAdd) {
117
+ try {
118
+ const addedItem = await cartService.addLineItems(data.cart_id, [
119
+ {
120
+ variant_id: rewardItem.variant_id,
121
+ quantity: rewardItem.quantity,
122
+ metadata: rewardItem.metadata,
123
+ },
124
+ ]);
125
+ addedItems.push(addedItem);
126
+ }
127
+ catch (error) {
128
+ console.error(`Failed to add reward item:`, error);
129
+ }
130
+ }
131
+ return new workflows_sdk_1.StepResponse({ rewardItemsAdded: addedItems }, { cart_id: data.cart_id, added_items: addedItems });
132
+ }, async (compensationData) => {
133
+ // Compensation: Remove added reward items if workflow fails
134
+ if (!compensationData || !compensationData.added_items)
135
+ return;
136
+ const cartService = framework_1.container.resolve(utils_1.Modules.CART);
137
+ for (const item of compensationData.added_items) {
138
+ try {
139
+ await cartService.removeLineItems(compensationData.cart_id, [item.id]);
140
+ }
141
+ catch (error) {
142
+ console.error(`Failed to remove reward item during compensation:`, error);
143
+ }
144
+ }
145
+ });
146
+ exports.applyBuyXGetYToCartWorkflow = (0, workflows_sdk_1.createWorkflow)("apply-buy-x-get-y-to-cart", (data) => {
147
+ const result = applyBuyXGetYToCartStep(data);
148
+ return new workflows_sdk_1.WorkflowResponse(result);
149
+ });
150
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbHlCdXlYR2V0WVRvQ2FydFdvcmtmbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9idXkteC1nZXQteS9hcHBseUJ1eVhHZXRZVG9DYXJ0V29ya2Zsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQWdEO0FBQ2hELHFEQUFvRDtBQUNwRCxxRUFLMkM7QUFDM0MscUVBQXdFO0FBRXhFLGdHQUEyRjtBQWtCM0YsTUFBTSx1QkFBdUIsR0FBRyxJQUFBLDBCQUFVLEVBQ3hDLGdDQUFnQyxFQUNoQyxLQUFLLEVBQUUsSUFBd0IsRUFBRSxFQUFFO0lBQ2pDLE1BQU0sMkJBQTJCLEdBQy9CLHFCQUFTLENBQUMsT0FBTyxDQUE4Qix5Q0FBc0IsQ0FBQyxDQUFDO0lBQ3pFLE1BQU0sV0FBVyxHQUFHLHFCQUFTLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwRCxNQUFNLGNBQWMsR0FBRyxxQkFBUyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUQsTUFBTSxXQUFXLEdBQUcscUJBQVMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUUzRCw0QkFBNEI7SUFDNUIsTUFBTSxJQUFJLEdBQUcsTUFBTSxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7UUFDcEQsU0FBUyxFQUFFLENBQUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxlQUFlLENBQUM7S0FDdkQsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDcEQsT0FBTyxJQUFJLDRCQUFZLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFF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
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createBuyXGetYCampaignWorkflow = 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 createBuyXGetYCampaignStep = (0, workflows_sdk_1.createStep)("create-buy-x-get-y-campaign-step", async (data) => {
10
+ const link = framework_1.container.resolve(utils_1.ContainerRegistrationKeys.LINK);
11
+ const customCampaignModuleService = framework_1.container.resolve(custom_campaigns_1.CUSTOM_CAMPAIGN_MODULE);
12
+ const campaignIdentifier = `${data.type}-${Date.now()}`;
13
+ let campaign;
14
+ let promotions;
15
+ let customCampaignType;
16
+ let buyXGetYConfigs;
17
+ // Create campaign
18
+ const { result: [_campaign], } = await core_flows_1.createCampaignsWorkflow.run({
19
+ input: {
20
+ campaignsData: [
21
+ {
22
+ name: data.name,
23
+ campaign_identifier: campaignIdentifier,
24
+ description: data.description,
25
+ starts_at: new Date(data.starts_at),
26
+ ends_at: new Date(data.ends_at),
27
+ },
28
+ ],
29
+ },
30
+ });
31
+ campaign = _campaign;
32
+ try {
33
+ // Create promotions for each BOGO rule
34
+ // Store BOGO configuration in promotion code for easy lookup
35
+ const { result: _promotions } = await core_flows_1.createPromotionsWorkflow.run({
36
+ input: {
37
+ promotionsData: data.rules.map((rule) => ({
38
+ code: `${campaignIdentifier}-${rule.triggerProduct.id}-${rule.rewardProduct.id}`,
39
+ type: "buyget",
40
+ status: "active",
41
+ is_automatic: true,
42
+ campaign_id: campaign.id,
43
+ application_method: {
44
+ target_type: "items",
45
+ allocation: "each",
46
+ type: rule.rewardType === "percentage" ? "percentage" : "fixed",
47
+ value: rule.rewardType === "free" ? 0 : (rule.rewardValue ?? 0),
48
+ buy_rules_min_quantity: rule.triggerQuantity,
49
+ apply_to_quantity: rule.rewardQuantity,
50
+ target_rules: [
51
+ {
52
+ attribute: "items.product.id",
53
+ operator: "eq",
54
+ values: [rule.triggerProduct.id],
55
+ },
56
+ ],
57
+ },
58
+ })),
59
+ },
60
+ });
61
+ promotions = _promotions;
62
+ // Create custom campaign type
63
+ customCampaignType =
64
+ await customCampaignModuleService.createCustomCampaignTypes({
65
+ campaign_id: campaign.id,
66
+ type: data.type,
67
+ });
68
+ // Create Buy X Get Y configurations
69
+ buyXGetYConfigs =
70
+ await customCampaignModuleService.createBuyXGetYConfigs(data.rules.map((rule, index) => ({
71
+ campaign_id: campaign.id,
72
+ promotion_id: promotions[index].id,
73
+ trigger_product_id: rule.triggerProduct.id,
74
+ trigger_quantity: rule.triggerQuantity,
75
+ reward_product_id: rule.rewardProduct.id,
76
+ reward_quantity: rule.rewardQuantity,
77
+ reward_type: rule.rewardType,
78
+ reward_value: rule.rewardValue ?? null,
79
+ limit: rule.limit ?? null,
80
+ used: 0,
81
+ })));
82
+ // Link campaign type
83
+ await link.create([
84
+ {
85
+ [utils_1.Modules.PROMOTION]: {
86
+ campaign_id: campaign.id,
87
+ },
88
+ [custom_campaigns_1.CUSTOM_CAMPAIGN_MODULE]: {
89
+ custom_campaign_type_id: customCampaignType.id,
90
+ },
91
+ },
92
+ ]);
93
+ return new workflows_sdk_1.StepResponse({
94
+ campaign,
95
+ promotions,
96
+ buyXGetYConfigs,
97
+ });
98
+ }
99
+ catch (error) {
100
+ console.log({ error });
101
+ // Cleanup on error
102
+ await core_flows_1.deleteCampaignsWorkflow.run({
103
+ input: {
104
+ ids: campaign.id,
105
+ },
106
+ });
107
+ if (promotions) {
108
+ await core_flows_1.deletePromotionsWorkflow.run({
109
+ input: {
110
+ ids: promotions.map((promotion) => promotion.id),
111
+ },
112
+ });
113
+ }
114
+ if (customCampaignType) {
115
+ await customCampaignModuleService.deleteCustomCampaignTypes(customCampaignType.id);
116
+ }
117
+ if (buyXGetYConfigs) {
118
+ await customCampaignModuleService.deleteBuyXGetYConfigs(buyXGetYConfigs.map((config) => config.id));
119
+ }
120
+ throw error;
121
+ }
122
+ });
123
+ exports.createBuyXGetYCampaignWorkflow = (0, workflows_sdk_1.createWorkflow)("create-buy-x-get-y-campaign", (data) => {
124
+ const campaign = createBuyXGetYCampaignStep(data);
125
+ return new workflows_sdk_1.WorkflowResponse(campaign);
126
+ });
127
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlQnV5WEdldFlDYW1wYWlnbldvcmtmbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9jdXN0b20tY2FtcGFpZ24vY3JlYXRlQnV5WEdldFlDYW1wYWlnbldvcmtmbG93LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQUFnRDtBQU9oRCxxREFJbUM7QUFDbkMscUVBSzJDO0FBQzNDLDREQUtxQztBQUNyQyxxRUFBd0U7QUE2QnhFLE1BQU0sMEJBQTBCLEdBQUcsSUFBQSwwQkFBVSxFQUMzQyxrQ0FBa0MsRUFDbEMsS0FBSyxFQUFFLElBQXNCLEVBQUUsRUFBRTtJQUMvQixNQUFNLElBQUksR0FBRyxxQkFBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvRCxNQUFNLDJCQUEyQixHQUMvQixxQkFBUyxDQUFDLE9BQU8sQ0FBOEIseUNBQXNCLENBQUMsQ0FBQztJQUN6RSxNQUFNLGtCQUFrQixHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQztJQUV4RCxJQUFJLFFBQWlDLENBQUM7SUFDdEMsSUFBSSxVQUFzQyxDQUFDO0lBQzNDLElBQUksa0JBSVMsQ0FBQztJQUNkLElBQUksZUFJUyxDQUFDO0lBRWQsa0JBQWtCO0lBQ2xCLE1BQU0sRUFDSixNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FDcEIsR0FBRyxNQUFNLG9DQUF1QixDQUFDLEdBQUcsQ0FBQztRQUNwQyxLQUFLLEVBQUU7WUFDTCxhQUFhLEVBQUU7Z0JBQ2I7b0JBQ0UsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO29CQUNmLG1CQUFtQixFQUFFLGtCQUFrQjtvQkFDdkMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO29CQUM3QixTQUFTLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztv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
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.updateBuyXGetYCampaignWorkflow = 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 updateBuyXGetYCampaignStep = (0, workflows_sdk_1.createStep)("update-buy-x-get-y-campaign-step", async (data) => {
10
+ const campaign_id = data.id;
11
+ const customCampaignModuleService = framework_1.container.resolve(custom_campaigns_1.CUSTOM_CAMPAIGN_MODULE);
12
+ const promotionService = framework_1.container.resolve(utils_1.Modules.PROMOTION);
13
+ if (!campaign_id) {
14
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Campaign ID is required");
15
+ }
16
+ // Fetch the existing campaign
17
+ const campaign = await promotionService.retrieveCampaign(campaign_id);
18
+ // Fetch existing Buy X Get Y configurations
19
+ const existingConfigs = await customCampaignModuleService.listBuyXGetYConfigs({
20
+ campaign_id: campaign_id,
21
+ });
22
+ // Create maps for existing configs
23
+ const existingConfigMapByKey = new Map(existingConfigs.map((config) => [
24
+ `${config.trigger_product_id}-${config.reward_product_id}`,
25
+ config,
26
+ ]));
27
+ const rulesToCreate = data.rules.filter((rule) => !existingConfigMapByKey.has(`${rule.triggerProduct.id}-${rule.rewardProduct.id}`));
28
+ const rulesToUpdate = data.rules.filter((rule) => existingConfigMapByKey.has(`${rule.triggerProduct.id}-${rule.rewardProduct.id}`));
29
+ const inputRuleKeySet = new Set(data.rules.map((rule) => `${rule.triggerProduct.id}-${rule.rewardProduct.id}`));
30
+ const configsToDelete = existingConfigs.filter((config) => !inputRuleKeySet.has(`${config.trigger_product_id}-${config.reward_product_id}`));
31
+ // 1. Update campaign details
32
+ await core_flows_1.updateCampaignsWorkflow.run({
33
+ input: {
34
+ campaignsData: [
35
+ {
36
+ id: campaign_id,
37
+ name: data.name,
38
+ description: data.description,
39
+ starts_at: new Date(data.starts_at),
40
+ ends_at: new Date(data.ends_at),
41
+ },
42
+ ],
43
+ },
44
+ });
45
+ // 2. Update existing rules
46
+ await customCampaignModuleService.updateBuyXGetYConfigs(rulesToUpdate.map((rule) => {
47
+ const key = `${rule.triggerProduct.id}-${rule.rewardProduct.id}`;
48
+ const config = existingConfigMapByKey.get(key);
49
+ return {
50
+ id: config?.id ?? "",
51
+ trigger_quantity: rule.triggerQuantity,
52
+ reward_quantity: rule.rewardQuantity,
53
+ reward_type: rule.rewardType,
54
+ reward_value: rule.rewardValue ?? null,
55
+ limit: rule.limit ?? null,
56
+ };
57
+ }));
58
+ // 3. Delete old configurations and their promotions
59
+ if (configsToDelete.length > 0) {
60
+ await core_flows_1.deletePromotionsWorkflow.run({
61
+ input: {
62
+ ids: configsToDelete.map((config) => config.promotion_id),
63
+ },
64
+ });
65
+ await customCampaignModuleService.softDeleteBuyXGetYConfigs(configsToDelete.map((config) => config.id));
66
+ }
67
+ // 4. Create new rules
68
+ if (rulesToCreate.length > 0) {
69
+ const { result: createdPromotions } = await core_flows_1.createPromotionsWorkflow.run({
70
+ input: {
71
+ promotionsData: rulesToCreate.map((rule) => ({
72
+ code: `${campaign.campaign_identifier}-${rule.triggerProduct.id}-${rule.rewardProduct.id}`,
73
+ type: "buyget",
74
+ status: "active",
75
+ is_automatic: true,
76
+ campaign_id: campaign_id,
77
+ application_method: {
78
+ target_type: "items",
79
+ allocation: "each",
80
+ type: rule.rewardType === "percentage" ? "percentage" : "fixed",
81
+ value: rule.rewardType === "free" ? 0 : (rule.rewardValue ?? 0),
82
+ buy_rules_min_quantity: rule.triggerQuantity,
83
+ apply_to_quantity: rule.rewardQuantity,
84
+ target_rules: [
85
+ {
86
+ attribute: "items.product.id",
87
+ operator: "eq",
88
+ values: [rule.triggerProduct.id],
89
+ },
90
+ ],
91
+ },
92
+ })),
93
+ },
94
+ });
95
+ await customCampaignModuleService.createBuyXGetYConfigs(rulesToCreate.map((rule, index) => ({
96
+ campaign_id: campaign.id,
97
+ promotion_id: createdPromotions[index].id,
98
+ trigger_product_id: rule.triggerProduct.id,
99
+ trigger_quantity: rule.triggerQuantity,
100
+ reward_product_id: rule.rewardProduct.id,
101
+ reward_quantity: rule.rewardQuantity,
102
+ reward_type: rule.rewardType,
103
+ reward_value: rule.rewardValue ?? null,
104
+ limit: rule.limit ?? null,
105
+ used: 0,
106
+ })));
107
+ }
108
+ return new workflows_sdk_1.StepResponse();
109
+ });
110
+ exports.updateBuyXGetYCampaignWorkflow = (0, workflows_sdk_1.createWorkflow)("update-buy-x-get-y-campaign", (data) => {
111
+ const updatedCampaign = updateBuyXGetYCampaignStep(data);
112
+ return new workflows_sdk_1.WorkflowResponse(updatedCampaign);
113
+ });
114
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlQnV5WEdldFlDYW1wYWlnbldvcmtmbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9jdXN0b20tY2FtcGFpZ24vdXBkYXRlQnV5WEdldFlDYW1wYWlnbldvcmtmbG93LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQUFnRDtBQU9oRCxxREFBaUU7QUFDakUscUVBSzJDO0FBQzNDLDREQUlxQztBQUNyQyxxRUFBd0U7QUFReEUsTUFBTSwwQkFBMEIsR0FBRyxJQUFBLDBCQUFVLEVBQzNDLGtDQUFrQyxFQUNsQyxLQUFLLEVBQUUsSUFBeUIsRUFBRSxFQUFFO0lBQ2xDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7SUFFNUIsTUFBTSwyQkFBMkIsR0FDL0IscUJBQVMsQ0FBQyxPQUFPLENBQThCLHlDQUFzQixDQUFDLENBQUM7SUFDekUsTUFBTSxnQkFBZ0IsR0FBRyxxQkFBUyxDQUFDLE9BQU8sQ0FBQyxlQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFOUQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2pCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLHlCQUF5QixDQUMxQixDQUFDO0lBQ0osQ0FBQztJQUVELDhCQUE4QjtJQUM5QixNQUFNLFFBQVEsR0FBRyxNQUFNLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRXRFLDRDQUE0QztJQUM1QyxNQUFNLGVBQWUsR0FDbkIsTUFBTSwyQkFBMkIsQ0FBQyxtQkFBbUIsQ0FBQztRQUNwRCxXQUFXLEVBQUUsV0FBVztLQUN6QixDQUFDLENBQUM7SUFFTCxtQ0FBbUM7SUFDbkMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLEdBQUcsQ0FDcEMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7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
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.updateBuyXGetYUsageWorkflow = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const workflows_sdk_1 = require("@medusajs/framework/workflows-sdk");
6
+ const custom_campaigns_1 = require("../../modules/custom-campaigns");
7
+ const updateBuyXGetYUsageStep = (0, workflows_sdk_1.createStep)("update-buy-x-get-y-usage-step", async ({ order_id }, { container }) => {
8
+ const orderService = await container.resolve(utils_1.Modules.ORDER);
9
+ const promotionService = await container.resolve(utils_1.Modules.PROMOTION);
10
+ const customCampaignTypeService = container.resolve(custom_campaigns_1.CUSTOM_CAMPAIGN_MODULE);
11
+ const order = await orderService.retrieveOrder(order_id, {
12
+ relations: ["items"],
13
+ });
14
+ // Find all BOGO reward items in the order
15
+ const bogoRewardItems = order.items?.filter((item) => item.metadata?.is_bogo_reward === true);
16
+ if (!bogoRewardItems || bogoRewardItems.length === 0) {
17
+ return; // No BOGO items in this order
18
+ }
19
+ // Extract BOGO config IDs from reward items
20
+ const bogoConfigIds = Array.from(new Set(bogoRewardItems
21
+ .map((item) => item.metadata?.bogo_config_id)
22
+ .filter(Boolean)));
23
+ if (bogoConfigIds.length === 0) {
24
+ return;
25
+ }
26
+ // Get the BOGO configurations
27
+ const buyXGetYConfigs = await customCampaignTypeService.listBuyXGetYConfigs({
28
+ id: bogoConfigIds,
29
+ });
30
+ // Update usage count for each config
31
+ const updatePayload = buyXGetYConfigs.map((config) => ({
32
+ ...config,
33
+ used: config.used + 1,
34
+ }));
35
+ // Find configs that have reached their limit
36
+ const limitReachedConfigs = updatePayload.filter((config) => config.limit && config.used >= config.limit);
37
+ // Mark promotions as inactive if limit reached
38
+ if (limitReachedConfigs.length > 0) {
39
+ await promotionService.updatePromotions(limitReachedConfigs.map((config) => ({
40
+ id: config.promotion_id,
41
+ status: "inactive",
42
+ })));
43
+ }
44
+ // Update the usage counts
45
+ await customCampaignTypeService.updateBuyXGetYConfigs(updatePayload);
46
+ });
47
+ exports.updateBuyXGetYUsageWorkflow = (0, workflows_sdk_1.createWorkflow)("update-buy-x-get-y-usage", (data) => {
48
+ updateBuyXGetYUsageStep(data);
49
+ return new workflows_sdk_1.WorkflowResponse({ success: true });
50
+ });
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlQnV5WEdldFlVc2FnZVdvcmtmbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3dvcmtmbG93cy9jdXN0b20tY2FtcGFpZ24vdXBkYXRlQnV5WEdldFlVc2FnZVdvcmtmbG93LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFEQUFvRDtBQUNwRCxxRUFJMkM7QUFDM0MscUVBQXdFO0FBT3hFLE1BQU0sdUJBQXVCLEdBQUcsSUFBQSwwQkFBVSxFQUN4QywrQkFBK0IsRUFDL0IsS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUE0QixFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtJQUM5RCxNQUFNLFlBQVksR0FBRyxNQUFNLFNBQVMsQ0FBQyxPQUFPLENBQUMsZUFBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxTQUFTLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwRSxNQUFNLHlCQUF5QixHQUM3QixTQUFTLENBQUMsT0FBTyxDQUE4Qix5Q0FBc0IsQ0FBQyxDQUFDO0lBRXpFLE1BQU0sS0FBSyxHQUFHLE1BQU0sWUFBWSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUU7UUFDdkQsU0FBUyxFQUFFLENBQUMsT0FBTyxDQUFDO0tBQ3JCLENBQUMsQ0FBQztJQUVILDBDQUEwQztJQUMxQyxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FDekMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsY0FBYyxLQUFLLElBQUksQ0FDakQsQ0FBQztJQUVGLElBQUksQ0FBQyxlQUFlLElBQUksZUFBZSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNyRCxPQUFPLENBQUMsOEJBQThCO0lBQ3hDLENBQUM7SUFFRCw0Q0FBNEM7SUFDNUMsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FDOUIsSUFBSSxHQUFHLENBQ0wsZUFBZTtTQUNaLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxjQUF3QixDQUFDO1NBQ3RELE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FDbkIsQ0FDRixDQUFDO0lBRUYsSUFBSSxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQy9CLE9BQU87SUFDVCxDQUFDO0lBRUQsOEJBQThCO0lBQzlCLE1BQU0sZUFBZSxHQUNuQixNQUFNLHlCQUF5QixDQUFDLG1CQUFtQixDQUFDO1FBQ2xELEVBQUUsRUFBRSxhQUFhO0tBQ2xCLENBQUMsQ0FBQztJQUVMLHFDQUFxQztJQUNyQyxNQUFNLGFBQWEsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3JELEdBQUcsTUFBTTtRQUNULElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUM7S0FDdEIsQ0FBQyxDQUFDLENBQUM7SUFFSiw2Q0FBNkM7SUFDN0MsTUFBTSxtQkFBbUIsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUM5QyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQ3hELENBQUM7SUFFRiwrQ0FBK0M7SUFDL0MsSUFBSSxtQkFBbUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FDckMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ25DLEVBQUUsRUFBRSxNQUFNLENBQUMsWUFBWTtZQUN2QixNQUFNLEVBQUUsVUFBVTtTQUNuQixDQUFDLENBQUMsQ0FDSixDQUFDO0lBQ0osQ0FBQztJQUVELDBCQUEwQjtJQUMxQixNQUFNLHlCQUF5QixDQUFDLHFCQUFxQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBQ3ZFLENBQUMsQ0FDRixDQUFDO0FBRVcsUUFBQSwyQkFBMkIsR0FBRyxJQUFBLDhCQUFjLEVBQ3ZELDBCQUEwQixFQUMxQixDQUFDLElBQThCLEVBQUUsRUFBRTtJQUNqQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixPQUFPLElBQUksZ0NBQWdCLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUNqRCxDQUFDLENBQ0YsQ0FBQyJ9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lodashventure/medusa-campaign",
3
- "version": "1.1.4",
3
+ "version": "1.1.6",
4
4
  "description": "A starter for Medusa plugins.",
5
5
  "author": "Medusa (https://medusajs.com)",
6
6
  "license": "MIT",
@@ -81,4 +81,4 @@
81
81
  "dayjs": "^1.11.13",
82
82
  "lodash": "^4.17.21"
83
83
  }
84
- }
84
+ }