@payloadcms/plugin-ecommerce 3.89.0 → 3.90.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.
- package/README.md +6 -0
- package/dist/collections/orders/createOrdersCollection.spec.js +20 -0
- package/dist/collections/orders/createOrdersCollection.spec.js.map +1 -0
- package/dist/endpoints/confirmOrder.d.ts.map +1 -1
- package/dist/endpoints/confirmOrder.js +299 -44
- package/dist/endpoints/confirmOrder.js.map +1 -1
- package/dist/endpoints/confirmOrder.spec.js +509 -0
- package/dist/endpoints/confirmOrder.spec.js.map +1 -0
- package/dist/fields/statusField.d.ts.map +1 -1
- package/dist/fields/statusField.js +5 -0
- package/dist/fields/statusField.js.map +1 -1
- package/dist/fields/statusField.spec.js +9 -0
- package/dist/fields/statusField.spec.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/payments/adapters/stripe/confirmOrder.d.ts.map +1 -1
- package/dist/payments/adapters/stripe/confirmOrder.js +107 -75
- package/dist/payments/adapters/stripe/confirmOrder.js.map +1 -1
- package/dist/payments/adapters/stripe/confirmOrder.spec.js +210 -121
- package/dist/payments/adapters/stripe/confirmOrder.spec.js.map +1 -1
- package/dist/payments/adapters/stripe/validateSettlement.d.ts +37 -0
- package/dist/payments/adapters/stripe/validateSettlement.d.ts.map +1 -0
- package/dist/payments/adapters/stripe/validateSettlement.js +157 -0
- package/dist/payments/adapters/stripe/validateSettlement.js.map +1 -0
- package/dist/payments/adapters/stripe/validateSettlement.spec.js +434 -0
- package/dist/payments/adapters/stripe/validateSettlement.spec.js.map +1 -0
- package/dist/types/index.d.ts +24 -5
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/package.json +7 -7
|
@@ -0,0 +1,509 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
const payloadUtilities = vi.hoisted(()=>({
|
|
3
|
+
addDataAndFileToRequest: vi.fn(),
|
|
4
|
+
commitTransaction: vi.fn(),
|
|
5
|
+
initTransaction: vi.fn(),
|
|
6
|
+
killTransaction: vi.fn()
|
|
7
|
+
}));
|
|
8
|
+
vi.mock('payload', ()=>payloadUtilities);
|
|
9
|
+
import { confirmOrderHandler } from './confirmOrder.js';
|
|
10
|
+
const createHarness = ({ adapter, cart = {
|
|
11
|
+
currency: 'USD',
|
|
12
|
+
customerEmail: ' Buyer@Example.com ',
|
|
13
|
+
id: 'cart-123',
|
|
14
|
+
items: [],
|
|
15
|
+
subtotal: 1000
|
|
16
|
+
}, data = {
|
|
17
|
+
cartID: 'submitted-cart',
|
|
18
|
+
customerEmail: 'buyer@example.com',
|
|
19
|
+
paymentIntentID: 'pi_123',
|
|
20
|
+
secret: 'cart-secret'
|
|
21
|
+
}, initialTransactionID, transaction = {
|
|
22
|
+
amount: 1000,
|
|
23
|
+
currency: 'USD',
|
|
24
|
+
id: 'txn-123',
|
|
25
|
+
items: [
|
|
26
|
+
{
|
|
27
|
+
product: 'product-123',
|
|
28
|
+
quantity: 2
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
order: null,
|
|
32
|
+
status: 'pending'
|
|
33
|
+
}, user = null } = {})=>{
|
|
34
|
+
const state = {
|
|
35
|
+
cart,
|
|
36
|
+
inventoryUpdates: [],
|
|
37
|
+
transaction
|
|
38
|
+
};
|
|
39
|
+
const findByID = vi.fn(async ({ collection, id })=>{
|
|
40
|
+
if (collection === 'carts') {
|
|
41
|
+
return state.cart;
|
|
42
|
+
}
|
|
43
|
+
if (collection === 'transactions' && id === state.transaction.id) {
|
|
44
|
+
return {
|
|
45
|
+
...state.transaction
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
});
|
|
50
|
+
const find = vi.fn(async ({ collection })=>{
|
|
51
|
+
if (collection !== 'orders') {
|
|
52
|
+
return {
|
|
53
|
+
docs: [],
|
|
54
|
+
totalDocs: 0
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
const docs = state.reverseOrders ?? (state.order && Array.isArray(state.order.transactions) && state.order.transactions.includes(state.transaction.id) ? [
|
|
58
|
+
state.order
|
|
59
|
+
] : []);
|
|
60
|
+
return {
|
|
61
|
+
docs,
|
|
62
|
+
totalDocs: docs.length
|
|
63
|
+
};
|
|
64
|
+
});
|
|
65
|
+
const create = vi.fn(async ({ collection, data: orderData })=>{
|
|
66
|
+
if (collection !== 'orders') {
|
|
67
|
+
throw new Error('Unexpected collection');
|
|
68
|
+
}
|
|
69
|
+
state.order = {
|
|
70
|
+
accessToken: 'access-123',
|
|
71
|
+
id: 'order-123',
|
|
72
|
+
...orderData
|
|
73
|
+
};
|
|
74
|
+
return state.order;
|
|
75
|
+
});
|
|
76
|
+
const update = vi.fn(async ({ collection, data: updateData, id })=>{
|
|
77
|
+
if (collection === 'carts') {
|
|
78
|
+
state.cart = {
|
|
79
|
+
...state.cart,
|
|
80
|
+
...updateData,
|
|
81
|
+
id
|
|
82
|
+
};
|
|
83
|
+
return state.cart;
|
|
84
|
+
}
|
|
85
|
+
state.transaction = {
|
|
86
|
+
...state.transaction,
|
|
87
|
+
...updateData,
|
|
88
|
+
id
|
|
89
|
+
};
|
|
90
|
+
return state.transaction;
|
|
91
|
+
});
|
|
92
|
+
const updateOne = vi.fn(async ({ collection, data: updateData, id, where })=>{
|
|
93
|
+
if (collection === 'transactions' && where) {
|
|
94
|
+
if (state.transaction.status !== 'pending' || state.transaction.order) {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
state.transaction = {
|
|
98
|
+
...state.transaction,
|
|
99
|
+
...updateData
|
|
100
|
+
};
|
|
101
|
+
return {
|
|
102
|
+
...state.transaction
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
state.inventoryUpdates.push({
|
|
106
|
+
collection,
|
|
107
|
+
id,
|
|
108
|
+
quantity: updateData.inventory.$inc
|
|
109
|
+
});
|
|
110
|
+
return {
|
|
111
|
+
id
|
|
112
|
+
};
|
|
113
|
+
});
|
|
114
|
+
const loggerError = vi.fn();
|
|
115
|
+
const payload = {
|
|
116
|
+
create,
|
|
117
|
+
db: {
|
|
118
|
+
updateOne
|
|
119
|
+
},
|
|
120
|
+
find,
|
|
121
|
+
findByID,
|
|
122
|
+
logger: {
|
|
123
|
+
error: loggerError
|
|
124
|
+
},
|
|
125
|
+
update
|
|
126
|
+
};
|
|
127
|
+
const confirmOrder = vi.fn(adapter ?? coreAdapter);
|
|
128
|
+
const req = {
|
|
129
|
+
data,
|
|
130
|
+
payload,
|
|
131
|
+
query: {},
|
|
132
|
+
transactionID: initialTransactionID,
|
|
133
|
+
user: user ?? undefined
|
|
134
|
+
};
|
|
135
|
+
const handler = confirmOrderHandler({
|
|
136
|
+
currenciesConfig: {
|
|
137
|
+
defaultCurrency: 'USD',
|
|
138
|
+
supportedCurrencies: []
|
|
139
|
+
},
|
|
140
|
+
paymentMethod: {
|
|
141
|
+
confirmOrder
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
return {
|
|
145
|
+
confirmOrder,
|
|
146
|
+
create,
|
|
147
|
+
find,
|
|
148
|
+
findByID,
|
|
149
|
+
handler,
|
|
150
|
+
loggerError,
|
|
151
|
+
req,
|
|
152
|
+
state,
|
|
153
|
+
update,
|
|
154
|
+
updateOne
|
|
155
|
+
};
|
|
156
|
+
};
|
|
157
|
+
const runHandler = async (harness)=>{
|
|
158
|
+
const response = await harness.handler(harness.req);
|
|
159
|
+
return {
|
|
160
|
+
body: await response.json(),
|
|
161
|
+
response
|
|
162
|
+
};
|
|
163
|
+
};
|
|
164
|
+
const coreAdapter = async ({ finalizeOrder })=>{
|
|
165
|
+
const order = await finalizeOrder({
|
|
166
|
+
orderData: {
|
|
167
|
+
amount: 1000,
|
|
168
|
+
currency: 'USD',
|
|
169
|
+
customerEmail: 'buyer@example.com',
|
|
170
|
+
items: [
|
|
171
|
+
{
|
|
172
|
+
product: 'product-123',
|
|
173
|
+
quantity: 2
|
|
174
|
+
}
|
|
175
|
+
],
|
|
176
|
+
status: 'processing'
|
|
177
|
+
},
|
|
178
|
+
transactionID: 'txn-123'
|
|
179
|
+
});
|
|
180
|
+
return {
|
|
181
|
+
accessToken: order.accessToken,
|
|
182
|
+
message: 'Order confirmed successfully',
|
|
183
|
+
orderID: order.id,
|
|
184
|
+
transactionID: 'txn-123'
|
|
185
|
+
};
|
|
186
|
+
};
|
|
187
|
+
describe('confirmOrderHandler', ()=>{
|
|
188
|
+
beforeEach(()=>{
|
|
189
|
+
vi.clearAllMocks();
|
|
190
|
+
payloadUtilities.addDataAndFileToRequest.mockResolvedValue(undefined);
|
|
191
|
+
payloadUtilities.commitTransaction.mockResolvedValue(undefined);
|
|
192
|
+
payloadUtilities.initTransaction.mockImplementation(async (req)=>{
|
|
193
|
+
req.transactionID = 'request-transaction';
|
|
194
|
+
return true;
|
|
195
|
+
});
|
|
196
|
+
payloadUtilities.killTransaction.mockResolvedValue(undefined);
|
|
197
|
+
});
|
|
198
|
+
afterEach(()=>{
|
|
199
|
+
vi.useRealTimers();
|
|
200
|
+
});
|
|
201
|
+
it('should pass the canonical cart and normalized guest email to the adapter', async ()=>{
|
|
202
|
+
const harness = createHarness();
|
|
203
|
+
const { response } = await runHandler(harness);
|
|
204
|
+
expect(response.status).toBe(200);
|
|
205
|
+
expect(harness.confirmOrder).toHaveBeenCalledWith(expect.objectContaining({
|
|
206
|
+
data: expect.objectContaining({
|
|
207
|
+
cartID: 'cart-123',
|
|
208
|
+
customerEmail: 'buyer@example.com',
|
|
209
|
+
paymentIntentID: 'pi_123'
|
|
210
|
+
}),
|
|
211
|
+
finalizeOrder: expect.any(Function)
|
|
212
|
+
}));
|
|
213
|
+
});
|
|
214
|
+
it('should reject a guest email that does not match the accessed cart', async ()=>{
|
|
215
|
+
const harness = createHarness({
|
|
216
|
+
data: {
|
|
217
|
+
cartID: 'submitted-cart',
|
|
218
|
+
customerEmail: 'attacker@example.com',
|
|
219
|
+
paymentIntentID: 'pi_123'
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
const { response } = await runHandler(harness);
|
|
223
|
+
expect(response.status).toBe(500);
|
|
224
|
+
expect(harness.confirmOrder).not.toHaveBeenCalled();
|
|
225
|
+
expect(payloadUtilities.initTransaction).not.toHaveBeenCalled();
|
|
226
|
+
});
|
|
227
|
+
it('should reject a custom adapter that does not finalize the order', async ()=>{
|
|
228
|
+
const harness = createHarness({
|
|
229
|
+
adapter: async ()=>({
|
|
230
|
+
message: 'Order confirmed successfully',
|
|
231
|
+
orderID: 'order-from-custom-adapter',
|
|
232
|
+
transactionID: 'txn-123'
|
|
233
|
+
})
|
|
234
|
+
});
|
|
235
|
+
const { response } = await runHandler(harness);
|
|
236
|
+
expect(response.status).toBe(500);
|
|
237
|
+
expect(harness.state.inventoryUpdates).toHaveLength(0);
|
|
238
|
+
expect(payloadUtilities.killTransaction).toHaveBeenCalledWith(harness.req);
|
|
239
|
+
expect(payloadUtilities.commitTransaction).not.toHaveBeenCalled();
|
|
240
|
+
});
|
|
241
|
+
it('should reject a custom adapter response without a transaction ID', async ()=>{
|
|
242
|
+
const harness = createHarness({
|
|
243
|
+
adapter: async ()=>({
|
|
244
|
+
message: 'Order confirmed successfully',
|
|
245
|
+
orderID: 'order-123'
|
|
246
|
+
})
|
|
247
|
+
});
|
|
248
|
+
const { response } = await runHandler(harness);
|
|
249
|
+
expect(response.status).toBe(500);
|
|
250
|
+
expect(harness.state.inventoryUpdates).toHaveLength(0);
|
|
251
|
+
expect(payloadUtilities.killTransaction).toHaveBeenCalledWith(harness.req);
|
|
252
|
+
});
|
|
253
|
+
it('should atomically claim and finalize the order in core', async ()=>{
|
|
254
|
+
const harness = createHarness({
|
|
255
|
+
adapter: coreAdapter
|
|
256
|
+
});
|
|
257
|
+
const { body, response } = await runHandler(harness);
|
|
258
|
+
expect(response.status).toBe(200);
|
|
259
|
+
expect(body).toEqual({
|
|
260
|
+
accessToken: 'access-123',
|
|
261
|
+
message: 'Order confirmed successfully',
|
|
262
|
+
orderID: 'order-123',
|
|
263
|
+
transactionID: 'txn-123'
|
|
264
|
+
});
|
|
265
|
+
expect(harness.updateOne).toHaveBeenNthCalledWith(1, {
|
|
266
|
+
collection: 'transactions',
|
|
267
|
+
data: {
|
|
268
|
+
status: 'processing'
|
|
269
|
+
},
|
|
270
|
+
options: {
|
|
271
|
+
atomic: true
|
|
272
|
+
},
|
|
273
|
+
req: harness.req,
|
|
274
|
+
where: {
|
|
275
|
+
and: [
|
|
276
|
+
{
|
|
277
|
+
id: {
|
|
278
|
+
equals: 'txn-123'
|
|
279
|
+
}
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
status: {
|
|
283
|
+
equals: 'pending'
|
|
284
|
+
}
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
order: {
|
|
288
|
+
exists: false
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
]
|
|
292
|
+
}
|
|
293
|
+
});
|
|
294
|
+
expect(harness.create).toHaveBeenCalledTimes(1);
|
|
295
|
+
expect(harness.state.inventoryUpdates).toEqual([
|
|
296
|
+
{
|
|
297
|
+
collection: 'products',
|
|
298
|
+
id: 'product-123',
|
|
299
|
+
quantity: -2
|
|
300
|
+
}
|
|
301
|
+
]);
|
|
302
|
+
expect(harness.state.transaction).toMatchObject({
|
|
303
|
+
order: 'order-123',
|
|
304
|
+
status: 'succeeded'
|
|
305
|
+
});
|
|
306
|
+
expect(payloadUtilities.commitTransaction).toHaveBeenCalledWith(harness.req);
|
|
307
|
+
});
|
|
308
|
+
it('should reject an adapter response for a different transaction than it finalized', async ()=>{
|
|
309
|
+
const harness = createHarness({
|
|
310
|
+
adapter: async (args)=>({
|
|
311
|
+
...await coreAdapter(args),
|
|
312
|
+
transactionID: 'txn-other'
|
|
313
|
+
})
|
|
314
|
+
});
|
|
315
|
+
const { response } = await runHandler(harness);
|
|
316
|
+
expect(response.status).toBe(500);
|
|
317
|
+
expect(payloadUtilities.killTransaction).toHaveBeenCalledWith(harness.req);
|
|
318
|
+
expect(payloadUtilities.commitTransaction).not.toHaveBeenCalled();
|
|
319
|
+
});
|
|
320
|
+
it('should reject success when an adapter swallows a finalization failure', async ()=>{
|
|
321
|
+
const harness = createHarness({
|
|
322
|
+
adapter: async ({ finalizeOrder })=>{
|
|
323
|
+
await finalizeOrder({
|
|
324
|
+
orderData: {},
|
|
325
|
+
transactionID: 'missing-transaction'
|
|
326
|
+
}).catch(()=>undefined);
|
|
327
|
+
return {
|
|
328
|
+
message: 'Order confirmed successfully',
|
|
329
|
+
orderID: 'order-123',
|
|
330
|
+
transactionID: 'missing-transaction'
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
});
|
|
334
|
+
harness.updateOne.mockResolvedValueOnce(null);
|
|
335
|
+
harness.findByID.mockResolvedValueOnce(harness.state.cart).mockResolvedValueOnce(null);
|
|
336
|
+
const { response } = await runHandler(harness);
|
|
337
|
+
expect(response.status).toBe(500);
|
|
338
|
+
expect(payloadUtilities.killTransaction).toHaveBeenCalledWith(harness.req);
|
|
339
|
+
expect(payloadUtilities.commitTransaction).not.toHaveBeenCalled();
|
|
340
|
+
});
|
|
341
|
+
it('should return the exact linked order without repeating settlement side effects', async ()=>{
|
|
342
|
+
const harness = createHarness({
|
|
343
|
+
adapter: coreAdapter
|
|
344
|
+
});
|
|
345
|
+
const first = await runHandler(harness);
|
|
346
|
+
harness.req.transactionID = undefined;
|
|
347
|
+
const second = await runHandler(harness);
|
|
348
|
+
expect(first.response.status).toBe(200);
|
|
349
|
+
expect(second.response.status).toBe(200);
|
|
350
|
+
expect(second.body).toEqual(first.body);
|
|
351
|
+
expect(harness.create).toHaveBeenCalledTimes(1);
|
|
352
|
+
expect(harness.state.inventoryUpdates).toHaveLength(1);
|
|
353
|
+
});
|
|
354
|
+
it('should recover the canonical order after an endpoint-owned transient claim conflict', async ()=>{
|
|
355
|
+
const harness = createHarness({
|
|
356
|
+
adapter: coreAdapter
|
|
357
|
+
});
|
|
358
|
+
const conflict = Object.assign(new Error('Please retry your transaction.'), {
|
|
359
|
+
code: 112,
|
|
360
|
+
codeName: 'WriteConflict',
|
|
361
|
+
errorLabels: [
|
|
362
|
+
'TransientTransactionError'
|
|
363
|
+
]
|
|
364
|
+
});
|
|
365
|
+
harness.updateOne.mockImplementationOnce(async ()=>{
|
|
366
|
+
harness.state.transaction = {
|
|
367
|
+
...harness.state.transaction,
|
|
368
|
+
order: 'order-123',
|
|
369
|
+
status: 'succeeded'
|
|
370
|
+
};
|
|
371
|
+
harness.state.order = {
|
|
372
|
+
accessToken: 'access-123',
|
|
373
|
+
id: 'order-123',
|
|
374
|
+
transactions: [
|
|
375
|
+
'txn-123'
|
|
376
|
+
]
|
|
377
|
+
};
|
|
378
|
+
throw conflict;
|
|
379
|
+
});
|
|
380
|
+
payloadUtilities.killTransaction.mockImplementationOnce(async (req)=>{
|
|
381
|
+
delete req.transactionID;
|
|
382
|
+
});
|
|
383
|
+
const { body, response } = await runHandler(harness);
|
|
384
|
+
expect(response.status).toBe(200);
|
|
385
|
+
expect(body).toEqual({
|
|
386
|
+
accessToken: 'access-123',
|
|
387
|
+
message: 'Order confirmed successfully',
|
|
388
|
+
orderID: 'order-123',
|
|
389
|
+
transactionID: 'txn-123'
|
|
390
|
+
});
|
|
391
|
+
expect(payloadUtilities.killTransaction).toHaveBeenCalledWith(harness.req);
|
|
392
|
+
expect(payloadUtilities.commitTransaction).not.toHaveBeenCalled();
|
|
393
|
+
expect(harness.create).not.toHaveBeenCalled();
|
|
394
|
+
expect(harness.state.inventoryUpdates).toHaveLength(0);
|
|
395
|
+
});
|
|
396
|
+
it('should fail closed when a succeeded transaction has ambiguous order links', async ()=>{
|
|
397
|
+
const harness = createHarness({
|
|
398
|
+
adapter: coreAdapter,
|
|
399
|
+
transaction: {
|
|
400
|
+
amount: 1000,
|
|
401
|
+
currency: 'USD',
|
|
402
|
+
id: 'txn-123',
|
|
403
|
+
items: [
|
|
404
|
+
{
|
|
405
|
+
product: 'product-123',
|
|
406
|
+
quantity: 2
|
|
407
|
+
}
|
|
408
|
+
],
|
|
409
|
+
order: 'order-123',
|
|
410
|
+
status: 'succeeded'
|
|
411
|
+
}
|
|
412
|
+
});
|
|
413
|
+
harness.state.reverseOrders = [
|
|
414
|
+
{
|
|
415
|
+
id: 'order-123',
|
|
416
|
+
transactions: [
|
|
417
|
+
'txn-123'
|
|
418
|
+
]
|
|
419
|
+
},
|
|
420
|
+
{
|
|
421
|
+
id: 'order-other',
|
|
422
|
+
transactions: [
|
|
423
|
+
'txn-123'
|
|
424
|
+
]
|
|
425
|
+
}
|
|
426
|
+
];
|
|
427
|
+
const { response } = await runHandler(harness);
|
|
428
|
+
expect(response.status).toBe(500);
|
|
429
|
+
expect(harness.create).not.toHaveBeenCalled();
|
|
430
|
+
expect(harness.state.inventoryUpdates).toHaveLength(0);
|
|
431
|
+
});
|
|
432
|
+
it('should fail closed when an order already references the claimed pending transaction', async ()=>{
|
|
433
|
+
const harness = createHarness({
|
|
434
|
+
adapter: coreAdapter
|
|
435
|
+
});
|
|
436
|
+
harness.state.reverseOrders = [
|
|
437
|
+
{
|
|
438
|
+
id: 'historical-order',
|
|
439
|
+
transactions: [
|
|
440
|
+
'txn-123'
|
|
441
|
+
]
|
|
442
|
+
}
|
|
443
|
+
];
|
|
444
|
+
const { response } = await runHandler(harness);
|
|
445
|
+
expect(response.status).toBe(500);
|
|
446
|
+
expect(harness.create).not.toHaveBeenCalled();
|
|
447
|
+
expect(harness.state.inventoryUpdates).toHaveLength(0);
|
|
448
|
+
});
|
|
449
|
+
it('should fail closed after bounded polling of a stale processing transaction', async ()=>{
|
|
450
|
+
vi.useFakeTimers();
|
|
451
|
+
vi.setSystemTime(new Date('2026-08-27T12:00:00.000Z'));
|
|
452
|
+
const harness = createHarness({
|
|
453
|
+
adapter: coreAdapter,
|
|
454
|
+
transaction: {
|
|
455
|
+
amount: 1000,
|
|
456
|
+
currency: 'USD',
|
|
457
|
+
id: 'txn-123',
|
|
458
|
+
items: [
|
|
459
|
+
{
|
|
460
|
+
product: 'product-123',
|
|
461
|
+
quantity: 2
|
|
462
|
+
}
|
|
463
|
+
],
|
|
464
|
+
order: null,
|
|
465
|
+
status: 'processing'
|
|
466
|
+
}
|
|
467
|
+
});
|
|
468
|
+
const result = runHandler(harness);
|
|
469
|
+
await vi.advanceTimersByTimeAsync(1000);
|
|
470
|
+
const { response } = await result;
|
|
471
|
+
expect(response.status).toBe(500);
|
|
472
|
+
expect(harness.create).not.toHaveBeenCalled();
|
|
473
|
+
expect(harness.state.inventoryUpdates).toHaveLength(0);
|
|
474
|
+
});
|
|
475
|
+
it('should roll back an endpoint-owned transaction when finalization fails', async ()=>{
|
|
476
|
+
const harness = createHarness({
|
|
477
|
+
adapter: coreAdapter
|
|
478
|
+
});
|
|
479
|
+
harness.updateOne.mockImplementationOnce(async ()=>({
|
|
480
|
+
...harness.state.transaction,
|
|
481
|
+
status: 'processing'
|
|
482
|
+
})).mockResolvedValueOnce(null);
|
|
483
|
+
const { response } = await runHandler(harness);
|
|
484
|
+
expect(response.status).toBe(500);
|
|
485
|
+
expect(payloadUtilities.killTransaction).toHaveBeenCalledWith(harness.req);
|
|
486
|
+
expect(payloadUtilities.commitTransaction).not.toHaveBeenCalled();
|
|
487
|
+
});
|
|
488
|
+
it('should preserve an inherited request transaction lifecycle', async ()=>{
|
|
489
|
+
payloadUtilities.initTransaction.mockResolvedValue(false);
|
|
490
|
+
const harness = createHarness({
|
|
491
|
+
initialTransactionID: 'inherited-transaction'
|
|
492
|
+
});
|
|
493
|
+
const { response } = await runHandler(harness);
|
|
494
|
+
expect(response.status).toBe(200);
|
|
495
|
+
expect(payloadUtilities.commitTransaction).not.toHaveBeenCalled();
|
|
496
|
+
expect(payloadUtilities.killTransaction).not.toHaveBeenCalled();
|
|
497
|
+
});
|
|
498
|
+
it('should pass the shared request to every direct database update', async ()=>{
|
|
499
|
+
const harness = createHarness({
|
|
500
|
+
adapter: coreAdapter
|
|
501
|
+
});
|
|
502
|
+
await runHandler(harness);
|
|
503
|
+
for (const [args] of harness.updateOne.mock.calls){
|
|
504
|
+
expect(args.req).toBe(harness.req);
|
|
505
|
+
}
|
|
506
|
+
});
|
|
507
|
+
});
|
|
508
|
+
|
|
509
|
+
//# sourceMappingURL=confirmOrder.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/endpoints/confirmOrder.spec.ts"],"sourcesContent":["import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'\n\nconst payloadUtilities = vi.hoisted(() => ({\n addDataAndFileToRequest: vi.fn(),\n commitTransaction: vi.fn(),\n initTransaction: vi.fn(),\n killTransaction: vi.fn(),\n}))\n\nvi.mock('payload', () => payloadUtilities)\n\nimport { confirmOrderHandler } from './confirmOrder.js'\n\ntype Handler = ReturnType<typeof confirmOrderHandler>\ntype Request = Parameters<Handler>[0]\ntype ConfirmArgs = Parameters<\n Parameters<typeof confirmOrderHandler>[0]['paymentMethod']['confirmOrder']\n>[0]\n\ntype State = {\n cart: Record<string, unknown>\n inventoryUpdates: Array<{ collection: string; id: unknown; quantity: number }>\n order?: Record<string, unknown>\n reverseOrders?: Record<string, unknown>[]\n transaction: Record<string, unknown>\n}\n\nconst createHarness = ({\n adapter,\n cart = {\n currency: 'USD',\n customerEmail: ' Buyer@Example.com ',\n id: 'cart-123',\n items: [],\n subtotal: 1000,\n },\n data = {\n cartID: 'submitted-cart',\n customerEmail: 'buyer@example.com',\n paymentIntentID: 'pi_123',\n secret: 'cart-secret',\n },\n initialTransactionID,\n transaction = {\n amount: 1000,\n currency: 'USD',\n id: 'txn-123',\n items: [{ product: 'product-123', quantity: 2 }],\n order: null,\n status: 'pending',\n },\n user = null as null | Record<string, unknown>,\n}: {\n adapter?: (args: ConfirmArgs) => Promise<Record<string, unknown>>\n cart?: Record<string, unknown>\n data?: Record<string, unknown>\n initialTransactionID?: Request['transactionID']\n transaction?: Record<string, unknown>\n user?: null | Record<string, unknown>\n} = {}) => {\n const state: State = {\n cart,\n inventoryUpdates: [],\n transaction,\n }\n\n const findByID = vi.fn(async ({ collection, id }: { collection: string; id: unknown }) => {\n if (collection === 'carts') {\n return state.cart\n }\n\n if (collection === 'transactions' && id === state.transaction.id) {\n return { ...state.transaction }\n }\n\n return null\n })\n const find = vi.fn(async ({ collection }: { collection: string }) => {\n if (collection !== 'orders') {\n return { docs: [], totalDocs: 0 }\n }\n\n const docs =\n state.reverseOrders ??\n (state.order &&\n Array.isArray(state.order.transactions) &&\n state.order.transactions.includes(state.transaction.id)\n ? [state.order]\n : [])\n\n return { docs, totalDocs: docs.length }\n })\n const create = vi.fn(\n async ({\n collection,\n data: orderData,\n }: {\n collection: string\n data: Record<string, unknown>\n }) => {\n if (collection !== 'orders') {\n throw new Error('Unexpected collection')\n }\n\n state.order = {\n accessToken: 'access-123',\n id: 'order-123',\n ...orderData,\n }\n\n return state.order\n },\n )\n const update = vi.fn(\n async ({\n collection,\n data: updateData,\n id,\n }: {\n collection: string\n data: Record<string, unknown>\n id: unknown\n }) => {\n if (collection === 'carts') {\n state.cart = { ...state.cart, ...updateData, id }\n\n return state.cart\n }\n\n state.transaction = { ...state.transaction, ...updateData, id }\n\n return state.transaction\n },\n )\n const updateOne = vi.fn(\n async ({\n collection,\n data: updateData,\n id,\n where,\n }: {\n collection: string\n data: Record<string, any>\n id?: unknown\n where?: Record<string, unknown>\n }) => {\n if (collection === 'transactions' && where) {\n if (state.transaction.status !== 'pending' || state.transaction.order) {\n return null\n }\n\n state.transaction = { ...state.transaction, ...updateData }\n\n return { ...state.transaction }\n }\n\n state.inventoryUpdates.push({\n collection,\n id,\n quantity: updateData.inventory.$inc,\n })\n\n return { id }\n },\n )\n const loggerError = vi.fn()\n const payload = {\n create,\n db: { updateOne },\n find,\n findByID,\n logger: { error: loggerError },\n update,\n }\n const confirmOrder = vi.fn(adapter ?? coreAdapter)\n const req = {\n data,\n payload,\n query: {},\n transactionID: initialTransactionID,\n user: user ?? undefined,\n } as unknown as Request\n const handler = confirmOrderHandler({\n currenciesConfig: {\n defaultCurrency: 'USD',\n supportedCurrencies: [],\n },\n paymentMethod: {\n confirmOrder,\n } as unknown as Parameters<typeof confirmOrderHandler>[0]['paymentMethod'],\n })\n\n return {\n confirmOrder,\n create,\n find,\n findByID,\n handler,\n loggerError,\n req,\n state,\n update,\n updateOne,\n }\n}\n\nconst runHandler = async (harness: ReturnType<typeof createHarness>) => {\n const response = await harness.handler(harness.req)\n\n return {\n body: await response.json(),\n response,\n }\n}\n\nconst coreAdapter = async ({ finalizeOrder }: ConfirmArgs) => {\n const order = await finalizeOrder({\n orderData: {\n amount: 1000,\n currency: 'USD',\n customerEmail: 'buyer@example.com',\n items: [{ product: 'product-123', quantity: 2 }],\n status: 'processing',\n },\n transactionID: 'txn-123',\n })\n\n return {\n accessToken: order.accessToken,\n message: 'Order confirmed successfully',\n orderID: order.id,\n transactionID: 'txn-123',\n }\n}\n\ndescribe('confirmOrderHandler', () => {\n beforeEach(() => {\n vi.clearAllMocks()\n payloadUtilities.addDataAndFileToRequest.mockResolvedValue(undefined)\n payloadUtilities.commitTransaction.mockResolvedValue(undefined)\n payloadUtilities.initTransaction.mockImplementation(async (req: Request) => {\n req.transactionID = 'request-transaction'\n\n return true\n })\n payloadUtilities.killTransaction.mockResolvedValue(undefined)\n })\n\n afterEach(() => {\n vi.useRealTimers()\n })\n\n it('should pass the canonical cart and normalized guest email to the adapter', async () => {\n const harness = createHarness()\n\n const { response } = await runHandler(harness)\n\n expect(response.status).toBe(200)\n expect(harness.confirmOrder).toHaveBeenCalledWith(\n expect.objectContaining({\n data: expect.objectContaining({\n cartID: 'cart-123',\n customerEmail: 'buyer@example.com',\n paymentIntentID: 'pi_123',\n }),\n finalizeOrder: expect.any(Function),\n }),\n )\n })\n\n it('should reject a guest email that does not match the accessed cart', async () => {\n const harness = createHarness({\n data: {\n cartID: 'submitted-cart',\n customerEmail: 'attacker@example.com',\n paymentIntentID: 'pi_123',\n },\n })\n\n const { response } = await runHandler(harness)\n\n expect(response.status).toBe(500)\n expect(harness.confirmOrder).not.toHaveBeenCalled()\n expect(payloadUtilities.initTransaction).not.toHaveBeenCalled()\n })\n\n it('should reject a custom adapter that does not finalize the order', async () => {\n const harness = createHarness({\n adapter: async () => ({\n message: 'Order confirmed successfully',\n orderID: 'order-from-custom-adapter',\n transactionID: 'txn-123',\n }),\n })\n\n const { response } = await runHandler(harness)\n\n expect(response.status).toBe(500)\n expect(harness.state.inventoryUpdates).toHaveLength(0)\n expect(payloadUtilities.killTransaction).toHaveBeenCalledWith(harness.req)\n expect(payloadUtilities.commitTransaction).not.toHaveBeenCalled()\n })\n\n it('should reject a custom adapter response without a transaction ID', async () => {\n const harness = createHarness({\n adapter: async () => ({\n message: 'Order confirmed successfully',\n orderID: 'order-123',\n }),\n })\n\n const { response } = await runHandler(harness)\n\n expect(response.status).toBe(500)\n expect(harness.state.inventoryUpdates).toHaveLength(0)\n expect(payloadUtilities.killTransaction).toHaveBeenCalledWith(harness.req)\n })\n\n it('should atomically claim and finalize the order in core', async () => {\n const harness = createHarness({ adapter: coreAdapter })\n\n const { body, response } = await runHandler(harness)\n\n expect(response.status).toBe(200)\n expect(body).toEqual({\n accessToken: 'access-123',\n message: 'Order confirmed successfully',\n orderID: 'order-123',\n transactionID: 'txn-123',\n })\n expect(harness.updateOne).toHaveBeenNthCalledWith(1, {\n collection: 'transactions',\n data: { status: 'processing' },\n options: { atomic: true },\n req: harness.req,\n where: {\n and: [\n { id: { equals: 'txn-123' } },\n { status: { equals: 'pending' } },\n { order: { exists: false } },\n ],\n },\n })\n expect(harness.create).toHaveBeenCalledTimes(1)\n expect(harness.state.inventoryUpdates).toEqual([\n { collection: 'products', id: 'product-123', quantity: -2 },\n ])\n expect(harness.state.transaction).toMatchObject({\n order: 'order-123',\n status: 'succeeded',\n })\n expect(payloadUtilities.commitTransaction).toHaveBeenCalledWith(harness.req)\n })\n\n it('should reject an adapter response for a different transaction than it finalized', async () => {\n const harness = createHarness({\n adapter: async (args) => ({\n ...(await coreAdapter(args)),\n transactionID: 'txn-other',\n }),\n })\n\n const { response } = await runHandler(harness)\n\n expect(response.status).toBe(500)\n expect(payloadUtilities.killTransaction).toHaveBeenCalledWith(harness.req)\n expect(payloadUtilities.commitTransaction).not.toHaveBeenCalled()\n })\n\n it('should reject success when an adapter swallows a finalization failure', async () => {\n const harness = createHarness({\n adapter: async ({ finalizeOrder }) => {\n await finalizeOrder({\n orderData: {},\n transactionID: 'missing-transaction',\n }).catch(() => undefined)\n\n return {\n message: 'Order confirmed successfully',\n orderID: 'order-123',\n transactionID: 'missing-transaction',\n }\n },\n })\n harness.updateOne.mockResolvedValueOnce(null)\n harness.findByID.mockResolvedValueOnce(harness.state.cart).mockResolvedValueOnce(null)\n\n const { response } = await runHandler(harness)\n\n expect(response.status).toBe(500)\n expect(payloadUtilities.killTransaction).toHaveBeenCalledWith(harness.req)\n expect(payloadUtilities.commitTransaction).not.toHaveBeenCalled()\n })\n\n it('should return the exact linked order without repeating settlement side effects', async () => {\n const harness = createHarness({ adapter: coreAdapter })\n\n const first = await runHandler(harness)\n harness.req.transactionID = undefined\n const second = await runHandler(harness)\n\n expect(first.response.status).toBe(200)\n expect(second.response.status).toBe(200)\n expect(second.body).toEqual(first.body)\n expect(harness.create).toHaveBeenCalledTimes(1)\n expect(harness.state.inventoryUpdates).toHaveLength(1)\n })\n\n it('should recover the canonical order after an endpoint-owned transient claim conflict', async () => {\n const harness = createHarness({ adapter: coreAdapter })\n const conflict = Object.assign(new Error('Please retry your transaction.'), {\n code: 112,\n codeName: 'WriteConflict',\n errorLabels: ['TransientTransactionError'],\n })\n\n harness.updateOne.mockImplementationOnce(async () => {\n harness.state.transaction = {\n ...harness.state.transaction,\n order: 'order-123',\n status: 'succeeded',\n }\n harness.state.order = {\n accessToken: 'access-123',\n id: 'order-123',\n transactions: ['txn-123'],\n }\n\n throw conflict\n })\n payloadUtilities.killTransaction.mockImplementationOnce(async (req: Request) => {\n delete req.transactionID\n })\n\n const { body, response } = await runHandler(harness)\n\n expect(response.status).toBe(200)\n expect(body).toEqual({\n accessToken: 'access-123',\n message: 'Order confirmed successfully',\n orderID: 'order-123',\n transactionID: 'txn-123',\n })\n expect(payloadUtilities.killTransaction).toHaveBeenCalledWith(harness.req)\n expect(payloadUtilities.commitTransaction).not.toHaveBeenCalled()\n expect(harness.create).not.toHaveBeenCalled()\n expect(harness.state.inventoryUpdates).toHaveLength(0)\n })\n\n it('should fail closed when a succeeded transaction has ambiguous order links', async () => {\n const harness = createHarness({\n adapter: coreAdapter,\n transaction: {\n amount: 1000,\n currency: 'USD',\n id: 'txn-123',\n items: [{ product: 'product-123', quantity: 2 }],\n order: 'order-123',\n status: 'succeeded',\n },\n })\n harness.state.reverseOrders = [\n { id: 'order-123', transactions: ['txn-123'] },\n { id: 'order-other', transactions: ['txn-123'] },\n ]\n\n const { response } = await runHandler(harness)\n\n expect(response.status).toBe(500)\n expect(harness.create).not.toHaveBeenCalled()\n expect(harness.state.inventoryUpdates).toHaveLength(0)\n })\n\n it('should fail closed when an order already references the claimed pending transaction', async () => {\n const harness = createHarness({ adapter: coreAdapter })\n harness.state.reverseOrders = [{ id: 'historical-order', transactions: ['txn-123'] }]\n\n const { response } = await runHandler(harness)\n\n expect(response.status).toBe(500)\n expect(harness.create).not.toHaveBeenCalled()\n expect(harness.state.inventoryUpdates).toHaveLength(0)\n })\n\n it('should fail closed after bounded polling of a stale processing transaction', async () => {\n vi.useFakeTimers()\n vi.setSystemTime(new Date('2026-08-27T12:00:00.000Z'))\n const harness = createHarness({\n adapter: coreAdapter,\n transaction: {\n amount: 1000,\n currency: 'USD',\n id: 'txn-123',\n items: [{ product: 'product-123', quantity: 2 }],\n order: null,\n status: 'processing',\n },\n })\n\n const result = runHandler(harness)\n await vi.advanceTimersByTimeAsync(1000)\n const { response } = await result\n\n expect(response.status).toBe(500)\n expect(harness.create).not.toHaveBeenCalled()\n expect(harness.state.inventoryUpdates).toHaveLength(0)\n })\n\n it('should roll back an endpoint-owned transaction when finalization fails', async () => {\n const harness = createHarness({ adapter: coreAdapter })\n harness.updateOne\n .mockImplementationOnce(async () => ({\n ...harness.state.transaction,\n status: 'processing',\n }))\n .mockResolvedValueOnce(null)\n\n const { response } = await runHandler(harness)\n\n expect(response.status).toBe(500)\n expect(payloadUtilities.killTransaction).toHaveBeenCalledWith(harness.req)\n expect(payloadUtilities.commitTransaction).not.toHaveBeenCalled()\n })\n\n it('should preserve an inherited request transaction lifecycle', async () => {\n payloadUtilities.initTransaction.mockResolvedValue(false)\n const harness = createHarness({\n initialTransactionID: 'inherited-transaction',\n })\n\n const { response } = await runHandler(harness)\n\n expect(response.status).toBe(200)\n expect(payloadUtilities.commitTransaction).not.toHaveBeenCalled()\n expect(payloadUtilities.killTransaction).not.toHaveBeenCalled()\n })\n\n it('should pass the shared request to every direct database update', async () => {\n const harness = createHarness({ adapter: coreAdapter })\n\n await runHandler(harness)\n\n for (const [args] of harness.updateOne.mock.calls) {\n expect(args.req).toBe(harness.req)\n }\n })\n})\n"],"names":["afterEach","beforeEach","describe","expect","it","vi","payloadUtilities","hoisted","addDataAndFileToRequest","fn","commitTransaction","initTransaction","killTransaction","mock","confirmOrderHandler","createHarness","adapter","cart","currency","customerEmail","id","items","subtotal","data","cartID","paymentIntentID","secret","initialTransactionID","transaction","amount","product","quantity","order","status","user","state","inventoryUpdates","findByID","collection","find","docs","totalDocs","reverseOrders","Array","isArray","transactions","includes","length","create","orderData","Error","accessToken","update","updateData","updateOne","where","push","inventory","$inc","loggerError","payload","db","logger","error","confirmOrder","coreAdapter","req","query","transactionID","undefined","handler","currenciesConfig","defaultCurrency","supportedCurrencies","paymentMethod","runHandler","harness","response","body","json","finalizeOrder","message","orderID","clearAllMocks","mockResolvedValue","mockImplementation","useRealTimers","toBe","toHaveBeenCalledWith","objectContaining","any","Function","not","toHaveBeenCalled","toHaveLength","toEqual","toHaveBeenNthCalledWith","options","atomic","and","equals","exists","toHaveBeenCalledTimes","toMatchObject","args","catch","mockResolvedValueOnce","first","second","conflict","Object","assign","code","codeName","errorLabels","mockImplementationOnce","useFakeTimers","setSystemTime","Date","result","advanceTimersByTimeAsync","calls"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"statusField.d.ts","sourceRoot":"","sources":["../../src/fields/statusField.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAE1C,eAAO,MAAM,aAAa,EAAE,WAAW,CAAC,SAAS,
|
|
1
|
+
{"version":3,"file":"statusField.d.ts","sourceRoot":"","sources":["../../src/fields/statusField.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAE1C,eAAO,MAAM,aAAa,EAAE,WAAW,CAAC,SAAS,CAoChD,CAAA;AAED,KAAK,KAAK,GAAG;IACX,SAAS,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;CACjC,CAAA;AAED,eAAO,MAAM,WAAW,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,WAiB5C,CAAA"}
|
|
@@ -4,6 +4,11 @@ export const statusOptions = [
|
|
|
4
4
|
label: ({ t })=>t('plugin-ecommerce:pending'),
|
|
5
5
|
value: 'pending'
|
|
6
6
|
},
|
|
7
|
+
{
|
|
8
|
+
// @ts-expect-error - translations are not typed in plugins yet
|
|
9
|
+
label: ({ t })=>t('plugin-ecommerce:processing'),
|
|
10
|
+
value: 'processing'
|
|
11
|
+
},
|
|
7
12
|
{
|
|
8
13
|
// @ts-expect-error - translations are not typed in plugins yet
|
|
9
14
|
label: ({ t })=>t('plugin-ecommerce:succeeded'),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/fields/statusField.ts"],"sourcesContent":["import type { SelectField } from 'payload'\n\nexport const statusOptions: SelectField['options'] = [\n {\n // @ts-expect-error - translations are not typed in plugins yet\n label: ({ t }) => t('plugin-ecommerce:pending'),\n value: 'pending',\n },\n {\n // @ts-expect-error - translations are not typed in plugins yet\n label: ({ t }) => t('plugin-ecommerce:succeeded'),\n value: 'succeeded',\n },\n {\n // @ts-expect-error - translations are not typed in plugins yet\n label: ({ t }) => t('plugin-ecommerce:failed'),\n value: 'failed',\n },\n {\n // @ts-expect-error - translations are not typed in plugins yet\n label: ({ t }) => t('plugin-ecommerce:cancelled'),\n value: 'cancelled',\n },\n {\n // @ts-expect-error - translations are not typed in plugins yet\n label: ({ t }) => t('plugin-ecommerce:expired'),\n value: 'expired',\n },\n {\n // @ts-expect-error - translations are not typed in plugins yet\n label: ({ t }) => t('plugin-ecommerce:refunded'),\n value: 'refunded',\n },\n]\n\ntype Props = {\n overrides?: Partial<SelectField>\n}\n\nexport const statusField: (props?: Props) => SelectField = (props) => {\n const { overrides } = props || {}\n\n // @ts-expect-error - issue with payload types\n const field: SelectField = {\n name: 'status',\n type: 'select',\n defaultValue: 'pending',\n label: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:status'),\n options: statusOptions,\n required: true,\n ...overrides,\n }\n\n return field\n}\n"],"names":["statusOptions","label","t","value","statusField","props","overrides","field","name","type","defaultValue","options","required"],"mappings":"AAEA,OAAO,MAAMA,gBAAwC;IACnD;QACE,+DAA+D;QAC/DC,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;QACpBC,OAAO;IACT;IACA;QACE,+DAA+D;QAC/DF,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;QACpBC,OAAO;IACT;IACA;QACE,+DAA+D;QAC/DF,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;QACpBC,OAAO;IACT;IACA;QACE,+DAA+D;QAC/DF,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;QACpBC,OAAO;IACT;IACA;QACE,+DAA+D;QAC/DF,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;QACpBC,OAAO;IACT;IACA;QACE,+DAA+D;QAC/DF,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;QACpBC,OAAO;IACT;CACD,CAAA;AAMD,OAAO,MAAMC,cAA8C,CAACC;IAC1D,MAAM,EAAEC,SAAS,EAAE,GAAGD,SAAS,CAAC;IAEhC,8CAA8C;IAC9C,MAAME,QAAqB;QACzBC,MAAM;QACNC,MAAM;QACNC,cAAc;QACdT,OAAO,CAAC,EAAEC,CAAC,EAAE,GACX,+DAA+D;YAC/DA,EAAE;QACJS,SAASX;QACTY,UAAU;QACV,GAAGN,SAAS;IACd;IAEA,OAAOC;AACT,EAAC"}
|
|
1
|
+
{"version":3,"sources":["../../src/fields/statusField.ts"],"sourcesContent":["import type { SelectField } from 'payload'\n\nexport const statusOptions: SelectField['options'] = [\n {\n // @ts-expect-error - translations are not typed in plugins yet\n label: ({ t }) => t('plugin-ecommerce:pending'),\n value: 'pending',\n },\n {\n // @ts-expect-error - translations are not typed in plugins yet\n label: ({ t }) => t('plugin-ecommerce:processing'),\n value: 'processing',\n },\n {\n // @ts-expect-error - translations are not typed in plugins yet\n label: ({ t }) => t('plugin-ecommerce:succeeded'),\n value: 'succeeded',\n },\n {\n // @ts-expect-error - translations are not typed in plugins yet\n label: ({ t }) => t('plugin-ecommerce:failed'),\n value: 'failed',\n },\n {\n // @ts-expect-error - translations are not typed in plugins yet\n label: ({ t }) => t('plugin-ecommerce:cancelled'),\n value: 'cancelled',\n },\n {\n // @ts-expect-error - translations are not typed in plugins yet\n label: ({ t }) => t('plugin-ecommerce:expired'),\n value: 'expired',\n },\n {\n // @ts-expect-error - translations are not typed in plugins yet\n label: ({ t }) => t('plugin-ecommerce:refunded'),\n value: 'refunded',\n },\n]\n\ntype Props = {\n overrides?: Partial<SelectField>\n}\n\nexport const statusField: (props?: Props) => SelectField = (props) => {\n const { overrides } = props || {}\n\n // @ts-expect-error - issue with payload types\n const field: SelectField = {\n name: 'status',\n type: 'select',\n defaultValue: 'pending',\n label: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:status'),\n options: statusOptions,\n required: true,\n ...overrides,\n }\n\n return field\n}\n"],"names":["statusOptions","label","t","value","statusField","props","overrides","field","name","type","defaultValue","options","required"],"mappings":"AAEA,OAAO,MAAMA,gBAAwC;IACnD;QACE,+DAA+D;QAC/DC,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;QACpBC,OAAO;IACT;IACA;QACE,+DAA+D;QAC/DF,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;QACpBC,OAAO;IACT;IACA;QACE,+DAA+D;QAC/DF,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;QACpBC,OAAO;IACT;IACA;QACE,+DAA+D;QAC/DF,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;QACpBC,OAAO;IACT;IACA;QACE,+DAA+D;QAC/DF,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;QACpBC,OAAO;IACT;IACA;QACE,+DAA+D;QAC/DF,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;QACpBC,OAAO;IACT;IACA;QACE,+DAA+D;QAC/DF,OAAO,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE;QACpBC,OAAO;IACT;CACD,CAAA;AAMD,OAAO,MAAMC,cAA8C,CAACC;IAC1D,MAAM,EAAEC,SAAS,EAAE,GAAGD,SAAS,CAAC;IAEhC,8CAA8C;IAC9C,MAAME,QAAqB;QACzBC,MAAM;QACNC,MAAM;QACNC,cAAc;QACdT,OAAO,CAAC,EAAEC,CAAC,EAAE,GACX,+DAA+D;YAC/DA,EAAE;QACJS,SAASX;QACTY,UAAU;QACV,GAAGN,SAAS;IACd;IAEA,OAAOC;AACT,EAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { statusOptions } from './statusField.js';
|
|
3
|
+
describe('statusOptions', ()=>{
|
|
4
|
+
it('should expose processing for an atomically claimed transaction', ()=>{
|
|
5
|
+
expect(statusOptions.map((option)=>typeof option === 'string' ? option : option.value)).toContain('processing');
|
|
6
|
+
});
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
//# sourceMappingURL=statusField.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/fields/statusField.spec.ts"],"sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { statusOptions } from './statusField.js'\n\ndescribe('statusOptions', () => {\n it('should expose processing for an atomically claimed transaction', () => {\n expect(\n statusOptions.map((option) => (typeof option === 'string' ? option : option.value)),\n ).toContain('processing')\n })\n})\n"],"names":["describe","expect","it","statusOptions","map","option","value","toContain"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,SAAQ;AAE7C,SAASC,aAAa,QAAQ,mBAAkB;AAEhDH,SAAS,iBAAiB;IACxBE,GAAG,kEAAkE;QACnED,OACEE,cAAcC,GAAG,CAAC,CAACC,SAAY,OAAOA,WAAW,WAAWA,SAASA,OAAOC,KAAK,GACjFC,SAAS,CAAC;IACd;AACF"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAY,MAAM,SAAS,CAAA;AAK/C,OAAO,KAAK,EAAE,qBAAqB,EAAkC,MAAM,kBAAkB,CAAA;AAE7F,OAAO,EAAE,yBAAyB,EAAE,MAAM,sDAAsD,CAAA;AAChG,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAA;AACpF,OAAO,EAAE,sBAAsB,EAAE,MAAM,gDAAgD,CAAA;AACvF,OAAO,EAAE,wBAAwB,EAAE,MAAM,oDAAoD,CAAA;AAC7F,OAAO,EAAE,4BAA4B,EAAE,MAAM,4DAA4D,CAAA;AACzG,OAAO,EAAE,8BAA8B,EAAE,MAAM,0DAA0D,CAAA;AACzG,OAAO,EAAE,wBAAwB,EAAE,MAAM,0DAA0D,CAAA;AACnG,OAAO,EAAE,4BAA4B,EAAE,MAAM,wDAAwD,CAAA;AAQrG,eAAO,MAAM,eAAe,kBACV,qBAAqB,sBACd,MAAM,KAAG,OAAO,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAY,MAAM,SAAS,CAAA;AAK/C,OAAO,KAAK,EAAE,qBAAqB,EAAkC,MAAM,kBAAkB,CAAA;AAE7F,OAAO,EAAE,yBAAyB,EAAE,MAAM,sDAAsD,CAAA;AAChG,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAA;AACpF,OAAO,EAAE,sBAAsB,EAAE,MAAM,gDAAgD,CAAA;AACvF,OAAO,EAAE,wBAAwB,EAAE,MAAM,oDAAoD,CAAA;AAC7F,OAAO,EAAE,4BAA4B,EAAE,MAAM,4DAA4D,CAAA;AACzG,OAAO,EAAE,8BAA8B,EAAE,MAAM,0DAA0D,CAAA;AACzG,OAAO,EAAE,wBAAwB,EAAE,MAAM,0DAA0D,CAAA;AACnG,OAAO,EAAE,4BAA4B,EAAE,MAAM,wDAAwD,CAAA;AAQrG,eAAO,MAAM,eAAe,kBACV,qBAAqB,sBACd,MAAM,KAAG,OAAO,CAAC,MAAM,CAsV7C,CAAA;AAEH,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,EACxB,4BAA4B,EAC5B,8BAA8B,EAC9B,wBAAwB,EACxB,4BAA4B,GAC7B,CAAA;AAED,OAAO,EAAE,OAAO,EAAE,MAAM,2CAA2C,CAAA;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,6CAA6C,CAAA;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0DAA0D,CAAA;AACjG,OAAO,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAA;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAA;AAC3E,YAAY,EACV,WAAW,EACX,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EACjB,WAAW,EACX,eAAe,EACf,cAAc,EACd,cAAc,GACf,MAAM,yCAAyC,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAA;AACzE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -121,6 +121,7 @@ export const ecommercePlugin = (pluginConfig)=>async (incomingConfig)=>{
|
|
|
121
121
|
customersSlug: collectionSlugMap.customers,
|
|
122
122
|
enableVariants,
|
|
123
123
|
productsSlug: collectionSlugMap.products,
|
|
124
|
+
transactionsSlug: collectionSlugMap.transactions,
|
|
124
125
|
variantsSlug: collectionSlugMap.variants ?? 'variants'
|
|
125
126
|
});
|
|
126
127
|
const ordersCollection = sanitizedPluginConfig.orders && typeof sanitizedPluginConfig.orders === 'object' && 'ordersCollectionOverride' in sanitizedPluginConfig.orders && sanitizedPluginConfig.orders.ordersCollectionOverride ? await sanitizedPluginConfig.orders.ordersCollectionOverride({
|