medusa-pos-plugin 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/.medusa/server/src/admin/index.js +23 -0
  2. package/.medusa/server/src/admin/index.mjs +24 -0
  3. package/.medusa/server/src/api/admin/pos/catalog/route.js +139 -0
  4. package/.medusa/server/src/api/admin/pos/draft-orders/[id]/confirm-lite/route.js +41 -0
  5. package/.medusa/server/src/api/admin/pos/draft-orders/[id]/customer/route.js +68 -0
  6. package/.medusa/server/src/api/admin/pos/draft-orders/[id]/finalize/route.js +424 -0
  7. package/.medusa/server/src/api/admin/pos/draft-orders/[id]/items/route.js +452 -0
  8. package/.medusa/server/src/api/admin/pos/draft-orders/[id]/items/update/route.js +137 -0
  9. package/.medusa/server/src/api/admin/pos/draft-orders/[id]/manual-discount/route.js +386 -0
  10. package/.medusa/server/src/api/admin/pos/draft-orders/[id]/promotions/route.js +59 -0
  11. package/.medusa/server/src/api/admin/pos/draft-orders/[id]/route.js +178 -0
  12. package/.medusa/server/src/api/admin/pos/draft-orders/[id]/wallet-debit/route.js +220 -0
  13. package/.medusa/server/src/api/admin/pos/draft-orders/route.js +193 -0
  14. package/.medusa/server/src/api/admin/pos/manual-discounts/route.js +76 -0
  15. package/.medusa/server/src/api/admin/pos/orders/[id]/fulfill/route.js +103 -0
  16. package/.medusa/server/src/api/admin/pos/orders/[id]/returns/route.js +512 -0
  17. package/.medusa/server/src/api/admin/pos/orders/fulfill-pos-items.js +63 -0
  18. package/.medusa/server/src/api/admin/pos/orders/validators.js +62 -0
  19. package/.medusa/server/src/api/admin/pos/payments/config/route.js +15 -0
  20. package/.medusa/server/src/api/admin/pos/payments/device/[orderId]/route.js +39 -0
  21. package/.medusa/server/src/api/admin/pos/payments/device/cancel/route.js +27 -0
  22. package/.medusa/server/src/api/admin/pos/payments/device/route.js +107 -0
  23. package/.medusa/server/src/api/admin/pos/payments/qr/[qrId]/close/route.js +36 -0
  24. package/.medusa/server/src/api/admin/pos/payments/qr/[qrId]/route.js +42 -0
  25. package/.medusa/server/src/api/admin/pos/payments/qr/route.js +78 -0
  26. package/.medusa/server/src/index.js +8 -0
  27. package/.medusa/server/src/types.js +3 -0
  28. package/.medusa/server/src/utils/pos-draft-edit.js +178 -0
  29. package/.medusa/server/src/utils/pos-finalize.js +166 -0
  30. package/.medusa/server/src/utils/pos-inventory.js +265 -0
  31. package/.medusa/server/src/utils/pos-returns.js +339 -0
  32. package/.medusa/server/src/utils/razorpay-pos-device.js +122 -0
  33. package/.medusa/server/src/utils/razorpay-pos.js +134 -0
  34. package/README.md +39 -0
  35. package/index.js +9 -0
  36. package/package.json +82 -0
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.regionFallbackCountry = regionFallbackCountry;
4
+ exports.buildStoreShippingAddress = buildStoreShippingAddress;
5
+ exports.pickCustomerBillingAddress = pickCustomerBillingAddress;
6
+ exports.buildPosPaymentMetadata = buildPosPaymentMetadata;
7
+ exports.resolvePosPayableTotal = resolvePosPayableTotal;
8
+ exports.paymentCollectionNeedsMarkPaid = paymentCollectionNeedsMarkPaid;
9
+ exports.shouldApplyAutoPromotions = shouldApplyAutoPromotions;
10
+ exports.orderIsDraft = orderIsDraft;
11
+ exports.readAddress1 = readAddress1;
12
+ function isRecord(value) {
13
+ return Boolean(value && typeof value === "object" && !Array.isArray(value));
14
+ }
15
+ function regionFallbackCountry(region) {
16
+ const iso = region?.countries?.find((c) => typeof c?.iso_2 === "string" && c.iso_2.trim())
17
+ ?.iso_2;
18
+ return (iso || "in").toLowerCase();
19
+ }
20
+ function buildStoreShippingAddress(stockLocation, region) {
21
+ if (!stockLocation)
22
+ return null;
23
+ const addr = stockLocation.address;
24
+ const storeName = (stockLocation.name || "Store").trim() || "Store";
25
+ const address1 = (addr?.address_1 || "").trim() || storeName;
26
+ const country = ((addr?.country_code || "").trim() || regionFallbackCountry(region)).toLowerCase();
27
+ return {
28
+ first_name: "POS",
29
+ last_name: "Pickup",
30
+ company: storeName,
31
+ address_1: address1,
32
+ address_2: addr?.address_2?.trim() || undefined,
33
+ city: addr?.city?.trim() || undefined,
34
+ province: addr?.province?.trim() || undefined,
35
+ postal_code: addr?.postal_code?.trim() || undefined,
36
+ country_code: country,
37
+ phone: addr?.phone?.trim() || undefined,
38
+ };
39
+ }
40
+ function pickCustomerBillingAddress(customer, storeAddress) {
41
+ const addresses = Array.isArray(customer?.addresses) ? customer.addresses : [];
42
+ const chosen = addresses.find((address) => address.is_default_billing || address.id === customer?.default_billing_address_id) || addresses[0];
43
+ if (!chosen)
44
+ return storeAddress ?? undefined;
45
+ return {
46
+ first_name: chosen.first_name ?? undefined,
47
+ last_name: chosen.last_name ?? undefined,
48
+ company: chosen.company ?? undefined,
49
+ address_1: chosen.address_1 || storeAddress?.address_1 || "Store",
50
+ address_2: chosen.address_2 ?? undefined,
51
+ postal_code: chosen.postal_code ?? undefined,
52
+ city: chosen.city ?? undefined,
53
+ province: chosen.province ?? undefined,
54
+ country_code: (chosen.country_code ||
55
+ storeAddress?.country_code ||
56
+ "in").toLowerCase(),
57
+ phone: chosen.phone ?? undefined,
58
+ };
59
+ }
60
+ function buildPosPaymentMetadata(input) {
61
+ const itemCount = typeof input.item_count === "number" && Number.isFinite(input.item_count)
62
+ ? Math.max(0, Math.floor(input.item_count))
63
+ : undefined;
64
+ const durationMs = typeof input.checkout_duration_ms === "number" && Number.isFinite(input.checkout_duration_ms)
65
+ ? Math.max(0, Math.round(input.checkout_duration_ms))
66
+ : undefined;
67
+ return {
68
+ source: "pos",
69
+ pos_payment_method: input.payment_method,
70
+ ...(typeof input.wallet_amount === "number" && input.wallet_amount > 0
71
+ ? { pos_wallet_amount: input.wallet_amount }
72
+ : {}),
73
+ ...(typeof input.charged_total === "number" && input.charged_total > 0
74
+ ? { pos_charged_total: Math.round(input.charged_total * 100) / 100 }
75
+ : {}),
76
+ pos_completed_at: new Date().toISOString(),
77
+ ...(input.razorpay_qr_id ? { razorpay_qr_id: input.razorpay_qr_id } : {}),
78
+ ...(input.razorpay_payment_id ? { razorpay_payment_id: input.razorpay_payment_id } : {}),
79
+ ...(input.cashier_id ? { pos_cashier_id: input.cashier_id } : {}),
80
+ ...(input.location_id ? { pos_location_id: input.location_id } : {}),
81
+ ...(input.sales_channel_id ? { pos_sales_channel_id: input.sales_channel_id } : {}),
82
+ ...(input.cart_opened_at ? { pos_cart_opened_at: input.cart_opened_at } : {}),
83
+ ...(itemCount != null ? { pos_item_count: itemCount } : {}),
84
+ ...(durationMs != null ? { pos_checkout_duration_ms: durationMs } : {}),
85
+ };
86
+ }
87
+ function asAmount(value) {
88
+ const n = typeof value === "number" ? value : Number(value);
89
+ return Number.isFinite(n) ? n : 0;
90
+ }
91
+ /** Payable after POSMAN — Medusa `total` is often still the pre-discount list. */
92
+ function resolvePosPayableTotal(order) {
93
+ if (!order)
94
+ return 0;
95
+ const total = asAmount(order.total);
96
+ const meta = isRecord(order.metadata) ? order.metadata : {};
97
+ const charged = asAmount(meta.pos_charged_total);
98
+ if (charged > 0)
99
+ return Math.round(charged * 100) / 100;
100
+ const discount = asAmount(order.discount_total);
101
+ const subtotal = asAmount(order.subtotal) || asAmount(order.item_total);
102
+ const items = Array.isArray(order.items) ? order.items : [];
103
+ const lineGross = items.reduce((sum, item) => {
104
+ if (!isRecord(item))
105
+ return sum;
106
+ const qty = asAmount(item.quantity) || 1;
107
+ const itemMeta = isRecord(item.metadata) ? item.metadata : {};
108
+ const original = asAmount(itemMeta.original_price);
109
+ const unit = original > 0 ? original : asAmount(item.unit_price);
110
+ return sum + unit * qty;
111
+ }, 0);
112
+ const gross = subtotal > 0 ? subtotal : lineGross > 0 ? lineGross : total;
113
+ let posmanAdj = 0;
114
+ for (const item of items) {
115
+ if (!isRecord(item) || !Array.isArray(item.adjustments))
116
+ continue;
117
+ for (const adj of item.adjustments) {
118
+ if (!isRecord(adj))
119
+ continue;
120
+ const code = typeof adj.code === "string" ? adj.code : "";
121
+ if (!code.startsWith("POSMAN-"))
122
+ continue;
123
+ posmanAdj += Math.abs(asAmount(adj.amount));
124
+ }
125
+ }
126
+ let metaOff = 0;
127
+ const posMan = meta.pos_manual_discount;
128
+ if (isRecord(posMan)) {
129
+ if (posMan.discount_type === "percentage") {
130
+ const pct = asAmount(posMan.discount_value);
131
+ if (pct > 0 && pct <= 100 && gross > 0) {
132
+ metaOff = Math.round(((gross * pct) / 100) * 100) / 100;
133
+ }
134
+ }
135
+ else {
136
+ metaOff = asAmount(posMan.discount_value ?? posMan.amount);
137
+ }
138
+ }
139
+ const off = Math.max(discount, posmanAdj, metaOff);
140
+ if (off <= 0)
141
+ return total;
142
+ if (gross > 0 && total + 0.05 < gross)
143
+ return total;
144
+ return Math.round(Math.max(0, (gross || total) - off) * 100) / 100;
145
+ }
146
+ function paymentCollectionNeedsMarkPaid(status) {
147
+ const normalized = String(status || "").toLowerCase();
148
+ return normalized !== "completed" && normalized !== "authorized" && normalized !== "captured";
149
+ }
150
+ /** Apply autos only when an open edit was just confirmed (items may have changed). */
151
+ function shouldApplyAutoPromotions(confirmedOpenEdit) {
152
+ return confirmedOpenEdit;
153
+ }
154
+ function orderIsDraft(order) {
155
+ if (!order)
156
+ return false;
157
+ if (order.is_draft_order === true)
158
+ return true;
159
+ return String(order.status || "").toLowerCase() === "draft";
160
+ }
161
+ function readAddress1(value) {
162
+ if (!isRecord(value))
163
+ return "";
164
+ return typeof value.address_1 === "string" ? value.address_1.trim() : "";
165
+ }
166
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zLWZpbmFsaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Bvcy1maW5hbGl6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQWdDQSxzREFNQztBQUVELDhEQWtDQztBQUVELGdFQW1DQztBQUVELDBEQXlDQztBQVFELHdEQWdEQztBQUVELHdFQUdDO0FBR0QsOERBRUM7QUFFRCxvQ0FJQztBQUVELG9DQUdDO0FBM01ELFNBQVMsUUFBUSxDQUFDLEtBQWM7SUFDOUIsT0FBTyxPQUFPLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtBQUM3RSxDQUFDO0FBRUQsU0FBZ0IscUJBQXFCLENBQ25DLE1BQXVFO0lBRXZFLE1BQU0sR0FBRyxHQUFHLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDeEYsRUFBRSxLQUFLLENBQUE7SUFDVCxPQUFPLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBO0FBQ3BDLENBQUM7QUFFRCxTQUFnQix5QkFBeUIsQ0FDdkMsYUFXb0IsRUFDcEIsTUFBdUU7SUFFdkUsSUFBSSxDQUFDLGFBQWE7UUFBRSxPQUFPLElBQUksQ0FBQTtJQUUvQixNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFBO0lBQ2xDLE1BQU0sU0FBUyxHQUFHLENBQUMsYUFBYSxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxPQUFPLENBQUE7SUFDbkUsTUFBTSxRQUFRLEdBQUcsQ0FBQyxJQUFJLEVBQUUsU0FBUyxJQUFJLEVBQUUsQ0FB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
@@ -0,0 +1,265 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.capPosInventoryAdd = capPosInventoryAdd;
4
+ exports.availabilityFromVariantRow = availabilityFromVariantRow;
5
+ exports.loadPosVariantAvailability = loadPosVariantAvailability;
6
+ exports.findPosInventoryShortage = findPosInventoryShortage;
7
+ exports.stampCartInventory = stampCartInventory;
8
+ const utils_1 = require("@medusajs/framework/utils");
9
+ const pos_draft_edit_1 = require("./pos-draft-edit");
10
+ function isRecord(value) {
11
+ return Boolean(value && typeof value === "object" && !Array.isArray(value));
12
+ }
13
+ function asBool(value, fallback) {
14
+ if (typeof value === "boolean")
15
+ return value;
16
+ if (value === "true" || value === "t" || value === 1)
17
+ return true;
18
+ if (value === "false" || value === "f" || value === 0)
19
+ return false;
20
+ return fallback;
21
+ }
22
+ function levelsFromUnknown(value) {
23
+ if (Array.isArray(value)) {
24
+ return value.filter(isRecord);
25
+ }
26
+ if (isRecord(value) && Array.isArray(value.location_levels)) {
27
+ return value.location_levels.filter(isRecord);
28
+ }
29
+ return [];
30
+ }
31
+ function availableFromLevel(level) {
32
+ if (!level)
33
+ return 0;
34
+ if (level.available_quantity != null)
35
+ return Math.max(0, Math.floor((0, pos_draft_edit_1.toAmount)(level.available_quantity)));
36
+ const stocked = (0, pos_draft_edit_1.toAmount)(level.stocked_quantity);
37
+ const reserved = (0, pos_draft_edit_1.toAmount)(level.reserved_quantity);
38
+ return Math.max(0, Math.floor(stocked - reserved));
39
+ }
40
+ function capPosInventoryAdd(input) {
41
+ const existingQty = Math.max(0, Math.floor(input.existingQty || 0));
42
+ const requestedAdd = Math.max(0, Math.floor(input.requestedAdd || 0));
43
+ if (requestedAdd <= 0) {
44
+ return {
45
+ allowedAdd: 0,
46
+ targetQty: existingQty,
47
+ capped: false,
48
+ blocked: false,
49
+ available: input.available,
50
+ };
51
+ }
52
+ if (!input.manageInventory || input.allowBackorder || input.available == null) {
53
+ return {
54
+ allowedAdd: requestedAdd,
55
+ targetQty: existingQty + requestedAdd,
56
+ capped: false,
57
+ blocked: false,
58
+ available: input.available,
59
+ };
60
+ }
61
+ const available = Math.max(0, Math.floor(input.available));
62
+ const remaining = Math.max(0, available - existingQty);
63
+ const allowedAdd = Math.min(requestedAdd, remaining);
64
+ return {
65
+ allowedAdd,
66
+ targetQty: existingQty + allowedAdd,
67
+ capped: allowedAdd < requestedAdd,
68
+ blocked: allowedAdd === 0,
69
+ available,
70
+ };
71
+ }
72
+ function availabilityFromVariantRow(row, locationId) {
73
+ const manageInventory = asBool(row.manage_inventory, true);
74
+ const allowBackorder = asBool(row.allow_backorder, false);
75
+ const links = Array.isArray(row.inventory_items) ? row.inventory_items.filter(isRecord) : [];
76
+ const levels = links.flatMap((link) => {
77
+ const inventory = isRecord(link.inventory) ? link.inventory : link;
78
+ return levelsFromUnknown(inventory.location_levels ?? inventory);
79
+ });
80
+ const atLocation = locationId
81
+ ? levels.find((level) => String(level.location_id || "") === locationId)
82
+ : undefined;
83
+ let available = null;
84
+ if (atLocation) {
85
+ available = availableFromLevel(atLocation);
86
+ }
87
+ else if (locationId && levels.length > 0) {
88
+ available = 0;
89
+ }
90
+ else if (levels.length > 0) {
91
+ available = levels.reduce((sum, level) => sum + availableFromLevel(level), 0);
92
+ }
93
+ else if (row.inventory_quantity != null) {
94
+ available = Math.max(0, Math.floor((0, pos_draft_edit_1.toAmount)(row.inventory_quantity)));
95
+ }
96
+ return {
97
+ manage_inventory: manageInventory,
98
+ allow_backorder: allowBackorder,
99
+ available,
100
+ };
101
+ }
102
+ async function loadPosVariantAvailability(scope, variantIds, locationId) {
103
+ const result = new Map();
104
+ const ids = Array.from(new Set(variantIds.filter(Boolean)));
105
+ if (!ids.length)
106
+ return result;
107
+ const query = scope.resolve(utils_1.ContainerRegistrationKeys.QUERY);
108
+ try {
109
+ const { data = [] } = await query.graph({
110
+ entity: "product_variant",
111
+ fields: [
112
+ "id",
113
+ "manage_inventory",
114
+ "allow_backorder",
115
+ "inventory_quantity",
116
+ "inventory_items.inventory_item_id",
117
+ "inventory_items.inventory.id",
118
+ "inventory_items.inventory.location_levels.location_id",
119
+ "inventory_items.inventory.location_levels.available_quantity",
120
+ "inventory_items.inventory.location_levels.stocked_quantity",
121
+ "inventory_items.inventory.location_levels.reserved_quantity",
122
+ ],
123
+ filters: { id: ids },
124
+ });
125
+ for (const row of Array.isArray(data) ? data : []) {
126
+ if (!isRecord(row) || typeof row.id !== "string")
127
+ continue;
128
+ result.set(row.id, availabilityFromVariantRow(row, locationId));
129
+ }
130
+ const unresolved = ids.filter((id) => {
131
+ const stock = result.get(id);
132
+ return stock?.manage_inventory !== false && stock?.available == null;
133
+ });
134
+ if (locationId && unresolved.length) {
135
+ const itemIds = (Array.isArray(data) ? data : [])
136
+ .filter((row) => isRecord(row) && unresolved.includes(String(row.id)))
137
+ .flatMap((row) => {
138
+ const links = Array.isArray(row.inventory_items)
139
+ ? row.inventory_items
140
+ : [];
141
+ return links
142
+ .filter(isRecord)
143
+ .map((link) => typeof link.inventory_item_id === "string"
144
+ ? link.inventory_item_id
145
+ : isRecord(link.inventory) && typeof link.inventory.id === "string"
146
+ ? link.inventory.id
147
+ : "")
148
+ .filter(Boolean);
149
+ });
150
+ if (itemIds.length) {
151
+ try {
152
+ const levels = await query.graph({
153
+ entity: "inventory_level",
154
+ fields: [
155
+ "inventory_item_id",
156
+ "location_id",
157
+ "available_quantity",
158
+ "stocked_quantity",
159
+ "reserved_quantity",
160
+ ],
161
+ filters: {
162
+ location_id: locationId,
163
+ inventory_item_id: itemIds,
164
+ },
165
+ });
166
+ const byItem = new Map();
167
+ for (const level of Array.isArray(levels.data) ? levels.data : []) {
168
+ if (!isRecord(level) || typeof level.inventory_item_id !== "string")
169
+ continue;
170
+ if (String(level.location_id || "") !== locationId)
171
+ continue;
172
+ const available = level.available_quantity != null
173
+ ? Math.max(0, Math.floor((0, pos_draft_edit_1.toAmount)(level.available_quantity)))
174
+ : Math.max(0, Math.floor((0, pos_draft_edit_1.toAmount)(level.stocked_quantity) - (0, pos_draft_edit_1.toAmount)(level.reserved_quantity)));
175
+ byItem.set(level.inventory_item_id, available);
176
+ }
177
+ for (const row of Array.isArray(data) ? data : []) {
178
+ if (!isRecord(row) || typeof row.id !== "string")
179
+ continue;
180
+ const current = result.get(row.id);
181
+ if (!current || current.available != null)
182
+ continue;
183
+ const links = Array.isArray(row.inventory_items) ? row.inventory_items.filter(isRecord) : [];
184
+ let available = null;
185
+ for (const link of links) {
186
+ const itemId = typeof link.inventory_item_id === "string"
187
+ ? link.inventory_item_id
188
+ : isRecord(link.inventory) && typeof link.inventory.id === "string"
189
+ ? link.inventory.id
190
+ : "";
191
+ if (itemId && byItem.has(itemId)) {
192
+ available = (available || 0) + (byItem.get(itemId) || 0);
193
+ }
194
+ }
195
+ if (available != null) {
196
+ result.set(row.id, { ...current, available });
197
+ }
198
+ }
199
+ }
200
+ catch (error) {
201
+ console.warn("[pos inventory] inventory_level fallback failed", error);
202
+ }
203
+ }
204
+ }
205
+ }
206
+ catch (error) {
207
+ console.warn("[pos inventory] variant availability query failed", error);
208
+ }
209
+ return result;
210
+ }
211
+ function findPosInventoryShortage(items, availability) {
212
+ for (const item of items) {
213
+ const variantId = typeof item.variant_id === "string"
214
+ ? item.variant_id
215
+ : typeof item.variant?.id === "string"
216
+ ? item.variant.id
217
+ : "";
218
+ if (!variantId)
219
+ continue;
220
+ const stock = availability.get(variantId);
221
+ if (!stock || stock.manage_inventory === false || stock.allow_backorder)
222
+ continue;
223
+ const requested = Math.max(0, Math.floor((0, pos_draft_edit_1.toAmount)(item.quantity)));
224
+ const cap = capPosInventoryAdd({
225
+ existingQty: 0,
226
+ requestedAdd: requested,
227
+ manageInventory: true,
228
+ allowBackorder: false,
229
+ available: stock.available,
230
+ });
231
+ if (requested > 0 && cap.allowedAdd < requested) {
232
+ return {
233
+ variant_id: variantId,
234
+ requested_qty: requested,
235
+ allowed_qty: cap.allowedAdd,
236
+ available: cap.available,
237
+ };
238
+ }
239
+ }
240
+ return null;
241
+ }
242
+ function stampCartInventory(order, availability) {
243
+ if (!order || !Array.isArray(order.items))
244
+ return order;
245
+ return {
246
+ ...order,
247
+ items: order.items.map((item) => {
248
+ const variantId = typeof item.variant_id === "string" ? item.variant_id : item.variant?.id;
249
+ const stock = variantId ? availability.get(variantId) : undefined;
250
+ if (!stock)
251
+ return item;
252
+ return {
253
+ ...item,
254
+ variant: {
255
+ ...(item.variant || {}),
256
+ id: item.variant?.id || variantId,
257
+ manage_inventory: stock.manage_inventory,
258
+ allow_backorder: stock.allow_backorder,
259
+ ...(stock.available != null ? { inventory_quantity: stock.available } : {}),
260
+ },
261
+ };
262
+ }),
263
+ };
264
+ }
265
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zLWludmVudG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9wb3MtaW52ZW50b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBOERBLGdEQWtDQztBQUVELGdFQWdDQztBQUVELGdFQThHQztBQUVELDREQWdDQztBQUVELGdEQXVCQztBQTVTRCxxREFBcUU7QUFDckUscURBQTJDO0FBK0IzQyxTQUFTLFFBQVEsQ0FBQyxLQUFjO0lBQzlCLE9BQU8sT0FBTyxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7QUFDN0UsQ0FBQztBQUVELFNBQVMsTUFBTSxDQUFDLEtBQWMsRUFBRSxRQUFpQjtJQUMvQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFNBQVM7UUFBRSxPQUFPLEtBQUssQ0FBQTtJQUM1QyxJQUFJLEtBQUssS0FBSyxNQUFNLElBQUksS0FBSyxLQUFLLEdBQUcsSUFBSSxLQUFLLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFBO0lBQ2pFLElBQUksS0FBSyxLQUFLLE9BQU8sSUFBSSxLQUFLLEtBQUssR0FBRyxJQUFJLEtBQUssS0FBSyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFDbkUsT0FBTyxRQUFRLENBQUE7QUFDakIsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMsS0FBYztJQUN2QyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QixPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDL0IsQ0FBQztJQUNELElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7UUFDNUQsT0FBTyxLQUFLLENBQUMsZUFBZSxDQUFD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