@payloadcms/plugin-multi-tenant 0.0.1 → 3.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/README.md +130 -95
  2. package/dist/components/GlobalViewRedirect/index.d.ts +3 -2
  3. package/dist/components/GlobalViewRedirect/index.d.ts.map +1 -1
  4. package/dist/components/GlobalViewRedirect/index.js +1 -0
  5. package/dist/components/GlobalViewRedirect/index.js.map +1 -1
  6. package/dist/components/TenantField/index.client.d.ts +3 -3
  7. package/dist/components/TenantField/index.client.d.ts.map +1 -1
  8. package/dist/components/TenantField/index.client.js +55 -17
  9. package/dist/components/TenantField/index.client.js.map +1 -1
  10. package/dist/components/TenantField/index.scss +14 -0
  11. package/dist/components/TenantSelector/index.d.ts +5 -8
  12. package/dist/components/TenantSelector/index.d.ts.map +1 -1
  13. package/dist/components/TenantSelector/index.js +35 -24
  14. package/dist/components/TenantSelector/index.js.map +1 -1
  15. package/dist/constants.d.ts +2 -0
  16. package/dist/constants.d.ts.map +1 -0
  17. package/dist/constants.js +4 -0
  18. package/dist/constants.js.map +1 -0
  19. package/dist/exports/client.d.ts +3 -0
  20. package/dist/exports/client.d.ts.map +1 -0
  21. package/dist/exports/client.js +4 -0
  22. package/dist/exports/client.js.map +1 -0
  23. package/dist/exports/fields.d.ts +3 -0
  24. package/dist/exports/fields.d.ts.map +1 -0
  25. package/dist/exports/fields.js +4 -0
  26. package/dist/exports/fields.js.map +1 -0
  27. package/dist/exports/rsc.d.ts +1 -2
  28. package/dist/exports/rsc.d.ts.map +1 -1
  29. package/dist/exports/rsc.js +1 -2
  30. package/dist/exports/rsc.js.map +1 -1
  31. package/dist/fields/tenantField/index.d.ts +2 -3
  32. package/dist/fields/tenantField/index.d.ts.map +1 -1
  33. package/dist/fields/tenantField/index.js +8 -4
  34. package/dist/fields/tenantField/index.js.map +1 -1
  35. package/dist/fields/tenantsArrayField/index.d.ts +7 -0
  36. package/dist/fields/tenantsArrayField/index.d.ts.map +1 -0
  37. package/dist/fields/{userTenantsArrayField → tenantsArrayField}/index.js +3 -3
  38. package/dist/fields/tenantsArrayField/index.js.map +1 -0
  39. package/dist/hooks/afterTenantDelete.d.ts +16 -0
  40. package/dist/hooks/afterTenantDelete.d.ts.map +1 -0
  41. package/dist/hooks/afterTenantDelete.js +71 -0
  42. package/dist/hooks/afterTenantDelete.js.map +1 -0
  43. package/dist/index.d.ts +1 -1
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +112 -49
  46. package/dist/index.js.map +1 -1
  47. package/dist/providers/TenantSelectionProvider/index.client.d.ts +19 -0
  48. package/dist/providers/TenantSelectionProvider/index.client.d.ts.map +1 -0
  49. package/dist/providers/TenantSelectionProvider/index.client.js +69 -0
  50. package/dist/providers/TenantSelectionProvider/index.client.js.map +1 -0
  51. package/dist/providers/TenantSelectionProvider/index.d.ts +11 -0
  52. package/dist/providers/TenantSelectionProvider/index.d.ts.map +1 -0
  53. package/dist/providers/TenantSelectionProvider/index.js +31 -0
  54. package/dist/providers/TenantSelectionProvider/index.js.map +1 -0
  55. package/dist/types.d.ts +54 -17
  56. package/dist/types.d.ts.map +1 -1
  57. package/dist/types.js.map +1 -1
  58. package/dist/utilities/addCollectionAccess.d.ts +13 -0
  59. package/dist/utilities/addCollectionAccess.d.ts.map +1 -0
  60. package/dist/utilities/addCollectionAccess.js +29 -0
  61. package/dist/utilities/addCollectionAccess.js.map +1 -0
  62. package/dist/utilities/addFilterOptionsToFields.d.ts +9 -0
  63. package/dist/utilities/addFilterOptionsToFields.d.ts.map +1 -0
  64. package/dist/utilities/addFilterOptionsToFields.js +107 -0
  65. package/dist/utilities/addFilterOptionsToFields.js.map +1 -0
  66. package/dist/utilities/combineWhereConstraints.js +2 -2
  67. package/dist/utilities/combineWhereConstraints.js.map +1 -1
  68. package/dist/utilities/getGlobalViewRedirect.d.ts +4 -3
  69. package/dist/utilities/getGlobalViewRedirect.d.ts.map +1 -1
  70. package/dist/utilities/getGlobalViewRedirect.js +6 -5
  71. package/dist/utilities/getGlobalViewRedirect.js.map +1 -1
  72. package/dist/utilities/getTenantAccess.d.ts +7 -3
  73. package/dist/utilities/getTenantAccess.d.ts.map +1 -1
  74. package/dist/utilities/getTenantAccess.js +6 -9
  75. package/dist/utilities/getTenantAccess.js.map +1 -1
  76. package/dist/utilities/getTenantFromCookie.d.ts +8 -1
  77. package/dist/utilities/getTenantFromCookie.d.ts.map +1 -1
  78. package/dist/utilities/getTenantFromCookie.js +7 -1
  79. package/dist/utilities/getTenantFromCookie.js.map +1 -1
  80. package/dist/utilities/getTenantListFilter.d.ts.map +1 -1
  81. package/dist/utilities/getTenantListFilter.js +8 -8
  82. package/dist/utilities/getTenantListFilter.js.map +1 -1
  83. package/dist/utilities/getUserTenantIDs.d.ts +1 -2
  84. package/dist/utilities/getUserTenantIDs.d.ts.map +1 -1
  85. package/dist/utilities/getUserTenantIDs.js +2 -6
  86. package/dist/utilities/getUserTenantIDs.js.map +1 -1
  87. package/dist/utilities/withTenantAccess.d.ts +4 -3
  88. package/dist/utilities/withTenantAccess.d.ts.map +1 -1
  89. package/dist/utilities/withTenantAccess.js +12 -16
  90. package/dist/utilities/withTenantAccess.js.map +1 -1
  91. package/dist/utilities/withTenantListFilter.js +1 -1
  92. package/dist/utilities/withTenantListFilter.js.map +1 -1
  93. package/package.json +20 -10
  94. package/dist/components/TenantField/index.d.ts +0 -3
  95. package/dist/components/TenantField/index.d.ts.map +0 -1
  96. package/dist/components/TenantField/index.js +0 -33
  97. package/dist/components/TenantField/index.js.map +0 -1
  98. package/dist/components/TenantSelector/index.client.d.ts +0 -11
  99. package/dist/components/TenantSelector/index.client.d.ts.map +0 -1
  100. package/dist/components/TenantSelector/index.client.js +0 -61
  101. package/dist/components/TenantSelector/index.client.js.map +0 -1
  102. package/dist/fields/userTenantsArrayField/index.d.ts +0 -4
  103. package/dist/fields/userTenantsArrayField/index.d.ts.map +0 -1
  104. package/dist/fields/userTenantsArrayField/index.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"getUserTenantIDs.d.ts","sourceRoot":"","sources":["../../src/utilities/getUserTenantIDs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAI/D;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAAI,MAAM,SAAS,MAAM,GAAG,MAAM,QACvD,IAAI,GAAG,oBAAoB,SAC1B,MAAM,KACZ,MAAM,EAkBR,CAAA"}
