order-management 0.0.17 → 0.0.19

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 (48) hide show
  1. package/.medusa/server/src/admin/index.js +644 -11
  2. package/.medusa/server/src/admin/index.mjs +644 -11
  3. package/.medusa/server/src/api/admin/swaps/[id]/approve/route.js +74 -0
  4. package/.medusa/server/src/api/admin/swaps/[id]/process-payment/route.js +152 -0
  5. package/.medusa/server/src/api/admin/swaps/[id]/reject/route.js +43 -0
  6. package/.medusa/server/src/api/admin/swaps/[id]/route.js +70 -0
  7. package/.medusa/server/src/api/admin/swaps/[id]/status/route.js +45 -0
  8. package/.medusa/server/src/api/admin/swaps/[id]/sync/route.js +148 -0
  9. package/.medusa/server/src/api/admin/swaps/route.js +51 -0
  10. package/.medusa/server/src/api/admin/swaps/validators.js +22 -0
  11. package/.medusa/server/src/api/store/guest-orders/[id]/invoice/route.js +17 -5
  12. package/.medusa/server/src/api/store/guest-orders/[id]/returns/route.js +17 -5
  13. package/.medusa/server/src/api/store/guest-orders/[id]/route.js +17 -5
  14. package/.medusa/server/src/api/store/guest-orders/route.js +17 -5
  15. package/.medusa/server/src/api/store/orders/[order_id]/swaps/route.js +107 -0
  16. package/.medusa/server/src/api/store/otp/request/route.js +12 -5
  17. package/.medusa/server/src/api/store/swaps/[id]/cancel/route.js +64 -0
  18. package/.medusa/server/src/api/store/swaps/[id]/route.js +112 -0
  19. package/.medusa/server/src/api/store/swaps/route.js +117 -0
  20. package/.medusa/server/src/helpers/index.js +18 -0
  21. package/.medusa/server/src/helpers/swaps.js +88 -0
  22. package/.medusa/server/src/modules/swap/index.js +13 -0
  23. package/.medusa/server/src/modules/swap/migrations/Migration20260121164326.js +49 -0
  24. package/.medusa/server/src/modules/swap/models/swap.js +21 -0
  25. package/.medusa/server/src/modules/swap/service.js +224 -0
  26. package/.medusa/server/src/services/otp-service.js +16 -5
  27. package/.medusa/server/src/subscribers/send-order-email.js +27 -8
  28. package/.medusa/server/src/workflows/index.js +8 -2
  29. package/.medusa/server/src/workflows/steps/swap/calculate-difference-step.js +56 -0
  30. package/.medusa/server/src/workflows/steps/swap/create-medusa-exchange-step.js +71 -0
  31. package/.medusa/server/src/workflows/steps/swap/create-medusa-return-step.js +79 -0
  32. package/.medusa/server/src/workflows/steps/swap/create-swap-step.js +29 -0
  33. package/.medusa/server/src/workflows/steps/swap/handle-payment-difference-step.js +102 -0
  34. package/.medusa/server/src/workflows/steps/swap/index.js +26 -0
  35. package/.medusa/server/src/workflows/steps/swap/retrieve-swap-step.js +26 -0
  36. package/.medusa/server/src/workflows/steps/swap/sync-medusa-status-step.js +132 -0
  37. package/.medusa/server/src/workflows/steps/swap/update-swap-status-step.js +25 -0
  38. package/.medusa/server/src/workflows/steps/swap/validate-eligibility-step.js +25 -0
  39. package/.medusa/server/src/workflows/steps/swap/validate-order-step.js +69 -0
  40. package/.medusa/server/src/workflows/steps/swap/validate-swap-items-step.js +41 -0
  41. package/.medusa/server/src/workflows/swaps/approve-swap-workflow.js +22 -0
  42. package/.medusa/server/src/workflows/swaps/create-swap-workflow.js +52 -0
  43. package/.medusa/server/src/workflows/swaps/execute-swap-workflow.js +36 -0
  44. package/.medusa/server/src/workflows/swaps/types.js +3 -0
  45. package/.medusa/server/src/workflows/swaps/update-swap-status-workflow.js +23 -0
  46. package/README.md +208 -0
  47. package/package.json +1 -1
  48. package/.medusa/server/src/utils/resolve-options.js +0 -101
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.POST = exports.GET = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ const create_swap_workflow_1 = require("../../../workflows/swaps/create-swap-workflow");
6
+ const swap_1 = require("../../../modules/swap");
7
+ const zod_1 = require("zod");
8
+ const CreateSwapSchema = zod_1.z.object({
9
+ order_id: zod_1.z.string(),
10
+ return_items: zod_1.z.array(zod_1.z.object({
11
+ id: zod_1.z.string(),
12
+ quantity: zod_1.z.number().positive(),
13
+ reason: zod_1.z.string().optional(),
14
+ })),
15
+ new_items: zod_1.z.array(zod_1.z.object({
16
+ variant_id: zod_1.z.string(),
17
+ quantity: zod_1.z.number().positive(),
18
+ })),
19
+ reason: zod_1.z.string().optional(),
20
+ note: zod_1.z.string().optional(),
21
+ });
22
+ const GET = async (req, res) => {
23
+ // Type-safe access to auth_context
24
+ const authContext = req.auth_context;
25
+ const customerId = authContext?.actor_id;
26
+ if (!customerId || authContext?.actor_type !== "customer") {
27
+ res.status(401).json({
28
+ message: "Unauthorized: Customer authentication is required",
29
+ });
30
+ return;
31
+ }
32
+ try {
33
+ const swapService = req.scope.resolve(swap_1.SWAP_MODULE);
34
+ // Get query parameters
35
+ const orderId = req.query.order_id;
36
+ const filters = {};
37
+ if (orderId) {
38
+ filters.order_id = orderId;
39
+ }
40
+ // Note: We'd need to add a method to filter by customer_id
41
+ // For now, we'll list all swaps and filter client-side
42
+ // In production, you'd want to add a proper filter method
43
+ const swaps = await swapService.listSwaps(filters, {
44
+ take: 100,
45
+ skip: 0,
46
+ });
47
+ // Filter by customer orders (would need order lookup)
48
+ // For now, return all swaps - filtering should be done via order_id
49
+ res.json({
50
+ swaps: Array.isArray(swaps) ? swaps : swaps ? [swaps] : [],
51
+ });
52
+ }
53
+ catch (error) {
54
+ const errorMessage = error instanceof Error ? error.message : "Unknown error";
55
+ res.status(500).json({
56
+ message: "Failed to retrieve swaps",
57
+ error: errorMessage,
58
+ });
59
+ }
60
+ };
61
+ exports.GET = GET;
62
+ const POST = async (req, res) => {
63
+ // Type-safe access to auth_context
64
+ const authContext = req.auth_context;
65
+ const customerId = authContext?.actor_id;
66
+ if (!customerId || authContext?.actor_type !== "customer") {
67
+ res.status(401).json({
68
+ message: "Unauthorized: Customer authentication is required",
69
+ });
70
+ return;
71
+ }
72
+ try {
73
+ // Validate request body
74
+ const body = CreateSwapSchema.parse(req.body);
75
+ const { result } = await (0, create_swap_workflow_1.createSwapWorkflow)(req.scope).run({
76
+ input: {
77
+ order_id: body.order_id,
78
+ return_items: body.return_items,
79
+ new_items: body.new_items,
80
+ reason: body.reason,
81
+ note: body.note,
82
+ customer_id: customerId,
83
+ },
84
+ });
85
+ res.status(201).json(result);
86
+ }
87
+ catch (error) {
88
+ if (error instanceof zod_1.z.ZodError) {
89
+ res.status(400).json({
90
+ message: "Invalid request data",
91
+ errors: error.errors,
92
+ });
93
+ return;
94
+ }
95
+ if (error instanceof utils_1.MedusaError) {
96
+ const statusCode = error.type === utils_1.MedusaError.Types.NOT_FOUND
97
+ ? 404
98
+ : error.type === utils_1.MedusaError.Types.NOT_ALLOWED
99
+ ? 403
100
+ : error.type === utils_1.MedusaError.Types.UNAUTHORIZED
101
+ ? 401
102
+ : 400;
103
+ res.status(statusCode).json({
104
+ message: error.message,
105
+ type: error.type,
106
+ });
107
+ return;
108
+ }
109
+ const errorMessage = error instanceof Error ? error.message : "Unknown error";
110
+ res.status(500).json({
111
+ message: "Failed to create swap",
112
+ error: errorMessage,
113
+ });
114
+ }
115
+ };
116
+ exports.POST = POST;
117
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL3N3YXBzL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHFEQUF1RDtBQUN2RCx3RkFBa0Y7QUFDbEYsZ0RBQW1EO0FBRW5ELDZCQUF1QjtBQUV2QixNQUFNLGdCQUFnQixHQUFHLE9BQUMsQ0FBQyxNQUFNLENBQUM7SUFDaEMsUUFBUSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUU7SUFDcEIsWUFBWSxFQUFFLE9BQUMsQ0FBQyxLQUFLLENBQ25CLE9BQUMsQ0FBQyxNQUFNLENBQUM7UUFDUCxFQUFFLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRTtRQUNkLFFBQVEsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO1FBQy9CLE1BQU0sRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0tBQzlCLENBQUMsQ0FDSDtJQUNELFNBQVMsRUFBRSxPQUFDLENBQUMsS0FBSyxDQUNoQixPQUFDLENBQUMsTUFBTSxDQUFDO1FBQ1AsVUFBVSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUU7UUFDdEIsUUFBUSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7S0FDaEMsQ0FBQyxDQUNIO0lBQ0QsTUFBTSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDN0IsSUFBSSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Q0FDNUIsQ0FBQyxDQUFBO0FBRUssTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUN0QixHQUFrQixFQUNsQixHQUFtQixFQUNKLEVBQUU7SUFDakIsbUNBQW1DO0lBQ25DLE1BQU0sV0FBVyxHQUFJLEdBRW5CLENBQUMsWUFBWSxDQUFBO0lBRWYsTUFBTSxVQUFVLEdBQUcsV0FBVyxFQUFFLFFBQVEsQ0FB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
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./swaps"), exports);
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaGVscGVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMENBQXVCIn0=
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createSwapRequest = createSwapRequest;
4
+ exports.getSwaps = getSwaps;
5
+ exports.getSwap = getSwap;
6
+ exports.cancelSwap = cancelSwap;
7
+ /**
8
+ * Create a swap request
9
+ */
10
+ async function createSwapRequest(input, container) {
11
+ const { orderId, returnItems, newItems, reason, note } = input;
12
+ const response = await fetch(`/store/swaps`, {
13
+ method: "POST",
14
+ headers: {
15
+ "Content-Type": "application/json",
16
+ },
17
+ credentials: "include",
18
+ body: JSON.stringify({
19
+ order_id: orderId,
20
+ return_items: returnItems,
21
+ new_items: newItems,
22
+ reason,
23
+ note,
24
+ }),
25
+ });
26
+ if (!response.ok) {
27
+ const error = await response.json();
28
+ throw new Error(error.message || "Failed to create swap request");
29
+ }
30
+ const data = (await response.json());
31
+ return data.swap;
32
+ }
33
+ /**
34
+ * Get swaps for a customer (optionally filtered by order ID)
35
+ */
36
+ async function getSwaps(orderId, container) {
37
+ const url = orderId ? `/store/orders/${orderId}/swaps` : `/store/swaps`;
38
+ const response = await fetch(url, {
39
+ method: "GET",
40
+ headers: {
41
+ "Content-Type": "application/json",
42
+ },
43
+ credentials: "include",
44
+ });
45
+ if (!response.ok) {
46
+ const error = await response.json();
47
+ throw new Error(error.message || "Failed to retrieve swaps");
48
+ }
49
+ const data = (await response.json());
50
+ return data.swaps || [];
51
+ }
52
+ /**
53
+ * Get a specific swap by ID
54
+ */
55
+ async function getSwap(swapId, container) {
56
+ const response = await fetch(`/store/swaps/${swapId}`, {
57
+ method: "GET",
58
+ headers: {
59
+ "Content-Type": "application/json",
60
+ },
61
+ credentials: "include",
62
+ });
63
+ if (!response.ok) {
64
+ const error = await response.json();
65
+ throw new Error(error.message || "Failed to retrieve swap");
66
+ }
67
+ const data = (await response.json());
68
+ return data.swap;
69
+ }
70
+ /**
71
+ * Cancel a swap request
72
+ */
73
+ async function cancelSwap(swapId, container) {
74
+ const response = await fetch(`/store/swaps/${swapId}/cancel`, {
75
+ method: "POST",
76
+ headers: {
77
+ "Content-Type": "application/json",
78
+ },
79
+ credentials: "include",
80
+ });
81
+ if (!response.ok) {
82
+ const error = await response.json();
83
+ throw new Error(error.message || "Failed to cancel swap");
84
+ }
85
+ const data = (await response.json());
86
+ return data.swap;
87
+ }
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dhcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaGVscGVycy9zd2Fwcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXVDQSw4Q0E0QkM7QUFLRCw0QkFxQkM7QUFLRCwwQkFtQkM7QUFLRCxnQ0FtQkM7QUF6R0Q7O0dBRUc7QUFDSSxLQUFLLFVBQVUsaUJBQWlCLENBQ3JDLEtBQTZCLEVBQzdCLFNBQTBCO0lBRTFCLE1BQU0sRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFBO0lBRTlELE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLGNBQWMsRUFBRTtRQUMzQyxNQUFNLEVBQUUsTUFBTTtRQUNkLE9BQU8sRUFBRTtZQUNQLGNBQWMsRUFBRSxrQkFBa0I7U0FDbkM7UUFDRCxXQUFXLEVBQUUsU0FBUztRQUN0QixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNuQixRQUFRLEVBQUUsT0FBTztZQUNqQixZQUFZLEVBQUUsV0FBVztZQUN6QixTQUFTLEVBQUUsUUFBUTtZQUNuQixNQUFNO1lBQ04sSUFBSTtTQUNMLENBQUM7S0FDSCxDQUFDLENBQUE7SUFFRixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2pCLE1BQU0sS0FBSyxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFBO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSwrQkFBK0IsQ0FBQyxDQUFBO0lBQ25FLENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFtQixDQUFBO0lBQ3RELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQTtBQUNsQixDQUFDO0FBRUQ7O0dBRUc7QUFDSSxLQUFLLFVBQVUsUUFBUSxDQUM1QixPQUFnQixFQUNoQixTQUEyQjtJQUUzQixNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFBO0lBRXZFLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsRUFBRTtRQUNoQyxNQUFNLEVBQUUsS0FBSztRQUNiLE9BQU8sRUFBRTtZQUNQLGNBQWMsRUFBRSxrQkFBa0I7U0FDbkM7UUFDRCxXQUFXLEVBQUUsU0FBUztLQUN2QixDQUFDLENBQUE7SUFFRixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2pCLE1BQU0sS0FBSyxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFBO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSwwQkFBMEIsQ0FBQyxDQUFBO0lBQzlELENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFzQixDQUFBO0lBQ3pELE9BQU8sSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUE7QUFDekIsQ0FBQztBQUVEOztHQUVHO0FBQ0ksS0FBSyxVQUFVLE9BQU8sQ0FDM0IsTUFBYyxFQUNkLFNBQTJCO0lBRTNCLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLGdCQUFnQixNQUFNLEVBQUUsRUFBRTtRQUNyRCxNQUFNLEVBQUUsS0FBSztRQUNiLE9BQU8sRUFBRTtZQUNQLGNBQWMsRUFBRSxrQkFBa0I7U0FDbkM7UUFDRCxXQUFXLEVBQUUsU0FBUztLQUN2QixDQUFDLENBQUE7SUFFRixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2pCLE1BQU0sS0FBSyxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFBO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSx5QkFBeUIsQ0FBQyxDQUFBO0lBQzdELENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFtQixDQUFBO0lBQ3RELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQTtBQUNsQixDQUFDO0FBRUQ7O0dBRUc7QUFDSSxLQUFLLFVBQVUsVUFBVSxDQUM5QixNQUFjLEVBQ2QsU0FBMkI7SUFFM0IsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsZ0JBQWdCLE1BQU0sU0FBUyxFQUFFO1FBQzVELE1BQU0sRUFBRSxNQUFNO1FBQ2QsT0FBTyxFQUFFO1lBQ1AsY0FBYyxFQUFFLGtCQUFrQjtTQUNuQztRQUNELFdBQVcsRUFBRSxTQUFTO0tBQ3ZCLENBQUMsQ0FBQTtJQUVGLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDakIsTUFBTSxLQUFLLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLHVCQUF1QixDQUFDLENBQUE7SUFDM0QsQ0FBQztJQUVELE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQW1CLENBQUE7SUFDdEQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFBO0FBQ2xCLENBQUMifQ==
@@ -0,0 +1,13 @@
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.SWAP_MODULE = void 0;
7
+ const service_1 = __importDefault(require("./service"));
8
+ const utils_1 = require("@medusajs/framework/utils");
9
+ exports.SWAP_MODULE = "swap";
10
+ exports.default = (0, utils_1.Module)(exports.SWAP_MODULE, {
11
+ service: service_1.default,
12
+ });
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9zd2FwL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHdEQUFtQztBQUNuQyxxREFBa0Q7QUFFckMsUUFBQSxXQUFXLEdBQUcsTUFBTSxDQUFBO0FBRWpDLGtCQUFlLElBQUEsY0FBTSxFQUFDLG1CQUFXLEVBQUU7SUFDakMsT0FBTyxFQUFFLGlCQUFXO0NBQ3JCLENBQUMsQ0FBQSJ9
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Migration20260121164326 = void 0;
4
+ const migrations_1 = require("@medusajs/framework/mikro-orm/migrations");
5
+ class Migration20260121164326 extends migrations_1.Migration {
6
+ async up() {
7
+ this.addSql(`
8
+ CREATE TABLE IF NOT EXISTS "swap" (
9
+ "id" text PRIMARY KEY,
10
+ "order_id" text NOT NULL,
11
+ "status" text NOT NULL DEFAULT 'requested',
12
+ "return_items" jsonb NULL,
13
+ "new_items" jsonb NULL,
14
+ "difference_due" numeric NOT NULL DEFAULT 0,
15
+ "payment_status" text NULL,
16
+ "fulfillment_status" text NULL,
17
+ "return_id" text NULL,
18
+ "exchange_id" text NULL,
19
+ "reason" text NULL,
20
+ "note" text NULL,
21
+ "metadata" jsonb NULL,
22
+ "created_at" timestamptz NOT NULL DEFAULT now(),
23
+ "updated_at" timestamptz NOT NULL DEFAULT now(),
24
+ "deleted_at" timestamptz NULL
25
+ );
26
+ `);
27
+ this.addSql(`
28
+ CREATE INDEX IF NOT EXISTS "IDX_swap_order_id"
29
+ ON "swap" ("order_id") WHERE "deleted_at" IS NULL;
30
+ `);
31
+ this.addSql(`
32
+ CREATE INDEX IF NOT EXISTS "IDX_swap_status"
33
+ ON "swap" ("status") WHERE "deleted_at" IS NULL;
34
+ `);
35
+ this.addSql(`
36
+ CREATE INDEX IF NOT EXISTS "IDX_swap_created_at"
37
+ ON "swap" ("created_at") WHERE "deleted_at" IS NULL;
38
+ `);
39
+ this.addSql(`
40
+ CREATE INDEX IF NOT EXISTS "IDX_swap_deleted_at"
41
+ ON "swap" ("deleted_at") WHERE "deleted_at" IS NULL;
42
+ `);
43
+ }
44
+ async down() {
45
+ this.addSql(`DROP TABLE IF EXISTS "swap";`);
46
+ }
47
+ }
48
+ exports.Migration20260121164326 = Migration20260121164326;
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlncmF0aW9uMjAyNjAxMjExNjQzMjYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9zd2FwL21pZ3JhdGlvbnMvTWlncmF0aW9uMjAyNjAxMjExNjQzMjYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUVBQW9FO0FBRXBFLE1BQWEsdUJBQXdCLFNBQVEsc0JBQVM7SUFDcEQsS0FBSyxDQUFDLEVBQUU7UUFDTixJQUFJLENBQUMsTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBbUJYLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxNQUFNLENBQUM7OztLQUdYLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxNQUFNLENBQUM7OztLQUdYLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxNQUFNLENBQUM7OztLQUdYLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxNQUFNLENBQUM7OztLQUdYLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSTtRQUNSLElBQUksQ0FBQyxNQUFNLENBQUMsOEJBQThCLENBQUMsQ0FBQTtJQUM3QyxDQUFDO0NBQ0Y7QUEvQ0QsMERBK0NDIn0=
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Swap = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ exports.Swap = utils_1.model.define("swap", {
6
+ id: utils_1.model.id().primaryKey(),
7
+ order_id: utils_1.model.text(),
8
+ status: utils_1.model.text().default("requested"), // requested, approved, rejected, return_started, return_shipped, return_received, new_items_shipped, completed, cancelled
9
+ return_items: utils_1.model.json().nullable(), // Array of { id: string, quantity: number, reason?: string }
10
+ new_items: utils_1.model.json().nullable(), // Array of { variant_id: string, quantity: number }
11
+ difference_due: utils_1.model.number().default(0), // Price difference (positive = customer owes, negative = refund)
12
+ payment_status: utils_1.model.text().nullable(), // pending, refunded, captured, cancelled
13
+ fulfillment_status: utils_1.model.text().nullable(), // not_fulfilled, fulfilled, shipped, delivered, cancelled
14
+ return_id: utils_1.model.text().nullable(), // Link to Medusa's return if created
15
+ exchange_id: utils_1.model.text().nullable(), // Link to Medusa's exchange if created
16
+ reason: utils_1.model.text().nullable(), // Reason for swap
17
+ note: utils_1.model.text().nullable(), // Customer note
18
+ metadata: utils_1.model.json().nullable(), // Status history, admin notes, etc.
19
+ });
20
+ exports.default = exports.Swap;
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dhcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3N3YXAvbW9kZWxzL3N3YXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscURBQWlEO0FBRXBDLFFBQUEsSUFBSSxHQUFHLGFBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFO0lBQ3ZDLEVBQUUsRUFBRSxhQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFO0lBQzNCLFFBQVEsRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFO0lBQ3RCLE1BQU0sRUFBRSxhQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLDBIQUEwSDtJQUNySyxZQUFZLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLDZEQUE2RDtJQUNwRyxTQUFTLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLG9EQUFvRDtJQUN4RixjQUFjLEVBQUUsYUFBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxpRUFBaUU7SUFDNUcsY0FBYyxFQUFFLGFBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRSx5Q0FBeUM7SUFDbEYsa0JBQWtCLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLDBEQUEwRDtJQUN2RyxTQUFTLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLHFDQUFxQztJQUN6RSxXQUFXLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLHVDQUF1QztJQUM3RSxNQUFNLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLGtCQUFrQjtJQUNuRCxJQUFJLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLGdCQUFnQjtJQUMvQyxRQUFRLEVBQUUsYUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLG9DQUFvQztDQUN4RSxDQUFDLENBQUE7QUFFRixrQkFBZSxZQUFJLENBQUEifQ==
@@ -0,0 +1,224 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const utils_1 = require("@medusajs/framework/utils");
4
+ const swap_1 = require("./models/swap");
5
+ class SwapService extends (0, utils_1.MedusaService)({ Swap: swap_1.Swap }) {
6
+ constructor(container) {
7
+ super(container);
8
+ this.manager_ = container.manager;
9
+ this.logger_ = container.logger;
10
+ }
11
+ async createSwap(input) {
12
+ const { order_id, return_items, new_items, reason, note } = input;
13
+ if (!return_items || return_items.length === 0) {
14
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Return items are required");
15
+ }
16
+ if (!new_items || new_items.length === 0) {
17
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "New items are required");
18
+ }
19
+ const swap = await this.createSwaps({
20
+ order_id,
21
+ status: "requested",
22
+ return_items: return_items,
23
+ new_items: new_items,
24
+ difference_due: 0, // Will be calculated later
25
+ reason: reason || null,
26
+ note: note || null,
27
+ metadata: {
28
+ created_at: new Date().toISOString(),
29
+ status_history: [
30
+ {
31
+ status: "requested",
32
+ timestamp: new Date().toISOString(),
33
+ },
34
+ ],
35
+ },
36
+ });
37
+ return Array.isArray(swap) ? swap[0] : swap;
38
+ }
39
+ async approveSwap(swapId, adminId) {
40
+ const swap = await this.retrieveSwap(swapId);
41
+ const swapData = swap;
42
+ if (swapData.status !== "requested") {
43
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Swap cannot be approved. Current status: ${swapData.status}`);
44
+ }
45
+ const metadata = swapData.metadata || {};
46
+ const statusHistory = metadata.status_history || [];
47
+ const medusaIntegration = metadata.medusa_integration || {};
48
+ const securityChecks = metadata.security_checks || {};
49
+ await this.updateSwaps({
50
+ selector: { id: swapId },
51
+ data: {
52
+ status: "approved",
53
+ metadata: {
54
+ ...metadata,
55
+ approved_at: new Date().toISOString(),
56
+ approved_by: adminId,
57
+ status_history: [
58
+ ...statusHistory,
59
+ {
60
+ status: "approved",
61
+ timestamp: new Date().toISOString(),
62
+ admin_id: adminId,
63
+ },
64
+ ],
65
+ medusa_integration: {
66
+ ...medusaIntegration,
67
+ },
68
+ security_checks: {
69
+ ...securityChecks,
70
+ admin_approved_by: adminId,
71
+ admin_approved_at: new Date().toISOString(),
72
+ },
73
+ },
74
+ },
75
+ });
76
+ return await this.retrieveSwap(swapId);
77
+ }
78
+ async rejectSwap(swapId, adminId, reason) {
79
+ const swap = await this.retrieveSwap(swapId);
80
+ const swapData = swap;
81
+ if (swapData.status !== "requested") {
82
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Swap cannot be rejected. Current status: ${swapData.status}`);
83
+ }
84
+ const metadata = swapData.metadata || {};
85
+ const statusHistory = metadata.status_history || [];
86
+ await this.updateSwaps({
87
+ selector: { id: swapId },
88
+ data: {
89
+ status: "rejected",
90
+ metadata: {
91
+ ...metadata,
92
+ rejected_at: new Date().toISOString(),
93
+ rejected_by: adminId,
94
+ rejection_reason: reason || null,
95
+ status_history: [
96
+ ...statusHistory,
97
+ {
98
+ status: "rejected",
99
+ timestamp: new Date().toISOString(),
100
+ admin_id: adminId,
101
+ reason: reason || null,
102
+ },
103
+ ],
104
+ },
105
+ },
106
+ });
107
+ return await this.retrieveSwap(swapId);
108
+ }
109
+ async updateSwapStatus(input) {
110
+ const { swap_id, status, metadata: additionalMetadata } = input;
111
+ const swap = await this.retrieveSwap(swap_id);
112
+ const swapData = swap;
113
+ const currentStatus = swapData.status;
114
+ // Validate status transition
115
+ const validTransitions = {
116
+ requested: ["approved", "rejected", "cancelled"],
117
+ approved: ["return_started", "cancelled"],
118
+ return_started: ["return_shipped", "cancelled"],
119
+ return_shipped: ["return_received", "cancelled"],
120
+ return_received: ["new_items_shipped", "cancelled"],
121
+ new_items_shipped: ["completed", "cancelled"],
122
+ rejected: [], // Terminal state
123
+ completed: [], // Terminal state
124
+ cancelled: [], // Terminal state
125
+ };
126
+ const allowedTransitions = validTransitions[currentStatus] || [];
127
+ if (!allowedTransitions.includes(status)) {
128
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Invalid status transition from ${currentStatus} to ${status}. Allowed transitions: ${allowedTransitions.join(", ")}`);
129
+ }
130
+ const metadata = swapData.metadata || {};
131
+ const statusHistory = metadata.status_history || [];
132
+ await this.updateSwaps({
133
+ selector: { id: swap_id },
134
+ data: {
135
+ status,
136
+ metadata: {
137
+ ...metadata,
138
+ ...additionalMetadata,
139
+ status_history: [
140
+ ...statusHistory,
141
+ {
142
+ status,
143
+ timestamp: new Date().toISOString(),
144
+ },
145
+ ],
146
+ },
147
+ },
148
+ });
149
+ return await this.retrieveSwap(swap_id);
150
+ }
151
+ async calculateDifferenceDue(swapId) {
152
+ const swap = await this.retrieveSwap(swapId);
153
+ const swapData = swap;
154
+ // This is a placeholder - actual calculation would require:
155
+ // 1. Fetch order items and their prices
156
+ // 2. Calculate return items total
157
+ // 3. Calculate new items total
158
+ // 4. Return difference (new_items_total - return_items_total)
159
+ // For now, return stored value or 0 - this will be implemented in workflow step
160
+ return swapData.difference_due || 0;
161
+ }
162
+ async validateEligibility(orderId, returnItems) {
163
+ // Check for existing pending swaps for the same order
164
+ const existingSwaps = await this.listSwaps({
165
+ order_id: orderId,
166
+ status: ["requested", "approved", "return_started"],
167
+ }, {
168
+ take: 100,
169
+ });
170
+ const swapsArray = Array.isArray(existingSwaps) ? existingSwaps : existingSwaps ? [existingSwaps] : [];
171
+ // Check if any return items overlap with existing swaps
172
+ for (const existingSwap of swapsArray) {
173
+ const swapData = existingSwap;
174
+ const existingReturnItems = swapData.return_items;
175
+ if (existingReturnItems) {
176
+ for (const returnItem of returnItems) {
177
+ const hasOverlap = existingReturnItems.some((existing) => existing.id === returnItem.id && existing.quantity > 0);
178
+ if (hasOverlap) {
179
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Item ${returnItem.id} is already part of a pending swap for this order`);
180
+ }
181
+ }
182
+ }
183
+ }
184
+ }
185
+ async checkRateLimit(customerId, orderId) {
186
+ // Check for existing swaps by this customer for this order
187
+ const existingSwaps = await this.listSwaps({
188
+ order_id: orderId,
189
+ }, {
190
+ take: 100,
191
+ });
192
+ const swapsArray = Array.isArray(existingSwaps) ? existingSwaps : existingSwaps ? [existingSwaps] : [];
193
+ const maxSwapsPerOrder = 5; // Configurable limit
194
+ if (swapsArray.length >= maxSwapsPerOrder) {
195
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Maximum ${maxSwapsPerOrder} swaps allowed per order`);
196
+ }
197
+ // Check customer's total swap count (across all orders)
198
+ const customerSwaps = await this.listSwaps({}, {
199
+ take: 1000,
200
+ });
201
+ const customerSwapsArray = Array.isArray(customerSwaps)
202
+ ? customerSwaps
203
+ : customerSwaps
204
+ ? [customerSwaps]
205
+ : [];
206
+ // Filter by customer (would need to join with order, simplified here)
207
+ // In a real implementation, you'd query orders with customer_id and then swaps
208
+ const maxSwapsPerCustomer = 20; // Configurable limit
209
+ const customerSwapCount = customerSwapsArray.length;
210
+ if (customerSwapCount >= maxSwapsPerCustomer) {
211
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Maximum ${maxSwapsPerCustomer} swaps allowed per customer`);
212
+ }
213
+ }
214
+ async validateItemEligibility(itemId) {
215
+ // This would check item metadata for eligibility flags
216
+ // For now, return true - can be extended to check:
217
+ // - Item metadata.exchange_eligible flag
218
+ // - Product type restrictions
219
+ // - Final sale items
220
+ return true;
221
+ }
222
+ }
223
+ exports.default = SwapService;
224
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL3N3YXAvc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHFEQUFzRTtBQUN0RSx3Q0FBb0M7QUFrQ3BDLE1BQXFCLFdBQVksU0FBUSxJQUFBLHFCQUFhLEVBQUMsRUFBRSxJQUFJLEVBQUosV0FBSSxFQUFFLENBQUM7SUFJOUQsWUFBWSxTQUErQjtRQUN6QyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDaEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFBO1FBQ2pDLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQTtJQUNqQyxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFzQjtRQUNyQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQTtRQUVqRSxJQUFJLENBQUMsWUFBWSxJQUFJLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDL0MsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsMkJBQTJCLENBQzVCLENBQUE7UUFDSCxDQUFDO1FBRUQsSUFBSSxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLHdCQUF3QixDQUN6QixDQUFBO1FBQ0gsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUNsQyxRQUFRO1lBQ1IsTUFBTSxFQUFFLFdBQVc7WUFDbkIsWUFBWSxFQUFFLFlBQWtEO1lBQ2hFLFNBQVMsRUFBRSxT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
@@ -5,7 +5,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.OtpService = void 0;
7
7
  const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
