@payloadcms/plugin-multi-tenant 3.20.0-canary.260f830 → 3.20.0-canary.296a49c

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 (36) hide show
  1. package/dist/fields/tenantField/index.d.ts.map +1 -1
  2. package/dist/fields/tenantField/index.js +1 -7
  3. package/dist/fields/tenantField/index.js.map +1 -1
  4. package/dist/fields/tenantsArrayField/index.d.ts +0 -1
  5. package/dist/fields/tenantsArrayField/index.d.ts.map +1 -1
  6. package/dist/fields/tenantsArrayField/index.js +1 -1
  7. package/dist/fields/tenantsArrayField/index.js.map +1 -1
  8. package/dist/hooks/afterTenantDelete.d.ts +2 -3
  9. package/dist/hooks/afterTenantDelete.d.ts.map +1 -1
  10. package/dist/hooks/afterTenantDelete.js +3 -9
  11. package/dist/hooks/afterTenantDelete.js.map +1 -1
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +3 -10
  14. package/dist/index.js.map +1 -1
  15. package/dist/utilities/addFilterOptionsToFields.d.ts +1 -3
  16. package/dist/utilities/addFilterOptionsToFields.d.ts.map +1 -1
  17. package/dist/utilities/addFilterOptionsToFields.js +10 -35
  18. package/dist/utilities/addFilterOptionsToFields.js.map +1 -1
  19. package/dist/utilities/getGlobalViewRedirect.d.ts.map +1 -1
  20. package/dist/utilities/getGlobalViewRedirect.js +1 -6
  21. package/dist/utilities/getGlobalViewRedirect.js.map +1 -1
  22. package/dist/utilities/getTenantFromCookie.js +1 -1
  23. package/dist/utilities/getTenantFromCookie.js.map +1 -1
  24. package/dist/utilities/getTenantListFilter.d.ts +1 -2
  25. package/dist/utilities/getTenantListFilter.d.ts.map +1 -1
  26. package/dist/utilities/getTenantListFilter.js +2 -7
  27. package/dist/utilities/getTenantListFilter.js.map +1 -1
  28. package/dist/utilities/withTenantListFilter.d.ts +1 -2
  29. package/dist/utilities/withTenantListFilter.d.ts.map +1 -1
  30. package/dist/utilities/withTenantListFilter.js +2 -3
  31. package/dist/utilities/withTenantListFilter.js.map +1 -1
  32. package/package.json +5 -5
  33. package/dist/utilities/getCollectionIDType.d.ts +0 -8
  34. package/dist/utilities/getCollectionIDType.d.ts.map +0 -1
  35. package/dist/utilities/getCollectionIDType.js +0 -5
  36. package/dist/utilities/getCollectionIDType.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fields/tenantField/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAMhD,KAAK,IAAI,GAAG;IACV,MAAM,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAA;IACpC,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,qBAAqB,EAAE,MAAM,CAAA;IAC7B,MAAM,EAAE,OAAO,CAAA;CAChB,CAAA;AACD,eAAO,MAAM,WAAW,4DAMrB,IAAI,KAAG,iBA2CR,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fields/tenantField/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAKhD,KAAK,IAAI,GAAG;IACV,MAAM,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAA;IACpC,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,qBAAqB,EAAE,MAAM,CAAA;IAC7B,MAAM,EAAE,OAAO,CAAA;CAChB,CAAA;AACD,eAAO,MAAM,WAAW,4DAMrB,IAAI,KAAG,iBAqCR,CAAA"}
@@ -1,5 +1,4 @@
1
1
  import { APIError } from 'payload';
2
- import { getCollectionIDType } from '../../utilities/getCollectionIDType.js';
3
2
  import { getTenantFromCookie } from '../../utilities/getTenantFromCookie.js';
