@payloadcms/plugin-multi-tenant 3.51.0-canary.0 → 3.51.0-canary.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -8
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +13 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utilities/combineFilters.d.ts +13 -0
- package/dist/utilities/combineFilters.d.ts.map +1 -0
- package/dist/utilities/{combineListFilters.js → combineFilters.js} +7 -7
- package/dist/utilities/combineFilters.js.map +1 -0
- package/package.json +6 -6
- package/dist/utilities/combineListFilters.d.ts +0 -13
- package/dist/utilities/combineListFilters.d.ts.map +0 -1
- package/dist/utilities/combineListFilters.js.map +0 -1
package/README.md
CHANGED
|
@@ -36,11 +36,11 @@ type MultiTenantPluginConfig<ConfigTypes = unknown> = {
|
|
|
36
36
|
*/
|
|
37
37
|
isGlobal?: boolean
|
|
38
38
|
/**
|
|
39
|
-
* Set to `false` if you want to manually apply the
|
|
39
|
+
* Set to `false` if you want to manually apply the baseFilter
|
|
40
40
|
*
|
|
41
41
|
* @default true
|
|
42
42
|
*/
|
|
43
|
-
|
|
43
|
+
useBaseFilter?: boolean
|
|
44
44
|
/**
|
|
45
45
|
* Set to `false` if you want to handle collection access manually without the multi-tenant constraints applied
|
|
46
46
|
*
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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,MAqYzB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -8,7 +8,7 @@ import { addTenantCleanup } from './hooks/afterTenantDelete.js';
|
|
|
8
8
|
import { translations } from './translations/index.js';
|
|
9
9
|
import { addCollectionAccess } from './utilities/addCollectionAccess.js';
|
|
10
10
|
import { addFilterOptionsToFields } from './utilities/addFilterOptionsToFields.js';
|
|
11
|
-
import {
|
|
11
|
+
import { combineFilters } from './utilities/combineFilters.js';
|
|
12
12
|
export const multiTenantPlugin = (pluginConfig)=>(incomingConfig)=>{
|
|
13
13
|
if (pluginConfig.enabled === false) {
|
|
14
14
|
return incomingConfig;
|
|
@@ -109,8 +109,9 @@ export const multiTenantPlugin = (pluginConfig)=>(incomingConfig)=>{
|
|
|
109
109
|
if (!adminUsersCollection.admin) {
|
|
110
110
|
adminUsersCollection.admin = {};
|
|
111
111
|
}
|
|
112
|
-
adminUsersCollection.admin.baseListFilter
|
|
113
|
-
|
|
112
|
+
const baseFilter = adminUsersCollection.admin?.baseFilter ?? adminUsersCollection.admin?.baseListFilter;
|
|
113
|
+
adminUsersCollection.admin.baseFilter = combineFilters({
|
|
114
|
+
baseFilter,
|
|
114
115
|
customFilter: (args)=>filterDocumentsByTenants({
|
|
115
116
|
filterFieldName: `${tenantsArrayFieldName}.${tenantsArrayTenantFieldName}`,
|
|
116
117
|
req: args.req,
|
|
@@ -159,8 +160,9 @@ export const multiTenantPlugin = (pluginConfig)=>(incomingConfig)=>{
|
|
|
159
160
|
*/ if (!collection.admin) {
|
|
160
161
|
collection.admin = {};
|
|
161
162
|
}
|
|
162
|
-
collection.admin.baseListFilter
|
|
163
|
-
|
|
163
|
+
const baseFilter = collection.admin?.baseFilter ?? collection.admin?.baseListFilter;
|
|
164
|
+
collection.admin.baseFilter = combineFilters({
|
|
165
|
+
baseFilter,
|
|
164
166
|
customFilter: (args)=>filterDocumentsByTenants({
|
|
165
167
|
filterFieldName: 'id',
|
|
166
168
|
req: args.req,
|
|
@@ -235,15 +237,17 @@ export const multiTenantPlugin = (pluginConfig)=>(incomingConfig)=>{
|
|
|
235
237
|
tenantsCollectionSlug,
|
|
236
238
|
unique: isGlobal
|
|
237
239
|
}));
|
|
238
|
-
|
|
240
|
+
const { useBaseFilter, useBaseListFilter } = pluginConfig.collections[collection.slug] || {};
|
|
241
|
+
if (useBaseFilter ?? useBaseListFilter ?? true) {
|
|
239
242
|
/**
|
|
240
243
|
* Add list filter to enabled collections
|
|
241
244
|
* - filters results by selected tenant
|
|
242
245
|
*/ if (!collection.admin) {
|
|
243
246
|
collection.admin = {};
|
|
244
247
|
}
|
|
245
|
-
collection.admin.baseListFilter
|
|
246
|
-
|
|
248
|
+
const baseFilter = collection.admin?.baseFilter ?? collection.admin?.baseListFilter;
|
|
249
|
+
collection.admin.baseFilter = combineFilters({
|
|
250
|
+
baseFilter,
|
|
247
251
|
customFilter: (args)=>filterDocumentsByTenants({
|
|
248
252
|
filterFieldName: tenantFieldName,
|
|
249
253
|
req: args.req,
|
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 { combineListFilters } from './utilities/combineListFilters.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 tenantSelectorLabel = pluginConfig.tenantSelectorLabel || defaults.tenantSelectorLabel\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 tenant selector localized labels\n */\n if (typeof tenantSelectorLabel === 'object') {\n if (!incomingConfig.i18n) {\n incomingConfig.i18n = {}\n }\n Object.entries(tenantSelectorLabel).forEach(([_locale, label]) => {\n const locale = _locale as AcceptedLanguages\n if (!incomingConfig.i18n) {\n incomingConfig.i18n = {}\n }\n if (!incomingConfig.i18n.translations) {\n incomingConfig.i18n.translations = {}\n }\n if (!(locale in incomingConfig.i18n.translations)) {\n incomingConfig.i18n.translations[locale] = {}\n }\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n if (!('multiTenant' in incomingConfig.i18n.translations[locale])) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n incomingConfig.i18n.translations[locale].multiTenant = {}\n }\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n incomingConfig.i18n.translations[locale].multiTenant.selectorLabel = label\n })\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 adminUsersCollection.admin.baseListFilter = combineListFilters({\n baseListFilter: adminUsersCollection.admin?.baseListFilter,\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 collection.admin.baseListFilter = combineListFilters({\n baseListFilter: collection.admin?.baseListFilter,\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 /**\n * Add tenant field to enabled collections\n */\n collection.fields.splice(\n 0,\n 0,\n tenantField({\n ...(pluginConfig?.tenantField || {}),\n name: tenantFieldName,\n debug: pluginConfig.debug,\n tenantsCollectionSlug,\n unique: isGlobal,\n }),\n )\n\n if (pluginConfig.collections[collection.slug]?.useBaseListFilter !== false) {\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 collection.admin.baseListFilter = combineListFilters({\n baseListFilter: 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[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: tenantSelectorLabel,\n },\n path: '@payloadcms/plugin-multi-tenant/client#TenantSelector',\n })\n\n /**\n * Merge plugin translations\n */\n\n const simplifiedTranslations = Object.entries(translations).reduce(\n (acc, [key, value]) => {\n acc[key] = value.translations\n return acc\n },\n {} as Record<string, PluginDefaultTranslationsObject>,\n )\n\n incomingConfig.i18n = {\n ...incomingConfig.i18n,\n translations: deepMergeSimple(\n simplifiedTranslations,\n incomingConfig.i18n?.translations ?? {},\n ),\n }\n\n return incomingConfig\n }\n"],"names":["deepMergeSimple","defaults","getTenantOptionsEndpoint","tenantField","tenantsArrayField","filterDocumentsByTenants","addTenantCleanup","translations","addCollectionAccess","addFilterOptionsToFields","combineListFilters","multiTenantPlugin","pluginConfig","incomingConfig","enabled","userHasAccessToAllTenants","tenantsCollectionSlug","tenantsSlug","tenantCollectionSlug","tenantFieldName","name","tenantsArrayFieldName","arrayFieldName","tenantsArrayTenantFieldName","arrayTenantFieldName","tenantSelectorLabel","basePath","admin","components","actions","beforeNavLinks","providers","collections","i18n","Object","entries","forEach","_locale","label","locale","multiTenant","selectorLabel","adminUsersCollection","find","slug","auth","user","Error","includeDefaultField","fields","push","adminUsersSlug","collection","fieldName","useUsersTenantFilter","baseListFilter","customFilter","args","filterFieldName","req","tenantCollection","collectionSlugs","globalCollectionSlugs","keys","reduce","acc","isGlobal","useTenantsCollectionAccess","useTenantsListFilter","cleanupAfterTenantDelete","enabledSlugs","usersSlug","usersTenantsArrayFieldName","usersTenantsArrayTenantFieldName","type","Field","path","endpoints","useAsTitle","Boolean","disableDuplicate","config","tenantEnabledCollectionSlugs","tenantEnabledGlobalSlugs","splice","debug","unique","useBaseListFilter","useTenantAccess","clientProps","length","serverProps","globalSlugs","simplifiedTranslations","key","value"],"mappings":"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"}
|
|
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 tenantSelectorLabel = pluginConfig.tenantSelectorLabel || defaults.tenantSelectorLabel\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 tenant selector localized labels\n */\n if (typeof tenantSelectorLabel === 'object') {\n if (!incomingConfig.i18n) {\n incomingConfig.i18n = {}\n }\n Object.entries(tenantSelectorLabel).forEach(([_locale, label]) => {\n const locale = _locale as AcceptedLanguages\n if (!incomingConfig.i18n) {\n incomingConfig.i18n = {}\n }\n if (!incomingConfig.i18n.translations) {\n incomingConfig.i18n.translations = {}\n }\n if (!(locale in incomingConfig.i18n.translations)) {\n incomingConfig.i18n.translations[locale] = {}\n }\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n if (!('multiTenant' in incomingConfig.i18n.translations[locale])) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n incomingConfig.i18n.translations[locale].multiTenant = {}\n }\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n incomingConfig.i18n.translations[locale].multiTenant.selectorLabel = label\n })\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 /**\n * Add tenant field to enabled collections\n */\n collection.fields.splice(\n 0,\n 0,\n tenantField({\n ...(pluginConfig?.tenantField || {}),\n name: tenantFieldName,\n debug: pluginConfig.debug,\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: tenantSelectorLabel,\n },\n path: '@payloadcms/plugin-multi-tenant/client#TenantSelector',\n })\n\n /**\n * Merge plugin translations\n */\n\n const simplifiedTranslations = Object.entries(translations).reduce(\n (acc, [key, value]) => {\n acc[key] = value.translations\n return acc\n },\n {} as Record<string, PluginDefaultTranslationsObject>,\n )\n\n incomingConfig.i18n = {\n ...incomingConfig.i18n,\n translations: deepMergeSimple(\n simplifiedTranslations,\n incomingConfig.i18n?.translations ?? {},\n ),\n }\n\n return incomingConfig\n }\n"],"names":["deepMergeSimple","defaults","getTenantOptionsEndpoint","tenantField","tenantsArrayField","filterDocumentsByTenants","addTenantCleanup","translations","addCollectionAccess","addFilterOptionsToFields","combineFilters","multiTenantPlugin","pluginConfig","incomingConfig","enabled","userHasAccessToAllTenants","tenantsCollectionSlug","tenantsSlug","tenantCollectionSlug","tenantFieldName","name","tenantsArrayFieldName","arrayFieldName","tenantsArrayTenantFieldName","arrayTenantFieldName","tenantSelectorLabel","basePath","admin","components","actions","beforeNavLinks","providers","collections","i18n","Object","entries","forEach","_locale","label","locale","multiTenant","selectorLabel","adminUsersCollection","find","slug","auth","user","Error","includeDefaultField","fields","push","adminUsersSlug","collection","fieldName","useUsersTenantFilter","baseFilter","baseListFilter","customFilter","args","filterFieldName","req","tenantCollection","collectionSlugs","globalCollectionSlugs","keys","reduce","acc","isGlobal","useTenantsCollectionAccess","useTenantsListFilter","cleanupAfterTenantDelete","enabledSlugs","usersSlug","usersTenantsArrayFieldName","usersTenantsArrayTenantFieldName","type","Field","path","endpoints","useAsTitle","Boolean","disableDuplicate","config","tenantEnabledCollectionSlugs","tenantEnabledGlobalSlugs","splice","debug","unique","useBaseFilter","useBaseListFilter","useTenantAccess","clientProps","length","serverProps","globalSlugs","simplifiedTranslations","key","value"],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -29,7 +29,19 @@ export type MultiTenantPluginConfig<ConfigTypes = unknown> = {
|
|
|
29
29
|
*/
|
|
30
30
|
isGlobal?: boolean;
|
|
31
31
|
/**
|
|
32
|
-
* Set to `false` if you want to manually apply the
|
|
32
|
+
* Set to `false` if you want to manually apply the baseFilter
|
|
33
|
+
*
|
|
34
|
+
* @default true
|
|
35
|
+
*/
|
|
36
|
+
useBaseFilter?: boolean;
|
|
37
|
+
/**
|
|
38
|
+
* @deprecated Use `useBaseFilter` instead. If both are defined,
|
|
39
|
+
* `useBaseFilter` will take precedence. This property remains only
|
|
40
|
+
* for backward compatibility and may be removed in a future version.
|
|
41
|
+
*
|
|
42
|
+
* Originally, `baseListFilter` was intended to filter only the List View
|
|
43
|
+
* in the admin panel. However, base filtering is often required in other areas
|
|
44
|
+
* such as internal link relationships in the Lexical editor.
|
|
33
45
|
*
|
|
34
46
|
* @default true
|
|
35
47
|
*/
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAE9F,MAAM,MAAM,uBAAuB,CAAC,WAAW,GAAG,OAAO,IAAI;IAC3D;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;;;OAMG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAA;IAClC;;OAEG;IACH,WAAW,EAAE;SACV,GAAG,IAAI,cAAc,CAAC,CAAC,EAAE;YACxB;;;;eAIG;YACH,QAAQ,CAAC,EAAE,OAAO,CAAA;YAClB;;;;eAIG;YACH,iBAAiB,CAAC,EAAE,OAAO,CAAA;YAC3B;;;;eAIG;YACH,eAAe,CAAC,EAAE,OAAO,CAAA;SAC1B;KACF,CAAA;IACD;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB;;OAEG;IACH,WAAW,CAAC,EAAE;QACZ,MAAM,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAA;QACpC;;;;WAIG;QACH,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,CAAA;IACD;;;;;OAKG;IACH,iBAAiB,CAAC,EACd;QACE;;WAEG;QACH,gBAAgB,CAAC,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAA;QACvC;;;;WAIG;QACH,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB;;;;WAIG;QACH,oBAAoB,CAAC,EAAE,MAAM,CAAA;QAC7B;;WAEG;QACH,mBAAmB,CAAC,EAAE,IAAI,CAAA;QAC1B;;WAEG;QACH,SAAS,CAAC,EAAE,KAAK,EAAE,CAAA;QACnB;;WAEG;QACH,iBAAiB,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAA;KAChD,GACD;QACE,gBAAgB,CAAC,EAAE,KAAK,CAAA;QACxB,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,oBAAoB,CAAC,EAAE,MAAM,CAAA;QAC7B;;WAEG;QACH,mBAAmB,CAAC,EAAE,KAAK,CAAA;QAC3B,SAAS,CAAC,EAAE,KAAK,CAAA;QACjB,iBAAiB,CAAC,EAAE,KAAK,CAAA;KAC1B,CAAA;IACL;;;;OAIG;IACH,mBAAmB,CAAC,EAChB,OAAO,CAAC;SACL,GAAG,IAAI,iBAAiB,CAAC,CAAC,EAAE,MAAM;KACpC,CAAC,GACF,MAAM,CAAA;IACV;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;;OAIG;IACH,yBAAyB,CAAC,EAAE,CAC1B,IAAI,EAAE,WAAW,SAAS;QAAE,IAAI,EAAE,OAAO,CAAA;KAAE,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,SAAS,KAC1E,OAAO,CAAA;IACZ;;OAEG;IACH,0BAA0B,CAAC,EAAE,OAAO,CAAA;IACpC;;OAEG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B;;OAEG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAC/B,CAAA;AAED,MAAM,MAAM,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,IAAI;IAC7C,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,CAAC,EACJ;QACE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;KACjC,EAAE,GACH,IAAI,CAAA;CACT,GAAG,SAAS,CAAA"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type { AcceptedLanguages } from '@payloadcms/translations'\nimport type { ArrayField, CollectionSlug, Field, RelationshipField, TypedUser } from 'payload'\n\nexport type MultiTenantPluginConfig<ConfigTypes = unknown> = {\n /**\n * Base path for your application\n *\n * https://nextjs.org/docs/app/api-reference/config/next-config-js/basePath\n *\n * @default undefined\n */\n basePath?: string\n /**\n * After a tenant is deleted, the plugin will attempt to clean up related documents\n * - removing documents with the tenant ID\n * - removing the tenant from users\n *\n * @default true\n */\n cleanupAfterTenantDelete?: boolean\n /**\n * Automatically\n */\n collections: {\n [key in CollectionSlug]?: {\n /**\n * Set to `true` if you want the collection to behave as a global\n *\n * @default false\n */\n isGlobal?: boolean\n /**\n * Set to `false` if you want to manually apply the baseListFilter\n *\n * @default true\n */\n useBaseListFilter?: boolean\n /**\n * Set to `false` if you want to handle collection access manually without the multi-tenant constraints applied\n *\n * @default true\n */\n useTenantAccess?: boolean\n }\n }\n /**\n * Enables debug mode\n * - Makes the tenant field visible in the admin UI within applicable collections\n *\n * @default false\n */\n debug?: boolean\n /**\n * Enables the multi-tenant plugin\n *\n * @default true\n */\n enabled?: boolean\n /**\n * Field configuration for the field added to all tenant enabled collections\n */\n tenantField?: {\n access?: RelationshipField['access']\n /**\n * The name of the field added to all tenant enabled collections\n *\n * @default 'tenant'\n */\n name?: string\n }\n /**\n * Field configuration for the field added to the users collection\n *\n * If `includeDefaultField` is `false`, you must include the field on your users collection manually\n * This is useful if you want to customize the field or place the field in a specific location\n */\n tenantsArrayField?:\n | {\n /**\n * Access configuration for the array field\n */\n arrayFieldAccess?: ArrayField['access']\n /**\n * Name of the array field\n *\n * @default 'tenants'\n */\n arrayFieldName?: string\n /**\n * Name of the tenant field\n *\n * @default 'tenant'\n */\n arrayTenantFieldName?: string\n /**\n * When `includeDefaultField` is `true`, the field will be added to the users collection automatically\n */\n includeDefaultField?: true\n /**\n * Additional fields to include on the tenants array field\n */\n rowFields?: Field[]\n /**\n * Access configuration for the tenant field\n */\n tenantFieldAccess?: RelationshipField['access']\n }\n | {\n arrayFieldAccess?: never\n arrayFieldName?: string\n arrayTenantFieldName?: string\n /**\n * When `includeDefaultField` is `false`, you must include the field on your users collection manually\n */\n includeDefaultField?: false\n rowFields?: never\n tenantFieldAccess?: never\n }\n /**\n * Customize tenant selector label\n *\n * Either a string or an object where the keys are i18n codes and the values are the string labels\n */\n tenantSelectorLabel?:\n | Partial<{\n [key in AcceptedLanguages]?: string\n }>\n | string\n /**\n * The slug for the tenant collection\n *\n * @default 'tenants'\n */\n tenantsSlug?: string\n /**\n * Function that determines if a user has access to _all_ tenants\n *\n * Useful for super-admin type users\n */\n userHasAccessToAllTenants?: (\n user: ConfigTypes extends { user: unknown } ? ConfigTypes['user'] : TypedUser,\n ) => boolean\n /**\n * Opt out of adding access constraints to the tenants collection\n */\n useTenantsCollectionAccess?: boolean\n /**\n * Opt out including the baseListFilter to filter tenants by selected tenant\n */\n useTenantsListFilter?: boolean\n /**\n * Opt out including the baseListFilter to filter users by selected tenant\n */\n useUsersTenantFilter?: boolean\n}\n\nexport type Tenant<IDType = number | string> = {\n id: IDType\n name: string\n}\n\nexport type UserWithTenantsField = {\n tenants?:\n | {\n tenant: number | string | Tenant\n }[]\n | null\n} & TypedUser\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type { AcceptedLanguages } from '@payloadcms/translations'\nimport type { ArrayField, CollectionSlug, Field, RelationshipField, TypedUser } from 'payload'\n\nexport type MultiTenantPluginConfig<ConfigTypes = unknown> = {\n /**\n * Base path for your application\n *\n * https://nextjs.org/docs/app/api-reference/config/next-config-js/basePath\n *\n * @default undefined\n */\n basePath?: string\n /**\n * After a tenant is deleted, the plugin will attempt to clean up related documents\n * - removing documents with the tenant ID\n * - removing the tenant from users\n *\n * @default true\n */\n cleanupAfterTenantDelete?: boolean\n /**\n * Automatically\n */\n collections: {\n [key in CollectionSlug]?: {\n /**\n * Set to `true` if you want the collection to behave as a global\n *\n * @default false\n */\n isGlobal?: boolean\n /**\n * Set to `false` if you want to manually apply the baseFilter\n *\n * @default true\n */\n useBaseFilter?: boolean\n /**\n * @deprecated Use `useBaseFilter` instead. If both are defined,\n * `useBaseFilter` will take precedence. This property remains only\n * for backward compatibility and may be removed in a future version.\n *\n * Originally, `baseListFilter` was intended to filter only the List View\n * in the admin panel. However, base filtering is often required in other areas\n * such as internal link relationships in the Lexical editor.\n *\n * @default true\n */\n useBaseListFilter?: boolean\n /**\n * Set to `false` if you want to handle collection access manually without the multi-tenant constraints applied\n *\n * @default true\n */\n useTenantAccess?: boolean\n }\n }\n /**\n * Enables debug mode\n * - Makes the tenant field visible in the admin UI within applicable collections\n *\n * @default false\n */\n debug?: boolean\n /**\n * Enables the multi-tenant plugin\n *\n * @default true\n */\n enabled?: boolean\n /**\n * Field configuration for the field added to all tenant enabled collections\n */\n tenantField?: {\n access?: RelationshipField['access']\n /**\n * The name of the field added to all tenant enabled collections\n *\n * @default 'tenant'\n */\n name?: string\n }\n /**\n * Field configuration for the field added to the users collection\n *\n * If `includeDefaultField` is `false`, you must include the field on your users collection manually\n * This is useful if you want to customize the field or place the field in a specific location\n */\n tenantsArrayField?:\n | {\n /**\n * Access configuration for the array field\n */\n arrayFieldAccess?: ArrayField['access']\n /**\n * Name of the array field\n *\n * @default 'tenants'\n */\n arrayFieldName?: string\n /**\n * Name of the tenant field\n *\n * @default 'tenant'\n */\n arrayTenantFieldName?: string\n /**\n * When `includeDefaultField` is `true`, the field will be added to the users collection automatically\n */\n includeDefaultField?: true\n /**\n * Additional fields to include on the tenants array field\n */\n rowFields?: Field[]\n /**\n * Access configuration for the tenant field\n */\n tenantFieldAccess?: RelationshipField['access']\n }\n | {\n arrayFieldAccess?: never\n arrayFieldName?: string\n arrayTenantFieldName?: string\n /**\n * When `includeDefaultField` is `false`, you must include the field on your users collection manually\n */\n includeDefaultField?: false\n rowFields?: never\n tenantFieldAccess?: never\n }\n /**\n * Customize tenant selector label\n *\n * Either a string or an object where the keys are i18n codes and the values are the string labels\n */\n tenantSelectorLabel?:\n | Partial<{\n [key in AcceptedLanguages]?: string\n }>\n | string\n /**\n * The slug for the tenant collection\n *\n * @default 'tenants'\n */\n tenantsSlug?: string\n /**\n * Function that determines if a user has access to _all_ tenants\n *\n * Useful for super-admin type users\n */\n userHasAccessToAllTenants?: (\n user: ConfigTypes extends { user: unknown } ? ConfigTypes['user'] : TypedUser,\n ) => boolean\n /**\n * Opt out of adding access constraints to the tenants collection\n */\n useTenantsCollectionAccess?: boolean\n /**\n * Opt out including the baseListFilter to filter tenants by selected tenant\n */\n useTenantsListFilter?: boolean\n /**\n * Opt out including the baseListFilter to filter users by selected tenant\n */\n useUsersTenantFilter?: boolean\n}\n\nexport type Tenant<IDType = number | string> = {\n id: IDType\n name: string\n}\n\nexport type UserWithTenantsField = {\n tenants?:\n | {\n tenant: number | string | Tenant\n }[]\n | null\n} & TypedUser\n"],"names":[],"mappings":"AA6KA,WAMa"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { BaseFilter } from 'payload';
|
|
2
|
+
type Args = {
|
|
3
|
+
baseFilter?: BaseFilter;
|
|
4
|
+
customFilter: BaseFilter;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Combines a base filter with a tenant list filter
|
|
8
|
+
*
|
|
9
|
+
* Combines where constraints inside of an AND operator
|
|
10
|
+
*/
|
|
11
|
+
export declare const combineFilters: ({ baseFilter, customFilter }: Args) => BaseFilter;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=combineFilters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"combineFilters.d.ts","sourceRoot":"","sources":["../../src/utilities/combineFilters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAS,MAAM,SAAS,CAAA;AAEhD,KAAK,IAAI,GAAG;IACV,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,YAAY,EAAE,UAAU,CAAA;CACzB,CAAA;AACD;;;;GAIG;AACH,eAAO,MAAM,cAAc,iCACM,IAAI,KAAG,UA8BrC,CAAA"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Combines a base
|
|
2
|
+
* Combines a base filter with a tenant list filter
|
|
3
3
|
*
|
|
4
4
|
* Combines where constraints inside of an AND operator
|
|
5
|
-
*/ export const
|
|
5
|
+
*/ export const combineFilters = ({ baseFilter, customFilter })=>async (args)=>{
|
|
6
6
|
const filterConstraints = [];
|
|
7
|
-
if (typeof
|
|
8
|
-
const
|
|
9
|
-
if (
|
|
10
|
-
filterConstraints.push(
|
|
7
|
+
if (typeof baseFilter === 'function') {
|
|
8
|
+
const baseFilterResult = await baseFilter(args);
|
|
9
|
+
if (baseFilterResult) {
|
|
10
|
+
filterConstraints.push(baseFilterResult);
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
13
|
const customFilterResult = await customFilter(args);
|
|
@@ -29,4 +29,4 @@
|
|
|
29
29
|
return null;
|
|
30
30
|
};
|
|
31
31
|
|
|
32
|
-
//# sourceMappingURL=
|
|
32
|
+
//# sourceMappingURL=combineFilters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/combineFilters.ts"],"sourcesContent":["import type { BaseFilter, Where } from 'payload'\n\ntype Args = {\n baseFilter?: BaseFilter\n customFilter: BaseFilter\n}\n/**\n * Combines a base filter with a tenant list filter\n *\n * Combines where constraints inside of an AND operator\n */\nexport const combineFilters =\n ({ baseFilter, customFilter }: Args): BaseFilter =>\n async (args) => {\n const filterConstraints = []\n\n if (typeof baseFilter === 'function') {\n const baseFilterResult = await baseFilter(args)\n\n if (baseFilterResult) {\n filterConstraints.push(baseFilterResult)\n }\n }\n\n const customFilterResult = await customFilter(args)\n\n if (customFilterResult) {\n filterConstraints.push(customFilterResult)\n }\n\n if (filterConstraints.length) {\n const combinedWhere: Where = { and: [] }\n filterConstraints.forEach((constraint) => {\n if (combinedWhere.and && constraint && typeof constraint === 'object') {\n combinedWhere.and.push(constraint)\n }\n })\n return combinedWhere\n }\n\n // Access control will take it from here\n return null\n }\n"],"names":["combineFilters","baseFilter","customFilter","args","filterConstraints","baseFilterResult","push","customFilterResult","length","combinedWhere","and","forEach","constraint"],"mappings":"AAMA;;;;CAIC,GACD,OAAO,MAAMA,iBACX,CAAC,EAAEC,UAAU,EAAEC,YAAY,EAAQ,GACnC,OAAOC;QACL,MAAMC,oBAAoB,EAAE;QAE5B,IAAI,OAAOH,eAAe,YAAY;YACpC,MAAMI,mBAAmB,MAAMJ,WAAWE;YAE1C,IAAIE,kBAAkB;gBACpBD,kBAAkBE,IAAI,CAACD;YACzB;QACF;QAEA,MAAME,qBAAqB,MAAML,aAAaC;QAE9C,IAAII,oBAAoB;YACtBH,kBAAkBE,IAAI,CAACC;QACzB;QAEA,IAAIH,kBAAkBI,MAAM,EAAE;YAC5B,MAAMC,gBAAuB;gBAAEC,KAAK,EAAE;YAAC;YACvCN,kBAAkBO,OAAO,CAAC,CAACC;gBACzB,IAAIH,cAAcC,GAAG,IAAIE,cAAc,OAAOA,eAAe,UAAU;oBACrEH,cAAcC,GAAG,CAACJ,IAAI,CAACM;gBACzB;YACF;YACA,OAAOH;QACT;QAEA,wCAAwC;QACxC,OAAO;IACT,EAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@payloadcms/plugin-multi-tenant",
|
|
3
|
-
"version": "3.51.0-canary.
|
|
3
|
+
"version": "3.51.0-canary.2",
|
|
4
4
|
"description": "Multi Tenant plugin for Payload",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"payload",
|
|
@@ -81,14 +81,14 @@
|
|
|
81
81
|
],
|
|
82
82
|
"devDependencies": {
|
|
83
83
|
"@payloadcms/eslint-config": "3.28.0",
|
|
84
|
-
"@payloadcms/
|
|
85
|
-
"@payloadcms/
|
|
86
|
-
"payload": "3.51.0-canary.
|
|
84
|
+
"@payloadcms/ui": "3.51.0-canary.2",
|
|
85
|
+
"@payloadcms/translations": "3.51.0-canary.2",
|
|
86
|
+
"payload": "3.51.0-canary.2"
|
|
87
87
|
},
|
|
88
88
|
"peerDependencies": {
|
|
89
89
|
"next": "^15.2.3",
|
|
90
|
-
"@payloadcms/ui": "3.51.0-canary.
|
|
91
|
-
"payload": "3.51.0-canary.
|
|
90
|
+
"@payloadcms/ui": "3.51.0-canary.2",
|
|
91
|
+
"payload": "3.51.0-canary.2"
|
|
92
92
|
},
|
|
93
93
|
"homepage:": "https://payloadcms.com",
|
|
94
94
|
"scripts": {
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type { BaseListFilter } from 'payload';
|
|
2
|
-
type Args = {
|
|
3
|
-
baseListFilter?: BaseListFilter;
|
|
4
|
-
customFilter: BaseListFilter;
|
|
5
|
-
};
|
|
6
|
-
/**
|
|
7
|
-
* Combines a base list filter with a tenant list filter
|
|
8
|
-
*
|
|
9
|
-
* Combines where constraints inside of an AND operator
|
|
10
|
-
*/
|
|
11
|
-
export declare const combineListFilters: ({ baseListFilter, customFilter }: Args) => BaseListFilter;
|
|
12
|
-
export {};
|
|
13
|
-
//# sourceMappingURL=combineListFilters.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"combineListFilters.d.ts","sourceRoot":"","sources":["../../src/utilities/combineListFilters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAS,MAAM,SAAS,CAAA;AAEpD,KAAK,IAAI,GAAG;IACV,cAAc,CAAC,EAAE,cAAc,CAAA;IAC/B,YAAY,EAAE,cAAc,CAAA;CAC7B,CAAA;AACD;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,qCACM,IAAI,KAAG,cA8BzC,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/combineListFilters.ts"],"sourcesContent":["import type { BaseListFilter, Where } from 'payload'\n\ntype Args = {\n baseListFilter?: BaseListFilter\n customFilter: BaseListFilter\n}\n/**\n * Combines a base list filter with a tenant list filter\n *\n * Combines where constraints inside of an AND operator\n */\nexport const combineListFilters =\n ({ baseListFilter, customFilter }: Args): BaseListFilter =>\n async (args) => {\n const filterConstraints = []\n\n if (typeof baseListFilter === 'function') {\n const baseListFilterResult = await baseListFilter(args)\n\n if (baseListFilterResult) {\n filterConstraints.push(baseListFilterResult)\n }\n }\n\n const customFilterResult = await customFilter(args)\n\n if (customFilterResult) {\n filterConstraints.push(customFilterResult)\n }\n\n if (filterConstraints.length) {\n const combinedWhere: Where = { and: [] }\n filterConstraints.forEach((constraint) => {\n if (combinedWhere.and && constraint && typeof constraint === 'object') {\n combinedWhere.and.push(constraint)\n }\n })\n return combinedWhere\n }\n\n // Access control will take it from here\n return null\n }\n"],"names":["combineListFilters","baseListFilter","customFilter","args","filterConstraints","baseListFilterResult","push","customFilterResult","length","combinedWhere","and","forEach","constraint"],"mappings":"AAMA;;;;CAIC,GACD,OAAO,MAAMA,qBACX,CAAC,EAAEC,cAAc,EAAEC,YAAY,EAAQ,GACvC,OAAOC;QACL,MAAMC,oBAAoB,EAAE;QAE5B,IAAI,OAAOH,mBAAmB,YAAY;YACxC,MAAMI,uBAAuB,MAAMJ,eAAeE;YAElD,IAAIE,sBAAsB;gBACxBD,kBAAkBE,IAAI,CAACD;YACzB;QACF;QAEA,MAAME,qBAAqB,MAAML,aAAaC;QAE9C,IAAII,oBAAoB;YACtBH,kBAAkBE,IAAI,CAACC;QACzB;QAEA,IAAIH,kBAAkBI,MAAM,EAAE;YAC5B,MAAMC,gBAAuB;gBAAEC,KAAK,EAAE;YAAC;YACvCN,kBAAkBO,OAAO,CAAC,CAACC;gBACzB,IAAIH,cAAcC,GAAG,IAAIE,cAAc,OAAOA,eAAe,UAAU;oBACrEH,cAAcC,GAAG,CAACJ,IAAI,CAACM;gBACzB;YACF;YACA,OAAOH;QACT;QAEA,wCAAwC;QACxC,OAAO;IACT,EAAC"}
|