@payloadcms/plugin-ecommerce 4.0.0-canary.35 → 4.0.0-canary.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/dist/collections/carts/beforeChange.d.ts.map +1 -1
  2. package/dist/collections/carts/beforeChange.js +2 -0
  3. package/dist/collections/carts/beforeChange.js.map +1 -1
  4. package/dist/collections/variants/createVariantsCollection/hooks/beforeChange.d.ts.map +1 -1
  5. package/dist/collections/variants/createVariantsCollection/hooks/beforeChange.js +2 -0
  6. package/dist/collections/variants/createVariantsCollection/hooks/beforeChange.js.map +1 -1
  7. package/dist/collections/variants/createVariantsCollection/hooks/validateOptions.d.ts.map +1 -1
  8. package/dist/collections/variants/createVariantsCollection/hooks/validateOptions.js +1 -0
  9. package/dist/collections/variants/createVariantsCollection/hooks/validateOptions.js.map +1 -1
  10. package/dist/endpoints/confirmOrder.js +7 -0
  11. package/dist/endpoints/confirmOrder.js.map +1 -1
  12. package/dist/endpoints/initiatePayment.d.ts.map +1 -1
  13. package/dist/endpoints/initiatePayment.js +2 -0
  14. package/dist/endpoints/initiatePayment.js.map +1 -1
  15. package/dist/payments/adapters/stripe/confirmOrder.js +1 -0
  16. package/dist/payments/adapters/stripe/confirmOrder.js.map +1 -1
  17. package/dist/payments/adapters/stripe/initiatePayment.d.ts.map +1 -1
  18. package/dist/payments/adapters/stripe/initiatePayment.js +1 -0
  19. package/dist/payments/adapters/stripe/initiatePayment.js.map +1 -1
  20. package/dist/react/provider/index.d.ts.map +1 -1
  21. package/dist/react/provider/index.js +75 -34
  22. package/dist/react/provider/index.js.map +1 -1
  23. package/dist/ui/VariantOptionsSelector/index.d.ts.map +1 -1
  24. package/dist/ui/VariantOptionsSelector/index.js +3 -1
  25. package/dist/ui/VariantOptionsSelector/index.js.map +1 -1
  26. package/package.json +8 -8
  27. package/dist/collections/carts/operations/defaultCartItemMatcher.spec.js +0 -358
  28. package/dist/collections/carts/operations/defaultCartItemMatcher.spec.js.map +0 -1
  29. package/dist/collections/orders/createOrdersCollection.spec.js +0 -20
  30. package/dist/collections/orders/createOrdersCollection.spec.js.map +0 -1
  31. package/dist/endpoints/confirmOrder.spec.js +0 -509
  32. package/dist/endpoints/confirmOrder.spec.js.map +0 -1
  33. package/dist/fields/statusField.spec.js +0 -9
  34. package/dist/fields/statusField.spec.js.map +0 -1
  35. package/dist/payments/adapters/stripe/confirmOrder.spec.js +0 -255
  36. package/dist/payments/adapters/stripe/confirmOrder.spec.js.map +0 -1
  37. package/dist/payments/adapters/stripe/validateSettlement.spec.js +0 -434
  38. package/dist/payments/adapters/stripe/validateSettlement.spec.js.map +0 -1
  39. package/dist/utilities/accessComposition.spec.js +0 -765
  40. package/dist/utilities/accessComposition.spec.js.map +0 -1
  41. package/dist/utilities/defaultProductsValidation.spec.js +0 -384
  42. package/dist/utilities/defaultProductsValidation.spec.js.map +0 -1
  43. package/dist/utilities/getCollectionSlugMap.spec.js +0 -254
  44. package/dist/utilities/getCollectionSlugMap.spec.js.map +0 -1
  45. package/dist/utilities/sanitizePluginConfig.spec.js +0 -516
  46. package/dist/utilities/sanitizePluginConfig.spec.js.map +0 -1
@@ -1,509 +0,0 @@
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
@@ -1 +0,0 @@
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,9 +0,0 @@
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
@@ -1 +0,0 @@
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"}