order-management 0.0.82 → 0.0.84
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.
- package/.medusa/server/src/admin/index.js +668 -668
- package/.medusa/server/src/admin/index.mjs +669 -669
- package/.medusa/server/src/api/admin/return/[id]/reject/route.js +6 -2
- package/.medusa/server/src/api/admin/swaps/[id]/cancel/route.js +5 -1
- package/.medusa/server/src/api/admin/swaps/[id]/reject/route.js +5 -1
- package/.medusa/server/src/api/store/guest-orders/[id]/returns/route.js +56 -41
- package/.medusa/server/src/api/store/guest-orders/[id]/swaps/[swap_id]/cancel/route.js +3 -1
- package/.medusa/server/src/api/store/guest-orders/[id]/swaps/route.js +25 -15
- package/.medusa/server/src/api/store/returns/[id]/cancel/route.js +3 -1
- package/.medusa/server/src/api/store/returns/route.js +24 -19
- package/.medusa/server/src/api/store/swaps/[id]/cancel/route.js +5 -1
- package/.medusa/server/src/api/store/swaps/route.js +26 -15
- package/.medusa/server/src/helpers/index.js +2 -1
- package/.medusa/server/src/helpers/return-exchange-guard.js +129 -0
- package/.medusa/server/src/modules/order-rma-gate/constants.js +21 -0
- package/.medusa/server/src/modules/order-rma-gate/index.js +20 -0
- package/.medusa/server/src/modules/order-rma-gate/migrations/Migration20260724100000.js +34 -0
- package/.medusa/server/src/modules/order-rma-gate/models/order-rma-gate.js +11 -0
- package/.medusa/server/src/modules/order-rma-gate/service.js +202 -0
- package/.medusa/server/src/modules/order-rma-gate/stale-reclaim.js +18 -0
- package/.medusa/server/src/modules/order-rma-gate/types.js +3 -0
- package/.medusa/server/src/subscribers/order-return-received.js +45 -0
- package/.medusa/server/src/utils/notification-handler.js +13 -5
- package/.medusa/server/src/utils/phone-e164.js +66 -0
- package/README.md +13 -4
- package/package.json +4 -2
|
@@ -0,0 +1,202 @@
|
|
|
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
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
7
|
+
const crypto_1 = require("crypto");
|
|
8
|
+
const order_rma_gate_1 = __importDefault(require("./models/order-rma-gate"));
|
|
9
|
+
const constants_1 = require("./constants");
|
|
10
|
+
const stale_reclaim_1 = require("./stale-reclaim");
|
|
11
|
+
function isUniqueViolation(error) {
|
|
12
|
+
if (!error || typeof error !== "object") {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
const e = error;
|
|
16
|
+
if (e.code === "23505") {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
const msg = `${e.message ?? ""} ${e.name ?? ""}`.toLowerCase();
|
|
20
|
+
return msg.includes("unique") || msg.includes("duplicate");
|
|
21
|
+
}
|
|
22
|
+
function newGateId() {
|
|
23
|
+
return `orgate_${(0, crypto_1.randomUUID)().replace(/-/g, "")}`;
|
|
24
|
+
}
|
|
25
|
+
class OrderRmaGateModuleService extends (0, utils_1.MedusaService)({
|
|
26
|
+
OrderRmaGate: order_rma_gate_1.default,
|
|
27
|
+
}) {
|
|
28
|
+
constructor(container) {
|
|
29
|
+
super(container);
|
|
30
|
+
this.manager_ = container.manager;
|
|
31
|
+
}
|
|
32
|
+
get moduleKey() {
|
|
33
|
+
return constants_1.ORDER_RMA_GATE_MODULE;
|
|
34
|
+
}
|
|
35
|
+
normalize(raw) {
|
|
36
|
+
if (!raw || typeof raw !== "object" || !("id" in raw) || !("order_id" in raw)) {
|
|
37
|
+
throw new Error("Invalid order_rma_gate data");
|
|
38
|
+
}
|
|
39
|
+
const row = raw;
|
|
40
|
+
const kind = row.kind === "exchange" ? "exchange" : "return";
|
|
41
|
+
return {
|
|
42
|
+
id: row.id,
|
|
43
|
+
order_id: row.order_id,
|
|
44
|
+
kind,
|
|
45
|
+
reference_id: row.reference_id ?? null,
|
|
46
|
+
created_at: new Date(row.created_at ?? new Date()),
|
|
47
|
+
updated_at: new Date(row.updated_at ?? new Date()),
|
|
48
|
+
deleted_at: row.deleted_at ? new Date(row.deleted_at) : null,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
getKnex() {
|
|
52
|
+
const manager = this.manager_;
|
|
53
|
+
if (typeof manager.getKnex !== "function") {
|
|
54
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "EntityManager.getKnex is unavailable for order_rma_gate");
|
|
55
|
+
}
|
|
56
|
+
return manager.getKnex();
|
|
57
|
+
}
|
|
58
|
+
async getActiveByOrderId(orderId) {
|
|
59
|
+
const knex = this.getKnex();
|
|
60
|
+
const row = await knex("order_rma_gate")
|
|
61
|
+
.where({ order_id: orderId })
|
|
62
|
+
.whereNull("deleted_at")
|
|
63
|
+
.first();
|
|
64
|
+
return row ? this.normalize(row) : null;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Insert a gate for the order. On unique conflict, attempt atomic stale reclaim
|
|
68
|
+
* via SELECT … FOR UPDATE in a single transaction.
|
|
69
|
+
*/
|
|
70
|
+
async acquire(orderId, kind, hasActiveMedusaRma, now = new Date()) {
|
|
71
|
+
const knex = this.getKnex();
|
|
72
|
+
const id = newGateId();
|
|
73
|
+
const stamp = now;
|
|
74
|
+
try {
|
|
75
|
+
await knex("order_rma_gate").insert({
|
|
76
|
+
id,
|
|
77
|
+
order_id: orderId,
|
|
78
|
+
kind,
|
|
79
|
+
reference_id: null,
|
|
80
|
+
created_at: stamp,
|
|
81
|
+
updated_at: stamp,
|
|
82
|
+
deleted_at: null,
|
|
83
|
+
});
|
|
84
|
+
const gate = await this.getActiveByOrderId(orderId);
|
|
85
|
+
if (!gate) {
|
|
86
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, "Gate insert succeeded but row not found");
|
|
87
|
+
}
|
|
88
|
+
return { ok: true, gate };
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
if (!isUniqueViolation(error)) {
|
|
92
|
+
throw error;
|
|
93
|
+
}
|
|
94
|
+
return this.reclaimStaleOrConflict(orderId, kind, hasActiveMedusaRma, now);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Atomic reclaim: lock existing live gate, evaluate staleness, soft-delete + insert
|
|
99
|
+
* in the same transaction so concurrent reclaimers cannot both win.
|
|
100
|
+
*/
|
|
101
|
+
async reclaimStaleOrConflict(orderId, kind, hasActiveMedusaRma, now) {
|
|
102
|
+
const knex = this.getKnex();
|
|
103
|
+
const conflictMessage = "This order already has an active return or exchange in progress. Cancel or complete the existing one before creating a new request.";
|
|
104
|
+
return knex.transaction(async (trx) => {
|
|
105
|
+
const locked = await trx("order_rma_gate")
|
|
106
|
+
.where({ order_id: orderId })
|
|
107
|
+
.whereNull("deleted_at")
|
|
108
|
+
.forUpdate()
|
|
109
|
+
.first();
|
|
110
|
+
if (!locked) {
|
|
111
|
+
// Previous holder released between unique violation and lock — insert fresh
|
|
112
|
+
const id = newGateId();
|
|
113
|
+
await trx("order_rma_gate").insert({
|
|
114
|
+
id,
|
|
115
|
+
order_id: orderId,
|
|
116
|
+
kind,
|
|
117
|
+
reference_id: null,
|
|
118
|
+
created_at: now,
|
|
119
|
+
updated_at: now,
|
|
120
|
+
deleted_at: null,
|
|
121
|
+
});
|
|
122
|
+
return {
|
|
123
|
+
ok: true,
|
|
124
|
+
gate: this.normalize({
|
|
125
|
+
id,
|
|
126
|
+
order_id: orderId,
|
|
127
|
+
kind,
|
|
128
|
+
reference_id: null,
|
|
129
|
+
created_at: now,
|
|
130
|
+
updated_at: now,
|
|
131
|
+
deleted_at: null,
|
|
132
|
+
}),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
const existing = this.normalize(locked);
|
|
136
|
+
const medusaActive = await hasActiveMedusaRma();
|
|
137
|
+
const decision = (0, stale_reclaim_1.evaluateStaleGateReclaim)({
|
|
138
|
+
gateCreatedAt: existing.created_at,
|
|
139
|
+
referenceId: existing.reference_id,
|
|
140
|
+
hasActiveMedusaRma: medusaActive,
|
|
141
|
+
now,
|
|
142
|
+
staleTtlMs: constants_1.STALE_GATE_TTL_MS,
|
|
143
|
+
});
|
|
144
|
+
if (decision !== "reclaim") {
|
|
145
|
+
return { ok: false, message: conflictMessage, type: "NOT_ALLOWED" };
|
|
146
|
+
}
|
|
147
|
+
await trx("order_rma_gate")
|
|
148
|
+
.where({ id: existing.id })
|
|
149
|
+
.update({
|
|
150
|
+
deleted_at: now,
|
|
151
|
+
updated_at: now,
|
|
152
|
+
});
|
|
153
|
+
const newId = newGateId();
|
|
154
|
+
await trx("order_rma_gate").insert({
|
|
155
|
+
id: newId,
|
|
156
|
+
order_id: orderId,
|
|
157
|
+
kind,
|
|
158
|
+
reference_id: null,
|
|
159
|
+
created_at: now,
|
|
160
|
+
updated_at: now,
|
|
161
|
+
deleted_at: null,
|
|
162
|
+
});
|
|
163
|
+
return {
|
|
164
|
+
ok: true,
|
|
165
|
+
gate: this.normalize({
|
|
166
|
+
id: newId,
|
|
167
|
+
order_id: orderId,
|
|
168
|
+
kind,
|
|
169
|
+
reference_id: null,
|
|
170
|
+
created_at: now,
|
|
171
|
+
updated_at: now,
|
|
172
|
+
deleted_at: null,
|
|
173
|
+
}),
|
|
174
|
+
};
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
async release(orderId) {
|
|
178
|
+
const knex = this.getKnex();
|
|
179
|
+
const now = new Date();
|
|
180
|
+
await knex("order_rma_gate")
|
|
181
|
+
.where({ order_id: orderId })
|
|
182
|
+
.whereNull("deleted_at")
|
|
183
|
+
.update({
|
|
184
|
+
deleted_at: now,
|
|
185
|
+
updated_at: now,
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
async setReference(orderId, referenceId) {
|
|
189
|
+
const knex = this.getKnex();
|
|
190
|
+
const now = new Date();
|
|
191
|
+
await knex("order_rma_gate")
|
|
192
|
+
.where({ order_id: orderId })
|
|
193
|
+
.whereNull("deleted_at")
|
|
194
|
+
.update({
|
|
195
|
+
reference_id: referenceId,
|
|
196
|
+
updated_at: now,
|
|
197
|
+
});
|
|
198
|
+
return this.getActiveByOrderId(orderId);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
exports.default = OrderRmaGateModuleService;
|
|
202
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL29yZGVyLXJtYS1nYXRlL3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxREFBc0U7QUFFdEUsbUNBQW1DO0FBQ25DLDZFQUFrRDtBQUNsRCwyQ0FJb0I7QUFFcEIsbURBR3dCO0FBd0J4QixTQUFTLGlCQUFpQixDQUFDLEtBQWM7SUFDdkMsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN4QyxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7SUFDRCxNQUFNLENBQUMsR0FBRyxLQUEyRCxDQUFBO0lBQ3JFLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUN2QixPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFDRCxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxPQUFPLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDOUQsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUE7QUFDNUQsQ0FBQztBQUVELFNBQVMsU0FBUztJQUNoQixPQUFPLFVBQVUsSUFBQSxtQkFBVSxHQUFFLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFBO0FBQ25ELENBQUM7QUFFRCxNQUFxQix5QkFBMEIsU0FBUSxJQUFBLHFCQUFhLEVBQUM7SUFDbkUsWUFBWSxFQUFaLHdCQUFZO0NBQ2IsQ0FBQztJQUdBLFlBQVksU0FBK0I7UUFDekMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ2hCLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQTtJQUNu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
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.evaluateStaleGateReclaim = evaluateStaleGateReclaim;
|
|
4
|
+
function evaluateStaleGateReclaim(input) {
|
|
5
|
+
if (input.hasActiveMedusaRma) {
|
|
6
|
+
return "conflict";
|
|
7
|
+
}
|
|
8
|
+
const ageMs = input.now.getTime() - input.gateCreatedAt.getTime();
|
|
9
|
+
if (input.referenceId == null || input.referenceId === "") {
|
|
10
|
+
if (ageMs >= input.staleTtlMs) {
|
|
11
|
+
return "reclaim";
|
|
12
|
+
}
|
|
13
|
+
return "conflict";
|
|
14
|
+
}
|
|
15
|
+
// reference_id set but Medusa reports no active RMA → orphan / terminal entity
|
|
16
|
+
return "reclaim";
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhbGUtcmVjbGFpbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9tb2R1bGVzL29yZGVyLXJtYS1nYXRlL3N0YWxlLXJlY2xhaW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFhQSw0REFrQkM7QUFsQkQsU0FBZ0Isd0JBQXdCLENBQ3RDLEtBQW9DO0lBRXBDLElBQUksS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDN0IsT0FBTyxVQUFVLENBQUE7SUFDbkIsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUVqRSxJQUFJLEtBQUssQ0FBQyxXQUFXLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxXQUFXLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDMUQsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzlCLE9BQU8sU0FBUyxDQUFBO1FBQ2xCLENBQUM7UUFDRCxPQUFPLFVBQVUsQ0FBQTtJQUNuQixDQUFDO0lBRUQsK0VBQStFO0lBQy9FLE9BQU8sU0FBUyxDQUFBO0FBQ2xCLENBQUMifQ==
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9vcmRlci1ybWEtZ2F0ZS90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.config = void 0;
|
|
4
|
+
exports.default = orderReturnReceivedHandler;
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
const return_exchange_guard_1 = require("../helpers/return-exchange-guard");
|
|
7
|
+
/**
|
|
8
|
+
* Unlock the order RMA gate when a return is actually received.
|
|
9
|
+
*
|
|
10
|
+
* Note: older Medusa `createAndCompleteReturnOrderWorkflow` may emit
|
|
11
|
+
* `order.return_received` even when `receive_now` is false. We only release
|
|
12
|
+
* when the return entity status is `received`.
|
|
13
|
+
*/
|
|
14
|
+
async function orderReturnReceivedHandler({ event, container, }) {
|
|
15
|
+
const data = event.data ?? {};
|
|
16
|
+
const returnId = data.return_id ?? data.id;
|
|
17
|
+
try {
|
|
18
|
+
const orderModule = container.resolve(utils_1.Modules.ORDER);
|
|
19
|
+
let orderId = data.order_id;
|
|
20
|
+
let status;
|
|
21
|
+
if (returnId) {
|
|
22
|
+
const ret = await orderModule.retrieveReturn(returnId).catch(() => null);
|
|
23
|
+
if (!ret) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
orderId = orderId ?? ret.order_id;
|
|
27
|
+
status = ret.status;
|
|
28
|
+
}
|
|
29
|
+
if (!orderId) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
// Only unlock on true received status (not spurious REQUESTED-time emits)
|
|
33
|
+
if (status !== "received") {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
await (0, return_exchange_guard_1.releaseOrderRmaGate)(orderId, container);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
console.error(`[order.return_received] Failed to release RMA gate:`, error);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
exports.config = {
|
|
43
|
+
event: "order.return_received",
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItcmV0dXJuLXJlY2VpdmVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3N1YnNjcmliZXJzL29yZGVyLXJldHVybi1yZWNlaXZlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFrQkEsNkNBcUNDO0FBdERELHFEQUFtRDtBQUVuRCw0RUFBc0U7QUFRdEU7Ozs7OztHQU1HO0FBQ1ksS0FBSyxVQUFVLDBCQUEwQixDQUFDLEVBQ3ZELEtBQUssRUFDTCxTQUFTLEdBQytCO0lBQ3hDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFBO0lBQzdCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQTtJQUUxQyxJQUFJLENBQUM7UUFDSCxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFzQixlQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDekUsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQTtRQUMzQixJQUFJLE1BQTBCLENBQUE7UUFFOUIsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLE1BQU0sR0FBRyxHQUFHLE1BQU0sV0FBVyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDeEUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNULE9BQU07WUFDUixDQUFDO1lBQ0QsT0FBTyxHQUFHLE9BQU8sSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFBO1lBQ2pDLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFBO1FBQ3JCLENBQUM7UUFFRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixPQUFNO1FBQ1IsQ0FBQztRQUVELDBFQUEwRTtRQUMxRSxJQUFJLE1BQU0sS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUMxQixPQUFNO1FBQ1IsQ0FBQztRQUVELE1BQU0sSUFBQSwyQ0FBbUIsRUFBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUE7SUFDL0MsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixPQUFPLENBQUMsS0FBSyxDQUNYLHFEQUFxRCxFQUNyRCxLQUFLLENBQ04sQ0FBQTtJQUNILENBQUM7QUFDSCxDQUFDO0FBRVksUUFBQSxNQUFNLEdBQXFCO0lBQ3RDLEtBQUssRUFBRSx1QkFBdUI7Q0FDL0IsQ0FBQSJ9
|
|
@@ -6,6 +6,7 @@ const template_1 = require("./template");
|
|
|
6
6
|
const send_notification_step_1 = require("../workflows/steps/send-notification-step");
|
|
7
7
|
const config_1 = require("../config");
|
|
8
8
|
const email_branding_1 = require("./email-branding");
|
|
9
|
+
const phone_e164_1 = require("./phone-e164");
|
|
9
10
|
/** Max length for FCM notification body to avoid "Android message is too big" (payload limit ~4KB). */
|
|
10
11
|
const PUSH_BODY_MAX_LENGTH = 200;
|
|
11
12
|
/**
|
|
@@ -174,6 +175,10 @@ function buildSmsPayload(to, text) {
|
|
|
174
175
|
* Sends payload with text in every possible field (text, body, content, data.text) so the Twilio adapter receives it.
|
|
175
176
|
*/
|
|
176
177
|
const smsChannelHandler = async (recipient, message, templateData, container) => {
|
|
178
|
+
const e164 = (0, phone_e164_1.normalizeToE164)(recipient);
|
|
179
|
+
if (!e164) {
|
|
180
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `SMS recipient is not a valid phone number (need E.164). Got: ${String(recipient).slice(0, 16)}`);
|
|
181
|
+
}
|
|
177
182
|
const text = ensureSmsText(message, templateData);
|
|
178
183
|
if (!text || text.length === 0) {
|
|
179
184
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "SMS text is empty after fallback; cannot send.");
|
|
@@ -182,7 +187,7 @@ const smsChannelHandler = async (recipient, message, templateData, container) =>
|
|
|
182
187
|
if (!notificationService) {
|
|
183
188
|
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Notification service is not configured.");
|
|
184
189
|
}
|
|
185
|
-
const payload = buildSmsPayload(
|
|
190
|
+
const payload = buildSmsPayload(e164, text);
|
|
186
191
|
try {
|
|
187
192
|
if (typeof notificationService.create === "function") {
|
|
188
193
|
await notificationService.create(payload);
|
|
@@ -258,12 +263,15 @@ const emailRecipientResolver = (order) => {
|
|
|
258
263
|
return email && typeof email === "string" && email.includes("@") ? email : undefined;
|
|
259
264
|
};
|
|
260
265
|
/**
|
|
261
|
-
* SMS recipient resolver
|
|
266
|
+
* SMS recipient resolver — prefer shipping phone, fall back to billing.
|
|
267
|
+
* Normalize to E.164 so Twilio/MSG91 accept local Indian numbers.
|
|
262
268
|
*/
|
|
263
269
|
const smsRecipientResolver = (order) => {
|
|
264
270
|
const shippingAddress = order.shipping_address;
|
|
265
|
-
const
|
|
266
|
-
|
|
271
|
+
const billingAddress = order.billing_address;
|
|
272
|
+
const raw = shippingAddress?.phone ||
|
|
273
|
+
billingAddress?.phone;
|
|
274
|
+
return (0, phone_e164_1.normalizeToE164)(raw) ?? undefined;
|
|
267
275
|
};
|
|
268
276
|
/**
|
|
269
277
|
* Push notification recipient resolver.
|
|
@@ -421,4 +429,4 @@ async function handleOrderStatusNotifications(orderId, newStatus, container) {
|
|
|
421
429
|
// Don't throw - notification errors shouldn't break order flow
|
|
422
430
|
}
|
|
423
431
|
}
|
|
424
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLWhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvbm90aWZpY2F0aW9uLWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE0YkEsd0VBZ0pDO0FBM2tCRCxxREFBMkY7QUFDM0YseUNBS21CO0FBQ25CLHNGQUE0RTtBQUM1RSxzQ0FBaUY7QUFFakYscURBQW9EO0FBcUJwRCx1R0FBdUc7QUFDdkcsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLENBQUE7QUFFaEM7O0dBRUc7QUFDSCxTQUFTLG1CQUFtQixDQUFDLEtBQThCO0lBQ3pELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUE7SUFDN0IsSUFBSSxXQUFvQixDQUFBO0lBQ3hCLElBQUksT0FBTyxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzNDLE1BQU0sQ0FBQyxHQUFHLE9BQWtDLENBQUE7UUFDNUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLENBQUMsZ0JBQWdCLENBQUE7SUFDM0QsQ0FBQztJQUVELE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLFdBQVcsSUFBSSxXQUFXLENBQUE7SUFDM0QsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN0QyxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7SUFDRCxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN2RCxPQUFPLEdBQUcsQ0FBQTtJQUNaLENBQUM7SUFDRCxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzVCLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3BCLENBQUM7SUFDRCxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzVCLE1BQU0sQ0FBQyxHQUFHLEdBQThCLENBQUE7UUFDeEMsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDbEMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFBO1FBQ2xCLENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNoQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUE7UUFDaEIsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2hDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQTtRQUNoQixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVELDRGQUE0RjtBQUM1RixTQUFTLGFBQWEsQ0FDcEIsWUFBK0IsRUFDL0IsU0FBaUI7SUFFakIsTUFBTSxJQUFJLEdBQTRCO1FBQ3BDLEtBQUssRUFBRSxDQUFDLFlBQVksQ0FBQyxZQUFZLElBQUksU0FBUyxNQUFNLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsSUFBSSxjQUFjO1FBQ3BHLElBQUksRUFBRSxTQUFTO1FBQ2YsUUFBUSxFQUFFLFlBQVksQ0FBQyxRQUFRO1FBQy9CLFlBQVksRUFBRSxZQUFZLENBQUMsWUFBWTtLQUN4QyxDQUFBO0lBQ0QsSUFBSSxZQUFZLENBQUMsVUFBVSxLQUFLLFNBQVMsSUFBSSxZQUFZLENBQUMsVUFBVSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQzlFLElBQUksQ0FBQyxVQUFVLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQTtJQUMzQyxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FDMUIsRUFBVSxFQUNWLE9BQWUsRUFDZixPQUFlLEVBQ2YsWUFBK0I7SUFFL0IsTUFBTSxXQUFXLEdBQUcsT0FBTyxPQUFPLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQTtJQUU5RyxNQUFNLElBQUksR0FBRztRQUNYLEVBQUU7UUFDRixPQUFPO1FBQ1AsSUFBSSxFQUFFLFdBQVc7UUFDakIsSUFBSSxFQUFFO1lBQ0osT0FBTyxFQUFFLFdBQVc7WUFDcEIsR0FBRyxZQUFZO1NBQ2hCO0tBQ0YsQ0FBQTtJQUVELElBQUksT0FBTyxLQUFLLEtBQUssRUFBRSxDQUFDO1FBQ3RCLE9BQU87WUFDTCxHQUFHLElBQUk7WUFDUCxJQUFJLEVBQUUsV0FBVztZQUNqQixPQUFPLEVBQUUsV0FBVztZQUNwQixRQUFRLEVBQUUsV0FBVztZQUNyQixJQUFJLEVBQUU7Z0JBQ0osR0FBRyxJQUFJLENBQUMsSUFBSTtnQkFDWixJQUFJLEVBQUUsV0FBVztnQkFDakIsT0FBTyxFQUFFLFdBQVc7Z0JBQ3BCLElBQUksRUFBRSxXQUFXO2FBQ2xCO1NBQ0YsQ0FBQTtJQUNILENBQUM7SUFFRCxJQUFJLE9BQU8sS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUN2QixNQUFNLEtBQUssR0FDVCxDQUFDLFlBQVksQ0FBQyxZQUFZLElBQUksU0FBUyxNQUFNLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDM0UsY0FBYyxDQUFBO1FBQ2hCLE1BQU0sU0FBUyxHQUNiLFdBQVcsQ0FBQyxNQUFNLEdBQUcsb0JBQW9CO1lBQ3ZDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLG9CQUFvQixHQUFHLENBQUMsQ0FBQyxLQUFLO1lBQ3hELENBQUMsQ0FBQyxXQUFXLENBQUE7UUFDakIsTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQTtRQUNuRCxPQUFPO1lBQ0wsRUFBRTtZQUNGLE9BQU87WUFDUCxLQUFLO1lBQ0wsSUFBSSxFQUFFLFNBQVM7WUFDZixJQUFJO1NBQ0wsQ0FBQTtJQUNILENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFFRDs7R0FFRztBQUNILEtBQUssVUFBVSx1QkFBdUIsQ0FDcEMsRUFBVSxFQUNWLE9BQWUsRUFDZixPQUFlLEVBQ2YsWUFBK0IsRUFDL0IsU0FBd0I7SUFFeEIsTUFBTSxtQkFBbUIsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxZQUFZLENBR2pFLENBQUE7SUFFRCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUN6QixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5Qix5Q0FBeUMsQ0FDMUMsQ0FBQTtJQUNILENBQUM7SUFFRCxNQUFNLE9BQU8sR0FBRyxtQkFBbUIsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQTtJQUV2RSxJQUFJLENBQUM7UUFDSCxJQUFJLE9BQU8sbUJBQW1CLENBQUMsTUFBTSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ3JELE1BQU0sbUJBQW1CLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQzNDLENBQUM7YUFBTSxJQUFJLE9BQU8sbUJBQW1CLENBQUMsbUJBQW1CLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDekUsTUFBTSxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUE7UUFDMUQsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQ2xDLDhEQUE4RCxDQUMvRCxDQUFBO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUUsaUNBQWlDLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDakksTUFBTSxLQUFLLENBQUE7SUFDYixDQUFDO0FBQ0gsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxtQkFBbUIsR0FBbUIsS0FBSyxFQUMvQyxTQUFTLEVBQ1QsT0FBTyxFQUNQLFlBQVksRUFDWixTQUFTLEVBQ1QsRUFBRTtJQUNGLE1BQU0sSUFBQSx5Q0FBZ0IsRUFDcEI7UUFDRSxFQUFFLEVBQUUsU0FBUztRQUNiLE9BQU8sRUFBRSx5QkFBeUIsWUFBWSxDQUFDLFlBQVksRUFBRTtRQUM3RCxlQUFlLEVBQUUsT0FBTztRQUN4QixZQUFZO0tBQ2IsRUFDRCxTQUFTLENBQ1YsQ0FBQTtBQUNILENBQUMsQ0FBQTtBQUVEOzs7R0FHRztBQUNILFNBQVMsYUFBYSxDQUNwQixPQUFlLEVBQ2YsWUFBK0I7SUFFL0IsTUFBTSxPQUFPLEdBQUcsT0FBTyxPQUFPLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtJQUNqRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE9BQU8sT0FBTyxDQUFBO0lBQ3RDLE1BQU0sVUFBVSxHQUNkLFlBQVksQ0FBQyxVQUFVLEtBQUssU0FBUyxJQUFJLFlBQVksQ0FBQyxVQUFVLEtBQUssSUFBSSxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTtRQUN4SCxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsQ0FBQTtJQUN4QyxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsWUFBWSxJQUFJLFNBQVMsQ0FBQTtJQUNyRCxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO0lBQ3RGLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLFVBQVUsT0FBTyxNQUFNLFlBQVksS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsVUFBVSxPQUFPLE1BQU0sR0FBRyxDQUFBO0FBQzFHLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLGVBQWUsQ0FBQyxFQUFVLEVBQUUsSUFBWTtJQUMvQyxPQUFPO1FBQ0wsRUFBRTtRQUNGLE9BQU8sRUFBRSxLQUFLO1FBQ2QsSUFBSTtRQUNKLElBQUksRUFBRSxJQUFJO1FBQ1YsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFO1FBQ2pCLElBQUksRUFBRTtZQUNKLElBQUk7WUFDSixJQUFJLEVBQUUsSUFBSTtTQUNYO0tBQ0YsQ0FBQTtBQUNILENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLGlCQUFpQixHQUFtQixLQUFLLEVBQzdDLFNBQVMsRUFDVCxPQUFPLEVBQ1AsWUFBWSxFQUNaLFNBQVMsRUFDVCxFQUFFO0lBQ0YsTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQTtJQUNqRCxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDL0IsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsZ0RBQWdELENBQ2pELENBQUE7SUFDSCxDQUFDO0lBQ0QsTUFBTSxtQkFBbUIsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGVBQU8sQ0FBQyxZQUFZLENBR2pFLENBQUE7SUFDRCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUN6QixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5Qix5Q0FBeUMsQ0FDMUMsQ0FBQTtJQUNILENBQUM7SUFDRCxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ2hELElBQUksQ0FBQztRQUNILElBQUksT0FBTyxtQkFBbUIsQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDckQsTUFBTSxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDM0MsQ0FBQzthQUFNLElBQUksT0FBTyxtQkFBbUIsQ0FBQyxtQkFBbUIsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUN6RSxNQUFNLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQTtRQUMxRCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFDbEMsOERBQThELENBQy9ELENBQUE7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLHFDQUFxQyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQzVHLE1BQU0sS0FBSyxDQUFBO0lBQ2IsQ0FBQztBQUNILENBQUMsQ0FBQTtBQVVELE1BQU0seUJBQXlCLEdBQUcscUJBQXFCLENBQUE7QUFFdkQ7Ozs7O0dBS0c7QUFDSCxNQUFNLGtCQUFrQixHQUFtQixLQUFLLEVBQzlDLFNBQVMsRUFDVCxPQUFPLEVBQ1AsWUFBWSxFQUNaLFNBQVMsRUFDVCxFQUFFO0lBQ0YsSUFBSSxZQUFzRCxDQUFBO0lBQzFELElBQUksQ0FBQztRQUNILFlBQVksR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLHlCQUF5QixDQUFpQyxDQUFBO0lBQzdGLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxrRkFBa0Y7SUFDcEYsQ0FBQztJQUVELElBQUksQ0FBQyxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztRQUNyQyxPQUFNO0lBQ1IsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sWUFBWSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBRTlELElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDcEIsT0FBTTtJQUNSLENBQUM7SUFFRCxLQUFLLE1BQU0sTUFBTSxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzVCLElBQUksTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ2xCLE1BQU0sdUJBQXVCLENBQzNCLE1BQU0sQ0FBQyxLQUFLLEVBQ1osT0FBTyxFQUNQLE1BQU0sRUFDTixZQUFZLEVBQ1osU0FBUyxDQUNWLENBQUE7UUFDSCxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUMsQ0FBQTtBQUVEOztHQUVHO0FBQ0gsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLE9BQWUsRUFBa0IsRUFBRTtJQUNoRSxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsRUFBRTtRQUMzRCxNQUFNLHVCQUF1QixDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUNyRixDQUFDLENBQUE7QUFDSCxDQUFDLENBQUE7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLGVBQWUsR0FBbUM7SUFDdEQsS0FBSyxFQUFFLG1CQUFtQjtJQUMxQixHQUFHLEVBQUUsaUJBQWlCO0lBQ3RCLElBQUksRUFBRSxrQkFBa0I7Q0FDekIsQ0FBQTtBQUVEOztHQUVHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxPQUFlO0lBQ3hDLE9BQU8sZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFBO0FBQ25FLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sc0JBQXNCLEdBQXNCLENBQUMsS0FBSyxFQUFFLEVBQUU7SUFDMUQsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQTJCLENBQUE7SUFDL0MsT0FBTyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO0FBQ3RGLENBQUMsQ0FBQTtBQUVEOztHQUVHO0FBQ0gsTUFBTSxvQkFBb0IsR0FBc0IsQ0FBQyxLQUFLLEVBQUUsRUFBRTtJQUN4RCxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsZ0JBQXVELENBQUE7SUFDckYsTUFBTSxXQUFXLEdBQUcsZUFBZSxFQUFFLEtBQTJCLENBQUE7SUFDaEUsT0FBTyxXQUFXLENBQUE7QUFDcEIsQ0FBQyxDQUFBO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxxQkFBcUIsR0FBc0IsQ0FBQyxLQUFLLEVBQUUsRUFBRTtJQUN6RCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsV0FBaUMsQ0FBQTtJQUMxRCxPQUFPLFVBQVUsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO0FBQzlFLENBQUMsQ0FBQTtBQUVEOzs7R0FHRztBQUNILE1BQU0sa0JBQWtCLEdBQXNDO0lBQzVELEtBQUssRUFBRSxzQkFBc0I7SUFDN0IsR0FBRyxFQUFFLG9CQUFvQjtJQUN6QixJQUFJLEVBQUUscUJBQXFCO0NBQzVCLENBQUE7QUFFRDs7R0FFRztBQUNILFNBQVMsb0JBQW9CLENBQUMsT0FBZTtJQUMzQyxPQUFPLENBQ0wsa0JBQWtCLENBQUMsT0FBTyxDQUFDO1FBQzNCLDZEQUE2RDtRQUM3RCxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBRSxLQUFLLENBQUMsS0FBNEIsSUFBSyxLQUFLLENBQUMsRUFBeUIsQ0FBQyxDQUNyRixDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNILEtBQUssVUFBVSxzQkFBc0IsQ0FDbkMsa0JBQXNDLEVBQ3RDLFNBQWlCLEVBQ2pCLFlBQStCLEVBQy9CLFNBQXdCO0lBRXhCLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEdBQUcsa0JBQWtCLENBQUE7SUFFaEQsMkNBQTJDO0lBQzNDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBQSxnQ0FBcUIsRUFBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUE7SUFFdEUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDdEIsT0FBTyxDQUFDLEtBQUssQ0FBQyx3RUFBd0UsT0FBTyxLQUFLLFFBQVEsRUFBRSxDQUFDLENBQUE7UUFDN0csT0FBTTtJQUNSLENBQUM7SUFFRCwrQ0FBK0M7SUFDL0MsTUFBTSxPQUFPLEdBQUcsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUE7SUFFMUMsOENBQThDO0lBQzlDLE1BQU0sT0FBTyxDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUE7QUFDckUsQ0FBQztBQUVEOztHQUVHO0FBQ0ksS0FBSyxVQUFVLDhCQUE4QixDQUNsRCxPQUFlLEVBQ2YsU0FBaUIsRUFDakIsU0FBd0I7SUFFeEIsSUFBSSxDQUFDO1FBQ0gsK0JBQStCO1FBQy9CLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQ3BDLGlDQUF5QixDQUFDLGFBQWEsQ0FDeEMsQ0FBQTtRQUNELE1BQU0sTUFBTSxHQUFHLElBQUEsc0NBQTZCLEVBQUMsWUFBWSxDQUFDLENBQUE7UUFFMUQscUNBQXFDO1FBQ3JDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xDLE9BQU07UUFDUixDQUFDO1FBRUQseURBQXlEO1FBQ3pELE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUE7UUFFeEUsSUFBSSxDQUFDLG1CQUFtQixJQUFJLG1CQUFtQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM3RCxPQUFNO1FBQ1IsQ0FBQztRQUVELHNCQUFzQjtRQUN0QixNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFRLGlDQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRXZFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxHQUFHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQztZQUM5QyxNQUFNLEVBQUUsT0FBTztZQUNmLE1BQU0sRUFBRTtnQkFDTixJQUFJO2dCQUNKLFlBQVk7Z0JBQ1osUUFBUTtnQkFDUixPQUFPO2dCQUNQLGFBQWE7Z0JBQ2IsNkJBQTZCO2dCQUM3QiwwQkFBMEI7Z0JBQzFCLE9BQU87Z0JBQ1AsZUFBZTtnQkFDZixhQUFhO2dCQUNiLFlBQVk7Z0JBQ1osWUFBWTtnQkFDWixTQUFTO2dCQUNULG9CQUFvQjtnQkFDcEIsbUJBQW1CO2FBQ3BCO1lBQ0QsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRTtTQUN6QixDQUFDLENBQUE7UUFFRixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQTtRQUV4RCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxPQUFPLENBQUMsS0FBSyxDQUFDLHdDQUF3QyxPQUFPLG9DQUFvQyxDQUFDLENBQUE7WUFDbEcsT0FBTTtRQUNSLENBQUM7UUFFRCx3QkFBd0I7UUFDeEIsTUFBTSxVQUFVLEdBQUcsbUJBQW1CLENBQUMsS0FBZ0MsQ0FBQyxDQUFBO1FBRXhFLHNEQUFzRDtRQUN0RCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsS0FBMkIsQ0FBQTtRQUNwRCxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLFVBQVU7WUFDcEMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQztnQkFDaEIsTUFBTSxFQUFFLFVBQVU7Z0JBQ2xCLE1BQU0sRUFBRSxDQUFDLGFBQWEsQ0FBQztnQkFDdkIsT0FBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFO2FBQ2xELENBQUM7WUFDSixDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUE7UUFFaEIsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUE7UUFDekMsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLGFBQWE7WUFDcEMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLGFBQWEsa0NBQWtDLEtBQUssQ0FBQyxFQUFFLEVBQUU7WUFDckUsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtRQUViLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUE7UUFDdkMsTUFBTSxhQUFhLEdBQ2pCLE9BQU8sV0FBVyxLQUFLLFFBQVEsSUFBSSxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDOUQsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDbEMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtRQUVmLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBQSxrQ0FBaUIsRUFDMUMsU0FBUyxFQUNUO1lBQ0UsUUFBUSxFQUFHLEtBQUssQ0FBQyxFQUFhLElBQUksS0FBSztZQUN2QyxVQUFVLEVBQUUsSUFBQSxrQ0FBdUIsRUFBQyxLQUFLLENBQUMsVUFBVSxDQUFDO1lBQ3JELFlBQVksRUFBRyxLQUFLLENBQUMsTUFBaUIsSUFBSSxTQUFTO1lBQ25ELFdBQVcsRUFBRSxVQUFVO1lBQ3ZCLGFBQWE7WUFDYixXQUFXLEVBQUcsS0FBSyxDQUFDLEtBQWdCLElBQUksS0FBSztZQUM3QyxVQUFVLEVBQUUsSUFBQSwrQkFBb0IsRUFDOUIsS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsVUFBVSxJQUFJLElBQUksSUFBSSxFQUFFLENBQ25EO1lBQ0QsV0FBVyxFQUFHLEtBQUssQ0FBQyxLQUFtQixJQUFJLEVBQUU7WUFDN0MsZ0JBQWdCLEVBQ2IsS0FBSyxDQUFDLGdCQUE0QyxJQUFJLEVBQUU7WUFDM0QsZUFBZSxFQUNaLEtBQUssQ0FBQyxlQUEyQyxJQUFJLEVBQUU7WUFDMUQsYUFBYSxFQUFFLFlBQVk7WUFDM0IsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQ2hELGNBQWMsRUFBRSxNQUFNLENBQUMsYUFBYTtZQUNwQyxhQUFhLEVBQUUsTUFBTSxDQUFDLGFBQWE7U0FDUixFQUM3QixFQUFFLGFBQWEsRUFBRSxNQUFNLENBQUMsYUFBYSxFQUFFLENBQ3hDLENBQUE7UUFJRCxNQUFNLE9BQU8sR0FBMEQsRUFBRSxDQUFBO1FBRXpFLE1BQU0sb0JBQW9CLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxFQUFFO1lBQ2hGLE1BQU0sT0FBTyxHQUFHLGtCQUFrQixDQUFDLE9BQU8sQ0FBQTtZQUMxQyxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxTQUFTLEdBQ2IsT0FBTyxrQkFBa0IsQ0FBQyxZQUFZLEtBQUssVUFBVTtvQkFDbkQsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDO29CQUN0RCxDQUFDLENBQUMsb0JBQW9CLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFBO2dCQUUzRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQ2YsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFBO29CQUNuRSxPQUFNO2dCQUNSLENBQUM7Z0JBRUQsTUFBTSxzQkFBc0IsQ0FBQyxrQkFBa0IsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFBO2dCQUNwRixPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFBO1lBQzNDLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE1BQU0sTUFBTSxHQUFHLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtnQkFDckUsT0FBTyxDQUFDLEtBQUssQ0FBQyx5Q0FBeUMsT0FBTyxrQkFBa0IsTUFBTSxFQUFFLENBQUMsQ0FBQTtnQkFDekYsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFBO1lBQzVELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQTtRQUVGLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO1FBRTlDLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFBO1FBQzlELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFBO1FBQ2xFLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFBO1FBQ3BFLElBQUksTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2YsS0FBSyxJQUFJLENBQUE7WUFDVCxLQUFLLE9BQU8sQ0FBQTtRQUNkLENBQUM7SUFDSCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMscUVBQXFFLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDNUksK0RBQStEO0lBQ2pFLENBQUM7QUFDSCxDQUFDIn0=
|
|
432
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLWhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvbm90aWZpY2F0aW9uLWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUF5Y0Esd0VBZ0pDO0FBeGxCRCxxREFBMkY7QUFDM0YseUNBS21CO0FBQ25CLHNGQUE0RTtBQUM1RSxzQ0FBaUY7QUFFakYscURBQW9EO0FBQ3BELDZDQUE4QztBQXFCOUMsdUdBQXVHO0FBQ3ZHLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxDQUFBO0FBRWhDOztHQUVHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FBQyxLQUE4QjtJQUN6RCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFBO0lBQzdCLElBQUksV0FBb0IsQ0FBQTtJQUN4QixJQUFJLE9BQU8sSUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMzQyxNQUFNLENBQUMsR0FBRyxPQUFrQyxDQUFBO1FBQzVDLFdBQVcsR0FBRyxDQUFDLENBQUMsbUJBQW1CLElBQUksQ0FBQyxDQUFDLGdCQUFnQixDQUFBO0lBQzNELENBQUM7SUFFRCxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxXQUFXLElBQUksV0FBVyxDQUFBO0lBQzNELElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDdEMsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBQ0QsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDdkQsT0FBTyxHQUFHLENBQUE7SUFDWixDQUFDO0lBQ0QsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM1QixPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNwQixDQUFDO0lBQ0QsSUFBSSxPQUFPLEdB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
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Normalize phone numbers to E.164 for SMS providers (Twilio, MSG91, WhatsApp).
|
|
4
|
+
* Checkout addresses often store bare local numbers (e.g. 8160356061) without +country.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.getDefaultPhoneCountryCode = getDefaultPhoneCountryCode;
|
|
8
|
+
exports.normalizeToE164 = normalizeToE164;
|
|
9
|
+
const E164_REGEX = /^\+[1-9]\d{1,14}$/;
|
|
10
|
+
function digitsOnly(value) {
|
|
11
|
+
return value.replace(/\D/g, "");
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Default calling code without leading +. Overridable via DEFAULT_PHONE_COUNTRY_CODE.
|
|
15
|
+
*/
|
|
16
|
+
function getDefaultPhoneCountryCode() {
|
|
17
|
+
const raw = (process.env.DEFAULT_PHONE_COUNTRY_CODE || "91").trim();
|
|
18
|
+
return raw.replace(/^\+/, "") || "91";
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Convert a stored phone string to E.164 (+…). Returns null if it cannot be normalized.
|
|
22
|
+
*/
|
|
23
|
+
function normalizeToE164(phone, defaultCountryCode = getDefaultPhoneCountryCode()) {
|
|
24
|
+
if (!phone || typeof phone !== "string") {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
let trimmed = phone.trim();
|
|
28
|
+
if (!trimmed) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
// 00CC… → +CC…
|
|
32
|
+
if (trimmed.startsWith("00")) {
|
|
33
|
+
trimmed = `+${trimmed.slice(2)}`;
|
|
34
|
+
}
|
|
35
|
+
if (trimmed.startsWith("+")) {
|
|
36
|
+
const normalized = `+${digitsOnly(trimmed)}`;
|
|
37
|
+
return E164_REGEX.test(normalized) ? normalized : null;
|
|
38
|
+
}
|
|
39
|
+
let digits = digitsOnly(trimmed);
|
|
40
|
+
if (!digits) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
const cc = digitsOnly(defaultCountryCode) || "91";
|
|
44
|
+
// Leading trunk 0: 09876543210 → 9876543210
|
|
45
|
+
if (digits.startsWith("0") && digits.length === cc.length + 10 + 1) {
|
|
46
|
+
digits = digits.slice(1);
|
|
47
|
+
}
|
|
48
|
+
else if (digits.startsWith("0") && digits.length === 11 && cc === "91") {
|
|
49
|
+
digits = digits.slice(1);
|
|
50
|
+
}
|
|
51
|
+
// Already includes country code without +: 919876543210
|
|
52
|
+
if (digits.startsWith(cc) && digits.length >= cc.length + 8) {
|
|
53
|
+
const candidate = `+${digits}`;
|
|
54
|
+
return E164_REGEX.test(candidate) ? candidate : null;
|
|
55
|
+
}
|
|
56
|
+
// Bare local number — prepend default country code (IN: 10-digit mobiles)
|
|
57
|
+
if (cc === "91" && /^[6-9]\d{9}$/.test(digits)) {
|
|
58
|
+
return `+91${digits}`;
|
|
59
|
+
}
|
|
60
|
+
if (digits.length >= 8 && digits.length <= 12) {
|
|
61
|
+
const candidate = `+${cc}${digits}`;
|
|
62
|
+
return E164_REGEX.test(candidate) ? candidate : null;
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhvbmUtZTE2NC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9waG9uZS1lMTY0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7O0FBV0gsZ0VBR0M7QUFLRCwwQ0FzREM7QUF2RUQsTUFBTSxVQUFVLEdBQUcsbUJBQW1CLENBQUE7QUFFdEMsU0FBUyxVQUFVLENBQUMsS0FBYTtJQUMvQixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0FBQ2pDLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLDBCQUEwQjtJQUN4QyxNQUFNLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDbkUsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUE7QUFDdkMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsZUFBZSxDQUM3QixLQUFnQyxFQUNoQyxxQkFBNkIsMEJBQTBCLEVBQUU7SUFFekQsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN4QyxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFFRCxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDMUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBRUQsZUFBZTtJQUNmLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzdCLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtJQUNsQyxDQUFDO0lBRUQsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDNUIsTUFBTSxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQTtRQUM1QyxPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO0lBQ3hELENBQUM7SUFFRCxJQUFJLE1BQU0sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDaEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBRUQsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLGtCQUFrQixDQUFDLElBQUksSUFBSSxDQUFBO0lBRWpELDRDQUE0QztJQUM1QyxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxFQUFFLENBQUMsTUFBTSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNuRSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUMxQixDQUFDO1NBQU0sSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUN6RSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUMxQixDQUFDO0lBRUQsd0RBQXdEO0lBQ3hELElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDNUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQTtRQUM5QixPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO0lBQ3RELENBQUM7SUFFRCwwRUFBMEU7SUFDMUUsSUFBSSxFQUFFLEtBQUssSUFBSSxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUMvQyxPQUFPLE1BQU0sTUFBTSxFQUFFLENBQUE7SUFDdkIsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUM5QyxNQUFNLFNBQVMsR0FBRyxJQUFJLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQTtRQUNuQyxPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO0lBQ3RELENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUMifQ==
|
package/README.md
CHANGED
|
@@ -321,6 +321,7 @@ This plugin is compatible with Medusa v2 (e.g. `@medusajs/framework` and `@medus
|
|
|
321
321
|
- **Order Confirmation Emails**: Optional email notifications when orders are placed (with "Claim Order" support for registered users)
|
|
322
322
|
- **Status-Based Notifications**: Configurable email, SMS, and push notifications for order status changes (pending, shipped, delivered, canceled, etc.)
|
|
323
323
|
- **Return / Exchange Delivery Window**: Configurable per-type windows (`returnValidInDays`, `exchangeValidInDays`) that block return or exchange requests submitted after N days from the fulfillment's `delivered_at` timestamp. Defaults to 7 days each if not configured. The window is checked only when the order has been marked as delivered; undelivered orders are unaffected.
|
|
324
|
+
- **Return / Exchange mutual exclusion**: Order-level lock via `order_rma_gate` — an active return blocks creating an exchange (and a second return), and vice versa. Same helper on store and guest create routes. Gate uses a partial unique index on `order_id` and atomic stale reclaim (`SELECT … FOR UPDATE`). Unlock on cancel/reject or when return status is actually `received`.
|
|
324
325
|
- **Return Orders Admin Panel**: Admin UI and API for return orders (list, filter, search, detail, reject); returns are stored in the Medusa ORDER module and created via `createAndCompleteReturnOrderWorkflow`
|
|
325
326
|
- **Exchanges Admin Panel**: Admin UI and API for exchanges (list, detail, reject, cancel); exchanges are ORDER module order changes (type `exchange`) created by customers via Medusa core workflows (`beginExchangeOrderWorkflow`, etc.)
|
|
326
327
|
- **Medusa workflows**: Customer returns use `createAndCompleteReturnOrderWorkflow`; customer exchanges use `beginExchangeOrderWorkflow`, `orderExchangeRequestItemReturnWorkflow`, `orderExchangeAddNewItemWorkflow`, `confirmExchangeRequestWorkflow`, and `cancelBeginOrderExchangeWorkflow`. Admin actions use `confirmReturnReceiveWorkflow`, `cancelReturnWorkflow`, and `cancelBeginOrderExchangeWorkflow`.
|
|
@@ -334,8 +335,8 @@ This plugin is compatible with Medusa v2 (e.g. `@medusajs/framework` and `@medus
|
|
|
334
335
|
| **Store (authenticated)** | `/store/orders/cancel|reorder/:id`, `/store/returns`, `/store/swaps`, `/store/payment-details`, `/store/refund-payment-mapping/:return_id`, `/store/orders/:order_id/refund-payment-mappings` |
|
|
335
336
|
| **Store (guest)** | `/store/otp/request|verify`, `/store/guest-orders`, `/store/guest-orders/:id/returns|cancel|reorder|swaps` |
|
|
336
337
|
| **Admin** | `/admin/returns`, `/admin/swaps`, `/admin/refund-payment-mapping/:return_id`, `/admin/refund-payment-mapping/:return_id/mark-refunded`, `/admin/orders/:order_id/refund-context` |
|
|
337
|
-
| **Modules** | `payment_detail`, `refund_payment_mapping`; returns/exchanges use Medusa ORDER module |
|
|
338
|
-
| **Subscribers** | Order confirmation email, status notifications, return/swap event sync |
|
|
338
|
+
| **Modules** | `payment_detail`, `refund_payment_mapping`, `order_rma_gate`; returns/exchanges use Medusa ORDER module |
|
|
339
|
+
| **Subscribers** | Order confirmation email, status notifications, return/swap event sync, `order.return_received` RMA gate release |
|
|
339
340
|
|
|
340
341
|
### Important APIs (quick reference)
|
|
341
342
|
|
|
@@ -632,7 +633,9 @@ Status updates are tracked in the return's metadata with timestamps and admin us
|
|
|
632
633
|
|
|
633
634
|
### One active return or exchange per item (Medusa v2)
|
|
634
635
|
|
|
635
|
-
|
|
636
|
+
**Active standalone return** = `status ∈ {open, requested, partially_received}` and no `exchange_id`.
|
|
637
|
+
|
|
638
|
+
Medusa v2 does **not** allow multiple active return/exchange requests for the **same order item** at the same time. Once an item is part of a return or a swap (exchange), that quantity is reserved until the request is completed or canceled. This plugin also enforces **order-level** mutual exclusion via `order_rma_gate` (see Eligibility and Validation).
|
|
636
639
|
|
|
637
640
|
**To allow a new request**, the first one must be closed or canceled:
|
|
638
641
|
|
|
@@ -1449,7 +1452,13 @@ Returns are validated for:
|
|
|
1449
1452
|
- **Default Payment Method**: Customer must have a default payment method before creating a return
|
|
1450
1453
|
- **Delivery Window**: Return is blocked if more than `returnValidInDays` days have passed since `fulfillment.delivered_at`. If the fulfillment has no `delivered_at` the check is skipped. Configure in plugin options (default: 7 days)
|
|
1451
1454
|
- **Exchange Window**: Exchange is blocked if more than `exchangeValidInDays` days have passed since `fulfillment.delivered_at` (default: 7 days)
|
|
1452
|
-
- **
|
|
1455
|
+
- **Mutual exclusion (order-level)**: While any **active** return or exchange exists on the order, neither a second return nor a cross-type request may be created (intentional: one open RMA per order). Active return statuses are `open` | `requested` | `partially_received` (not `received` / `canceled`). Exchange-linked returns do not count as standalone refund returns. Enforced by:
|
|
1456
|
+
- Medusa entity allowlists (`assertNoActiveConflictingRma`)
|
|
1457
|
+
- `order_rma_gate` row with `UNIQUE (order_id) WHERE deleted_at IS NULL` (race-safe create)
|
|
1458
|
+
- Atomic stale reclaim with `SELECT … FOR UPDATE` when a gate is abandoned (default TTL `STALE_GATE_TTL_MS` = 15 minutes; tune if crash-recovery timing requires it)
|
|
1459
|
+
- Release on store/guest/admin cancel+reject, and on `order.return_received` only when return `status === "received"`
|
|
1460
|
+
- Create workflow failure releases the gate (compensation)
|
|
1461
|
+
- **Retry UX (v1):** a client retry of a successful create may get `400 NOT_ALLOWED` while the gate is held — check the order for an existing return/exchange before escalating support tickets
|
|
1453
1462
|
|
|
1454
1463
|
### Helper Functions
|
|
1455
1464
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "order-management",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.84",
|
|
4
4
|
"description": "A starter for Medusa plugins.",
|
|
5
5
|
"author": "Medusa (https://medusajs.com)",
|
|
6
6
|
"license": "MIT",
|
|
@@ -30,6 +30,8 @@
|
|
|
30
30
|
"scripts": {
|
|
31
31
|
"build": "medusa plugin:build",
|
|
32
32
|
"dev": "medusa plugin:develop",
|
|
33
|
+
"test": "vitest run",
|
|
34
|
+
"test:watch": "vitest",
|
|
33
35
|
"prepublishOnly": "medusa plugin:build"
|
|
34
36
|
},
|
|
35
37
|
"devDependencies": {
|
|
@@ -46,7 +48,7 @@
|
|
|
46
48
|
"@types/react": "^18.3.2",
|
|
47
49
|
"@types/react-dom": "^18.2.25",
|
|
48
50
|
"jsonwebtoken": "^9.0.3",
|
|
49
|
-
"medusa-plugin-dynamic-config": "
|
|
51
|
+
"medusa-plugin-dynamic-config": "0.0.36",
|
|
50
52
|
"prop-types": "^15.8.1",
|
|
51
53
|
"react": "^18.2.0",
|
|
52
54
|
"react-dom": "^18.2.0",
|