@payloadcms/plugin-ecommerce 3.71.0-internal.e36f916 → 3.71.0
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/addresses/createAddressesCollection.d.ts +1 -1
- package/dist/collections/addresses/createAddressesCollection.d.ts.map +1 -1
- package/dist/collections/addresses/createAddressesCollection.js +1 -1
- package/dist/collections/addresses/createAddressesCollection.js.map +1 -1
- package/dist/collections/addresses/hooks/beforeChange.d.ts +2 -3
- package/dist/collections/addresses/hooks/beforeChange.d.ts.map +1 -1
- package/dist/collections/addresses/hooks/beforeChange.js +7 -3
- package/dist/collections/addresses/hooks/beforeChange.js.map +1 -1
- package/dist/collections/carts/beforeChange.d.ts.map +1 -1
- package/dist/collections/carts/beforeChange.js.map +1 -1
- package/dist/collections/carts/createCartsCollection.d.ts +21 -0
- package/dist/collections/carts/createCartsCollection.d.ts.map +1 -1
- package/dist/collections/carts/createCartsCollection.js +27 -2
- package/dist/collections/carts/createCartsCollection.js.map +1 -1
- package/dist/collections/carts/endpoints/addItem.d.ts +19 -0
- package/dist/collections/carts/endpoints/addItem.d.ts.map +1 -0
- package/dist/collections/carts/endpoints/addItem.js +54 -0
- package/dist/collections/carts/endpoints/addItem.js.map +1 -0
- package/dist/collections/carts/endpoints/clearCart.d.ts +15 -0
- package/dist/collections/carts/endpoints/clearCart.d.ts.map +1 -0
- package/dist/collections/carts/endpoints/clearCart.js +41 -0
- package/dist/collections/carts/endpoints/clearCart.js.map +1 -0
- package/dist/collections/carts/endpoints/mergeCart.d.ts +21 -0
- package/dist/collections/carts/endpoints/mergeCart.d.ts.map +1 -0
- package/dist/collections/carts/endpoints/mergeCart.js +72 -0
- package/dist/collections/carts/endpoints/mergeCart.js.map +1 -0
- package/dist/collections/carts/endpoints/removeItem.d.ts +16 -0
- package/dist/collections/carts/endpoints/removeItem.d.ts.map +1 -0
- package/dist/collections/carts/endpoints/removeItem.js +51 -0
- package/dist/collections/carts/endpoints/removeItem.js.map +1 -0
- package/dist/collections/carts/endpoints/updateItem.d.ts +40 -0
- package/dist/collections/carts/endpoints/updateItem.d.ts.map +1 -0
- package/dist/collections/carts/endpoints/updateItem.js +95 -0
- package/dist/collections/carts/endpoints/updateItem.js.map +1 -0
- package/dist/collections/carts/hasCartSecretAccess.d.ts +2 -2
- package/dist/collections/carts/hasCartSecretAccess.js +3 -3
- package/dist/collections/carts/hasCartSecretAccess.js.map +1 -1
- package/dist/collections/carts/operations/addItem.d.ts +24 -0
- package/dist/collections/carts/operations/addItem.d.ts.map +1 -0
- package/dist/collections/carts/operations/addItem.js +95 -0
- package/dist/collections/carts/operations/addItem.js.map +1 -0
- package/dist/collections/carts/operations/clearCart.d.ts +20 -0
- package/dist/collections/carts/operations/clearCart.d.ts.map +1 -0
- package/dist/collections/carts/operations/clearCart.js +53 -0
- package/dist/collections/carts/operations/clearCart.js.map +1 -0
- package/dist/collections/carts/operations/createRequestWithSecret.d.ts +11 -0
- package/dist/collections/carts/operations/createRequestWithSecret.d.ts.map +1 -0
- package/dist/collections/carts/operations/createRequestWithSecret.js +21 -0
- package/dist/collections/carts/operations/createRequestWithSecret.js.map +1 -0
- package/dist/collections/carts/operations/defaultCartItemMatcher.d.ts +19 -0
- package/dist/collections/carts/operations/defaultCartItemMatcher.d.ts.map +1 -0
- package/dist/collections/carts/operations/defaultCartItemMatcher.js +25 -0
- package/dist/collections/carts/operations/defaultCartItemMatcher.js.map +1 -0
- package/dist/collections/carts/operations/defaultCartItemMatcher.spec.js +358 -0
- package/dist/collections/carts/operations/defaultCartItemMatcher.spec.js.map +1 -0
- package/dist/collections/carts/operations/mergeCart.d.ts +54 -0
- package/dist/collections/carts/operations/mergeCart.d.ts.map +1 -0
- package/dist/collections/carts/operations/mergeCart.js +144 -0
- package/dist/collections/carts/operations/mergeCart.js.map +1 -0
- package/dist/collections/carts/operations/removeItem.d.ts +21 -0
- package/dist/collections/carts/operations/removeItem.d.ts.map +1 -0
- package/dist/collections/carts/operations/removeItem.js +69 -0
- package/dist/collections/carts/operations/removeItem.js.map +1 -0
- package/dist/collections/carts/operations/types.d.ts +152 -0
- package/dist/collections/carts/operations/types.d.ts.map +1 -0
- package/dist/collections/carts/operations/types.js +7 -0
- package/dist/collections/carts/operations/types.js.map +1 -0
- package/dist/collections/carts/operations/updateItem.d.ts +41 -0
- package/dist/collections/carts/operations/updateItem.d.ts.map +1 -0
- package/dist/collections/carts/operations/updateItem.js +110 -0
- package/dist/collections/carts/operations/updateItem.js.map +1 -0
- package/dist/collections/variants/createVariantsCollection/index.d.ts +4 -0
- package/dist/collections/variants/createVariantsCollection/index.d.ts.map +1 -1
- package/dist/collections/variants/createVariantsCollection/index.js +8 -2
- package/dist/collections/variants/createVariantsCollection/index.js.map +1 -1
- package/dist/endpoints/confirmOrder.d.ts.map +1 -1
- package/dist/endpoints/confirmOrder.js +9 -2
- package/dist/endpoints/confirmOrder.js.map +1 -1
- package/dist/endpoints/initiatePayment.d.ts.map +1 -1
- package/dist/endpoints/initiatePayment.js +8 -2
- package/dist/endpoints/initiatePayment.js.map +1 -1
- package/dist/exports/client/react.d.ts +1 -1
- package/dist/exports/client/react.d.ts.map +1 -1
- package/dist/exports/client/react.js +1 -1
- package/dist/exports/client/react.js.map +1 -1
- package/dist/exports/types.d.ts +1 -1
- package/dist/exports/types.d.ts.map +1 -1
- package/dist/exports/types.js.map +1 -1
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- 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 +2 -2
- package/dist/payments/adapters/stripe/confirmOrder.js.map +1 -1
- package/dist/react/provider/index.d.ts +5 -4
- package/dist/react/provider/index.d.ts.map +1 -1
- package/dist/react/provider/index.js +449 -265
- package/dist/react/provider/index.js.map +1 -1
- package/dist/translations/index.d.ts +3 -4
- package/dist/translations/index.d.ts.map +1 -1
- package/dist/translations/index.js +80 -2
- package/dist/translations/index.js.map +1 -1
- package/dist/translations/languages/ar.d.ts +89 -0
- package/dist/translations/languages/ar.d.ts.map +1 -0
- package/dist/translations/languages/ar.js +92 -0
- package/dist/translations/languages/ar.js.map +1 -0
- package/dist/translations/languages/az.d.ts +89 -0
- package/dist/translations/languages/az.d.ts.map +1 -0
- package/dist/translations/languages/az.js +92 -0
- package/dist/translations/languages/az.js.map +1 -0
- package/dist/translations/languages/bg.d.ts +89 -0
- package/dist/translations/languages/bg.d.ts.map +1 -0
- package/dist/translations/languages/bg.js +92 -0
- package/dist/translations/languages/bg.js.map +1 -0
- package/dist/translations/languages/ca.d.ts +89 -0
- package/dist/translations/languages/ca.d.ts.map +1 -0
- package/dist/translations/languages/ca.js +92 -0
- package/dist/translations/languages/ca.js.map +1 -0
- package/dist/translations/languages/cs.d.ts +89 -0
- package/dist/translations/languages/cs.d.ts.map +1 -0
- package/dist/translations/languages/cs.js +92 -0
- package/dist/translations/languages/cs.js.map +1 -0
- package/dist/translations/languages/da.d.ts +89 -0
- package/dist/translations/languages/da.d.ts.map +1 -0
- package/dist/translations/languages/da.js +92 -0
- package/dist/translations/languages/da.js.map +1 -0
- package/dist/translations/languages/de.d.ts +89 -0
- package/dist/translations/languages/de.d.ts.map +1 -0
- package/dist/translations/languages/de.js +92 -0
- package/dist/translations/languages/de.js.map +1 -0
- package/dist/translations/languages/en.d.ts +89 -0
- package/dist/translations/languages/en.d.ts.map +1 -0
- package/dist/translations/languages/en.js +92 -0
- package/dist/translations/languages/en.js.map +1 -0
- package/dist/translations/languages/es.d.ts +89 -0
- package/dist/translations/languages/es.d.ts.map +1 -0
- package/dist/translations/languages/es.js +92 -0
- package/dist/translations/languages/es.js.map +1 -0
- package/dist/translations/languages/et.d.ts +89 -0
- package/dist/translations/languages/et.d.ts.map +1 -0
- package/dist/translations/languages/et.js +92 -0
- package/dist/translations/languages/et.js.map +1 -0
- package/dist/translations/languages/fa.d.ts +89 -0
- package/dist/translations/languages/fa.d.ts.map +1 -0
- package/dist/translations/languages/fa.js +92 -0
- package/dist/translations/languages/fa.js.map +1 -0
- package/dist/translations/languages/fr.d.ts +89 -0
- package/dist/translations/languages/fr.d.ts.map +1 -0
- package/dist/translations/languages/fr.js +92 -0
- package/dist/translations/languages/fr.js.map +1 -0
- package/dist/translations/languages/he.d.ts +89 -0
- package/dist/translations/languages/he.d.ts.map +1 -0
- package/dist/translations/languages/he.js +92 -0
- package/dist/translations/languages/he.js.map +1 -0
- package/dist/translations/languages/hr.d.ts +89 -0
- package/dist/translations/languages/hr.d.ts.map +1 -0
- package/dist/translations/languages/hr.js +92 -0
- package/dist/translations/languages/hr.js.map +1 -0
- package/dist/translations/languages/hu.d.ts +89 -0
- package/dist/translations/languages/hu.d.ts.map +1 -0
- package/dist/translations/languages/hu.js +92 -0
- package/dist/translations/languages/hu.js.map +1 -0
- package/dist/translations/languages/hy.d.ts +89 -0
- package/dist/translations/languages/hy.d.ts.map +1 -0
- package/dist/translations/languages/hy.js +92 -0
- package/dist/translations/languages/hy.js.map +1 -0
- package/dist/translations/languages/is.d.ts +89 -0
- package/dist/translations/languages/is.d.ts.map +1 -0
- package/dist/translations/languages/is.js +92 -0
- package/dist/translations/languages/is.js.map +1 -0
- package/dist/translations/languages/it.d.ts +89 -0
- package/dist/translations/languages/it.d.ts.map +1 -0
- package/dist/translations/languages/it.js +92 -0
- package/dist/translations/languages/it.js.map +1 -0
- package/dist/translations/languages/ja.d.ts +89 -0
- package/dist/translations/languages/ja.d.ts.map +1 -0
- package/dist/translations/languages/ja.js +92 -0
- package/dist/translations/languages/ja.js.map +1 -0
- package/dist/translations/languages/ko.d.ts +89 -0
- package/dist/translations/languages/ko.d.ts.map +1 -0
- package/dist/translations/languages/ko.js +92 -0
- package/dist/translations/languages/ko.js.map +1 -0
- package/dist/translations/languages/lt.d.ts +89 -0
- package/dist/translations/languages/lt.d.ts.map +1 -0
- package/dist/translations/languages/lt.js +92 -0
- package/dist/translations/languages/lt.js.map +1 -0
- package/dist/translations/languages/my.d.ts +89 -0
- package/dist/translations/languages/my.d.ts.map +1 -0
- package/dist/translations/languages/my.js +92 -0
- package/dist/translations/languages/my.js.map +1 -0
- package/dist/translations/languages/nb.d.ts +89 -0
- package/dist/translations/languages/nb.d.ts.map +1 -0
- package/dist/translations/languages/nb.js +92 -0
- package/dist/translations/languages/nb.js.map +1 -0
- package/dist/translations/languages/nl.d.ts +89 -0
- package/dist/translations/languages/nl.d.ts.map +1 -0
- package/dist/translations/languages/nl.js +92 -0
- package/dist/translations/languages/nl.js.map +1 -0
- package/dist/translations/languages/pl.d.ts +89 -0
- package/dist/translations/languages/pl.d.ts.map +1 -0
- package/dist/translations/languages/pl.js +92 -0
- package/dist/translations/languages/pl.js.map +1 -0
- package/dist/translations/languages/pt.d.ts +89 -0
- package/dist/translations/languages/pt.d.ts.map +1 -0
- package/dist/translations/languages/pt.js +92 -0
- package/dist/translations/languages/pt.js.map +1 -0
- package/dist/translations/languages/ro.d.ts +89 -0
- package/dist/translations/languages/ro.d.ts.map +1 -0
- package/dist/translations/languages/ro.js +92 -0
- package/dist/translations/languages/ro.js.map +1 -0
- package/dist/translations/languages/rs.d.ts +89 -0
- package/dist/translations/languages/rs.d.ts.map +1 -0
- package/dist/translations/languages/rs.js +92 -0
- package/dist/translations/languages/rs.js.map +1 -0
- package/dist/translations/languages/rsLatin.d.ts +89 -0
- package/dist/translations/languages/rsLatin.d.ts.map +1 -0
- package/dist/translations/languages/rsLatin.js +92 -0
- package/dist/translations/languages/rsLatin.js.map +1 -0
- package/dist/translations/languages/ru.d.ts +89 -0
- package/dist/translations/languages/ru.d.ts.map +1 -0
- package/dist/translations/languages/ru.js +92 -0
- package/dist/translations/languages/ru.js.map +1 -0
- package/dist/translations/languages/sk.d.ts +89 -0
- package/dist/translations/languages/sk.d.ts.map +1 -0
- package/dist/translations/languages/sk.js +92 -0
- package/dist/translations/languages/sk.js.map +1 -0
- package/dist/translations/languages/sl.d.ts +89 -0
- package/dist/translations/languages/sl.d.ts.map +1 -0
- package/dist/translations/languages/sl.js +92 -0
- package/dist/translations/languages/sl.js.map +1 -0
- package/dist/translations/languages/sv.d.ts +89 -0
- package/dist/translations/languages/sv.d.ts.map +1 -0
- package/dist/translations/languages/sv.js +92 -0
- package/dist/translations/languages/sv.js.map +1 -0
- package/dist/translations/languages/ta.d.ts +89 -0
- package/dist/translations/languages/ta.d.ts.map +1 -0
- package/dist/translations/languages/ta.js +92 -0
- package/dist/translations/languages/ta.js.map +1 -0
- package/dist/translations/languages/th.d.ts +89 -0
- package/dist/translations/languages/th.d.ts.map +1 -0
- package/dist/translations/languages/th.js +92 -0
- package/dist/translations/languages/th.js.map +1 -0
- package/dist/translations/languages/tr.d.ts +89 -0
- package/dist/translations/languages/tr.d.ts.map +1 -0
- package/dist/translations/languages/tr.js +92 -0
- package/dist/translations/languages/tr.js.map +1 -0
- package/dist/translations/languages/uk.d.ts +89 -0
- package/dist/translations/languages/uk.d.ts.map +1 -0
- package/dist/translations/languages/uk.js +92 -0
- package/dist/translations/languages/uk.js.map +1 -0
- package/dist/translations/languages/vi.d.ts +89 -0
- package/dist/translations/languages/vi.d.ts.map +1 -0
- package/dist/translations/languages/vi.js +92 -0
- package/dist/translations/languages/vi.js.map +1 -0
- package/dist/translations/languages/zh.d.ts +89 -0
- package/dist/translations/languages/zh.d.ts.map +1 -0
- package/dist/translations/languages/zh.js +92 -0
- package/dist/translations/languages/zh.js.map +1 -0
- package/dist/translations/languages/zhTw.d.ts +89 -0
- package/dist/translations/languages/zhTw.d.ts.map +1 -0
- package/dist/translations/languages/zhTw.js +92 -0
- package/dist/translations/languages/zhTw.js.map +1 -0
- package/dist/translations/translation-schema.json +313 -5
- package/dist/translations/types.d.ts +89 -0
- package/dist/translations/types.d.ts.map +1 -0
- package/dist/translations/types.js +3 -0
- package/dist/translations/types.js.map +1 -0
- package/dist/types/index.d.ts +154 -14
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/ui/VariantOptionsSelector/index.d.ts.map +1 -1
- package/dist/ui/VariantOptionsSelector/index.js +6 -3
- package/dist/ui/VariantOptionsSelector/index.js.map +1 -1
- package/package.json +16 -10
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { defaultCartItemMatcher } from './defaultCartItemMatcher.js';
|
|
3
|
+
describe('defaultCartItemMatcher', ()=>{
|
|
4
|
+
describe('product matching', ()=>{
|
|
5
|
+
it('should match when product IDs are equal (both strings)', ()=>{
|
|
6
|
+
const existingItem = {
|
|
7
|
+
id: 'item-1',
|
|
8
|
+
product: 'product-123',
|
|
9
|
+
quantity: 1
|
|
10
|
+
};
|
|
11
|
+
const newItem = {
|
|
12
|
+
product: 'product-123'
|
|
13
|
+
};
|
|
14
|
+
expect(defaultCartItemMatcher({
|
|
15
|
+
existingItem,
|
|
16
|
+
newItem
|
|
17
|
+
})).toBe(true);
|
|
18
|
+
});
|
|
19
|
+
it('should not match when product IDs are different', ()=>{
|
|
20
|
+
const existingItem = {
|
|
21
|
+
id: 'item-1',
|
|
22
|
+
product: 'product-123',
|
|
23
|
+
quantity: 1
|
|
24
|
+
};
|
|
25
|
+
const newItem = {
|
|
26
|
+
product: 'product-456'
|
|
27
|
+
};
|
|
28
|
+
expect(defaultCartItemMatcher({
|
|
29
|
+
existingItem,
|
|
30
|
+
newItem
|
|
31
|
+
})).toBe(false);
|
|
32
|
+
});
|
|
33
|
+
it('should match when existing product is populated object', ()=>{
|
|
34
|
+
const existingItem = {
|
|
35
|
+
id: 'item-1',
|
|
36
|
+
product: {
|
|
37
|
+
id: 'product-123',
|
|
38
|
+
name: 'Test Product'
|
|
39
|
+
},
|
|
40
|
+
quantity: 1
|
|
41
|
+
};
|
|
42
|
+
const newItem = {
|
|
43
|
+
product: 'product-123'
|
|
44
|
+
};
|
|
45
|
+
expect(defaultCartItemMatcher({
|
|
46
|
+
existingItem,
|
|
47
|
+
newItem
|
|
48
|
+
})).toBe(true);
|
|
49
|
+
});
|
|
50
|
+
it('should not match when product IDs differ (existing is object)', ()=>{
|
|
51
|
+
const existingItem = {
|
|
52
|
+
id: 'item-1',
|
|
53
|
+
product: {
|
|
54
|
+
id: 'product-123',
|
|
55
|
+
name: 'Test Product'
|
|
56
|
+
},
|
|
57
|
+
quantity: 1
|
|
58
|
+
};
|
|
59
|
+
const newItem = {
|
|
60
|
+
product: 'product-456'
|
|
61
|
+
};
|
|
62
|
+
expect(defaultCartItemMatcher({
|
|
63
|
+
existingItem,
|
|
64
|
+
newItem
|
|
65
|
+
})).toBe(false);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
describe('variant matching', ()=>{
|
|
69
|
+
it('should match when both have same variant ID', ()=>{
|
|
70
|
+
const existingItem = {
|
|
71
|
+
id: 'item-1',
|
|
72
|
+
product: 'product-123',
|
|
73
|
+
variant: 'variant-abc',
|
|
74
|
+
quantity: 1
|
|
75
|
+
};
|
|
76
|
+
const newItem = {
|
|
77
|
+
product: 'product-123',
|
|
78
|
+
variant: 'variant-abc'
|
|
79
|
+
};
|
|
80
|
+
expect(defaultCartItemMatcher({
|
|
81
|
+
existingItem,
|
|
82
|
+
newItem
|
|
83
|
+
})).toBe(true);
|
|
84
|
+
});
|
|
85
|
+
it('should not match when variants are different', ()=>{
|
|
86
|
+
const existingItem = {
|
|
87
|
+
id: 'item-1',
|
|
88
|
+
product: 'product-123',
|
|
89
|
+
variant: 'variant-abc',
|
|
90
|
+
quantity: 1
|
|
91
|
+
};
|
|
92
|
+
const newItem = {
|
|
93
|
+
product: 'product-123',
|
|
94
|
+
variant: 'variant-xyz'
|
|
95
|
+
};
|
|
96
|
+
expect(defaultCartItemMatcher({
|
|
97
|
+
existingItem,
|
|
98
|
+
newItem
|
|
99
|
+
})).toBe(false);
|
|
100
|
+
});
|
|
101
|
+
it('should match when both have no variant', ()=>{
|
|
102
|
+
const existingItem = {
|
|
103
|
+
id: 'item-1',
|
|
104
|
+
product: 'product-123',
|
|
105
|
+
quantity: 1
|
|
106
|
+
};
|
|
107
|
+
const newItem = {
|
|
108
|
+
product: 'product-123'
|
|
109
|
+
};
|
|
110
|
+
expect(defaultCartItemMatcher({
|
|
111
|
+
existingItem,
|
|
112
|
+
newItem
|
|
113
|
+
})).toBe(true);
|
|
114
|
+
});
|
|
115
|
+
it('should not match when existing has variant but new does not', ()=>{
|
|
116
|
+
const existingItem = {
|
|
117
|
+
id: 'item-1',
|
|
118
|
+
product: 'product-123',
|
|
119
|
+
variant: 'variant-abc',
|
|
120
|
+
quantity: 1
|
|
121
|
+
};
|
|
122
|
+
const newItem = {
|
|
123
|
+
product: 'product-123'
|
|
124
|
+
};
|
|
125
|
+
expect(defaultCartItemMatcher({
|
|
126
|
+
existingItem,
|
|
127
|
+
newItem
|
|
128
|
+
})).toBe(false);
|
|
129
|
+
});
|
|
130
|
+
it('should not match when new has variant but existing does not', ()=>{
|
|
131
|
+
const existingItem = {
|
|
132
|
+
id: 'item-1',
|
|
133
|
+
product: 'product-123',
|
|
134
|
+
quantity: 1
|
|
135
|
+
};
|
|
136
|
+
const newItem = {
|
|
137
|
+
product: 'product-123',
|
|
138
|
+
variant: 'variant-abc'
|
|
139
|
+
};
|
|
140
|
+
expect(defaultCartItemMatcher({
|
|
141
|
+
existingItem,
|
|
142
|
+
newItem
|
|
143
|
+
})).toBe(false);
|
|
144
|
+
});
|
|
145
|
+
it('should match when existing variant is populated object', ()=>{
|
|
146
|
+
const existingItem = {
|
|
147
|
+
id: 'item-1',
|
|
148
|
+
product: 'product-123',
|
|
149
|
+
variant: {
|
|
150
|
+
id: 'variant-abc',
|
|
151
|
+
name: 'Large'
|
|
152
|
+
},
|
|
153
|
+
quantity: 1
|
|
154
|
+
};
|
|
155
|
+
const newItem = {
|
|
156
|
+
product: 'product-123',
|
|
157
|
+
variant: 'variant-abc'
|
|
158
|
+
};
|
|
159
|
+
expect(defaultCartItemMatcher({
|
|
160
|
+
existingItem,
|
|
161
|
+
newItem
|
|
162
|
+
})).toBe(true);
|
|
163
|
+
});
|
|
164
|
+
it('should not match when variant IDs differ (existing is object)', ()=>{
|
|
165
|
+
const existingItem = {
|
|
166
|
+
id: 'item-1',
|
|
167
|
+
product: 'product-123',
|
|
168
|
+
variant: {
|
|
169
|
+
id: 'variant-abc',
|
|
170
|
+
name: 'Large'
|
|
171
|
+
},
|
|
172
|
+
quantity: 1
|
|
173
|
+
};
|
|
174
|
+
const newItem = {
|
|
175
|
+
product: 'product-123',
|
|
176
|
+
variant: 'variant-xyz'
|
|
177
|
+
};
|
|
178
|
+
expect(defaultCartItemMatcher({
|
|
179
|
+
existingItem,
|
|
180
|
+
newItem
|
|
181
|
+
})).toBe(false);
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
describe('combined product and variant matching', ()=>{
|
|
185
|
+
it('should match when both product and variant match', ()=>{
|
|
186
|
+
const existingItem = {
|
|
187
|
+
id: 'item-1',
|
|
188
|
+
product: 'product-123',
|
|
189
|
+
variant: 'variant-abc',
|
|
190
|
+
quantity: 1
|
|
191
|
+
};
|
|
192
|
+
const newItem = {
|
|
193
|
+
product: 'product-123',
|
|
194
|
+
variant: 'variant-abc'
|
|
195
|
+
};
|
|
196
|
+
expect(defaultCartItemMatcher({
|
|
197
|
+
existingItem,
|
|
198
|
+
newItem
|
|
199
|
+
})).toBe(true);
|
|
200
|
+
});
|
|
201
|
+
it('should not match when product matches but variant does not', ()=>{
|
|
202
|
+
const existingItem = {
|
|
203
|
+
id: 'item-1',
|
|
204
|
+
product: 'product-123',
|
|
205
|
+
variant: 'variant-abc',
|
|
206
|
+
quantity: 1
|
|
207
|
+
};
|
|
208
|
+
const newItem = {
|
|
209
|
+
product: 'product-123',
|
|
210
|
+
variant: 'variant-xyz'
|
|
211
|
+
};
|
|
212
|
+
expect(defaultCartItemMatcher({
|
|
213
|
+
existingItem,
|
|
214
|
+
newItem
|
|
215
|
+
})).toBe(false);
|
|
216
|
+
});
|
|
217
|
+
it('should not match when variant matches but product does not', ()=>{
|
|
218
|
+
const existingItem = {
|
|
219
|
+
id: 'item-1',
|
|
220
|
+
product: 'product-123',
|
|
221
|
+
variant: 'variant-abc',
|
|
222
|
+
quantity: 1
|
|
223
|
+
};
|
|
224
|
+
const newItem = {
|
|
225
|
+
product: 'product-456',
|
|
226
|
+
variant: 'variant-abc'
|
|
227
|
+
};
|
|
228
|
+
expect(defaultCartItemMatcher({
|
|
229
|
+
existingItem,
|
|
230
|
+
newItem
|
|
231
|
+
})).toBe(false);
|
|
232
|
+
});
|
|
233
|
+
it('should not match when neither product nor variant match', ()=>{
|
|
234
|
+
const existingItem = {
|
|
235
|
+
id: 'item-1',
|
|
236
|
+
product: 'product-123',
|
|
237
|
+
variant: 'variant-abc',
|
|
238
|
+
quantity: 1
|
|
239
|
+
};
|
|
240
|
+
const newItem = {
|
|
241
|
+
product: 'product-456',
|
|
242
|
+
variant: 'variant-xyz'
|
|
243
|
+
};
|
|
244
|
+
expect(defaultCartItemMatcher({
|
|
245
|
+
existingItem,
|
|
246
|
+
newItem
|
|
247
|
+
})).toBe(false);
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
describe('edge cases', ()=>{
|
|
251
|
+
it('should handle undefined variant in existing item', ()=>{
|
|
252
|
+
const existingItem = {
|
|
253
|
+
id: 'item-1',
|
|
254
|
+
product: 'product-123',
|
|
255
|
+
variant: undefined,
|
|
256
|
+
quantity: 1
|
|
257
|
+
};
|
|
258
|
+
const newItem = {
|
|
259
|
+
product: 'product-123'
|
|
260
|
+
};
|
|
261
|
+
expect(defaultCartItemMatcher({
|
|
262
|
+
existingItem,
|
|
263
|
+
newItem
|
|
264
|
+
})).toBe(true);
|
|
265
|
+
});
|
|
266
|
+
it('should handle undefined variant in new item', ()=>{
|
|
267
|
+
const existingItem = {
|
|
268
|
+
id: 'item-1',
|
|
269
|
+
product: 'product-123',
|
|
270
|
+
quantity: 1
|
|
271
|
+
};
|
|
272
|
+
const newItem = {
|
|
273
|
+
product: 'product-123',
|
|
274
|
+
variant: undefined
|
|
275
|
+
};
|
|
276
|
+
expect(defaultCartItemMatcher({
|
|
277
|
+
existingItem,
|
|
278
|
+
newItem
|
|
279
|
+
})).toBe(true);
|
|
280
|
+
});
|
|
281
|
+
it('should handle numeric product IDs', ()=>{
|
|
282
|
+
const existingItem = {
|
|
283
|
+
id: 'item-1',
|
|
284
|
+
product: 123,
|
|
285
|
+
quantity: 1
|
|
286
|
+
};
|
|
287
|
+
const newItem = {
|
|
288
|
+
product: 123
|
|
289
|
+
};
|
|
290
|
+
expect(defaultCartItemMatcher({
|
|
291
|
+
existingItem,
|
|
292
|
+
newItem
|
|
293
|
+
})).toBe(true);
|
|
294
|
+
});
|
|
295
|
+
it('should handle deeply nested product object', ()=>{
|
|
296
|
+
const existingItem = {
|
|
297
|
+
id: 'item-1',
|
|
298
|
+
product: {
|
|
299
|
+
id: 'product-123',
|
|
300
|
+
name: 'Product',
|
|
301
|
+
category: {
|
|
302
|
+
id: 'cat-1',
|
|
303
|
+
name: 'Category'
|
|
304
|
+
}
|
|
305
|
+
},
|
|
306
|
+
quantity: 1
|
|
307
|
+
};
|
|
308
|
+
const newItem = {
|
|
309
|
+
product: 'product-123'
|
|
310
|
+
};
|
|
311
|
+
expect(defaultCartItemMatcher({
|
|
312
|
+
existingItem,
|
|
313
|
+
newItem
|
|
314
|
+
})).toBe(true);
|
|
315
|
+
});
|
|
316
|
+
it('should handle both product and variant as populated objects', ()=>{
|
|
317
|
+
const existingItem = {
|
|
318
|
+
id: 'item-1',
|
|
319
|
+
product: {
|
|
320
|
+
id: 'product-123',
|
|
321
|
+
name: 'Product'
|
|
322
|
+
},
|
|
323
|
+
variant: {
|
|
324
|
+
id: 'variant-abc',
|
|
325
|
+
name: 'Large'
|
|
326
|
+
},
|
|
327
|
+
quantity: 1
|
|
328
|
+
};
|
|
329
|
+
const newItem = {
|
|
330
|
+
product: 'product-123',
|
|
331
|
+
variant: 'variant-abc'
|
|
332
|
+
};
|
|
333
|
+
expect(defaultCartItemMatcher({
|
|
334
|
+
existingItem,
|
|
335
|
+
newItem
|
|
336
|
+
})).toBe(true);
|
|
337
|
+
});
|
|
338
|
+
it('should ignore other item properties', ()=>{
|
|
339
|
+
const existingItem = {
|
|
340
|
+
id: 'item-1',
|
|
341
|
+
product: 'product-123',
|
|
342
|
+
quantity: 5,
|
|
343
|
+
customProp: 'value-a'
|
|
344
|
+
};
|
|
345
|
+
const newItem = {
|
|
346
|
+
product: 'product-123',
|
|
347
|
+
customProp: 'value-b'
|
|
348
|
+
};
|
|
349
|
+
// Should match because only product/variant are checked
|
|
350
|
+
expect(defaultCartItemMatcher({
|
|
351
|
+
existingItem,
|
|
352
|
+
newItem
|
|
353
|
+
})).toBe(true);
|
|
354
|
+
});
|
|
355
|
+
});
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
//# sourceMappingURL=defaultCartItemMatcher.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/collections/carts/operations/defaultCartItemMatcher.spec.ts"],"sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport type { CartItemData, NewCartItem } from './types.js'\n\nimport { defaultCartItemMatcher } from './defaultCartItemMatcher.js'\n\ndescribe('defaultCartItemMatcher', () => {\n describe('product matching', () => {\n it('should match when product IDs are equal (both strings)', () => {\n const existingItem: CartItemData = {\n id: 'item-1',\n product: 'product-123',\n quantity: 1,\n }\n const newItem: NewCartItem = {\n product: 'product-123',\n }\n\n expect(defaultCartItemMatcher({ existingItem, newItem })).toBe(true)\n })\n\n it('should not match when product IDs are different', () => {\n const existingItem: CartItemData = {\n id: 'item-1',\n product: 'product-123',\n quantity: 1,\n }\n const newItem: NewCartItem = {\n product: 'product-456',\n }\n\n expect(defaultCartItemMatcher({ existingItem, newItem })).toBe(false)\n })\n\n it('should match when existing product is populated object', () => {\n const existingItem: CartItemData = {\n id: 'item-1',\n product: { id: 'product-123', name: 'Test Product' } as any,\n quantity: 1,\n }\n const newItem: NewCartItem = {\n product: 'product-123',\n }\n\n expect(defaultCartItemMatcher({ existingItem, newItem })).toBe(true)\n })\n\n it('should not match when product IDs differ (existing is object)', () => {\n const existingItem: CartItemData = {\n id: 'item-1',\n product: { id: 'product-123', name: 'Test Product' } as any,\n quantity: 1,\n }\n const newItem: NewCartItem = {\n product: 'product-456',\n }\n\n expect(defaultCartItemMatcher({ existingItem, newItem })).toBe(false)\n })\n })\n\n describe('variant matching', () => {\n it('should match when both have same variant ID', () => {\n const existingItem: CartItemData = {\n id: 'item-1',\n product: 'product-123',\n variant: 'variant-abc',\n quantity: 1,\n }\n const newItem: NewCartItem = {\n product: 'product-123',\n variant: 'variant-abc',\n }\n\n expect(defaultCartItemMatcher({ existingItem, newItem })).toBe(true)\n })\n\n it('should not match when variants are different', () => {\n const existingItem: CartItemData = {\n id: 'item-1',\n product: 'product-123',\n variant: 'variant-abc',\n quantity: 1,\n }\n const newItem: NewCartItem = {\n product: 'product-123',\n variant: 'variant-xyz',\n }\n\n expect(defaultCartItemMatcher({ existingItem, newItem })).toBe(false)\n })\n\n it('should match when both have no variant', () => {\n const existingItem: CartItemData = {\n id: 'item-1',\n product: 'product-123',\n quantity: 1,\n }\n const newItem: NewCartItem = {\n product: 'product-123',\n }\n\n expect(defaultCartItemMatcher({ existingItem, newItem })).toBe(true)\n })\n\n it('should not match when existing has variant but new does not', () => {\n const existingItem: CartItemData = {\n id: 'item-1',\n product: 'product-123',\n variant: 'variant-abc',\n quantity: 1,\n }\n const newItem: NewCartItem = {\n product: 'product-123',\n }\n\n expect(defaultCartItemMatcher({ existingItem, newItem })).toBe(false)\n })\n\n it('should not match when new has variant but existing does not', () => {\n const existingItem: CartItemData = {\n id: 'item-1',\n product: 'product-123',\n quantity: 1,\n }\n const newItem: NewCartItem = {\n product: 'product-123',\n variant: 'variant-abc',\n }\n\n expect(defaultCartItemMatcher({ existingItem, newItem })).toBe(false)\n })\n\n it('should match when existing variant is populated object', () => {\n const existingItem: CartItemData = {\n id: 'item-1',\n product: 'product-123',\n variant: { id: 'variant-abc', name: 'Large' } as any,\n quantity: 1,\n }\n const newItem: NewCartItem = {\n product: 'product-123',\n variant: 'variant-abc',\n }\n\n expect(defaultCartItemMatcher({ existingItem, newItem })).toBe(true)\n })\n\n it('should not match when variant IDs differ (existing is object)', () => {\n const existingItem: CartItemData = {\n id: 'item-1',\n product: 'product-123',\n variant: { id: 'variant-abc', name: 'Large' } as any,\n quantity: 1,\n }\n const newItem: NewCartItem = {\n product: 'product-123',\n variant: 'variant-xyz',\n }\n\n expect(defaultCartItemMatcher({ existingItem, newItem })).toBe(false)\n })\n })\n\n describe('combined product and variant matching', () => {\n it('should match when both product and variant match', () => {\n const existingItem: CartItemData = {\n id: 'item-1',\n product: 'product-123',\n variant: 'variant-abc',\n quantity: 1,\n }\n const newItem: NewCartItem = {\n product: 'product-123',\n variant: 'variant-abc',\n }\n\n expect(defaultCartItemMatcher({ existingItem, newItem })).toBe(true)\n })\n\n it('should not match when product matches but variant does not', () => {\n const existingItem: CartItemData = {\n id: 'item-1',\n product: 'product-123',\n variant: 'variant-abc',\n quantity: 1,\n }\n const newItem: NewCartItem = {\n product: 'product-123',\n variant: 'variant-xyz',\n }\n\n expect(defaultCartItemMatcher({ existingItem, newItem })).toBe(false)\n })\n\n it('should not match when variant matches but product does not', () => {\n const existingItem: CartItemData = {\n id: 'item-1',\n product: 'product-123',\n variant: 'variant-abc',\n quantity: 1,\n }\n const newItem: NewCartItem = {\n product: 'product-456',\n variant: 'variant-abc',\n }\n\n expect(defaultCartItemMatcher({ existingItem, newItem })).toBe(false)\n })\n\n it('should not match when neither product nor variant match', () => {\n const existingItem: CartItemData = {\n id: 'item-1',\n product: 'product-123',\n variant: 'variant-abc',\n quantity: 1,\n }\n const newItem: NewCartItem = {\n product: 'product-456',\n variant: 'variant-xyz',\n }\n\n expect(defaultCartItemMatcher({ existingItem, newItem })).toBe(false)\n })\n })\n\n describe('edge cases', () => {\n it('should handle undefined variant in existing item', () => {\n const existingItem: CartItemData = {\n id: 'item-1',\n product: 'product-123',\n variant: undefined,\n quantity: 1,\n }\n const newItem: NewCartItem = {\n product: 'product-123',\n }\n\n expect(defaultCartItemMatcher({ existingItem, newItem })).toBe(true)\n })\n\n it('should handle undefined variant in new item', () => {\n const existingItem: CartItemData = {\n id: 'item-1',\n product: 'product-123',\n quantity: 1,\n }\n const newItem: NewCartItem = {\n product: 'product-123',\n variant: undefined,\n }\n\n expect(defaultCartItemMatcher({ existingItem, newItem })).toBe(true)\n })\n\n it('should handle numeric product IDs', () => {\n const existingItem: CartItemData = {\n id: 'item-1',\n product: 123 as any,\n quantity: 1,\n }\n const newItem: NewCartItem = {\n product: 123 as any,\n }\n\n expect(defaultCartItemMatcher({ existingItem, newItem })).toBe(true)\n })\n\n it('should handle deeply nested product object', () => {\n const existingItem: CartItemData = {\n id: 'item-1',\n product: {\n id: 'product-123',\n name: 'Product',\n category: { id: 'cat-1', name: 'Category' },\n } as any,\n quantity: 1,\n }\n const newItem: NewCartItem = {\n product: 'product-123',\n }\n\n expect(defaultCartItemMatcher({ existingItem, newItem })).toBe(true)\n })\n\n it('should handle both product and variant as populated objects', () => {\n const existingItem: CartItemData = {\n id: 'item-1',\n product: { id: 'product-123', name: 'Product' } as any,\n variant: { id: 'variant-abc', name: 'Large' } as any,\n quantity: 1,\n }\n const newItem: NewCartItem = {\n product: 'product-123',\n variant: 'variant-abc',\n }\n\n expect(defaultCartItemMatcher({ existingItem, newItem })).toBe(true)\n })\n\n it('should ignore other item properties', () => {\n const existingItem: CartItemData = {\n id: 'item-1',\n product: 'product-123',\n quantity: 5,\n customProp: 'value-a',\n } as CartItemData\n const newItem: NewCartItem = {\n product: 'product-123',\n customProp: 'value-b',\n } as NewCartItem\n\n // Should match because only product/variant are checked\n expect(defaultCartItemMatcher({ existingItem, newItem })).toBe(true)\n })\n })\n})\n"],"names":["describe","expect","it","defaultCartItemMatcher","existingItem","id","product","quantity","newItem","toBe","name","variant","undefined","category","customProp"],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { CollectionSlug, DefaultDocumentIDType, Payload, PayloadRequest } from 'payload';
|
|
2
|
+
import type { CartItemData, CartOperationResult } from './types.js';
|
|
3
|
+
export type MergeCartArgs = {
|
|
4
|
+
/**
|
|
5
|
+
* Optional custom cart item matcher function for merge operations.
|
|
6
|
+
* Both items are CartItemData (existing cart items).
|
|
7
|
+
*/
|
|
8
|
+
cartItemMatcher?: (args: {
|
|
9
|
+
existingItem: CartItemData;
|
|
10
|
+
newItem: CartItemData;
|
|
11
|
+
}) => boolean;
|
|
12
|
+
/**
|
|
13
|
+
* The collection slug for carts.
|
|
14
|
+
*/
|
|
15
|
+
cartsSlug: CollectionSlug;
|
|
16
|
+
/**
|
|
17
|
+
* The Payload instance.
|
|
18
|
+
*/
|
|
19
|
+
payload: Payload;
|
|
20
|
+
/**
|
|
21
|
+
* The PayloadRequest object for transaction safety.
|
|
22
|
+
*/
|
|
23
|
+
req?: PayloadRequest;
|
|
24
|
+
/**
|
|
25
|
+
* The ID of the source (guest) cart to merge from.
|
|
26
|
+
*/
|
|
27
|
+
sourceCartID: DefaultDocumentIDType;
|
|
28
|
+
/**
|
|
29
|
+
* The secret for accessing the source guest cart.
|
|
30
|
+
*/
|
|
31
|
+
sourceSecret: string;
|
|
32
|
+
/**
|
|
33
|
+
* The ID of the target (user's) cart to merge into.
|
|
34
|
+
*/
|
|
35
|
+
targetCartID: DefaultDocumentIDType;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Merges items from a source cart (typically a guest cart) into a target cart (typically a user's cart).
|
|
39
|
+
* Items are merged intelligently - matching items have their quantities combined.
|
|
40
|
+
* After successful merge, the source cart is deleted.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```ts
|
|
44
|
+
* const result = await mergeCart({
|
|
45
|
+
* payload,
|
|
46
|
+
* cartsSlug: 'carts',
|
|
47
|
+
* targetCartID: 'user-cart-123',
|
|
48
|
+
* sourceCartID: 'guest-cart-456',
|
|
49
|
+
* sourceSecret: 'abc123secret',
|
|
50
|
+
* })
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export declare const mergeCart: (args: MergeCartArgs) => Promise<CartOperationResult>;
|
|
54
|
+
//# sourceMappingURL=mergeCart.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mergeCart.d.ts","sourceRoot":"","sources":["../../../../src/collections/carts/operations/mergeCart.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAE7F,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAwCnE,MAAM,MAAM,aAAa,GAAG;IAC1B;;;OAGG;IACH,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,YAAY,EAAE,YAAY,CAAC;QAAC,OAAO,EAAE,YAAY,CAAA;KAAE,KAAK,OAAO,CAAA;IAC1F;;OAEG;IACH,SAAS,EAAE,cAAc,CAAA;IACzB;;OAEG;IACH,OAAO,EAAE,OAAO,CAAA;IAChB;;OAEG;IACH,GAAG,CAAC,EAAE,cAAc,CAAA;IACpB;;OAEG;IACH,YAAY,EAAE,qBAAqB,CAAA;IACnC;;OAEG;IACH,YAAY,EAAE,MAAM,CAAA;IACpB;;OAEG;IACH,YAAY,EAAE,qBAAqB,CAAA;CACpC,CAAA;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,SAAS,SAAgB,aAAa,KAAG,OAAO,CAAC,mBAAmB,CA+GhF,CAAA"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gets the ID from a product/variant field which can be either an ID or a populated object.
|
|
3
|
+
*/ const getItemID = (field)=>{
|
|
4
|
+
if (!field) {
|
|
5
|
+
return undefined;
|
|
6
|
+
}
|
|
7
|
+
return typeof field === 'object' ? field.id : field;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Default matcher for merge operations - compares normalized product and variant IDs.
|
|
11
|
+
*/ const defaultMergeItemMatcher = (args)=>{
|
|
12
|
+
const { existingItem, newItem } = args;
|
|
13
|
+
const existingProductID = getItemID(existingItem.product);
|
|
14
|
+
const newProductID = getItemID(newItem.product);
|
|
15
|
+
if (existingProductID !== newProductID) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
const existingVariantID = getItemID(existingItem.variant);
|
|
19
|
+
const newVariantID = getItemID(newItem.variant);
|
|
20
|
+
return existingVariantID === newVariantID;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Merges items from a source cart (typically a guest cart) into a target cart (typically a user's cart).
|
|
24
|
+
* Items are merged intelligently - matching items have their quantities combined.
|
|
25
|
+
* After successful merge, the source cart is deleted.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```ts
|
|
29
|
+
* const result = await mergeCart({
|
|
30
|
+
* payload,
|
|
31
|
+
* cartsSlug: 'carts',
|
|
32
|
+
* targetCartID: 'user-cart-123',
|
|
33
|
+
* sourceCartID: 'guest-cart-456',
|
|
34
|
+
* sourceSecret: 'abc123secret',
|
|
35
|
+
* })
|
|
36
|
+
* ```
|
|
37
|
+
*/ export const mergeCart = async (args)=>{
|
|
38
|
+
const { cartItemMatcher = defaultMergeItemMatcher, cartsSlug, payload, req, sourceCartID, sourceSecret, targetCartID } = args;
|
|
39
|
+
// Fetch the source (guest) cart with secret verification
|
|
40
|
+
// Using overrideAccess: true here because we're manually verifying the secret in the where clause
|
|
41
|
+
const sourceCart = await payload.find({
|
|
42
|
+
collection: cartsSlug,
|
|
43
|
+
depth: 0,
|
|
44
|
+
limit: 1,
|
|
45
|
+
overrideAccess: true,
|
|
46
|
+
req,
|
|
47
|
+
where: {
|
|
48
|
+
and: [
|
|
49
|
+
{
|
|
50
|
+
id: {
|
|
51
|
+
equals: sourceCartID
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
secret: {
|
|
56
|
+
equals: sourceSecret
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
]
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
if (!sourceCart.docs || sourceCart.docs.length === 0) {
|
|
63
|
+
return {
|
|
64
|
+
cart: null,
|
|
65
|
+
message: `Source cart with ID ${sourceCartID} not found or secret mismatch`,
|
|
66
|
+
success: false
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
const guestCart = sourceCart.docs[0];
|
|
70
|
+
// Fetch the target (user's) cart
|
|
71
|
+
const targetCart = await payload.findByID({
|
|
72
|
+
id: targetCartID,
|
|
73
|
+
collection: cartsSlug,
|
|
74
|
+
depth: 0,
|
|
75
|
+
overrideAccess: false,
|
|
76
|
+
req
|
|
77
|
+
});
|
|
78
|
+
if (!targetCart) {
|
|
79
|
+
return {
|
|
80
|
+
cart: null,
|
|
81
|
+
message: `Target cart with ID ${targetCartID} not found`,
|
|
82
|
+
success: false
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
const sourceItems = guestCart?.items || [];
|
|
86
|
+
const targetItems = targetCart.items || [];
|
|
87
|
+
// Merge items from source into target
|
|
88
|
+
const mergedItems = [
|
|
89
|
+
...targetItems
|
|
90
|
+
];
|
|
91
|
+
for (const sourceItem of sourceItems){
|
|
92
|
+
// Find if this item already exists in target cart
|
|
93
|
+
const existingIndex = mergedItems.findIndex((targetItem)=>cartItemMatcher({
|
|
94
|
+
existingItem: targetItem,
|
|
95
|
+
newItem: sourceItem
|
|
96
|
+
}));
|
|
97
|
+
if (existingIndex !== -1) {
|
|
98
|
+
// Item exists in target - add quantities
|
|
99
|
+
const existingItem = mergedItems[existingIndex];
|
|
100
|
+
mergedItems[existingIndex] = {
|
|
101
|
+
...existingItem,
|
|
102
|
+
quantity: existingItem.quantity + sourceItem.quantity
|
|
103
|
+
};
|
|
104
|
+
} else {
|
|
105
|
+
// Item doesn't exist in target - add it
|
|
106
|
+
// Omit the source item's array row `id` so Payload generates a new one.
|
|
107
|
+
// In SQL, array items are stored in separate tables with their own IDs,
|
|
108
|
+
// and using IDs from another cart's array would cause conflicts.
|
|
109
|
+
const { id: _omit, ...sourceItemWithoutId } = sourceItem;
|
|
110
|
+
mergedItems.push(sourceItemWithoutId);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Update the target cart with merged items
|
|
114
|
+
const updatedCart = await payload.update({
|
|
115
|
+
id: targetCartID,
|
|
116
|
+
collection: cartsSlug,
|
|
117
|
+
data: {
|
|
118
|
+
items: mergedItems
|
|
119
|
+
},
|
|
120
|
+
depth: 0,
|
|
121
|
+
overrideAccess: false,
|
|
122
|
+
req
|
|
123
|
+
});
|
|
124
|
+
// Delete the source (guest) cart after successful merge
|
|
125
|
+
// Using overrideAccess: true because we've already verified the secret above
|
|
126
|
+
try {
|
|
127
|
+
await payload.delete({
|
|
128
|
+
id: sourceCartID,
|
|
129
|
+
collection: cartsSlug,
|
|
130
|
+
overrideAccess: true,
|
|
131
|
+
req
|
|
132
|
+
});
|
|
133
|
+
} catch {
|
|
134
|
+
// Silently fail on delete - the merge was still successful
|
|
135
|
+
// The cart may have already been deleted or access denied
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
cart: updatedCart,
|
|
139
|
+
message: `Merged ${sourceItems.length} items from guest cart`,
|
|
140
|
+
success: true
|
|
141
|
+
};
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
//# sourceMappingURL=mergeCart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/collections/carts/operations/mergeCart.ts"],"sourcesContent":["import type { CollectionSlug, DefaultDocumentIDType, Payload, PayloadRequest } from 'payload'\n\nimport type { CartItemData, CartOperationResult } from './types.js'\n\n/**\n * Gets the ID from a product/variant field which can be either an ID or a populated object.\n */\nconst getItemID = (\n field:\n | { [key: string]: unknown; id: DefaultDocumentIDType }\n | DefaultDocumentIDType\n | null\n | undefined,\n): DefaultDocumentIDType | undefined => {\n if (!field) {\n return undefined\n }\n return typeof field === 'object' ? field.id : field\n}\n\n/**\n * Default matcher for merge operations - compares normalized product and variant IDs.\n */\nconst defaultMergeItemMatcher = (args: {\n existingItem: CartItemData\n newItem: CartItemData\n}): boolean => {\n const { existingItem, newItem } = args\n\n const existingProductID = getItemID(existingItem.product)\n const newProductID = getItemID(newItem.product)\n\n if (existingProductID !== newProductID) {\n return false\n }\n\n const existingVariantID = getItemID(existingItem.variant)\n const newVariantID = getItemID(newItem.variant)\n\n return existingVariantID === newVariantID\n}\n\nexport type MergeCartArgs = {\n /**\n * Optional custom cart item matcher function for merge operations.\n * Both items are CartItemData (existing cart items).\n */\n cartItemMatcher?: (args: { existingItem: CartItemData; newItem: CartItemData }) => boolean\n /**\n * The collection slug for carts.\n */\n cartsSlug: CollectionSlug\n /**\n * The Payload instance.\n */\n payload: Payload\n /**\n * The PayloadRequest object for transaction safety.\n */\n req?: PayloadRequest\n /**\n * The ID of the source (guest) cart to merge from.\n */\n sourceCartID: DefaultDocumentIDType\n /**\n * The secret for accessing the source guest cart.\n */\n sourceSecret: string\n /**\n * The ID of the target (user's) cart to merge into.\n */\n targetCartID: DefaultDocumentIDType\n}\n\n/**\n * Merges items from a source cart (typically a guest cart) into a target cart (typically a user's cart).\n * Items are merged intelligently - matching items have their quantities combined.\n * After successful merge, the source cart is deleted.\n *\n * @example\n * ```ts\n * const result = await mergeCart({\n * payload,\n * cartsSlug: 'carts',\n * targetCartID: 'user-cart-123',\n * sourceCartID: 'guest-cart-456',\n * sourceSecret: 'abc123secret',\n * })\n * ```\n */\nexport const mergeCart = async (args: MergeCartArgs): Promise<CartOperationResult> => {\n const {\n cartItemMatcher = defaultMergeItemMatcher,\n cartsSlug,\n payload,\n req,\n sourceCartID,\n sourceSecret,\n targetCartID,\n } = args\n\n // Fetch the source (guest) cart with secret verification\n // Using overrideAccess: true here because we're manually verifying the secret in the where clause\n const sourceCart = await payload.find({\n collection: cartsSlug,\n depth: 0,\n limit: 1,\n overrideAccess: true,\n req,\n where: {\n and: [{ id: { equals: sourceCartID } }, { secret: { equals: sourceSecret } }],\n },\n })\n\n if (!sourceCart.docs || sourceCart.docs.length === 0) {\n return {\n cart: null,\n message: `Source cart with ID ${sourceCartID} not found or secret mismatch`,\n success: false,\n }\n }\n\n const guestCart = sourceCart.docs[0]\n\n // Fetch the target (user's) cart\n const targetCart = await payload.findByID({\n id: targetCartID,\n collection: cartsSlug,\n depth: 0,\n overrideAccess: false,\n req,\n })\n\n if (!targetCart) {\n return {\n cart: null,\n message: `Target cart with ID ${targetCartID} not found`,\n success: false,\n }\n }\n\n const sourceItems: CartItemData[] = (guestCart?.items as CartItemData[]) || []\n const targetItems: CartItemData[] = (targetCart.items as CartItemData[]) || []\n\n // Merge items from source into target\n const mergedItems: CartItemData[] = [...targetItems]\n\n for (const sourceItem of sourceItems) {\n // Find if this item already exists in target cart\n const existingIndex = mergedItems.findIndex((targetItem) =>\n cartItemMatcher({ existingItem: targetItem, newItem: sourceItem }),\n )\n\n if (existingIndex !== -1) {\n // Item exists in target - add quantities\n const existingItem = mergedItems[existingIndex]!\n mergedItems[existingIndex] = {\n ...existingItem,\n quantity: existingItem.quantity + sourceItem.quantity,\n }\n } else {\n // Item doesn't exist in target - add it\n // Omit the source item's array row `id` so Payload generates a new one.\n // In SQL, array items are stored in separate tables with their own IDs,\n // and using IDs from another cart's array would cause conflicts.\n const { id: _omit, ...sourceItemWithoutId } = sourceItem\n mergedItems.push(sourceItemWithoutId as CartItemData)\n }\n }\n\n // Update the target cart with merged items\n const updatedCart = await payload.update({\n id: targetCartID,\n collection: cartsSlug,\n data: {\n items: mergedItems,\n },\n depth: 0,\n overrideAccess: false,\n req,\n })\n\n // Delete the source (guest) cart after successful merge\n // Using overrideAccess: true because we've already verified the secret above\n try {\n await payload.delete({\n id: sourceCartID,\n collection: cartsSlug,\n overrideAccess: true,\n req,\n })\n } catch {\n // Silently fail on delete - the merge was still successful\n // The cart may have already been deleted or access denied\n }\n\n return {\n cart: updatedCart,\n message: `Merged ${sourceItems.length} items from guest cart`,\n success: true,\n }\n}\n"],"names":["getItemID","field","undefined","id","defaultMergeItemMatcher","args","existingItem","newItem","existingProductID","product","newProductID","existingVariantID","variant","newVariantID","mergeCart","cartItemMatcher","cartsSlug","payload","req","sourceCartID","sourceSecret","targetCartID","sourceCart","find","collection","depth","limit","overrideAccess","where","and","equals","secret","docs","length","cart","message","success","guestCart","targetCart","findByID","sourceItems","items","targetItems","mergedItems","sourceItem","existingIndex","findIndex","targetItem","quantity","_omit","sourceItemWithoutId","push","updatedCart","update","data","delete"],"mappings":"AAIA;;CAEC,GACD,MAAMA,YAAY,CAChBC;IAMA,IAAI,CAACA,OAAO;QACV,OAAOC;IACT;IACA,OAAO,OAAOD,UAAU,WAAWA,MAAME,EAAE,GAAGF;AAChD;AAEA;;CAEC,GACD,MAAMG,0BAA0B,CAACC;IAI/B,MAAM,EAAEC,YAAY,EAAEC,OAAO,EAAE,GAAGF;IAElC,MAAMG,oBAAoBR,UAAUM,aAAaG,OAAO;IACxD,MAAMC,eAAeV,UAAUO,QAAQE,OAAO;IAE9C,IAAID,sBAAsBE,cAAc;QACtC,OAAO;IACT;IAEA,MAAMC,oBAAoBX,UAAUM,aAAaM,OAAO;IACxD,MAAMC,eAAeb,UAAUO,QAAQK,OAAO;IAE9C,OAAOD,sBAAsBE;AAC/B;AAkCA;;;;;;;;;;;;;;;CAeC,GACD,OAAO,MAAMC,YAAY,OAAOT;IAC9B,MAAM,EACJU,kBAAkBX,uBAAuB,EACzCY,SAAS,EACTC,OAAO,EACPC,GAAG,EACHC,YAAY,EACZC,YAAY,EACZC,YAAY,EACb,GAAGhB;IAEJ,yDAAyD;IACzD,kGAAkG;IAClG,MAAMiB,aAAa,MAAML,QAAQM,IAAI,CAAC;QACpCC,YAAYR;QACZS,OAAO;QACPC,OAAO;QACPC,gBAAgB;QAChBT;QACAU,OAAO;YACLC,KAAK;gBAAC;oBAAE1B,IAAI;wBAAE2B,QAAQX;oBAAa;gBAAE;gBAAG;oBAAEY,QAAQ;wBAAED,QAAQV;oBAAa;gBAAE;aAAE;QAC/E;IACF;IAEA,IAAI,CAACE,WAAWU,IAAI,IAAIV,WAAWU,IAAI,CAACC,MAAM,KAAK,GAAG;QACpD,OAAO;YACLC,MAAM;YACNC,SAAS,CAAC,oBAAoB,EAAEhB,aAAa,6BAA6B,CAAC;YAC3EiB,SAAS;QACX;IACF;IAEA,MAAMC,YAAYf,WAAWU,IAAI,CAAC,EAAE;IAEpC,iCAAiC;IACjC,MAAMM,aAAa,MAAMrB,QAAQsB,QAAQ,CAAC;QACxCpC,IAAIkB;QACJG,YAAYR;QACZS,OAAO;QACPE,gBAAgB;QAChBT;IACF;IAEA,IAAI,CAACoB,YAAY;QACf,OAAO;YACLJ,MAAM;YACNC,SAAS,CAAC,oBAAoB,EAAEd,aAAa,UAAU,CAAC;YACxDe,SAAS;QACX;IACF;IAEA,MAAMI,cAA8B,AAACH,WAAWI,SAA4B,EAAE;IAC9E,MAAMC,cAA8B,AAACJ,WAAWG,KAAK,IAAuB,EAAE;IAE9E,sCAAsC;IACtC,MAAME,cAA8B;WAAID;KAAY;IAEpD,KAAK,MAAME,cAAcJ,YAAa;QACpC,kDAAkD;QAClD,MAAMK,gBAAgBF,YAAYG,SAAS,CAAC,CAACC,aAC3ChC,gBAAgB;gBAAET,cAAcyC;gBAAYxC,SAASqC;YAAW;QAGlE,IAAIC,kBAAkB,CAAC,GAAG;YACxB,yCAAyC;YACzC,MAAMvC,eAAeqC,WAAW,CAACE,cAAc;YAC/CF,WAAW,CAACE,cAAc,GAAG;gBAC3B,GAAGvC,YAAY;gBACf0C,UAAU1C,aAAa0C,QAAQ,GAAGJ,WAAWI,QAAQ;YACvD;QACF,OAAO;YACL,wCAAwC;YACxC,wEAAwE;YACxE,wEAAwE;YACxE,iEAAiE;YACjE,MAAM,EAAE7C,IAAI8C,KAAK,EAAE,GAAGC,qBAAqB,GAAGN;YAC9CD,YAAYQ,IAAI,CAACD;QACnB;IACF;IAEA,2CAA2C;IAC3C,MAAME,cAAc,MAAMnC,QAAQoC,MAAM,CAAC;QACvClD,IAAIkB;QACJG,YAAYR;QACZsC,MAAM;YACJb,OAAOE;QACT;QACAlB,OAAO;QACPE,gBAAgB;QAChBT;IACF;IAEA,wDAAwD;IACxD,6EAA6E;IAC7E,IAAI;QACF,MAAMD,QAAQsC,MAAM,CAAC;YACnBpD,IAAIgB;YACJK,YAAYR;YACZW,gBAAgB;YAChBT;QACF;IACF,EAAE,OAAM;IACN,2DAA2D;IAC3D,0DAA0D;IAC5D;IAEA,OAAO;QACLgB,MAAMkB;QACNjB,SAAS,CAAC,OAAO,EAAEK,YAAYP,MAAM,CAAC,sBAAsB,CAAC;QAC7DG,SAAS;IACX;AACF,EAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { CartOperationResult, RemoveItemArgs } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Removes an item from a cart by its row ID.
|
|
4
|
+
*
|
|
5
|
+
* This handler is isolated and can be used from:
|
|
6
|
+
* - Custom endpoints
|
|
7
|
+
* - Local API operations
|
|
8
|
+
* - Hooks
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* const result = await removeItem({
|
|
13
|
+
* payload,
|
|
14
|
+
* cartsSlug: 'carts',
|
|
15
|
+
* cartID: '123',
|
|
16
|
+
* itemID: 'item-row-id',
|
|
17
|
+
* })
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export declare const removeItem: (args: RemoveItemArgs) => Promise<CartOperationResult>;
|
|
21
|
+
//# sourceMappingURL=removeItem.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"removeItem.d.ts","sourceRoot":"","sources":["../../../../src/collections/carts/operations/removeItem.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,mBAAmB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAInF;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,UAAU,SAAgB,cAAc,KAAG,OAAO,CAAC,mBAAmB,CAuDlF,CAAA"}
|