@payloadcms/plugin-ecommerce 3.67.0-internal.87c53da → 3.68.0-internal-debug.56c9b68

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/dist/collections/addresses/createAddressesCollection.d.ts +1 -5
  2. package/dist/collections/addresses/createAddressesCollection.d.ts.map +1 -1
  3. package/dist/collections/addresses/createAddressesCollection.js +7 -6
  4. package/dist/collections/addresses/createAddressesCollection.js.map +1 -1
  5. package/dist/collections/carts/beforeChange.d.ts.map +1 -1
  6. package/dist/collections/carts/beforeChange.js +13 -1
  7. package/dist/collections/carts/beforeChange.js.map +1 -1
  8. package/dist/collections/carts/createCartsCollection.d.ts +6 -4
  9. package/dist/collections/carts/createCartsCollection.d.ts.map +1 -1
  10. package/dist/collections/carts/createCartsCollection.js +36 -5
  11. package/dist/collections/carts/createCartsCollection.js.map +1 -1
  12. package/dist/collections/carts/hasCartSecretAccess.d.ts +10 -0
  13. package/dist/collections/carts/hasCartSecretAccess.d.ts.map +1 -0
  14. package/dist/collections/carts/hasCartSecretAccess.js +24 -0
  15. package/dist/collections/carts/hasCartSecretAccess.js.map +1 -0
  16. package/dist/collections/orders/createOrdersCollection.d.ts +1 -5
  17. package/dist/collections/orders/createOrdersCollection.d.ts.map +1 -1
  18. package/dist/collections/orders/createOrdersCollection.js +9 -8
  19. package/dist/collections/orders/createOrdersCollection.js.map +1 -1
  20. package/dist/collections/products/createProductsCollection.d.ts +1 -4
  21. package/dist/collections/products/createProductsCollection.d.ts.map +1 -1
  22. package/dist/collections/products/createProductsCollection.js +5 -5
  23. package/dist/collections/products/createProductsCollection.js.map +1 -1
  24. package/dist/collections/transactions/createTransactionsCollection.d.ts +1 -3
  25. package/dist/collections/transactions/createTransactionsCollection.d.ts.map +1 -1
  26. package/dist/collections/transactions/createTransactionsCollection.js +5 -5
  27. package/dist/collections/transactions/createTransactionsCollection.js.map +1 -1
  28. package/dist/collections/variants/createVariantOptionsCollection.d.ts +1 -4
  29. package/dist/collections/variants/createVariantOptionsCollection.d.ts.map +1 -1
  30. package/dist/collections/variants/createVariantOptionsCollection.js +5 -5
  31. package/dist/collections/variants/createVariantOptionsCollection.js.map +1 -1
  32. package/dist/collections/variants/createVariantTypesCollection.d.ts +1 -4
  33. package/dist/collections/variants/createVariantTypesCollection.d.ts.map +1 -1
  34. package/dist/collections/variants/createVariantTypesCollection.js +5 -5
  35. package/dist/collections/variants/createVariantTypesCollection.js.map +1 -1
  36. package/dist/collections/variants/createVariantsCollection/index.d.ts +1 -4
  37. package/dist/collections/variants/createVariantsCollection/index.d.ts.map +1 -1
  38. package/dist/collections/variants/createVariantsCollection/index.js +5 -5
  39. package/dist/collections/variants/createVariantsCollection/index.js.map +1 -1
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +10 -33
  42. package/dist/index.js.map +1 -1
  43. package/dist/react/provider/index.d.ts +3 -0
  44. package/dist/react/provider/index.d.ts.map +1 -1
  45. package/dist/react/provider/index.js +261 -156
  46. package/dist/react/provider/index.js.map +1 -1
  47. package/dist/translations/en.d.ts.map +1 -1
  48. package/dist/translations/en.js +1 -0
  49. package/dist/translations/en.js.map +1 -1
  50. package/dist/types/index.d.ts +43 -25
  51. package/dist/types/index.d.ts.map +1 -1
  52. package/dist/types/index.js.map +1 -1
  53. package/dist/utilities/accessComposition.d.ts +55 -0
  54. package/dist/utilities/accessComposition.d.ts.map +1 -0
  55. package/dist/utilities/accessComposition.js +103 -0
  56. package/dist/utilities/accessComposition.js.map +1 -0
  57. package/dist/utilities/accessComposition.spec.js +803 -0
  58. package/dist/utilities/accessComposition.spec.js.map +1 -0
  59. package/dist/utilities/defaultProductsValidation.spec.js +383 -0
  60. package/dist/utilities/defaultProductsValidation.spec.js.map +1 -0
  61. package/dist/utilities/getCollectionSlugMap.spec.js +159 -0
  62. package/dist/utilities/getCollectionSlugMap.spec.js.map +1 -0
  63. package/dist/utilities/sanitizePluginConfig.d.ts.map +1 -1
  64. package/dist/utilities/sanitizePluginConfig.js +10 -2
  65. package/dist/utilities/sanitizePluginConfig.js.map +1 -1
  66. package/dist/utilities/sanitizePluginConfig.spec.js +515 -0
  67. package/dist/utilities/sanitizePluginConfig.spec.js.map +1 -0
  68. package/package.json +8 -7
@@ -1,11 +1,7 @@
1
1
  import type { CollectionConfig, Field } from 'payload';
2
2
  import type { AccessConfig, CountryType } from '../../types/index.js';
