@payloadcms/plugin-multi-tenant 3.53.0-internal.2dadf5b → 3.54.0-canary.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/components/TenantField/index.client.d.ts.map +1 -1
  2. package/dist/components/TenantField/index.client.js +139 -55
  3. package/dist/components/TenantField/index.client.js.map +1 -1
  4. package/dist/components/TenantField/index.scss +47 -13
  5. package/dist/components/TenantSelector/index.client.d.ts +10 -0
  6. package/dist/components/TenantSelector/index.client.d.ts.map +1 -0
  7. package/dist/components/TenantSelector/index.client.js +85 -0
  8. package/dist/components/TenantSelector/index.client.js.map +1 -0
  9. package/dist/components/TenantSelector/index.d.ts +8 -7
  10. package/dist/components/TenantSelector/index.d.ts.map +1 -1
  11. package/dist/components/TenantSelector/index.js +9 -128
  12. package/dist/components/TenantSelector/index.js.map +1 -1
  13. package/dist/exports/client.d.ts +0 -1
  14. package/dist/exports/client.d.ts.map +1 -1
  15. package/dist/exports/client.js +0 -1
  16. package/dist/exports/client.js.map +1 -1
  17. package/dist/exports/rsc.d.ts +1 -0
  18. package/dist/exports/rsc.d.ts.map +1 -1
  19. package/dist/exports/rsc.js +1 -0
  20. package/dist/exports/rsc.js.map +1 -1
  21. package/dist/fields/tenantField/index.d.ts +3 -1
  22. package/dist/fields/tenantField/index.d.ts.map +1 -1
  23. package/dist/fields/tenantField/index.js +61 -30
  24. package/dist/fields/tenantField/index.js.map +1 -1
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +78 -1
  27. package/dist/index.js.map +1 -1
  28. package/dist/providers/TenantSelectionProvider/index.client.d.ts.map +1 -1
  29. package/dist/providers/TenantSelectionProvider/index.client.js +83 -38
  30. package/dist/providers/TenantSelectionProvider/index.client.js.map +1 -1
  31. package/dist/translations/languages/zhTw.js +1 -1
  32. package/dist/translations/languages/zhTw.js.map +1 -1
  33. package/dist/utilities/addCollectionAccess.d.ts.map +1 -1
  34. package/dist/utilities/addCollectionAccess.js +0 -1
  35. package/dist/utilities/addCollectionAccess.js.map +1 -1
  36. package/dist/utilities/addFilterOptionsToFields.d.ts +3 -1
  37. package/dist/utilities/addFilterOptionsToFields.d.ts.map +1 -1
  38. package/dist/utilities/addFilterOptionsToFields.js +21 -35
  39. package/dist/utilities/addFilterOptionsToFields.js.map +1 -1
  40. package/dist/utilities/generateCookie.d.ts +26 -0
  41. package/dist/utilities/generateCookie.d.ts.map +1 -0
  42. package/dist/utilities/generateCookie.js +61 -0
  43. package/dist/utilities/generateCookie.js.map +1 -0
  44. package/dist/utilities/withTenantAccess.d.ts +1 -2
  45. package/dist/utilities/withTenantAccess.d.ts.map +1 -1
  46. package/dist/utilities/withTenantAccess.js.map +1 -1
  47. package/package.json +6 -6
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/TenantSelector/index.tsx"],"sourcesContent":["'use client'\nimport type { ReactSelectOption } from '@payloadcms/ui'\nimport type { ViewTypes } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n ConfirmationModal,\n SelectInput,\n Translation,\n useModal,\n useTranslation,\n} from '@payloadcms/ui'\nimport React from 'react'\n\nimport type {\n PluginMultiTenantTranslationKeys,\n PluginMultiTenantTranslations,\n} from '../../translations/index.js'\n\nimport { useTenantSelection } from '../../providers/TenantSelectionProvider/index.client.js'\nimport './index.scss'\n\nconst confirmSwitchTenantSlug = 'confirm-switch-tenant'\nconst confirmLeaveWithoutSavingSlug = 'confirm-leave-without-saving'\n\nexport const TenantSelector = ({ label, viewType }: { label: string; viewType?: ViewTypes }) => {\n const { entityType, modified, options, selectedTenantID, setTenant } = useTenantSelection()\n const { closeModal, openModal } = useModal()\n const { i18n, t } = useTranslation<\n PluginMultiTenantTranslations,\n PluginMultiTenantTranslationKeys\n >()\n const [tenantSelection, setTenantSelection] = React.useState<\n ReactSelectOption | ReactSelectOption[]\n >()\n\n const selectedValue = React.useMemo(() => {\n if (selectedTenantID) {\n return options.find((option) => option.value === selectedTenantID)\n }\n return undefined\n }, [options, selectedTenantID])\n\n const newSelectedValue = React.useMemo(() => {\n if (tenantSelection && 'value' in tenantSelection) {\n return options.find((option) => option.value === tenantSelection.value)\n }\n return undefined\n }, [options, tenantSelection])\n\n const switchTenant = React.useCallback(\n (option: ReactSelectOption | ReactSelectOption[] | undefined) => {\n if (option && 'value' in option) {\n setTenant({ id: option.value as string, refresh: true })\n } else {\n setTenant({ id: undefined, refresh: true })\n }\n },\n [setTenant],\n )\n\n const onChange = React.useCallback(\n (option: ReactSelectOption | ReactSelectOption[]) => {\n if (option && 'value' in option && option.value === selectedTenantID) {\n // If the selected option is the same as the current tenant, do nothing\n return\n }\n\n if (entityType !== 'document') {\n if (entityType === 'global' && modified) {\n // If the entityType is 'global' and there are unsaved changes, prompt for confirmation\n setTenantSelection(option)\n openModal(confirmLeaveWithoutSavingSlug)\n } else {\n // If the entityType is not 'document', switch tenant without confirmation\n switchTenant(option)\n }\n } else {\n // non-unique documents should always prompt for confirmation\n setTenantSelection(option)\n openModal(confirmSwitchTenantSlug)\n }\n },\n [selectedTenantID, entityType, modified, switchTenant, openModal],\n )\n\n if (options.length <= 1) {\n return null\n }\n\n return (\n <div className=\"tenant-selector\">\n <SelectInput\n isClearable={viewType === 'list'}\n label={\n label ? getTranslation(label, i18n) : t('plugin-multi-tenant:nav-tenantSelector-label')\n }\n name=\"setTenant\"\n onChange={onChange}\n options={options}\n path=\"setTenant\"\n value={selectedTenantID as string | undefined}\n />\n\n <ConfirmationModal\n body={\n <Translation\n elements={{\n 0: ({ children }) => {\n return <b>{children}</b>\n },\n }}\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n i18nKey=\"plugin-multi-tenant:confirm-modal-tenant-switch--body\"\n t={t}\n variables={{\n fromTenant: selectedValue?.label,\n toTenant: newSelectedValue?.label,\n }}\n />\n }\n heading={t('plugin-multi-tenant:confirm-modal-tenant-switch--heading', {\n tenantLabel: label\n ? getTranslation(label, i18n)\n : t('plugin-multi-tenant:nav-tenantSelector-label'),\n })}\n modalSlug={confirmSwitchTenantSlug}\n onConfirm={() => {\n switchTenant(tenantSelection)\n }}\n />\n\n <ConfirmationModal\n body={t('general:changesNotSaved')}\n cancelLabel={t('general:stayOnThisPage')}\n confirmLabel={t('general:leaveAnyway')}\n heading={t('general:leaveWithoutSaving')}\n modalSlug={confirmLeaveWithoutSavingSlug}\n onCancel={() => {\n closeModal(confirmLeaveWithoutSavingSlug)\n }}\n onConfirm={() => {\n switchTenant(tenantSelection)\n }}\n />\n </div>\n )\n}\n"],"names":["getTranslation","ConfirmationModal","SelectInput","Translation","useModal","useTranslation","React","useTenantSelection","confirmSwitchTenantSlug","confirmLeaveWithoutSavingSlug","TenantSelector","label","viewType","entityType","modified","options","selectedTenantID","setTenant","closeModal","openModal","i18n","t","tenantSelection","setTenantSelection","useState","selectedValue","useMemo","find","option","value","undefined","newSelectedValue","switchTenant","useCallback","id","refresh","onChange","length","div","className","isClearable","name","path","body","elements","children","b","i18nKey","variables","fromTenant","toTenant","heading","tenantLabel","modalSlug","onConfirm","cancelLabel","confirmLabel","onCancel"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/components/TenantSelector/index.tsx"],"sourcesContent":["import type { ServerProps } from 'payload'\n\nimport type { MultiTenantPluginConfig } from '../../types.js'\n\nimport { TenantSelectorClient } from './index.client.js'\n\ntype Props = {\n enabledSlugs: string[]\n label: MultiTenantPluginConfig['tenantSelectorLabel']\n} & ServerProps\nexport const TenantSelector = (props: Props) => {\n const { enabledSlugs, label, params, viewType } = props\n const enabled = Boolean(\n params?.segments &&\n Array.isArray(params.segments) &&\n params.segments[0] === 'collections' &&\n params.segments[1] &&\n enabledSlugs.includes(params.segments[1]),\n )\n\n return <TenantSelectorClient disabled={!enabled} label={label} viewType={viewType} />\n}\n"],"names":["TenantSelectorClient","TenantSelector","props","enabledSlugs","label","params","viewType","enabled","Boolean","segments","Array","isArray","includes","disabled"],"mappings":";AAIA,SAASA,oBAAoB,QAAQ,oBAAmB;AAMxD,OAAO,MAAMC,iBAAiB,CAACC;IAC7B,MAAM,EAAEC,YAAY,EAAEC,KAAK,EAAEC,MAAM,EAAEC,QAAQ,EAAE,GAAGJ;IAClD,MAAMK,UAAUC,QACdH,QAAQI,YACNC,MAAMC,OAAO,CAACN,OAAOI,QAAQ,KAC7BJ,OAAOI,QAAQ,CAAC,EAAE,KAAK,iBACvBJ,OAAOI,QAAQ,CAAC,EAAE,IAClBN,aAAaS,QAAQ,CAACP,OAAOI,QAAQ,CAAC,EAAE;IAG5C,qBAAO,KAACT;QAAqBa,UAAU,CAACN;QAASH,OAAOA;QAAOE,UAAUA;;AAC3E,EAAC"}
@@ -1,5 +1,4 @@
1
1
  export { TenantField } from '../components/TenantField/index.client.js';
2
- export { TenantSelector } from '../components/TenantSelector/index.js';
3
2
  export { WatchTenantCollection } from '../components/WatchTenantCollection/index.js';
4
3
  export { useTenantSelection } from '../providers/TenantSelectionProvider/index.client.js';
5
4
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/exports/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAA;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAA;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAA;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,sDAAsD,CAAA"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/exports/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAA;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAA;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,sDAAsD,CAAA"}
@@ -1,5 +1,4 @@
1
1
  export { TenantField } from '../components/TenantField/index.client.js';
2
- export { TenantSelector } from '../components/TenantSelector/index.js';
3
2
  export { WatchTenantCollection } from '../components/WatchTenantCollection/index.js';
4
3
  export { useTenantSelection } from '../providers/TenantSelectionProvider/index.client.js';
5
4
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/exports/client.ts"],"sourcesContent":["export { TenantField } from '../components/TenantField/index.client.js'\nexport { TenantSelector } from '../components/TenantSelector/index.js'\nexport { WatchTenantCollection } from '../components/WatchTenantCollection/index.js'\nexport { useTenantSelection } from '../providers/TenantSelectionProvider/index.client.js'\n"],"names":["TenantField","TenantSelector","WatchTenantCollection","useTenantSelection"],"mappings":"AAAA,SAASA,WAAW,QAAQ,4CAA2C;AACvE,SAASC,cAAc,QAAQ,wCAAuC;AACtE,SAASC,qBAAqB,QAAQ,+CAA8C;AACpF,SAASC,kBAAkB,QAAQ,uDAAsD"}
1
+ {"version":3,"sources":["../../src/exports/client.ts"],"sourcesContent":["export { TenantField } from '../components/TenantField/index.client.js'\nexport { WatchTenantCollection } from '../components/WatchTenantCollection/index.js'\nexport { useTenantSelection } from '../providers/TenantSelectionProvider/index.client.js'\n"],"names":["TenantField","WatchTenantCollection","useTenantSelection"],"mappings":"AAAA,SAASA,WAAW,QAAQ,4CAA2C;AACvE,SAASC,qBAAqB,QAAQ,+CAA8C;AACpF,SAASC,kBAAkB,QAAQ,uDAAsD"}
@@ -1,3 +1,4 @@
1
1
  export { GlobalViewRedirect } from '../components/GlobalViewRedirect/index.js';
2
+ export { TenantSelector } from '../components/TenantSelector/index.js';
2
3
  export { TenantSelectionProvider } from '../providers/TenantSelectionProvider/index.js';
3
4
  //# sourceMappingURL=rsc.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rsc.d.ts","sourceRoot":"","sources":["../../src/exports/rsc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAA;AAC9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,+CAA+C,CAAA"}
1
+ {"version":3,"file":"rsc.d.ts","sourceRoot":"","sources":["../../src/exports/rsc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAA;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAA;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,+CAA+C,CAAA"}
@@ -1,4 +1,5 @@
1
1
  export { GlobalViewRedirect } from '../components/GlobalViewRedirect/index.js';
2
+ export { TenantSelector } from '../components/TenantSelector/index.js';
2
3
  export { TenantSelectionProvider } from '../providers/TenantSelectionProvider/index.js';
3
4
 
4
5
  //# sourceMappingURL=rsc.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/exports/rsc.ts"],"sourcesContent":["export { GlobalViewRedirect } from '../components/GlobalViewRedirect/index.js'\nexport { TenantSelectionProvider } from '../providers/TenantSelectionProvider/index.js'\n"],"names":["GlobalViewRedirect","TenantSelectionProvider"],"mappings":"AAAA,SAASA,kBAAkB,QAAQ,4CAA2C;AAC9E,SAASC,uBAAuB,QAAQ,gDAA+C"}
1
+ {"version":3,"sources":["../../src/exports/rsc.ts"],"sourcesContent":["export { GlobalViewRedirect } from '../components/GlobalViewRedirect/index.js'\nexport { TenantSelector } from '../components/TenantSelector/index.js'\nexport { TenantSelectionProvider } from '../providers/TenantSelectionProvider/index.js'\n"],"names":["GlobalViewRedirect","TenantSelector","TenantSelectionProvider"],"mappings":"AAAA,SAASA,kBAAkB,QAAQ,4CAA2C;AAC9E,SAASC,cAAc,QAAQ,wCAAuC;AACtE,SAASC,uBAAuB,QAAQ,gDAA+C"}
@@ -4,9 +4,11 @@ type Args = {
4
4
  debug?: boolean;
5
5
  name: string;
6
6
  overrides?: RootTenantFieldConfigOverrides;
7
+ tenantsArrayFieldName: string;
8
+ tenantsArrayTenantFieldName: string;
7
9
  tenantsCollectionSlug: string;
8
10
  unique: boolean;
9
11
  };
10
- export declare const tenantField: ({ name, debug, overrides: _overrides, tenantsCollectionSlug, unique, }: Args) => SingleRelationshipField;
12
+ export declare const tenantField: ({ name, debug, overrides: _overrides, tenantsArrayFieldName, tenantsArrayTenantFieldName, tenantsCollectionSlug, unique, }: Args) => SingleRelationshipField;
11
13
  export {};
12
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fields/tenantField/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAqC,uBAAuB,EAAE,MAAM,SAAS,CAAA;AAIzF,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAA;AAMpE,KAAK,IAAI,GAAG;IACV,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,8BAA8B,CAAA;IAC1C,qBAAqB,EAAE,MAAM,CAAA;IAC7B,MAAM,EAAE,OAAO,CAAA;CAChB,CAAA;AACD,eAAO,MAAM,WAAW,2EAMrB,IAAI,KAAG,uBA2DT,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fields/tenantField/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAqC,uBAAuB,EAAE,MAAM,SAAS,CAAA;AAEzF,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAA;AAwBpE,KAAK,IAAI,GAAG;IACV,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,8BAA8B,CAAA;IAC1C,qBAAqB,EAAE,MAAM,CAAA;IAC7B,2BAA2B,EAAE,MAAM,CAAA;IACnC,qBAAqB,EAAE,MAAM,CAAA;IAC7B,MAAM,EAAE,OAAO,CAAA;CAChB,CAAA;AACD,eAAO,MAAM,WAAW,+HAQrB,IAAI,KAAG,uBAkFT,CAAA"}
@@ -1,60 +1,91 @@
1
- import { APIError } from 'payload';
2
1
  import { defaults } from '../../defaults.js';
3
2
  import { getCollectionIDType } from '../../utilities/getCollectionIDType.js';
4
3
  import { getTenantFromCookie } from '../../utilities/getTenantFromCookie.js';
5
- export const tenantField = ({ name = defaults.tenantFieldName, debug, overrides: _overrides = {}, tenantsCollectionSlug = defaults.tenantCollectionSlug, unique })=>{
4
+ import { getUserTenantIDs } from '../../utilities/getUserTenantIDs.js';
5
+ const fieldValidation = (validateFunction)=>(value, options)=>{
6
+ if (validateFunction) {
7
+ const result = validateFunction(value, options);
8
+ if (result !== true) {
9
+ return result;
10
+ }
11
+ }
12
+ if (!value) {
13
+ return options.req.t('validation:required');
14
+ }
15
+ return true;
16
+ };
17
+ export const tenantField = ({ name = defaults.tenantFieldName, debug, overrides: _overrides = {}, tenantsArrayFieldName = defaults.tenantsArrayFieldName, tenantsArrayTenantFieldName = defaults.tenantsArrayTenantFieldName, tenantsCollectionSlug = defaults.tenantCollectionSlug, unique })=>{
6
18
  const { validate, ...overrides } = _overrides || {};
7
19
  return {
8
20
  ...overrides || {},
9
21
  name,
10
22
  type: 'relationship',
11
- access: overrides?.access || {},
23
+ access: overrides.access || {},
12
24
  admin: {
13
25
  allowCreate: false,
14
26
  allowEdit: false,
15
27
  disableListColumn: true,
16
28
  disableListFilter: true,
17
- ...overrides?.admin || {},
29
+ position: 'sidebar',
30
+ ...overrides.admin || {},
18
31
  components: {
19
- ...overrides?.admin?.components || {},
32
+ ...overrides.admin?.components || {},
20
33
  Field: {
21
34
  path: '@payloadcms/plugin-multi-tenant/client#TenantField',
22
- ...typeof overrides?.admin?.components?.Field !== 'string' ? overrides?.admin?.components?.Field || {} : {},
35
+ ...typeof overrides.admin?.components?.Field !== 'string' ? overrides.admin?.components?.Field || {} : {},
23
36
  clientProps: {
24
- ...typeof overrides?.admin?.components?.Field !== 'string' ? (overrides?.admin?.components?.Field || {})?.clientProps : {},
37
+ ...typeof overrides.admin?.components?.Field !== 'string' ? (overrides.admin?.components?.Field || {})?.clientProps : {},
25
38
  debug,
26
39
  unique
27
40
  }
28
41
  }
29
42
  }
30
43
  },
31
- hasMany: false,
32
- hooks: {
33
- ...overrides.hooks || [],
34
- beforeChange: [
35
- ({ req, value })=>{
36
- const idType = getCollectionIDType({
37
- collectionSlug: tenantsCollectionSlug,
38
- payload: req.payload
39
- });
40
- if (!value) {
41
- const tenantFromCookie = getTenantFromCookie(req.headers, idType);
42
- if (tenantFromCookie) {
43
- return tenantFromCookie;
44
+ defaultValue: overrides.defaultValue || (async ({ req })=>{
45
+ const idType = getCollectionIDType({
46
+ collectionSlug: tenantsCollectionSlug,
47
+ payload: req.payload
48
+ });
49
+ const tenantFromCookie = getTenantFromCookie(req.headers, idType);
50
+ if (tenantFromCookie) {
51
+ const isValidTenant = await req.payload.count({
52
+ collection: tenantsCollectionSlug,
53
+ depth: 0,
54
+ overrideAccess: false,
55
+ req,
56
+ user: req.user,
57
+ where: {
58
+ id: {
59
+ equals: tenantFromCookie
44
60
  }
45
- throw new APIError('You must select a tenant', 400, null, true);
46
61
  }
47
- return idType === 'number' ? parseFloat(value) : value;
48
- },
49
- ...overrides?.hooks?.beforeChange || []
50
- ]
51
- },
62
+ });
63
+ return isValidTenant ? tenantFromCookie : null;
64
+ }
65
+ return null;
66
+ }),
67
+ filterOptions: overrides.filterOptions || (({ req })=>{
68
+ const userAssignedTenants = getUserTenantIDs(req.user, {
69
+ tenantsArrayFieldName,
70
+ tenantsArrayTenantFieldName
71
+ });
72
+ if (userAssignedTenants.length > 0) {
73
+ return {
74
+ id: {
75
+ in: userAssignedTenants
76
+ }
77
+ };
78
+ }
79
+ return true;
80
+ }),
81
+ hasMany: false,
52
82
  index: true,
53
- validate: validate || undefined,
54
- // @ts-expect-error translations are not typed for this plugin
55
- label: overrides?.label || (({ t })=>t('plugin-multi-tenant:field-assignedTenant-label')),
56
83
  relationTo: tenantsCollectionSlug,
57
- unique
84
+ unique,
85
+ // TODO: V4 - replace validation with required: true
86
+ validate: fieldValidation(validate),
87
+ // @ts-expect-error translations are not typed for this plugin
88
+ label: overrides.label || (({ t })=>t('plugin-multi-tenant:field-assignedTenant-label'))
58
89
  };
59
90
  };
60
91
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/fields/tenantField/index.ts"],"sourcesContent":["import type { RelationshipFieldSingleValidation, SingleRelationshipField } from 'payload'\n\nimport { APIError } from 'payload'\n\nimport type { RootTenantFieldConfigOverrides } from '../../types.js'\n\nimport { defaults } from '../../defaults.js'\nimport { getCollectionIDType } from '../../utilities/getCollectionIDType.js'\nimport { getTenantFromCookie } from '../../utilities/getTenantFromCookie.js'\n\ntype Args = {\n debug?: boolean\n name: string\n overrides?: RootTenantFieldConfigOverrides\n tenantsCollectionSlug: string\n unique: boolean\n}\nexport const tenantField = ({\n name = defaults.tenantFieldName,\n debug,\n overrides: _overrides = {},\n tenantsCollectionSlug = defaults.tenantCollectionSlug,\n unique,\n}: Args): SingleRelationshipField => {\n const { validate, ...overrides } = _overrides || {}\n return {\n ...(overrides || {}),\n name,\n type: 'relationship',\n access: overrides?.access || {},\n admin: {\n allowCreate: false,\n allowEdit: false,\n disableListColumn: true,\n disableListFilter: true,\n ...(overrides?.admin || {}),\n components: {\n ...(overrides?.admin?.components || {}),\n Field: {\n path: '@payloadcms/plugin-multi-tenant/client#TenantField',\n ...(typeof overrides?.admin?.components?.Field !== 'string'\n ? overrides?.admin?.components?.Field || {}\n : {}),\n clientProps: {\n ...(typeof overrides?.admin?.components?.Field !== 'string'\n ? (overrides?.admin?.components?.Field || {})?.clientProps\n : {}),\n debug,\n unique,\n },\n },\n },\n },\n hasMany: false,\n hooks: {\n ...(overrides.hooks || []),\n beforeChange: [\n ({ req, value }) => {\n const idType = getCollectionIDType({\n collectionSlug: tenantsCollectionSlug,\n payload: req.payload,\n })\n if (!value) {\n const tenantFromCookie = getTenantFromCookie(req.headers, idType)\n if (tenantFromCookie) {\n return tenantFromCookie\n }\n throw new APIError('You must select a tenant', 400, null, true)\n }\n\n return idType === 'number' ? parseFloat(value) : value\n },\n ...(overrides?.hooks?.beforeChange || []),\n ],\n },\n index: true,\n validate: (validate as RelationshipFieldSingleValidation) || undefined,\n // @ts-expect-error translations are not typed for this plugin\n label: overrides?.label || (({ t }) => t('plugin-multi-tenant:field-assignedTenant-label')),\n relationTo: tenantsCollectionSlug,\n unique,\n }\n}\n"],"names":["APIError","defaults","getCollectionIDType","getTenantFromCookie","tenantField","name","tenantFieldName","debug","overrides","_overrides","tenantsCollectionSlug","tenantCollectionSlug","unique","validate","type","access","admin","allowCreate","allowEdit","disableListColumn","disableListFilter","components","Field","path","clientProps","hasMany","hooks","beforeChange","req","value","idType","collectionSlug","payload","tenantFromCookie","headers","parseFloat","index","undefined","label","t","relationTo"],"mappings":"AAEA,SAASA,QAAQ,QAAQ,UAAS;AAIlC,SAASC,QAAQ,QAAQ,oBAAmB;AAC5C,SAASC,mBAAmB,QAAQ,yCAAwC;AAC5E,SAASC,mBAAmB,QAAQ,yCAAwC;AAS5E,OAAO,MAAMC,cAAc,CAAC,EAC1BC,OAAOJ,SAASK,eAAe,EAC/BC,KAAK,EACLC,WAAWC,aAAa,CAAC,CAAC,EAC1BC,wBAAwBT,SAASU,oBAAoB,EACrDC,MAAM,EACD;IACL,MAAM,EAAEC,QAAQ,EAAE,GAAGL,WAAW,GAAGC,cAAc,CAAC;IAClD,OAAO;QACL,GAAID,aAAa,CAAC,CAAC;QACnBH;QACAS,MAAM;QACNC,QAAQP,WAAWO,UAAU,CAAC;QAC9BC,OAAO;YACLC,aAAa;YACbC,WAAW;YACXC,mBAAmB;YACnBC,mBAAmB;YACnB,GAAIZ,WAAWQ,SAAS,CAAC,CAAC;YAC1BK,YAAY;gBACV,GAAIb,WAAWQ,OAAOK,cAAc,CAAC,CAAC;gBACtCC,OAAO;oBACLC,MAAM;oBACN,GAAI,OAAOf,WAAWQ,OAAOK,YAAYC,UAAU,WAC/Cd,WAAWQ,OAAOK,YAAYC,SAAS,CAAC,IACxC,CAAC,CAAC;oBACNE,aAAa;wBACX,GAAI,OAAOhB,WAAWQ,OAAOK,YAAYC,UAAU,WAC9Cd,CAAAA,WAAWQ,OAAOK,YAAYC,SAAS,CAAC,CAAA,GAAIE,cAC7C,CAAC,CAAC;wBACNjB;wBACAK;oBACF;gBACF;YACF;QACF;QACAa,SAAS;QACTC,OAAO;YACL,GAAIlB,UAAUkB,KAAK,IAAI,EAAE;YACzBC,cAAc;gBACZ,CAAC,EAAEC,GAAG,EAAEC,KAAK,EAAE;oBACb,MAAMC,SAAS5B,oBAAoB;wBACjC6B,gBAAgBrB;wBAChBsB,SAASJ,IAAII,OAAO;oBACtB;oBACA,IAAI,CAACH,OAAO;wBACV,MAAMI,mBAAmB9B,oBAAoByB,IAAIM,OAAO,EAAEJ;wBAC1D,IAAIG,kBAAkB;4BACpB,OAAOA;wBACT;wBACA,MAAM,IAAIjC,SAAS,4BAA4B,KAAK,MAAM;oBAC5D;oBAEA,OAAO8B,WAAW,WAAWK,WAAWN,SAASA;gBACnD;mBACIrB,WAAWkB,OAAOC,gBAAgB,EAAE;aACzC;QACH;QACAS,OAAO;QACPvB,UAAU,AAACA,YAAkDwB;QAC7D,8DAA8D;QAC9DC,OAAO9B,WAAW8B,SAAU,CAAA,CAAC,EAAEC,CAAC,EAAE,GAAKA,EAAE,iDAAgD;QACzFC,YAAY9B;QACZE;IACF;AACF,EAAC"}
1
+ {"version":3,"sources":["../../../src/fields/tenantField/index.ts"],"sourcesContent":["import type { RelationshipFieldSingleValidation, SingleRelationshipField } from 'payload'\n\nimport type { RootTenantFieldConfigOverrides } from '../../types.js'\n\nimport { defaults } from '../../defaults.js'\nimport { getCollectionIDType } from '../../utilities/getCollectionIDType.js'\nimport { getTenantFromCookie } from '../../utilities/getTenantFromCookie.js'\nimport { getUserTenantIDs } from '../../utilities/getUserTenantIDs.js'\n\nconst fieldValidation =\n (validateFunction?: RelationshipFieldSingleValidation): RelationshipFieldSingleValidation =>\n (value, options) => {\n if (validateFunction) {\n const result = validateFunction(value, options)\n if (result !== true) {\n return result\n }\n }\n\n if (!value) {\n return options.req.t('validation:required')\n }\n\n return true\n }\n\ntype Args = {\n debug?: boolean\n name: string\n overrides?: RootTenantFieldConfigOverrides\n tenantsArrayFieldName: string\n tenantsArrayTenantFieldName: string\n tenantsCollectionSlug: string\n unique: boolean\n}\nexport const tenantField = ({\n name = defaults.tenantFieldName,\n debug,\n overrides: _overrides = {},\n tenantsArrayFieldName = defaults.tenantsArrayFieldName,\n tenantsArrayTenantFieldName = defaults.tenantsArrayTenantFieldName,\n tenantsCollectionSlug = defaults.tenantCollectionSlug,\n unique,\n}: Args): SingleRelationshipField => {\n const { validate, ...overrides } = _overrides || {}\n return {\n ...(overrides || {}),\n name,\n type: 'relationship',\n access: overrides.access || {},\n admin: {\n allowCreate: false,\n allowEdit: false,\n disableListColumn: true,\n disableListFilter: true,\n position: 'sidebar',\n ...(overrides.admin || {}),\n components: {\n ...(overrides.admin?.components || {}),\n Field: {\n path: '@payloadcms/plugin-multi-tenant/client#TenantField',\n ...(typeof overrides.admin?.components?.Field !== 'string'\n ? overrides.admin?.components?.Field || {}\n : {}),\n clientProps: {\n ...(typeof overrides.admin?.components?.Field !== 'string'\n ? (overrides.admin?.components?.Field || {})?.clientProps\n : {}),\n debug,\n unique,\n },\n },\n },\n },\n defaultValue:\n overrides.defaultValue ||\n (async ({ req }) => {\n const idType = getCollectionIDType({\n collectionSlug: tenantsCollectionSlug,\n payload: req.payload,\n })\n const tenantFromCookie = getTenantFromCookie(req.headers, idType)\n if (tenantFromCookie) {\n const isValidTenant = await req.payload.count({\n collection: tenantsCollectionSlug,\n depth: 0,\n overrideAccess: false,\n req,\n user: req.user,\n where: {\n id: {\n equals: tenantFromCookie,\n },\n },\n })\n return isValidTenant ? tenantFromCookie : null\n }\n return null\n }),\n filterOptions:\n overrides.filterOptions ||\n (({ req }) => {\n const userAssignedTenants = getUserTenantIDs(req.user, {\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n })\n if (userAssignedTenants.length > 0) {\n return {\n id: {\n in: userAssignedTenants,\n },\n }\n }\n\n return true\n }),\n hasMany: false,\n index: true,\n relationTo: tenantsCollectionSlug,\n unique,\n // TODO: V4 - replace validation with required: true\n validate: fieldValidation(validate as RelationshipFieldSingleValidation),\n // @ts-expect-error translations are not typed for this plugin\n label: overrides.label || (({ t }) => t('plugin-multi-tenant:field-assignedTenant-label')),\n }\n}\n"],"names":["defaults","getCollectionIDType","getTenantFromCookie","getUserTenantIDs","fieldValidation","validateFunction","value","options","result","req","t","tenantField","name","tenantFieldName","debug","overrides","_overrides","tenantsArrayFieldName","tenantsArrayTenantFieldName","tenantsCollectionSlug","tenantCollectionSlug","unique","validate","type","access","admin","allowCreate","allowEdit","disableListColumn","disableListFilter","position","components","Field","path","clientProps","defaultValue","idType","collectionSlug","payload","tenantFromCookie","headers","isValidTenant","count","collection","depth","overrideAccess","user","where","id","equals","filterOptions","userAssignedTenants","length","in","hasMany","index","relationTo","label"],"mappings":"AAIA,SAASA,QAAQ,QAAQ,oBAAmB;AAC5C,SAASC,mBAAmB,QAAQ,yCAAwC;AAC5E,SAASC,mBAAmB,QAAQ,yCAAwC;AAC5E,SAASC,gBAAgB,QAAQ,sCAAqC;AAEtE,MAAMC,kBACJ,CAACC,mBACD,CAACC,OAAOC;QACN,IAAIF,kBAAkB;YACpB,MAAMG,SAASH,iBAAiBC,OAAOC;YACvC,IAAIC,WAAW,MAAM;gBACnB,OAAOA;YACT;QACF;QAEA,IAAI,CAACF,OAAO;YACV,OAAOC,QAAQE,GAAG,CAACC,CAAC,CAAC;QACvB;QAEA,OAAO;IACT;AAWF,OAAO,MAAMC,cAAc,CAAC,EAC1BC,OAAOZ,SAASa,eAAe,EAC/BC,KAAK,EACLC,WAAWC,aAAa,CAAC,CAAC,EAC1BC,wBAAwBjB,SAASiB,qBAAqB,EACtDC,8BAA8BlB,SAASkB,2BAA2B,EAClEC,wBAAwBnB,SAASoB,oBAAoB,EACrDC,MAAM,EACD;IACL,MAAM,EAAEC,QAAQ,EAAE,GAAGP,WAAW,GAAGC,cAAc,CAAC;IAClD,OAAO;QACL,GAAID,aAAa,CAAC,CAAC;QACnBH;QACAW,MAAM;QACNC,QAAQT,UAAUS,MAAM,IAAI,CAAC;QAC7BC,OAAO;YACLC,aAAa;YACbC,WAAW;YACXC,mBAAmB;YACnBC,mBAAmB;YACnBC,UAAU;YACV,GAAIf,UAAUU,KAAK,IAAI,CAAC,CAAC;YACzBM,YAAY;gBACV,GAAIhB,UAAUU,KAAK,EAAEM,cAAc,CAAC,CAAC;gBACrCC,OAAO;oBACLC,MAAM;oBACN,GAAI,OAAOlB,UAAUU,KAAK,EAAEM,YAAYC,UAAU,WAC9CjB,UAAUU,KAAK,EAAEM,YAAYC,SAAS,CAAC,IACvC,CAAC,CAAC;oBACNE,aAAa;wBACX,GAAI,OAAOnB,UAAUU,KAAK,EAAEM,YAAYC,UAAU,WAC7CjB,CAAAA,UAAUU,KAAK,EAAEM,YAAYC,SAAS,CAAC,CAAA,GAAIE,cAC5C,CAAC,CAAC;wBACNpB;wBACAO;oBACF;gBACF;YACF;QACF;QACAc,cACEpB,UAAUoB,YAAY,IACrB,CAAA,OAAO,EAAE1B,GAAG,EAAE;YACb,MAAM2B,SAASnC,oBAAoB;gBACjCoC,gBAAgBlB;gBAChBmB,SAAS7B,IAAI6B,OAAO;YACtB;YACA,MAAMC,mBAAmBrC,oBAAoBO,IAAI+B,OAAO,EAAEJ;YAC1D,IAAIG,kBAAkB;gBACpB,MAAME,gBAAgB,MAAMhC,IAAI6B,OAAO,CAACI,KAAK,CAAC;oBAC5CC,YAAYxB;oBACZyB,OAAO;oBACPC,gBAAgB;oBAChBpC;oBACAqC,MAAMrC,IAAIqC,IAAI;oBACdC,OAAO;wBACLC,IAAI;4BACFC,QAAQV;wBACV;oBACF;gBACF;gBACA,OAAOE,gBAAgBF,mBAAmB;YAC5C;YACA,OAAO;QACT,CAAA;QACFW,eACEnC,UAAUmC,aAAa,IACtB,CAAA,CAAC,EAAEzC,GAAG,EAAE;YACP,MAAM0C,sBAAsBhD,iBAAiBM,IAAIqC,IAAI,EAAE;gBACrD7B;gBACAC;YACF;YACA,IAAIiC,oBAAoBC,MAAM,GAAG,GAAG;gBAClC,OAAO;oBACLJ,IAAI;wBACFK,IAAIF;oBACN;gBACF;YACF;YAEA,OAAO;QACT,CAAA;QACFG,SAAS;QACTC,OAAO;QACPC,YAAYrC;QACZE;QACA,oDAAoD;QACpDC,UAAUlB,gBAAgBkB;QAC1B,8DAA8D;QAC9DmC,OAAO1C,UAAU0C,KAAK,IAAK,CAAA,CAAC,EAAE/C,CAAC,EAAE,GAAKA,EAAE,iDAAgD;IAC1F;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAoB,MAAM,EAAE,MAAM,SAAS,CAAA;AAKvD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AAazD,eAAO,MAAM,iBAAiB,GAC3B,UAAU,gBAAgB,uBAAuB,CAAC,UAAU,CAAC,sBAC7C,MAAM,KAAG,MAiXzB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAoB,MAAM,EAAE,MAAM,SAAS,CAAA;AAKvD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AAazD,eAAO,MAAM,iBAAiB,GAC3B,UAAU,gBAAgB,uBAAuB,CAAC,UAAU,CAAC,sBAC7C,MAAM,KAAG,MAodzB,CAAA"}
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ import chalk from 'chalk';
1
2
  import { defaults } from './defaults.js';
2
3
  import { getTenantOptionsEndpoint } from './endpoints/getTenantOptionsEndpoint.js';
3
4
  import { tenantField } from './fields/tenantField/index.js';
@@ -102,6 +103,63 @@ export const multiTenantPlugin = (pluginConfig)=>(incomingConfig)=>{
102
103
  [],
103
104
  []
104
105
  ]);
106
+ // used to validate enabled collection slugs
107
+ const multiTenantCollectionsFound = [];
108
+ /**
109
+ * The folders collection is added AFTER the plugin is initialized
110
+ * so if they added the folder slug to the plugin collections,
111
+ * we can assume that they have folders enabled
112
+ */ const foldersSlug = incomingConfig.folders ? incomingConfig.folders.slug || 'payload-folders' : 'payload-folders';
113
+ if (collectionSlugs.includes(foldersSlug)) {
114
+ multiTenantCollectionsFound.push(foldersSlug);
115
+ const overrides = pluginConfig.collections[foldersSlug]?.tenantFieldOverrides ? pluginConfig.collections[foldersSlug]?.tenantFieldOverrides : pluginConfig.tenantField || {};
116
+ incomingConfig.folders = incomingConfig.folders || {};
117
+ incomingConfig.folders.collectionOverrides = incomingConfig.folders.collectionOverrides || [];
118
+ incomingConfig.folders.collectionOverrides.push(({ collection })=>{
119
+ /**
120
+ * Add tenant field to enabled collections
121
+ */ const folderTenantField = tenantField({
122
+ ...pluginConfig?.tenantField || {},
123
+ name: tenantFieldName,
124
+ debug: pluginConfig.debug,
125
+ overrides,
126
+ tenantsArrayFieldName,
127
+ tenantsArrayTenantFieldName,
128
+ tenantsCollectionSlug,
129
+ unique: false
130
+ });
131
+ collection.fields.unshift(folderTenantField);
132
+ if (pluginConfig.collections[foldersSlug]?.useBaseListFilter !== false) {
133
+ /**
134
+ * Add list filter to enabled collections
135
+ * - filters results by selected tenant
136
+ */ collection.admin = collection.admin || {};
137
+ collection.admin.baseFilter = combineFilters({
138
+ baseFilter: collection.admin?.baseFilter ?? collection.admin?.baseListFilter,
139
+ customFilter: (args)=>filterDocumentsByTenants({
140
+ filterFieldName: tenantFieldName,
141
+ req: args.req,
142
+ tenantsArrayFieldName,
143
+ tenantsArrayTenantFieldName,
144
+ tenantsCollectionSlug
145
+ })
146
+ });
147
+ }
148
+ if (pluginConfig.collections[foldersSlug]?.useTenantAccess !== false) {
149
+ /**
150
+ * Add access control constraint to tenant enabled folders collection
151
+ */ addCollectionAccess({
152
+ adminUsersSlug: adminUsersCollection.slug,
153
+ collection,
154
+ fieldName: tenantFieldName,
155
+ tenantsArrayFieldName,
156
+ tenantsArrayTenantFieldName,
157
+ userHasAccessToAllTenants
158
+ });
159
+ }
160
+ return collection;
161
+ });
162
+ }
105
163
  /**
106
164
  * Modify collections
107
165
  */ incomingConfig.collections.forEach((collection)=>{
@@ -183,6 +241,7 @@ export const multiTenantPlugin = (pluginConfig)=>(incomingConfig)=>{
183
241
  })
184
242
  ];
185
243
  } else if (pluginConfig.collections?.[collection.slug]) {
244
+ multiTenantCollectionsFound.push(collection.slug);
186
245
  const isGlobal = Boolean(pluginConfig.collections[collection.slug]?.isGlobal);
187
246
  if (isGlobal) {
188
247
  collection.disableDuplicate = true;
@@ -195,6 +254,8 @@ export const multiTenantPlugin = (pluginConfig)=>(incomingConfig)=>{
195
254
  tenantEnabledCollectionSlugs: collectionSlugs,
196
255
  tenantEnabledGlobalSlugs: globalCollectionSlugs,
197
256
  tenantFieldName,
257
+ tenantsArrayFieldName,
258
+ tenantsArrayTenantFieldName,
198
259
  tenantsCollectionSlug
199
260
  });
200
261
  const overrides = pluginConfig.collections[collection.slug]?.tenantFieldOverrides ? pluginConfig.collections[collection.slug]?.tenantFieldOverrides : pluginConfig.tenantField || {};
@@ -204,6 +265,8 @@ export const multiTenantPlugin = (pluginConfig)=>(incomingConfig)=>{
204
265
  name: tenantFieldName,
205
266
  debug: pluginConfig.debug,
206
267
  overrides,
268
+ tenantsArrayFieldName,
269
+ tenantsArrayTenantFieldName,
207
270
  tenantsCollectionSlug,
208
271
  unique: isGlobal
209
272
  }));
@@ -244,6 +307,14 @@ export const multiTenantPlugin = (pluginConfig)=>(incomingConfig)=>{
244
307
  if (!tenantCollection) {
245
308
  throw new Error(`Tenants collection not found with slug: ${tenantsCollectionSlug}`);
246
309
  }
310
+ if (multiTenantCollectionsFound.length !== collectionSlugs.length + globalCollectionSlugs.length) {
311
+ const missingSlugs = [
312
+ ...collectionSlugs,
313
+ ...globalCollectionSlugs
314
+ ].filter((slug)=>!multiTenantCollectionsFound.includes(slug));
315
+ // eslint-disable-next-line no-console
316
+ console.error(chalk.yellow.bold('WARNING (plugin-multi-tenant)'), 'missing collections', missingSlugs, 'try placing the multi-tenant plugin after other plugins.');
317
+ }
247
318
  /**
248
319
  * Add TenantSelectionProvider to admin providers
249
320
  */ incomingConfig.admin.components.providers.push({
@@ -277,9 +348,15 @@ export const multiTenantPlugin = (pluginConfig)=>(incomingConfig)=>{
277
348
  * Add tenant selector to admin UI
278
349
  */ incomingConfig.admin.components.beforeNavLinks.push({
279
350
  clientProps: {
351
+ enabledSlugs: [
352
+ ...collectionSlugs,
353
+ ...globalCollectionSlugs,
354
+ adminUsersCollection.slug,
355
+ tenantCollection.slug
356
+ ],
280
357
  label: pluginConfig.tenantSelectorLabel || undefined
281
358
  },
282
- path: '@payloadcms/plugin-multi-tenant/client#TenantSelector'
359
+ path: '@payloadcms/plugin-multi-tenant/rsc#TenantSelector'
283
360
  });
284
361
  /**
285
362
  * Merge plugin translations
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { AcceptedLanguages } from '@payloadcms/translations'\nimport type { CollectionConfig, Config } from 'payload'\n\nimport { deepMergeSimple } from 'payload'\n\nimport type { PluginDefaultTranslationsObject } from './translations/types.js'\nimport type { MultiTenantPluginConfig } from './types.js'\n\nimport { defaults } from './defaults.js'\nimport { getTenantOptionsEndpoint } from './endpoints/getTenantOptionsEndpoint.js'\nimport { tenantField } from './fields/tenantField/index.js'\nimport { tenantsArrayField } from './fields/tenantsArrayField/index.js'\nimport { filterDocumentsByTenants } from './filters/filterDocumentsByTenants.js'\nimport { addTenantCleanup } from './hooks/afterTenantDelete.js'\nimport { translations } from './translations/index.js'\nimport { addCollectionAccess } from './utilities/addCollectionAccess.js'\nimport { addFilterOptionsToFields } from './utilities/addFilterOptionsToFields.js'\nimport { combineFilters } from './utilities/combineFilters.js'\n\nexport const multiTenantPlugin =\n <ConfigType>(pluginConfig: MultiTenantPluginConfig<ConfigType>) =>\n (incomingConfig: Config): Config => {\n if (pluginConfig.enabled === false) {\n return incomingConfig\n }\n\n /**\n * Set defaults\n */\n const userHasAccessToAllTenants: Required<\n MultiTenantPluginConfig<ConfigType>\n >['userHasAccessToAllTenants'] =\n typeof pluginConfig.userHasAccessToAllTenants === 'function'\n ? pluginConfig.userHasAccessToAllTenants\n : () => false\n const tenantsCollectionSlug = (pluginConfig.tenantsSlug =\n pluginConfig.tenantsSlug || defaults.tenantCollectionSlug)\n const tenantFieldName = pluginConfig?.tenantField?.name || defaults.tenantFieldName\n const tenantsArrayFieldName =\n pluginConfig?.tenantsArrayField?.arrayFieldName || defaults.tenantsArrayFieldName\n const tenantsArrayTenantFieldName =\n pluginConfig?.tenantsArrayField?.arrayTenantFieldName || defaults.tenantsArrayTenantFieldName\n const basePath = pluginConfig.basePath || defaults.basePath\n\n /**\n * Add defaults for admin properties\n */\n if (!incomingConfig.admin) {\n incomingConfig.admin = {}\n }\n if (!incomingConfig.admin?.components) {\n incomingConfig.admin.components = {\n actions: [],\n beforeNavLinks: [],\n providers: [],\n }\n }\n if (!incomingConfig.admin.components?.providers) {\n incomingConfig.admin.components.providers = []\n }\n if (!incomingConfig.admin.components?.actions) {\n incomingConfig.admin.components.actions = []\n }\n if (!incomingConfig.admin.components?.beforeNavLinks) {\n incomingConfig.admin.components.beforeNavLinks = []\n }\n if (!incomingConfig.collections) {\n incomingConfig.collections = []\n }\n\n /**\n * Add tenants array field to users collection\n */\n const adminUsersCollection = incomingConfig.collections.find(({ slug, auth }) => {\n if (incomingConfig.admin?.user) {\n return slug === incomingConfig.admin.user\n } else if (auth) {\n return true\n }\n })\n\n if (!adminUsersCollection) {\n throw Error('An auth enabled collection was not found')\n }\n\n /**\n * Add tenants array field to users collection\n */\n if (pluginConfig?.tenantsArrayField?.includeDefaultField !== false) {\n adminUsersCollection.fields.push(\n tenantsArrayField({\n ...(pluginConfig?.tenantsArrayField || {}),\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n }),\n )\n }\n\n addCollectionAccess({\n adminUsersSlug: adminUsersCollection.slug,\n collection: adminUsersCollection,\n fieldName: `${tenantsArrayFieldName}.${tenantsArrayTenantFieldName}`,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n userHasAccessToAllTenants,\n })\n\n if (pluginConfig.useUsersTenantFilter !== false) {\n if (!adminUsersCollection.admin) {\n adminUsersCollection.admin = {}\n }\n\n const baseFilter =\n adminUsersCollection.admin?.baseFilter ?? adminUsersCollection.admin?.baseListFilter\n adminUsersCollection.admin.baseFilter = combineFilters({\n baseFilter,\n customFilter: (args) =>\n filterDocumentsByTenants({\n filterFieldName: `${tenantsArrayFieldName}.${tenantsArrayTenantFieldName}`,\n req: args.req,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n }),\n })\n }\n\n let tenantCollection: CollectionConfig | undefined\n\n const [collectionSlugs, globalCollectionSlugs] = Object.keys(pluginConfig.collections).reduce<\n [string[], string[]]\n >(\n (acc, slug) => {\n if (pluginConfig?.collections?.[slug]?.isGlobal) {\n acc[1].push(slug)\n } else {\n acc[0].push(slug)\n }\n\n return acc\n },\n [[], []],\n )\n\n /**\n * Modify collections\n */\n incomingConfig.collections.forEach((collection) => {\n /**\n * Modify tenants collection\n */\n if (collection.slug === tenantsCollectionSlug) {\n tenantCollection = collection\n\n if (pluginConfig.useTenantsCollectionAccess !== false) {\n /**\n * Add access control constraint to tenants collection\n * - constrains access a users assigned tenants\n */\n addCollectionAccess({\n adminUsersSlug: adminUsersCollection.slug,\n collection,\n fieldName: 'id',\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n userHasAccessToAllTenants,\n })\n }\n\n if (pluginConfig.useTenantsListFilter !== false) {\n /**\n * Add list filter to tenants collection\n * - filter by selected tenant\n */\n if (!collection.admin) {\n collection.admin = {}\n }\n\n const baseFilter = collection.admin?.baseFilter ?? collection.admin?.baseListFilter\n collection.admin.baseFilter = combineFilters({\n baseFilter,\n customFilter: (args) =>\n filterDocumentsByTenants({\n filterFieldName: 'id',\n req: args.req,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n }),\n })\n }\n\n if (pluginConfig.cleanupAfterTenantDelete !== false) {\n /**\n * Add cleanup logic when tenant is deleted\n * - delete documents related to tenant\n * - remove tenant from users\n */\n addTenantCleanup({\n collection,\n enabledSlugs: [...collectionSlugs, ...globalCollectionSlugs],\n tenantFieldName,\n tenantsCollectionSlug,\n usersSlug: adminUsersCollection.slug,\n usersTenantsArrayFieldName: tenantsArrayFieldName,\n usersTenantsArrayTenantFieldName: tenantsArrayTenantFieldName,\n })\n }\n\n /**\n * Add custom tenant field that watches and dispatches updates to the selector\n */\n collection.fields.push({\n name: '_watchTenant',\n type: 'ui',\n admin: {\n components: {\n Field: {\n path: '@payloadcms/plugin-multi-tenant/client#WatchTenantCollection',\n },\n },\n },\n })\n\n collection.endpoints = [\n ...(collection.endpoints || []),\n getTenantOptionsEndpoint<ConfigType>({\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n useAsTitle: tenantCollection.admin?.useAsTitle || 'id',\n userHasAccessToAllTenants,\n }),\n ]\n } else if (pluginConfig.collections?.[collection.slug]) {\n const isGlobal = Boolean(pluginConfig.collections[collection.slug]?.isGlobal)\n\n if (isGlobal) {\n collection.disableDuplicate = true\n }\n\n /**\n * Modify enabled collections\n */\n addFilterOptionsToFields({\n config: incomingConfig,\n fields: collection.fields,\n tenantEnabledCollectionSlugs: collectionSlugs,\n tenantEnabledGlobalSlugs: globalCollectionSlugs,\n tenantFieldName,\n tenantsCollectionSlug,\n })\n\n const overrides = pluginConfig.collections[collection.slug]?.tenantFieldOverrides\n ? pluginConfig.collections[collection.slug]?.tenantFieldOverrides\n : pluginConfig.tenantField || {}\n\n /**\n * Add tenant field to enabled collections\n */\n collection.fields.splice(\n 0,\n 0,\n tenantField({\n name: tenantFieldName,\n debug: pluginConfig.debug,\n overrides,\n tenantsCollectionSlug,\n unique: isGlobal,\n }),\n )\n\n const { useBaseFilter, useBaseListFilter } = pluginConfig.collections[collection.slug] || {}\n\n if (useBaseFilter ?? useBaseListFilter ?? true) {\n /**\n * Add list filter to enabled collections\n * - filters results by selected tenant\n */\n if (!collection.admin) {\n collection.admin = {}\n }\n\n const baseFilter = collection.admin?.baseFilter ?? collection.admin?.baseListFilter\n collection.admin.baseFilter = combineFilters({\n baseFilter,\n customFilter: (args) =>\n filterDocumentsByTenants({\n filterFieldName: tenantFieldName,\n req: args.req,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n }),\n })\n }\n\n if (pluginConfig.collections[collection.slug]?.useTenantAccess !== false) {\n /**\n * Add access control constraint to tenant enabled collection\n */\n addCollectionAccess({\n adminUsersSlug: adminUsersCollection.slug,\n collection,\n fieldName: tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n userHasAccessToAllTenants,\n })\n }\n }\n })\n\n if (!tenantCollection) {\n throw new Error(`Tenants collection not found with slug: ${tenantsCollectionSlug}`)\n }\n\n /**\n * Add TenantSelectionProvider to admin providers\n */\n incomingConfig.admin.components.providers.push({\n clientProps: {\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug: tenantCollection.slug,\n useAsTitle: tenantCollection.admin?.useAsTitle || 'id',\n userHasAccessToAllTenants,\n },\n path: '@payloadcms/plugin-multi-tenant/rsc#TenantSelectionProvider',\n })\n\n /**\n * Add global redirect action\n */\n if (globalCollectionSlugs.length) {\n incomingConfig.admin.components.actions.push({\n path: '@payloadcms/plugin-multi-tenant/rsc#GlobalViewRedirect',\n serverProps: {\n basePath,\n globalSlugs: globalCollectionSlugs,\n tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n useAsTitle: tenantCollection.admin?.useAsTitle || 'id',\n userHasAccessToAllTenants,\n },\n })\n }\n\n /**\n * Add tenant selector to admin UI\n */\n incomingConfig.admin.components.beforeNavLinks.push({\n clientProps: {\n label: pluginConfig.tenantSelectorLabel || undefined,\n },\n path: '@payloadcms/plugin-multi-tenant/client#TenantSelector',\n })\n\n /**\n * Merge plugin translations\n */\n if (!incomingConfig.i18n) {\n incomingConfig.i18n = {}\n }\n Object.entries(translations).forEach(([locale, pluginI18nObject]) => {\n const typedLocale = locale as AcceptedLanguages\n if (!incomingConfig.i18n!.translations) {\n incomingConfig.i18n!.translations = {}\n }\n if (!(typedLocale in incomingConfig.i18n!.translations)) {\n incomingConfig.i18n!.translations[typedLocale] = {}\n }\n if (!('plugin-multi-tenant' in incomingConfig.i18n!.translations[typedLocale]!)) {\n ;(incomingConfig.i18n!.translations[typedLocale] as PluginDefaultTranslationsObject)[\n 'plugin-multi-tenant'\n ] = {} as PluginDefaultTranslationsObject['plugin-multi-tenant']\n }\n\n ;(incomingConfig.i18n!.translations[typedLocale] as PluginDefaultTranslationsObject)[\n 'plugin-multi-tenant'\n ] = {\n ...pluginI18nObject.translations['plugin-multi-tenant'],\n ...(pluginConfig.i18n?.translations?.[typedLocale] || {}),\n }\n })\n\n return incomingConfig\n }\n"],"names":["defaults","getTenantOptionsEndpoint","tenantField","tenantsArrayField","filterDocumentsByTenants","addTenantCleanup","translations","addCollectionAccess","addFilterOptionsToFields","combineFilters","multiTenantPlugin","pluginConfig","incomingConfig","enabled","userHasAccessToAllTenants","tenantsCollectionSlug","tenantsSlug","tenantCollectionSlug","tenantFieldName","name","tenantsArrayFieldName","arrayFieldName","tenantsArrayTenantFieldName","arrayTenantFieldName","basePath","admin","components","actions","beforeNavLinks","providers","collections","adminUsersCollection","find","slug","auth","user","Error","includeDefaultField","fields","push","adminUsersSlug","collection","fieldName","useUsersTenantFilter","baseFilter","baseListFilter","customFilter","args","filterFieldName","req","tenantCollection","collectionSlugs","globalCollectionSlugs","Object","keys","reduce","acc","isGlobal","forEach","useTenantsCollectionAccess","useTenantsListFilter","cleanupAfterTenantDelete","enabledSlugs","usersSlug","usersTenantsArrayFieldName","usersTenantsArrayTenantFieldName","type","Field","path","endpoints","useAsTitle","Boolean","disableDuplicate","config","tenantEnabledCollectionSlugs","tenantEnabledGlobalSlugs","overrides","tenantFieldOverrides","splice","debug","unique","useBaseFilter","useBaseListFilter","useTenantAccess","clientProps","length","serverProps","globalSlugs","label","tenantSelectorLabel","undefined","i18n","entries","locale","pluginI18nObject","typedLocale"],"mappings":"AAQA,SAASA,QAAQ,QAAQ,gBAAe;AACxC,SAASC,wBAAwB,QAAQ,0CAAyC;AAClF,SAASC,WAAW,QAAQ,gCAA+B;AAC3D,SAASC,iBAAiB,QAAQ,sCAAqC;AACvE,SAASC,wBAAwB,QAAQ,wCAAuC;AAChF,SAASC,gBAAgB,QAAQ,+BAA8B;AAC/D,SAASC,YAAY,QAAQ,0BAAyB;AACtD,SAASC,mBAAmB,QAAQ,qCAAoC;AACxE,SAASC,wBAAwB,QAAQ,0CAAyC;AAClF,SAASC,cAAc,QAAQ,gCAA+B;AAE9D,OAAO,MAAMC,oBACX,CAAaC,eACb,CAACC;QACC,IAAID,aAAaE,OAAO,KAAK,OAAO;YAClC,OAAOD;QACT;QAEA;;KAEC,GACD,MAAME,4BAGJ,OAAOH,aAAaG,yBAAyB,KAAK,aAC9CH,aAAaG,yBAAyB,GACtC,IAAM;QACZ,MAAMC,wBAAyBJ,aAAaK,WAAW,GACrDL,aAAaK,WAAW,IAAIhB,SAASiB,oBAAoB;QAC3D,MAAMC,kBAAkBP,cAAcT,aAAaiB,QAAQnB,SAASkB,eAAe;QACnF,MAAME,wBACJT,cAAcR,mBAAmBkB,kBAAkBrB,SAASoB,qBAAqB;QACnF,MAAME,8BACJX,cAAcR,mBAAmBoB,wBAAwBvB,SAASsB,2BAA2B;QAC/F,MAAME,WAAWb,aAAaa,QAAQ,IAAIxB,SAASwB,QAAQ;QAE3D;;KAEC,GACD,IAAI,CAACZ,eAAea,KAAK,EAAE;YACzBb,eAAea,KAAK,GAAG,CAAC;QAC1B;QACA,IAAI,CAACb,eAAea,KAAK,EAAEC,YAAY;YACrCd,eAAea,KAAK,CAACC,UAAU,GAAG;gBAChCC,SAAS,EAAE;gBACXC,gBAAgB,EAAE;gBAClBC,WAAW,EAAE;YACf;QACF;QACA,IAAI,CAACjB,eAAea,KAAK,CAACC,UAAU,EAAEG,WAAW;YAC/CjB,eAAea,KAAK,CAACC,UAAU,CAACG,SAAS,GAAG,EAAE;QAChD;QACA,IAAI,CAACjB,eAAea,KAAK,CAACC,UAAU,EAAEC,SAAS;YAC7Cf,eAAea,KAAK,CAACC,UAAU,CAACC,OAAO,GAAG,EAAE;QAC9C;QACA,IAAI,CAACf,eAAea,KAAK,CAACC,UAAU,EAAEE,gBAAgB;YACpDhB,eAAea,KAAK,CAACC,UAAU,CAACE,cAAc,GAAG,EAAE;QACrD;QACA,IAAI,CAAChB,eAAekB,WAAW,EAAE;YAC/BlB,eAAekB,WAAW,GAAG,EAAE;QACjC;QAEA;;KAEC,GACD,MAAMC,uBAAuBnB,eAAekB,WAAW,CAACE,IAAI,CAAC,CAAC,EAAEC,IAAI,EAAEC,IAAI,EAAE;YAC1E,IAAItB,eAAea,KAAK,EAAEU,MAAM;gBAC9B,OAAOF,SAASrB,eAAea,KAAK,CAACU,IAAI;YAC3C,OAAO,IAAID,MAAM;gBACf,OAAO;YACT;QACF;QAEA,IAAI,CAACH,sBAAsB;YACzB,MAAMK,MAAM;QACd;QAEA;;KAEC,GACD,IAAIzB,cAAcR,mBAAmBkC,wBAAwB,OAAO;YAClEN,qBAAqBO,MAAM,CAACC,IAAI,CAC9BpC,kBAAkB;gBAChB,GAAIQ,cAAcR,qBAAqB,CAAC,CAAC;gBACzCiB;gBACAE;gBACAP;YACF;QAEJ;QAEAR,oBAAoB;YAClBiC,gBAAgBT,qBAAqBE,IAAI;YACzCQ,YAAYV;YACZW,WAAW,GAAGtB,sBAAsB,CAAC,EAAEE,6BAA6B;YACpEF;YACAE;YACAR;QACF;QAEA,IAAIH,aAAagC,oBAAoB,KAAK,OAAO;YAC/C,IAAI,CAACZ,qBAAqBN,KAAK,EAAE;gBAC/BM,qBAAqBN,KAAK,GAAG,CAAC;YAChC;YAEA,MAAMmB,aACJb,qBAAqBN,KAAK,EAAEmB,cAAcb,qBAAqBN,KAAK,EAAEoB;YACxEd,qBAAqBN,KAAK,CAACmB,UAAU,GAAGnC,eAAe;gBACrDmC;gBACAE,cAAc,CAACC,OACb3C,yBAAyB;wBACvB4C,iBAAiB,GAAG5B,sBAAsB,CAAC,EAAEE,6BAA6B;wBAC1E2B,KAAKF,KAAKE,GAAG;wBACb7B;wBACAE;wBACAP;oBACF;YACJ;QACF;QAEA,IAAImC;QAEJ,MAAM,CAACC,iBAAiBC,sBAAsB,GAAGC,OAAOC,IAAI,CAAC3C,aAAamB,WAAW,EAAEyB,MAAM,CAG3F,CAACC,KAAKvB;YACJ,IAAItB,cAAcmB,aAAa,CAACG,KAAK,EAAEwB,UAAU;gBAC/CD,GAAG,CAAC,EAAE,CAACjB,IAAI,CAACN;YACd,OAAO;gBACLuB,GAAG,CAAC,EAAE,CAACjB,IAAI,CAACN;YACd;YAEA,OAAOuB;QACT,GACA;YAAC,EAAE;YAAE,EAAE;SAAC;QAGV;;KAEC,GACD5C,eAAekB,WAAW,CAAC4B,OAAO,CAAC,CAACjB;YAClC;;OAEC,GACD,IAAIA,WAAWR,IAAI,KAAKlB,uBAAuB;gBAC7CmC,mBAAmBT;gBAEnB,IAAI9B,aAAagD,0BAA0B,KAAK,OAAO;oBACrD;;;WAGC,GACDpD,oBAAoB;wBAClBiC,gBAAgBT,qBAAqBE,IAAI;wBACzCQ;wBACAC,WAAW;wBACXtB;wBACAE;wBACAR;oBACF;gBACF;gBAEA,IAAIH,aAAaiD,oBAAoB,KAAK,OAAO;oBAC/C;;;WAGC,GACD,IAAI,CAACnB,WAAWhB,KAAK,EAAE;wBACrBgB,WAAWhB,KAAK,GAAG,CAAC;oBACtB;oBAEA,MAAMmB,aAAaH,WAAWhB,KAAK,EAAEmB,cAAcH,WAAWhB,KAAK,EAAEoB;oBACrEJ,WAAWhB,KAAK,CAACmB,UAAU,GAAGnC,eAAe;wBAC3CmC;wBACAE,cAAc,CAACC,OACb3C,yBAAyB;gCACvB4C,iBAAiB;gCACjBC,KAAKF,KAAKE,GAAG;gCACb7B;gCACAE;gCACAP;4BACF;oBACJ;gBACF;gBAEA,IAAIJ,aAAakD,wBAAwB,KAAK,OAAO;oBACnD;;;;WAIC,GACDxD,iBAAiB;wBACfoC;wBACAqB,cAAc;+BAAIX;+BAAoBC;yBAAsB;wBAC5DlC;wBACAH;wBACAgD,WAAWhC,qBAAqBE,IAAI;wBACpC+B,4BAA4B5C;wBAC5B6C,kCAAkC3C;oBACpC;gBACF;gBAEA;;SAEC,GACDmB,WAAWH,MAAM,CAACC,IAAI,CAAC;oBACrBpB,MAAM;oBACN+C,MAAM;oBACNzC,OAAO;wBACLC,YAAY;4BACVyC,OAAO;gCACLC,MAAM;4BACR;wBACF;oBACF;gBACF;gBAEA3B,WAAW4B,SAAS,GAAG;uBACjB5B,WAAW4B,SAAS,IAAI,EAAE;oBAC9BpE,yBAAqC;wBACnCmB;wBACAE;wBACAP;wBACAuD,YAAYpB,iBAAiBzB,KAAK,EAAE6C,cAAc;wBAClDxD;oBACF;iBACD;YACH,OAAO,IAAIH,aAAamB,WAAW,EAAE,CAACW,WAAWR,IAAI,CAAC,EAAE;gBACtD,MAAMwB,WAAWc,QAAQ5D,aAAamB,WAAW,CAACW,WAAWR,IAAI,CAAC,EAAEwB;gBAEpE,IAAIA,UAAU;oBACZhB,WAAW+B,gBAAgB,GAAG;gBAChC;gBAEA;;SAEC,GACDhE,yBAAyB;oBACvBiE,QAAQ7D;oBACR0B,QAAQG,WAAWH,MAAM;oBACzBoC,8BAA8BvB;oBAC9BwB,0BAA0BvB;oBAC1BlC;oBACAH;gBACF;gBAEA,MAAM6D,YAAYjE,aAAamB,WAAW,CAACW,WAAWR,IAAI,CAAC,EAAE4C,uBACzDlE,aAAamB,WAAW,CAACW,WAAWR,IAAI,CAAC,EAAE4C,uBAC3ClE,aAAaT,WAAW,IAAI,CAAC;gBAEjC;;SAEC,GACDuC,WAAWH,MAAM,CAACwC,MAAM,CACtB,GACA,GACA5E,YAAY;oBACViB,MAAMD;oBACN6D,OAAOpE,aAAaoE,KAAK;oBACzBH;oBACA7D;oBACAiE,QAAQvB;gBACV;gBAGF,MAAM,EAAEwB,aAAa,EAAEC,iBAAiB,EAAE,GAAGvE,aAAamB,WAAW,CAACW,WAAWR,IAAI,CAAC,IAAI,CAAC;gBAE3F,IAAIgD,iBAAiBC,qBAAqB,MAAM;oBAC9C;;;WAGC,GACD,IAAI,CAACzC,WAAWhB,KAAK,EAAE;wBACrBgB,WAAWhB,KAAK,GAAG,CAAC;oBACtB;oBAEA,MAAMmB,aAAaH,WAAWhB,KAAK,EAAEmB,cAAcH,WAAWhB,KAAK,EAAEoB;oBACrEJ,WAAWhB,KAAK,CAACmB,UAAU,GAAGnC,eAAe;wBAC3CmC;wBACAE,cAAc,CAACC,OACb3C,yBAAyB;gCACvB4C,iBAAiB9B;gCACjB+B,KAAKF,KAAKE,GAAG;gCACb7B;gCACAE;gCACAP;4BACF;oBACJ;gBACF;gBAEA,IAAIJ,aAAamB,WAAW,CAACW,WAAWR,IAAI,CAAC,EAAEkD,oBAAoB,OAAO;oBACxE;;WAEC,GACD5E,oBAAoB;wBAClBiC,gBAAgBT,qBAAqBE,IAAI;wBACzCQ;wBACAC,WAAWxB;wBACXE;wBACAE;wBACAR;oBACF;gBACF;YACF;QACF;QAEA,IAAI,CAACoC,kBAAkB;YACrB,MAAM,IAAId,MAAM,CAAC,wCAAwC,EAAErB,uBAAuB;QACpF;QAEA;;KAEC,GACDH,eAAea,KAAK,CAACC,UAAU,CAACG,SAAS,CAACU,IAAI,CAAC;YAC7C6C,aAAa;gBACXhE;gBACAE;gBACAP,uBAAuBmC,iBAAiBjB,IAAI;gBAC5CqC,YAAYpB,iBAAiBzB,KAAK,EAAE6C,cAAc;gBAClDxD;YACF;YACAsD,MAAM;QACR;QAEA;;KAEC,GACD,IAAIhB,sBAAsBiC,MAAM,EAAE;YAChCzE,eAAea,KAAK,CAACC,UAAU,CAACC,OAAO,CAACY,IAAI,CAAC;gBAC3C6B,MAAM;gBACNkB,aAAa;oBACX9D;oBACA+D,aAAanC;oBACblC;oBACAE;oBACAE;oBACAP;oBACAuD,YAAYpB,iBAAiBzB,KAAK,EAAE6C,cAAc;oBAClDxD;gBACF;YACF;QACF;QAEA;;KAEC,GACDF,eAAea,KAAK,CAACC,UAAU,CAACE,cAAc,CAACW,IAAI,CAAC;YAClD6C,aAAa;gBACXI,OAAO7E,aAAa8E,mBAAmB,IAAIC;YAC7C;YACAtB,MAAM;QACR;QAEA;;KAEC,GACD,IAAI,CAACxD,eAAe+E,IAAI,EAAE;YACxB/E,eAAe+E,IAAI,GAAG,CAAC;QACzB;QACAtC,OAAOuC,OAAO,CAACtF,cAAcoD,OAAO,CAAC,CAAC,CAACmC,QAAQC,iBAAiB;YAC9D,MAAMC,cAAcF;YACpB,IAAI,CAACjF,eAAe+E,IAAI,CAAErF,YAAY,EAAE;gBACtCM,eAAe+E,IAAI,CAAErF,YAAY,GAAG,CAAC;YACvC;YACA,IAAI,CAAEyF,CAAAA,eAAenF,eAAe+E,IAAI,CAAErF,YAAY,AAAD,GAAI;gBACvDM,eAAe+E,IAAI,CAAErF,YAAY,CAACyF,YAAY,GAAG,CAAC;YACpD;YACA,IAAI,CAAE,CAAA,yBAAyBnF,eAAe+E,IAAI,CAAErF,YAAY,CAACyF,YAAY,GAAI;;gBAC7EnF,eAAe+E,IAAI,CAAErF,YAAY,CAACyF,YAAY,AAAoC,CAClF,sBACD,GAAG,CAAC;YACP;;YAEEnF,eAAe+E,IAAI,CAAErF,YAAY,CAACyF,YAAY,AAAoC,CAClF,sBACD,GAAG;gBACF,GAAGD,iBAAiBxF,YAAY,CAAC,sBAAsB;gBACvD,GAAIK,aAAagF,IAAI,EAAErF,cAAc,CAACyF,YAAY,IAAI,CAAC,CAAC;YAC1D;QACF;QAEA,OAAOnF;IACT,EAAC"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { AcceptedLanguages } from '@payloadcms/translations'\nimport type { CollectionConfig, Config } from 'payload'\n\nimport chalk from 'chalk'\n\nimport type { PluginDefaultTranslationsObject } from './translations/types.js'\nimport type { MultiTenantPluginConfig } from './types.js'\n\nimport { defaults } from './defaults.js'\nimport { getTenantOptionsEndpoint } from './endpoints/getTenantOptionsEndpoint.js'\nimport { tenantField } from './fields/tenantField/index.js'\nimport { tenantsArrayField } from './fields/tenantsArrayField/index.js'\nimport { filterDocumentsByTenants } from './filters/filterDocumentsByTenants.js'\nimport { addTenantCleanup } from './hooks/afterTenantDelete.js'\nimport { translations } from './translations/index.js'\nimport { addCollectionAccess } from './utilities/addCollectionAccess.js'\nimport { addFilterOptionsToFields } from './utilities/addFilterOptionsToFields.js'\nimport { combineFilters } from './utilities/combineFilters.js'\n\nexport const multiTenantPlugin =\n <ConfigType>(pluginConfig: MultiTenantPluginConfig<ConfigType>) =>\n (incomingConfig: Config): Config => {\n if (pluginConfig.enabled === false) {\n return incomingConfig\n }\n\n /**\n * Set defaults\n */\n const userHasAccessToAllTenants: Required<\n MultiTenantPluginConfig<ConfigType>\n >['userHasAccessToAllTenants'] =\n typeof pluginConfig.userHasAccessToAllTenants === 'function'\n ? pluginConfig.userHasAccessToAllTenants\n : () => false\n const tenantsCollectionSlug = (pluginConfig.tenantsSlug =\n pluginConfig.tenantsSlug || defaults.tenantCollectionSlug)\n const tenantFieldName = pluginConfig?.tenantField?.name || defaults.tenantFieldName\n const tenantsArrayFieldName =\n pluginConfig?.tenantsArrayField?.arrayFieldName || defaults.tenantsArrayFieldName\n const tenantsArrayTenantFieldName =\n pluginConfig?.tenantsArrayField?.arrayTenantFieldName || defaults.tenantsArrayTenantFieldName\n const basePath = pluginConfig.basePath || defaults.basePath\n\n /**\n * Add defaults for admin properties\n */\n if (!incomingConfig.admin) {\n incomingConfig.admin = {}\n }\n if (!incomingConfig.admin?.components) {\n incomingConfig.admin.components = {\n actions: [],\n beforeNavLinks: [],\n providers: [],\n }\n }\n if (!incomingConfig.admin.components?.providers) {\n incomingConfig.admin.components.providers = []\n }\n if (!incomingConfig.admin.components?.actions) {\n incomingConfig.admin.components.actions = []\n }\n if (!incomingConfig.admin.components?.beforeNavLinks) {\n incomingConfig.admin.components.beforeNavLinks = []\n }\n if (!incomingConfig.collections) {\n incomingConfig.collections = []\n }\n\n /**\n * Add tenants array field to users collection\n */\n const adminUsersCollection = incomingConfig.collections.find(({ slug, auth }) => {\n if (incomingConfig.admin?.user) {\n return slug === incomingConfig.admin.user\n } else if (auth) {\n return true\n }\n })\n\n if (!adminUsersCollection) {\n throw Error('An auth enabled collection was not found')\n }\n\n /**\n * Add tenants array field to users collection\n */\n if (pluginConfig?.tenantsArrayField?.includeDefaultField !== false) {\n adminUsersCollection.fields.push(\n tenantsArrayField({\n ...(pluginConfig?.tenantsArrayField || {}),\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n }),\n )\n }\n\n addCollectionAccess({\n adminUsersSlug: adminUsersCollection.slug,\n collection: adminUsersCollection,\n fieldName: `${tenantsArrayFieldName}.${tenantsArrayTenantFieldName}`,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n userHasAccessToAllTenants,\n })\n\n if (pluginConfig.useUsersTenantFilter !== false) {\n if (!adminUsersCollection.admin) {\n adminUsersCollection.admin = {}\n }\n\n const baseFilter =\n adminUsersCollection.admin?.baseFilter ?? adminUsersCollection.admin?.baseListFilter\n adminUsersCollection.admin.baseFilter = combineFilters({\n baseFilter,\n customFilter: (args) =>\n filterDocumentsByTenants({\n filterFieldName: `${tenantsArrayFieldName}.${tenantsArrayTenantFieldName}`,\n req: args.req,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n }),\n })\n }\n\n let tenantCollection: CollectionConfig | undefined\n\n const [collectionSlugs, globalCollectionSlugs] = Object.keys(pluginConfig.collections).reduce<\n [string[], string[]]\n >(\n (acc, slug) => {\n if (pluginConfig?.collections?.[slug]?.isGlobal) {\n acc[1].push(slug)\n } else {\n acc[0].push(slug)\n }\n\n return acc\n },\n [[], []],\n )\n\n // used to validate enabled collection slugs\n const multiTenantCollectionsFound: string[] = []\n\n /**\n * The folders collection is added AFTER the plugin is initialized\n * so if they added the folder slug to the plugin collections,\n * we can assume that they have folders enabled\n */\n const foldersSlug = incomingConfig.folders\n ? incomingConfig.folders.slug || 'payload-folders'\n : 'payload-folders'\n\n if (collectionSlugs.includes(foldersSlug)) {\n multiTenantCollectionsFound.push(foldersSlug)\n const overrides = pluginConfig.collections[foldersSlug]?.tenantFieldOverrides\n ? pluginConfig.collections[foldersSlug]?.tenantFieldOverrides\n : pluginConfig.tenantField || {}\n incomingConfig.folders = incomingConfig.folders || {}\n incomingConfig.folders.collectionOverrides = incomingConfig.folders.collectionOverrides || []\n incomingConfig.folders.collectionOverrides.push(({ collection }) => {\n /**\n * Add tenant field to enabled collections\n */\n const folderTenantField = tenantField({\n ...(pluginConfig?.tenantField || {}),\n name: tenantFieldName,\n debug: pluginConfig.debug,\n overrides,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n unique: false,\n })\n collection.fields.unshift(folderTenantField)\n\n if (pluginConfig.collections[foldersSlug]?.useBaseListFilter !== false) {\n /**\n * Add list filter to enabled collections\n * - filters results by selected tenant\n */\n collection.admin = collection.admin || {}\n collection.admin.baseFilter = combineFilters({\n baseFilter: collection.admin?.baseFilter ?? collection.admin?.baseListFilter,\n customFilter: (args) =>\n filterDocumentsByTenants({\n filterFieldName: tenantFieldName,\n req: args.req,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n }),\n })\n }\n\n if (pluginConfig.collections[foldersSlug]?.useTenantAccess !== false) {\n /**\n * Add access control constraint to tenant enabled folders collection\n */\n addCollectionAccess({\n adminUsersSlug: adminUsersCollection.slug,\n collection,\n fieldName: tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n userHasAccessToAllTenants,\n })\n }\n\n return collection\n })\n }\n\n /**\n * Modify collections\n */\n incomingConfig.collections.forEach((collection) => {\n /**\n * Modify tenants collection\n */\n if (collection.slug === tenantsCollectionSlug) {\n tenantCollection = collection\n\n if (pluginConfig.useTenantsCollectionAccess !== false) {\n /**\n * Add access control constraint to tenants collection\n * - constrains access a users assigned tenants\n */\n addCollectionAccess({\n adminUsersSlug: adminUsersCollection.slug,\n collection,\n fieldName: 'id',\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n userHasAccessToAllTenants,\n })\n }\n\n if (pluginConfig.useTenantsListFilter !== false) {\n /**\n * Add list filter to tenants collection\n * - filter by selected tenant\n */\n if (!collection.admin) {\n collection.admin = {}\n }\n\n const baseFilter = collection.admin?.baseFilter ?? collection.admin?.baseListFilter\n collection.admin.baseFilter = combineFilters({\n baseFilter,\n customFilter: (args) =>\n filterDocumentsByTenants({\n filterFieldName: 'id',\n req: args.req,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n }),\n })\n }\n\n if (pluginConfig.cleanupAfterTenantDelete !== false) {\n /**\n * Add cleanup logic when tenant is deleted\n * - delete documents related to tenant\n * - remove tenant from users\n */\n addTenantCleanup({\n collection,\n enabledSlugs: [...collectionSlugs, ...globalCollectionSlugs],\n tenantFieldName,\n tenantsCollectionSlug,\n usersSlug: adminUsersCollection.slug,\n usersTenantsArrayFieldName: tenantsArrayFieldName,\n usersTenantsArrayTenantFieldName: tenantsArrayTenantFieldName,\n })\n }\n\n /**\n * Add custom tenant field that watches and dispatches updates to the selector\n */\n collection.fields.push({\n name: '_watchTenant',\n type: 'ui',\n admin: {\n components: {\n Field: {\n path: '@payloadcms/plugin-multi-tenant/client#WatchTenantCollection',\n },\n },\n },\n })\n\n collection.endpoints = [\n ...(collection.endpoints || []),\n getTenantOptionsEndpoint<ConfigType>({\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n useAsTitle: tenantCollection.admin?.useAsTitle || 'id',\n userHasAccessToAllTenants,\n }),\n ]\n } else if (pluginConfig.collections?.[collection.slug]) {\n multiTenantCollectionsFound.push(collection.slug)\n const isGlobal = Boolean(pluginConfig.collections[collection.slug]?.isGlobal)\n\n if (isGlobal) {\n collection.disableDuplicate = true\n }\n\n /**\n * Modify enabled collections\n */\n addFilterOptionsToFields({\n config: incomingConfig,\n fields: collection.fields,\n tenantEnabledCollectionSlugs: collectionSlugs,\n tenantEnabledGlobalSlugs: globalCollectionSlugs,\n tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n })\n\n const overrides = pluginConfig.collections[collection.slug]?.tenantFieldOverrides\n ? pluginConfig.collections[collection.slug]?.tenantFieldOverrides\n : pluginConfig.tenantField || {}\n\n /**\n * Add tenant field to enabled collections\n */\n collection.fields.splice(\n 0,\n 0,\n tenantField({\n name: tenantFieldName,\n debug: pluginConfig.debug,\n overrides,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n unique: isGlobal,\n }),\n )\n\n const { useBaseFilter, useBaseListFilter } = pluginConfig.collections[collection.slug] || {}\n\n if (useBaseFilter ?? useBaseListFilter ?? true) {\n /**\n * Add list filter to enabled collections\n * - filters results by selected tenant\n */\n if (!collection.admin) {\n collection.admin = {}\n }\n\n const baseFilter = collection.admin?.baseFilter ?? collection.admin?.baseListFilter\n collection.admin.baseFilter = combineFilters({\n baseFilter,\n customFilter: (args) =>\n filterDocumentsByTenants({\n filterFieldName: tenantFieldName,\n req: args.req,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n }),\n })\n }\n\n if (pluginConfig.collections[collection.slug]?.useTenantAccess !== false) {\n /**\n * Add access control constraint to tenant enabled collection\n */\n addCollectionAccess({\n adminUsersSlug: adminUsersCollection.slug,\n collection,\n fieldName: tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n userHasAccessToAllTenants,\n })\n }\n }\n })\n\n if (!tenantCollection) {\n throw new Error(`Tenants collection not found with slug: ${tenantsCollectionSlug}`)\n }\n\n if (\n multiTenantCollectionsFound.length !==\n collectionSlugs.length + globalCollectionSlugs.length\n ) {\n const missingSlugs = [...collectionSlugs, ...globalCollectionSlugs].filter(\n (slug) => !multiTenantCollectionsFound.includes(slug),\n )\n // eslint-disable-next-line no-console\n console.error(\n chalk.yellow.bold('WARNING (plugin-multi-tenant)'),\n 'missing collections',\n missingSlugs,\n 'try placing the multi-tenant plugin after other plugins.',\n )\n }\n\n /**\n * Add TenantSelectionProvider to admin providers\n */\n incomingConfig.admin.components.providers.push({\n clientProps: {\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug: tenantCollection.slug,\n useAsTitle: tenantCollection.admin?.useAsTitle || 'id',\n userHasAccessToAllTenants,\n },\n path: '@payloadcms/plugin-multi-tenant/rsc#TenantSelectionProvider',\n })\n\n /**\n * Add global redirect action\n */\n if (globalCollectionSlugs.length) {\n incomingConfig.admin.components.actions.push({\n path: '@payloadcms/plugin-multi-tenant/rsc#GlobalViewRedirect',\n serverProps: {\n basePath,\n globalSlugs: globalCollectionSlugs,\n tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n useAsTitle: tenantCollection.admin?.useAsTitle || 'id',\n userHasAccessToAllTenants,\n },\n })\n }\n\n /**\n * Add tenant selector to admin UI\n */\n incomingConfig.admin.components.beforeNavLinks.push({\n clientProps: {\n enabledSlugs: [\n ...collectionSlugs,\n ...globalCollectionSlugs,\n adminUsersCollection.slug,\n tenantCollection.slug,\n ],\n label: pluginConfig.tenantSelectorLabel || undefined,\n },\n path: '@payloadcms/plugin-multi-tenant/rsc#TenantSelector',\n })\n\n /**\n * Merge plugin translations\n */\n if (!incomingConfig.i18n) {\n incomingConfig.i18n = {}\n }\n Object.entries(translations).forEach(([locale, pluginI18nObject]) => {\n const typedLocale = locale as AcceptedLanguages\n if (!incomingConfig.i18n!.translations) {\n incomingConfig.i18n!.translations = {}\n }\n if (!(typedLocale in incomingConfig.i18n!.translations)) {\n incomingConfig.i18n!.translations[typedLocale] = {}\n }\n if (!('plugin-multi-tenant' in incomingConfig.i18n!.translations[typedLocale]!)) {\n ;(incomingConfig.i18n!.translations[typedLocale] as PluginDefaultTranslationsObject)[\n 'plugin-multi-tenant'\n ] = {} as PluginDefaultTranslationsObject['plugin-multi-tenant']\n }\n\n ;(incomingConfig.i18n!.translations[typedLocale] as PluginDefaultTranslationsObject)[\n 'plugin-multi-tenant'\n ] = {\n ...pluginI18nObject.translations['plugin-multi-tenant'],\n ...(pluginConfig.i18n?.translations?.[typedLocale] || {}),\n }\n })\n\n return incomingConfig\n }\n"],"names":["chalk","defaults","getTenantOptionsEndpoint","tenantField","tenantsArrayField","filterDocumentsByTenants","addTenantCleanup","translations","addCollectionAccess","addFilterOptionsToFields","combineFilters","multiTenantPlugin","pluginConfig","incomingConfig","enabled","userHasAccessToAllTenants","tenantsCollectionSlug","tenantsSlug","tenantCollectionSlug","tenantFieldName","name","tenantsArrayFieldName","arrayFieldName","tenantsArrayTenantFieldName","arrayTenantFieldName","basePath","admin","components","actions","beforeNavLinks","providers","collections","adminUsersCollection","find","slug","auth","user","Error","includeDefaultField","fields","push","adminUsersSlug","collection","fieldName","useUsersTenantFilter","baseFilter","baseListFilter","customFilter","args","filterFieldName","req","tenantCollection","collectionSlugs","globalCollectionSlugs","Object","keys","reduce","acc","isGlobal","multiTenantCollectionsFound","foldersSlug","folders","includes","overrides","tenantFieldOverrides","collectionOverrides","folderTenantField","debug","unique","unshift","useBaseListFilter","useTenantAccess","forEach","useTenantsCollectionAccess","useTenantsListFilter","cleanupAfterTenantDelete","enabledSlugs","usersSlug","usersTenantsArrayFieldName","usersTenantsArrayTenantFieldName","type","Field","path","endpoints","useAsTitle","Boolean","disableDuplicate","config","tenantEnabledCollectionSlugs","tenantEnabledGlobalSlugs","splice","useBaseFilter","length","missingSlugs","filter","console","error","yellow","bold","clientProps","serverProps","globalSlugs","label","tenantSelectorLabel","undefined","i18n","entries","locale","pluginI18nObject","typedLocale"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../../src/providers/TenantSelectionProvider/index.client.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAI3C,OAAO,KAAwB,MAAM,OAAO,CAAA;AAE5C,KAAK,WAAW,GAAG;IACjB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAA;IAClC;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;OAEG;IACH,OAAO,EAAE,YAAY,EAAE,CAAA;IACvB;;OAEG;IACH,gBAAgB,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IAC7C;;OAEG;IACH,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAA;IACtF;;OAEG;IACH,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAA;IAC1D;;;;;OAKG;IACH,SAAS,EAAE,CAAC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAA;IACjF;;OAEG;IACH,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAChC;;OAEG;IACH,aAAa,EAAE,CAAC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;CACtE,CAAA;AAaD,eAAO,MAAM,6BAA6B,6EAKvC;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,oBAAoB,EAAE,YAAY,EAAE,CAAA;IACpC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC9B,qBAAqB,EAAE,MAAM,CAAA;CAC9B,sBAiJA,CAAA;AAED,eAAO,MAAM,kBAAkB,mBAA2B,CAAA"}
1
+ {"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../../src/providers/TenantSelectionProvider/index.client.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAI3C,OAAO,KAAwB,MAAM,OAAO,CAAA;AAI5C,KAAK,WAAW,GAAG;IACjB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAA;IAClC;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;OAEG;IACH,OAAO,EAAE,YAAY,EAAE,CAAA;IACvB;;OAEG;IACH,gBAAgB,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IAC7C;;OAEG;IACH,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAA;IACtF;;OAEG;IACH,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAA;IAC1D;;;;;OAKG;IACH,SAAS,EAAE,CAAC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAA;IACjF;;OAEG;IACH,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAChC;;OAEG;IACH,aAAa,EAAE,CAAC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;CACtE,CAAA;AAiCD,eAAO,MAAM,6BAA6B,6EAKvC;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,oBAAoB,EAAE,YAAY,EAAE,CAAA;IACpC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC9B,qBAAqB,EAAE,MAAM,CAAA;CAC9B,sBAqKA,CAAA;AAED,eAAO,MAAM,kBAAkB,mBAA2B,CAAA"}