@shadowmkj/plugin-ecommerce 3.85.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +22 -0
- package/README.md +3 -0
- package/dist/collections/addresses/createAddressesCollection.d.ts.map +1 -0
- package/dist/collections/addresses/createAddressesCollection.js +73 -0
- package/dist/collections/addresses/createAddressesCollection.js.map +1 -0
- package/dist/collections/addresses/defaultAddressFields.d.ts.map +1 -0
- package/dist/collections/addresses/defaultAddressFields.js +72 -0
- package/dist/collections/addresses/defaultAddressFields.js.map +1 -0
- package/dist/collections/addresses/defaultCountries.d.ts.map +1 -0
- package/dist/collections/addresses/defaultCountries.js +169 -0
- package/dist/collections/addresses/defaultCountries.js.map +1 -0
- package/dist/collections/addresses/hooks/beforeChange.d.ts.map +1 -0
- package/dist/collections/addresses/hooks/beforeChange.js +16 -0
- package/dist/collections/addresses/hooks/beforeChange.js.map +1 -0
- package/dist/collections/carts/beforeChange.d.ts.map +1 -0
- package/dist/collections/carts/beforeChange.js +49 -0
- package/dist/collections/carts/beforeChange.js.map +1 -0
- package/dist/collections/carts/createCartsCollection.d.ts.map +1 -0
- package/dist/collections/carts/createCartsCollection.js +194 -0
- package/dist/collections/carts/createCartsCollection.js.map +1 -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.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.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.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.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.map +1 -0
- package/dist/collections/carts/hasCartSecretAccess.js +24 -0
- package/dist/collections/carts/hasCartSecretAccess.js.map +1 -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.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.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.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.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.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.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.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/carts/statusBeforeRead.d.ts.map +1 -0
- package/dist/collections/carts/statusBeforeRead.js +18 -0
- package/dist/collections/carts/statusBeforeRead.js.map +1 -0
- package/dist/collections/orders/createOrdersCollection.d.ts.map +1 -0
- package/dist/collections/orders/createOrdersCollection.js +163 -0
- package/dist/collections/orders/createOrdersCollection.js.map +1 -0
- package/dist/collections/products/createProductsCollection.d.ts.map +1 -0
- package/dist/collections/products/createProductsCollection.js +62 -0
- package/dist/collections/products/createProductsCollection.js.map +1 -0
- package/dist/collections/transactions/createTransactionsCollection.d.ts.map +1 -0
- package/dist/collections/transactions/createTransactionsCollection.js +157 -0
- package/dist/collections/transactions/createTransactionsCollection.js.map +1 -0
- package/dist/collections/variants/createVariantOptionsCollection.d.ts.map +1 -0
- package/dist/collections/variants/createVariantOptionsCollection.js +53 -0
- package/dist/collections/variants/createVariantOptionsCollection.js.map +1 -0
- package/dist/collections/variants/createVariantTypesCollection.d.ts.map +1 -0
- package/dist/collections/variants/createVariantTypesCollection.js +49 -0
- package/dist/collections/variants/createVariantTypesCollection.js.map +1 -0
- package/dist/collections/variants/createVariantsCollection/hooks/beforeChange.d.ts.map +1 -0
- package/dist/collections/variants/createVariantsCollection/hooks/beforeChange.js +38 -0
- package/dist/collections/variants/createVariantsCollection/hooks/beforeChange.js.map +1 -0
- package/dist/collections/variants/createVariantsCollection/hooks/validateOptions.d.ts.map +1 -0
- package/dist/collections/variants/createVariantsCollection/hooks/validateOptions.js +58 -0
- package/dist/collections/variants/createVariantsCollection/hooks/validateOptions.js.map +1 -0
- package/dist/collections/variants/createVariantsCollection/index.d.ts.map +1 -0
- package/dist/collections/variants/createVariantsCollection/index.js +107 -0
- package/dist/collections/variants/createVariantsCollection/index.js.map +1 -0
- package/dist/currencies/index.d.ts.map +1 -0
- package/dist/currencies/index.js +20 -0
- package/dist/currencies/index.js.map +1 -0
- package/dist/endpoints/confirmOrder.d.ts.map +1 -0
- package/dist/endpoints/confirmOrder.js +150 -0
- package/dist/endpoints/confirmOrder.js.map +1 -0
- package/dist/endpoints/initiatePayment.d.ts.map +1 -0
- package/dist/endpoints/initiatePayment.js +226 -0
- package/dist/endpoints/initiatePayment.js.map +1 -0
- package/dist/exports/client/index.d.ts.map +1 -0
- package/dist/exports/client/index.js +4 -0
- package/dist/exports/client/index.js.map +1 -0
- package/dist/exports/client/react.d.ts.map +1 -0
- package/dist/exports/client/react.js +5 -0
- package/dist/exports/client/react.js.map +1 -0
- package/dist/exports/payments/cod.d.ts +2 -0
- package/dist/exports/payments/cod.d.ts.map +1 -0
- package/dist/exports/payments/cod.js +3 -0
- package/dist/exports/payments/cod.js.map +1 -0
- package/dist/exports/payments/stripe.d.ts.map +1 -0
- package/dist/exports/payments/stripe.js +3 -0
- package/dist/exports/payments/stripe.js.map +1 -0
- package/dist/exports/rsc.d.ts.map +1 -0
- package/dist/exports/rsc.js +4 -0
- package/dist/exports/rsc.js.map +1 -0
- package/dist/exports/types.d.ts.map +1 -0
- package/dist/exports/types.js +3 -0
- package/dist/exports/types.js.map +1 -0
- package/dist/fields/amountField.d.ts.map +1 -0
- package/dist/fields/amountField.js +33 -0
- package/dist/fields/amountField.js.map +1 -0
- package/dist/fields/cartItemsField.d.ts.map +1 -0
- package/dist/fields/cartItemsField.js +55 -0
- package/dist/fields/cartItemsField.js.map +1 -0
- package/dist/fields/currencyField.d.ts.map +1 -0
- package/dist/fields/currencyField.js +29 -0
- package/dist/fields/currencyField.js.map +1 -0
- package/dist/fields/inventoryField.d.ts.map +1 -0
- package/dist/fields/inventoryField.js +16 -0
- package/dist/fields/inventoryField.js.map +1 -0
- package/dist/fields/pricesField.d.ts.map +1 -0
- package/dist/fields/pricesField.js +54 -0
- package/dist/fields/pricesField.js.map +1 -0
- package/dist/fields/statusField.d.ts.map +1 -0
- package/dist/fields/statusField.js +49 -0
- package/dist/fields/statusField.js.map +1 -0
- package/dist/fields/variantsFields.d.ts.map +1 -0
- package/dist/fields/variantsFields.js +48 -0
- package/dist/fields/variantsFields.js.map +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +258 -0
- package/dist/index.js.map +1 -0
- package/dist/payments/adapters/cod/confirmOrder.d.ts +5 -0
- package/dist/payments/adapters/cod/confirmOrder.d.ts.map +1 -0
- package/dist/payments/adapters/cod/confirmOrder.js +83 -0
- package/dist/payments/adapters/cod/confirmOrder.js.map +1 -0
- package/dist/payments/adapters/cod/confirmOrder.spec.js +166 -0
- package/dist/payments/adapters/cod/confirmOrder.spec.js.map +1 -0
- package/dist/payments/adapters/cod/endpoints/webhooks.d.ts +5 -0
- package/dist/payments/adapters/cod/endpoints/webhooks.d.ts.map +1 -0
- package/dist/payments/adapters/cod/endpoints/webhooks.js +18 -0
- package/dist/payments/adapters/cod/endpoints/webhooks.js.map +1 -0
- package/dist/payments/adapters/cod/index.d.ts +12 -0
- package/dist/payments/adapters/cod/index.d.ts.map +1 -0
- package/dist/payments/adapters/cod/index.js +64 -0
- package/dist/payments/adapters/cod/index.js.map +1 -0
- package/dist/payments/adapters/cod/initiatePayment.d.ts +5 -0
- package/dist/payments/adapters/cod/initiatePayment.d.ts.map +1 -0
- package/dist/payments/adapters/cod/initiatePayment.js +91 -0
- package/dist/payments/adapters/cod/initiatePayment.js.map +1 -0
- package/dist/payments/adapters/stripe/confirmOrder.d.ts.map +1 -0
- package/dist/payments/adapters/stripe/confirmOrder.js +113 -0
- package/dist/payments/adapters/stripe/confirmOrder.js.map +1 -0
- package/dist/payments/adapters/stripe/confirmOrder.spec.js +166 -0
- package/dist/payments/adapters/stripe/confirmOrder.spec.js.map +1 -0
- package/dist/payments/adapters/stripe/endpoints/webhooks.d.ts.map +1 -0
- package/dist/payments/adapters/stripe/endpoints/webhooks.js +53 -0
- package/dist/payments/adapters/stripe/endpoints/webhooks.js.map +1 -0
- package/dist/payments/adapters/stripe/index.d.ts +61 -0
- package/dist/payments/adapters/stripe/index.d.ts.map +1 -0
- package/dist/payments/adapters/stripe/index.js +68 -0
- package/dist/payments/adapters/stripe/index.js.map +1 -0
- package/dist/payments/adapters/stripe/initiatePayment.d.ts.map +1 -0
- package/dist/payments/adapters/stripe/initiatePayment.js +113 -0
- package/dist/payments/adapters/stripe/initiatePayment.js.map +1 -0
- package/dist/react/provider/index.d.ts.map +1 -0
- package/dist/react/provider/index.js +1094 -0
- package/dist/react/provider/index.js.map +1 -0
- package/dist/react/provider/utilities.d.ts.map +1 -0
- package/dist/react/provider/utilities.js +13 -0
- package/dist/react/provider/utilities.js.map +1 -0
- package/dist/translations/index.d.ts.map +1 -0
- package/dist/translations/index.js +84 -0
- package/dist/translations/index.js.map +1 -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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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 +343 -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.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/utilities.d.ts.map +1 -0
- package/dist/types/utilities.js +3 -0
- package/dist/types/utilities.js.map +1 -0
- package/dist/ui/PriceCell/index.d.ts.map +1 -0
- package/dist/ui/PriceCell/index.js +36 -0
- package/dist/ui/PriceCell/index.js.map +1 -0
- package/dist/ui/PriceInput/FormattedInput.d.ts.map +1 -0
- package/dist/ui/PriceInput/FormattedInput.js +147 -0
- package/dist/ui/PriceInput/FormattedInput.js.map +1 -0
- package/dist/ui/PriceInput/index.css +35 -0
- package/dist/ui/PriceInput/index.d.ts.map +1 -0
- package/dist/ui/PriceInput/index.js +21 -0
- package/dist/ui/PriceInput/index.js.map +1 -0
- package/dist/ui/PriceRowLabel/index.css +13 -0
- package/dist/ui/PriceRowLabel/index.d.ts.map +1 -0
- package/dist/ui/PriceRowLabel/index.js +66 -0
- package/dist/ui/PriceRowLabel/index.js.map +1 -0
- package/dist/ui/VariantOptionsSelector/ErrorBox.d.ts.map +1 -0
- package/dist/ui/VariantOptionsSelector/ErrorBox.js +28 -0
- package/dist/ui/VariantOptionsSelector/ErrorBox.js.map +1 -0
- package/dist/ui/VariantOptionsSelector/OptionsSelect.d.ts.map +1 -0
- package/dist/ui/VariantOptionsSelector/OptionsSelect.js +71 -0
- package/dist/ui/VariantOptionsSelector/OptionsSelect.js.map +1 -0
- package/dist/ui/VariantOptionsSelector/index.css +37 -0
- package/dist/ui/VariantOptionsSelector/index.d.ts.map +1 -0
- package/dist/ui/VariantOptionsSelector/index.js +81 -0
- package/dist/ui/VariantOptionsSelector/index.js.map +1 -0
- package/dist/ui/utilities.d.ts.map +1 -0
- package/dist/ui/utilities.js +40 -0
- package/dist/ui/utilities.js.map +1 -0
- package/dist/utilities/accessComposition.d.ts.map +1 -0
- package/dist/utilities/accessComposition.js +103 -0
- package/dist/utilities/accessComposition.js.map +1 -0
- package/dist/utilities/accessComposition.spec.js +765 -0
- package/dist/utilities/accessComposition.spec.js.map +1 -0
- package/dist/utilities/defaultProductsValidation.d.ts.map +1 -0
- package/dist/utilities/defaultProductsValidation.js +40 -0
- package/dist/utilities/defaultProductsValidation.js.map +1 -0
- package/dist/utilities/defaultProductsValidation.spec.js +384 -0
- package/dist/utilities/defaultProductsValidation.spec.js.map +1 -0
- package/dist/utilities/errorCodes.d.ts.map +1 -0
- package/dist/utilities/errorCodes.js +4 -0
- package/dist/utilities/errorCodes.js.map +1 -0
- package/dist/utilities/getCollectionSlugMap.d.ts.map +1 -0
- package/dist/utilities/getCollectionSlugMap.js +36 -0
- package/dist/utilities/getCollectionSlugMap.js.map +1 -0
- package/dist/utilities/getCollectionSlugMap.spec.js +254 -0
- package/dist/utilities/getCollectionSlugMap.spec.js.map +1 -0
- package/dist/utilities/pushTypeScriptProperties.d.ts.map +1 -0
- package/dist/utilities/pushTypeScriptProperties.js +37 -0
- package/dist/utilities/pushTypeScriptProperties.js.map +1 -0
- package/dist/utilities/sanitizePluginConfig.d.ts.map +1 -0
- package/dist/utilities/sanitizePluginConfig.js +75 -0
- package/dist/utilities/sanitizePluginConfig.js.map +1 -0
- package/dist/utilities/sanitizePluginConfig.spec.js +516 -0
- package/dist/utilities/sanitizePluginConfig.spec.js.map +1 -0
- package/package.json +114 -0
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { amountField } from '../../fields/amountField.js';
|
|
2
|
+
import { cartItemsField } from '../../fields/cartItemsField.js';
|
|
3
|
+
import { currencyField } from '../../fields/currencyField.js';
|
|
4
|
+
import { accessOR, conditional } from '../../utilities/accessComposition.js';
|
|
5
|
+
import { beforeChangeCart } from './beforeChange.js';
|
|
6
|
+
import { addItemEndpoint } from './endpoints/addItem.js';
|
|
7
|
+
import { clearCartEndpoint } from './endpoints/clearCart.js';
|
|
8
|
+
import { mergeCartEndpoint } from './endpoints/mergeCart.js';
|
|
9
|
+
import { removeItemEndpoint } from './endpoints/removeItem.js';
|
|
10
|
+
import { updateItemEndpoint } from './endpoints/updateItem.js';
|
|
11
|
+
import { hasCartSecretAccess } from './hasCartSecretAccess.js';
|
|
12
|
+
import { statusBeforeRead } from './statusBeforeRead.js';
|
|
13
|
+
export const createCartsCollection = (props)=>{
|
|
14
|
+
const { access, allowGuestCarts = false, cartItemMatcher, currenciesConfig, customersSlug = 'users', enableVariants = false, productsSlug = 'products', variantsSlug = 'variants' } = props || {};
|
|
15
|
+
const cartsSlug = 'carts';
|
|
16
|
+
const fields = [
|
|
17
|
+
cartItemsField({
|
|
18
|
+
enableVariants,
|
|
19
|
+
overrides: {
|
|
20
|
+
label: ({ t })=>// @ts-expect-error - translations are not typed in plugins yet
|
|
21
|
+
t('plugin-ecommerce:items'),
|
|
22
|
+
labels: {
|
|
23
|
+
plural: ({ t })=>// @ts-expect-error - translations are not typed in plugins yet
|
|
24
|
+
t('plugin-ecommerce:items'),
|
|
25
|
+
singular: ({ t })=>// @ts-expect-error - translations are not typed in plugins yet
|
|
26
|
+
t('plugin-ecommerce:item')
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
productsSlug,
|
|
30
|
+
variantsSlug
|
|
31
|
+
}),
|
|
32
|
+
{
|
|
33
|
+
name: 'secret',
|
|
34
|
+
type: 'text',
|
|
35
|
+
access: {
|
|
36
|
+
create: ()=>false,
|
|
37
|
+
read: ()=>false,
|
|
38
|
+
update: ()=>false
|
|
39
|
+
},
|
|
40
|
+
admin: {
|
|
41
|
+
hidden: true,
|
|
42
|
+
position: 'sidebar',
|
|
43
|
+
readOnly: true
|
|
44
|
+
},
|
|
45
|
+
index: true,
|
|
46
|
+
label: ({ t })=>// @ts-expect-error - translations are not typed in plugins yet
|
|
47
|
+
t('plugin-ecommerce:cartSecret')
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: 'customer',
|
|
51
|
+
type: 'relationship',
|
|
52
|
+
admin: {
|
|
53
|
+
position: 'sidebar'
|
|
54
|
+
},
|
|
55
|
+
label: ({ t })=>// @ts-expect-error - translations are not typed in plugins yet
|
|
56
|
+
t('plugin-ecommerce:customer'),
|
|
57
|
+
relationTo: customersSlug
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
name: 'purchasedAt',
|
|
61
|
+
type: 'date',
|
|
62
|
+
admin: {
|
|
63
|
+
date: {
|
|
64
|
+
pickerAppearance: 'dayAndTime'
|
|
65
|
+
},
|
|
66
|
+
position: 'sidebar'
|
|
67
|
+
},
|
|
68
|
+
label: ({ t })=>// @ts-expect-error - translations are not typed in plugins yet
|
|
69
|
+
t('plugin-ecommerce:purchasedAt')
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
name: 'status',
|
|
73
|
+
type: 'select',
|
|
74
|
+
admin: {
|
|
75
|
+
position: 'sidebar',
|
|
76
|
+
readOnly: true
|
|
77
|
+
},
|
|
78
|
+
hooks: {
|
|
79
|
+
afterRead: [
|
|
80
|
+
statusBeforeRead
|
|
81
|
+
]
|
|
82
|
+
},
|
|
83
|
+
label: ({ t })=>// @ts-expect-error - translations are not typed in plugins yet
|
|
84
|
+
t('plugin-ecommerce:status'),
|
|
85
|
+
options: [
|
|
86
|
+
{
|
|
87
|
+
// @ts-expect-error - translations are not typed in plugins yet
|
|
88
|
+
label: ({ t })=>t('plugin-ecommerce:active'),
|
|
89
|
+
value: 'active'
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
// @ts-expect-error - translations are not typed in plugins yet
|
|
93
|
+
label: ({ t })=>t('plugin-ecommerce:purchased'),
|
|
94
|
+
value: 'purchased'
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
// @ts-expect-error - translations are not typed in plugins yet
|
|
98
|
+
label: ({ t })=>t('plugin-ecommerce:abandoned'),
|
|
99
|
+
value: 'abandoned'
|
|
100
|
+
}
|
|
101
|
+
],
|
|
102
|
+
virtual: true
|
|
103
|
+
},
|
|
104
|
+
...currenciesConfig ? [
|
|
105
|
+
{
|
|
106
|
+
type: 'row',
|
|
107
|
+
admin: {
|
|
108
|
+
position: 'sidebar'
|
|
109
|
+
},
|
|
110
|
+
fields: [
|
|
111
|
+
amountField({
|
|
112
|
+
currenciesConfig,
|
|
113
|
+
overrides: {
|
|
114
|
+
name: 'subtotal',
|
|
115
|
+
label: ({ t })=>// @ts-expect-error - translations are not typed in plugins yet
|
|
116
|
+
t('plugin-ecommerce:subtotal')
|
|
117
|
+
}
|
|
118
|
+
}),
|
|
119
|
+
currencyField({
|
|
120
|
+
currenciesConfig
|
|
121
|
+
})
|
|
122
|
+
]
|
|
123
|
+
}
|
|
124
|
+
] : []
|
|
125
|
+
];
|
|
126
|
+
// Internal access function for guest users (unauthenticated)
|
|
127
|
+
const isGuest = ({ req })=>!req.user;
|
|
128
|
+
const baseConfig = {
|
|
129
|
+
slug: cartsSlug,
|
|
130
|
+
access: {
|
|
131
|
+
create: accessOR(access.isAdmin, access.isAuthenticated, conditional(allowGuestCarts, isGuest)),
|
|
132
|
+
delete: accessOR(access.isAdmin, access.isDocumentOwner, hasCartSecretAccess(allowGuestCarts)),
|
|
133
|
+
read: accessOR(access.isAdmin, access.isDocumentOwner, hasCartSecretAccess(allowGuestCarts)),
|
|
134
|
+
update: accessOR(access.isAdmin, access.isDocumentOwner, hasCartSecretAccess(allowGuestCarts))
|
|
135
|
+
},
|
|
136
|
+
admin: {
|
|
137
|
+
description: ({ t })=>// @ts-expect-error - translations are not typed in plugins yet
|
|
138
|
+
t('plugin-ecommerce:cartsCollectionDescription'),
|
|
139
|
+
group: 'Ecommerce',
|
|
140
|
+
useAsTitle: 'createdAt'
|
|
141
|
+
},
|
|
142
|
+
endpoints: [
|
|
143
|
+
addItemEndpoint({
|
|
144
|
+
cartItemMatcher,
|
|
145
|
+
cartsSlug
|
|
146
|
+
}),
|
|
147
|
+
clearCartEndpoint({
|
|
148
|
+
cartsSlug
|
|
149
|
+
}),
|
|
150
|
+
// mergeCartEndpoint uses its own matcher that handles CartItemData for both items
|
|
151
|
+
mergeCartEndpoint({
|
|
152
|
+
cartsSlug
|
|
153
|
+
}),
|
|
154
|
+
removeItemEndpoint({
|
|
155
|
+
cartsSlug
|
|
156
|
+
}),
|
|
157
|
+
updateItemEndpoint({
|
|
158
|
+
cartsSlug
|
|
159
|
+
})
|
|
160
|
+
],
|
|
161
|
+
fields,
|
|
162
|
+
hooks: {
|
|
163
|
+
afterRead: [
|
|
164
|
+
({ doc, req })=>{
|
|
165
|
+
// Include secret only if this was just created (stored in context by beforeChange)
|
|
166
|
+
if (req.context?.newCartSecret) {
|
|
167
|
+
doc.secret = req.context.newCartSecret;
|
|
168
|
+
}
|
|
169
|
+
// Secret is otherwise never exposed (field access is locked)
|
|
170
|
+
return doc;
|
|
171
|
+
}
|
|
172
|
+
],
|
|
173
|
+
beforeChange: [
|
|
174
|
+
// This hook can be used to update the subtotal before saving the cart
|
|
175
|
+
beforeChangeCart({
|
|
176
|
+
productsSlug,
|
|
177
|
+
variantsSlug
|
|
178
|
+
})
|
|
179
|
+
]
|
|
180
|
+
},
|
|
181
|
+
labels: {
|
|
182
|
+
plural: ({ t })=>// @ts-expect-error - translations are not typed in plugins yet
|
|
183
|
+
t('plugin-ecommerce:carts'),
|
|
184
|
+
singular: ({ t })=>// @ts-expect-error - translations are not typed in plugins yet
|
|
185
|
+
t('plugin-ecommerce:cart')
|
|
186
|
+
},
|
|
187
|
+
timestamps: true
|
|
188
|
+
};
|
|
189
|
+
return {
|
|
190
|
+
...baseConfig
|
|
191
|
+
};
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
//# sourceMappingURL=createCartsCollection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/collections/carts/createCartsCollection.ts"],"sourcesContent":["import type { Access, CollectionConfig, Field } from 'payload'\n\nimport type { AccessConfig, CurrenciesConfig } from '../../types/index.js'\nimport type { CartItemMatcher } from './operations/types.js'\n\nimport { amountField } from '../../fields/amountField.js'\nimport { cartItemsField } from '../../fields/cartItemsField.js'\nimport { currencyField } from '../../fields/currencyField.js'\nimport { accessOR, conditional } from '../../utilities/accessComposition.js'\nimport { beforeChangeCart } from './beforeChange.js'\nimport { addItemEndpoint } from './endpoints/addItem.js'\nimport { clearCartEndpoint } from './endpoints/clearCart.js'\nimport { mergeCartEndpoint } from './endpoints/mergeCart.js'\nimport { removeItemEndpoint } from './endpoints/removeItem.js'\nimport { updateItemEndpoint } from './endpoints/updateItem.js'\nimport { hasCartSecretAccess } from './hasCartSecretAccess.js'\nimport { statusBeforeRead } from './statusBeforeRead.js'\n\ntype Props = {\n access: Pick<Required<AccessConfig>, 'isAdmin' | 'isAuthenticated' | 'isDocumentOwner'>\n /**\n * Allow guest (unauthenticated) users to create carts.\n * Defaults to false.\n */\n allowGuestCarts?: boolean\n /**\n * Custom function to determine if two cart items should be considered the same.\n * When items match, their quantities are combined instead of creating separate entries.\n *\n * Use this to add custom uniqueness criteria beyond product and variant IDs.\n *\n * @default defaultCartItemMatcher (matches by product and variant ID only)\n *\n * @example\n * ```ts\n * cartItemMatcher: ({ existingItem, newItem }) => {\n * // Match by product, variant, AND custom delivery option\n * const productMatch = existingItem.product === newItem.product\n * const variantMatch = existingItem.variant === newItem.variant\n * const deliveryMatch = existingItem.deliveryOption === newItem.deliveryOption\n * return productMatch && variantMatch && deliveryMatch\n * }\n * ```\n */\n cartItemMatcher?: CartItemMatcher\n currenciesConfig?: CurrenciesConfig\n /**\n * Slug of the customers collection, defaults to 'users'.\n */\n customersSlug?: string\n /**\n * Enables support for variants in the cart.\n * Defaults to false.\n */\n enableVariants?: boolean\n /**\n * Slug of the products collection, defaults to 'products'.\n */\n productsSlug?: string\n /**\n * Slug of the variants collection, defaults to 'variants'.\n */\n variantsSlug?: string\n}\n\nexport const createCartsCollection: (props: Props) => CollectionConfig = (props) => {\n const {\n access,\n allowGuestCarts = false,\n cartItemMatcher,\n currenciesConfig,\n customersSlug = 'users',\n enableVariants = false,\n productsSlug = 'products',\n variantsSlug = 'variants',\n } = props || {}\n\n const cartsSlug = 'carts'\n\n const fields: Field[] = [\n cartItemsField({\n enableVariants,\n overrides: {\n label: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:items'),\n labels: {\n plural: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:items'),\n singular: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:item'),\n },\n },\n productsSlug,\n variantsSlug,\n }),\n {\n name: 'secret',\n type: 'text',\n access: {\n create: () => false, // Users can't set it manually\n read: () => false, // Never readable via field access (only through afterRead hook)\n update: () => false, // Users can't update it\n },\n admin: {\n hidden: true,\n position: 'sidebar',\n readOnly: true,\n },\n index: true,\n label: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:cartSecret'),\n },\n {\n name: 'customer',\n type: 'relationship',\n admin: {\n position: 'sidebar',\n },\n label: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:customer'),\n relationTo: customersSlug,\n },\n {\n name: 'purchasedAt',\n type: 'date',\n admin: {\n date: { pickerAppearance: 'dayAndTime' },\n position: 'sidebar',\n },\n label: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:purchasedAt'),\n },\n {\n name: 'status',\n type: 'select',\n admin: {\n position: 'sidebar',\n readOnly: true,\n },\n hooks: {\n afterRead: [statusBeforeRead],\n },\n label: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:status'),\n options: [\n {\n // @ts-expect-error - translations are not typed in plugins yet\n label: ({ t }) => t('plugin-ecommerce:active'),\n value: 'active',\n },\n {\n // @ts-expect-error - translations are not typed in plugins yet\n label: ({ t }) => t('plugin-ecommerce:purchased'),\n value: 'purchased',\n },\n {\n // @ts-expect-error - translations are not typed in plugins yet\n label: ({ t }) => t('plugin-ecommerce:abandoned'),\n value: 'abandoned',\n },\n ],\n virtual: true,\n },\n ...(currenciesConfig\n ? [\n {\n type: 'row',\n admin: { position: 'sidebar' },\n fields: [\n amountField({\n currenciesConfig,\n overrides: {\n name: 'subtotal',\n\n label: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:subtotal'),\n },\n }),\n currencyField({\n currenciesConfig,\n }),\n ],\n } as Field,\n ]\n : []),\n ]\n\n // Internal access function for guest users (unauthenticated)\n const isGuest: Access = ({ req }) => !req.user\n\n const baseConfig: CollectionConfig = {\n slug: cartsSlug,\n access: {\n create: accessOR(\n access.isAdmin,\n access.isAuthenticated,\n conditional(allowGuestCarts, isGuest),\n ),\n delete: accessOR(\n access.isAdmin,\n access.isDocumentOwner,\n hasCartSecretAccess(allowGuestCarts),\n ),\n read: accessOR(access.isAdmin, access.isDocumentOwner, hasCartSecretAccess(allowGuestCarts)),\n update: accessOR(\n access.isAdmin,\n access.isDocumentOwner,\n hasCartSecretAccess(allowGuestCarts),\n ),\n },\n admin: {\n description: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:cartsCollectionDescription'),\n group: 'Ecommerce',\n useAsTitle: 'createdAt',\n },\n endpoints: [\n addItemEndpoint({ cartItemMatcher, cartsSlug }),\n clearCartEndpoint({ cartsSlug }),\n // mergeCartEndpoint uses its own matcher that handles CartItemData for both items\n mergeCartEndpoint({ cartsSlug }),\n removeItemEndpoint({ cartsSlug }),\n updateItemEndpoint({ cartsSlug }),\n ],\n fields,\n hooks: {\n afterRead: [\n ({ doc, req }) => {\n // Include secret only if this was just created (stored in context by beforeChange)\n if (req.context?.newCartSecret) {\n doc.secret = req.context.newCartSecret\n }\n // Secret is otherwise never exposed (field access is locked)\n return doc\n },\n ],\n beforeChange: [\n // This hook can be used to update the subtotal before saving the cart\n beforeChangeCart({ productsSlug, variantsSlug }),\n ],\n },\n labels: {\n plural: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:carts'),\n singular: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:cart'),\n },\n timestamps: true,\n }\n\n return { ...baseConfig }\n}\n"],"names":["amountField","cartItemsField","currencyField","accessOR","conditional","beforeChangeCart","addItemEndpoint","clearCartEndpoint","mergeCartEndpoint","removeItemEndpoint","updateItemEndpoint","hasCartSecretAccess","statusBeforeRead","createCartsCollection","props","access","allowGuestCarts","cartItemMatcher","currenciesConfig","customersSlug","enableVariants","productsSlug","variantsSlug","cartsSlug","fields","overrides","label","t","labels","plural","singular","name","type","create","read","update","admin","hidden","position","readOnly","index","relationTo","date","pickerAppearance","hooks","afterRead","options","value","virtual","isGuest","req","user","baseConfig","slug","isAdmin","isAuthenticated","delete","isDocumentOwner","description","group","useAsTitle","endpoints","doc","context","newCartSecret","secret","beforeChange","timestamps"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addItem.d.ts","sourceRoot":"","sources":["../../../../src/collections/carts/endpoints/addItem.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAIvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAI7D,KAAK,IAAI,GAAG;IACV,eAAe,CAAC,EAAE,eAAe,CAAA;IACjC,SAAS,EAAE,cAAc,CAAA;CAC1B,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,mCAAoC,IAAI,KAAG,QAyCrE,CAAA"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { addDataAndFileToRequest } from 'payload';
|
|
2
|
+
import { addItem } from '../operations/addItem.js';
|
|
3
|
+
/**
|
|
4
|
+
* Creates an endpoint handler for adding items to a cart.
|
|
5
|
+
*
|
|
6
|
+
* Route: POST /api/{cartsSlug}/:id/add-item
|
|
7
|
+
*
|
|
8
|
+
* Request body:
|
|
9
|
+
* - item: { product: string, variant?: string, ...customFields }
|
|
10
|
+
* - quantity?: number (defaults to 1)
|
|
11
|
+
* - secret?: string (for guest cart access)
|
|
12
|
+
*/ export const addItemEndpoint = ({ cartItemMatcher, cartsSlug })=>({
|
|
13
|
+
handler: async (req)=>{
|
|
14
|
+
await addDataAndFileToRequest(req);
|
|
15
|
+
const cartID = req.routeParams?.id;
|
|
16
|
+
const data = req.data;
|
|
17
|
+
if (!cartID) {
|
|
18
|
+
return Response.json({
|
|
19
|
+
message: 'Cart ID is required',
|
|
20
|
+
success: false
|
|
21
|
+
}, {
|
|
22
|
+
status: 400
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
if (!data?.item?.product) {
|
|
26
|
+
return Response.json({
|
|
27
|
+
message: 'Item with product ID is required',
|
|
28
|
+
success: false
|
|
29
|
+
}, {
|
|
30
|
+
status: 400
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
const result = await addItem({
|
|
34
|
+
cartID,
|
|
35
|
+
cartItemMatcher,
|
|
36
|
+
cartsSlug,
|
|
37
|
+
item: data.item,
|
|
38
|
+
payload: req.payload,
|
|
39
|
+
quantity: data.quantity,
|
|
40
|
+
req,
|
|
41
|
+
secret: data.secret
|
|
42
|
+
});
|
|
43
|
+
if (!result.success) {
|
|
44
|
+
return Response.json(result, {
|
|
45
|
+
status: 404
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
return Response.json(result);
|
|
49
|
+
},
|
|
50
|
+
method: 'post',
|
|
51
|
+
path: '/:id/add-item'
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
//# sourceMappingURL=addItem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/collections/carts/endpoints/addItem.ts"],"sourcesContent":["import type { CollectionSlug, Endpoint } from 'payload'\n\nimport { addDataAndFileToRequest } from 'payload'\n\nimport type { CartItemMatcher } from '../operations/types.js'\n\nimport { addItem } from '../operations/addItem.js'\n\ntype Args = {\n cartItemMatcher?: CartItemMatcher\n cartsSlug: CollectionSlug\n}\n\n/**\n * Creates an endpoint handler for adding items to a cart.\n *\n * Route: POST /api/{cartsSlug}/:id/add-item\n *\n * Request body:\n * - item: { product: string, variant?: string, ...customFields }\n * - quantity?: number (defaults to 1)\n * - secret?: string (for guest cart access)\n */\nexport const addItemEndpoint = ({ cartItemMatcher, cartsSlug }: Args): Endpoint => ({\n handler: async (req) => {\n await addDataAndFileToRequest(req)\n\n const cartID = req.routeParams?.id as string | undefined\n const data = req.data as {\n item?: { [key: string]: unknown; product: string; variant?: string }\n quantity?: number\n secret?: string\n }\n\n if (!cartID) {\n return Response.json({ message: 'Cart ID is required', success: false }, { status: 400 })\n }\n\n if (!data?.item?.product) {\n return Response.json(\n { message: 'Item with product ID is required', success: false },\n { status: 400 },\n )\n }\n\n const result = await addItem({\n cartID,\n cartItemMatcher,\n cartsSlug,\n item: data.item,\n payload: req.payload,\n quantity: data.quantity,\n req,\n secret: data.secret,\n })\n\n if (!result.success) {\n return Response.json(result, { status: 404 })\n }\n\n return Response.json(result)\n },\n method: 'post',\n path: '/:id/add-item',\n})\n"],"names":["addDataAndFileToRequest","addItem","addItemEndpoint","cartItemMatcher","cartsSlug","handler","req","cartID","routeParams","id","data","Response","json","message","success","status","item","product","result","payload","quantity","secret","method","path"],"mappings":"AAEA,SAASA,uBAAuB,QAAQ,UAAS;AAIjD,SAASC,OAAO,QAAQ,2BAA0B;AAOlD;;;;;;;;;CASC,GACD,OAAO,MAAMC,kBAAkB,CAAC,EAAEC,eAAe,EAAEC,SAAS,EAAQ,GAAgB,CAAA;QAClFC,SAAS,OAAOC;YACd,MAAMN,wBAAwBM;YAE9B,MAAMC,SAASD,IAAIE,WAAW,EAAEC;YAChC,MAAMC,OAAOJ,IAAII,IAAI;YAMrB,IAAI,CAACH,QAAQ;gBACX,OAAOI,SAASC,IAAI,CAAC;oBAAEC,SAAS;oBAAuBC,SAAS;gBAAM,GAAG;oBAAEC,QAAQ;gBAAI;YACzF;YAEA,IAAI,CAACL,MAAMM,MAAMC,SAAS;gBACxB,OAAON,SAASC,IAAI,CAClB;oBAAEC,SAAS;oBAAoCC,SAAS;gBAAM,GAC9D;oBAAEC,QAAQ;gBAAI;YAElB;YAEA,MAAMG,SAAS,MAAMjB,QAAQ;gBAC3BM;gBACAJ;gBACAC;gBACAY,MAAMN,KAAKM,IAAI;gBACfG,SAASb,IAAIa,OAAO;gBACpBC,UAAUV,KAAKU,QAAQ;gBACvBd;gBACAe,QAAQX,KAAKW,MAAM;YACrB;YAEA,IAAI,CAACH,OAAOJ,OAAO,EAAE;gBACnB,OAAOH,SAASC,IAAI,CAACM,QAAQ;oBAAEH,QAAQ;gBAAI;YAC7C;YAEA,OAAOJ,SAASC,IAAI,CAACM;QACvB;QACAI,QAAQ;QACRC,MAAM;IACR,CAAA,EAAE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clearCart.d.ts","sourceRoot":"","sources":["../../../../src/collections/carts/endpoints/clearCart.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAMvD,KAAK,IAAI,GAAG;IACV,SAAS,EAAE,cAAc,CAAA;CAC1B,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,kBAAmB,IAAI,KAAG,QA6BtD,CAAA"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { addDataAndFileToRequest } from 'payload';
|
|
2
|
+
import { clearCart } from '../operations/clearCart.js';
|
|
3
|
+
/**
|
|
4
|
+
* Creates an endpoint handler for clearing all items from a cart.
|
|
5
|
+
*
|
|
6
|
+
* Route: POST /api/{cartsSlug}/:id/clear
|
|
7
|
+
*
|
|
8
|
+
* Request body:
|
|
9
|
+
* - secret?: string (for guest cart access)
|
|
10
|
+
*/ export const clearCartEndpoint = ({ cartsSlug })=>({
|
|
11
|
+
handler: async (req)=>{
|
|
12
|
+
await addDataAndFileToRequest(req);
|
|
13
|
+
const cartID = req.routeParams?.id;
|
|
14
|
+
const data = req.data;
|
|
15
|
+
if (!cartID) {
|
|
16
|
+
return Response.json({
|
|
17
|
+
message: 'Cart ID is required',
|
|
18
|
+
success: false
|
|
19
|
+
}, {
|
|
20
|
+
status: 400
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
const result = await clearCart({
|
|
24
|
+
cartID,
|
|
25
|
+
cartsSlug,
|
|
26
|
+
payload: req.payload,
|
|
27
|
+
req,
|
|
28
|
+
secret: data?.secret
|
|
29
|
+
});
|
|
30
|
+
if (!result.success) {
|
|
31
|
+
return Response.json(result, {
|
|
32
|
+
status: 404
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
return Response.json(result);
|
|
36
|
+
},
|
|
37
|
+
method: 'post',
|
|
38
|
+
path: '/:id/clear'
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
//# sourceMappingURL=clearCart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/collections/carts/endpoints/clearCart.ts"],"sourcesContent":["import type { CollectionSlug, Endpoint } from 'payload'\n\nimport { addDataAndFileToRequest } from 'payload'\n\nimport { clearCart } from '../operations/clearCart.js'\n\ntype Args = {\n cartsSlug: CollectionSlug\n}\n\n/**\n * Creates an endpoint handler for clearing all items from a cart.\n *\n * Route: POST /api/{cartsSlug}/:id/clear\n *\n * Request body:\n * - secret?: string (for guest cart access)\n */\nexport const clearCartEndpoint = ({ cartsSlug }: Args): Endpoint => ({\n handler: async (req) => {\n await addDataAndFileToRequest(req)\n\n const cartID = req.routeParams?.id as string | undefined\n const data = req.data as {\n secret?: string\n }\n\n if (!cartID) {\n return Response.json({ message: 'Cart ID is required', success: false }, { status: 400 })\n }\n\n const result = await clearCart({\n cartID,\n cartsSlug,\n payload: req.payload,\n req,\n secret: data?.secret,\n })\n\n if (!result.success) {\n return Response.json(result, { status: 404 })\n }\n\n return Response.json(result)\n },\n method: 'post',\n path: '/:id/clear',\n})\n"],"names":["addDataAndFileToRequest","clearCart","clearCartEndpoint","cartsSlug","handler","req","cartID","routeParams","id","data","Response","json","message","success","status","result","payload","secret","method","path"],"mappings":"AAEA,SAASA,uBAAuB,QAAQ,UAAS;AAEjD,SAASC,SAAS,QAAQ,6BAA4B;AAMtD;;;;;;;CAOC,GACD,OAAO,MAAMC,oBAAoB,CAAC,EAAEC,SAAS,EAAQ,GAAgB,CAAA;QACnEC,SAAS,OAAOC;YACd,MAAML,wBAAwBK;YAE9B,MAAMC,SAASD,IAAIE,WAAW,EAAEC;YAChC,MAAMC,OAAOJ,IAAII,IAAI;YAIrB,IAAI,CAACH,QAAQ;gBACX,OAAOI,SAASC,IAAI,CAAC;oBAAEC,SAAS;oBAAuBC,SAAS;gBAAM,GAAG;oBAAEC,QAAQ;gBAAI;YACzF;YAEA,MAAMC,SAAS,MAAMd,UAAU;gBAC7BK;gBACAH;gBACAa,SAASX,IAAIW,OAAO;gBACpBX;gBACAY,QAAQR,MAAMQ;YAChB;YAEA,IAAI,CAACF,OAAOF,OAAO,EAAE;gBACnB,OAAOH,SAASC,IAAI,CAACI,QAAQ;oBAAED,QAAQ;gBAAI;YAC7C;YAEA,OAAOJ,SAASC,IAAI,CAACI;QACvB;QACAG,QAAQ;QACRC,MAAM;IACR,CAAA,EAAE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mergeCart.d.ts","sourceRoot":"","sources":["../../../../src/collections/carts/endpoints/mergeCart.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAIvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAI/D,KAAK,IAAI,GAAG;IACV,eAAe,CAAC,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAA;IAClD,SAAS,EAAE,cAAc,CAAA;CAC1B,CAAA;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,iBAAiB,mCAAoC,IAAI,KAAG,QAsDvE,CAAA"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { addDataAndFileToRequest } from 'payload';
|
|
2
|
+
import { mergeCart } from '../operations/mergeCart.js';
|
|
3
|
+
/**
|
|
4
|
+
* Creates an endpoint handler for merging a guest cart into the authenticated user's cart.
|
|
5
|
+
* This is used when a guest with an existing cart logs in.
|
|
6
|
+
*
|
|
7
|
+
* Route: POST /api/{cartsSlug}/:id/merge
|
|
8
|
+
*
|
|
9
|
+
* Request body:
|
|
10
|
+
* - sourceCartID: string - The ID of the guest cart to merge from
|
|
11
|
+
* - sourceSecret: string - The secret of the guest cart for verification
|
|
12
|
+
*
|
|
13
|
+
* Requires authentication - the :id in the URL is the target cart which must belong to the user.
|
|
14
|
+
*/ export const mergeCartEndpoint = ({ cartItemMatcher, cartsSlug })=>({
|
|
15
|
+
handler: async (req)=>{
|
|
16
|
+
// This endpoint requires authentication
|
|
17
|
+
if (!req.user) {
|
|
18
|
+
return Response.json({
|
|
19
|
+
message: 'Authentication required',
|
|
20
|
+
success: false
|
|
21
|
+
}, {
|
|
22
|
+
status: 401
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
await addDataAndFileToRequest(req);
|
|
26
|
+
const targetCartID = req.routeParams?.id;
|
|
27
|
+
const data = req.data;
|
|
28
|
+
if (!targetCartID) {
|
|
29
|
+
return Response.json({
|
|
30
|
+
message: 'Target cart ID is required',
|
|
31
|
+
success: false
|
|
32
|
+
}, {
|
|
33
|
+
status: 400
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
if (!data?.sourceCartID) {
|
|
37
|
+
return Response.json({
|
|
38
|
+
message: 'Source cart ID is required',
|
|
39
|
+
success: false
|
|
40
|
+
}, {
|
|
41
|
+
status: 400
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
if (!data?.sourceSecret) {
|
|
45
|
+
return Response.json({
|
|
46
|
+
message: 'Source cart secret is required',
|
|
47
|
+
success: false
|
|
48
|
+
}, {
|
|
49
|
+
status: 400
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
const result = await mergeCart({
|
|
53
|
+
cartItemMatcher,
|
|
54
|
+
cartsSlug,
|
|
55
|
+
payload: req.payload,
|
|
56
|
+
req,
|
|
57
|
+
sourceCartID: data.sourceCartID,
|
|
58
|
+
sourceSecret: data.sourceSecret,
|
|
59
|
+
targetCartID
|
|
60
|
+
});
|
|
61
|
+
if (!result.success) {
|
|
62
|
+
return Response.json(result, {
|
|
63
|
+
status: 404
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
return Response.json(result);
|
|
67
|
+
},
|
|
68
|
+
method: 'post',
|
|
69
|
+
path: '/:id/merge'
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
//# sourceMappingURL=mergeCart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/collections/carts/endpoints/mergeCart.ts"],"sourcesContent":["import type { CollectionSlug, Endpoint } from 'payload'\n\nimport { addDataAndFileToRequest } from 'payload'\n\nimport type { MergeCartArgs } from '../operations/mergeCart.js'\n\nimport { mergeCart } from '../operations/mergeCart.js'\n\ntype Args = {\n cartItemMatcher?: MergeCartArgs['cartItemMatcher']\n cartsSlug: CollectionSlug\n}\n\n/**\n * Creates an endpoint handler for merging a guest cart into the authenticated user's cart.\n * This is used when a guest with an existing cart logs in.\n *\n * Route: POST /api/{cartsSlug}/:id/merge\n *\n * Request body:\n * - sourceCartID: string - The ID of the guest cart to merge from\n * - sourceSecret: string - The secret of the guest cart for verification\n *\n * Requires authentication - the :id in the URL is the target cart which must belong to the user.\n */\nexport const mergeCartEndpoint = ({ cartItemMatcher, cartsSlug }: Args): Endpoint => ({\n handler: async (req) => {\n // This endpoint requires authentication\n if (!req.user) {\n return Response.json({ message: 'Authentication required', success: false }, { status: 401 })\n }\n\n await addDataAndFileToRequest(req)\n\n const targetCartID = req.routeParams?.id as string | undefined\n const data = req.data as {\n sourceCartID?: string\n sourceSecret?: string\n }\n\n if (!targetCartID) {\n return Response.json(\n { message: 'Target cart ID is required', success: false },\n { status: 400 },\n )\n }\n\n if (!data?.sourceCartID) {\n return Response.json(\n { message: 'Source cart ID is required', success: false },\n { status: 400 },\n )\n }\n\n if (!data?.sourceSecret) {\n return Response.json(\n { message: 'Source cart secret is required', success: false },\n { status: 400 },\n )\n }\n\n const result = await mergeCart({\n cartItemMatcher,\n cartsSlug,\n payload: req.payload,\n req,\n sourceCartID: data.sourceCartID,\n sourceSecret: data.sourceSecret,\n targetCartID,\n })\n\n if (!result.success) {\n return Response.json(result, { status: 404 })\n }\n\n return Response.json(result)\n },\n method: 'post',\n path: '/:id/merge',\n})\n"],"names":["addDataAndFileToRequest","mergeCart","mergeCartEndpoint","cartItemMatcher","cartsSlug","handler","req","user","Response","json","message","success","status","targetCartID","routeParams","id","data","sourceCartID","sourceSecret","result","payload","method","path"],"mappings":"AAEA,SAASA,uBAAuB,QAAQ,UAAS;AAIjD,SAASC,SAAS,QAAQ,6BAA4B;AAOtD;;;;;;;;;;;CAWC,GACD,OAAO,MAAMC,oBAAoB,CAAC,EAAEC,eAAe,EAAEC,SAAS,EAAQ,GAAgB,CAAA;QACpFC,SAAS,OAAOC;YACd,wCAAwC;YACxC,IAAI,CAACA,IAAIC,IAAI,EAAE;gBACb,OAAOC,SAASC,IAAI,CAAC;oBAAEC,SAAS;oBAA2BC,SAAS;gBAAM,GAAG;oBAAEC,QAAQ;gBAAI;YAC7F;YAEA,MAAMZ,wBAAwBM;YAE9B,MAAMO,eAAeP,IAAIQ,WAAW,EAAEC;YACtC,MAAMC,OAAOV,IAAIU,IAAI;YAKrB,IAAI,CAACH,cAAc;gBACjB,OAAOL,SAASC,IAAI,CAClB;oBAAEC,SAAS;oBAA8BC,SAAS;gBAAM,GACxD;oBAAEC,QAAQ;gBAAI;YAElB;YAEA,IAAI,CAACI,MAAMC,cAAc;gBACvB,OAAOT,SAASC,IAAI,CAClB;oBAAEC,SAAS;oBAA8BC,SAAS;gBAAM,GACxD;oBAAEC,QAAQ;gBAAI;YAElB;YAEA,IAAI,CAACI,MAAME,cAAc;gBACvB,OAAOV,SAASC,IAAI,CAClB;oBAAEC,SAAS;oBAAkCC,SAAS;gBAAM,GAC5D;oBAAEC,QAAQ;gBAAI;YAElB;YAEA,MAAMO,SAAS,MAAMlB,UAAU;gBAC7BE;gBACAC;gBACAgB,SAASd,IAAIc,OAAO;gBACpBd;gBACAW,cAAcD,KAAKC,YAAY;gBAC/BC,cAAcF,KAAKE,YAAY;gBAC/BL;YACF;YAEA,IAAI,CAACM,OAAOR,OAAO,EAAE;gBACnB,OAAOH,SAASC,IAAI,CAACU,QAAQ;oBAAEP,QAAQ;gBAAI;YAC7C;YAEA,OAAOJ,SAASC,IAAI,CAACU;QACvB;QACAE,QAAQ;QACRC,MAAM;IACR,CAAA,EAAE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"removeItem.d.ts","sourceRoot":"","sources":["../../../../src/collections/carts/endpoints/removeItem.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAMvD,KAAK,IAAI,GAAG;IACV,SAAS,EAAE,cAAc,CAAA;CAC1B,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,kBAAmB,IAAI,KAAG,QAmCvD,CAAA"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { addDataAndFileToRequest } from 'payload';
|
|
2
|
+
import { removeItem } from '../operations/removeItem.js';
|
|
3
|
+
/**
|
|
4
|
+
* Creates an endpoint handler for removing items from a cart.
|
|
5
|
+
*
|
|
6
|
+
* Route: POST /api/{cartsSlug}/:id/remove-item
|
|
7
|
+
*
|
|
8
|
+
* Request body:
|
|
9
|
+
* - itemID: string (the cart item row ID to remove)
|
|
10
|
+
* - secret?: string (for guest cart access)
|
|
11
|
+
*/ export const removeItemEndpoint = ({ cartsSlug })=>({
|
|
12
|
+
handler: async (req)=>{
|
|
13
|
+
await addDataAndFileToRequest(req);
|
|
14
|
+
const cartID = req.routeParams?.id;
|
|
15
|
+
const data = req.data;
|
|
16
|
+
if (!cartID) {
|
|
17
|
+
return Response.json({
|
|
18
|
+
message: 'Cart ID is required',
|
|
19
|
+
success: false
|
|
20
|
+
}, {
|
|
21
|
+
status: 400
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
if (!data?.itemID) {
|
|
25
|
+
return Response.json({
|
|
26
|
+
message: 'Item ID is required',
|
|
27
|
+
success: false
|
|
28
|
+
}, {
|
|
29
|
+
status: 400
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
const result = await removeItem({
|
|
33
|
+
cartID,
|
|
34
|
+
cartsSlug,
|
|
35
|
+
itemID: data.itemID,
|
|
36
|
+
payload: req.payload,
|
|
37
|
+
req,
|
|
38
|
+
secret: data.secret
|
|
39
|
+
});
|
|
40
|
+
if (!result.success) {
|
|
41
|
+
return Response.json(result, {
|
|
42
|
+
status: 404
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return Response.json(result);
|
|
46
|
+
},
|
|
47
|
+
method: 'post',
|
|
48
|
+
path: '/:id/remove-item'
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
//# sourceMappingURL=removeItem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/collections/carts/endpoints/removeItem.ts"],"sourcesContent":["import type { CollectionSlug, Endpoint } from 'payload'\n\nimport { addDataAndFileToRequest } from 'payload'\n\nimport { removeItem } from '../operations/removeItem.js'\n\ntype Args = {\n cartsSlug: CollectionSlug\n}\n\n/**\n * Creates an endpoint handler for removing items from a cart.\n *\n * Route: POST /api/{cartsSlug}/:id/remove-item\n *\n * Request body:\n * - itemID: string (the cart item row ID to remove)\n * - secret?: string (for guest cart access)\n */\nexport const removeItemEndpoint = ({ cartsSlug }: Args): Endpoint => ({\n handler: async (req) => {\n await addDataAndFileToRequest(req)\n\n const cartID = req.routeParams?.id as string | undefined\n const data = req.data as {\n itemID?: string\n secret?: string\n }\n\n if (!cartID) {\n return Response.json({ message: 'Cart ID is required', success: false }, { status: 400 })\n }\n\n if (!data?.itemID) {\n return Response.json({ message: 'Item ID is required', success: false }, { status: 400 })\n }\n\n const result = await removeItem({\n cartID,\n cartsSlug,\n itemID: data.itemID,\n payload: req.payload,\n req,\n secret: data.secret,\n })\n\n if (!result.success) {\n return Response.json(result, { status: 404 })\n }\n\n return Response.json(result)\n },\n method: 'post',\n path: '/:id/remove-item',\n})\n"],"names":["addDataAndFileToRequest","removeItem","removeItemEndpoint","cartsSlug","handler","req","cartID","routeParams","id","data","Response","json","message","success","status","itemID","result","payload","secret","method","path"],"mappings":"AAEA,SAASA,uBAAuB,QAAQ,UAAS;AAEjD,SAASC,UAAU,QAAQ,8BAA6B;AAMxD;;;;;;;;CAQC,GACD,OAAO,MAAMC,qBAAqB,CAAC,EAAEC,SAAS,EAAQ,GAAgB,CAAA;QACpEC,SAAS,OAAOC;YACd,MAAML,wBAAwBK;YAE9B,MAAMC,SAASD,IAAIE,WAAW,EAAEC;YAChC,MAAMC,OAAOJ,IAAII,IAAI;YAKrB,IAAI,CAACH,QAAQ;gBACX,OAAOI,SAASC,IAAI,CAAC;oBAAEC,SAAS;oBAAuBC,SAAS;gBAAM,GAAG;oBAAEC,QAAQ;gBAAI;YACzF;YAEA,IAAI,CAACL,MAAMM,QAAQ;gBACjB,OAAOL,SAASC,IAAI,CAAC;oBAAEC,SAAS;oBAAuBC,SAAS;gBAAM,GAAG;oBAAEC,QAAQ;gBAAI;YACzF;YAEA,MAAME,SAAS,MAAMf,WAAW;gBAC9BK;gBACAH;gBACAY,QAAQN,KAAKM,MAAM;gBACnBE,SAASZ,IAAIY,OAAO;gBACpBZ;gBACAa,QAAQT,KAAKS,MAAM;YACrB;YAEA,IAAI,CAACF,OAAOH,OAAO,EAAE;gBACnB,OAAOH,SAASC,IAAI,CAACK,QAAQ;oBAAEF,QAAQ;gBAAI;YAC7C;YAEA,OAAOJ,SAASC,IAAI,CAACK;QACvB;QACAG,QAAQ;QACRC,MAAM;IACR,CAAA,EAAE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateItem.d.ts","sourceRoot":"","sources":["../../../../src/collections/carts/endpoints/updateItem.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAQvD,KAAK,IAAI,GAAG;IACV,SAAS,EAAE,cAAc,CAAA;CAC1B,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,eAAO,MAAM,kBAAkB,kBAAmB,IAAI,KAAG,QA6DvD,CAAA"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { addDataAndFileToRequest } from 'payload';
|
|
2
|
+
import { updateItem } from '../operations/updateItem.js';
|
|
3
|
+
/**
|
|
4
|
+
* Creates an endpoint handler for updating an item in a cart.
|
|
5
|
+
* Supports MongoDB-style operators for flexible updates.
|
|
6
|
+
*
|
|
7
|
+
* Route: POST /api/{cartsSlug}/:id/update-item
|
|
8
|
+
*
|
|
9
|
+
* Request body:
|
|
10
|
+
* - itemID: string (the cart item row ID to update)
|
|
11
|
+
* - quantity: number | { $inc: number } (set or increment/decrement)
|
|
12
|
+
* - removeOnZero?: boolean (defaults to true, removes item if quantity reaches 0)
|
|
13
|
+
* - secret?: string (for guest cart access)
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* // Set quantity to 5
|
|
18
|
+
* fetch('/api/carts/123/update-item', {
|
|
19
|
+
* method: 'POST',
|
|
20
|
+
* body: JSON.stringify({ itemID: 'item-456', quantity: 5 })
|
|
21
|
+
* })
|
|
22
|
+
*
|
|
23
|
+
* // Increment by 1
|
|
24
|
+
* fetch('/api/carts/123/update-item', {
|
|
25
|
+
* method: 'POST',
|
|
26
|
+
* body: JSON.stringify({ itemID: 'item-456', quantity: { $inc: 1 } })
|
|
27
|
+
* })
|
|
28
|
+
*
|
|
29
|
+
* // Decrement by 1
|
|
30
|
+
* fetch('/api/carts/123/update-item', {
|
|
31
|
+
* method: 'POST',
|
|
32
|
+
* body: JSON.stringify({ itemID: 'item-456', quantity: { $inc: -1 } })
|
|
33
|
+
* })
|
|
34
|
+
* ```
|
|
35
|
+
*/ export const updateItemEndpoint = ({ cartsSlug })=>({
|
|
36
|
+
handler: async (req)=>{
|
|
37
|
+
await addDataAndFileToRequest(req);
|
|
38
|
+
const cartID = req.routeParams?.id;
|
|
39
|
+
const data = req.data;
|
|
40
|
+
if (!cartID) {
|
|
41
|
+
return Response.json({
|
|
42
|
+
message: 'Cart ID is required',
|
|
43
|
+
success: false
|
|
44
|
+
}, {
|
|
45
|
+
status: 400
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
if (!data?.itemID) {
|
|
49
|
+
return Response.json({
|
|
50
|
+
message: 'Item ID is required',
|
|
51
|
+
success: false
|
|
52
|
+
}, {
|
|
53
|
+
status: 400
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
if (data?.quantity === undefined) {
|
|
57
|
+
return Response.json({
|
|
58
|
+
message: 'Quantity is required',
|
|
59
|
+
success: false
|
|
60
|
+
}, {
|
|
61
|
+
status: 400
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
// Validate quantity format
|
|
65
|
+
const isValidQuantity = typeof data.quantity === 'number' || typeof data.quantity === 'object' && data.quantity !== null && '$inc' in data.quantity && typeof data.quantity.$inc === 'number';
|
|
66
|
+
if (!isValidQuantity) {
|
|
67
|
+
return Response.json({
|
|
68
|
+
message: 'Quantity must be a number or { $inc: number }',
|
|
69
|
+
success: false
|
|
70
|
+
}, {
|
|
71
|
+
status: 400
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
const result = await updateItem({
|
|
75
|
+
cartID,
|
|
76
|
+
cartsSlug,
|
|
77
|
+
itemID: data.itemID,
|
|
78
|
+
payload: req.payload,
|
|
79
|
+
quantity: data.quantity,
|
|
80
|
+
removeOnZero: data.removeOnZero,
|
|
81
|
+
req,
|
|
82
|
+
secret: data.secret
|
|
83
|
+
});
|
|
84
|
+
if (!result.success) {
|
|
85
|
+
return Response.json(result, {
|
|
86
|
+
status: 404
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
return Response.json(result);
|
|
90
|
+
},
|
|
91
|
+
method: 'post',
|
|
92
|
+
path: '/:id/update-item'
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
//# sourceMappingURL=updateItem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/collections/carts/endpoints/updateItem.ts"],"sourcesContent":["import type { CollectionSlug, Endpoint } from 'payload'\n\nimport { addDataAndFileToRequest } from 'payload'\n\nimport type { FieldWithOperator } from '../operations/types.js'\n\nimport { updateItem } from '../operations/updateItem.js'\n\ntype Args = {\n cartsSlug: CollectionSlug\n}\n\n/**\n * Creates an endpoint handler for updating an item in a cart.\n * Supports MongoDB-style operators for flexible updates.\n *\n * Route: POST /api/{cartsSlug}/:id/update-item\n *\n * Request body:\n * - itemID: string (the cart item row ID to update)\n * - quantity: number | { $inc: number } (set or increment/decrement)\n * - removeOnZero?: boolean (defaults to true, removes item if quantity reaches 0)\n * - secret?: string (for guest cart access)\n *\n * @example\n * ```ts\n * // Set quantity to 5\n * fetch('/api/carts/123/update-item', {\n * method: 'POST',\n * body: JSON.stringify({ itemID: 'item-456', quantity: 5 })\n * })\n *\n * // Increment by 1\n * fetch('/api/carts/123/update-item', {\n * method: 'POST',\n * body: JSON.stringify({ itemID: 'item-456', quantity: { $inc: 1 } })\n * })\n *\n * // Decrement by 1\n * fetch('/api/carts/123/update-item', {\n * method: 'POST',\n * body: JSON.stringify({ itemID: 'item-456', quantity: { $inc: -1 } })\n * })\n * ```\n */\nexport const updateItemEndpoint = ({ cartsSlug }: Args): Endpoint => ({\n handler: async (req) => {\n await addDataAndFileToRequest(req)\n\n const cartID = req.routeParams?.id as string | undefined\n const data = req.data as {\n itemID?: string\n quantity?: FieldWithOperator<number>\n removeOnZero?: boolean\n secret?: string\n }\n\n if (!cartID) {\n return Response.json({ message: 'Cart ID is required', success: false }, { status: 400 })\n }\n\n if (!data?.itemID) {\n return Response.json({ message: 'Item ID is required', success: false }, { status: 400 })\n }\n\n if (data?.quantity === undefined) {\n return Response.json({ message: 'Quantity is required', success: false }, { status: 400 })\n }\n\n // Validate quantity format\n const isValidQuantity =\n typeof data.quantity === 'number' ||\n (typeof data.quantity === 'object' &&\n data.quantity !== null &&\n '$inc' in data.quantity &&\n typeof data.quantity.$inc === 'number')\n\n if (!isValidQuantity) {\n return Response.json(\n {\n message: 'Quantity must be a number or { $inc: number }',\n success: false,\n },\n { status: 400 },\n )\n }\n\n const result = await updateItem({\n cartID,\n cartsSlug,\n itemID: data.itemID,\n payload: req.payload,\n quantity: data.quantity,\n removeOnZero: data.removeOnZero,\n req,\n secret: data.secret,\n })\n\n if (!result.success) {\n return Response.json(result, { status: 404 })\n }\n\n return Response.json(result)\n },\n method: 'post',\n path: '/:id/update-item',\n})\n"],"names":["addDataAndFileToRequest","updateItem","updateItemEndpoint","cartsSlug","handler","req","cartID","routeParams","id","data","Response","json","message","success","status","itemID","quantity","undefined","isValidQuantity","$inc","result","payload","removeOnZero","secret","method","path"],"mappings":"AAEA,SAASA,uBAAuB,QAAQ,UAAS;AAIjD,SAASC,UAAU,QAAQ,8BAA6B;AAMxD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCC,GACD,OAAO,MAAMC,qBAAqB,CAAC,EAAEC,SAAS,EAAQ,GAAgB,CAAA;QACpEC,SAAS,OAAOC;YACd,MAAML,wBAAwBK;YAE9B,MAAMC,SAASD,IAAIE,WAAW,EAAEC;YAChC,MAAMC,OAAOJ,IAAII,IAAI;YAOrB,IAAI,CAACH,QAAQ;gBACX,OAAOI,SAASC,IAAI,CAAC;oBAAEC,SAAS;oBAAuBC,SAAS;gBAAM,GAAG;oBAAEC,QAAQ;gBAAI;YACzF;YAEA,IAAI,CAACL,MAAMM,QAAQ;gBACjB,OAAOL,SAASC,IAAI,CAAC;oBAAEC,SAAS;oBAAuBC,SAAS;gBAAM,GAAG;oBAAEC,QAAQ;gBAAI;YACzF;YAEA,IAAIL,MAAMO,aAAaC,WAAW;gBAChC,OAAOP,SAASC,IAAI,CAAC;oBAAEC,SAAS;oBAAwBC,SAAS;gBAAM,GAAG;oBAAEC,QAAQ;gBAAI;YAC1F;YAEA,2BAA2B;YAC3B,MAAMI,kBACJ,OAAOT,KAAKO,QAAQ,KAAK,YACxB,OAAOP,KAAKO,QAAQ,KAAK,YACxBP,KAAKO,QAAQ,KAAK,QAClB,UAAUP,KAAKO,QAAQ,IACvB,OAAOP,KAAKO,QAAQ,CAACG,IAAI,KAAK;YAElC,IAAI,CAACD,iBAAiB;gBACpB,OAAOR,SAASC,IAAI,CAClB;oBACEC,SAAS;oBACTC,SAAS;gBACX,GACA;oBAAEC,QAAQ;gBAAI;YAElB;YAEA,MAAMM,SAAS,MAAMnB,WAAW;gBAC9BK;gBACAH;gBACAY,QAAQN,KAAKM,MAAM;gBACnBM,SAAShB,IAAIgB,OAAO;gBACpBL,UAAUP,KAAKO,QAAQ;gBACvBM,cAAcb,KAAKa,YAAY;gBAC/BjB;gBACAkB,QAAQd,KAAKc,MAAM;YACrB;YAEA,IAAI,CAACH,OAAOP,OAAO,EAAE;gBACnB,OAAOH,SAASC,IAAI,CAACS,QAAQ;oBAAEN,QAAQ;gBAAI;YAC7C;YAEA,OAAOJ,SAASC,IAAI,CAACS;QACvB;QACAI,QAAQ;QACRC,MAAM;IACR,CAAA,EAAE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hasCartSecretAccess.d.ts","sourceRoot":"","sources":["../../../src/collections/carts/hasCartSecretAccess.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAErC;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,oBAAqB,OAAO,KAAG,MAkB9D,CAAA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal access function for guest cart access via secret in context or queries.
|
|
3
|
+
* Only active when allowGuestCarts is enabled.
|
|
4
|
+
*
|
|
5
|
+
* @param allowGuestCarts - Whether guest cart access is enabled
|
|
6
|
+
* @returns Access function that checks for valid cart secret in context
|
|
7
|
+
*/ export const hasCartSecretAccess = (allowGuestCarts)=>{
|
|
8
|
+
return ({ req })=>{
|
|
9
|
+
if (!allowGuestCarts) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
const cartSecret = req.context?.cartSecret ?? req.query?.secret;
|
|
13
|
+
if (!cartSecret || typeof cartSecret !== 'string') {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
return {
|
|
17
|
+
secret: {
|
|
18
|
+
equals: cartSecret
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=hasCartSecretAccess.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/collections/carts/hasCartSecretAccess.ts"],"sourcesContent":["import type { Access } from 'payload'\n\n/**\n * Internal access function for guest cart access via secret in context or queries.\n * Only active when allowGuestCarts is enabled.\n *\n * @param allowGuestCarts - Whether guest cart access is enabled\n * @returns Access function that checks for valid cart secret in context\n */\nexport const hasCartSecretAccess = (allowGuestCarts: boolean): Access => {\n return ({ req }) => {\n if (!allowGuestCarts) {\n return false\n }\n\n const cartSecret = req.context?.cartSecret ?? req.query?.secret\n\n if (!cartSecret || typeof cartSecret !== 'string') {\n return false\n }\n\n return {\n secret: {\n equals: cartSecret,\n },\n }\n }\n}\n"],"names":["hasCartSecretAccess","allowGuestCarts","req","cartSecret","context","query","secret","equals"],"mappings":"AAEA;;;;;;CAMC,GACD,OAAO,MAAMA,sBAAsB,CAACC;IAClC,OAAO,CAAC,EAAEC,GAAG,EAAE;QACb,IAAI,CAACD,iBAAiB;YACpB,OAAO;QACT;QAEA,MAAME,aAAaD,IAAIE,OAAO,EAAED,cAAcD,IAAIG,KAAK,EAAEC;QAEzD,IAAI,CAACH,cAAc,OAAOA,eAAe,UAAU;YACjD,OAAO;QACT;QAEA,OAAO;YACLG,QAAQ;gBACNC,QAAQJ;YACV;QACF;IACF;AACF,EAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addItem.d.ts","sourceRoot":"","sources":["../../../../src/collections/carts/operations/addItem.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAgB,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAKhF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,OAAO,SAAgB,WAAW,KAAG,OAAO,CAAC,mBAAmB,CA8E5E,CAAA"}
|