8
- const resolve_options_1 = require("../utils/resolve-options");
9
8
  // In-memory store for OTPs.
10
9
  // NOTE: In a real production environment with multiple server instances,
11
10
  // this should be replaced with Redis or a database table.
@@ -51,9 +50,21 @@ class OtpService {
51
50
  if (!configModule) {
52
51
  throw new Error("configModule is required for generateToken");
53
52
  }
54
- const rawOptions = (0, resolve_options_1.extractOrderManagementOptions)(configModule);
55
- const options = (0, resolve_options_1.resolveOrderManagementOptions)(rawOptions);
56
- const secret = options.jwtSecret;
53
+ const plugins = configModule
54
+ ?.projectConfig?.plugins ?? [];
55
+ let secret;
56
+ for (const plugin of plugins) {
57
+ if (typeof plugin === "object" && plugin !== null && plugin?.resolve === "order-management") {
58
+ const options = plugin?.options;
59
+ if (options?.jwtSecret) {
60
+ secret = options.jwtSecret;
61
+ break;
62
+ }
63
+ }
64
+ }
65
+ if (!secret) {
66
+ throw new Error("order-management: jwtSecret is required");
67
+ }
57
68
  return jsonwebtoken_1.default.sign({
58
69
  guest_identifier: identifier,
59
70
  customer_id: customerId,
@@ -62,4 +73,4 @@ class OtpService {
62
73
  }
63
74
  }
64
75
  exports.OtpService = OtpService;
65
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3RwLXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvb3RwLXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsZ0VBQThCO0FBQzlCLDhEQUF1RztBQUV2Ryw2QkFBNkI7QUFDN0IsMEVBQTBFO0FBQzFFLDBEQUEwRDtBQUMxRCxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBOEMsQ0FBQTtBQUV0RSxNQUFhLFVBQVU7SUFDbkI7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFrQjtRQUM3QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUE7UUFFbEUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUU7WUFDckIsR0FBRztZQUNILFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsYUFBYTtTQUN4RCxDQUFDLENBQUE7UUFFRixPQUFPLEdBQUcsQ0FBQTtJQUNkLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQWtCLEVBQUUsSUFBWTtRQUN6QyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBRXJDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNSLE9BQU8sS0FBSyxDQUFBO1FBQ2hCLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDOUIsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUMzQixPQUFPLEtBQUssQ0FBQTtRQUNoQixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3BCLE9BQU8sS0FBSyxDQUFBO1FBQ2hCLENBQUM7UUFFRCwyQkFBMkI7UUFDM0IsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUMzQixPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNILGFBQWEsQ0FBQyxVQUFrQixFQUFFLFVBQW1CLEVBQUUsWUFBc0I7UUFDekUscUJBQXFCO1FBQ3JCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUE7UUFDakUsQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHLElBQUEsK0NBQTZCLEVBQUMsWUFBWSxDQUFDLENBQUE7UUFDOUQsTUFBTSxPQUFPLEdBQUcsSUFBQSwrQ0FBNkIsRUFBQyxVQUFVLENBQUMsQ0FBQTtRQUN6RCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFBO1FBRWhDLE9BQU8sc0JBQUcsQ0FBQyxJQUFJLENBQ1g7WUFDSSxnQkFBZ0IsRUFBRSxVQUFVO1lBQzVCLFdBQVcsRUFBRSxVQUFVO1lBQ3ZCLEtBQUssRUFBRSxjQUFjO1NBQ3hCLEVBQ0QsTUFBTSxFQUNOLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUN0QixDQUFBO0lBQ0wsQ0FBQztDQUNKO0FBL0RELGdDQStEQyJ9
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3RwLXNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvb3RwLXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsZ0VBQThCO0FBRTlCLDZCQUE2QjtBQUM3QiwwRUFBMEU7QUFDMUUsMERBQTBEO0FBQzFELE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUE4QyxDQUFBO0FBRXRFLE1BQWEsVUFBVTtJQUNuQjs7O09BR0c7SUFDSCxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQWtCO1FBQzdCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtRQUVsRSxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRTtZQUNyQixHQUFHO1lBQ0gsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxhQUFhO1NBQ3hELENBQUMsQ0FBQTtRQUVGLE9BQU8sR0FBRyxDQUFBO0lBQ2QsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBa0IsRUFBRSxJQUFZO1FBQ3pDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUE7UUFFckMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1IsT0FBTyxLQUFLLENBQUE7UUFDaEIsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM5QixRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBQzNCLE9BQU8sS0FBSyxDQUFBO1FBQ2hCLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDcEIsT0FBTyxLQUFLLENBQUE7UUFDaEIsQ0FBQztRQUVELDJCQUEyQjtRQUMzQixRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQzNCLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsYUFBYSxDQUFDLFVBQWtCLEVBQUUsVUFBbUIsRUFBRSxZQUFzQjtRQUN6RSxxQkFBcUI7UUFDckIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQTtRQUNqRSxDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUksWUFBNEQ7WUFDM0UsRUFBRSxhQUFhLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQTtRQUVoQyxJQUFJLE1BQTBCLENBQUE7UUFDOUIsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUM3QixJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFLLE1BQStCLEVBQUUsT0FBTyxLQUFLLGtCQUFrQixFQUFFLENBQUM7Z0JBQ3RILE1BQU0sT0FBTyxHQUFJLE1BQStDLEVBQUUsT0FBTyxDQUFBO2dCQUN6RSxJQUFJLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQztvQkFDdkIsTUFBTSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUE7b0JBQzFCLE1BQUs7Z0JBQ1AsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFBO1FBQzVELENBQUM7UUFFRCxPQUFPLHNCQUFHLENBQUMsSUFBSSxDQUNYO1lBQ0ksZ0JBQWdCLEVBQUUsVUFBVTtZQUM1QixXQUFXLEVBQUUsVUFBVTtZQUN2QixLQUFLLEVBQUUsY0FBYztTQUN4QixFQUNELE1BQU0sRUFDTixFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FDdEIsQ0FBQTtJQUNMLENBQUM7Q0FDSjtBQTlFRCxnQ0E4RUMifQ==