@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.
- package/dist/collections/carts/beforeChange.d.ts.map +1 -1
- package/dist/collections/carts/beforeChange.js +2 -0
- package/dist/collections/carts/beforeChange.js.map +1 -1
- package/dist/collections/variants/createVariantsCollection/hooks/beforeChange.d.ts.map +1 -1
- package/dist/collections/variants/createVariantsCollection/hooks/beforeChange.js +2 -0
- package/dist/collections/variants/createVariantsCollection/hooks/beforeChange.js.map +1 -1
- package/dist/collections/variants/createVariantsCollection/hooks/validateOptions.d.ts.map +1 -1
- package/dist/collections/variants/createVariantsCollection/hooks/validateOptions.js +1 -0
- package/dist/collections/variants/createVariantsCollection/hooks/validateOptions.js.map +1 -1
- package/dist/endpoints/confirmOrder.js +7 -0
- package/dist/endpoints/confirmOrder.js.map +1 -1
- package/dist/endpoints/initiatePayment.d.ts.map +1 -1
- package/dist/endpoints/initiatePayment.js +2 -0
- package/dist/endpoints/initiatePayment.js.map +1 -1
- package/dist/payments/adapters/stripe/confirmOrder.js +1 -0
- package/dist/payments/adapters/stripe/confirmOrder.js.map +1 -1
- package/dist/payments/adapters/stripe/initiatePayment.d.ts.map +1 -1
- package/dist/payments/adapters/stripe/initiatePayment.js +1 -0
- package/dist/payments/adapters/stripe/initiatePayment.js.map +1 -1
- package/dist/react/provider/index.d.ts.map +1 -1
- package/dist/react/provider/index.js +75 -34
- package/dist/react/provider/index.js.map +1 -1
- package/dist/ui/VariantOptionsSelector/index.d.ts.map +1 -1
- package/dist/ui/VariantOptionsSelector/index.js +3 -1
- package/dist/ui/VariantOptionsSelector/index.js.map +1 -1
- package/package.json +8 -8
- package/dist/collections/carts/operations/defaultCartItemMatcher.spec.js +0 -358
- package/dist/collections/carts/operations/defaultCartItemMatcher.spec.js.map +0 -1
- package/dist/collections/orders/createOrdersCollection.spec.js +0 -20
- package/dist/collections/orders/createOrdersCollection.spec.js.map +0 -1
- package/dist/endpoints/confirmOrder.spec.js +0 -509
- package/dist/endpoints/confirmOrder.spec.js.map +0 -1
- package/dist/fields/statusField.spec.js +0 -9
- package/dist/fields/statusField.spec.js.map +0 -1
- package/dist/payments/adapters/stripe/confirmOrder.spec.js +0 -255
- package/dist/payments/adapters/stripe/confirmOrder.spec.js.map +0 -1
- package/dist/payments/adapters/stripe/validateSettlement.spec.js +0 -434
- package/dist/payments/adapters/stripe/validateSettlement.spec.js.map +0 -1
- package/dist/utilities/accessComposition.spec.js +0 -765
- package/dist/utilities/accessComposition.spec.js.map +0 -1
- package/dist/utilities/defaultProductsValidation.spec.js +0 -384
- package/dist/utilities/defaultProductsValidation.spec.js.map +0 -1
- package/dist/utilities/getCollectionSlugMap.spec.js +0 -254
- package/dist/utilities/getCollectionSlugMap.spec.js.map +0 -1
- package/dist/utilities/sanitizePluginConfig.spec.js +0 -516
- package/dist/utilities/sanitizePluginConfig.spec.js.map +0 -1
|
@@ -1,255 +0,0 @@
|
|
|
1
|
-
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
-
const mockPaymentIntentsRetrieve = vi.fn();
|
|
3
|
-
vi.mock('stripe', ()=>{
|
|
4
|
-
const MockStripe = function() {
|
|
5
|
-
return {
|
|
6
|
-
paymentIntents: {
|
|
7
|
-
retrieve: mockPaymentIntentsRetrieve
|
|
8
|
-
}
|
|
9
|
-
};
|
|
10
|
-
};
|
|
11
|
-
return {
|
|
12
|
-
default: MockStripe
|
|
13
|
-
};
|
|
14
|
-
});
|
|
15
|
-
import { confirmOrder } from './confirmOrder.js';
|
|
16
|
-
const createTransaction = (overrides = {})=>({
|
|
17
|
-
amount: 1000,
|
|
18
|
-
cart: 'cart-123',
|
|
19
|
-
currency: 'USD',
|
|
20
|
-
customer: 'user-123',
|
|
21
|
-
id: 'txn-123',
|
|
22
|
-
items: [
|
|
23
|
-
{
|
|
24
|
-
id: 'item-1',
|
|
25
|
-
product: 'product-123',
|
|
26
|
-
quantity: 1
|
|
27
|
-
}
|
|
28
|
-
],
|
|
29
|
-
order: undefined,
|
|
30
|
-
status: 'pending',
|
|
31
|
-
stripe: {
|
|
32
|
-
customerID: 'cus-123',
|
|
33
|
-
paymentIntentID: 'pi_123'
|
|
34
|
-
},
|
|
35
|
-
...overrides
|
|
36
|
-
});
|
|
37
|
-
const createPaymentIntent = (overrides = {})=>({
|
|
38
|
-
amount: 1000,
|
|
39
|
-
currency: 'usd',
|
|
40
|
-
customer: 'cus-123',
|
|
41
|
-
id: 'pi_123',
|
|
42
|
-
metadata: {
|
|
43
|
-
cartID: 'cart-123',
|
|
44
|
-
cartItemsSnapshot: JSON.stringify([
|
|
45
|
-
{
|
|
46
|
-
id: 'item-1',
|
|
47
|
-
product: 'product-123',
|
|
48
|
-
quantity: 1
|
|
49
|
-
}
|
|
50
|
-
]),
|
|
51
|
-
shippingAddress: JSON.stringify({
|
|
52
|
-
city: 'Test City'
|
|
53
|
-
})
|
|
54
|
-
},
|
|
55
|
-
status: 'succeeded',
|
|
56
|
-
...overrides
|
|
57
|
-
});
|
|
58
|
-
const createHarness = ({ transaction = createTransaction(), transactionCopies = 1, user = {
|
|
59
|
-
id: 'user-123'
|
|
60
|
-
} } = {})=>{
|
|
61
|
-
const find = vi.fn().mockResolvedValue({
|
|
62
|
-
docs: Array.from({
|
|
63
|
-
length: transactionCopies
|
|
64
|
-
}, ()=>transaction),
|
|
65
|
-
totalDocs: transactionCopies
|
|
66
|
-
});
|
|
67
|
-
const loggerError = vi.fn();
|
|
68
|
-
const finalizeOrder = vi.fn().mockResolvedValue({
|
|
69
|
-
accessToken: 'access-123',
|
|
70
|
-
id: 'order-123'
|
|
71
|
-
});
|
|
72
|
-
const req = {
|
|
73
|
-
payload: {
|
|
74
|
-
find,
|
|
75
|
-
logger: {
|
|
76
|
-
error: loggerError
|
|
77
|
-
}
|
|
78
|
-
},
|
|
79
|
-
user
|
|
80
|
-
};
|
|
81
|
-
return {
|
|
82
|
-
finalizeOrder,
|
|
83
|
-
find,
|
|
84
|
-
loggerError,
|
|
85
|
-
req
|
|
86
|
-
};
|
|
87
|
-
};
|
|
88
|
-
const runConfirmation = ({ data = {}, harness })=>confirmOrder({
|
|
89
|
-
secretKey: 'sk_test_123'
|
|
90
|
-
})({
|
|
91
|
-
data: {
|
|
92
|
-
cartID: 'cart-123',
|
|
93
|
-
customerEmail: 'buyer@example.com',
|
|
94
|
-
paymentIntentID: 'pi_123',
|
|
95
|
-
...data
|
|
96
|
-
},
|
|
97
|
-
finalizeOrder: harness.finalizeOrder,
|
|
98
|
-
req: harness.req
|
|
99
|
-
});
|
|
100
|
-
describe('confirmOrder', ()=>{
|
|
101
|
-
beforeEach(()=>{
|
|
102
|
-
vi.clearAllMocks();
|
|
103
|
-
mockPaymentIntentsRetrieve.mockResolvedValue(createPaymentIntent());
|
|
104
|
-
});
|
|
105
|
-
it('should delegate provider-validated settlement data to the core finalizer', async ()=>{
|
|
106
|
-
const harness = createHarness();
|
|
107
|
-
const result = await runConfirmation({
|
|
108
|
-
harness
|
|
109
|
-
});
|
|
110
|
-
expect(harness.finalizeOrder).toHaveBeenCalledWith({
|
|
111
|
-
orderData: {
|
|
112
|
-
amount: 1000,
|
|
113
|
-
currency: 'USD',
|
|
114
|
-
customer: 'user-123',
|
|
115
|
-
items: [
|
|
116
|
-
{
|
|
117
|
-
id: 'item-1',
|
|
118
|
-
product: 'product-123',
|
|
119
|
-
quantity: 1
|
|
120
|
-
}
|
|
121
|
-
],
|
|
122
|
-
shippingAddress: {
|
|
123
|
-
city: 'Test City'
|
|
124
|
-
},
|
|
125
|
-
status: 'processing'
|
|
126
|
-
},
|
|
127
|
-
transactionID: 'txn-123'
|
|
128
|
-
});
|
|
129
|
-
expect(result).toEqual({
|
|
130
|
-
accessToken: 'access-123',
|
|
131
|
-
message: 'Payment initiated successfully',
|
|
132
|
-
orderID: 'order-123',
|
|
133
|
-
transactionID: 'txn-123'
|
|
134
|
-
});
|
|
135
|
-
});
|
|
136
|
-
it('should return the transaction ID again when the core finalizer returns an existing order', async ()=>{
|
|
137
|
-
const harness = createHarness();
|
|
138
|
-
harness.finalizeOrder.mockResolvedValue({
|
|
139
|
-
accessToken: 'existing-access',
|
|
140
|
-
id: 'existing-order'
|
|
141
|
-
});
|
|
142
|
-
const result = await runConfirmation({
|
|
143
|
-
harness
|
|
144
|
-
});
|
|
145
|
-
expect(result).toEqual({
|
|
146
|
-
accessToken: 'existing-access',
|
|
147
|
-
message: 'Payment initiated successfully',
|
|
148
|
-
orderID: 'existing-order',
|
|
149
|
-
transactionID: 'txn-123'
|
|
150
|
-
});
|
|
151
|
-
});
|
|
152
|
-
it('should delegate guest order ownership using the validated email', async ()=>{
|
|
153
|
-
const harness = createHarness({
|
|
154
|
-
transaction: createTransaction({
|
|
155
|
-
customer: undefined,
|
|
156
|
-
customerEmail: 'buyer@example.com',
|
|
157
|
-
stripe: {
|
|
158
|
-
customerID: 'cus-guest',
|
|
159
|
-
paymentIntentID: 'pi_123'
|
|
160
|
-
}
|
|
161
|
-
}),
|
|
162
|
-
user: null
|
|
163
|
-
});
|
|
164
|
-
mockPaymentIntentsRetrieve.mockResolvedValue(createPaymentIntent({
|
|
165
|
-
customer: 'cus-guest'
|
|
166
|
-
}));
|
|
167
|
-
await runConfirmation({
|
|
168
|
-
harness
|
|
169
|
-
});
|
|
170
|
-
expect(harness.finalizeOrder).toHaveBeenCalledWith({
|
|
171
|
-
orderData: expect.objectContaining({
|
|
172
|
-
customerEmail: 'buyer@example.com'
|
|
173
|
-
}),
|
|
174
|
-
transactionID: 'txn-123'
|
|
175
|
-
});
|
|
176
|
-
});
|
|
177
|
-
it.each([
|
|
178
|
-
'requires_payment_method',
|
|
179
|
-
'canceled',
|
|
180
|
-
'processing'
|
|
181
|
-
])('should reject a PaymentIntent with %s status before finalization', async (status)=>{
|
|
182
|
-
const harness = createHarness();
|
|
183
|
-
mockPaymentIntentsRetrieve.mockResolvedValue(createPaymentIntent({
|
|
184
|
-
status
|
|
185
|
-
}));
|
|
186
|
-
await expect(runConfirmation({
|
|
187
|
-
harness
|
|
188
|
-
})).rejects.toThrow('Payment not completed.');
|
|
189
|
-
expect(harness.finalizeOrder).not.toHaveBeenCalled();
|
|
190
|
-
});
|
|
191
|
-
it('should reject multiple matching transactions before finalization', async ()=>{
|
|
192
|
-
const harness = createHarness({
|
|
193
|
-
transactionCopies: 2
|
|
194
|
-
});
|
|
195
|
-
await expect(runConfirmation({
|
|
196
|
-
harness
|
|
197
|
-
})).rejects.toThrow('exactly one transaction');
|
|
198
|
-
expect(mockPaymentIntentsRetrieve).not.toHaveBeenCalled();
|
|
199
|
-
expect(harness.finalizeOrder).not.toHaveBeenCalled();
|
|
200
|
-
});
|
|
201
|
-
it('should reject a transaction that does not belong to the canonical cart', async ()=>{
|
|
202
|
-
const harness = createHarness({
|
|
203
|
-
transaction: createTransaction({
|
|
204
|
-
cart: 'cart-other'
|
|
205
|
-
})
|
|
206
|
-
});
|
|
207
|
-
await expect(runConfirmation({
|
|
208
|
-
harness
|
|
209
|
-
})).rejects.toThrow('cart');
|
|
210
|
-
expect(harness.finalizeOrder).not.toHaveBeenCalled();
|
|
211
|
-
});
|
|
212
|
-
it('should reject provider amount drift before finalization', async ()=>{
|
|
213
|
-
const harness = createHarness();
|
|
214
|
-
mockPaymentIntentsRetrieve.mockResolvedValue(createPaymentIntent({
|
|
215
|
-
amount: 999
|
|
216
|
-
}));
|
|
217
|
-
await expect(runConfirmation({
|
|
218
|
-
harness
|
|
219
|
-
})).rejects.toThrow('amount');
|
|
220
|
-
expect(harness.finalizeOrder).not.toHaveBeenCalled();
|
|
221
|
-
});
|
|
222
|
-
it('should reject provider item drift before finalization', async ()=>{
|
|
223
|
-
const harness = createHarness();
|
|
224
|
-
mockPaymentIntentsRetrieve.mockResolvedValue(createPaymentIntent({
|
|
225
|
-
metadata: {
|
|
226
|
-
...createPaymentIntent().metadata,
|
|
227
|
-
cartItemsSnapshot: JSON.stringify([
|
|
228
|
-
{
|
|
229
|
-
id: 'item-1',
|
|
230
|
-
product: 'product-123',
|
|
231
|
-
quantity: 2
|
|
232
|
-
}
|
|
233
|
-
])
|
|
234
|
-
}
|
|
235
|
-
}));
|
|
236
|
-
await expect(runConfirmation({
|
|
237
|
-
harness
|
|
238
|
-
})).rejects.toThrow('items');
|
|
239
|
-
expect(harness.finalizeOrder).not.toHaveBeenCalled();
|
|
240
|
-
});
|
|
241
|
-
it('should log and propagate finalization failures', async ()=>{
|
|
242
|
-
const harness = createHarness();
|
|
243
|
-
const error = new Error('inventory update failed');
|
|
244
|
-
harness.finalizeOrder.mockRejectedValue(error);
|
|
245
|
-
await expect(runConfirmation({
|
|
246
|
-
harness
|
|
247
|
-
})).rejects.toThrow(error.message);
|
|
248
|
-
expect(harness.loggerError).toHaveBeenCalledWith({
|
|
249
|
-
err: error,
|
|
250
|
-
msg: 'Error confirming order with Stripe'
|
|
251
|
-
});
|
|
252
|
-
});
|
|
253
|
-
});
|
|
254
|
-
|
|
255
|
-
//# sourceMappingURL=confirmOrder.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/payments/adapters/stripe/confirmOrder.spec.ts"],"sourcesContent":["import { beforeEach, describe, expect, it, vi } from 'vitest'\n\nconst mockPaymentIntentsRetrieve = vi.fn()\n\nvi.mock('stripe', () => {\n const MockStripe = function () {\n return {\n paymentIntents: {\n retrieve: mockPaymentIntentsRetrieve,\n },\n }\n }\n\n return { default: MockStripe }\n})\n\nimport { confirmOrder } from './confirmOrder.js'\n\ntype ConfirmOrderArgs = Parameters<ReturnType<typeof confirmOrder>>[0]\n\nconst createTransaction = (overrides: Record<string, unknown> = {}) => ({\n amount: 1000,\n cart: 'cart-123',\n currency: 'USD',\n customer: 'user-123',\n id: 'txn-123',\n items: [{ id: 'item-1', product: 'product-123', quantity: 1 }],\n order: undefined,\n status: 'pending',\n stripe: {\n customerID: 'cus-123',\n paymentIntentID: 'pi_123',\n },\n ...overrides,\n})\n\nconst createPaymentIntent = (overrides: Record<string, unknown> = {}) => ({\n amount: 1000,\n currency: 'usd',\n customer: 'cus-123',\n id: 'pi_123',\n metadata: {\n cartID: 'cart-123',\n cartItemsSnapshot: JSON.stringify([{ id: 'item-1', product: 'product-123', quantity: 1 }]),\n shippingAddress: JSON.stringify({ city: 'Test City' }),\n },\n status: 'succeeded',\n ...overrides,\n})\n\nconst createHarness = ({\n transaction = createTransaction(),\n transactionCopies = 1,\n user = { id: 'user-123' } as null | Record<string, unknown>,\n}: {\n transaction?: Record<string, unknown>\n transactionCopies?: number\n user?: null | Record<string, unknown>\n} = {}) => {\n const find = vi.fn().mockResolvedValue({\n docs: Array.from({ length: transactionCopies }, () => transaction),\n totalDocs: transactionCopies,\n })\n const loggerError = vi.fn()\n const finalizeOrder = vi.fn().mockResolvedValue({ accessToken: 'access-123', id: 'order-123' })\n const req = {\n payload: {\n find,\n logger: { error: loggerError },\n },\n user,\n } as unknown as ConfirmOrderArgs['req']\n\n return { finalizeOrder, find, loggerError, req }\n}\n\nconst runConfirmation = ({\n data = {},\n harness,\n}: {\n data?: Record<string, unknown>\n harness: ReturnType<typeof createHarness>\n}) =>\n confirmOrder({ secretKey: 'sk_test_123' })({\n data: {\n cartID: 'cart-123',\n customerEmail: 'buyer@example.com',\n paymentIntentID: 'pi_123',\n ...data,\n },\n finalizeOrder: harness.finalizeOrder,\n req: harness.req,\n })\n\ndescribe('confirmOrder', () => {\n beforeEach(() => {\n vi.clearAllMocks()\n mockPaymentIntentsRetrieve.mockResolvedValue(createPaymentIntent())\n })\n\n it('should delegate provider-validated settlement data to the core finalizer', async () => {\n const harness = createHarness()\n\n const result = await runConfirmation({ harness })\n\n expect(harness.finalizeOrder).toHaveBeenCalledWith({\n orderData: {\n amount: 1000,\n currency: 'USD',\n customer: 'user-123',\n items: [{ id: 'item-1', product: 'product-123', quantity: 1 }],\n shippingAddress: { city: 'Test City' },\n status: 'processing',\n },\n transactionID: 'txn-123',\n })\n expect(result).toEqual({\n accessToken: 'access-123',\n message: 'Payment initiated successfully',\n orderID: 'order-123',\n transactionID: 'txn-123',\n })\n })\n\n it('should return the transaction ID again when the core finalizer returns an existing order', async () => {\n const harness = createHarness()\n harness.finalizeOrder.mockResolvedValue({\n accessToken: 'existing-access',\n id: 'existing-order',\n })\n\n const result = await runConfirmation({ harness })\n\n expect(result).toEqual({\n accessToken: 'existing-access',\n message: 'Payment initiated successfully',\n orderID: 'existing-order',\n transactionID: 'txn-123',\n })\n })\n\n it('should delegate guest order ownership using the validated email', async () => {\n const harness = createHarness({\n transaction: createTransaction({\n customer: undefined,\n customerEmail: 'buyer@example.com',\n stripe: {\n customerID: 'cus-guest',\n paymentIntentID: 'pi_123',\n },\n }),\n user: null,\n })\n mockPaymentIntentsRetrieve.mockResolvedValue(createPaymentIntent({ customer: 'cus-guest' }))\n\n await runConfirmation({ harness })\n\n expect(harness.finalizeOrder).toHaveBeenCalledWith({\n orderData: expect.objectContaining({ customerEmail: 'buyer@example.com' }),\n transactionID: 'txn-123',\n })\n })\n\n it.each(['requires_payment_method', 'canceled', 'processing'])(\n 'should reject a PaymentIntent with %s status before finalization',\n async (status) => {\n const harness = createHarness()\n mockPaymentIntentsRetrieve.mockResolvedValue(createPaymentIntent({ status }))\n\n await expect(runConfirmation({ harness })).rejects.toThrow('Payment not completed.')\n\n expect(harness.finalizeOrder).not.toHaveBeenCalled()\n },\n )\n\n it('should reject multiple matching transactions before finalization', async () => {\n const harness = createHarness({ transactionCopies: 2 })\n\n await expect(runConfirmation({ harness })).rejects.toThrow('exactly one transaction')\n\n expect(mockPaymentIntentsRetrieve).not.toHaveBeenCalled()\n expect(harness.finalizeOrder).not.toHaveBeenCalled()\n })\n\n it('should reject a transaction that does not belong to the canonical cart', async () => {\n const harness = createHarness({\n transaction: createTransaction({ cart: 'cart-other' }),\n })\n\n await expect(runConfirmation({ harness })).rejects.toThrow('cart')\n\n expect(harness.finalizeOrder).not.toHaveBeenCalled()\n })\n\n it('should reject provider amount drift before finalization', async () => {\n const harness = createHarness()\n mockPaymentIntentsRetrieve.mockResolvedValue(createPaymentIntent({ amount: 999 }))\n\n await expect(runConfirmation({ harness })).rejects.toThrow('amount')\n\n expect(harness.finalizeOrder).not.toHaveBeenCalled()\n })\n\n it('should reject provider item drift before finalization', async () => {\n const harness = createHarness()\n mockPaymentIntentsRetrieve.mockResolvedValue(\n createPaymentIntent({\n metadata: {\n ...createPaymentIntent().metadata,\n cartItemsSnapshot: JSON.stringify([\n { id: 'item-1', product: 'product-123', quantity: 2 },\n ]),\n },\n }),\n )\n\n await expect(runConfirmation({ harness })).rejects.toThrow('items')\n\n expect(harness.finalizeOrder).not.toHaveBeenCalled()\n })\n\n it('should log and propagate finalization failures', async () => {\n const harness = createHarness()\n const error = new Error('inventory update failed')\n harness.finalizeOrder.mockRejectedValue(error)\n\n await expect(runConfirmation({ harness })).rejects.toThrow(error.message)\n\n expect(harness.loggerError).toHaveBeenCalledWith({\n err: error,\n msg: 'Error confirming order with Stripe',\n })\n })\n})\n"],"names":["beforeEach","describe","expect","it","vi","mockPaymentIntentsRetrieve","fn","mock","MockStripe","paymentIntents","retrieve","default","confirmOrder","createTransaction","overrides","amount","cart","currency","customer","id","items","product","quantity","order","undefined","status","stripe","customerID","paymentIntentID","createPaymentIntent","metadata","cartID","cartItemsSnapshot","JSON","stringify","shippingAddress","city","createHarness","transaction","transactionCopies","user","find","mockResolvedValue","docs","Array","from","length","totalDocs","loggerError","finalizeOrder","accessToken","req","payload","logger","error","runConfirmation","data","harness","secretKey","customerEmail","clearAllMocks","result","toHaveBeenCalledWith","orderData","transactionID","toEqual","message","orderID","objectContaining","each","rejects","toThrow","not","toHaveBeenCalled","Error","mockRejectedValue","err","msg"],"mappings":"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"}
|