3
3
  type Props = {
4
- access: {
5
- adminOrCustomerOwner: AccessConfig['adminOrCustomerOwner'];
6
- authenticatedOnly: NonNullable<AccessConfig['authenticatedOnly']>;
7
- customerOnlyFieldAccess: AccessConfig['customerOnlyFieldAccess'];
8
- };
4
+ access: Pick<AccessConfig, 'customerOnlyFieldAccess' | 'isAdmin' | 'isAuthenticated' | 'isDocumentOwner'>;
9
5
  /**
10
6
  * Array of fields used for capturing the address data. Use this over overrides to customise the fields here as it's reused across the plugin.
11
7
  */
@@ -1 +1 @@
1
- {"version":3,"file":"createAddressesCollection.d.ts","sourceRoot":"","sources":["../../../src/collections/addresses/createAddressesCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEtD,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAKrE,KAAK,KAAK,GAAG;IACX,MAAM,EAAE;QACN,oBAAoB,EAAE,YAAY,CAAC,sBAAsB,CAAC,CAAA;QAC1D,iBAAiB,EAAE,WAAW,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC,CAAA;QACjE,uBAAuB,EAAE,YAAY,CAAC,yBAAyB,CAAC,CAAA;KACjE,CAAA;IACD;;OAEG;IACH,aAAa,EAAE,KAAK,EAAE,CAAA;IACtB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,kBAAkB,CAAC,EAAE,WAAW,EAAE,CAAA;CACnC,CAAA;AAED,eAAO,MAAM,yBAAyB,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,gBA6EzD,CAAA"}
1
+ {"version":3,"file":"createAddressesCollection.d.ts","sourceRoot":"","sources":["../../../src/collections/addresses/createAddressesCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEtD,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAMrE,KAAK,KAAK,GAAG;IACX,MAAM,EAAE,IAAI,CACV,YAAY,EACZ,yBAAyB,GAAG,SAAS,GAAG,iBAAiB,GAAG,iBAAiB,CAC9E,CAAA;IACD;;OAEG;IACH,aAAa,EAAE,KAAK,EAAE,CAAA;IACtB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,kBAAkB,CAAC,EAAE,WAAW,EAAE,CAAA;CACnC,CAAA;AAED,eAAO,MAAM,yBAAyB,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,gBAyEzD,CAAA"}
@@ -1,7 +1,8 @@
1
+ import { accessOR } from '../../utilities/accessComposition.js';
1
2
  import { defaultCountries } from './defaultCountries.js';
2
3
  import { beforeChange } from './hooks/beforeChange.js';
3
4
  export const createAddressesCollection = (props)=>{
4
- const { access: { adminOrCustomerOwner, authenticatedOnly, customerOnlyFieldAccess }, addressFields, customersSlug = 'users' } = props || {};
5
+ const { access, addressFields, customersSlug = 'users' } = props || {};
5
6
  const { supportedCountries: supportedCountriesFromProps } = props || {};
6
7
  const supportedCountries = supportedCountriesFromProps || defaultCountries;
7
8
  const hasOnlyOneCountry = supportedCountries && supportedCountries.length === 1;
@@ -36,10 +37,10 @@ export const createAddressesCollection = (props)=>{
36
37
  const baseConfig = {
37
38
  slug: 'addresses',
38
39
  access: {
39
- create: authenticatedOnly,
40
- delete: adminOrCustomerOwner,
41
- read: adminOrCustomerOwner,
42
- update: adminOrCustomerOwner
40
+ create: access.isAuthenticated,
41
+ delete: accessOR(access.isAdmin, access.isDocumentOwner),
42
+ read: accessOR(access.isAdmin, access.isDocumentOwner),
43
+ update: accessOR(access.isAdmin, access.isDocumentOwner)
43
44
  },
44
45
  admin: {
45
46
  description: ({ t })=>// @ts-expect-error - translations are not typed in plugins yet
@@ -52,7 +53,7 @@ export const createAddressesCollection = (props)=>{
52
53
  hooks: {
53
54
  beforeChange: [
54
55
  beforeChange({
55
- customerOnlyFieldAccess
56
+ customerOnlyFieldAccess: access.customerOnlyFieldAccess
56
57
  })
57
58
  ]
58
59
  },
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/collections/addresses/createAddressesCollection.ts"],"sourcesContent":["import type { CollectionConfig, Field } from 'payload'\n\nimport type { AccessConfig, CountryType } from '../../types/index.js'\n\nimport { defaultCountries } from './defaultCountries.js'\nimport { beforeChange } from './hooks/beforeChange.js'\n\ntype Props = {\n access: {\n adminOrCustomerOwner: AccessConfig['adminOrCustomerOwner']\n authenticatedOnly: NonNullable<AccessConfig['authenticatedOnly']>\n customerOnlyFieldAccess: AccessConfig['customerOnlyFieldAccess']\n }\n /**\n * Array of fields used for capturing the address data. Use this over overrides to customise the fields here as it's reused across the plugin.\n */\n addressFields: Field[]\n /**\n * Slug of the customers collection, defaults to 'users'.\n */\n customersSlug?: string\n supportedCountries?: CountryType[]\n}\n\nexport const createAddressesCollection: (props: Props) => CollectionConfig = (props) => {\n const {\n access: { adminOrCustomerOwner, authenticatedOnly, customerOnlyFieldAccess },\n addressFields,\n customersSlug = 'users',\n } = props || {}\n\n const { supportedCountries: supportedCountriesFromProps } = props || {}\n const supportedCountries = supportedCountriesFromProps || defaultCountries\n const hasOnlyOneCountry = supportedCountries && supportedCountries.length === 1\n\n const fields: Field[] = [\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 ...addressFields.map((field) => {\n if ('name' in field && field.name === 'country') {\n return {\n name: 'country',\n type: 'select',\n label: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:addressCountry'),\n options: supportedCountries || defaultCountries,\n required: true,\n ...(supportedCountries && supportedCountries?.[0] && hasOnlyOneCountry\n ? {\n defaultValue: supportedCountries?.[0].value,\n }\n : {}),\n } as Field\n }\n\n return field\n }),\n ]\n\n const baseConfig: CollectionConfig = {\n slug: 'addresses',\n access: {\n create: authenticatedOnly,\n delete: adminOrCustomerOwner,\n read: adminOrCustomerOwner,\n update: adminOrCustomerOwner,\n },\n admin: {\n description: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:addressesCollectionDescription'),\n group: 'Ecommerce',\n hidden: true,\n useAsTitle: 'createdAt',\n },\n fields,\n hooks: {\n beforeChange: [beforeChange({ customerOnlyFieldAccess })],\n },\n labels: {\n plural: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:addresses'),\n singular: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:address'),\n },\n timestamps: true,\n }\n\n return { ...baseConfig }\n}\n"],"names":["defaultCountries","beforeChange","createAddressesCollection","props","access","adminOrCustomerOwner","authenticatedOnly","customerOnlyFieldAccess","addressFields","customersSlug","supportedCountries","supportedCountriesFromProps","hasOnlyOneCountry","length","fields","name","type","admin","position","label","t","relationTo","map","field","options","required","defaultValue","value","baseConfig","slug","create","delete","read","update","description","group","hidden","useAsTitle","hooks","labels","plural","singular","timestamps"],"mappings":"AAIA,SAASA,gBAAgB,QAAQ,wBAAuB;AACxD,SAASC,YAAY,QAAQ,0BAAyB;AAmBtD,OAAO,MAAMC,4BAAgE,CAACC;IAC5E,MAAM,EACJC,QAAQ,EAAEC,oBAAoB,EAAEC,iBAAiB,EAAEC,uBAAuB,EAAE,EAC5EC,aAAa,EACbC,gBAAgB,OAAO,EACxB,GAAGN,SAAS,CAAC;IAEd,MAAM,EAAEO,oBAAoBC,2BAA2B,EAAE,GAAGR,SAAS,CAAC;IACtE,MAAMO,qBAAqBC,+BAA+BX;IAC1D,MAAMY,oBAAoBF,sBAAsBA,mBAAmBG,MAAM,KAAK;IAE9E,MAAMC,SAAkB;QACtB;YACEC,MAAM;YACNC,MAAM;YACNC,OAAO;gBACLC,UAAU;YACZ;YACAC,OAAO,CAAC,EAAEC,CAAC,EAAE,GACX,+DAA+D;gBAC/DA,EAAE;YACJC,YAAYZ;QACd;WACGD,cAAcc,GAAG,CAAC,CAACC;YACpB,IAAI,UAAUA,SAASA,MAAMR,IAAI,KAAK,WAAW;gBAC/C,OAAO;oBACLA,MAAM;oBACNC,MAAM;oBACNG,OAAO,CAAC,EAAEC,CAAC,EAAE,GACX,+DAA+D;wBAC/DA,EAAE;oBACJI,SAASd,sBAAsBV;oBAC/ByB,UAAU;oBACV,GAAIf,sBAAsBA,oBAAoB,CAAC,EAAE,IAAIE,oBACjD;wBACEc,cAAchB,oBAAoB,CAAC,EAAE,CAACiB;oBACxC,IACA,CAAC,CAAC;gBACR;YACF;YAEA,OAAOJ;QACT;KACD;IAED,MAAMK,aAA+B;QACnCC,MAAM;QACNzB,QAAQ;YACN0B,QAAQxB;YACRyB,QAAQ1B;YACR2B,MAAM3B;YACN4B,QAAQ5B;QACV;QACAY,OAAO;YACLiB,aAAa,CAAC,EAAEd,CAAC,EAAE,GACjB,+DAA+D;gBAC/DA,EAAE;YACJe,OAAO;YACPC,QAAQ;YACRC,YAAY;QACd;QACAvB;QACAwB,OAAO;YACLrC,cAAc;gBAACA,aAAa;oBAAEM;gBAAwB;aAAG;QAC3D;QACAgC,QAAQ;YACNC,QAAQ,CAAC,EAAEpB,CAAC,EAAE,GACZ,+DAA+D;gBAC/DA,EAAE;YACJqB,UAAU,CAAC,EAAErB,CAAC,EAAE,GACd,+DAA+D;gBAC/DA,EAAE;QACN;QACAsB,YAAY;IACd;IAEA,OAAO;QAAE,GAAGd,UAAU;IAAC;AACzB,EAAC"}
1
+ {"version":3,"sources":["../../../src/collections/addresses/createAddressesCollection.ts"],"sourcesContent":["import type { CollectionConfig, Field } from 'payload'\n\nimport type { AccessConfig, CountryType } from '../../types/index.js'\n\nimport { accessOR } from '../../utilities/accessComposition.js'\nimport { defaultCountries } from './defaultCountries.js'\nimport { beforeChange } from './hooks/beforeChange.js'\n\ntype Props = {\n access: Pick<\n AccessConfig,\n 'customerOnlyFieldAccess' | 'isAdmin' | 'isAuthenticated' | 'isDocumentOwner'\n >\n /**\n * Array of fields used for capturing the address data. Use this over overrides to customise the fields here as it's reused across the plugin.\n */\n addressFields: Field[]\n /**\n * Slug of the customers collection, defaults to 'users'.\n */\n customersSlug?: string\n supportedCountries?: CountryType[]\n}\n\nexport const createAddressesCollection: (props: Props) => CollectionConfig = (props) => {\n const { access, addressFields, customersSlug = 'users' } = props || {}\n\n const { supportedCountries: supportedCountriesFromProps } = props || {}\n const supportedCountries = supportedCountriesFromProps || defaultCountries\n const hasOnlyOneCountry = supportedCountries && supportedCountries.length === 1\n\n const fields: Field[] = [\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 ...addressFields.map((field) => {\n if ('name' in field && field.name === 'country') {\n return {\n name: 'country',\n type: 'select',\n label: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:addressCountry'),\n options: supportedCountries || defaultCountries,\n required: true,\n ...(supportedCountries && supportedCountries?.[0] && hasOnlyOneCountry\n ? {\n defaultValue: supportedCountries?.[0].value,\n }\n : {}),\n } as Field\n }\n\n return field\n }),\n ]\n\n const baseConfig: CollectionConfig = {\n slug: 'addresses',\n access: {\n create: access.isAuthenticated,\n delete: accessOR(access.isAdmin, access.isDocumentOwner),\n read: accessOR(access.isAdmin, access.isDocumentOwner),\n update: accessOR(access.isAdmin, access.isDocumentOwner),\n },\n admin: {\n description: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:addressesCollectionDescription'),\n group: 'Ecommerce',\n hidden: true,\n useAsTitle: 'createdAt',\n },\n fields,\n hooks: {\n beforeChange: [beforeChange({ customerOnlyFieldAccess: access.customerOnlyFieldAccess })],\n },\n labels: {\n plural: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:addresses'),\n singular: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:address'),\n },\n timestamps: true,\n }\n\n return { ...baseConfig }\n}\n"],"names":["accessOR","defaultCountries","beforeChange","createAddressesCollection","props","access","addressFields","customersSlug","supportedCountries","supportedCountriesFromProps","hasOnlyOneCountry","length","fields","name","type","admin","position","label","t","relationTo","map","field","options","required","defaultValue","value","baseConfig","slug","create","isAuthenticated","delete","isAdmin","isDocumentOwner","read","update","description","group","hidden","useAsTitle","hooks","customerOnlyFieldAccess","labels","plural","singular","timestamps"],"mappings":"AAIA,SAASA,QAAQ,QAAQ,uCAAsC;AAC/D,SAASC,gBAAgB,QAAQ,wBAAuB;AACxD,SAASC,YAAY,QAAQ,0BAAyB;AAkBtD,OAAO,MAAMC,4BAAgE,CAACC;IAC5E,MAAM,EAAEC,MAAM,EAAEC,aAAa,EAAEC,gBAAgB,OAAO,EAAE,GAAGH,SAAS,CAAC;IAErE,MAAM,EAAEI,oBAAoBC,2BAA2B,EAAE,GAAGL,SAAS,CAAC;IACtE,MAAMI,qBAAqBC,+BAA+BR;IAC1D,MAAMS,oBAAoBF,sBAAsBA,mBAAmBG,MAAM,KAAK;IAE9E,MAAMC,SAAkB;QACtB;YACEC,MAAM;YACNC,MAAM;YACNC,OAAO;gBACLC,UAAU;YACZ;YACAC,OAAO,CAAC,EAAEC,CAAC,EAAE,GACX,+DAA+D;gBAC/DA,EAAE;YACJC,YAAYZ;QACd;WACGD,cAAcc,GAAG,CAAC,CAACC;YACpB,IAAI,UAAUA,SAASA,MAAMR,IAAI,KAAK,WAAW;gBAC/C,OAAO;oBACLA,MAAM;oBACNC,MAAM;oBACNG,OAAO,CAAC,EAAEC,CAAC,EAAE,GACX,+DAA+D;wBAC/DA,EAAE;oBACJI,SAASd,sBAAsBP;oBAC/BsB,UAAU;oBACV,GAAIf,sBAAsBA,oBAAoB,CAAC,EAAE,IAAIE,oBACjD;wBACEc,cAAchB,oBAAoB,CAAC,EAAE,CAACiB;oBACxC,IACA,CAAC,CAAC;gBACR;YACF;YAEA,OAAOJ;QACT;KACD;IAED,MAAMK,aAA+B;QACnCC,MAAM;QACNtB,QAAQ;YACNuB,QAAQvB,OAAOwB,eAAe;YAC9BC,QAAQ9B,SAASK,OAAO0B,OAAO,EAAE1B,OAAO2B,eAAe;YACvDC,MAAMjC,SAASK,OAAO0B,OAAO,EAAE1B,OAAO2B,eAAe;YACrDE,QAAQlC,SAASK,OAAO0B,OAAO,EAAE1B,OAAO2B,eAAe;QACzD;QACAjB,OAAO;YACLoB,aAAa,CAAC,EAAEjB,CAAC,EAAE,GACjB,+DAA+D;gBAC/DA,EAAE;YACJkB,OAAO;YACPC,QAAQ;YACRC,YAAY;QACd;QACA1B;QACA2B,OAAO;YACLrC,cAAc;gBAACA,aAAa;oBAAEsC,yBAAyBnC,OAAOmC,uBAAuB;gBAAC;aAAG;QAC3F;QACAC,QAAQ;YACNC,QAAQ,CAAC,EAAExB,CAAC,EAAE,GACZ,+DAA+D;gBAC/DA,EAAE;YACJyB,UAAU,CAAC,EAAEzB,CAAC,EAAE,GACd,+DAA+D;gBAC/DA,EAAE;QACN;QACA0B,YAAY;IACd;IAEA,OAAO;QAAE,GAAGlB,UAAU;IAAC;AACzB,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"beforeChange.d.ts","sourceRoot":"","sources":["../../../src/collections/carts/beforeChange.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAA;AAEzD,KAAK,KAAK,GAAG;IACX,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,eAAO,MAAM,gBAAgB,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,0BA2C7C,CAAA"}
1
+ {"version":3,"file":"beforeChange.d.ts","sourceRoot":"","sources":["../../../src/collections/carts/beforeChange.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAA;AAIzD,KAAK,KAAK,GAAG;IACX,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,eAAO,MAAM,gBAAgB,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,0BAsD7C,CAAA"}
@@ -1,4 +1,16 @@
1
- export const beforeChangeCart = ({ productsSlug, variantsSlug })=>async ({ data, req })=>{
1
+ import crypto from 'crypto';
2
+ export const beforeChangeCart = ({ productsSlug, variantsSlug })=>async ({ data, operation, req })=>{
3
+ // Generate a secret for guest cart access on creation
4
+ if (operation === 'create' && !data.customer && !data.secret) {
5
+ // Generate a cryptographically secure random string
6
+ const secret = crypto.randomBytes(20).toString('hex');
7
+ data.secret = secret;
8
+ // Store in context so afterRead hook can include it in the creation response
9
+ if (!req.context) {
10
+ req.context = {};
11
+ }
12
+ req.context.newCartSecret = secret;
13
+ }
2
14
  // Update subtotal based on items in the cart
3
15
  if (data.items && Array.isArray(data.items)) {
4
16
  const priceField = `priceIn${data.currency}`;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/collections/carts/beforeChange.ts"],"sourcesContent":["import type { CollectionBeforeChangeHook } from 'payload'\n\ntype Props = {\n productsSlug: string\n variantsSlug: string\n}\n\nexport const beforeChangeCart: (args: Props) => CollectionBeforeChangeHook =\n ({ productsSlug, variantsSlug }) =>\n async ({ data, req }) => {\n // Update subtotal based on items in the cart\n if (data.items && Array.isArray(data.items)) {\n const priceField = `priceIn${data.currency}`\n\n let subtotal = 0\n\n for (const item of data.items) {\n if (item.variant) {\n const id = typeof item.variant === 'object' ? item.variant.id : item.variant\n\n const variant = await req.payload.findByID({\n id,\n collection: variantsSlug,\n depth: 0,\n select: {\n [priceField]: true,\n },\n })\n\n subtotal += variant[priceField] * item.quantity\n } else {\n const id = typeof item.product === 'object' ? item.product.id : item.product\n\n const product = await req.payload.findByID({\n id,\n collection: productsSlug,\n depth: 0,\n select: {\n [priceField]: true,\n },\n })\n\n subtotal += product[priceField] * item.quantity\n }\n }\n\n data.subtotal = subtotal\n } else {\n data.subtotal = 0\n }\n }\n"],"names":["beforeChangeCart","productsSlug","variantsSlug","data","req","items","Array","isArray","priceField","currency","subtotal","item","variant","id","payload","findByID","collection","depth","select","quantity","product"],"mappings":"AAOA,OAAO,MAAMA,mBACX,CAAC,EAAEC,YAAY,EAAEC,YAAY,EAAE,GAC/B,OAAO,EAAEC,IAAI,EAAEC,GAAG,EAAE;QAClB,6CAA6C;QAC7C,IAAID,KAAKE,KAAK,IAAIC,MAAMC,OAAO,CAACJ,KAAKE,KAAK,GAAG;YAC3C,MAAMG,aAAa,CAAC,OAAO,EAAEL,KAAKM,QAAQ,EAAE;YAE5C,IAAIC,WAAW;YAEf,KAAK,MAAMC,QAAQR,KAAKE,KAAK,CAAE;gBAC7B,IAAIM,KAAKC,OAAO,EAAE;oBAChB,MAAMC,KAAK,OAAOF,KAAKC,OAAO,KAAK,WAAWD,KAAKC,OAAO,CAACC,EAAE,GAAGF,KAAKC,OAAO;oBAE5E,MAAMA,UAAU,MAAMR,IAAIU,OAAO,CAACC,QAAQ,CAAC;wBACzCF;wBACAG,YAAYd;wBACZe,OAAO;wBACPC,QAAQ;4BACN,CAACV,WAAW,EAAE;wBAChB;oBACF;oBAEAE,YAAYE,OAAO,CAACJ,WAAW,GAAGG,KAAKQ,QAAQ;gBACjD,OAAO;oBACL,MAAMN,KAAK,OAAOF,KAAKS,OAAO,KAAK,WAAWT,KAAKS,OAAO,CAACP,EAAE,GAAGF,KAAKS,OAAO;oBAE5E,MAAMA,UAAU,MAAMhB,IAAIU,OAAO,CAACC,QAAQ,CAAC;wBACzCF;wBACAG,YAAYf;wBACZgB,OAAO;wBACPC,QAAQ;4BACN,CAACV,WAAW,EAAE;wBAChB;oBACF;oBAEAE,YAAYU,OAAO,CAACZ,WAAW,GAAGG,KAAKQ,QAAQ;gBACjD;YACF;YAEAhB,KAAKO,QAAQ,GAAGA;QAClB,OAAO;YACLP,KAAKO,QAAQ,GAAG;QAClB;IACF,EAAC"}
1
+ {"version":3,"sources":["../../../src/collections/carts/beforeChange.ts"],"sourcesContent":["import type { CollectionBeforeChangeHook } from 'payload'\n\nimport crypto from 'crypto'\n\ntype Props = {\n productsSlug: string\n variantsSlug: string\n}\n\nexport const beforeChangeCart: (args: Props) => CollectionBeforeChangeHook =\n ({ productsSlug, variantsSlug }) =>\n async ({ data, operation, req }) => {\n // Generate a secret for guest cart access on creation\n if (operation === 'create' && !data.customer && !data.secret) {\n // Generate a cryptographically secure random string\n const secret = crypto.randomBytes(20).toString('hex')\n data.secret = secret\n\n // Store in context so afterRead hook can include it in the creation response\n if (!req.context) { req.context = {} }\n req.context.newCartSecret = secret\n }\n\n // Update subtotal based on items in the cart\n if (data.items && Array.isArray(data.items)) {\n const priceField = `priceIn${data.currency}`\n\n let subtotal = 0\n\n for (const item of data.items) {\n if (item.variant) {\n const id = typeof item.variant === 'object' ? item.variant.id : item.variant\n\n const variant = await req.payload.findByID({\n id,\n collection: variantsSlug,\n depth: 0,\n select: {\n [priceField]: true,\n },\n })\n\n subtotal += variant[priceField] * item.quantity\n } else {\n const id = typeof item.product === 'object' ? item.product.id : item.product\n\n const product = await req.payload.findByID({\n id,\n collection: productsSlug,\n depth: 0,\n select: {\n [priceField]: true,\n },\n })\n\n subtotal += product[priceField] * item.quantity\n }\n }\n\n data.subtotal = subtotal\n } else {\n data.subtotal = 0\n }\n }\n"],"names":["crypto","beforeChangeCart","productsSlug","variantsSlug","data","operation","req","customer","secret","randomBytes","toString","context","newCartSecret","items","Array","isArray","priceField","currency","subtotal","item","variant","id","payload","findByID","collection","depth","select","quantity","product"],"mappings":"AAEA,OAAOA,YAAY,SAAQ;AAO3B,OAAO,MAAMC,mBACX,CAAC,EAAEC,YAAY,EAAEC,YAAY,EAAE,GAC/B,OAAO,EAAEC,IAAI,EAAEC,SAAS,EAAEC,GAAG,EAAE;QAC7B,sDAAsD;QACtD,IAAID,cAAc,YAAY,CAACD,KAAKG,QAAQ,IAAI,CAACH,KAAKI,MAAM,EAAE;YAC5D,oDAAoD;YACpD,MAAMA,SAASR,OAAOS,WAAW,CAAC,IAAIC,QAAQ,CAAC;YAC/CN,KAAKI,MAAM,GAAGA;YAEd,6EAA6E;YAC7E,IAAI,CAACF,IAAIK,OAAO,EAAE;gBAAEL,IAAIK,OAAO,GAAG,CAAC;YAAE;YACrCL,IAAIK,OAAO,CAACC,aAAa,GAAGJ;QAC9B;QAEA,6CAA6C;QAC7C,IAAIJ,KAAKS,KAAK,IAAIC,MAAMC,OAAO,CAACX,KAAKS,KAAK,GAAG;YAC3C,MAAMG,aAAa,CAAC,OAAO,EAAEZ,KAAKa,QAAQ,EAAE;YAE5C,IAAIC,WAAW;YAEf,KAAK,MAAMC,QAAQf,KAAKS,KAAK,CAAE;gBAC7B,IAAIM,KAAKC,OAAO,EAAE;oBAChB,MAAMC,KAAK,OAAOF,KAAKC,OAAO,KAAK,WAAWD,KAAKC,OAAO,CAACC,EAAE,GAAGF,KAAKC,OAAO;oBAE5E,MAAMA,UAAU,MAAMd,IAAIgB,OAAO,CAACC,QAAQ,CAAC;wBACzCF;wBACAG,YAAYrB;wBACZsB,OAAO;wBACPC,QAAQ;4BACN,CAACV,WAAW,EAAE;wBAChB;oBACF;oBAEAE,YAAYE,OAAO,CAACJ,WAAW,GAAGG,KAAKQ,QAAQ;gBACjD,OAAO;oBACL,MAAMN,KAAK,OAAOF,KAAKS,OAAO,KAAK,WAAWT,KAAKS,OAAO,CAACP,EAAE,GAAGF,KAAKS,OAAO;oBAE5E,MAAMA,UAAU,MAAMtB,IAAIgB,OAAO,CAACC,QAAQ,CAAC;wBACzCF;wBACAG,YAAYtB;wBACZuB,OAAO;wBACPC,QAAQ;4BACN,CAACV,WAAW,EAAE;wBAChB;oBACF;oBAEAE,YAAYU,OAAO,CAACZ,WAAW,GAAGG,KAAKQ,QAAQ;gBACjD;YACF;YAEAvB,KAAKc,QAAQ,GAAGA;QAClB,OAAO;YACLd,KAAKc,QAAQ,GAAG;QAClB;IACF,EAAC"}
@@ -1,10 +1,12 @@
1
1
  import type { CollectionConfig } from 'payload';
2
2
  import type { AccessConfig, CurrenciesConfig } from '../../types/index.js';
3
3
  type Props = {
4
- access: {
5
- adminOrCustomerOwner: NonNullable<AccessConfig['adminOrCustomerOwner']>;
6
- publicAccess: NonNullable<AccessConfig['publicAccess']>;
7
- };
4
+ access: Pick<Required<AccessConfig>, 'isAdmin' | 'isAuthenticated' | 'isDocumentOwner'>;
5
+ /**
6
+ * Allow guest (unauthenticated) users to create carts.
7
+ * Defaults to false.
8
+ */
9
+ allowGuestCarts?: boolean;
8
10
  currenciesConfig?: CurrenciesConfig;
9
11
  /**
10
12
  * Slug of the customers collection, defaults to 'users'.
@@ -1 +1 @@
1
- {"version":3,"file":"createCartsCollection.d.ts","sourceRoot":"","sources":["../../../src/collections/carts/createCartsCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAS,MAAM,SAAS,CAAA;AAEtD,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAQ1E,KAAK,KAAK,GAAG;IACX,MAAM,EAAE;QACN,oBAAoB,EAAE,WAAW,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC,CAAA;QACvE,YAAY,EAAE,WAAW,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAA;KACxD,CAAA;IACD,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,eAAO,MAAM,qBAAqB,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,gBA8IrD,CAAA"}
1
+ {"version":3,"file":"createCartsCollection.d.ts","sourceRoot":"","sources":["../../../src/collections/carts/createCartsCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,gBAAgB,EAAS,MAAM,SAAS,CAAA;AAE9D,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAU1E,KAAK,KAAK,GAAG;IACX,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,GAAG,iBAAiB,GAAG,iBAAiB,CAAC,CAAA;IACvF;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,eAAO,MAAM,qBAAqB,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,gBA0LrD,CAAA"}
@@ -1,10 +1,12 @@
1
1
  import { amountField } from '../../fields/amountField.js';
2
2
  import { cartItemsField } from '../../fields/cartItemsField.js';
3
3
  import { currencyField } from '../../fields/currencyField.js';
4
+ import { accessOR, conditional } from '../../utilities/accessComposition.js';
4
5
  import { beforeChangeCart } from './beforeChange.js';
6
+ import { hasCartSecretAccess } from './hasCartSecretAccess.js';
5
7
  import { statusBeforeRead } from './statusBeforeRead.js';
6
8
  export const createCartsCollection = (props)=>{
7
- const { access: { adminOrCustomerOwner, publicAccess }, currenciesConfig, customersSlug = 'users', enableVariants = false, productsSlug = 'products', variantsSlug = 'variants' } = props || {};
9
+ const { access, allowGuestCarts = false, currenciesConfig, customersSlug = 'users', enableVariants = false, productsSlug = 'products', variantsSlug = 'variants' } = props || {};
8
10
  const fields = [
9
11
  cartItemsField({
10
12
  enableVariants,
@@ -21,6 +23,23 @@ export const createCartsCollection = (props)=>{
21
23
  productsSlug,
22
24
  variantsSlug
23
25
  }),
26
+ {
27
+ name: 'secret',
28
+ type: 'text',
29
+ access: {
30
+ create: ()=>false,
31
+ read: ()=>false,
32
+ update: ()=>false
33
+ },
34
+ admin: {
35
+ hidden: true,
36
+ position: 'sidebar',
37
+ readOnly: true
38
+ },
39
+ index: true,
40
+ label: ({ t })=>// @ts-expect-error - translations are not typed in plugins yet
41
+ t('plugin-ecommerce:cartSecret')
42
+ },
24
43
  {
25
44
  name: 'customer',
26
45
  type: 'relationship',
@@ -98,13 +117,15 @@ export const createCartsCollection = (props)=>{
98
117
  }
99
118
  ] : []
100
119
  ];
120
+ // Internal access function for guest users (unauthenticated)
121
+ const isGuest = ({ req })=>!req.user;
101
122
  const baseConfig = {
102
123
  slug: 'carts',
103
124
  access: {
104
- create: publicAccess,
105
- delete: adminOrCustomerOwner,
106
- read: adminOrCustomerOwner,
107
- update: adminOrCustomerOwner
125
+ create: accessOR(access.isAdmin, access.isAuthenticated, conditional(allowGuestCarts, isGuest)),
126
+ delete: accessOR(access.isAdmin, access.isDocumentOwner, hasCartSecretAccess(allowGuestCarts)),
127
+ read: accessOR(access.isAdmin, access.isDocumentOwner, hasCartSecretAccess(allowGuestCarts)),
128
+ update: accessOR(access.isAdmin, access.isDocumentOwner, hasCartSecretAccess(allowGuestCarts))
108
129
  },
109
130
  admin: {
110
131
  description: ({ t })=>// @ts-expect-error - translations are not typed in plugins yet
@@ -114,6 +135,16 @@ export const createCartsCollection = (props)=>{
114
135
  },
115
136
  fields,
116
137
  hooks: {
138
+ afterRead: [
139
+ ({ doc, req })=>{
140
+ // Include secret only if this was just created (stored in context by beforeChange)
141
+ if (req.context?.newCartSecret) {
142
+ doc.secret = req.context.newCartSecret;
143
+ }
144
+ // Secret is otherwise never exposed (field access is locked)
145
+ return doc;
146
+ }
147
+ ],
117
148
  beforeChange: [
118
149
  // This hook can be used to update the subtotal before saving the cart
119
150
  beforeChangeCart({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/collections/carts/createCartsCollection.ts"],"sourcesContent":["import type { CollectionConfig, Field } from 'payload'\n\nimport type { AccessConfig, CurrenciesConfig } from '../../types/index.js'\n\nimport { amountField } from '../../fields/amountField.js'\nimport { cartItemsField } from '../../fields/cartItemsField.js'\nimport { currencyField } from '../../fields/currencyField.js'\nimport { beforeChangeCart } from './beforeChange.js'\nimport { statusBeforeRead } from './statusBeforeRead.js'\n\ntype Props = {\n access: {\n adminOrCustomerOwner: NonNullable<AccessConfig['adminOrCustomerOwner']>\n publicAccess: NonNullable<AccessConfig['publicAccess']>\n }\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: { adminOrCustomerOwner, publicAccess },\n currenciesConfig,\n customersSlug = 'users',\n enableVariants = false,\n productsSlug = 'products',\n variantsSlug = 'variants',\n } = props || {}\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: '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 const baseConfig: CollectionConfig = {\n slug: 'carts',\n access: {\n create: publicAccess,\n delete: adminOrCustomerOwner,\n read: adminOrCustomerOwner,\n update: adminOrCustomerOwner,\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 fields,\n hooks: {\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","beforeChangeCart","statusBeforeRead","createCartsCollection","props","access","adminOrCustomerOwner","publicAccess","currenciesConfig","customersSlug","enableVariants","productsSlug","variantsSlug","fields","overrides","label","t","labels","plural","singular","name","type","admin","position","relationTo","date","pickerAppearance","readOnly","hooks","afterRead","options","value","virtual","baseConfig","slug","create","delete","read","update","description","group","useAsTitle","beforeChange","timestamps"],"mappings":"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"}
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'\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 { 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 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 currenciesConfig,\n customersSlug = 'users',\n enableVariants = false,\n productsSlug = 'products',\n variantsSlug = 'variants',\n } = props || {}\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: 'carts',\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 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","hasCartSecretAccess","statusBeforeRead","createCartsCollection","props","access","allowGuestCarts","currenciesConfig","customersSlug","enableVariants","productsSlug","variantsSlug","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","doc","context","newCartSecret","secret","beforeChange","timestamps"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Access } from 'payload';
2
+ /**
3
+ * Internal access function for guest cart access via secret query parameter.
4
+ * Only active when allowGuestCarts is enabled.
5
+ *
6
+ * @param allowGuestCarts - Whether guest cart access is enabled
7
+ * @returns Access function that checks for valid cart secret in query params
8
+ */
9
+ export declare const hasCartSecretAccess: (allowGuestCarts: boolean) => Access;
10
+ //# sourceMappingURL=hasCartSecretAccess.d.ts.map
@@ -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 query parameter.
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 query params
7
+ */ export const hasCartSecretAccess = (allowGuestCarts)=>{
8
+ return ({ req })=>{
9
+ if (!allowGuestCarts) {
10
+ return false;
11
+ }
12
+ const 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 query parameter.\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 query params\n */\nexport const hasCartSecretAccess = (allowGuestCarts: boolean): Access => {\n return ({ req }) => {\n if (!allowGuestCarts) {\n return false\n }\n\n const 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","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,KAAK,EAAEC;QAE9B,IAAI,CAACF,cAAc,OAAOA,eAAe,UAAU;YACjD,OAAO;QACT;QAEA,OAAO;YACLE,QAAQ;gBACNC,QAAQH;YACV;QACF;IACF;AACF,EAAC"}
@@ -1,11 +1,7 @@
1
1
  import type { CollectionConfig, Field } from 'payload';
2
2
  import type { AccessConfig, CurrenciesConfig } from '../../types/index.js';
3
3
  type Props = {
4
- access: {
5
- adminOnly: NonNullable<AccessConfig['adminOnly']>;
6
- adminOnlyFieldAccess: NonNullable<AccessConfig['adminOnlyFieldAccess']>;
7
- adminOrCustomerOwner: NonNullable<AccessConfig['adminOrCustomerOwner']>;
8
- };
4
+ access: Pick<AccessConfig, 'adminOnlyFieldAccess' | 'isAdmin' | 'isDocumentOwner'>;
9
5
  /**
10
6
  * Array of fields used for capturing the shipping address data.
11
7
  */
@@ -1 +1 @@
1
- {"version":3,"file":"createOrdersCollection.d.ts","sourceRoot":"","sources":["../../../src/collections/orders/createOrdersCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEtD,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAM1E,KAAK,KAAK,GAAG;IACX,MAAM,EAAE;QACN,SAAS,EAAE,WAAW,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAA;QACjD,oBAAoB,EAAE,WAAW,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC,CAAA;QACvE,oBAAoB,EAAE,WAAW,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC,CAAA;KACxE,CAAA;IACD;;OAEG;IACH,aAAa,CAAC,EAAE,KAAK,EAAE,CAAA;IACvB,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,eAAO,MAAM,sBAAsB,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,gBAwLtD,CAAA"}
1
+ {"version":3,"file":"createOrdersCollection.d.ts","sourceRoot":"","sources":["../../../src/collections/orders/createOrdersCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEtD,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAO1E,KAAK,KAAK,GAAG;IACX,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,sBAAsB,GAAG,SAAS,GAAG,iBAAiB,CAAC,CAAA;IAClF;;OAEG;IACH,aAAa,CAAC,EAAE,KAAK,EAAE,CAAA;IACvB,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,eAAO,MAAM,sBAAsB,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,gBAwLtD,CAAA"}
@@ -1,8 +1,9 @@
1
1
  import { amountField } from '../../fields/amountField.js';
2
2
  import { cartItemsField } from '../../fields/cartItemsField.js';
3
3
  import { currencyField } from '../../fields/currencyField.js';
4
+ import { accessOR } from '../../utilities/accessComposition.js';
4
5
  export const createOrdersCollection = (props)=>{
5
- const { access: { adminOnly, adminOnlyFieldAccess, adminOrCustomerOwner }, addressFields, currenciesConfig, customersSlug = 'users', enableVariants = false, productsSlug = 'products', transactionsSlug = 'transactions', variantsSlug = 'variants' } = props || {};
6
+ const { access, addressFields, currenciesConfig, customersSlug = 'users', enableVariants = false, productsSlug = 'products', transactionsSlug = 'transactions', variantsSlug = 'variants' } = props || {};
6
7
  const fields = [
7
8
  {
8
9
  type: 'tabs',
@@ -69,9 +70,9 @@ export const createOrdersCollection = (props)=>{
69
70
  name: 'transactions',
70
71
  type: 'relationship',
71
72
  access: {
72
- create: adminOnlyFieldAccess,
73
- read: adminOnlyFieldAccess,
74
- update: adminOnlyFieldAccess
73
+ create: access.adminOnlyFieldAccess,
74
+ read: access.adminOnlyFieldAccess,
75
+ update: access.adminOnlyFieldAccess
75
76
  },
76
77
  admin: {
77
78
  position: 'sidebar'
@@ -134,10 +135,10 @@ export const createOrdersCollection = (props)=>{
134
135
  const baseConfig = {
135
136
  slug: 'orders',
136
137
  access: {
137
- create: adminOnly,
138
- delete: adminOnly,
139
- read: adminOrCustomerOwner,
140
- update: adminOnly
138
+ create: access.isAdmin,
139
+ delete: access.isAdmin,
140
+ read: accessOR(access.isAdmin, access.isDocumentOwner),
141
+ update: access.isAdmin
141
142
  },
142
143
  admin: {
143
144
  description: ({ t })=>// @ts-expect-error - translations are not typed in plugins yet
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/collections/orders/createOrdersCollection.ts"],"sourcesContent":["import type { CollectionConfig, Field } from 'payload'\n\nimport type { AccessConfig, CurrenciesConfig } from '../../types/index.js'\n\nimport { amountField } from '../../fields/amountField.js'\nimport { cartItemsField } from '../../fields/cartItemsField.js'\nimport { currencyField } from '../../fields/currencyField.js'\n\ntype Props = {\n access: {\n adminOnly: NonNullable<AccessConfig['adminOnly']>\n adminOnlyFieldAccess: NonNullable<AccessConfig['adminOnlyFieldAccess']>\n adminOrCustomerOwner: NonNullable<AccessConfig['adminOrCustomerOwner']>\n }\n /**\n * Array of fields used for capturing the shipping address data.\n */\n addressFields?: Field[]\n currenciesConfig?: CurrenciesConfig\n /**\n * Slug of the customers collection, defaults to 'users'.\n */\n customersSlug?: string\n enableVariants?: boolean\n /**\n * Slug of the products collection, defaults to 'products'.\n */\n productsSlug?: string\n /**\n * Slug of the transactions collection, defaults to 'transactions'.\n */\n transactionsSlug?: string\n /**\n * Slug of the variants collection, defaults to 'variants'.\n */\n variantsSlug?: string\n}\n\nexport const createOrdersCollection: (props: Props) => CollectionConfig = (props) => {\n const {\n access: { adminOnly, adminOnlyFieldAccess, adminOrCustomerOwner },\n addressFields,\n currenciesConfig,\n customersSlug = 'users',\n enableVariants = false,\n productsSlug = 'products',\n transactionsSlug = 'transactions',\n variantsSlug = 'variants',\n } = props || {}\n\n const fields: Field[] = [\n {\n type: 'tabs',\n tabs: [\n {\n fields: [\n cartItemsField({\n enableVariants,\n overrides: {\n name: 'items',\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 label: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:orderDetails'),\n },\n {\n fields: [\n ...(addressFields\n ? [\n {\n name: 'shippingAddress',\n type: 'group',\n fields: addressFields,\n label: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:shippingAddress'),\n } as Field,\n ]\n : []),\n ],\n label: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:shipping'),\n },\n ],\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: 'customerEmail',\n type: 'email',\n admin: {\n position: 'sidebar',\n },\n label: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:customerEmail'),\n },\n {\n name: 'transactions',\n type: 'relationship',\n access: {\n create: adminOnlyFieldAccess,\n read: adminOnlyFieldAccess,\n update: adminOnlyFieldAccess,\n },\n admin: {\n position: 'sidebar',\n },\n hasMany: true,\n label: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:transactions'),\n relationTo: transactionsSlug,\n },\n {\n name: 'status',\n type: 'select',\n admin: {\n position: 'sidebar',\n },\n defaultValue: 'processing',\n interfaceName: 'OrderStatus',\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:processing'),\n value: 'processing',\n },\n {\n // @ts-expect-error - translations are not typed in plugins yet\n label: ({ t }) => t('plugin-ecommerce:completed'),\n value: 'completed',\n },\n {\n // @ts-expect-error - translations are not typed in plugins yet\n label: ({ t }) => t('plugin-ecommerce:cancelled'),\n value: 'cancelled',\n },\n {\n // @ts-expect-error - translations are not typed in plugins yet\n label: ({ t }) => t('plugin-ecommerce:refunded'),\n value: 'refunded',\n },\n ],\n },\n\n ...(currenciesConfig\n ? [\n {\n type: 'row',\n admin: {\n position: 'sidebar',\n },\n fields: [\n amountField({\n currenciesConfig,\n }),\n currencyField({\n currenciesConfig,\n }),\n ],\n } as Field,\n ]\n : []),\n ]\n\n const baseConfig: CollectionConfig = {\n slug: 'orders',\n access: {\n create: adminOnly,\n delete: adminOnly,\n read: adminOrCustomerOwner,\n update: adminOnly,\n },\n admin: {\n description: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:ordersCollectionDescription'),\n group: 'Ecommerce',\n useAsTitle: 'createdAt',\n },\n fields,\n labels: {\n plural: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:orders'),\n singular: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:order'),\n },\n timestamps: true,\n }\n\n return { ...baseConfig }\n}\n"],"names":["amountField","cartItemsField","currencyField","createOrdersCollection","props","access","adminOnly","adminOnlyFieldAccess","adminOrCustomerOwner","addressFields","currenciesConfig","customersSlug","enableVariants","productsSlug","transactionsSlug","variantsSlug","fields","type","tabs","overrides","name","label","t","labels","plural","singular","admin","position","relationTo","create","read","update","hasMany","defaultValue","interfaceName","options","value","baseConfig","slug","delete","description","group","useAsTitle","timestamps"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/collections/orders/createOrdersCollection.ts"],"sourcesContent":["import type { CollectionConfig, Field } from 'payload'\n\nimport type { AccessConfig, CurrenciesConfig } from '../../types/index.js'\n\nimport { amountField } from '../../fields/amountField.js'\nimport { cartItemsField } from '../../fields/cartItemsField.js'\nimport { currencyField } from '../../fields/currencyField.js'\nimport { accessOR } from '../../utilities/accessComposition.js'\n\ntype Props = {\n access: Pick<AccessConfig, 'adminOnlyFieldAccess' | 'isAdmin' | 'isDocumentOwner'>\n /**\n * Array of fields used for capturing the shipping address data.\n */\n addressFields?: Field[]\n currenciesConfig?: CurrenciesConfig\n /**\n * Slug of the customers collection, defaults to 'users'.\n */\n customersSlug?: string\n enableVariants?: boolean\n /**\n * Slug of the products collection, defaults to 'products'.\n */\n productsSlug?: string\n /**\n * Slug of the transactions collection, defaults to 'transactions'.\n */\n transactionsSlug?: string\n /**\n * Slug of the variants collection, defaults to 'variants'.\n */\n variantsSlug?: string\n}\n\nexport const createOrdersCollection: (props: Props) => CollectionConfig = (props) => {\n const {\n access,\n addressFields,\n currenciesConfig,\n customersSlug = 'users',\n enableVariants = false,\n productsSlug = 'products',\n transactionsSlug = 'transactions',\n variantsSlug = 'variants',\n } = props || {}\n\n const fields: Field[] = [\n {\n type: 'tabs',\n tabs: [\n {\n fields: [\n cartItemsField({\n enableVariants,\n overrides: {\n name: 'items',\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 label: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:orderDetails'),\n },\n {\n fields: [\n ...(addressFields\n ? [\n {\n name: 'shippingAddress',\n type: 'group',\n fields: addressFields,\n label: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:shippingAddress'),\n } as Field,\n ]\n : []),\n ],\n label: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:shipping'),\n },\n ],\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: 'customerEmail',\n type: 'email',\n admin: {\n position: 'sidebar',\n },\n label: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:customerEmail'),\n },\n {\n name: 'transactions',\n type: 'relationship',\n access: {\n create: access.adminOnlyFieldAccess,\n read: access.adminOnlyFieldAccess,\n update: access.adminOnlyFieldAccess,\n },\n admin: {\n position: 'sidebar',\n },\n hasMany: true,\n label: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:transactions'),\n relationTo: transactionsSlug,\n },\n {\n name: 'status',\n type: 'select',\n admin: {\n position: 'sidebar',\n },\n defaultValue: 'processing',\n interfaceName: 'OrderStatus',\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:processing'),\n value: 'processing',\n },\n {\n // @ts-expect-error - translations are not typed in plugins yet\n label: ({ t }) => t('plugin-ecommerce:completed'),\n value: 'completed',\n },\n {\n // @ts-expect-error - translations are not typed in plugins yet\n label: ({ t }) => t('plugin-ecommerce:cancelled'),\n value: 'cancelled',\n },\n {\n // @ts-expect-error - translations are not typed in plugins yet\n label: ({ t }) => t('plugin-ecommerce:refunded'),\n value: 'refunded',\n },\n ],\n },\n\n ...(currenciesConfig\n ? [\n {\n type: 'row',\n admin: {\n position: 'sidebar',\n },\n fields: [\n amountField({\n currenciesConfig,\n }),\n currencyField({\n currenciesConfig,\n }),\n ],\n } as Field,\n ]\n : []),\n ]\n\n const baseConfig: CollectionConfig = {\n slug: 'orders',\n access: {\n create: access.isAdmin,\n delete: access.isAdmin,\n read: accessOR(access.isAdmin, access.isDocumentOwner),\n update: access.isAdmin,\n },\n admin: {\n description: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:ordersCollectionDescription'),\n group: 'Ecommerce',\n useAsTitle: 'createdAt',\n },\n fields,\n labels: {\n plural: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:orders'),\n singular: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:order'),\n },\n timestamps: true,\n }\n\n return { ...baseConfig }\n}\n"],"names":["amountField","cartItemsField","currencyField","accessOR","createOrdersCollection","props","access","addressFields","currenciesConfig","customersSlug","enableVariants","productsSlug","transactionsSlug","variantsSlug","fields","type","tabs","overrides","name","label","t","labels","plural","singular","admin","position","relationTo","create","adminOnlyFieldAccess","read","update","hasMany","defaultValue","interfaceName","options","value","baseConfig","slug","isAdmin","delete","isDocumentOwner","description","group","useAsTitle","timestamps"],"mappings":"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"}
@@ -1,10 +1,7 @@
1
1
  import type { CollectionConfig } from 'payload';
2
2
  import type { AccessConfig, CurrenciesConfig, InventoryConfig } from '../../types/index.js';
3
3
  type Props = {
4
- access: {
5
- adminOnly: NonNullable<AccessConfig['adminOnly']>;
6
- adminOrPublishedStatus: NonNullable<AccessConfig['adminOrPublishedStatus']>;
7
- };
4
+ access: Pick<AccessConfig, 'adminOrPublishedStatus' | 'isAdmin'>;
8
5
  currenciesConfig: CurrenciesConfig;
9
6
  enableVariants?: boolean;
10
7
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"createProductsCollection.d.ts","sourceRoot":"","sources":["../../../src/collections/products/createProductsCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE/C,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAM3F,KAAK,KAAK,GAAG;IACX,MAAM,EAAE;QACN,SAAS,EAAE,WAAW,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAA;QACjD,sBAAsB,EAAE,WAAW,CAAC,YAAY,CAAC,wBAAwB,CAAC,CAAC,CAAA;KAC5E,CAAA;IACD,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,eAAe,CAAA;IACrC;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B,CAAA;AAED,eAAO,MAAM,wBAAwB,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,gBA2DxD,CAAA"}
1
+ {"version":3,"file":"createProductsCollection.d.ts","sourceRoot":"","sources":["../../../src/collections/products/createProductsCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE/C,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAM3F,KAAK,KAAK,GAAG;IACX,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,wBAAwB,GAAG,SAAS,CAAC,CAAA;IAChE,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,eAAe,CAAA;IACrC;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B,CAAA;AAED,eAAO,MAAM,wBAAwB,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,gBA2DxD,CAAA"}
@@ -2,7 +2,7 @@ import { inventoryField } from '../../fields/inventoryField.js';
2
2
  import { pricesField } from '../../fields/pricesField.js';
3
3
  import { variantsFields } from '../../fields/variantsFields.js';
4
4
  export const createProductsCollection = (props)=>{
5
- const { access: { adminOnly, adminOrPublishedStatus }, currenciesConfig, enableVariants = false, inventory = true, variantsSlug = 'variants', variantTypesSlug = 'variantTypes' } = props || {};
5
+ const { access, currenciesConfig, enableVariants = false, inventory = true, variantsSlug = 'variants', variantTypesSlug = 'variantTypes' } = props || {};
6
6
  const fields = [
7
7
  ...inventory ? [
8
8
  inventoryField({
@@ -26,10 +26,10 @@ export const createProductsCollection = (props)=>{
26
26
  const baseConfig = {
27
27
  slug: 'products',
28
28
  access: {
29
- create: adminOnly,
30
- delete: adminOnly,
31
- read: adminOrPublishedStatus,
32
- update: adminOnly
29
+ create: access.isAdmin,
30
+ delete: access.isAdmin,
31
+ read: access.adminOrPublishedStatus,
32
+ update: access.isAdmin
33
33
  },
34
34
  admin: {
35
35
  defaultColumns: [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/collections/products/createProductsCollection.ts"],"sourcesContent":["import type { CollectionConfig } from 'payload'\n\nimport type { AccessConfig, CurrenciesConfig, InventoryConfig } from '../../types/index.js'\n\nimport { inventoryField } from '../../fields/inventoryField.js'\nimport { pricesField } from '../../fields/pricesField.js'\nimport { variantsFields } from '../../fields/variantsFields.js'\n\ntype Props = {\n access: {\n adminOnly: NonNullable<AccessConfig['adminOnly']>\n adminOrPublishedStatus: NonNullable<AccessConfig['adminOrPublishedStatus']>\n }\n currenciesConfig: CurrenciesConfig\n enableVariants?: boolean\n /**\n * Adds in an inventory field to the product and its variants. This is useful for tracking inventory levels.\n * Defaults to true.\n */\n inventory?: boolean | InventoryConfig\n /**\n * Slug of the variants collection, defaults to 'variants'.\n */\n variantsSlug?: string\n /**\n * Slug of the variant types collection, defaults to 'variantTypes'.\n */\n variantTypesSlug?: string\n}\n\nexport const createProductsCollection: (props: Props) => CollectionConfig = (props) => {\n const {\n access: { adminOnly, adminOrPublishedStatus },\n currenciesConfig,\n enableVariants = false,\n inventory = true,\n variantsSlug = 'variants',\n variantTypesSlug = 'variantTypes',\n } = props || {}\n\n const fields = [\n ...(inventory\n ? [\n inventoryField({\n overrides: {\n admin: {\n condition: ({ enableVariants }) => !enableVariants,\n },\n },\n }),\n ]\n : []),\n ...(enableVariants ? variantsFields({ variantsSlug, variantTypesSlug }) : []),\n ...(currenciesConfig ? [...pricesField({ currenciesConfig })] : []),\n ]\n\n const baseConfig: CollectionConfig = {\n slug: 'products',\n access: {\n create: adminOnly,\n delete: adminOnly,\n read: adminOrPublishedStatus,\n update: adminOnly,\n },\n admin: {\n defaultColumns: [\n ...(currenciesConfig ? ['prices'] : []),\n ...(enableVariants ? ['variants'] : []),\n ],\n group: 'Ecommerce',\n },\n fields,\n labels: {\n plural: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:products'),\n singular: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:product'),\n },\n trash: true,\n versions: {\n drafts: {\n autosave: true,\n },\n },\n }\n\n return baseConfig\n}\n"],"names":["inventoryField","pricesField","variantsFields","createProductsCollection","props","access","adminOnly","adminOrPublishedStatus","currenciesConfig","enableVariants","inventory","variantsSlug","variantTypesSlug","fields","overrides","admin","condition","baseConfig","slug","create","delete","read","update","defaultColumns","group","labels","plural","t","singular","trash","versions","drafts","autosave"],"mappings":"AAIA,SAASA,cAAc,QAAQ,iCAAgC;AAC/D,SAASC,WAAW,QAAQ,8BAA6B;AACzD,SAASC,cAAc,QAAQ,iCAAgC;AAwB/D,OAAO,MAAMC,2BAA+D,CAACC;IAC3E,MAAM,EACJC,QAAQ,EAAEC,SAAS,EAAEC,sBAAsB,EAAE,EAC7CC,gBAAgB,EAChBC,iBAAiB,KAAK,EACtBC,YAAY,IAAI,EAChBC,eAAe,UAAU,EACzBC,mBAAmB,cAAc,EAClC,GAAGR,SAAS,CAAC;IAEd,MAAMS,SAAS;WACTH,YACA;YACEV,eAAe;gBACbc,WAAW;oBACTC,OAAO;wBACLC,WAAW,CAAC,EAAEP,cAAc,EAAE,GAAK,CAACA;oBACtC;gBACF;YACF;SACD,GACD,EAAE;WACFA,iBAAiBP,eAAe;YAAES;YAAcC;QAAiB,KAAK,EAAE;WACxEJ,mBAAmB;eAAIP,YAAY;gBAAEO;YAAiB;SAAG,GAAG,EAAE;KACnE;IAED,MAAMS,aAA+B;QACnCC,MAAM;QACNb,QAAQ;YACNc,QAAQb;YACRc,QAAQd;YACRe,MAAMd;YACNe,QAAQhB;QACV;QACAS,OAAO;YACLQ,gBAAgB;mBACVf,mBAAmB;oBAAC;iBAAS,GAAG,EAAE;mBAClCC,iBAAiB;oBAAC;iBAAW,GAAG,EAAE;aACvC;YACDe,OAAO;QACT;QACAX;QACAY,QAAQ;YACNC,QAAQ,CAAC,EAAEC,CAAC,EAAE,GACZ,+DAA+D;gBAC/DA,EAAE;YACJC,UAAU,CAAC,EAAED,CAAC,EAAE,GACd,+DAA+D;gBAC/DA,EAAE;QACN;QACAE,OAAO;QACPC,UAAU;YACRC,QAAQ;gBACNC,UAAU;YACZ;QACF;IACF;IAEA,OAAOf;AACT,EAAC"}
1
+ {"version":3,"sources":["../../../src/collections/products/createProductsCollection.ts"],"sourcesContent":["import type { CollectionConfig } from 'payload'\n\nimport type { AccessConfig, CurrenciesConfig, InventoryConfig } from '../../types/index.js'\n\nimport { inventoryField } from '../../fields/inventoryField.js'\nimport { pricesField } from '../../fields/pricesField.js'\nimport { variantsFields } from '../../fields/variantsFields.js'\n\ntype Props = {\n access: Pick<AccessConfig, 'adminOrPublishedStatus' | 'isAdmin'>\n currenciesConfig: CurrenciesConfig\n enableVariants?: boolean\n /**\n * Adds in an inventory field to the product and its variants. This is useful for tracking inventory levels.\n * Defaults to true.\n */\n inventory?: boolean | InventoryConfig\n /**\n * Slug of the variants collection, defaults to 'variants'.\n */\n variantsSlug?: string\n /**\n * Slug of the variant types collection, defaults to 'variantTypes'.\n */\n variantTypesSlug?: string\n}\n\nexport const createProductsCollection: (props: Props) => CollectionConfig = (props) => {\n const {\n access,\n currenciesConfig,\n enableVariants = false,\n inventory = true,\n variantsSlug = 'variants',\n variantTypesSlug = 'variantTypes',\n } = props || {}\n\n const fields = [\n ...(inventory\n ? [\n inventoryField({\n overrides: {\n admin: {\n condition: ({ enableVariants }) => !enableVariants,\n },\n },\n }),\n ]\n : []),\n ...(enableVariants ? variantsFields({ variantsSlug, variantTypesSlug }) : []),\n ...(currenciesConfig ? [...pricesField({ currenciesConfig })] : []),\n ]\n\n const baseConfig: CollectionConfig = {\n slug: 'products',\n access: {\n create: access.isAdmin,\n delete: access.isAdmin,\n read: access.adminOrPublishedStatus,\n update: access.isAdmin,\n },\n admin: {\n defaultColumns: [\n ...(currenciesConfig ? ['prices'] : []),\n ...(enableVariants ? ['variants'] : []),\n ],\n group: 'Ecommerce',\n },\n fields,\n labels: {\n plural: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:products'),\n singular: ({ t }) =>\n // @ts-expect-error - translations are not typed in plugins yet\n t('plugin-ecommerce:product'),\n },\n trash: true,\n versions: {\n drafts: {\n autosave: true,\n },\n },\n }\n\n return baseConfig\n}\n"],"names":["inventoryField","pricesField","variantsFields","createProductsCollection","props","access","currenciesConfig","enableVariants","inventory","variantsSlug","variantTypesSlug","fields","overrides","admin","condition","baseConfig","slug","create","isAdmin","delete","read","adminOrPublishedStatus","update","defaultColumns","group","labels","plural","t","singular","trash","versions","drafts","autosave"],"mappings":"AAIA,SAASA,cAAc,QAAQ,iCAAgC;AAC/D,SAASC,WAAW,QAAQ,8BAA6B;AACzD,SAASC,cAAc,QAAQ,iCAAgC;AAqB/D,OAAO,MAAMC,2BAA+D,CAACC;IAC3E,MAAM,EACJC,MAAM,EACNC,gBAAgB,EAChBC,iBAAiB,KAAK,EACtBC,YAAY,IAAI,EAChBC,eAAe,UAAU,EACzBC,mBAAmB,cAAc,EAClC,GAAGN,SAAS,CAAC;IAEd,MAAMO,SAAS;WACTH,YACA;YACER,eAAe;gBACbY,WAAW;oBACTC,OAAO;wBACLC,WAAW,CAAC,EAAEP,cAAc,EAAE,GAAK,CAACA;oBACtC;gBACF;YACF;SACD,GACD,EAAE;WACFA,iBAAiBL,eAAe;YAAEO;YAAcC;QAAiB,KAAK,EAAE;WACxEJ,mBAAmB;eAAIL,YAAY;gBAAEK;YAAiB;SAAG,GAAG,EAAE;KACnE;IAED,MAAMS,aAA+B;QACnCC,MAAM;QACNX,QAAQ;YACNY,QAAQZ,OAAOa,OAAO;YACtBC,QAAQd,OAAOa,OAAO;YACtBE,MAAMf,OAAOgB,sBAAsB;YACnCC,QAAQjB,OAAOa,OAAO;QACxB;QACAL,OAAO;YACLU,gBAAgB;mBACVjB,mBAAmB;oBAAC;iBAAS,GAAG,EAAE;mBAClCC,iBAAiB;oBAAC;iBAAW,GAAG,EAAE;aACvC;YACDiB,OAAO;QACT;QACAb;QACAc,QAAQ;YACNC,QAAQ,CAAC,EAAEC,CAAC,EAAE,GACZ,+DAA+D;gBAC/DA,EAAE;YACJC,UAAU,CAAC,EAAED,CAAC,EAAE,GACd,+DAA+D;gBAC/DA,EAAE;QACN;QACAE,OAAO;QACPC,UAAU;YACRC,QAAQ;gBACNC,UAAU;YACZ;QACF;IACF;IAEA,OAAOjB;AACT,EAAC"}
@@ -1,9 +1,7 @@
1
1
  import type { CollectionConfig, Field } from 'payload';
2
2
  import type { AccessConfig, CurrenciesConfig, PaymentAdapter } from '../../types/index.js';
3
3
  type Props = {
4
- access: {
5
- adminOnly: NonNullable<AccessConfig['adminOnly']>;
6
- };
4
+ access: Pick<AccessConfig, 'isAdmin'>;
7
5
  /**
8
6
  * Array of fields used for capturing the billing address.
9
7
  */
@@ -1 +1 @@
1
- {"version":3,"file":"createTransactionsCollection.d.ts","sourceRoot":"","sources":["../../../src/collections/transactions/createTransactionsCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEtD,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAO1F,KAAK,KAAK,GAAG;IACX,MAAM,EAAE;QACN,SAAS,EAAE,WAAW,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAA;KAClD,CAAA;IACD;;OAEG;IACH,aAAa,CAAC,EAAE,KAAK,EAAE,CAAA;IACvB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;OAEG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,cAAc,EAAE,CAAA;IACjC;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,eAAO,MAAM,4BAA4B,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,gBA+K5D,CAAA"}
1
+ {"version":3,"file":"createTransactionsCollection.d.ts","sourceRoot":"","sources":["../../../src/collections/transactions/createTransactionsCollection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEtD,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAO1F,KAAK,KAAK,GAAG;IACX,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAA;IACrC;;OAEG;IACH,aAAa,CAAC,EAAE,KAAK,EAAE,CAAA;IACvB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;OAEG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,cAAc,EAAE,CAAA;IACjC;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,eAAO,MAAM,4BAA4B,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,gBA+K5D,CAAA"}
@@ -3,7 +3,7 @@ import { cartItemsField } from '../../fields/cartItemsField.js';
3
3
  import { currencyField } from '../../fields/currencyField.js';
4
4
  import { statusField } from '../../fields/statusField.js';
5
5
  export const createTransactionsCollection = (props)=>{
6
- const { access: { adminOnly }, addressFields, cartsSlug = 'carts', currenciesConfig, customersSlug = 'users', enableVariants = false, ordersSlug = 'orders', paymentMethods, productsSlug = 'products', variantsSlug = 'variants' } = props || {};
6
+ const { access, addressFields, cartsSlug = 'carts', currenciesConfig, customersSlug = 'users', enableVariants = false, ordersSlug = 'orders', paymentMethods, productsSlug = 'products', variantsSlug = 'variants' } = props || {};
7
7
  const fields = [
8
8
  {
9
9
  type: 'tabs',
@@ -124,10 +124,10 @@ export const createTransactionsCollection = (props)=>{
124
124
  const baseConfig = {
125
125
  slug: 'transactions',
126
126
  access: {
127
- create: adminOnly,
128
- delete: adminOnly,
129
- read: adminOnly,
130
- update: adminOnly
127
+ create: access.isAdmin,
128
+ delete: access.isAdmin,
129
+ read: access.isAdmin,
130
+ update: access.isAdmin
131
131
  },
132
132
  admin: {
133
133
  defaultColumns: [