4
3
  export const tenantField = ({ name, access = undefined, debug, tenantsCollectionSlug, unique })=>({
5
4
  name,
@@ -24,18 +23,13 @@ export const tenantField = ({ name, access = undefined, debug, tenantsCollection
24
23
  hooks: {
25
24
  beforeChange: [
26
25
  ({ req, value })=>{
27
- const idType = getCollectionIDType({
28
- collectionSlug: tenantsCollectionSlug,
29
- payload: req.payload
30
- });
31
26
  if (!value) {
32
- const tenantFromCookie = getTenantFromCookie(req.headers, idType);
27
+ const tenantFromCookie = getTenantFromCookie(req.headers, req.payload.db.defaultIDType);
33
28
  if (tenantFromCookie) {
34
29
  return tenantFromCookie;
35
30
  }
36
31
  throw new APIError('You must select a tenant', 400, null, true);
37
32
  }
38
- return idType === 'number' ? parseFloat(value) : value;
39
33
  }
40
34
  ]
41
35
  },
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/fields/tenantField/index.ts"],"sourcesContent":["import { type RelationshipField } from 'payload'\nimport { APIError } from 'payload'\n\nimport { getCollectionIDType } from '../../utilities/getCollectionIDType.js'\nimport { getTenantFromCookie } from '../../utilities/getTenantFromCookie.js'\n\ntype Args = {\n access?: RelationshipField['access']\n debug?: boolean\n name: string\n tenantsCollectionSlug: string\n unique: boolean\n}\nexport const tenantField = ({\n name,\n access = undefined,\n debug,\n tenantsCollectionSlug,\n unique,\n}: Args): RelationshipField => ({\n name,\n type: 'relationship',\n access,\n admin: {\n allowCreate: false,\n allowEdit: false,\n components: {\n Field: {\n clientProps: {\n debug,\n unique,\n },\n path: '@payloadcms/plugin-multi-tenant/client#TenantField',\n },\n },\n disableListColumn: true,\n disableListFilter: true,\n },\n hasMany: false,\n 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 ],\n },\n index: true,\n label: 'Assigned Tenant',\n relationTo: tenantsCollectionSlug,\n unique,\n})\n"],"names":["APIError","getCollectionIDType","getTenantFromCookie","tenantField","name","access","undefined","debug","tenantsCollectionSlug","unique","type","admin","allowCreate","allowEdit","components","Field","clientProps","path","disableListColumn","disableListFilter","hasMany","hooks","beforeChange","req","value","idType","collectionSlug","payload","tenantFromCookie","headers","parseFloat","index","label","relationTo"],"mappings":"AACA,SAASA,QAAQ,QAAQ,UAAS;AAElC,SAASC,mBAAmB,QAAQ,yCAAwC;AAC5E,SAASC,mBAAmB,QAAQ,yCAAwC;AAS5E,OAAO,MAAMC,cAAc,CAAC,EAC1BC,IAAI,EACJC,SAASC,SAAS,EAClBC,KAAK,EACLC,qBAAqB,EACrBC,MAAM,EACD,GAAyB,CAAA;QAC9BL;QACAM,MAAM;QACNL;QACAM,OAAO;YACLC,aAAa;YACbC,WAAW;YACXC,YAAY;gBACVC,OAAO;oBACLC,aAAa;wBACXT;wBACAE;oBACF;oBACAQ,MAAM;gBACR;YACF;YACAC,mBAAmB;YACnBC,mBAAmB;QACrB;QACAC,SAAS;QACTC,OAAO;YACLC,cAAc;gBACZ,CAAC,EAAEC,GAAG,EAAEC,KAAK,EAAE;oBACb,MAAMC,SAASxB,oBAAoB;wBACjCyB,gBAAgBlB;wBAChBmB,SAASJ,IAAII,OAAO;oBACtB;oBACA,IAAI,CAACH,OAAO;wBACV,MAAMI,mBAAmB1B,oBAAoBqB,IAAIM,OAAO,EAAEJ;wBAC1D,IAAIG,kBAAkB;4BACpB,OAAOA;wBACT;wBACA,MAAM,IAAI5B,SAAS,4BAA4B,KAAK,MAAM;oBAC5D;oBAEA,OAAOyB,WAAW,WAAWK,WAAWN,SAASA;gBACnD;aACD;QACH;QACAO,OAAO;QACPC,OAAO;QACPC,YAAYzB;QACZC;IACF,CAAA,EAAE"}
1
+ {"version":3,"sources":["../../../src/fields/tenantField/index.ts"],"sourcesContent":["import { type RelationshipField } from 'payload'\nimport { APIError } from 'payload'\n\nimport { getTenantFromCookie } from '../../utilities/getTenantFromCookie.js'\n\ntype Args = {\n access?: RelationshipField['access']\n debug?: boolean\n name: string\n tenantsCollectionSlug: string\n unique: boolean\n}\nexport const tenantField = ({\n name,\n access = undefined,\n debug,\n tenantsCollectionSlug,\n unique,\n}: Args): RelationshipField => ({\n name,\n type: 'relationship',\n access,\n admin: {\n allowCreate: false,\n allowEdit: false,\n components: {\n Field: {\n clientProps: {\n debug,\n unique,\n },\n path: '@payloadcms/plugin-multi-tenant/client#TenantField',\n },\n },\n disableListColumn: true,\n disableListFilter: true,\n },\n hasMany: false,\n hooks: {\n beforeChange: [\n ({ req, value }) => {\n if (!value) {\n const tenantFromCookie = getTenantFromCookie(req.headers, req.payload.db.defaultIDType)\n if (tenantFromCookie) {\n return tenantFromCookie\n }\n throw new APIError('You must select a tenant', 400, null, true)\n }\n },\n ],\n },\n index: true,\n label: 'Assigned Tenant',\n relationTo: tenantsCollectionSlug,\n unique,\n})\n"],"names":["APIError","getTenantFromCookie","tenantField","name","access","undefined","debug","tenantsCollectionSlug","unique","type","admin","allowCreate","allowEdit","components","Field","clientProps","path","disableListColumn","disableListFilter","hasMany","hooks","beforeChange","req","value","tenantFromCookie","headers","payload","db","defaultIDType","index","label","relationTo"],"mappings":"AACA,SAASA,QAAQ,QAAQ,UAAS;AAElC,SAASC,mBAAmB,QAAQ,yCAAwC;AAS5E,OAAO,MAAMC,cAAc,CAAC,EAC1BC,IAAI,EACJC,SAASC,SAAS,EAClBC,KAAK,EACLC,qBAAqB,EACrBC,MAAM,EACD,GAAyB,CAAA;QAC9BL;QACAM,MAAM;QACNL;QACAM,OAAO;YACLC,aAAa;YACbC,WAAW;YACXC,YAAY;gBACVC,OAAO;oBACLC,aAAa;wBACXT;wBACAE;oBACF;oBACAQ,MAAM;gBACR;YACF;YACAC,mBAAmB;YACnBC,mBAAmB;QACrB;QACAC,SAAS;QACTC,OAAO;YACLC,cAAc;gBACZ,CAAC,EAAEC,GAAG,EAAEC,KAAK,EAAE;oBACb,IAAI,CAACA,OAAO;wBACV,MAAMC,mBAAmBvB,oBAAoBqB,IAAIG,OAAO,EAAEH,IAAII,OAAO,CAACC,EAAE,CAACC,aAAa;wBACtF,IAAIJ,kBAAkB;4BACpB,OAAOA;wBACT;wBACA,MAAM,IAAIxB,SAAS,4BAA4B,KAAK,MAAM;oBAC5D;gBACF;aACD;QACH;QACA6B,OAAO;QACPC,OAAO;QACPC,YAAYxB;QACZC;IACF,CAAA,EAAE"}
@@ -3,6 +3,5 @@ export declare const tenantsArrayField: (args: {
3
3
  arrayFieldAccess?: ArrayField["access"];
4
4
  rowFields?: ArrayField["fields"];
5
5
  tenantFieldAccess?: RelationshipField["access"];
6
- tenantsCollectionSlug: string;
7
6
  }) => ArrayField;
8
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fields/tenantsArrayField/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAE5D,eAAO,MAAM,iBAAiB,SAAU;IACtC,gBAAgB,CAAC,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAA;IACvC,SAAS,CAAC,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAA;IAChC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAA;IAC/C,qBAAqB,EAAE,MAAM,CAAA;CAC9B,KAAG,UAiBF,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fields/tenantsArrayField/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAE5D,eAAO,MAAM,iBAAiB,SAAU;IACtC,gBAAgB,CAAC,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAA;IACvC,SAAS,CAAC,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAA;IAChC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAA;CAChD,KAAG,UAiBF,CAAA"}
@@ -8,7 +8,7 @@ export const tenantsArrayField = (args)=>({
8
8
  type: 'relationship',
9
9
  access: args.tenantFieldAccess,
10
10
  index: true,
11
- relationTo: args.tenantsCollectionSlug,
11
+ relationTo: 'tenants',
12
12
  required: true,
13
13
  saveToJWT: true
14
14
  },
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/fields/tenantsArrayField/index.ts"],"sourcesContent":["import type { ArrayField, RelationshipField } from 'payload'\n\nexport const tenantsArrayField = (args: {\n arrayFieldAccess?: ArrayField['access']\n rowFields?: ArrayField['fields']\n tenantFieldAccess?: RelationshipField['access']\n tenantsCollectionSlug: string\n}): ArrayField => ({\n name: 'tenants',\n type: 'array',\n access: args?.arrayFieldAccess,\n fields: [\n {\n name: 'tenant',\n type: 'relationship',\n access: args.tenantFieldAccess,\n index: true,\n relationTo: args.tenantsCollectionSlug,\n required: true,\n saveToJWT: true,\n },\n ...(args?.rowFields || []),\n ],\n saveToJWT: true,\n})\n"],"names":["tenantsArrayField","args","name","type","access","arrayFieldAccess","fields","tenantFieldAccess","index","relationTo","tenantsCollectionSlug","required","saveToJWT","rowFields"],"mappings":"AAEA,OAAO,MAAMA,oBAAoB,CAACC,OAKf,CAAA;QACjBC,MAAM;QACNC,MAAM;QACNC,QAAQH,MAAMI;QACdC,QAAQ;YACN;gBACEJ,MAAM;gBACNC,MAAM;gBACNC,QAAQH,KAAKM,iBAAiB;gBAC9BC,OAAO;gBACPC,YAAYR,KAAKS,qBAAqB;gBACtCC,UAAU;gBACVC,WAAW;YACb;eACIX,MAAMY,aAAa,EAAE;SAC1B;QACDD,WAAW;IACb,CAAA,EAAE"}
1
+ {"version":3,"sources":["../../../src/fields/tenantsArrayField/index.ts"],"sourcesContent":["import type { ArrayField, RelationshipField } from 'payload'\n\nexport const tenantsArrayField = (args: {\n arrayFieldAccess?: ArrayField['access']\n rowFields?: ArrayField['fields']\n tenantFieldAccess?: RelationshipField['access']\n}): ArrayField => ({\n name: 'tenants',\n type: 'array',\n access: args?.arrayFieldAccess,\n fields: [\n {\n name: 'tenant',\n type: 'relationship',\n access: args.tenantFieldAccess,\n index: true,\n relationTo: 'tenants',\n required: true,\n saveToJWT: true,\n },\n ...(args?.rowFields || []),\n ],\n saveToJWT: true,\n})\n"],"names":["tenantsArrayField","args","name","type","access","arrayFieldAccess","fields","tenantFieldAccess","index","relationTo","required","saveToJWT","rowFields"],"mappings":"AAEA,OAAO,MAAMA,oBAAoB,CAACC,OAIf,CAAA;QACjBC,MAAM;QACNC,MAAM;QACNC,QAAQH,MAAMI;QACdC,QAAQ;YACN;gBACEJ,MAAM;gBACNC,MAAM;gBACNC,QAAQH,KAAKM,iBAAiB;gBAC9BC,OAAO;gBACPC,YAAY;gBACZC,UAAU;gBACVC,WAAW;YACb;eACIV,MAAMW,aAAa,EAAE;SAC1B;QACDD,WAAW;IACb,CAAA,EAAE"}
@@ -3,7 +3,6 @@ type Args = {
3
3
  collection: CollectionConfig;
4
4
  enabledSlugs: string[];
5
5
  tenantFieldName: string;
6
- tenantsCollectionSlug: string;
7
6
  usersSlug: string;
8
7
  };
9
8
  /**
@@ -11,7 +10,7 @@ type Args = {
11
10
  * - delete documents related to tenant
12
11
  * - remove tenant from users
13
12
  */
14
- export declare const addTenantCleanup: ({ collection, enabledSlugs, tenantFieldName, tenantsCollectionSlug, usersSlug, }: Args) => void;
15
- export declare const afterTenantDelete: ({ enabledSlugs, tenantFieldName, tenantsCollectionSlug, usersSlug, }: Omit<Args, "collection">) => CollectionAfterDeleteHook;
13
+ export declare const addTenantCleanup: ({ collection, enabledSlugs, tenantFieldName, usersSlug, }: Args) => void;
14
+ export declare const afterTenantDelete: ({ enabledSlugs, tenantFieldName, usersSlug, }: Omit<Args, "collection">) => CollectionAfterDeleteHook;
16
15
  export {};
17
16
  //# sourceMappingURL=afterTenantDelete.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"afterTenantDelete.d.ts","sourceRoot":"","sources":["../../src/hooks/afterTenantDelete.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EACzB,gBAAgB,EAGjB,MAAM,SAAS,CAAA;AAShB,KAAK,IAAI,GAAG;IACV,UAAU,EAAE,gBAAgB,CAAA;IAC5B,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,eAAe,EAAE,MAAM,CAAA;IACvB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AACD;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,qFAM1B,IAAI,SAeN,CAAA;AAED,eAAO,MAAM,iBAAiB,yEAMzB,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,KAAG,yBAgE7B,CAAA"}
1
+ {"version":3,"file":"afterTenantDelete.d.ts","sourceRoot":"","sources":["../../src/hooks/afterTenantDelete.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EACzB,gBAAgB,EAGjB,MAAM,SAAS,CAAA;AAQhB,KAAK,IAAI,GAAG;IACV,UAAU,EAAE,gBAAgB,CAAA;IAC5B,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,eAAe,EAAE,MAAM,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AACD;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,8DAK1B,IAAI,SAcN,CAAA;AAED,eAAO,MAAM,iBAAiB,kDAKzB,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,KAAG,yBA4D7B,CAAA"}
@@ -1,11 +1,10 @@
1
1
  import { generateCookie, mergeHeaders } from 'payload';
2
- import { getCollectionIDType } from '../utilities/getCollectionIDType.js';
3
2
  import { getTenantFromCookie } from '../utilities/getTenantFromCookie.js';
4
3
  /**
5
4
  * Add cleanup logic when tenant is deleted
6
5
  * - delete documents related to tenant
7
6
  * - remove tenant from users
8
- */ export const addTenantCleanup = ({ collection, enabledSlugs, tenantFieldName, tenantsCollectionSlug, usersSlug })=>{
7
+ */ export const addTenantCleanup = ({ collection, enabledSlugs, tenantFieldName, usersSlug })=>{
9
8
  if (!collection.hooks) {
10
9
  collection.hooks = {};
11
10
  }
@@ -15,16 +14,11 @@ import { getTenantFromCookie } from '../utilities/getTenantFromCookie.js';
15
14
  collection.hooks.afterDelete.push(afterTenantDelete({
16
15
  enabledSlugs,
17
16
  tenantFieldName,
18
- tenantsCollectionSlug,
19
17
  usersSlug
20
18
  }));
21
19
  };
22
- export const afterTenantDelete = ({ enabledSlugs, tenantFieldName, tenantsCollectionSlug, usersSlug })=>async ({ id, req })=>{
23
- const idType = getCollectionIDType({
24
- collectionSlug: tenantsCollectionSlug,
25
- payload: req.payload
26
- });
27
- const currentTenantCookieID = getTenantFromCookie(req.headers, idType);
20
+ export const afterTenantDelete = ({ enabledSlugs, tenantFieldName, usersSlug })=>async ({ id, req })=>{
21
+ const currentTenantCookieID = getTenantFromCookie(req.headers, req.payload.db.defaultIDType);
28
22
  if (currentTenantCookieID === id) {
29
23
  const newHeaders = new Headers({
30
24
  'Set-Cookie': generateCookie({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/afterTenantDelete.ts"],"sourcesContent":["import type {\n CollectionAfterDeleteHook,\n CollectionConfig,\n JsonObject,\n PaginatedDocs,\n} from 'payload'\n\nimport { generateCookie, mergeHeaders } from 'payload'\n\nimport type { UserWithTenantsField } from '../types.js'\n\nimport { getCollectionIDType } from '../utilities/getCollectionIDType.js'\nimport { getTenantFromCookie } from '../utilities/getTenantFromCookie.js'\n\ntype Args = {\n collection: CollectionConfig\n enabledSlugs: string[]\n tenantFieldName: string\n tenantsCollectionSlug: string\n usersSlug: string\n}\n/**\n * Add cleanup logic when tenant is deleted\n * - delete documents related to tenant\n * - remove tenant from users\n */\nexport const addTenantCleanup = ({\n collection,\n enabledSlugs,\n tenantFieldName,\n tenantsCollectionSlug,\n usersSlug,\n}: Args) => {\n if (!collection.hooks) {\n collection.hooks = {}\n }\n if (!collection.hooks?.afterDelete) {\n collection.hooks.afterDelete = []\n }\n collection.hooks.afterDelete.push(\n afterTenantDelete({\n enabledSlugs,\n tenantFieldName,\n tenantsCollectionSlug,\n usersSlug,\n }),\n )\n}\n\nexport const afterTenantDelete =\n ({\n enabledSlugs,\n tenantFieldName,\n tenantsCollectionSlug,\n usersSlug,\n }: Omit<Args, 'collection'>): CollectionAfterDeleteHook =>\n async ({ id, req }) => {\n const idType = getCollectionIDType({\n collectionSlug: tenantsCollectionSlug,\n payload: req.payload,\n })\n const currentTenantCookieID = getTenantFromCookie(req.headers, idType)\n if (currentTenantCookieID === id) {\n const newHeaders = new Headers({\n 'Set-Cookie': generateCookie<string>({\n name: 'payload-tenant',\n expires: new Date(Date.now() - 1000),\n path: '/',\n returnCookieAsObject: false,\n value: '',\n }),\n })\n\n req.responseHeaders = req.responseHeaders\n ? mergeHeaders(req.responseHeaders, newHeaders)\n : newHeaders\n }\n const cleanupPromises: Promise<JsonObject>[] = []\n enabledSlugs.forEach((slug) => {\n cleanupPromises.push(\n req.payload.delete({\n collection: slug,\n where: {\n [tenantFieldName]: {\n equals: id,\n },\n },\n }),\n )\n })\n\n try {\n const usersWithTenant = (await req.payload.find({\n collection: usersSlug,\n depth: 0,\n limit: 0,\n where: {\n 'tenants.tenant': {\n equals: id,\n },\n },\n })) as PaginatedDocs<UserWithTenantsField>\n\n usersWithTenant?.docs?.forEach((user) => {\n cleanupPromises.push(\n req.payload.update({\n id: user.id,\n collection: usersSlug,\n data: {\n tenants: (user.tenants || []).filter(({ tenant: tenantID }) => tenantID !== id),\n },\n }),\n )\n })\n } catch (e) {\n console.error('Error deleting tenants from users:', e)\n }\n\n await Promise.all(cleanupPromises)\n }\n"],"names":["generateCookie","mergeHeaders","getCollectionIDType","getTenantFromCookie","addTenantCleanup","collection","enabledSlugs","tenantFieldName","tenantsCollectionSlug","usersSlug","hooks","afterDelete","push","afterTenantDelete","id","req","idType","collectionSlug","payload","currentTenantCookieID","headers","newHeaders","Headers","name","expires","Date","now","path","returnCookieAsObject","value","responseHeaders","cleanupPromises","forEach","slug","delete","where","equals","usersWithTenant","find","depth","limit","docs","user","update","data","tenants","filter","tenant","tenantID","e","console","error","Promise","all"],"mappings":"AAOA,SAASA,cAAc,EAAEC,YAAY,QAAQ,UAAS;AAItD,SAASC,mBAAmB,QAAQ,sCAAqC;AACzE,SAASC,mBAAmB,QAAQ,sCAAqC;AASzE;;;;CAIC,GACD,OAAO,MAAMC,mBAAmB,CAAC,EAC/BC,UAAU,EACVC,YAAY,EACZC,eAAe,EACfC,qBAAqB,EACrBC,SAAS,EACJ;IACL,IAAI,CAACJ,WAAWK,KAAK,EAAE;QACrBL,WAAWK,KAAK,GAAG,CAAC;IACtB;IACA,IAAI,CAACL,WAAWK,KAAK,EAAEC,aAAa;QAClCN,WAAWK,KAAK,CAACC,WAAW,GAAG,EAAE;IACnC;IACAN,WAAWK,KAAK,CAACC,WAAW,CAACC,IAAI,CAC/BC,kBAAkB;QAChBP;QACAC;QACAC;QACAC;IACF;AAEJ,EAAC;AAED,OAAO,MAAMI,oBACX,CAAC,EACCP,YAAY,EACZC,eAAe,EACfC,qBAAqB,EACrBC,SAAS,EACgB,GAC3B,OAAO,EAAEK,EAAE,EAAEC,GAAG,EAAE;QAChB,MAAMC,SAASd,oBAAoB;YACjCe,gBAAgBT;YAChBU,SAASH,IAAIG,OAAO;QACtB;QACA,MAAMC,wBAAwBhB,oBAAoBY,IAAIK,OAAO,EAAEJ;QAC/D,IAAIG,0BAA0BL,IAAI;YAChC,MAAMO,aAAa,IAAIC,QAAQ;gBAC7B,cAActB,eAAuB;oBACnCuB,MAAM;oBACNC,SAAS,IAAIC,KAAKA,KAAKC,GAAG,KAAK;oBAC/BC,MAAM;oBACNC,sBAAsB;oBACtBC,OAAO;gBACT;YACF;YAEAd,IAAIe,eAAe,GAAGf,IAAIe,eAAe,GACrC7B,aAAac,IAAIe,eAAe,EAAET,cAClCA;QACN;QACA,MAAMU,kBAAyC,EAAE;QACjDzB,aAAa0B,OAAO,CAAC,CAACC;YACpBF,gBAAgBnB,IAAI,CAClBG,IAAIG,OAAO,CAACgB,MAAM,CAAC;gBACjB7B,YAAY4B;gBACZE,OAAO;oBACL,CAAC5B,gBAAgB,EAAE;wBACjB6B,QAAQtB;oBACV;gBACF;YACF;QAEJ;QAEA,IAAI;YACF,MAAMuB,kBAAmB,MAAMtB,IAAIG,OAAO,CAACoB,IAAI,CAAC;gBAC9CjC,YAAYI;gBACZ8B,OAAO;gBACPC,OAAO;gBACPL,OAAO;oBACL,kBAAkB;wBAChBC,QAAQtB;oBACV;gBACF;YACF;YAEAuB,iBAAiBI,MAAMT,QAAQ,CAACU;gBAC9BX,gBAAgBnB,IAAI,CAClBG,IAAIG,OAAO,CAACyB,MAAM,CAAC;oBACjB7B,IAAI4B,KAAK5B,EAAE;oBACXT,YAAYI;oBACZmC,MAAM;wBACJC,SAAS,AAACH,CAAAA,KAAKG,OAAO,IAAI,EAAE,AAAD,EAAGC,MAAM,CAAC,CAAC,EAAEC,QAAQC,QAAQ,EAAE,GAAKA,aAAalC;oBAC9E;gBACF;YAEJ;QACF,EAAE,OAAOmC,GAAG;YACVC,QAAQC,KAAK,CAAC,sCAAsCF;QACtD;QAEA,MAAMG,QAAQC,GAAG,CAACtB;IACpB,EAAC"}
1
+ {"version":3,"sources":["../../src/hooks/afterTenantDelete.ts"],"sourcesContent":["import type {\n CollectionAfterDeleteHook,\n CollectionConfig,\n JsonObject,\n PaginatedDocs,\n} from 'payload'\n\nimport { generateCookie, mergeHeaders } from 'payload'\n\nimport type { UserWithTenantsField } from '../types.js'\n\nimport { getTenantFromCookie } from '../utilities/getTenantFromCookie.js'\n\ntype Args = {\n collection: CollectionConfig\n enabledSlugs: string[]\n tenantFieldName: string\n usersSlug: string\n}\n/**\n * Add cleanup logic when tenant is deleted\n * - delete documents related to tenant\n * - remove tenant from users\n */\nexport const addTenantCleanup = ({\n collection,\n enabledSlugs,\n tenantFieldName,\n usersSlug,\n}: Args) => {\n if (!collection.hooks) {\n collection.hooks = {}\n }\n if (!collection.hooks?.afterDelete) {\n collection.hooks.afterDelete = []\n }\n collection.hooks.afterDelete.push(\n afterTenantDelete({\n enabledSlugs,\n tenantFieldName,\n usersSlug,\n }),\n )\n}\n\nexport const afterTenantDelete =\n ({\n enabledSlugs,\n tenantFieldName,\n usersSlug,\n }: Omit<Args, 'collection'>): CollectionAfterDeleteHook =>\n async ({ id, req }) => {\n const currentTenantCookieID = getTenantFromCookie(req.headers, req.payload.db.defaultIDType)\n if (currentTenantCookieID === id) {\n const newHeaders = new Headers({\n 'Set-Cookie': generateCookie<string>({\n name: 'payload-tenant',\n expires: new Date(Date.now() - 1000),\n path: '/',\n returnCookieAsObject: false,\n value: '',\n }),\n })\n\n req.responseHeaders = req.responseHeaders\n ? mergeHeaders(req.responseHeaders, newHeaders)\n : newHeaders\n }\n const cleanupPromises: Promise<JsonObject>[] = []\n enabledSlugs.forEach((slug) => {\n cleanupPromises.push(\n req.payload.delete({\n collection: slug,\n where: {\n [tenantFieldName]: {\n equals: id,\n },\n },\n }),\n )\n })\n\n try {\n const usersWithTenant = (await req.payload.find({\n collection: usersSlug,\n depth: 0,\n limit: 0,\n where: {\n 'tenants.tenant': {\n equals: id,\n },\n },\n })) as PaginatedDocs<UserWithTenantsField>\n\n usersWithTenant?.docs?.forEach((user) => {\n cleanupPromises.push(\n req.payload.update({\n id: user.id,\n collection: usersSlug,\n data: {\n tenants: (user.tenants || []).filter(({ tenant: tenantID }) => tenantID !== id),\n },\n }),\n )\n })\n } catch (e) {\n console.error('Error deleting tenants from users:', e)\n }\n\n await Promise.all(cleanupPromises)\n }\n"],"names":["generateCookie","mergeHeaders","getTenantFromCookie","addTenantCleanup","collection","enabledSlugs","tenantFieldName","usersSlug","hooks","afterDelete","push","afterTenantDelete","id","req","currentTenantCookieID","headers","payload","db","defaultIDType","newHeaders","Headers","name","expires","Date","now","path","returnCookieAsObject","value","responseHeaders","cleanupPromises","forEach","slug","delete","where","equals","usersWithTenant","find","depth","limit","docs","user","update","data","tenants","filter","tenant","tenantID","e","console","error","Promise","all"],"mappings":"AAOA,SAASA,cAAc,EAAEC,YAAY,QAAQ,UAAS;AAItD,SAASC,mBAAmB,QAAQ,sCAAqC;AAQzE;;;;CAIC,GACD,OAAO,MAAMC,mBAAmB,CAAC,EAC/BC,UAAU,EACVC,YAAY,EACZC,eAAe,EACfC,SAAS,EACJ;IACL,IAAI,CAACH,WAAWI,KAAK,EAAE;QACrBJ,WAAWI,KAAK,GAAG,CAAC;IACtB;IACA,IAAI,CAACJ,WAAWI,KAAK,EAAEC,aAAa;QAClCL,WAAWI,KAAK,CAACC,WAAW,GAAG,EAAE;IACnC;IACAL,WAAWI,KAAK,CAACC,WAAW,CAACC,IAAI,CAC/BC,kBAAkB;QAChBN;QACAC;QACAC;IACF;AAEJ,EAAC;AAED,OAAO,MAAMI,oBACX,CAAC,EACCN,YAAY,EACZC,eAAe,EACfC,SAAS,EACgB,GAC3B,OAAO,EAAEK,EAAE,EAAEC,GAAG,EAAE;QAChB,MAAMC,wBAAwBZ,oBAAoBW,IAAIE,OAAO,EAAEF,IAAIG,OAAO,CAACC,EAAE,CAACC,aAAa;QAC3F,IAAIJ,0BAA0BF,IAAI;YAChC,MAAMO,aAAa,IAAIC,QAAQ;gBAC7B,cAAcpB,eAAuB;oBACnCqB,MAAM;oBACNC,SAAS,IAAIC,KAAKA,KAAKC,GAAG,KAAK;oBAC/BC,MAAM;oBACNC,sBAAsB;oBACtBC,OAAO;gBACT;YACF;YAEAd,IAAIe,eAAe,GAAGf,IAAIe,eAAe,GACrC3B,aAAaY,IAAIe,eAAe,EAAET,cAClCA;QACN;QACA,MAAMU,kBAAyC,EAAE;QACjDxB,aAAayB,OAAO,CAAC,CAACC;YACpBF,gBAAgBnB,IAAI,CAClBG,IAAIG,OAAO,CAACgB,MAAM,CAAC;gBACjB5B,YAAY2B;gBACZE,OAAO;oBACL,CAAC3B,gBAAgB,EAAE;wBACjB4B,QAAQtB;oBACV;gBACF;YACF;QAEJ;QAEA,IAAI;YACF,MAAMuB,kBAAmB,MAAMtB,IAAIG,OAAO,CAACoB,IAAI,CAAC;gBAC9ChC,YAAYG;gBACZ8B,OAAO;gBACPC,OAAO;gBACPL,OAAO;oBACL,kBAAkB;wBAChBC,QAAQtB;oBACV;gBACF;YACF;YAEAuB,iBAAiBI,MAAMT,QAAQ,CAACU;gBAC9BX,gBAAgBnB,IAAI,CAClBG,IAAIG,OAAO,CAACyB,MAAM,CAAC;oBACjB7B,IAAI4B,KAAK5B,EAAE;oBACXR,YAAYG;oBACZmC,MAAM;wBACJC,SAAS,AAACH,CAAAA,KAAKG,OAAO,IAAI,EAAE,AAAD,EAAGC,MAAM,CAAC,CAAC,EAAEC,QAAQC,QAAQ,EAAE,GAAKA,aAAalC;oBAC9E;gBACF;YAEJ;QACF,EAAE,OAAOmC,GAAG;YACVC,QAAQC,KAAK,CAAC,sCAAsCF;QACtD;QAEA,MAAMG,QAAQC,GAAG,CAACtB;IACpB,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,MAAM,EAAE,MAAM,SAAS,CAAA;AAEvD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AAezD,eAAO,MAAM,iBAAiB,GAC3B,UAAU,gBAAgB,uBAAuB,CAAC,UAAU,CAAC,sBAC7C,MAAM,KAAG,MAkOzB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,MAAM,EAAE,MAAM,SAAS,CAAA;AAEvD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AAezD,eAAO,MAAM,iBAAiB,GAC3B,UAAU,gBAAgB,uBAAuB,CAAC,UAAU,CAAC,sBAC7C,MAAM,KAAG,MAyNzB,CAAA"}
package/dist/index.js CHANGED
@@ -57,10 +57,7 @@ export const multiTenantPlugin = (pluginConfig)=>(incomingConfig)=>{
57
57
  /**
58
58
  * Add tenants array field to users collection
59
59
  */ if (pluginConfig?.tenantsArrayField?.includeDefaultField !== false) {
60
- adminUsersCollection.fields.push(tenantsArrayField({
61
- ...pluginConfig?.tenantsArrayField || {},
62
- tenantsCollectionSlug
63
- }));
60
+ adminUsersCollection.fields.push(tenantsArrayField(pluginConfig?.tenantsArrayField || {}));
64
61
  }
65
62
  addCollectionAccess({
66
63
  collection: adminUsersCollection,
@@ -106,7 +103,6 @@ export const multiTenantPlugin = (pluginConfig)=>(incomingConfig)=>{
106
103
  ...globalCollectionSlugs
107
104
  ],
108
105
  tenantFieldName,
109
- tenantsCollectionSlug,
110
106
  usersSlug: adminUsersCollection.slug
111
107
  });
112
108
  }
@@ -120,9 +116,7 @@ export const multiTenantPlugin = (pluginConfig)=>(incomingConfig)=>{
120
116
  */ addFilterOptionsToFields({
121
117
  fields: collection.fields,
122
118
  tenantEnabledCollectionSlugs: collectionSlugs,
123
- tenantEnabledGlobalSlugs: globalCollectionSlugs,
124
- tenantFieldName,
125
- tenantsCollectionSlug
119
+ tenantEnabledGlobalSlugs: globalCollectionSlugs
126
120
  });
127
121
  /**
128
122
  * Add tenant field to enabled collections
@@ -141,8 +135,7 @@ export const multiTenantPlugin = (pluginConfig)=>(incomingConfig)=>{
141
135
  }
142
136
  collection.admin.baseListFilter = withTenantListFilter({
143
137
  baseListFilter: collection.admin?.baseListFilter,
144
- tenantFieldName,
145
- tenantsCollectionSlug
138
+ tenantFieldName
146
139
  });
147
140
  }
148
141
  if (pluginConfig.collections[collection.slug]?.useTenantAccess !== false) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { CollectionConfig, Config } from 'payload'\n\nimport type { MultiTenantPluginConfig } from './types.js'\n\nimport { tenantField } from './fields/tenantField/index.js'\nimport { tenantsArrayField } from './fields/tenantsArrayField/index.js'\nimport { addTenantCleanup } from './hooks/afterTenantDelete.js'\nimport { addCollectionAccess } from './utilities/addCollectionAccess.js'\nimport { addFilterOptionsToFields } from './utilities/addFilterOptionsToFields.js'\nimport { withTenantListFilter } from './utilities/withTenantListFilter.js'\n\nconst defaults = {\n tenantCollectionSlug: 'tenants',\n tenantFieldName: 'tenant',\n userTenantsArrayFieldName: 'tenants',\n}\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\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 tenantsCollectionSlug,\n }),\n )\n }\n\n addCollectionAccess({\n collection: adminUsersCollection,\n fieldName: 'tenants.tenant',\n userHasAccessToAllTenants,\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 /**\n * Add access control constraint to tenants collection\n * - constrains access a users assigned tenants\n */\n addCollectionAccess({\n collection,\n fieldName: 'id',\n userHasAccessToAllTenants,\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 })\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 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 * Collection baseListFilter with selected tenant constraint (if selected)\n */\n if (!collection.admin) {\n collection.admin = {}\n }\n collection.admin.baseListFilter = withTenantListFilter({\n baseListFilter: collection.admin?.baseListFilter,\n tenantFieldName,\n tenantsCollectionSlug,\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 collection,\n fieldName: tenantFieldName,\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 tenantsCollectionSlug: tenantCollection.slug,\n useAsTitle: tenantCollection.admin?.useAsTitle || 'id',\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 globalSlugs: globalCollectionSlugs,\n tenantFieldName,\n tenantsCollectionSlug,\n useAsTitle: tenantCollection.admin?.useAsTitle || 'id',\n },\n })\n }\n\n /**\n * Add tenant selector to admin UI\n */\n incomingConfig.admin.components.beforeNavLinks.push({\n path: '@payloadcms/plugin-multi-tenant/client#TenantSelector',\n })\n\n return incomingConfig\n }\n"],"names":["tenantField","tenantsArrayField","addTenantCleanup","addCollectionAccess","addFilterOptionsToFields","withTenantListFilter","defaults","tenantCollectionSlug","tenantFieldName","userTenantsArrayFieldName","multiTenantPlugin","pluginConfig","incomingConfig","enabled","userHasAccessToAllTenants","tenantsCollectionSlug","tenantsSlug","name","admin","components","actions","beforeNavLinks","providers","collections","adminUsersCollection","find","slug","auth","user","Error","includeDefaultField","fields","push","collection","fieldName","tenantCollection","collectionSlugs","globalCollectionSlugs","Object","keys","reduce","acc","isGlobal","forEach","cleanupAfterTenantDelete","enabledSlugs","usersSlug","Boolean","disableDuplicate","tenantEnabledCollectionSlugs","tenantEnabledGlobalSlugs","splice","debug","unique","useBaseListFilter","baseListFilter","useTenantAccess","clientProps","useAsTitle","path","length","serverProps","globalSlugs"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { CollectionConfig, Config } from 'payload'\n\nimport type { MultiTenantPluginConfig } from './types.js'\n\nimport { tenantField } from './fields/tenantField/index.js'\nimport { tenantsArrayField } from './fields/tenantsArrayField/index.js'\nimport { addTenantCleanup } from './hooks/afterTenantDelete.js'\nimport { addCollectionAccess } from './utilities/addCollectionAccess.js'\nimport { addFilterOptionsToFields } from './utilities/addFilterOptionsToFields.js'\nimport { withTenantListFilter } from './utilities/withTenantListFilter.js'\n\nconst defaults = {\n tenantCollectionSlug: 'tenants',\n tenantFieldName: 'tenant',\n userTenantsArrayFieldName: 'tenants',\n}\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\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(tenantsArrayField(pluginConfig?.tenantsArrayField || {}))\n }\n\n addCollectionAccess({\n collection: adminUsersCollection,\n fieldName: 'tenants.tenant',\n userHasAccessToAllTenants,\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 /**\n * Add access control constraint to tenants collection\n * - constrains access a users assigned tenants\n */\n addCollectionAccess({\n collection,\n fieldName: 'id',\n userHasAccessToAllTenants,\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 usersSlug: adminUsersCollection.slug,\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 fields: collection.fields,\n tenantEnabledCollectionSlugs: collectionSlugs,\n tenantEnabledGlobalSlugs: globalCollectionSlugs,\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 * Collection baseListFilter with selected tenant constraint (if selected)\n */\n if (!collection.admin) {\n collection.admin = {}\n }\n collection.admin.baseListFilter = withTenantListFilter({\n baseListFilter: collection.admin?.baseListFilter,\n tenantFieldName,\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 collection,\n fieldName: tenantFieldName,\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 tenantsCollectionSlug: tenantCollection.slug,\n useAsTitle: tenantCollection.admin?.useAsTitle || 'id',\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 globalSlugs: globalCollectionSlugs,\n tenantFieldName,\n tenantsCollectionSlug,\n useAsTitle: tenantCollection.admin?.useAsTitle || 'id',\n },\n })\n }\n\n /**\n * Add tenant selector to admin UI\n */\n incomingConfig.admin.components.beforeNavLinks.push({\n path: '@payloadcms/plugin-multi-tenant/client#TenantSelector',\n })\n\n return incomingConfig\n }\n"],"names":["tenantField","tenantsArrayField","addTenantCleanup","addCollectionAccess","addFilterOptionsToFields","withTenantListFilter","defaults","tenantCollectionSlug","tenantFieldName","userTenantsArrayFieldName","multiTenantPlugin","pluginConfig","incomingConfig","enabled","userHasAccessToAllTenants","tenantsCollectionSlug","tenantsSlug","name","admin","components","actions","beforeNavLinks","providers","collections","adminUsersCollection","find","slug","auth","user","Error","includeDefaultField","fields","push","collection","fieldName","tenantCollection","collectionSlugs","globalCollectionSlugs","Object","keys","reduce","acc","isGlobal","forEach","cleanupAfterTenantDelete","enabledSlugs","usersSlug","Boolean","disableDuplicate","tenantEnabledCollectionSlugs","tenantEnabledGlobalSlugs","splice","debug","unique","useBaseListFilter","baseListFilter","useTenantAccess","clientProps","useAsTitle","path","length","serverProps","globalSlugs"],"mappings":"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"}
@@ -3,9 +3,7 @@ type AddFilterOptionsToFieldsArgs = {
3
3
  fields: Field[];
4
4
  tenantEnabledCollectionSlugs: string[];
5
5
  tenantEnabledGlobalSlugs: string[];
6
- tenantFieldName: string;
7
- tenantsCollectionSlug: string;
8
6
  };
9
- export declare function addFilterOptionsToFields({ fields, tenantEnabledCollectionSlugs, tenantEnabledGlobalSlugs, tenantFieldName, tenantsCollectionSlug, }: AddFilterOptionsToFieldsArgs): void;
7
+ export declare function addFilterOptionsToFields({ fields, tenantEnabledCollectionSlugs, tenantEnabledGlobalSlugs, }: AddFilterOptionsToFieldsArgs): void;
10
8
  export {};
11
9
  //# sourceMappingURL=addFilterOptionsToFields.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"addFilterOptionsToFields.d.ts","sourceRoot":"","sources":["../../src/utilities/addFilterOptionsToFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAyC,MAAM,SAAS,CAAA;AAK3E,KAAK,4BAA4B,GAAG;IAClC,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,4BAA4B,EAAE,MAAM,EAAE,CAAA;IACtC,wBAAwB,EAAE,MAAM,EAAE,CAAA;IAClC,eAAe,EAAE,MAAM,CAAA;IACvB,qBAAqB,EAAE,MAAM,CAAA;CAC9B,CAAA;AAED,wBAAgB,wBAAwB,CAAC,EACvC,MAAM,EACN,4BAA4B,EAC5B,wBAAwB,EACxB,eAAe,EACf,qBAAqB,GACtB,EAAE,4BAA4B,QA0E9B"}
1
+ {"version":3,"file":"addFilterOptionsToFields.d.ts","sourceRoot":"","sources":["../../src/utilities/addFilterOptionsToFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAyC,MAAM,SAAS,CAAA;AAI3E,KAAK,4BAA4B,GAAG;IAClC,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,4BAA4B,EAAE,MAAM,EAAE,CAAA;IACtC,wBAAwB,EAAE,MAAM,EAAE,CAAA;CACnC,CAAA;AAED,wBAAgB,wBAAwB,CAAC,EACvC,MAAM,EACN,4BAA4B,EAC5B,wBAAwB,GACzB,EAAE,4BAA4B,QA+D9B"}
@@ -1,6 +1,5 @@
1
- import { getCollectionIDType } from './getCollectionIDType.js';
2
1
  import { getTenantFromCookie } from './getTenantFromCookie.js';
3
- export function addFilterOptionsToFields({ fields, tenantEnabledCollectionSlugs, tenantEnabledGlobalSlugs, tenantFieldName, tenantsCollectionSlug }) {
2
+ export function addFilterOptionsToFields({ fields, tenantEnabledCollectionSlugs, tenantEnabledGlobalSlugs }) {
4
3
  fields.forEach((field)=>{
5
4
  if (field.type === 'relationship') {
6
5
  /**
@@ -11,12 +10,7 @@ export function addFilterOptionsToFields({ fields, tenantEnabledCollectionSlugs,
11
10
  throw new Error(`The collection ${field.relationTo} is a global collection and cannot be related to a tenant enabled collection.`);
12
11
  }
13
12
  if (tenantEnabledCollectionSlugs.includes(field.relationTo)) {
14
- addFilter({
15
- field,
16
- tenantEnabledCollectionSlugs,
17
- tenantFieldName,
18
- tenantsCollectionSlug
19
- });
13
+ addFilter(field, tenantEnabledCollectionSlugs);
20
14
  }
21
15
  } else {
22
16
  field.relationTo.map((relationTo)=>{
@@ -24,12 +18,7 @@ export function addFilterOptionsToFields({ fields, tenantEnabledCollectionSlugs,
24
18
  throw new Error(`The collection ${relationTo} is a global collection and cannot be related to a tenant enabled collection.`);
25
19
  }
26
20
  if (tenantEnabledCollectionSlugs.includes(relationTo)) {
27
- addFilter({
28
- field,
29
- tenantEnabledCollectionSlugs,
30
- tenantFieldName,
31
- tenantsCollectionSlug
32
- });
21
+ addFilter(field, tenantEnabledCollectionSlugs);
33
22
  }
34
23
  });
35
24
  }
@@ -38,9 +27,7 @@ export function addFilterOptionsToFields({ fields, tenantEnabledCollectionSlugs,
38
27
  addFilterOptionsToFields({
39
28
  fields: field.fields,
40
29
  tenantEnabledCollectionSlugs,
41
- tenantEnabledGlobalSlugs,
42
- tenantFieldName,
43
- tenantsCollectionSlug
30
+ tenantEnabledGlobalSlugs
44
31
  });
45
32
  }
46
33
  if (field.type === 'blocks') {
@@ -48,9 +35,7 @@ export function addFilterOptionsToFields({ fields, tenantEnabledCollectionSlugs,
48
35
  addFilterOptionsToFields({
49
36
  fields: block.fields,
50
37
  tenantEnabledCollectionSlugs,
51
- tenantEnabledGlobalSlugs,
52
- tenantFieldName,
53
- tenantsCollectionSlug
38
+ tenantEnabledGlobalSlugs
54
39
  });
55
40
  });
56
41
  }
@@ -59,15 +44,13 @@ export function addFilterOptionsToFields({ fields, tenantEnabledCollectionSlugs,
59
44
  addFilterOptionsToFields({
60
45
  fields: tab.fields,
61
46
  tenantEnabledCollectionSlugs,
62
- tenantEnabledGlobalSlugs,
63
- tenantFieldName,
64
- tenantsCollectionSlug
47
+ tenantEnabledGlobalSlugs
65
48
  });
66
49
  });
67
50
  }
68
51
  });
69
52
  }
70
- function addFilter({ field, tenantEnabledCollectionSlugs, tenantFieldName, tenantsCollectionSlug }) {
53
+ function addFilter(field, tenantEnabledCollectionSlugs) {
71
54
  // User specified filter
72
55
  const originalFilter = field.filterOptions;
73
56
  field.filterOptions = async (args)=>{
@@ -81,11 +64,7 @@ function addFilter({ field, tenantEnabledCollectionSlugs, tenantFieldName, tenan
81
64
  return false;
82
65
  }
83
66
  // Custom tenant filter
84
- const tenantFilterResults = filterOptionsByTenant({
85
- ...args,
86
- tenantFieldName,
87
- tenantsCollectionSlug
88
- });
67
+ const tenantFilterResults = filterOptionsByTenant(args);
89
68
  // If the tenant filter returns true, just use the original filter
90
69
  if (tenantFilterResults === true) {
91
70
  return originalFilterResult;
@@ -102,12 +81,8 @@ function addFilter({ field, tenantEnabledCollectionSlugs, tenantFieldName, tenan
102
81
  };
103
82
  };
104
83
  }
105
- const filterOptionsByTenant = ({ req, tenantFieldName = 'tenant', tenantsCollectionSlug })=>{
106
- const idType = getCollectionIDType({
107
- collectionSlug: tenantsCollectionSlug,
108
- payload: req.payload
109
- });
110
- const selectedTenant = getTenantFromCookie(req.headers, idType);
84
+ const filterOptionsByTenant = ({ req, tenantFieldName = 'tenant' })=>{
85
+ const selectedTenant = getTenantFromCookie(req.headers, req.payload.db.defaultIDType);
111
86
  if (!selectedTenant) {
112
87
  return true;
113
88
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/addFilterOptionsToFields.ts"],"sourcesContent":["import type { Field, FilterOptionsProps, RelationshipField } from 'payload'\n\nimport { getCollectionIDType } from './getCollectionIDType.js'\nimport { getTenantFromCookie } from './getTenantFromCookie.js'\n\ntype AddFilterOptionsToFieldsArgs = {\n fields: Field[]\n tenantEnabledCollectionSlugs: string[]\n tenantEnabledGlobalSlugs: string[]\n tenantFieldName: string\n tenantsCollectionSlug: string\n}\n\nexport function addFilterOptionsToFields({\n fields,\n tenantEnabledCollectionSlugs,\n tenantEnabledGlobalSlugs,\n tenantFieldName,\n tenantsCollectionSlug,\n}: AddFilterOptionsToFieldsArgs) {\n fields.forEach((field) => {\n if (field.type === 'relationship') {\n /**\n * Adjusts relationship fields to filter by tenant\n * and ensures relationTo cannot be a tenant global collection\n */\n if (typeof field.relationTo === 'string') {\n if (tenantEnabledGlobalSlugs.includes(field.relationTo)) {\n throw new Error(\n `The collection ${field.relationTo} is a global collection and cannot be related to a tenant enabled collection.`,\n )\n }\n if (tenantEnabledCollectionSlugs.includes(field.relationTo)) {\n addFilter({ field, tenantEnabledCollectionSlugs, tenantFieldName, tenantsCollectionSlug })\n }\n } else {\n field.relationTo.map((relationTo) => {\n if (tenantEnabledGlobalSlugs.includes(relationTo)) {\n throw new Error(\n `The collection ${relationTo} is a global collection and cannot be related to a tenant enabled collection.`,\n )\n }\n if (tenantEnabledCollectionSlugs.includes(relationTo)) {\n addFilter({\n field,\n tenantEnabledCollectionSlugs,\n tenantFieldName,\n tenantsCollectionSlug,\n })\n }\n })\n }\n }\n\n if (\n field.type === 'row' ||\n field.type === 'array' ||\n field.type === 'collapsible' ||\n field.type === 'group'\n ) {\n addFilterOptionsToFields({\n fields: field.fields,\n tenantEnabledCollectionSlugs,\n tenantEnabledGlobalSlugs,\n tenantFieldName,\n tenantsCollectionSlug,\n })\n }\n\n if (field.type === 'blocks') {\n field.blocks.forEach((block) => {\n addFilterOptionsToFields({\n fields: block.fields,\n tenantEnabledCollectionSlugs,\n tenantEnabledGlobalSlugs,\n tenantFieldName,\n tenantsCollectionSlug,\n })\n })\n }\n\n if (field.type === 'tabs') {\n field.tabs.forEach((tab) => {\n addFilterOptionsToFields({\n fields: tab.fields,\n tenantEnabledCollectionSlugs,\n tenantEnabledGlobalSlugs,\n tenantFieldName,\n tenantsCollectionSlug,\n })\n })\n }\n })\n}\n\ntype AddFilterArgs = {\n field: RelationshipField\n tenantEnabledCollectionSlugs: string[]\n tenantFieldName: string\n tenantsCollectionSlug: string\n}\nfunction addFilter({\n field,\n tenantEnabledCollectionSlugs,\n tenantFieldName,\n tenantsCollectionSlug,\n}: AddFilterArgs) {\n // User specified filter\n const originalFilter = field.filterOptions\n field.filterOptions = async (args) => {\n const originalFilterResult =\n typeof originalFilter === 'function' ? await originalFilter(args) : (originalFilter ?? true)\n\n // If the relationTo is not a tenant enabled collection, return early\n if (args.relationTo && !tenantEnabledCollectionSlugs.includes(args.relationTo)) {\n return originalFilterResult\n }\n\n // If the original filtr returns false, return early\n if (originalFilterResult === false) {\n return false\n }\n\n // Custom tenant filter\n const tenantFilterResults = filterOptionsByTenant({\n ...args,\n tenantFieldName,\n tenantsCollectionSlug,\n })\n\n // If the tenant filter returns true, just use the original filter\n if (tenantFilterResults === true) {\n return originalFilterResult\n }\n\n // If the original filter returns true, just use the tenant filter\n if (originalFilterResult === true) {\n return tenantFilterResults\n }\n\n return {\n and: [originalFilterResult, tenantFilterResults],\n }\n }\n}\n\ntype Args = {\n tenantFieldName?: string\n tenantsCollectionSlug: string\n} & FilterOptionsProps\nconst filterOptionsByTenant = ({\n req,\n tenantFieldName = 'tenant',\n tenantsCollectionSlug,\n}: Args) => {\n const idType = getCollectionIDType({\n collectionSlug: tenantsCollectionSlug,\n payload: req.payload,\n })\n const selectedTenant = getTenantFromCookie(req.headers, idType)\n if (!selectedTenant) {\n return true\n }\n\n return {\n or: [\n // ie a related collection that doesn't have a tenant field\n {\n [tenantFieldName]: {\n exists: false,\n },\n },\n // related collections that have a tenant field\n {\n [tenantFieldName]: {\n equals: selectedTenant,\n },\n },\n ],\n }\n}\n"],"names":["getCollectionIDType","getTenantFromCookie","addFilterOptionsToFields","fields","tenantEnabledCollectionSlugs","tenantEnabledGlobalSlugs","tenantFieldName","tenantsCollectionSlug","forEach","field","type","relationTo","includes","Error","addFilter","map","blocks","block","tabs","tab","originalFilter","filterOptions","args","originalFilterResult","tenantFilterResults","filterOptionsByTenant","and","req","idType","collectionSlug","payload","selectedTenant","headers","or","exists","equals"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utilities/addFilterOptionsToFields.ts"],"sourcesContent":["import type { Field, FilterOptionsProps, RelationshipField } from 'payload'\n\nimport { getTenantFromCookie } from './getTenantFromCookie.js'\n\ntype AddFilterOptionsToFieldsArgs = {\n fields: Field[]\n tenantEnabledCollectionSlugs: string[]\n tenantEnabledGlobalSlugs: string[]\n}\n\nexport function addFilterOptionsToFields({\n fields,\n tenantEnabledCollectionSlugs,\n tenantEnabledGlobalSlugs,\n}: AddFilterOptionsToFieldsArgs) {\n fields.forEach((field) => {\n if (field.type === 'relationship') {\n /**\n * Adjusts relationship fields to filter by tenant\n * and ensures relationTo cannot be a tenant global collection\n */\n if (typeof field.relationTo === 'string') {\n if (tenantEnabledGlobalSlugs.includes(field.relationTo)) {\n throw new Error(\n `The collection ${field.relationTo} is a global collection and cannot be related to a tenant enabled collection.`,\n )\n }\n if (tenantEnabledCollectionSlugs.includes(field.relationTo)) {\n addFilter(field, tenantEnabledCollectionSlugs)\n }\n } else {\n field.relationTo.map((relationTo) => {\n if (tenantEnabledGlobalSlugs.includes(relationTo)) {\n throw new Error(\n `The collection ${relationTo} is a global collection and cannot be related to a tenant enabled collection.`,\n )\n }\n if (tenantEnabledCollectionSlugs.includes(relationTo)) {\n addFilter(field, tenantEnabledCollectionSlugs)\n }\n })\n }\n }\n\n if (\n field.type === 'row' ||\n field.type === 'array' ||\n field.type === 'collapsible' ||\n field.type === 'group'\n ) {\n addFilterOptionsToFields({\n fields: field.fields,\n tenantEnabledCollectionSlugs,\n tenantEnabledGlobalSlugs,\n })\n }\n\n if (field.type === 'blocks') {\n field.blocks.forEach((block) => {\n addFilterOptionsToFields({\n fields: block.fields,\n tenantEnabledCollectionSlugs,\n tenantEnabledGlobalSlugs,\n })\n })\n }\n\n if (field.type === 'tabs') {\n field.tabs.forEach((tab) => {\n addFilterOptionsToFields({\n fields: tab.fields,\n tenantEnabledCollectionSlugs,\n tenantEnabledGlobalSlugs,\n })\n })\n }\n })\n}\n\nfunction addFilter(field: RelationshipField, tenantEnabledCollectionSlugs: string[]) {\n // User specified filter\n const originalFilter = field.filterOptions\n field.filterOptions = async (args) => {\n const originalFilterResult =\n typeof originalFilter === 'function' ? await originalFilter(args) : (originalFilter ?? true)\n\n // If the relationTo is not a tenant enabled collection, return early\n if (args.relationTo && !tenantEnabledCollectionSlugs.includes(args.relationTo)) {\n return originalFilterResult\n }\n\n // If the original filtr returns false, return early\n if (originalFilterResult === false) {\n return false\n }\n\n // Custom tenant filter\n const tenantFilterResults = filterOptionsByTenant(args)\n\n // If the tenant filter returns true, just use the original filter\n if (tenantFilterResults === true) {\n return originalFilterResult\n }\n\n // If the original filter returns true, just use the tenant filter\n if (originalFilterResult === true) {\n return tenantFilterResults\n }\n\n return {\n and: [originalFilterResult, tenantFilterResults],\n }\n }\n}\n\ntype Args = {\n tenantFieldName?: string\n} & FilterOptionsProps\nconst filterOptionsByTenant = ({ req, tenantFieldName = 'tenant' }: Args) => {\n const selectedTenant = getTenantFromCookie(req.headers, req.payload.db.defaultIDType)\n if (!selectedTenant) {\n return true\n }\n\n return {\n or: [\n // ie a related collection that doesn't have a tenant field\n {\n [tenantFieldName]: {\n exists: false,\n },\n },\n // related collections that have a tenant field\n {\n [tenantFieldName]: {\n equals: selectedTenant,\n },\n },\n ],\n }\n}\n"],"names":["getTenantFromCookie","addFilterOptionsToFields","fields","tenantEnabledCollectionSlugs","tenantEnabledGlobalSlugs","forEach","field","type","relationTo","includes","Error","addFilter","map","blocks","block","tabs","tab","originalFilter","filterOptions","args","originalFilterResult","tenantFilterResults","filterOptionsByTenant","and","req","tenantFieldName","selectedTenant","headers","payload","db","defaultIDType","or","exists","equals"],"mappings":"AAEA,SAASA,mBAAmB,QAAQ,2BAA0B;AAQ9D,OAAO,SAASC,yBAAyB,EACvCC,MAAM,EACNC,4BAA4B,EAC5BC,wBAAwB,EACK;IAC7BF,OAAOG,OAAO,CAAC,CAACC;QACd,IAAIA,MAAMC,IAAI,KAAK,gBAAgB;YACjC;;;OAGC,GACD,IAAI,OAAOD,MAAME,UAAU,KAAK,UAAU;gBACxC,IAAIJ,yBAAyBK,QAAQ,CAACH,MAAME,UAAU,GAAG;oBACvD,MAAM,IAAIE,MACR,CAAC,eAAe,EAAEJ,MAAME,UAAU,CAAC,6EAA6E,CAAC;gBAErH;gBACA,IAAIL,6BAA6BM,QAAQ,CAACH,MAAME,UAAU,GAAG;oBAC3DG,UAAUL,OAAOH;gBACnB;YACF,OAAO;gBACLG,MAAME,UAAU,CAACI,GAAG,CAAC,CAACJ;oBACpB,IAAIJ,yBAAyBK,QAAQ,CAACD,aAAa;wBACjD,MAAM,IAAIE,MACR,CAAC,eAAe,EAAEF,WAAW,6EAA6E,CAAC;oBAE/G;oBACA,IAAIL,6BAA6BM,QAAQ,CAACD,aAAa;wBACrDG,UAAUL,OAAOH;oBACnB;gBACF;YACF;QACF;QAEA,IACEG,MAAMC,IAAI,KAAK,SACfD,MAAMC,IAAI,KAAK,WACfD,MAAMC,IAAI,KAAK,iBACfD,MAAMC,IAAI,KAAK,SACf;YACAN,yBAAyB;gBACvBC,QAAQI,MAAMJ,MAAM;gBACpBC;gBACAC;YACF;QACF;QAEA,IAAIE,MAAMC,IAAI,KAAK,UAAU;YAC3BD,MAAMO,MAAM,CAACR,OAAO,CAAC,CAACS;gBACpBb,yBAAyB;oBACvBC,QAAQY,MAAMZ,MAAM;oBACpBC;oBACAC;gBACF;YACF;QACF;QAEA,IAAIE,MAAMC,IAAI,KAAK,QAAQ;YACzBD,MAAMS,IAAI,CAACV,OAAO,CAAC,CAACW;gBAClBf,yBAAyB;oBACvBC,QAAQc,IAAId,MAAM;oBAClBC;oBACAC;gBACF;YACF;QACF;IACF;AACF;AAEA,SAASO,UAAUL,KAAwB,EAAEH,4BAAsC;IACjF,wBAAwB;IACxB,MAAMc,iBAAiBX,MAAMY,aAAa;IAC1CZ,MAAMY,aAAa,GAAG,OAAOC;QAC3B,MAAMC,uBACJ,OAAOH,mBAAmB,aAAa,MAAMA,eAAeE,QAASF,kBAAkB;QAEzF,qEAAqE;QACrE,IAAIE,KAAKX,UAAU,IAAI,CAACL,6BAA6BM,QAAQ,CAACU,KAAKX,UAAU,GAAG;YAC9E,OAAOY;QACT;QAEA,oDAAoD;QACpD,IAAIA,yBAAyB,OAAO;YAClC,OAAO;QACT;QAEA,uBAAuB;QACvB,MAAMC,sBAAsBC,sBAAsBH;QAElD,kEAAkE;QAClE,IAAIE,wBAAwB,MAAM;YAChC,OAAOD;QACT;QAEA,kEAAkE;QAClE,IAAIA,yBAAyB,MAAM;YACjC,OAAOC;QACT;QAEA,OAAO;YACLE,KAAK;gBAACH;gBAAsBC;aAAoB;QAClD;IACF;AACF;AAKA,MAAMC,wBAAwB,CAAC,EAAEE,GAAG,EAAEC,kBAAkB,QAAQ,EAAQ;IACtE,MAAMC,iBAAiB1B,oBAAoBwB,IAAIG,OAAO,EAAEH,IAAII,OAAO,CAACC,EAAE,CAACC,aAAa;IACpF,IAAI,CAACJ,gBAAgB;QACnB,OAAO;IACT;IAEA,OAAO;QACLK,IAAI;YACF,2DAA2D;YAC3D;gBACE,CAACN,gBAAgB,EAAE;oBACjBO,QAAQ;gBACV;YACF;YACA,+CAA+C;YAC/C;gBACE,CAACP,gBAAgB,EAAE;oBACjBQ,QAAQP;gBACV;YACF;SACD;IACH;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"getGlobalViewRedirect.d.ts","sourceRoot":"","sources":["../../src/utilities/getGlobalViewRedirect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAOvD,KAAK,IAAI,GAAG;IACV,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACvB,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,eAAe,EAAE,MAAM,CAAA;IACvB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,IAAI,EAAE,SAAS,CAAA;CAChB,CAAA;AACD,wBAAsB,qBAAqB,CAAC,EAC1C,IAAI,EACJ,KAAK,EACL,OAAO,EACP,OAAO,EACP,eAAe,EACf,qBAAqB,EACrB,UAAU,EACV,IAAI,EACJ,IAAI,GACL,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA4D/B"}
1
+ {"version":3,"file":"getGlobalViewRedirect.d.ts","sourceRoot":"","sources":["../../src/utilities/getGlobalViewRedirect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAMvD,KAAK,IAAI,GAAG;IACV,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACvB,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,eAAe,EAAE,MAAM,CAAA;IACvB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,IAAI,EAAE,SAAS,CAAA;CAChB,CAAA;AACD,wBAAsB,qBAAqB,CAAC,EAC1C,IAAI,EACJ,KAAK,EACL,OAAO,EACP,OAAO,EACP,eAAe,EACf,qBAAqB,EACrB,UAAU,EACV,IAAI,EACJ,IAAI,GACL,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAwD/B"}
@@ -1,13 +1,8 @@
1
1
  import { SELECT_ALL } from '../constants.js';
2
2
  import { findTenantOptions } from '../queries/findTenantOptions.js';
3
- import { getCollectionIDType } from './getCollectionIDType.js';
4
3
  import { getTenantFromCookie } from './getTenantFromCookie.js';
5
4
  export async function getGlobalViewRedirect({ slug, docID, headers, payload, tenantFieldName, tenantsCollectionSlug, useAsTitle, user, view }) {
6
- const idType = getCollectionIDType({
7
- collectionSlug: tenantsCollectionSlug,
8
- payload
9
- });
10
- let tenant = getTenantFromCookie(headers, idType);
5
+ let tenant = getTenantFromCookie(headers, payload.db.defaultIDType);
11
6
  let redirectRoute;
12
7
  if (!tenant || tenant === SELECT_ALL) {
13
8
  const tenantsQuery = await findTenantOptions({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/getGlobalViewRedirect.ts"],"sourcesContent":["import type { Payload, User, ViewTypes } from 'payload'\n\nimport { SELECT_ALL } from '../constants.js'\nimport { findTenantOptions } from '../queries/findTenantOptions.js'\nimport { getCollectionIDType } from './getCollectionIDType.js'\nimport { getTenantFromCookie } from './getTenantFromCookie.js'\n\ntype Args = {\n docID?: number | string\n headers: Headers\n payload: Payload\n slug: string\n tenantFieldName: string\n tenantsCollectionSlug: string\n useAsTitle: string\n user?: User\n view: ViewTypes\n}\nexport async function getGlobalViewRedirect({\n slug,\n docID,\n headers,\n payload,\n tenantFieldName,\n tenantsCollectionSlug,\n useAsTitle,\n user,\n view,\n}: Args): Promise<string | void> {\n const idType = getCollectionIDType({\n collectionSlug: tenantsCollectionSlug,\n payload,\n })\n let tenant = getTenantFromCookie(headers, idType)\n let redirectRoute\n\n if (!tenant || tenant === SELECT_ALL) {\n const tenantsQuery = await findTenantOptions({\n limit: 1,\n payload,\n tenantsCollectionSlug,\n useAsTitle,\n user,\n })\n\n tenant = tenantsQuery.docs[0]?.id || null\n }\n\n try {\n const { docs } = await payload.find({\n collection: slug,\n depth: 0,\n limit: 1,\n overrideAccess: false,\n user,\n where: {\n [tenantFieldName]: {\n equals: tenant,\n },\n },\n })\n\n const tenantDocID = docs?.[0]?.id\n\n if (view === 'document') {\n if (docID && !tenantDocID) {\n // viewing a document with an id but does not match the selected tenant, redirect to create route\n redirectRoute = `${payload.config.routes.admin}/collections/${slug}/create`\n } else if (tenantDocID && docID !== tenantDocID) {\n // tenant document already exists but does not match current route doc ID, redirect to matching tenant doc\n redirectRoute = `${payload.config.routes.admin}/collections/${slug}/${tenantDocID}`\n }\n } else if (view === 'list') {\n if (tenantDocID) {\n // tenant document exists, redirect to edit view\n redirectRoute = `${payload.config.routes.admin}/collections/${slug}/${tenantDocID}`\n } else {\n // tenant document does not exist, redirect to create route\n redirectRoute = `${payload.config.routes.admin}/collections/${slug}/create`\n }\n }\n } catch (e: unknown) {\n payload.logger.error(\n e,\n `${typeof e === 'object' && e && 'message' in e ? `e?.message - ` : ''}Multi Tenant Redirect Error`,\n )\n }\n return redirectRoute\n}\n"],"names":["SELECT_ALL","findTenantOptions","getCollectionIDType","getTenantFromCookie","getGlobalViewRedirect","slug","docID","headers","payload","tenantFieldName","tenantsCollectionSlug","useAsTitle","user","view","idType","collectionSlug","tenant","redirectRoute","tenantsQuery","limit","docs","id","find","collection","depth","overrideAccess","where","equals","tenantDocID","config","routes","admin","e","logger","error"],"mappings":"AAEA,SAASA,UAAU,QAAQ,kBAAiB;AAC5C,SAASC,iBAAiB,QAAQ,kCAAiC;AACnE,SAASC,mBAAmB,QAAQ,2BAA0B;AAC9D,SAASC,mBAAmB,QAAQ,2BAA0B;AAa9D,OAAO,eAAeC,sBAAsB,EAC1CC,IAAI,EACJC,KAAK,EACLC,OAAO,EACPC,OAAO,EACPC,eAAe,EACfC,qBAAqB,EACrBC,UAAU,EACVC,IAAI,EACJC,IAAI,EACC;IACL,MAAMC,SAASZ,oBAAoB;QACjCa,gBAAgBL;QAChBF;IACF;IACA,IAAIQ,SAASb,oBAAoBI,SAASO;IAC1C,IAAIG;IAEJ,IAAI,CAACD,UAAUA,WAAWhB,YAAY;QACpC,MAAMkB,eAAe,MAAMjB,kBAAkB;YAC3CkB,OAAO;YACPX;YACAE;YACAC;YACAC;QACF;QAEAI,SAASE,aAAaE,IAAI,CAAC,EAAE,EAAEC,MAAM;IACvC;IAEA,IAAI;QACF,MAAM,EAAED,IAAI,EAAE,GAAG,MAAMZ,QAAQc,IAAI,CAAC;YAClCC,YAAYlB;YACZmB,OAAO;YACPL,OAAO;YACPM,gBAAgB;YAChBb;YACAc,OAAO;gBACL,CAACjB,gBAAgB,EAAE;oBACjBkB,QAAQX;gBACV;YACF;QACF;QAEA,MAAMY,cAAcR,MAAM,CAAC,EAAE,EAAEC;QAE/B,IAAIR,SAAS,YAAY;YACvB,IAAIP,SAAS,CAACsB,aAAa;gBACzB,iGAAiG;gBACjGX,gBAAgB,GAAGT,QAAQqB,MAAM,CAACC,MAAM,CAACC,KAAK,CAAC,aAAa,EAAE1B,KAAK,OAAO,CAAC;YAC7E,OAAO,IAAIuB,eAAetB,UAAUsB,aAAa;gBAC/C,0GAA0G;gBAC1GX,gBAAgB,GAAGT,QAAQqB,MAAM,CAACC,MAAM,CAACC,KAAK,CAAC,aAAa,EAAE1B,KAAK,CAAC,EAAEuB,aAAa;YACrF;QACF,OAAO,IAAIf,SAAS,QAAQ;YAC1B,IAAIe,aAAa;gBACf,gDAAgD;gBAChDX,gBAAgB,GAAGT,QAAQqB,MAAM,CAACC,MAAM,CAACC,KAAK,CAAC,aAAa,EAAE1B,KAAK,CAAC,EAAEuB,aAAa;YACrF,OAAO;gBACL,2DAA2D;gBAC3DX,gBAAgB,GAAGT,QAAQqB,MAAM,CAACC,MAAM,CAACC,KAAK,CAAC,aAAa,EAAE1B,KAAK,OAAO,CAAC;YAC7E;QACF;IACF,EAAE,OAAO2B,GAAY;QACnBxB,QAAQyB,MAAM,CAACC,KAAK,CAClBF,GACA,GAAG,OAAOA,MAAM,YAAYA,KAAK,aAAaA,IAAI,CAAC,aAAa,CAAC,GAAG,GAAG,2BAA2B,CAAC;IAEvG;IACA,OAAOf;AACT"}
1
+ {"version":3,"sources":["../../src/utilities/getGlobalViewRedirect.ts"],"sourcesContent":["import type { Payload, User, ViewTypes } from 'payload'\n\nimport { SELECT_ALL } from '../constants.js'\nimport { findTenantOptions } from '../queries/findTenantOptions.js'\nimport { getTenantFromCookie } from './getTenantFromCookie.js'\n\ntype Args = {\n docID?: number | string\n headers: Headers\n payload: Payload\n slug: string\n tenantFieldName: string\n tenantsCollectionSlug: string\n useAsTitle: string\n user?: User\n view: ViewTypes\n}\nexport async function getGlobalViewRedirect({\n slug,\n docID,\n headers,\n payload,\n tenantFieldName,\n tenantsCollectionSlug,\n useAsTitle,\n user,\n view,\n}: Args): Promise<string | void> {\n let tenant = getTenantFromCookie(headers, payload.db.defaultIDType)\n let redirectRoute\n\n if (!tenant || tenant === SELECT_ALL) {\n const tenantsQuery = await findTenantOptions({\n limit: 1,\n payload,\n tenantsCollectionSlug,\n useAsTitle,\n user,\n })\n\n tenant = tenantsQuery.docs[0]?.id || null\n }\n\n try {\n const { docs } = await payload.find({\n collection: slug,\n depth: 0,\n limit: 1,\n overrideAccess: false,\n user,\n where: {\n [tenantFieldName]: {\n equals: tenant,\n },\n },\n })\n\n const tenantDocID = docs?.[0]?.id\n\n if (view === 'document') {\n if (docID && !tenantDocID) {\n // viewing a document with an id but does not match the selected tenant, redirect to create route\n redirectRoute = `${payload.config.routes.admin}/collections/${slug}/create`\n } else if (tenantDocID && docID !== tenantDocID) {\n // tenant document already exists but does not match current route doc ID, redirect to matching tenant doc\n redirectRoute = `${payload.config.routes.admin}/collections/${slug}/${tenantDocID}`\n }\n } else if (view === 'list') {\n if (tenantDocID) {\n // tenant document exists, redirect to edit view\n redirectRoute = `${payload.config.routes.admin}/collections/${slug}/${tenantDocID}`\n } else {\n // tenant document does not exist, redirect to create route\n redirectRoute = `${payload.config.routes.admin}/collections/${slug}/create`\n }\n }\n } catch (e: unknown) {\n payload.logger.error(\n e,\n `${typeof e === 'object' && e && 'message' in e ? `e?.message - ` : ''}Multi Tenant Redirect Error`,\n )\n }\n return redirectRoute\n}\n"],"names":["SELECT_ALL","findTenantOptions","getTenantFromCookie","getGlobalViewRedirect","slug","docID","headers","payload","tenantFieldName","tenantsCollectionSlug","useAsTitle","user","view","tenant","db","defaultIDType","redirectRoute","tenantsQuery","limit","docs","id","find","collection","depth","overrideAccess","where","equals","tenantDocID","config","routes","admin","e","logger","error"],"mappings":"AAEA,SAASA,UAAU,QAAQ,kBAAiB;AAC5C,SAASC,iBAAiB,QAAQ,kCAAiC;AACnE,SAASC,mBAAmB,QAAQ,2BAA0B;AAa9D,OAAO,eAAeC,sBAAsB,EAC1CC,IAAI,EACJC,KAAK,EACLC,OAAO,EACPC,OAAO,EACPC,eAAe,EACfC,qBAAqB,EACrBC,UAAU,EACVC,IAAI,EACJC,IAAI,EACC;IACL,IAAIC,SAASX,oBAAoBI,SAASC,QAAQO,EAAE,CAACC,aAAa;IAClE,IAAIC;IAEJ,IAAI,CAACH,UAAUA,WAAWb,YAAY;QACpC,MAAMiB,eAAe,MAAMhB,kBAAkB;YAC3CiB,OAAO;YACPX;YACAE;YACAC;YACAC;QACF;QAEAE,SAASI,aAAaE,IAAI,CAAC,EAAE,EAAEC,MAAM;IACvC;IAEA,IAAI;QACF,MAAM,EAAED,IAAI,EAAE,GAAG,MAAMZ,QAAQc,IAAI,CAAC;YAClCC,YAAYlB;YACZmB,OAAO;YACPL,OAAO;YACPM,gBAAgB;YAChBb;YACAc,OAAO;gBACL,CAACjB,gBAAgB,EAAE;oBACjBkB,QAAQb;gBACV;YACF;QACF;QAEA,MAAMc,cAAcR,MAAM,CAAC,EAAE,EAAEC;QAE/B,IAAIR,SAAS,YAAY;YACvB,IAAIP,SAAS,CAACsB,aAAa;gBACzB,iGAAiG;gBACjGX,gBAAgB,GAAGT,QAAQqB,MAAM,CAACC,MAAM,CAACC,KAAK,CAAC,aAAa,EAAE1B,KAAK,OAAO,CAAC;YAC7E,OAAO,IAAIuB,eAAetB,UAAUsB,aAAa;gBAC/C,0GAA0G;gBAC1GX,gBAAgB,GAAGT,QAAQqB,MAAM,CAACC,MAAM,CAACC,KAAK,CAAC,aAAa,EAAE1B,KAAK,CAAC,EAAEuB,aAAa;YACrF;QACF,OAAO,IAAIf,SAAS,QAAQ;YAC1B,IAAIe,aAAa;gBACf,gDAAgD;gBAChDX,gBAAgB,GAAGT,QAAQqB,MAAM,CAACC,MAAM,CAACC,KAAK,CAAC,aAAa,EAAE1B,KAAK,CAAC,EAAEuB,aAAa;YACrF,OAAO;gBACL,2DAA2D;gBAC3DX,gBAAgB,GAAGT,QAAQqB,MAAM,CAACC,MAAM,CAACC,KAAK,CAAC,aAAa,EAAE1B,KAAK,OAAO,CAAC;YAC7E;QACF;IACF,EAAE,OAAO2B,GAAY;QACnBxB,QAAQyB,MAAM,CAACC,KAAK,CAClBF,GACA,GAAG,OAAOA,MAAM,YAAYA,KAAK,aAAaA,IAAI,CAAC,aAAa,CAAC,GAAG,GAAG,2BAA2B,CAAC;IAEvG;IACA,OAAOf;AACT"}
@@ -8,7 +8,7 @@ import { parseCookies } from 'payload';
8
8
  */ export function getTenantFromCookie(headers, idType) {
9
9
  const cookies = parseCookies(headers);
10
10
  const selectedTenant = cookies.get('payload-tenant') || null;
11
- return selectedTenant ? idType === 'number' ? parseFloat(selectedTenant) : selectedTenant : null;
11
+ return selectedTenant ? idType === 'number' ? parseInt(selectedTenant) : selectedTenant : null;
12
12
  }
13
13
 
14
14
  //# sourceMappingURL=getTenantFromCookie.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/getTenantFromCookie.ts"],"sourcesContent":["import { parseCookies } from 'payload'\n\n/**\n * A function that takes request headers and an idType and returns the current tenant ID from the cookie\n *\n * @param headers Headers, usually derived from req.headers or next/headers\n * @param idType can be 'number' | 'text', usually derived from payload.db.defaultIDType\n * @returns string | number | null\n */\nexport function getTenantFromCookie(\n headers: Headers,\n idType: 'number' | 'text',\n): null | number | string {\n const cookies = parseCookies(headers)\n const selectedTenant = cookies.get('payload-tenant') || null\n return selectedTenant ? (idType === 'number' ? parseFloat(selectedTenant) : selectedTenant) : null\n}\n"],"names":["parseCookies","getTenantFromCookie","headers","idType","cookies","selectedTenant","get","parseFloat"],"mappings":"AAAA,SAASA,YAAY,QAAQ,UAAS;AAEtC;;;;;;CAMC,GACD,OAAO,SAASC,oBACdC,OAAgB,EAChBC,MAAyB;IAEzB,MAAMC,UAAUJ,aAAaE;IAC7B,MAAMG,iBAAiBD,QAAQE,GAAG,CAAC,qBAAqB;IACxD,OAAOD,iBAAkBF,WAAW,WAAWI,WAAWF,kBAAkBA,iBAAkB;AAChG"}
1
+ {"version":3,"sources":["../../src/utilities/getTenantFromCookie.ts"],"sourcesContent":["import { parseCookies } from 'payload'\n\n/**\n * A function that takes request headers and an idType and returns the current tenant ID from the cookie\n *\n * @param headers Headers, usually derived from req.headers or next/headers\n * @param idType can be 'number' | 'text', usually derived from payload.db.defaultIDType\n * @returns string | number | null\n */\nexport function getTenantFromCookie(\n headers: Headers,\n idType: 'number' | 'text',\n): null | number | string {\n const cookies = parseCookies(headers)\n const selectedTenant = cookies.get('payload-tenant') || null\n return selectedTenant ? (idType === 'number' ? parseInt(selectedTenant) : selectedTenant) : null\n}\n"],"names":["parseCookies","getTenantFromCookie","headers","idType","cookies","selectedTenant","get","parseInt"],"mappings":"AAAA,SAASA,YAAY,QAAQ,UAAS;AAEtC;;;;;;CAMC,GACD,OAAO,SAASC,oBACdC,OAAgB,EAChBC,MAAyB;IAEzB,MAAMC,UAAUJ,aAAaE;IAC7B,MAAMG,iBAAiBD,QAAQE,GAAG,CAAC,qBAAqB;IACxD,OAAOD,iBAAkBF,WAAW,WAAWI,SAASF,kBAAkBA,iBAAkB;AAC9F"}
@@ -2,8 +2,7 @@ import type { PayloadRequest, Where } from 'payload';
2
2
  type Args = {
3
3
  req: PayloadRequest;
4
4
  tenantFieldName: string;
5
- tenantsCollectionSlug: string;
6
5
  };
7
- export declare const getTenantListFilter: ({ req, tenantFieldName, tenantsCollectionSlug, }: Args) => null | Where;
6
+ export declare const getTenantListFilter: ({ req, tenantFieldName }: Args) => null | Where;
8
7
  export {};
9
8
  //# sourceMappingURL=getTenantListFilter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getTenantListFilter.d.ts","sourceRoot":"","sources":["../../src/utilities/getTenantListFilter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAMpD,KAAK,IAAI,GAAG;IACV,GAAG,EAAE,cAAc,CAAA;IACnB,eAAe,EAAE,MAAM,CAAA;IACvB,qBAAqB,EAAE,MAAM,CAAA;CAC9B,CAAA;AACD,eAAO,MAAM,mBAAmB,qDAI7B,IAAI,KAAG,IAAI,GAAG,KAgBhB,CAAA"}
1
+ {"version":3,"file":"getTenantListFilter.d.ts","sourceRoot":"","sources":["../../src/utilities/getTenantListFilter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAKpD,KAAK,IAAI,GAAG;IACV,GAAG,EAAE,cAAc,CAAA;IACnB,eAAe,EAAE,MAAM,CAAA;CACxB,CAAA;AACD,eAAO,MAAM,mBAAmB,6BAA8B,IAAI,KAAG,IAAI,GAAG,KAY3E,CAAA"}
@@ -1,12 +1,7 @@
1
1
  import { SELECT_ALL } from '../constants.js';
2
- import { getCollectionIDType } from './getCollectionIDType.js';
3
2
  import { getTenantFromCookie } from './getTenantFromCookie.js';
4
- export const getTenantListFilter = ({ req, tenantFieldName, tenantsCollectionSlug })=>{
5
- const idType = getCollectionIDType({
6
- collectionSlug: tenantsCollectionSlug,
7
- payload: req.payload
8
- });
9
- const selectedTenant = getTenantFromCookie(req.headers, idType);
3
+ export const getTenantListFilter = ({ req, tenantFieldName })=>{
4
+ const selectedTenant = getTenantFromCookie(req.headers, req.payload.db.defaultIDType);
10
5
  if (selectedTenant === SELECT_ALL) {
11
6
  return {};
12
7
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/getTenantListFilter.ts"],"sourcesContent":["import type { PayloadRequest, Where } from 'payload'\n\nimport { SELECT_ALL } from '../constants.js'\nimport { getCollectionIDType } from './getCollectionIDType.js'\nimport { getTenantFromCookie } from './getTenantFromCookie.js'\n\ntype Args = {\n req: PayloadRequest\n tenantFieldName: string\n tenantsCollectionSlug: string\n}\nexport const getTenantListFilter = ({\n req,\n tenantFieldName,\n tenantsCollectionSlug,\n}: Args): null | Where => {\n const idType = getCollectionIDType({\n collectionSlug: tenantsCollectionSlug,\n payload: req.payload,\n })\n const selectedTenant = getTenantFromCookie(req.headers, idType)\n\n if (selectedTenant === SELECT_ALL) {\n return {}\n }\n\n return {\n [tenantFieldName]: {\n equals: selectedTenant,\n },\n }\n}\n"],"names":["SELECT_ALL","getCollectionIDType","getTenantFromCookie","getTenantListFilter","req","tenantFieldName","tenantsCollectionSlug","idType","collectionSlug","payload","selectedTenant","headers","equals"],"mappings":"AAEA,SAASA,UAAU,QAAQ,kBAAiB;AAC5C,SAASC,mBAAmB,QAAQ,2BAA0B;AAC9D,SAASC,mBAAmB,QAAQ,2BAA0B;AAO9D,OAAO,MAAMC,sBAAsB,CAAC,EAClCC,GAAG,EACHC,eAAe,EACfC,qBAAqB,EAChB;IACL,MAAMC,SAASN,oBAAoB;QACjCO,gBAAgBF;QAChBG,SAASL,IAAIK,OAAO;IACtB;IACA,MAAMC,iBAAiBR,oBAAoBE,IAAIO,OAAO,EAAEJ;IAExD,IAAIG,mBAAmBV,YAAY;QACjC,OAAO,CAAC;IACV;IAEA,OAAO;QACL,CAACK,gBAAgB,EAAE;YACjBO,QAAQF;QACV;IACF;AACF,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/getTenantListFilter.ts"],"sourcesContent":["import type { PayloadRequest, Where } from 'payload'\n\nimport { SELECT_ALL } from '../constants.js'\nimport { getTenantFromCookie } from './getTenantFromCookie.js'\n\ntype Args = {\n req: PayloadRequest\n tenantFieldName: string\n}\nexport const getTenantListFilter = ({ req, tenantFieldName }: Args): null | Where => {\n const selectedTenant = getTenantFromCookie(req.headers, req.payload.db.defaultIDType)\n\n if (selectedTenant === SELECT_ALL) {\n return {}\n }\n\n return {\n [tenantFieldName]: {\n equals: selectedTenant,\n },\n }\n}\n"],"names":["SELECT_ALL","getTenantFromCookie","getTenantListFilter","req","tenantFieldName","selectedTenant","headers","payload","db","defaultIDType","equals"],"mappings":"AAEA,SAASA,UAAU,QAAQ,kBAAiB;AAC5C,SAASC,mBAAmB,QAAQ,2BAA0B;AAM9D,OAAO,MAAMC,sBAAsB,CAAC,EAAEC,GAAG,EAAEC,eAAe,EAAQ;IAChE,MAAMC,iBAAiBJ,oBAAoBE,IAAIG,OAAO,EAAEH,IAAII,OAAO,CAACC,EAAE,CAACC,aAAa;IAEpF,IAAIJ,mBAAmBL,YAAY;QACjC,OAAO,CAAC;IACV;IAEA,OAAO;QACL,CAACI,gBAAgB,EAAE;YACjBM,QAAQL;QACV;IACF;AACF,EAAC"}
@@ -2,13 +2,12 @@ import type { BaseListFilter } from 'payload';
2
2
  type Args = {
3
3
  baseListFilter?: BaseListFilter;
4
4
  tenantFieldName: string;
5
- tenantsCollectionSlug: string;
6
5
  };
7
6
  /**
8
7
  * Combines a base list filter with a tenant list filter
9
8
  *
10
9
  * Combines where constraints inside of an AND operator
11
10
  */
12
- export declare const withTenantListFilter: ({ baseListFilter, tenantFieldName, tenantsCollectionSlug }: Args) => BaseListFilter;
11
+ export declare const withTenantListFilter: ({ baseListFilter, tenantFieldName }: Args) => BaseListFilter;
13
12
  export {};
14
13
  //# sourceMappingURL=withTenantListFilter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"withTenantListFilter.d.ts","sourceRoot":"","sources":["../../src/utilities/withTenantListFilter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAS,MAAM,SAAS,CAAA;AAIpD,KAAK,IAAI,GAAG;IACV,cAAc,CAAC,EAAE,cAAc,CAAA;IAC/B,eAAe,EAAE,MAAM,CAAA;IACvB,qBAAqB,EAAE,MAAM,CAAA;CAC9B,CAAA;AACD;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,+DAC8B,IAAI,KAAG,cAkCnE,CAAA"}
1
+ {"version":3,"file":"withTenantListFilter.d.ts","sourceRoot":"","sources":["../../src/utilities/withTenantListFilter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAS,MAAM,SAAS,CAAA;AAIpD,KAAK,IAAI,GAAG;IACV,cAAc,CAAC,EAAE,cAAc,CAAA;IAC/B,eAAe,EAAE,MAAM,CAAA;CACxB,CAAA;AACD;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,wCACO,IAAI,KAAG,cAiC5C,CAAA"}
@@ -3,7 +3,7 @@ import { getTenantListFilter } from './getTenantListFilter.js';
3
3
  * Combines a base list filter with a tenant list filter
4
4
  *
5
5
  * Combines where constraints inside of an AND operator
6
- */ export const withTenantListFilter = ({ baseListFilter, tenantFieldName, tenantsCollectionSlug })=>async (args)=>{
6
+ */ export const withTenantListFilter = ({ baseListFilter, tenantFieldName })=>async (args)=>{
7
7
  const filterConstraints = [];
8
8
  if (typeof baseListFilter === 'function') {
9
9
  const baseListFilterResult = await baseListFilter(args);
@@ -13,8 +13,7 @@ import { getTenantListFilter } from './getTenantListFilter.js';
13
13
  }
14
14
  const tenantListFilter = getTenantListFilter({
15
15
  req: args.req,
16
- tenantFieldName,
17
- tenantsCollectionSlug
16
+ tenantFieldName
18
17
  });
19
18
  if (tenantListFilter) {
20
19
  filterConstraints.push(tenantListFilter);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/withTenantListFilter.ts"],"sourcesContent":["import type { BaseListFilter, Where } from 'payload'\n\nimport { getTenantListFilter } from './getTenantListFilter.js'\n\ntype Args = {\n baseListFilter?: BaseListFilter\n tenantFieldName: string\n tenantsCollectionSlug: string\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 withTenantListFilter =\n ({ baseListFilter, tenantFieldName, tenantsCollectionSlug }: 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 tenantListFilter = getTenantListFilter({\n req: args.req,\n tenantFieldName,\n tenantsCollectionSlug,\n })\n\n if (tenantListFilter) {\n filterConstraints.push(tenantListFilter)\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":["getTenantListFilter","withTenantListFilter","baseListFilter","tenantFieldName","tenantsCollectionSlug","args","filterConstraints","baseListFilterResult","push","tenantListFilter","req","length","combinedWhere","and","forEach","constraint"],"mappings":"AAEA,SAASA,mBAAmB,QAAQ,2BAA0B;AAO9D;;;;CAIC,GACD,OAAO,MAAMC,uBACX,CAAC,EAAEC,cAAc,EAAEC,eAAe,EAAEC,qBAAqB,EAAQ,GACjE,OAAOC;QACL,MAAMC,oBAAoB,EAAE;QAE5B,IAAI,OAAOJ,mBAAmB,YAAY;YACxC,MAAMK,uBAAuB,MAAML,eAAeG;YAElD,IAAIE,sBAAsB;gBACxBD,kBAAkBE,IAAI,CAACD;YACzB;QACF;QAEA,MAAME,mBAAmBT,oBAAoB;YAC3CU,KAAKL,KAAKK,GAAG;YACbP;YACAC;QACF;QAEA,IAAIK,kBAAkB;YACpBH,kBAAkBE,IAAI,CAACC;QACzB;QAEA,IAAIH,kBAAkBK,MAAM,EAAE;YAC5B,MAAMC,gBAAuB;gBAAEC,KAAK,EAAE;YAAC;YACvCP,kBAAkBQ,OAAO,CAAC,CAACC;gBACzB,IAAIH,cAAcC,GAAG,IAAIE,cAAc,OAAOA,eAAe,UAAU;oBACrEH,cAAcC,GAAG,CAACL,IAAI,CAACO;gBACzB;YACF;YACA,OAAOH;QACT;QAEA,wCAAwC;QACxC,OAAO;IACT,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/withTenantListFilter.ts"],"sourcesContent":["import type { BaseListFilter, Where } from 'payload'\n\nimport { getTenantListFilter } from './getTenantListFilter.js'\n\ntype Args = {\n baseListFilter?: BaseListFilter\n tenantFieldName: string\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 withTenantListFilter =\n ({ baseListFilter, tenantFieldName }: 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 tenantListFilter = getTenantListFilter({\n req: args.req,\n tenantFieldName,\n })\n\n if (tenantListFilter) {\n filterConstraints.push(tenantListFilter)\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":["getTenantListFilter","withTenantListFilter","baseListFilter","tenantFieldName","args","filterConstraints","baseListFilterResult","push","tenantListFilter","req","length","combinedWhere","and","forEach","constraint"],"mappings":"AAEA,SAASA,mBAAmB,QAAQ,2BAA0B;AAM9D;;;;CAIC,GACD,OAAO,MAAMC,uBACX,CAAC,EAAEC,cAAc,EAAEC,eAAe,EAAQ,GAC1C,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,mBAAmBR,oBAAoB;YAC3CS,KAAKL,KAAKK,GAAG;YACbN;QACF;QAEA,IAAIK,kBAAkB;YACpBH,kBAAkBE,IAAI,CAACC;QACzB;QAEA,IAAIH,kBAAkBK,MAAM,EAAE;YAC5B,MAAMC,gBAAuB;gBAAEC,KAAK,EAAE;YAAC;YACvCP,kBAAkBQ,OAAO,CAAC,CAACC;gBACzB,IAAIH,cAAcC,GAAG,IAAIE,cAAc,OAAOA,eAAe,UAAU;oBACrEH,cAAcC,GAAG,CAACL,IAAI,CAACO;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.20.0-canary.260f830",
3
+ "version": "3.20.0-canary.296a49c",
4
4
  "description": "Multi Tenant plugin for Payload",
5
5
  "keywords": [
6
6
  "payload",
@@ -67,13 +67,13 @@
67
67
  ],
68
68
  "devDependencies": {
69
69
  "@payloadcms/eslint-config": "3.9.0",
70
- "payload": "3.20.0-canary.260f830",
71
- "@payloadcms/ui": "3.20.0-canary.260f830"
70
+ "@payloadcms/ui": "3.20.0-canary.296a49c",
71
+ "payload": "3.20.0-canary.296a49c"
72
72
  },
73
73
  "peerDependencies": {
74
74
  "next": "^15.0.3",
75
- "payload": "3.20.0-canary.260f830",
76
- "@payloadcms/ui": "3.20.0-canary.260f830"
75
+ "@payloadcms/ui": "3.20.0-canary.296a49c",
76
+ "payload": "3.20.0-canary.296a49c"
77
77
  },
78
78
  "homepage:": "https://payloadcms.com",
79
79
  "scripts": {
@@ -1,8 +0,0 @@
1
- import type { CollectionSlug, Payload } from 'payload';
2
- type Args = {
3
- collectionSlug: CollectionSlug;
4
- payload: Payload;
5
- };
6
- export declare const getCollectionIDType: ({ collectionSlug, payload }: Args) => "number" | "text";
7
- export {};
8
- //# sourceMappingURL=getCollectionIDType.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"getCollectionIDType.d.ts","sourceRoot":"","sources":["../../src/utilities/getCollectionIDType.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEtD,KAAK,IAAI,GAAG;IACV,cAAc,EAAE,cAAc,CAAA;IAC9B,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA;AACD,eAAO,MAAM,mBAAmB,gCAAiC,IAAI,KAAG,QAAQ,GAAG,MAElF,CAAA"}
@@ -1,5 +0,0 @@
1
- export const getCollectionIDType = ({ collectionSlug, payload })=>{
2
- return payload.collections[collectionSlug]?.customIDType ?? payload.db.defaultIDType;
3
- };
4
-
5
- //# sourceMappingURL=getCollectionIDType.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utilities/getCollectionIDType.ts"],"sourcesContent":["import type { CollectionSlug, Payload } from 'payload'\n\ntype Args = {\n collectionSlug: CollectionSlug\n payload: Payload\n}\nexport const getCollectionIDType = ({ collectionSlug, payload }: Args): 'number' | 'text' => {\n return payload.collections[collectionSlug]?.customIDType ?? payload.db.defaultIDType\n}\n"],"names":["getCollectionIDType","collectionSlug","payload","collections","customIDType","db","defaultIDType"],"mappings":"AAMA,OAAO,MAAMA,sBAAsB,CAAC,EAAEC,cAAc,EAAEC,OAAO,EAAQ;IACnE,OAAOA,QAAQC,WAAW,CAACF,eAAe,EAAEG,gBAAgBF,QAAQG,EAAE,CAACC,aAAa;AACtF,EAAC"}