1
+ {"version":3,"file":"getUserTenantIDs.d.ts","sourceRoot":"","sources":["../../src/utilities/getUserTenantIDs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAI/D;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,MAAM,SAAS,MAAM,GAAG,MAAM,QACvD,IAAI,GAAG,oBAAoB,KAChC,MAAM,EAcR,CAAA"}
@@ -3,15 +3,11 @@ import { extractID } from './extractID.js';
3
3
  * Returns array of all tenant IDs assigned to a user
4
4
  *
5
5
  * @param user - User object with tenants field
6
- * @param role - Optional role to filter by
7
- */ export const getUserTenantIDs = (user, role)=>{
6
+ */ export const getUserTenantIDs = (user)=>{
8
7
  if (!user) {
9
8
  return [];
10
9
  }
11
- return user?.tenants?.reduce((acc, { roles, tenant })=>{
12
- if (role && !roles.includes(role)) {
13
- return acc;
14
- }
10
+ return user?.tenants?.reduce((acc, { tenant })=>{
15
11
  if (tenant) {
16
12
  acc.push(extractID(tenant));
17
13
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/getUserTenantIDs.ts"],"sourcesContent":["import type { Tenant, UserWithTenantsField } from '../types.js'\n\nimport { extractID } from './extractID.js'\n\n/**\n * Returns array of all tenant IDs assigned to a user\n *\n * @param user - User object with tenants field\n * @param role - Optional role to filter by\n */\nexport const getUserTenantIDs = <IDType extends number | string>(\n user: null | UserWithTenantsField,\n role?: string,\n): IDType[] => {\n if (!user) {\n return []\n }\n\n return (\n user?.tenants?.reduce<IDType[]>((acc, { roles, tenant }) => {\n if (role && !roles.includes(role)) {\n return acc\n }\n\n if (tenant) {\n acc.push(extractID<IDType>(tenant as Tenant<IDType>))\n }\n\n return acc\n }, []) || []\n )\n}\n"],"names":["extractID","getUserTenantIDs","user","role","tenants","reduce","acc","roles","tenant","includes","push"],"mappings":"AAEA,SAASA,SAAS,QAAQ,iBAAgB;AAE1C;;;;;CAKC,GACD,OAAO,MAAMC,mBAAmB,CAC9BC,MACAC;IAEA,IAAI,CAACD,MAAM;QACT,OAAO,EAAE;IACX;IAEA,OACEA,MAAME,SAASC,OAAiB,CAACC,KAAK,EAAEC,KAAK,EAAEC,MAAM,EAAE;QACrD,IAAIL,QAAQ,CAACI,MAAME,QAAQ,CAACN,OAAO;YACjC,OAAOG;QACT;QAEA,IAAIE,QAAQ;YACVF,IAAII,IAAI,CAACV,UAAkBQ;QAC7B;QAEA,OAAOF;IACT,GAAG,EAAE,KAAK,EAAE;AAEhB,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/getUserTenantIDs.ts"],"sourcesContent":["import type { Tenant, UserWithTenantsField } from '../types.js'\n\nimport { extractID } from './extractID.js'\n\n/**\n * Returns array of all tenant IDs assigned to a user\n *\n * @param user - User object with tenants field\n */\nexport const getUserTenantIDs = <IDType extends number | string>(\n user: null | UserWithTenantsField,\n): IDType[] => {\n if (!user) {\n return []\n }\n\n return (\n user?.tenants?.reduce<IDType[]>((acc, { tenant }) => {\n if (tenant) {\n acc.push(extractID<IDType>(tenant as Tenant<IDType>))\n }\n\n return acc\n }, []) || []\n )\n}\n"],"names":["extractID","getUserTenantIDs","user","tenants","reduce","acc","tenant","push"],"mappings":"AAEA,SAASA,SAAS,QAAQ,iBAAgB;AAE1C;;;;CAIC,GACD,OAAO,MAAMC,mBAAmB,CAC9BC;IAEA,IAAI,CAACA,MAAM;QACT,OAAO,EAAE;IACX;IAEA,OACEA,MAAMC,SAASC,OAAiB,CAACC,KAAK,EAAEC,MAAM,EAAE;QAC9C,IAAIA,QAAQ;YACVD,IAAIE,IAAI,CAACP,UAAkBM;QAC7B;QAEA,OAAOD;IACT,GAAG,EAAE,KAAK,EAAE;AAEhB,EAAC"}
@@ -1,9 +1,10 @@
1
1
  import type { Access, AccessArgs, AccessResult } from 'payload';
2
2
  import type { MultiTenantPluginConfig } from '../types.js';
3
- type Args = {
3
+ type Args<ConfigType> = {
4
4
  accessFunction?: Access;
5
- userHasAccessToAllTenants: MultiTenantPluginConfig['userHasAccessToAllTenants'];
5
+ fieldName: string;
6
+ userHasAccessToAllTenants: Required<MultiTenantPluginConfig<ConfigType>>['userHasAccessToAllTenants'];
6
7
  };
7
- export declare const withTenantAccess: ({ accessFunction, userHasAccessToAllTenants }: Args) => (args: AccessArgs) => Promise<AccessResult>;
8
+ export declare const withTenantAccess: <ConfigType>({ accessFunction, fieldName, userHasAccessToAllTenants }: Args<ConfigType>) => (args: AccessArgs) => Promise<AccessResult>;
8
9
  export {};
9
10
  //# sourceMappingURL=withTenantAccess.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"withTenantAccess.d.ts","sourceRoot":"","sources":["../../src/utilities/withTenantAccess.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAE/D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAK1D,KAAK,IAAI,GAAG;IACV,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,yBAAyB,EAAE,uBAAuB,CAAC,2BAA2B,CAAC,CAAA;CAChF,CAAA;AACD,eAAO,MAAM,gBAAgB,kDACqB,IAAI,YACvC,UAAU,KAAG,OAAO,CAAC,YAAY,CAyB7C,CAAA"}
1
+ {"version":3,"file":"withTenantAccess.d.ts","sourceRoot":"","sources":["../../src/utilities/withTenantAccess.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAQ,MAAM,SAAS,CAAA;AAErE,OAAO,KAAK,EAAE,uBAAuB,EAAwB,MAAM,aAAa,CAAA;AAKhF,KAAK,IAAI,CAAC,UAAU,IAAI;IACtB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,yBAAyB,EAAE,QAAQ,CACjC,uBAAuB,CAAC,UAAU,CAAC,CACpC,CAAC,2BAA2B,CAAC,CAAA;CAC/B,CAAA;AACD,eAAO,MAAM,gBAAgB,GAC1B,UAAU,4DAA4D,IAAI,CAAC,UAAU,CAAC,YAC1E,UAAU,KAAG,OAAO,CAAC,YAAY,CA8B7C,CAAA"}
@@ -1,24 +1,20 @@
1
1
  import { combineWhereConstraints } from './combineWhereConstraints.js';
2
2
  import { getTenantAccess } from './getTenantAccess.js';
3
- export const withTenantAccess = ({ accessFunction, userHasAccessToAllTenants })=>async (args)=>{
4
- let accessResult;
3
+ export const withTenantAccess = ({ accessFunction, fieldName, userHasAccessToAllTenants })=>async (args)=>{
5
4
  const constraints = [];
6
- if (typeof accessFunction === 'function') {
7
- accessResult = await accessFunction(args);
8
- if (accessResult === false) {
9
- return false;
10
- } else if (accessResult && typeof accessResult === 'object') {
11
- constraints.push(accessResult);
12
- }
5
+ const accessFn = typeof accessFunction === 'function' ? accessFunction : ({ req })=>Boolean(req.user);
6
+ const accessResult = await accessFn(args);
7
+ if (accessResult === false) {
8
+ return false;
9
+ } else if (accessResult && typeof accessResult === 'object') {
10
+ constraints.push(accessResult);
13
11
  }
14
- if (!userHasAccessToAllTenants(args.req.user)) {
15
- const tenantConstraint = getTenantAccess({
12
+ if (args.req.user && !userHasAccessToAllTenants(args.req.user)) {
13
+ constraints.push(getTenantAccess({
14
+ fieldName,
16
15
  user: args.req.user
17
- });
18
- if (tenantConstraint) {
19
- constraints.push(tenantConstraint);
20
- return combineWhereConstraints(constraints);
21
- }
16
+ }));
17
+ return combineWhereConstraints(constraints);
22
18
  }
23
19
  return accessResult;
24
20
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/withTenantAccess.ts"],"sourcesContent":["import type { Access, AccessArgs, AccessResult } from 'payload'\n\nimport type { MultiTenantPluginConfig } from '../types.js'\n\nimport { combineWhereConstraints } from './combineWhereConstraints.js'\nimport { getTenantAccess } from './getTenantAccess.js'\n\ntype Args = {\n accessFunction?: Access\n userHasAccessToAllTenants: MultiTenantPluginConfig['userHasAccessToAllTenants']\n}\nexport const withTenantAccess =\n ({ accessFunction, userHasAccessToAllTenants }: Args) =>\n async (args: AccessArgs): Promise<AccessResult> => {\n let accessResult: AccessResult\n const constraints = []\n\n if (typeof accessFunction === 'function') {\n accessResult = await accessFunction(args)\n if (accessResult === false) {\n return false\n } else if (accessResult && typeof accessResult === 'object') {\n constraints.push(accessResult)\n }\n }\n\n if (!userHasAccessToAllTenants(args.req.user)) {\n const tenantConstraint = getTenantAccess({\n user: args.req.user,\n })\n\n if (tenantConstraint) {\n constraints.push(tenantConstraint)\n return combineWhereConstraints(constraints)\n }\n }\n\n return accessResult\n }\n"],"names":["combineWhereConstraints","getTenantAccess","withTenantAccess","accessFunction","userHasAccessToAllTenants","args","accessResult","constraints","push","req","user","tenantConstraint"],"mappings":"AAIA,SAASA,uBAAuB,QAAQ,+BAA8B;AACtE,SAASC,eAAe,QAAQ,uBAAsB;AAMtD,OAAO,MAAMC,mBACX,CAAC,EAAEC,cAAc,EAAEC,yBAAyB,EAAQ,GACpD,OAAOC;QACL,IAAIC;QACJ,MAAMC,cAAc,EAAE;QAEtB,IAAI,OAAOJ,mBAAmB,YAAY;YACxCG,eAAe,MAAMH,eAAeE;YACpC,IAAIC,iBAAiB,OAAO;gBAC1B,OAAO;YACT,OAAO,IAAIA,gBAAgB,OAAOA,iBAAiB,UAAU;gBAC3DC,YAAYC,IAAI,CAACF;YACnB;QACF;QAEA,IAAI,CAACF,0BAA0BC,KAAKI,GAAG,CAACC,IAAI,GAAG;YAC7C,MAAMC,mBAAmBV,gBAAgB;gBACvCS,MAAML,KAAKI,GAAG,CAACC,IAAI;YACrB;YAEA,IAAIC,kBAAkB;gBACpBJ,YAAYC,IAAI,CAACG;gBACjB,OAAOX,wBAAwBO;YACjC;QACF;QAEA,OAAOD;IACT,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/withTenantAccess.ts"],"sourcesContent":["import type { Access, AccessArgs, AccessResult, User } from 'payload'\n\nimport type { MultiTenantPluginConfig, UserWithTenantsField } from '../types.js'\n\nimport { combineWhereConstraints } from './combineWhereConstraints.js'\nimport { getTenantAccess } from './getTenantAccess.js'\n\ntype Args<ConfigType> = {\n accessFunction?: Access\n fieldName: string\n userHasAccessToAllTenants: Required<\n MultiTenantPluginConfig<ConfigType>\n >['userHasAccessToAllTenants']\n}\nexport const withTenantAccess =\n <ConfigType>({ accessFunction, fieldName, userHasAccessToAllTenants }: Args<ConfigType>) =>\n async (args: AccessArgs): Promise<AccessResult> => {\n const constraints = []\n const accessFn =\n typeof accessFunction === 'function'\n ? accessFunction\n : ({ req }: AccessArgs): AccessResult => Boolean(req.user)\n const accessResult: AccessResult = await accessFn(args)\n\n if (accessResult === false) {\n return false\n } else if (accessResult && typeof accessResult === 'object') {\n constraints.push(accessResult)\n }\n\n if (\n args.req.user &&\n !userHasAccessToAllTenants(\n args.req.user as ConfigType extends { user: User } ? ConfigType['user'] : User,\n )\n ) {\n constraints.push(\n getTenantAccess({\n fieldName,\n user: args.req.user as UserWithTenantsField,\n }),\n )\n return combineWhereConstraints(constraints)\n }\n\n return accessResult\n }\n"],"names":["combineWhereConstraints","getTenantAccess","withTenantAccess","accessFunction","fieldName","userHasAccessToAllTenants","args","constraints","accessFn","req","Boolean","user","accessResult","push"],"mappings":"AAIA,SAASA,uBAAuB,QAAQ,+BAA8B;AACtE,SAASC,eAAe,QAAQ,uBAAsB;AAStD,OAAO,MAAMC,mBACX,CAAa,EAAEC,cAAc,EAAEC,SAAS,EAAEC,yBAAyB,EAAoB,GACvF,OAAOC;QACL,MAAMC,cAAc,EAAE;QACtB,MAAMC,WACJ,OAAOL,mBAAmB,aACtBA,iBACA,CAAC,EAAEM,GAAG,EAAc,GAAmBC,QAAQD,IAAIE,IAAI;QAC7D,MAAMC,eAA6B,MAAMJ,SAASF;QAElD,IAAIM,iBAAiB,OAAO;YAC1B,OAAO;QACT,OAAO,IAAIA,gBAAgB,OAAOA,iBAAiB,UAAU;YAC3DL,YAAYM,IAAI,CAACD;QACnB;QAEA,IACEN,KAAKG,GAAG,CAACE,IAAI,IACb,CAACN,0BACCC,KAAKG,GAAG,CAACE,IAAI,GAEf;YACAJ,YAAYM,IAAI,CACdZ,gBAAgB;gBACdG;gBACAO,MAAML,KAAKG,GAAG,CAACE,IAAI;YACrB;YAEF,OAAOX,wBAAwBO;QACjC;QAEA,OAAOK;IACT,EAAC"}
@@ -23,7 +23,7 @@ import { getTenantListFilter } from './getTenantListFilter.js';
23
23
  and: []
24
24
  };
25
25
  filterConstraints.forEach((constraint)=>{
26
- if (typeof constraint === 'object') {
26
+ if (combinedWhere.and && constraint && typeof constraint === 'object') {
27
27
  combinedWhere.and.push(constraint);
28
28
  }
29
29
  });
@@ -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}\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 (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,IAAI,OAAOA,eAAe,UAAU;oBAClCH,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": "0.0.1",
3
+ "version": "3.18.0",
4
4
  "description": "Multi Tenant plugin for Payload",
5
5
  "keywords": [
6
6
  "payload",
@@ -32,6 +32,11 @@
32
32
  "types": "./dist/index.d.ts",
33
33
  "default": "./dist/index.js"
34
34
  },
35
+ "./fields": {
36
+ "import": "./dist/exports/fields.js",
37
+ "types": "./dist/exports/fields.d.ts",
38
+ "default": "./dist/exports/fields.js"
39
+ },
35
40
  "./types": {
36
41
  "import": "./dist/exports/types.js",
37
42
  "types": "./dist/exports/types.d.ts",
@@ -42,10 +47,15 @@
42
47
  "types": "./dist/exports/rsc.d.ts",
43
48
  "default": "./dist/exports/rsc.js"
44
49
  },
45
- "./utilites": {
46
- "import": "./dist/exports/utilites.js",
47
- "types": "./dist/exports/utilites.d.ts",
48
- "default": "./dist/exports/utilites.js"
50
+ "./client": {
51
+ "import": "./dist/exports/client.js",
52
+ "types": "./dist/exports/client.d.ts",
53
+ "default": "./dist/exports/client.js"
54
+ },
55
+ "./utilities": {
56
+ "import": "./dist/exports/utilities.js",
57
+ "types": "./dist/exports/utilities.d.ts",
58
+ "default": "./dist/exports/utilities.js"
49
59
  }
50
60
  },
51
61
  "main": "./dist/index.js",
@@ -56,14 +66,14 @@
56
66
  "types.d.ts"
57
67
  ],
58
68
  "devDependencies": {
59
- "@payloadcms/ui": "3.15.1",
60
- "payload": "3.15.1",
61
- "@payloadcms/eslint-config": "3.9.0"
69
+ "@payloadcms/eslint-config": "3.9.0",
70
+ "@payloadcms/ui": "3.18.0",
71
+ "payload": "3.18.0"
62
72
  },
63
73
  "peerDependencies": {
64
74
  "next": "^15.0.3",
65
- "@payloadcms/ui": "3.15.1",
66
- "payload": "3.15.1"
75
+ "@payloadcms/ui": "3.18.0",
76
+ "payload": "3.18.0"
67
77
  },
68
78
  "homepage:": "https://payloadcms.com",
69
79
  "scripts": {
@@ -1,3 +0,0 @@
1
- import React from 'react';
2
- export declare const TenantField: React.FC;
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/TenantField/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAA;AAazB,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAwC/B,CAAA"}
@@ -1,33 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import React from 'react';
3
- import { getTenantFromCookie } from '../../utilities/getTenantFromCookie.js';
4
- import { getUserTenantIDs } from '../../utilities/getUserTenantIDs.js';
5
- import { TenantFieldClient } from './index.client.js';
6
- export const TenantField = async ({ clientField, debug, path, payload, readOnly, req, tenantsCollectionSlug, user })=>{
7
- let serverValue = getTenantFromCookie(req.headers, payload.db.defaultIDType) || getUserTenantIDs(user)?.[0];
8
- if (serverValue) {
9
- try {
10
- // validate that the tenant exists
11
- const doc = await payload.findByID({
12
- id: serverValue,
13
- collection: tenantsCollectionSlug,
14
- depth: 0
15
- });
16
- if (!doc) {
17
- serverValue = undefined;
18
- }
19
- } catch (_) {
20
- serverValue = undefined;
21
- }
22
- }
23
- return /*#__PURE__*/ _jsx(TenantFieldClient, {
24
- debug: debug,
25
- field: clientField,
26
- path: path,
27
- readOnly: readOnly,
28
- serverValue: serverValue,
29
- tenantsCollectionSlug: tenantsCollectionSlug
30
- });
31
- };
32
-
33
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/components/TenantField/index.tsx"],"sourcesContent":["import type { RelationshipFieldServerProps } from 'payload'\n\nimport React from 'react'\n\nimport type { UserWithTenantsField } from '../../types.js'\n\nimport { getTenantFromCookie } from '../../utilities/getTenantFromCookie.js'\nimport { getUserTenantIDs } from '../../utilities/getUserTenantIDs.js'\nimport { TenantFieldClient } from './index.client.js'\n\ntype Props = {\n debug?: boolean\n tenantsCollectionSlug: string\n} & RelationshipFieldServerProps\n\nexport const TenantField: React.FC = async ({\n clientField,\n debug,\n path,\n payload,\n readOnly,\n req,\n tenantsCollectionSlug,\n user,\n}: Props) => {\n let serverValue: number | string | undefined =\n getTenantFromCookie(req.headers, payload.db.defaultIDType) ||\n getUserTenantIDs(user as UserWithTenantsField)?.[0]\n\n if (serverValue) {\n try {\n // validate that the tenant exists\n const doc = await payload.findByID({\n id: serverValue,\n collection: tenantsCollectionSlug,\n depth: 0,\n })\n if (!doc) {\n serverValue = undefined\n }\n } catch (_) {\n serverValue = undefined\n }\n }\n\n return (\n <TenantFieldClient\n debug={debug}\n field={clientField}\n path={path}\n readOnly={readOnly}\n serverValue={serverValue}\n tenantsCollectionSlug={tenantsCollectionSlug}\n />\n )\n}\n"],"names":["React","getTenantFromCookie","getUserTenantIDs","TenantFieldClient","TenantField","clientField","debug","path","payload","readOnly","req","tenantsCollectionSlug","user","serverValue","headers","db","defaultIDType","doc","findByID","id","collection","depth","undefined","_","field"],"mappings":";AAEA,OAAOA,WAAW,QAAO;AAIzB,SAASC,mBAAmB,QAAQ,yCAAwC;AAC5E,SAASC,gBAAgB,QAAQ,sCAAqC;AACtE,SAASC,iBAAiB,QAAQ,oBAAmB;AAOrD,OAAO,MAAMC,cAAwB,OAAO,EAC1CC,WAAW,EACXC,KAAK,EACLC,IAAI,EACJC,OAAO,EACPC,QAAQ,EACRC,GAAG,EACHC,qBAAqB,EACrBC,IAAI,EACE;IACN,IAAIC,cACFZ,oBAAoBS,IAAII,OAAO,EAAEN,QAAQO,EAAE,CAACC,aAAa,KACzDd,iBAAiBU,OAA+B,CAAC,EAAE;IAErD,IAAIC,aAAa;QACf,IAAI;YACF,kCAAkC;YAClC,MAAMI,MAAM,MAAMT,QAAQU,QAAQ,CAAC;gBACjCC,IAAIN;gBACJO,YAAYT;gBACZU,OAAO;YACT;YACA,IAAI,CAACJ,KAAK;gBACRJ,cAAcS;YAChB;QACF,EAAE,OAAOC,GAAG;YACVV,cAAcS;QAChB;IACF;IAEA,qBACE,KAACnB;QACCG,OAAOA;QACPkB,OAAOnB;QACPE,MAAMA;QACNE,UAAUA;QACVI,aAAaA;QACbF,uBAAuBA;;AAG7B,EAAC"}
@@ -1,11 +0,0 @@
1
- import React from 'react';
2
- import './index.scss';
3
- export declare const TenantSelectorClient: ({ cookieToSet, initialValue, options, }: {
4
- cookieToSet?: string;
5
- initialValue?: string;
6
- options: {
7
- label: string;
8
- value: string;
9
- }[];
10
- }) => React.JSX.Element;
11
- //# sourceMappingURL=index.client.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../../src/components/TenantSelector/index.client.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,cAAc,CAAA;AAMrB,eAAO,MAAM,oBAAoB,4CAI9B;IACD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAA;QACb,KAAK,EAAE,MAAM,CAAA;KACd,EAAE,CAAA;CACJ,sBAsDA,CAAA"}
@@ -1,61 +0,0 @@
1
- 'use client';
2
- import { jsx as _jsx } from "react/jsx-runtime";
3
- import { SelectInput } from '@payloadcms/ui';
4
- import { useRouter } from 'next/navigation.js';
5
- import React from 'react';
6
- import './index.scss';
7
- function findValue(options, value) {
8
- return options.find((opt)=>opt.value === value)?.value;
9
- }
10
- export const TenantSelectorClient = ({ cookieToSet, initialValue, options })=>{
11
- const [value, setValue] = React.useState(()=>{
12
- if (initialValue) {
13
- return findValue(options, initialValue);
14
- }
15
- });
16
- const router = useRouter();
17
- const setCookieAndReload = React.useCallback((value)=>{
18
- const expires = '; expires=Fri, 31 Dec 9999 23:59:59 GMT';
19
- document.cookie = 'payload-tenant=' + (value || '') + expires + '; path=/';
20
- setValue(value);
21
- router.refresh();
22
- }, [
23
- router
24
- ]);
25
- const handleChange = React.useCallback((option)=>{
26
- if (!option) {
27
- setCookieAndReload(undefined);
28
- } else if ('value' in option) {
29
- setCookieAndReload(option.value);
30
- }
31
- }, [
32
- setCookieAndReload
33
- ]);
34
- React.useEffect(()=>{
35
- if (cookieToSet) {
36
- setCookieAndReload(findValue(options, cookieToSet));
37
- }
38
- }, [
39
- cookieToSet,
40
- options,
41
- setCookieAndReload
42
- ]);
43
- if (options.length <= 1) {
44
- return null;
45
- }
46
- return /*#__PURE__*/ _jsx("div", {
47
- className: "tenant-selector",
48
- children: /*#__PURE__*/ _jsx(SelectInput, {
49
- isClearable: false,
50
- label: "Select a tenant",
51
- name: "setTenant",
52
- onChange: handleChange,
53
- options: options,
54
- path: "setTenant",
55
- readOnly: !value,
56
- value: value
57
- })
58
- });
59
- };
60
-
61
- //# sourceMappingURL=index.client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/components/TenantSelector/index.client.tsx"],"sourcesContent":["'use client'\nimport type { ReactSelectOption } from '@payloadcms/ui'\n\nimport { SelectInput } from '@payloadcms/ui'\nimport { useRouter } from 'next/navigation.js'\nimport React from 'react'\n\nimport './index.scss'\n\nfunction findValue(options: { label: string; value: string }[], value?: string) {\n return options.find((opt) => opt.value === value)?.value\n}\n\nexport const TenantSelectorClient = ({\n cookieToSet,\n initialValue,\n options,\n}: {\n cookieToSet?: string\n initialValue?: string\n options: {\n label: string\n value: string\n }[]\n}) => {\n const [value, setValue] = React.useState<string | undefined>(() => {\n if (initialValue) {\n return findValue(options, initialValue)\n }\n })\n\n const router = useRouter()\n\n const setCookieAndReload = React.useCallback(\n (value?: string) => {\n const expires = '; expires=Fri, 31 Dec 9999 23:59:59 GMT'\n document.cookie = 'payload-tenant=' + (value || '') + expires + '; path=/'\n setValue(value)\n router.refresh()\n },\n [router],\n )\n\n const handleChange = React.useCallback(\n (option: ReactSelectOption | ReactSelectOption[]) => {\n if (!option) {\n setCookieAndReload(undefined)\n } else if ('value' in option) {\n setCookieAndReload(option.value as string)\n }\n },\n [setCookieAndReload],\n )\n\n React.useEffect(() => {\n if (cookieToSet) {\n setCookieAndReload(findValue(options, cookieToSet))\n }\n }, [cookieToSet, options, setCookieAndReload])\n\n if (options.length <= 1) {\n return null\n }\n\n return (\n <div className=\"tenant-selector\">\n <SelectInput\n isClearable={false}\n label=\"Select a tenant\"\n name=\"setTenant\"\n onChange={handleChange}\n options={options}\n path=\"setTenant\"\n readOnly={!value}\n value={value}\n />\n </div>\n )\n}\n"],"names":["SelectInput","useRouter","React","findValue","options","value","find","opt","TenantSelectorClient","cookieToSet","initialValue","setValue","useState","router","setCookieAndReload","useCallback","expires","document","cookie","refresh","handleChange","option","undefined","useEffect","length","div","className","isClearable","label","name","onChange","path","readOnly"],"mappings":"AAAA;;AAGA,SAASA,WAAW,QAAQ,iBAAgB;AAC5C,SAASC,SAAS,QAAQ,qBAAoB;AAC9C,OAAOC,WAAW,QAAO;AAEzB,OAAO,eAAc;AAErB,SAASC,UAAUC,OAA2C,EAAEC,KAAc;IAC5E,OAAOD,QAAQE,IAAI,CAAC,CAACC,MAAQA,IAAIF,KAAK,KAAKA,QAAQA;AACrD;AAEA,OAAO,MAAMG,uBAAuB,CAAC,EACnCC,WAAW,EACXC,YAAY,EACZN,OAAO,EAQR;IACC,MAAM,CAACC,OAAOM,SAAS,GAAGT,MAAMU,QAAQ,CAAqB;QAC3D,IAAIF,cAAc;YAChB,OAAOP,UAAUC,SAASM;QAC5B;IACF;IAEA,MAAMG,SAASZ;IAEf,MAAMa,qBAAqBZ,MAAMa,WAAW,CAC1C,CAACV;QACC,MAAMW,UAAU;QAChBC,SAASC,MAAM,GAAG,oBAAqBb,CAAAA,SAAS,EAAC,IAAKW,UAAU;QAChEL,SAASN;QACTQ,OAAOM,OAAO;IAChB,GACA;QAACN;KAAO;IAGV,MAAMO,eAAelB,MAAMa,WAAW,CACpC,CAACM;QACC,IAAI,CAACA,QAAQ;YACXP,mBAAmBQ;QACrB,OAAO,IAAI,WAAWD,QAAQ;YAC5BP,mBAAmBO,OAAOhB,KAAK;QACjC;IACF,GACA;QAACS;KAAmB;IAGtBZ,MAAMqB,SAAS,CAAC;QACd,IAAId,aAAa;YACfK,mBAAmBX,UAAUC,SAASK;QACxC;IACF,GAAG;QAACA;QAAaL;QAASU;KAAmB;IAE7C,IAAIV,QAAQoB,MAAM,IAAI,GAAG;QACvB,OAAO;IACT;IAEA,qBACE,KAACC;QAAIC,WAAU;kBACb,cAAA,KAAC1B;YACC2B,aAAa;YACbC,OAAM;YACNC,MAAK;YACLC,UAAUV;YACVhB,SAASA;YACT2B,MAAK;YACLC,UAAU,CAAC3B;YACXA,OAAOA;;;AAIf,EAAC"}
@@ -1,4 +0,0 @@
1
- import type { ArrayField } from 'payload';
2
- import type { MultiTenantPluginConfig } from '../../types.js';
3
- export declare const userTenantsField: (args: MultiTenantPluginConfig["userTenantsField"]) => ArrayField;
4
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/fields/userTenantsArrayField/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEzC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAE7D,eAAO,MAAM,gBAAgB,SACrB,uBAAuB,CAAC,kBAAkB,CAAC,KAChD,UAiBD,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/fields/userTenantsArrayField/index.ts"],"sourcesContent":["import type { ArrayField } from 'payload'\n\nimport type { MultiTenantPluginConfig } from '../../types.js'\n\nexport const userTenantsField = (\n args: MultiTenantPluginConfig['userTenantsField'],\n): ArrayField => ({\n name: 'tenants',\n type: 'array',\n access: args?.access,\n fields: [\n {\n name: 'tenant',\n type: 'relationship',\n access: args.access,\n index: true,\n relationTo: 'tenants',\n required: true,\n saveToJWT: true,\n },\n ...(args?.rowFields || []),\n ],\n saveToJWT: true,\n})\n"],"names":["userTenantsField","args","name","type","access","fields","index","relationTo","required","saveToJWT","rowFields"],"mappings":"AAIA,OAAO,MAAMA,mBAAmB,CAC9BC,OACgB,CAAA;QAChBC,MAAM;QACNC,MAAM;QACNC,QAAQH,MAAMG;QACdC,QAAQ;YACN;gBACEH,MAAM;gBACNC,MAAM;gBACNC,QAAQH,KAAKG,MAAM;gBACnBE,OAAO;gBACPC,YAAY;gBACZC,UAAU;gBACVC,WAAW;YACb;eACIR,MAAMS,aAAa,EAAE;SAC1B;QACDD,WAAW;IACb,CAAA,EAAE"}