@payloadcms/plugin-multi-tenant 4.0.0-internal.688c4d0 → 4.0.0-internal.77191e5

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 (92) hide show
  1. package/LICENSE.md +1 -1
  2. package/dist/components/AssignTenantFieldModal/index.client.d.ts +2 -2
  3. package/dist/components/AssignTenantFieldModal/index.client.d.ts.map +1 -1
  4. package/dist/components/AssignTenantFieldModal/index.client.js.map +1 -1
  5. package/dist/components/GlobalViewRedirect/index.d.ts +1 -1
  6. package/dist/components/GlobalViewRedirect/index.d.ts.map +1 -1
  7. package/dist/components/GlobalViewRedirect/index.js.map +1 -1
  8. package/dist/components/TenantField/index.client.d.ts.map +1 -1
  9. package/dist/components/TenantField/index.client.js +84 -74
  10. package/dist/components/TenantField/index.client.js.map +1 -1
  11. package/dist/components/TenantSelector/index.client.d.ts +1 -1
  12. package/dist/components/TenantSelector/index.client.d.ts.map +1 -1
  13. package/dist/components/TenantSelector/index.d.ts.map +1 -1
  14. package/dist/defaults.d.ts.map +1 -1
  15. package/dist/endpoints/getTenantOptionsEndpoint.d.ts +2 -2
  16. package/dist/endpoints/getTenantOptionsEndpoint.d.ts.map +1 -1
  17. package/dist/endpoints/getTenantOptionsEndpoint.js.map +1 -1
  18. package/dist/fields/tenantField/index.d.ts +4 -2
  19. package/dist/fields/tenantField/index.d.ts.map +1 -1
  20. package/dist/fields/tenantField/index.js +36 -9
  21. package/dist/fields/tenantField/index.js.map +1 -1
  22. package/dist/fields/tenantsArrayField/index.d.ts.map +1 -1
  23. package/dist/filters/filterDocumentsByTenants.d.ts +3 -3
  24. package/dist/filters/filterDocumentsByTenants.d.ts.map +1 -1
  25. package/dist/filters/filterDocumentsByTenants.js.map +1 -1
  26. package/dist/hooks/afterTenantDelete.d.ts +1 -1
  27. package/dist/hooks/afterTenantDelete.d.ts.map +1 -1
  28. package/dist/hooks/afterTenantDelete.js +4 -1
  29. package/dist/hooks/afterTenantDelete.js.map +1 -1
  30. package/dist/hooks/enforceTenantMembership.d.ts +15 -0
  31. package/dist/hooks/enforceTenantMembership.d.ts.map +1 -0
  32. package/dist/hooks/enforceTenantMembership.js +39 -0
  33. package/dist/hooks/enforceTenantMembership.js.map +1 -0
  34. package/dist/index.d.ts +1 -2
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +32 -6
  37. package/dist/index.js.map +1 -1
  38. package/dist/providers/TenantSelectionProvider/index.client.d.ts.map +1 -1
  39. package/dist/providers/TenantSelectionProvider/index.client.js +44 -24
  40. package/dist/providers/TenantSelectionProvider/index.client.js.map +1 -1
  41. package/dist/providers/TenantSelectionProvider/index.d.ts +5 -5
  42. package/dist/providers/TenantSelectionProvider/index.d.ts.map +1 -1
  43. package/dist/providers/TenantSelectionProvider/index.js.map +1 -1
  44. package/dist/translations/languages/en.d.ts.map +1 -1
  45. package/dist/types.d.ts +5 -6
  46. package/dist/types.d.ts.map +1 -1
  47. package/dist/types.js.map +1 -1
  48. package/dist/utilities/addCollectionAccess.d.ts +8 -10
  49. package/dist/utilities/addCollectionAccess.d.ts.map +1 -1
  50. package/dist/utilities/addCollectionAccess.js +91 -20
  51. package/dist/utilities/addCollectionAccess.js.map +1 -1
  52. package/dist/utilities/addFilterOptionsToFields.d.ts +3 -3
  53. package/dist/utilities/addFilterOptionsToFields.d.ts.map +1 -1
  54. package/dist/utilities/addFilterOptionsToFields.js.map +1 -1
  55. package/dist/utilities/combineFilters.d.ts.map +1 -1
  56. package/dist/utilities/extractID.d.ts.map +1 -1
  57. package/dist/utilities/generateCookie.d.ts.map +1 -1
  58. package/dist/utilities/getCollectionIDType.d.ts +1 -1
  59. package/dist/utilities/getCollectionIDType.d.ts.map +1 -1
  60. package/dist/utilities/getGlobalViewRedirect.d.ts +3 -3
  61. package/dist/utilities/getGlobalViewRedirect.d.ts.map +1 -1
  62. package/dist/utilities/getGlobalViewRedirect.js.map +1 -1
  63. package/dist/utilities/getTenantIDsFromValue.d.ts +2 -0
  64. package/dist/utilities/getTenantIDsFromValue.d.ts.map +1 -0
  65. package/dist/utilities/getTenantIDsFromValue.js +14 -0
  66. package/dist/utilities/getTenantIDsFromValue.js.map +1 -0
  67. package/dist/utilities/getTenantOptions.d.ts +3 -3
  68. package/dist/utilities/getTenantOptions.d.ts.map +1 -1
  69. package/dist/utilities/getTenantOptions.js.map +1 -1
  70. package/dist/utilities/getUserTenantIDs.d.ts.map +1 -1
  71. package/dist/utilities/getUserTenantIDs.js +5 -3
  72. package/dist/utilities/getUserTenantIDs.js.map +1 -1
  73. package/dist/utilities/isValidTenantAssignment.d.ts +13 -0
  74. package/dist/utilities/isValidTenantAssignment.d.ts.map +1 -0
  75. package/dist/utilities/isValidTenantAssignment.js +28 -0
  76. package/dist/utilities/isValidTenantAssignment.js.map +1 -0
  77. package/dist/utilities/miniChalk.d.ts.map +1 -1
  78. package/dist/utilities/shouldRefreshTenantSelection.d.ts +5 -0
  79. package/dist/utilities/shouldRefreshTenantSelection.d.ts.map +1 -0
  80. package/dist/utilities/shouldRefreshTenantSelection.js +3 -0
  81. package/dist/utilities/shouldRefreshTenantSelection.js.map +1 -0
  82. package/package.json +7 -8
  83. package/dist/@types/assets.d.js +0 -2
  84. package/dist/@types/assets.d.js.map +0 -1
  85. package/dist/utilities/combineWhereConstraints.d.ts +0 -3
  86. package/dist/utilities/combineWhereConstraints.d.ts.map +0 -1
  87. package/dist/utilities/combineWhereConstraints.js +0 -19
  88. package/dist/utilities/combineWhereConstraints.js.map +0 -1
  89. package/dist/utilities/withTenantAccess.d.ts +0 -16
  90. package/dist/utilities/withTenantAccess.d.ts.map +0 -1
  91. package/dist/utilities/withTenantAccess.js +0 -76
  92. package/dist/utilities/withTenantAccess.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/getGlobalViewRedirect.ts"],"sourcesContent":["import type { Payload, ServerAdapter, TypedUser, ViewTypes } from 'payload'\n\nimport { formatAdminURL, hasAutosaveEnabled } from 'payload/shared'\n\nimport type { MultiTenantPluginConfig } from '../types.js'\n\nimport { getCollectionIDType } from './getCollectionIDType.js'\nimport { getTenantFromCookie } from './getTenantFromCookie.js'\nimport { getTenantOptions } from './getTenantOptions.js'\n\ntype Args = {\n /**\n * This is no longer needed and is handled internally.\n *\n * @deprecated\n */\n basePath?: string\n docID?: number | string\n headers: Headers\n payload: Payload\n server: ServerAdapter\n slug: string\n tenantFieldName: string\n tenantsArrayFieldName: string\n tenantsArrayTenantFieldName: string\n tenantsCollectionSlug: string\n useAsTitle: string\n user?: TypedUser\n userHasAccessToAllTenants: Required<MultiTenantPluginConfig<any>>['userHasAccessToAllTenants']\n view: ViewTypes\n}\nexport async function getGlobalViewRedirect({\n slug: collectionSlug,\n docID,\n headers,\n payload,\n server,\n tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n useAsTitle,\n user,\n userHasAccessToAllTenants,\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: `/${string}` | void = undefined\n\n if (!user) {\n return server.unauthorized()\n }\n\n if (!tenant) {\n const tenantOptions = await getTenantOptions({\n payload,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n useAsTitle,\n user,\n userHasAccessToAllTenants,\n })\n\n tenant = tenantOptions[0]?.value || null\n }\n\n if (tenant) {\n try {\n const globalTenantDocQuery = await payload.find({\n collection: collectionSlug,\n depth: 0,\n limit: 1,\n pagination: false,\n select: {\n id: true,\n },\n where: {\n [tenantFieldName]: {\n in: [tenant],\n },\n },\n })\n\n const globalTenantDocID = globalTenantDocQuery?.docs?.[0]?.id\n\n if (view === 'document') {\n // global tenant document edit view\n if (globalTenantDocID && docID !== globalTenantDocID) {\n // tenant document already exists but does not match current route docID\n // redirect to matching tenant docID from query\n redirectRoute = `/collections/${collectionSlug}/${globalTenantDocID}`\n } else if (docID && !globalTenantDocID) {\n // a docID was found in the route but no global document with this tenant exists\n // so we need to generate a redirect to the create route\n redirectRoute = await generateCreateRedirect({\n collectionSlug,\n payload,\n tenantID: tenant,\n })\n }\n } else if (view === 'list') {\n // global tenant document list view\n if (globalTenantDocID) {\n // tenant document exists, redirect from list view to the document edit view\n redirectRoute = `/collections/${collectionSlug}/${globalTenantDocID}`\n } else {\n // no matching document was found for the current tenant\n // so we need to generate a redirect to the create route\n redirectRoute = await generateCreateRedirect({\n collectionSlug,\n payload,\n tenantID: tenant,\n })\n }\n }\n } catch (e: unknown) {\n const prefix = `${e && typeof e === 'object' && 'message' in e && typeof e.message === 'string' ? `${e.message} - ` : ''}`\n payload.logger.error(e, `${prefix}Multi Tenant Redirect Error`)\n }\n } else {\n // no tenants were found, redirect to the admin view\n return formatAdminURL({\n adminRoute: payload.config.routes.admin,\n path: '',\n serverURL: payload.config.serverURL,\n })\n }\n\n if (redirectRoute) {\n return formatAdminURL({\n adminRoute: payload.config.routes.admin,\n path: redirectRoute,\n serverURL: payload.config.serverURL,\n })\n }\n\n // no redirect is needed\n // the current route is valid\n return undefined\n}\n\ntype GenerateCreateArgs = {\n collectionSlug: string\n payload: Payload\n tenantID: number | string\n}\n/**\n * Generate a redirect URL for creating a new document in a multi-tenant collection.\n *\n * If autosave is enabled on the collection, we need to create the document and then redirect to it.\n * Otherwise we can redirect to the default create route.\n */\nasync function generateCreateRedirect({\n collectionSlug,\n payload,\n tenantID,\n}: GenerateCreateArgs): Promise<`/${string}` | undefined> {\n const collectionConfig = payload.collections[collectionSlug]?.config\n if (hasAutosaveEnabled(collectionConfig!)) {\n // Autosave is enabled, create a document first\n try {\n const doc = await payload.create({\n collection: collectionSlug,\n data: {\n tenant: tenantID,\n },\n depth: 0,\n draft: true,\n select: {\n id: true,\n },\n })\n return `/collections/${collectionSlug}/${doc.id}`\n } catch (error) {\n payload.logger.error(\n error,\n `Error creating autosave global multi tenant document for ${collectionSlug}`,\n )\n }\n\n return '/'\n }\n\n // Autosave is not enabled, redirect to default create route\n return `/collections/${collectionSlug}/create`\n}\n"],"names":["formatAdminURL","hasAutosaveEnabled","getCollectionIDType","getTenantFromCookie","getTenantOptions","getGlobalViewRedirect","slug","collectionSlug","docID","headers","payload","server","tenantFieldName","tenantsArrayFieldName","tenantsArrayTenantFieldName","tenantsCollectionSlug","useAsTitle","user","userHasAccessToAllTenants","view","idType","tenant","redirectRoute","undefined","unauthorized","tenantOptions","value","globalTenantDocQuery","find","collection","depth","limit","pagination","select","id","where","in","globalTenantDocID","docs","generateCreateRedirect","tenantID","e","prefix","message","logger","error","adminRoute","config","routes","admin","path","serverURL","collectionConfig","collections","doc","create","data","draft"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utilities/getGlobalViewRedirect.ts"],"sourcesContent":["import type { Payload, ServerAdapter, User, ViewTypes } from 'payload'\n\nimport { formatAdminURL, hasAutosaveEnabled } from 'payload/shared'\n\nimport type { MultiTenantPluginConfig } from '../types.js'\n\nimport { getCollectionIDType } from './getCollectionIDType.js'\nimport { getTenantFromCookie } from './getTenantFromCookie.js'\nimport { getTenantOptions } from './getTenantOptions.js'\n\ntype Args = {\n /**\n * This is no longer needed and is handled internally.\n *\n * @deprecated\n */\n basePath?: string\n docID?: number | string\n headers: Headers\n payload: Payload\n server: ServerAdapter\n slug: string\n tenantFieldName: string\n tenantsArrayFieldName: string\n tenantsArrayTenantFieldName: string\n tenantsCollectionSlug: string\n useAsTitle: string\n user?: User\n userHasAccessToAllTenants: Required<MultiTenantPluginConfig>['userHasAccessToAllTenants']\n view: ViewTypes\n}\nexport async function getGlobalViewRedirect({\n slug: collectionSlug,\n docID,\n headers,\n payload,\n server,\n tenantFieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n useAsTitle,\n user,\n userHasAccessToAllTenants,\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: `/${string}` | void = undefined\n\n if (!user) {\n return server.unauthorized()\n }\n\n if (!tenant) {\n const tenantOptions = await getTenantOptions({\n payload,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n useAsTitle,\n user,\n userHasAccessToAllTenants,\n })\n\n tenant = tenantOptions[0]?.value || null\n }\n\n if (tenant) {\n try {\n const globalTenantDocQuery = await payload.find({\n collection: collectionSlug,\n depth: 0,\n limit: 1,\n pagination: false,\n select: {\n id: true,\n },\n where: {\n [tenantFieldName]: {\n in: [tenant],\n },\n },\n })\n\n const globalTenantDocID = globalTenantDocQuery?.docs?.[0]?.id\n\n if (view === 'document') {\n // global tenant document edit view\n if (globalTenantDocID && docID !== globalTenantDocID) {\n // tenant document already exists but does not match current route docID\n // redirect to matching tenant docID from query\n redirectRoute = `/collections/${collectionSlug}/${globalTenantDocID}`\n } else if (docID && !globalTenantDocID) {\n // a docID was found in the route but no global document with this tenant exists\n // so we need to generate a redirect to the create route\n redirectRoute = await generateCreateRedirect({\n collectionSlug,\n payload,\n tenantID: tenant,\n })\n }\n } else if (view === 'list') {\n // global tenant document list view\n if (globalTenantDocID) {\n // tenant document exists, redirect from list view to the document edit view\n redirectRoute = `/collections/${collectionSlug}/${globalTenantDocID}`\n } else {\n // no matching document was found for the current tenant\n // so we need to generate a redirect to the create route\n redirectRoute = await generateCreateRedirect({\n collectionSlug,\n payload,\n tenantID: tenant,\n })\n }\n }\n } catch (e: unknown) {\n const prefix = `${e && typeof e === 'object' && 'message' in e && typeof e.message === 'string' ? `${e.message} - ` : ''}`\n payload.logger.error(e, `${prefix}Multi Tenant Redirect Error`)\n }\n } else {\n // no tenants were found, redirect to the admin view\n return formatAdminURL({\n adminRoute: payload.config.routes.admin,\n path: '',\n serverURL: payload.config.serverURL,\n })\n }\n\n if (redirectRoute) {\n return formatAdminURL({\n adminRoute: payload.config.routes.admin,\n path: redirectRoute,\n serverURL: payload.config.serverURL,\n })\n }\n\n // no redirect is needed\n // the current route is valid\n return undefined\n}\n\ntype GenerateCreateArgs = {\n collectionSlug: string\n payload: Payload\n tenantID: number | string\n}\n/**\n * Generate a redirect URL for creating a new document in a multi-tenant collection.\n *\n * If autosave is enabled on the collection, we need to create the document and then redirect to it.\n * Otherwise we can redirect to the default create route.\n */\nasync function generateCreateRedirect({\n collectionSlug,\n payload,\n tenantID,\n}: GenerateCreateArgs): Promise<`/${string}` | undefined> {\n const collectionConfig = payload.collections[collectionSlug]?.config\n if (hasAutosaveEnabled(collectionConfig!)) {\n // Autosave is enabled, create a document first\n try {\n const doc = await payload.create({\n collection: collectionSlug,\n data: {\n tenant: tenantID,\n },\n depth: 0,\n draft: true,\n select: {\n id: true,\n },\n })\n return `/collections/${collectionSlug}/${doc.id}`\n } catch (error) {\n payload.logger.error(\n error,\n `Error creating autosave global multi tenant document for ${collectionSlug}`,\n )\n }\n\n return '/'\n }\n\n // Autosave is not enabled, redirect to default create route\n return `/collections/${collectionSlug}/create`\n}\n"],"names":["formatAdminURL","hasAutosaveEnabled","getCollectionIDType","getTenantFromCookie","getTenantOptions","getGlobalViewRedirect","slug","collectionSlug","docID","headers","payload","server","tenantFieldName","tenantsArrayFieldName","tenantsArrayTenantFieldName","tenantsCollectionSlug","useAsTitle","user","userHasAccessToAllTenants","view","idType","tenant","redirectRoute","undefined","unauthorized","tenantOptions","value","globalTenantDocQuery","find","collection","depth","limit","pagination","select","id","where","in","globalTenantDocID","docs","generateCreateRedirect","tenantID","e","prefix","message","logger","error","adminRoute","config","routes","admin","path","serverURL","collectionConfig","collections","doc","create","data","draft"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const getTenantIDsFromValue: (value: unknown) => string[];
2
+ //# sourceMappingURL=getTenantIDsFromValue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getTenantIDsFromValue.d.ts","sourceRoot":"","sources":["../../src/utilities/getTenantIDsFromValue.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,qBAAqB,UAAW,OAAO,KAAG,MAAM,EAU5D,CAAA"}
@@ -0,0 +1,14 @@
1
+ import { extractID } from './extractID.js';
2
+ export const getTenantIDsFromValue = (value)=>{
3
+ if (value === undefined || value === null) {
4
+ return [];
5
+ }
6
+ return (Array.isArray(value) ? value : [
7
+ value
8
+ ]).map((entry)=>{
9
+ const id = entry === null || entry === undefined ? undefined : extractID(entry);
10
+ return typeof id === 'number' || typeof id === 'string' ? String(id) : '';
11
+ });
12
+ };
13
+
14
+ //# sourceMappingURL=getTenantIDsFromValue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/getTenantIDsFromValue.ts"],"sourcesContent":["import type { Tenant } from '../types.js'\n\nimport { extractID } from './extractID.js'\n\nexport const getTenantIDsFromValue = (value: unknown): string[] => {\n if (value === undefined || value === null) {\n return []\n }\n\n return (Array.isArray(value) ? value : [value]).map((entry) => {\n const id = entry === null || entry === undefined ? undefined : extractID(entry as Tenant)\n\n return typeof id === 'number' || typeof id === 'string' ? String(id) : ''\n })\n}\n"],"names":["extractID","getTenantIDsFromValue","value","undefined","Array","isArray","map","entry","id","String"],"mappings":"AAEA,SAASA,SAAS,QAAQ,iBAAgB;AAE1C,OAAO,MAAMC,wBAAwB,CAACC;IACpC,IAAIA,UAAUC,aAAaD,UAAU,MAAM;QACzC,OAAO,EAAE;IACX;IAEA,OAAO,AAACE,CAAAA,MAAMC,OAAO,CAACH,SAASA,QAAQ;QAACA;KAAM,AAAD,EAAGI,GAAG,CAAC,CAACC;QACnD,MAAMC,KAAKD,UAAU,QAAQA,UAAUJ,YAAYA,YAAYH,UAAUO;QAEzE,OAAO,OAAOC,OAAO,YAAY,OAAOA,OAAO,WAAWC,OAAOD,MAAM;IACzE;AACF,EAAC"}
@@ -1,4 +1,4 @@
1
- import type { OptionObject, Payload, TypedUser } from 'payload';
1
+ import type { OptionObject, Payload, User } from 'payload';
2
2
  import type { MultiTenantPluginConfig } from '../types.js';
3
3
  export declare const getTenantOptions: ({ payload, tenantsArrayFieldName, tenantsArrayTenantFieldName, tenantsCollectionSlug, useAsTitle, user, userHasAccessToAllTenants, }: {
4
4
  payload: Payload;
@@ -6,7 +6,7 @@ export declare const getTenantOptions: ({ payload, tenantsArrayFieldName, tenant
6
6
  tenantsArrayTenantFieldName: string;
7
7
  tenantsCollectionSlug: string;
8
8
  useAsTitle: string;
9
- user: TypedUser;
10
- userHasAccessToAllTenants: Required<MultiTenantPluginConfig<any>>["userHasAccessToAllTenants"];
9
+ user: User;
10
+ userHasAccessToAllTenants: Required<MultiTenantPluginConfig>['userHasAccessToAllTenants'];
11
11
  }) => Promise<OptionObject[]>;
12
12
  //# sourceMappingURL=getTenantOptions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getTenantOptions.d.ts","sourceRoot":"","sources":["../../src/utilities/getTenantOptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAE/D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAE1D,eAAO,MAAM,gBAAgB,GAAU,sIAQpC;IACD,OAAO,EAAE,OAAO,CAAA;IAChB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,2BAA2B,EAAE,MAAM,CAAA;IACnC,qBAAqB,EAAE,MAAM,CAAA;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,SAAS,CAAA;IACf,yBAAyB,EAAE,QAAQ,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAA;CAC/F,KAAG,OAAO,CAAC,YAAY,EAAE,CAmDzB,CAAA"}
1
+ {"version":3,"file":"getTenantOptions.d.ts","sourceRoot":"","sources":["../../src/utilities/getTenantOptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAE1D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAE1D,eAAO,MAAM,gBAAgB,yIAQ1B;IACD,OAAO,EAAE,OAAO,CAAA;IAChB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,2BAA2B,EAAE,MAAM,CAAA;IACnC,qBAAqB,EAAE,MAAM,CAAA;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,IAAI,CAAA;IACV,yBAAyB,EAAE,QAAQ,CAAC,uBAAuB,CAAC,CAAC,2BAA2B,CAAC,CAAA;CAC1F,KAAG,OAAO,CAAC,YAAY,EAAE,CAuDzB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/getTenantOptions.ts"],"sourcesContent":["import type { OptionObject, Payload, TypedUser } from 'payload'\n\nimport type { MultiTenantPluginConfig } from '../types.js'\n\nexport const getTenantOptions = async ({\n payload,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n useAsTitle,\n user,\n userHasAccessToAllTenants,\n}: {\n payload: Payload\n tenantsArrayFieldName: string\n tenantsArrayTenantFieldName: string\n tenantsCollectionSlug: string\n useAsTitle: string\n user: TypedUser\n userHasAccessToAllTenants: Required<MultiTenantPluginConfig<any>>['userHasAccessToAllTenants']\n}): Promise<OptionObject[]> => {\n let tenantOptions: OptionObject[] = []\n\n if (!user) {\n return tenantOptions\n }\n\n const isOrderable = payload.collections[tenantsCollectionSlug]?.config?.orderable || false\n\n const userTenantIds = !userHasAccessToAllTenants(user)\n ? ((user[tenantsArrayFieldName] as { [key: string]: unknown }[]) || []).map((tenantRow) => {\n const tenantField = tenantRow[tenantsArrayTenantFieldName]\n if (typeof tenantField === 'string' || typeof tenantField === 'number') {\n return tenantField\n }\n if (tenantField && typeof tenantField === 'object' && 'id' in tenantField) {\n return tenantField.id as number | string\n }\n })\n : undefined\n\n if (userTenantIds !== undefined && userTenantIds.length === 0) {\n return tenantOptions\n }\n\n const tenants = await payload.find({\n collection: tenantsCollectionSlug,\n depth: 0,\n limit: 0,\n overrideAccess: false,\n select: {\n [useAsTitle]: true,\n ...(isOrderable && { _order: true }),\n },\n sort: isOrderable ? '_order' : useAsTitle,\n user,\n ...(userTenantIds && {\n where: {\n id: {\n in: userTenantIds,\n },\n },\n }),\n })\n\n tenantOptions = tenants.docs.map((doc) => ({\n label: String(doc[useAsTitle as 'id']),\n value: doc.id as string,\n }))\n\n return tenantOptions\n}\n"],"names":["getTenantOptions","payload","tenantsArrayFieldName","tenantsArrayTenantFieldName","tenantsCollectionSlug","useAsTitle","user","userHasAccessToAllTenants","tenantOptions","isOrderable","collections","config","orderable","userTenantIds","map","tenantRow","tenantField","id","undefined","length","tenants","find","collection","depth","limit","overrideAccess","select","_order","sort","where","in","docs","doc","label","String","value"],"mappings":"AAIA,OAAO,MAAMA,mBAAmB,OAAO,EACrCC,OAAO,EACPC,qBAAqB,EACrBC,2BAA2B,EAC3BC,qBAAqB,EACrBC,UAAU,EACVC,IAAI,EACJC,yBAAyB,EAS1B;IACC,IAAIC,gBAAgC,EAAE;IAEtC,IAAI,CAACF,MAAM;QACT,OAAOE;IACT;IAEA,MAAMC,cAAcR,QAAQS,WAAW,CAACN,sBAAsB,EAAEO,QAAQC,aAAa;IAErF,MAAMC,gBAAgB,CAACN,0BAA0BD,QAC7C,AAAC,CAAA,AAACA,IAAI,CAACJ,sBAAsB,IAAqC,EAAE,AAAD,EAAGY,GAAG,CAAC,CAACC;QACzE,MAAMC,cAAcD,SAAS,CAACZ,4BAA4B;QAC1D,IAAI,OAAOa,gBAAgB,YAAY,OAAOA,gBAAgB,UAAU;YACtE,OAAOA;QACT;QACA,IAAIA,eAAe,OAAOA,gBAAgB,YAAY,QAAQA,aAAa;YACzE,OAAOA,YAAYC,EAAE;QACvB;IACF,KACAC;IAEJ,IAAIL,kBAAkBK,aAAaL,cAAcM,MAAM,KAAK,GAAG;QAC7D,OAAOX;IACT;IAEA,MAAMY,UAAU,MAAMnB,QAAQoB,IAAI,CAAC;QACjCC,YAAYlB;QACZmB,OAAO;QACPC,OAAO;QACPC,gBAAgB;QAChBC,QAAQ;YACN,CAACrB,WAAW,EAAE;YACd,GAAII,eAAe;gBAAEkB,QAAQ;YAAK,CAAC;QACrC;QACAC,MAAMnB,cAAc,WAAWJ;QAC/BC;QACA,GAAIO,iBAAiB;YACnBgB,OAAO;gBACLZ,IAAI;oBACFa,IAAIjB;gBACN;YACF;QACF,CAAC;IACH;IAEAL,gBAAgBY,QAAQW,IAAI,CAACjB,GAAG,CAAC,CAACkB,MAAS,CAAA;YACzCC,OAAOC,OAAOF,GAAG,CAAC3B,WAAmB;YACrC8B,OAAOH,IAAIf,EAAE;QACf,CAAA;IAEA,OAAOT;AACT,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/getTenantOptions.ts"],"sourcesContent":["import type { OptionObject, Payload, User } from 'payload'\n\nimport type { MultiTenantPluginConfig } from '../types.js'\n\nexport const getTenantOptions = async ({\n payload,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n tenantsCollectionSlug,\n useAsTitle,\n user,\n userHasAccessToAllTenants,\n}: {\n payload: Payload\n tenantsArrayFieldName: string\n tenantsArrayTenantFieldName: string\n tenantsCollectionSlug: string\n useAsTitle: string\n user: User\n userHasAccessToAllTenants: Required<MultiTenantPluginConfig>['userHasAccessToAllTenants']\n}): Promise<OptionObject[]> => {\n let tenantOptions: OptionObject[] = []\n\n if (!user) {\n return tenantOptions\n }\n\n const isOrderable = payload.collections[tenantsCollectionSlug]?.config?.orderable || false\n\n const userTenantIds = !userHasAccessToAllTenants(user)\n ? (\n ((user as Record<string, unknown>)[tenantsArrayFieldName] as {\n [key: string]: unknown\n }[]) || []\n ).map((tenantRow) => {\n const tenantField = tenantRow[tenantsArrayTenantFieldName]\n if (typeof tenantField === 'string' || typeof tenantField === 'number') {\n return tenantField\n }\n if (tenantField && typeof tenantField === 'object' && 'id' in tenantField) {\n return tenantField.id as number | string\n }\n })\n : undefined\n\n if (userTenantIds !== undefined && userTenantIds.length === 0) {\n return tenantOptions\n }\n\n const tenants = await payload.find({\n collection: tenantsCollectionSlug,\n depth: 0,\n limit: 0,\n overrideAccess: false,\n select: {\n [useAsTitle]: true,\n ...(isOrderable && { _order: true }),\n },\n sort: isOrderable ? '_order' : useAsTitle,\n user,\n ...(userTenantIds && {\n where: {\n id: {\n in: userTenantIds,\n },\n },\n }),\n })\n\n tenantOptions = tenants.docs.map((doc) => ({\n label: String(doc[useAsTitle as 'id']),\n value: doc.id as string,\n }))\n\n return tenantOptions\n}\n"],"names":["getTenantOptions","payload","tenantsArrayFieldName","tenantsArrayTenantFieldName","tenantsCollectionSlug","useAsTitle","user","userHasAccessToAllTenants","tenantOptions","isOrderable","collections","config","orderable","userTenantIds","map","tenantRow","tenantField","id","undefined","length","tenants","find","collection","depth","limit","overrideAccess","select","_order","sort","where","in","docs","doc","label","String","value"],"mappings":"AAIA,OAAO,MAAMA,mBAAmB,OAAO,EACrCC,OAAO,EACPC,qBAAqB,EACrBC,2BAA2B,EAC3BC,qBAAqB,EACrBC,UAAU,EACVC,IAAI,EACJC,yBAAyB,EAS1B;IACC,IAAIC,gBAAgC,EAAE;IAEtC,IAAI,CAACF,MAAM;QACT,OAAOE;IACT;IAEA,MAAMC,cAAcR,QAAQS,WAAW,CAACN,sBAAsB,EAAEO,QAAQC,aAAa;IAErF,MAAMC,gBAAgB,CAACN,0BAA0BD,QAC7C,AACE,CAAA,AAAC,AAACA,IAAgC,CAACJ,sBAAsB,IAEjD,EAAE,AAAD,EACTY,GAAG,CAAC,CAACC;QACL,MAAMC,cAAcD,SAAS,CAACZ,4BAA4B;QAC1D,IAAI,OAAOa,gBAAgB,YAAY,OAAOA,gBAAgB,UAAU;YACtE,OAAOA;QACT;QACA,IAAIA,eAAe,OAAOA,gBAAgB,YAAY,QAAQA,aAAa;YACzE,OAAOA,YAAYC,EAAE;QACvB;IACF,KACAC;IAEJ,IAAIL,kBAAkBK,aAAaL,cAAcM,MAAM,KAAK,GAAG;QAC7D,OAAOX;IACT;IAEA,MAAMY,UAAU,MAAMnB,QAAQoB,IAAI,CAAC;QACjCC,YAAYlB;QACZmB,OAAO;QACPC,OAAO;QACPC,gBAAgB;QAChBC,QAAQ;YACN,CAACrB,WAAW,EAAE;YACd,GAAII,eAAe;gBAAEkB,QAAQ;YAAK,CAAC;QACrC;QACAC,MAAMnB,cAAc,WAAWJ;QAC/BC;QACA,GAAIO,iBAAiB;YACnBgB,OAAO;gBACLZ,IAAI;oBACFa,IAAIjB;gBACN;YACF;QACF,CAAC;IACH;IAEAL,gBAAgBY,QAAQW,IAAI,CAACjB,GAAG,CAAC,CAACkB,MAAS,CAAA;YACzCC,OAAOC,OAAOF,GAAG,CAAC3B,WAAmB;YACrC8B,OAAOH,IAAIf,EAAE;QACf,CAAA;IAEA,OAAOT;AACT,EAAC"}
@@ -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;AAK/D;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,MAAM,SAAS,MAAM,GAAG,MAAM,EAC7D,MAAM,IAAI,GAAG,oBAAoB,EACjC,UAAU;IACR,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,2BAA2B,CAAC,EAAE,MAAM,CAAA;CACrC,KACA,MAAM,EAoBR,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;AAK/D;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,MAAM,SAAS,MAAM,GAAG,MAAM,QACvD,IAAI,GAAG,oBAAoB,YACvB;IACR,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,2BAA2B,CAAC,EAAE,MAAM,CAAA;CACrC,KACA,MAAM,EAqBR,CAAA"}
@@ -10,9 +10,11 @@ import { extractID } from './extractID.js';
10
10
  }
11
11
  const tenantsArrayFieldName = options?.tenantsArrayFieldName || defaults.tenantsArrayFieldName;
12
12
  const tenantsArrayTenantFieldName = options?.tenantsArrayTenantFieldName || defaults.tenantsArrayTenantFieldName;
13
- return (Array.isArray(user[tenantsArrayFieldName]) ? user[tenantsArrayFieldName] : [])?.reduce((acc, row)=>{
14
- if (row[tenantsArrayTenantFieldName]) {
15
- acc.push(extractID(row[tenantsArrayTenantFieldName]));
13
+ const tenantsArray = user[tenantsArrayFieldName];
14
+ return (Array.isArray(tenantsArray) ? tenantsArray : [])?.reduce((acc, row)=>{
15
+ const tenantRow = row[tenantsArrayTenantFieldName];
16
+ if (tenantRow !== undefined && tenantRow !== null) {
17
+ acc.push(extractID(tenantRow));
16
18
  }
17
19
  return acc;
18
20
  }, []) || [];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/getUserTenantIDs.ts"],"sourcesContent":["import type { Tenant, UserWithTenantsField } from '../types.js'\n\nimport { defaults } from '../defaults.js'\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 options?: {\n tenantsArrayFieldName?: string\n tenantsArrayTenantFieldName?: string\n },\n): IDType[] => {\n if (!user) {\n return []\n }\n\n const tenantsArrayFieldName = options?.tenantsArrayFieldName || defaults.tenantsArrayFieldName\n const tenantsArrayTenantFieldName =\n options?.tenantsArrayTenantFieldName || defaults.tenantsArrayTenantFieldName\n\n return (\n (Array.isArray(user[tenantsArrayFieldName]) ? user[tenantsArrayFieldName] : [])?.reduce<\n IDType[]\n >((acc, row) => {\n if (row[tenantsArrayTenantFieldName]) {\n acc.push(extractID<IDType>(row[tenantsArrayTenantFieldName] as Tenant<IDType>))\n }\n\n return acc\n }, []) || []\n )\n}\n"],"names":["defaults","extractID","getUserTenantIDs","user","options","tenantsArrayFieldName","tenantsArrayTenantFieldName","Array","isArray","reduce","acc","row","push"],"mappings":"AAEA,SAASA,QAAQ,QAAQ,iBAAgB;AACzC,SAASC,SAAS,QAAQ,iBAAgB;AAE1C;;;;CAIC,GACD,OAAO,MAAMC,mBAAmB,CAC9BC,MACAC;IAKA,IAAI,CAACD,MAAM;QACT,OAAO,EAAE;IACX;IAEA,MAAME,wBAAwBD,SAASC,yBAAyBL,SAASK,qBAAqB;IAC9F,MAAMC,8BACJF,SAASE,+BAA+BN,SAASM,2BAA2B;IAE9E,OACE,AAACC,CAAAA,MAAMC,OAAO,CAACL,IAAI,CAACE,sBAAsB,IAAIF,IAAI,CAACE,sBAAsB,GAAG,EAAE,AAAD,GAAII,OAE/E,CAACC,KAAKC;QACN,IAAIA,GAAG,CAACL,4BAA4B,EAAE;YACpCI,IAAIE,IAAI,CAACX,UAAkBU,GAAG,CAACL,4BAA4B;QAC7D;QAEA,OAAOI;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 { defaults } from '../defaults.js'\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 options?: {\n tenantsArrayFieldName?: string\n tenantsArrayTenantFieldName?: string\n },\n): IDType[] => {\n if (!user) {\n return []\n }\n\n const tenantsArrayFieldName = options?.tenantsArrayFieldName || defaults.tenantsArrayFieldName\n const tenantsArrayTenantFieldName =\n options?.tenantsArrayTenantFieldName || defaults.tenantsArrayTenantFieldName\n\n const tenantsArray = (user as Record<string, unknown>)[tenantsArrayFieldName]\n\n return (\n (Array.isArray(tenantsArray) ? tenantsArray : [])?.reduce<IDType[]>((acc, row) => {\n const tenantRow = row[tenantsArrayTenantFieldName] as Tenant<IDType>\n if (tenantRow !== undefined && tenantRow !== null) {\n acc.push(extractID(tenantRow))\n }\n\n return acc\n }, []) || []\n )\n}\n"],"names":["defaults","extractID","getUserTenantIDs","user","options","tenantsArrayFieldName","tenantsArrayTenantFieldName","tenantsArray","Array","isArray","reduce","acc","row","tenantRow","undefined","push"],"mappings":"AAEA,SAASA,QAAQ,QAAQ,iBAAgB;AACzC,SAASC,SAAS,QAAQ,iBAAgB;AAE1C;;;;CAIC,GACD,OAAO,MAAMC,mBAAmB,CAC9BC,MACAC;IAKA,IAAI,CAACD,MAAM;QACT,OAAO,EAAE;IACX;IAEA,MAAME,wBAAwBD,SAASC,yBAAyBL,SAASK,qBAAqB;IAC9F,MAAMC,8BACJF,SAASE,+BAA+BN,SAASM,2BAA2B;IAE9E,MAAMC,eAAe,AAACJ,IAAgC,CAACE,sBAAsB;IAE7E,OACE,AAACG,CAAAA,MAAMC,OAAO,CAACF,gBAAgBA,eAAe,EAAE,AAAD,GAAIG,OAAiB,CAACC,KAAKC;QACxE,MAAMC,YAAYD,GAAG,CAACN,4BAA4B;QAClD,IAAIO,cAAcC,aAAaD,cAAc,MAAM;YACjDF,IAAII,IAAI,CAACd,UAAUY;QACrB;QAEA,OAAOF;IACT,GAAG,EAAE,KAAK,EAAE;AAEhB,EAAC"}
@@ -0,0 +1,13 @@
1
+ import type { PayloadRequest } from 'payload';
2
+ import type { MultiTenantPluginConfig } from '../types.js';
3
+ type Args = {
4
+ previousValue?: unknown;
5
+ req: PayloadRequest;
6
+ tenantsArrayFieldName: string;
7
+ tenantsArrayTenantFieldName: string;
8
+ userHasAccessToAllTenants?: MultiTenantPluginConfig['userHasAccessToAllTenants'];
9
+ value: unknown;
10
+ };
11
+ export declare const isValidTenantAssignment: ({ previousValue, req, tenantsArrayFieldName, tenantsArrayTenantFieldName, userHasAccessToAllTenants, value, }: Args) => boolean;
12
+ export {};
13
+ //# sourceMappingURL=isValidTenantAssignment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isValidTenantAssignment.d.ts","sourceRoot":"","sources":["../../src/utilities/isValidTenantAssignment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAE7C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAK1D,KAAK,IAAI,GAAG;IACV,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,GAAG,EAAE,cAAc,CAAA;IACnB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,2BAA2B,EAAE,MAAM,CAAA;IACnC,yBAAyB,CAAC,EAAE,uBAAuB,CAAC,2BAA2B,CAAC,CAAA;IAChF,KAAK,EAAE,OAAO,CAAA;CACf,CAAA;AAED,eAAO,MAAM,uBAAuB,kHAOjC,IAAI,KAAG,OAgCT,CAAA"}
@@ -0,0 +1,28 @@
1
+ import { getTenantIDsFromValue } from './getTenantIDsFromValue.js';
2
+ import { getUserTenantIDs } from './getUserTenantIDs.js';
3
+ export const isValidTenantAssignment = ({ previousValue, req, tenantsArrayFieldName, tenantsArrayTenantFieldName, userHasAccessToAllTenants, value })=>{
4
+ const { user } = req;
5
+ if (user) {
6
+ if (userHasAccessToAllTenants?.(user)) {
7
+ return true;
8
+ }
9
+ } else if (req.payloadAPI === 'local') {
10
+ return true;
11
+ }
12
+ const submittedDocumentTenantIDs = getTenantIDsFromValue(value);
13
+ const storedDocumentTenantIDs = getTenantIDsFromValue(previousValue);
14
+ if (!hasTenantValueChanged(submittedDocumentTenantIDs, storedDocumentTenantIDs)) {
15
+ return true;
16
+ }
17
+ if (submittedDocumentTenantIDs.length === 0) {
18
+ return false;
19
+ }
20
+ const userAssignedTenantIDs = getUserTenantIDs(user, {
21
+ tenantsArrayFieldName,
22
+ tenantsArrayTenantFieldName
23
+ });
24
+ return submittedDocumentTenantIDs.every((tenantID)=>userAssignedTenantIDs.some((userAssignedTenantID)=>String(userAssignedTenantID) === String(tenantID)));
25
+ };
26
+ const hasTenantValueChanged = (submittedTenantIDs, storedTenantIDs)=>submittedTenantIDs.length !== storedTenantIDs.length || submittedTenantIDs.some((tenantID)=>!storedTenantIDs.includes(tenantID));
27
+
28
+ //# sourceMappingURL=isValidTenantAssignment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/isValidTenantAssignment.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload'\n\nimport type { MultiTenantPluginConfig } from '../types.js'\n\nimport { getTenantIDsFromValue } from './getTenantIDsFromValue.js'\nimport { getUserTenantIDs } from './getUserTenantIDs.js'\n\ntype Args = {\n previousValue?: unknown\n req: PayloadRequest\n tenantsArrayFieldName: string\n tenantsArrayTenantFieldName: string\n userHasAccessToAllTenants?: MultiTenantPluginConfig['userHasAccessToAllTenants']\n value: unknown\n}\n\nexport const isValidTenantAssignment = ({\n previousValue,\n req,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n userHasAccessToAllTenants,\n value,\n}: Args): boolean => {\n const { user } = req\n\n if (user) {\n if (userHasAccessToAllTenants?.(user)) {\n return true\n }\n } else if (req.payloadAPI === 'local') {\n return true\n }\n\n const submittedDocumentTenantIDs = getTenantIDsFromValue(value)\n const storedDocumentTenantIDs = getTenantIDsFromValue(previousValue)\n\n if (!hasTenantValueChanged(submittedDocumentTenantIDs, storedDocumentTenantIDs)) {\n return true\n }\n\n if (submittedDocumentTenantIDs.length === 0) {\n return false\n }\n\n const userAssignedTenantIDs = getUserTenantIDs(user, {\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n })\n\n return submittedDocumentTenantIDs.every((tenantID) =>\n userAssignedTenantIDs.some(\n (userAssignedTenantID) => String(userAssignedTenantID) === String(tenantID),\n ),\n )\n}\n\nconst hasTenantValueChanged = (\n submittedTenantIDs: (number | string)[],\n storedTenantIDs: (number | string)[],\n): boolean =>\n submittedTenantIDs.length !== storedTenantIDs.length ||\n submittedTenantIDs.some((tenantID) => !storedTenantIDs.includes(tenantID))\n"],"names":["getTenantIDsFromValue","getUserTenantIDs","isValidTenantAssignment","previousValue","req","tenantsArrayFieldName","tenantsArrayTenantFieldName","userHasAccessToAllTenants","value","user","payloadAPI","submittedDocumentTenantIDs","storedDocumentTenantIDs","hasTenantValueChanged","length","userAssignedTenantIDs","every","tenantID","some","userAssignedTenantID","String","submittedTenantIDs","storedTenantIDs","includes"],"mappings":"AAIA,SAASA,qBAAqB,QAAQ,6BAA4B;AAClE,SAASC,gBAAgB,QAAQ,wBAAuB;AAWxD,OAAO,MAAMC,0BAA0B,CAAC,EACtCC,aAAa,EACbC,GAAG,EACHC,qBAAqB,EACrBC,2BAA2B,EAC3BC,yBAAyB,EACzBC,KAAK,EACA;IACL,MAAM,EAAEC,IAAI,EAAE,GAAGL;IAEjB,IAAIK,MAAM;QACR,IAAIF,4BAA4BE,OAAO;YACrC,OAAO;QACT;IACF,OAAO,IAAIL,IAAIM,UAAU,KAAK,SAAS;QACrC,OAAO;IACT;IAEA,MAAMC,6BAA6BX,sBAAsBQ;IACzD,MAAMI,0BAA0BZ,sBAAsBG;IAEtD,IAAI,CAACU,sBAAsBF,4BAA4BC,0BAA0B;QAC/E,OAAO;IACT;IAEA,IAAID,2BAA2BG,MAAM,KAAK,GAAG;QAC3C,OAAO;IACT;IAEA,MAAMC,wBAAwBd,iBAAiBQ,MAAM;QACnDJ;QACAC;IACF;IAEA,OAAOK,2BAA2BK,KAAK,CAAC,CAACC,WACvCF,sBAAsBG,IAAI,CACxB,CAACC,uBAAyBC,OAAOD,0BAA0BC,OAAOH;AAGxE,EAAC;AAED,MAAMJ,wBAAwB,CAC5BQ,oBACAC,kBAEAD,mBAAmBP,MAAM,KAAKQ,gBAAgBR,MAAM,IACpDO,mBAAmBH,IAAI,CAAC,CAACD,WAAa,CAACK,gBAAgBC,QAAQ,CAACN"}
@@ -1 +1 @@
1
- {"version":3,"file":"miniChalk.d.ts","sourceRoot":"","sources":["../../src/utilities/miniChalk.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,SAAS;gBACR,MAAM;gBACN,MAAM;gBACN,MAAM;eACP,MAAM;iBACJ,MAAM;mBACJ,MAAM;eACV,MAAM;qBACA,MAAM;iBACV,MAAM;kBACL,MAAM;mBAGL,MAAM;sBACH,MAAM;CACzB,CAAA"}
1
+ {"version":3,"file":"miniChalk.d.ts","sourceRoot":"","sources":["../../src/utilities/miniChalk.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,SAAS;IACpB,IAAI,QAAQ,MAAM;IAClB,IAAI,QAAQ,MAAM;IAClB,IAAI,QAAQ,MAAM;IAClB,GAAG,QAAQ,MAAM;IACjB,KAAK,QAAQ,MAAM;IACnB,OAAO,QAAQ,MAAM;IACrB,GAAG,QAAQ,MAAM;IACjB,SAAS,QAAQ,MAAM;IACvB,KAAK,QAAQ,MAAM;IACnB,MAAM,QAAQ,MAAM;IAGpB,OAAO,QAAQ,MAAM;IACrB,UAAU,QAAQ,MAAM;CACzB,CAAA"}
@@ -0,0 +1,5 @@
1
+ export declare const shouldRefreshTenantSelection: ({ initialValue, tenantCookie, }: {
2
+ initialValue?: number | string;
3
+ tenantCookie?: string;
4
+ }) => boolean;
5
+ //# sourceMappingURL=shouldRefreshTenantSelection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shouldRefreshTenantSelection.d.ts","sourceRoot":"","sources":["../../src/utilities/shouldRefreshTenantSelection.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,4BAA4B,oCAGtC;IACD,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,KAAG,OAAiD,CAAA"}
@@ -0,0 +1,3 @@
1
+ export const shouldRefreshTenantSelection = ({ initialValue, tenantCookie })=>!initialValue && Boolean(tenantCookie);
2
+
3
+ //# sourceMappingURL=shouldRefreshTenantSelection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/shouldRefreshTenantSelection.ts"],"sourcesContent":["export const shouldRefreshTenantSelection = ({\n initialValue,\n tenantCookie,\n}: {\n initialValue?: number | string\n tenantCookie?: string\n}): boolean => !initialValue && Boolean(tenantCookie)\n"],"names":["shouldRefreshTenantSelection","initialValue","tenantCookie","Boolean"],"mappings":"AAAA,OAAO,MAAMA,+BAA+B,CAAC,EAC3CC,YAAY,EACZC,YAAY,EAIb,GAAc,CAACD,gBAAgBE,QAAQD,cAAa"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloadcms/plugin-multi-tenant",
3
- "version": "4.0.0-internal.688c4d0",
3
+ "version": "4.0.0-internal.77191e5",
4
4
  "description": "Multi Tenant plugin for Payload",
5
5
  "keywords": [
6
6
  "payload",
@@ -26,7 +26,6 @@
26
26
  }
27
27
  ],
28
28
  "sideEffects": [
29
- "*.scss",
30
29
  "*.css"
31
30
  ],
32
31
  "type": "module",
@@ -81,13 +80,13 @@
81
80
  ],
82
81
  "devDependencies": {
83
82
  "@payloadcms/eslint-config": "3.28.0",
84
- "@payloadcms/ui": "4.0.0-internal.688c4d0",
85
- "@payloadcms/translations": "4.0.0-internal.688c4d0",
86
- "payload": "4.0.0-internal.688c4d0"
83
+ "@payloadcms/translations": "4.0.0-internal.77191e5",
84
+ "@payloadcms/ui": "4.0.0-internal.77191e5",
85
+ "payload": "4.0.0-internal.77191e5"
87
86
  },
88
87
  "peerDependencies": {
89
- "@payloadcms/ui": "4.0.0-internal.688c4d0",
90
- "payload": "4.0.0-internal.688c4d0"
88
+ "@payloadcms/ui": "4.0.0-internal.77191e5",
89
+ "payload": "4.0.0-internal.77191e5"
91
90
  },
92
91
  "homepage:": "https://payloadcms.com",
93
92
  "scripts": {
@@ -96,7 +95,7 @@
96
95
  "build:swc": "swc ./src -d ./dist --config-file .swcrc --strip-leading-paths",
97
96
  "build:types": "tsc --emitDeclarationOnly --outDir dist",
98
97
  "clean": "rimraf {dist,*.tsbuildinfo}",
99
- "copyfiles": "copyfiles -u 1 \"src/**/*.{html,css,scss,ttf,woff,woff2,eot,svg,jpg,png,json}\" dist/",
98
+ "copyfiles": "copyfiles -u 1 -e \"**/*.spec.*\" \"src/**/*.{html,css,scss,ttf,woff,woff2,eot,svg,jpg,png,json}\" dist/",
100
99
  "lint": "eslint .",
101
100
  "lint:fix": "eslint . --fix",
102
101
  "pack:plugin": "pnpm build && pnpm pack"
@@ -1,2 +0,0 @@
1
-
2
- //# sourceMappingURL=assets.d.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/@types/assets.d.ts"],"names":[],"mappings":""}
@@ -1,3 +0,0 @@
1
- import type { Where } from 'payload';
2
- export declare function combineWhereConstraints(constraints: Array<Where>): Where;
3
- //# sourceMappingURL=combineWhereConstraints.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"combineWhereConstraints.d.ts","sourceRoot":"","sources":["../../src/utilities/combineWhereConstraints.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEpC,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAgBxE"}
@@ -1,19 +0,0 @@
1
- export function combineWhereConstraints(constraints) {
2
- if (constraints.length === 0) {
3
- return {};
4
- }
5
- if (constraints.length === 1 && constraints[0]) {
6
- return constraints[0];
7
- }
8
- const andConstraint = {
9
- and: []
10
- };
11
- constraints.forEach((constraint)=>{
12
- if (andConstraint.and && constraint && typeof constraint === 'object') {
13
- andConstraint.and.push(constraint);
14
- }
15
- });
16
- return andConstraint;
17
- }
18
-
19
- //# sourceMappingURL=combineWhereConstraints.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utilities/combineWhereConstraints.ts"],"sourcesContent":["import type { Where } from 'payload'\n\nexport function combineWhereConstraints(constraints: Array<Where>): Where {\n if (constraints.length === 0) {\n return {}\n }\n if (constraints.length === 1 && constraints[0]) {\n return constraints[0]\n }\n const andConstraint: Where = {\n and: [],\n }\n constraints.forEach((constraint) => {\n if (andConstraint.and && constraint && typeof constraint === 'object') {\n andConstraint.and.push(constraint)\n }\n })\n return andConstraint\n}\n"],"names":["combineWhereConstraints","constraints","length","andConstraint","and","forEach","constraint","push"],"mappings":"AAEA,OAAO,SAASA,wBAAwBC,WAAyB;IAC/D,IAAIA,YAAYC,MAAM,KAAK,GAAG;QAC5B,OAAO,CAAC;IACV;IACA,IAAID,YAAYC,MAAM,KAAK,KAAKD,WAAW,CAAC,EAAE,EAAE;QAC9C,OAAOA,WAAW,CAAC,EAAE;IACvB;IACA,MAAME,gBAAuB;QAC3BC,KAAK,EAAE;IACT;IACAH,YAAYI,OAAO,CAAC,CAACC;QACnB,IAAIH,cAAcC,GAAG,IAAIE,cAAc,OAAOA,eAAe,UAAU;YACrEH,cAAcC,GAAG,CAACG,IAAI,CAACD;QACzB;IACF;IACA,OAAOH;AACT"}
@@ -1,16 +0,0 @@
1
- import type { Access, AccessArgs, AccessResult, CollectionConfig } from 'payload';
2
- import type { AllAccessKeys, MultiTenantPluginConfig } from '../types.js';
3
- type Args<ConfigType> = {
4
- accessFunction?: Access;
5
- accessKey: AllAccessKeys[number];
6
- accessResultCallback?: MultiTenantPluginConfig<ConfigType>['usersAccessResultOverride'];
7
- adminUsersSlug: string;
8
- collection: CollectionConfig;
9
- fieldName: string;
10
- tenantsArrayFieldName?: string;
11
- tenantsArrayTenantFieldName?: string;
12
- userHasAccessToAllTenants: Required<MultiTenantPluginConfig<ConfigType>>['userHasAccessToAllTenants'];
13
- };
14
- export declare const withTenantAccess: <ConfigType>({ accessFunction, accessKey, accessResultCallback, adminUsersSlug, collection, fieldName, tenantsArrayFieldName, tenantsArrayTenantFieldName, userHasAccessToAllTenants, }: Args<ConfigType>) => (args: AccessArgs) => Promise<AccessResult>;
15
- export {};
16
- //# sourceMappingURL=withTenantAccess.d.ts.map
@@ -1 +0,0 @@
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,gBAAgB,EAAoB,MAAM,SAAS,CAAA;AAEnG,OAAO,KAAK,EAAE,aAAa,EAAE,uBAAuB,EAAwB,MAAM,aAAa,CAAA;AAK/F,KAAK,IAAI,CAAC,UAAU,IAAI;IACtB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IAChC,oBAAoB,CAAC,EAAE,uBAAuB,CAAC,UAAU,CAAC,CAAC,2BAA2B,CAAC,CAAA;IACvF,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,EAAE,gBAAgB,CAAA;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,2BAA2B,CAAC,EAAE,MAAM,CAAA;IACpC,yBAAyB,EAAE,QAAQ,CACjC,uBAAuB,CAAC,UAAU,CAAC,CACpC,CAAC,2BAA2B,CAAC,CAAA;CAC/B,CAAA;AACD,eAAO,MAAM,gBAAgB,GAC1B,UAAU,EAAE,4KAUV,IAAI,CAAC,UAAU,CAAC,MACZ,MAAM,UAAU,KAAG,OAAO,CAAC,YAAY,CAoF7C,CAAA"}
@@ -1,76 +0,0 @@
1
- import { combineWhereConstraints } from './combineWhereConstraints.js';
2
- import { getTenantAccess } from './getTenantAccess.js';
3
- export const withTenantAccess = ({ accessFunction, accessKey, accessResultCallback, adminUsersSlug, collection, fieldName, tenantsArrayFieldName, tenantsArrayTenantFieldName, userHasAccessToAllTenants })=>async (args)=>{
4
- const constraints = [];
5
- const accessFn = typeof accessFunction === 'function' ? accessFunction : ({ req })=>Boolean(req.user);
6
- const accessResult = await accessFn(args);
7
- if (accessResult === false) {
8
- if (accessResultCallback) {
9
- return accessResultCallback({
10
- accessKey,
11
- accessResult: false,
12
- ...args
13
- });
14
- } else {
15
- return false;
16
- }
17
- } else if (accessResult && typeof accessResult === 'object') {
18
- constraints.push(accessResult);
19
- }
20
- if (args.req.user && args.req.user.collection === adminUsersSlug && !userHasAccessToAllTenants(args.req.user)) {
21
- const tenantConstraint = getTenantAccess({
22
- fieldName,
23
- tenantsArrayFieldName,
24
- tenantsArrayTenantFieldName,
25
- user: args.req.user
26
- });
27
- // User with no tenants should have no access to tenant-scoped documents
28
- // except for their own user document
29
- if (tenantConstraint[fieldName]?.in.length === 0) {
30
- const result = collection.slug === args.req.user.collection ? {
31
- id: {
32
- equals: args.req.user.id
33
- }
34
- } : false;
35
- return accessResultCallback ? accessResultCallback({
36
- accessKey,
37
- accessResult: result,
38
- ...args
39
- }) : result;
40
- }
41
- if (collection.slug === args.req.user.collection) {
42
- constraints.push({
43
- or: [
44
- {
45
- id: {
46
- equals: args.req.user.id
47
- }
48
- },
49
- tenantConstraint
50
- ]
51
- });
52
- } else {
53
- constraints.push(tenantConstraint);
54
- }
55
- if (accessResultCallback) {
56
- return accessResultCallback({
57
- accessKey,
58
- accessResult: combineWhereConstraints(constraints),
59
- ...args
60
- });
61
- } else {
62
- return combineWhereConstraints(constraints);
63
- }
64
- }
65
- if (accessResultCallback) {
66
- return accessResultCallback({
67
- accessKey,
68
- accessResult,
69
- ...args
70
- });
71
- } else {
72
- return accessResult;
73
- }
74
- };
75
-
76
- //# sourceMappingURL=withTenantAccess.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/utilities/withTenantAccess.ts"],"sourcesContent":["import type { Access, AccessArgs, AccessResult, CollectionConfig, TypedUser, Where } from 'payload'\n\nimport type { AllAccessKeys, MultiTenantPluginConfig, UserWithTenantsField } from '../types.js'\n\nimport { combineWhereConstraints } from './combineWhereConstraints.js'\nimport { getTenantAccess } from './getTenantAccess.js'\n\ntype Args<ConfigType> = {\n accessFunction?: Access\n accessKey: AllAccessKeys[number]\n accessResultCallback?: MultiTenantPluginConfig<ConfigType>['usersAccessResultOverride']\n adminUsersSlug: string\n collection: CollectionConfig\n fieldName: string\n tenantsArrayFieldName?: string\n tenantsArrayTenantFieldName?: string\n userHasAccessToAllTenants: Required<\n MultiTenantPluginConfig<ConfigType>\n >['userHasAccessToAllTenants']\n}\nexport const withTenantAccess =\n <ConfigType>({\n accessFunction,\n accessKey,\n accessResultCallback,\n adminUsersSlug,\n collection,\n fieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n userHasAccessToAllTenants,\n }: Args<ConfigType>) =>\n async (args: AccessArgs): Promise<AccessResult> => {\n const constraints: Where[] = []\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 if (accessResultCallback) {\n return accessResultCallback({\n accessKey,\n accessResult: false,\n ...args,\n })\n } else {\n return false\n }\n } else if (accessResult && typeof accessResult === 'object') {\n constraints.push(accessResult)\n }\n\n if (\n args.req.user &&\n args.req.user.collection === adminUsersSlug &&\n !userHasAccessToAllTenants(\n args.req.user as ConfigType extends { user: unknown } ? ConfigType['user'] : TypedUser,\n )\n ) {\n const tenantConstraint = getTenantAccess({\n fieldName,\n tenantsArrayFieldName,\n tenantsArrayTenantFieldName,\n user: args.req.user as UserWithTenantsField,\n })\n\n // User with no tenants should have no access to tenant-scoped documents\n // except for their own user document\n if (tenantConstraint[fieldName]?.in.length === 0) {\n const result: AccessResult =\n collection.slug === args.req.user.collection\n ? { id: { equals: args.req.user.id } }\n : false\n\n return accessResultCallback\n ? accessResultCallback({ accessKey, accessResult: result, ...args })\n : result\n }\n\n if (collection.slug === args.req.user.collection) {\n constraints.push({\n or: [\n {\n id: {\n equals: args.req.user.id,\n },\n },\n tenantConstraint,\n ],\n })\n } else {\n constraints.push(tenantConstraint)\n }\n\n if (accessResultCallback) {\n return accessResultCallback({\n accessKey,\n accessResult: combineWhereConstraints(constraints),\n ...args,\n })\n } else {\n return combineWhereConstraints(constraints)\n }\n }\n\n if (accessResultCallback) {\n return accessResultCallback({\n accessKey,\n accessResult,\n ...args,\n })\n } else {\n return accessResult\n }\n }\n"],"names":["combineWhereConstraints","getTenantAccess","withTenantAccess","accessFunction","accessKey","accessResultCallback","adminUsersSlug","collection","fieldName","tenantsArrayFieldName","tenantsArrayTenantFieldName","userHasAccessToAllTenants","args","constraints","accessFn","req","Boolean","user","accessResult","push","tenantConstraint","in","length","result","slug","id","equals","or"],"mappings":"AAIA,SAASA,uBAAuB,QAAQ,+BAA8B;AACtE,SAASC,eAAe,QAAQ,uBAAsB;AAetD,OAAO,MAAMC,mBACX,CAAa,EACXC,cAAc,EACdC,SAAS,EACTC,oBAAoB,EACpBC,cAAc,EACdC,UAAU,EACVC,SAAS,EACTC,qBAAqB,EACrBC,2BAA2B,EAC3BC,yBAAyB,EACR,GACnB,OAAOC;QACL,MAAMC,cAAuB,EAAE;QAC/B,MAAMC,WACJ,OAAOX,mBAAmB,aACtBA,iBACA,CAAC,EAAEY,GAAG,EAAc,GAAmBC,QAAQD,IAAIE,IAAI;QAC7D,MAAMC,eAA6B,MAAMJ,SAASF;QAElD,IAAIM,iBAAiB,OAAO;YAC1B,IAAIb,sBAAsB;gBACxB,OAAOA,qBAAqB;oBAC1BD;oBACAc,cAAc;oBACd,GAAGN,IAAI;gBACT;YACF,OAAO;gBACL,OAAO;YACT;QACF,OAAO,IAAIM,gBAAgB,OAAOA,iBAAiB,UAAU;YAC3DL,YAAYM,IAAI,CAACD;QACnB;QAEA,IACEN,KAAKG,GAAG,CAACE,IAAI,IACbL,KAAKG,GAAG,CAACE,IAAI,CAACV,UAAU,KAAKD,kBAC7B,CAACK,0BACCC,KAAKG,GAAG,CAACE,IAAI,GAEf;YACA,MAAMG,mBAAmBnB,gBAAgB;gBACvCO;gBACAC;gBACAC;gBACAO,MAAML,KAAKG,GAAG,CAACE,IAAI;YACrB;YAEA,wEAAwE;YACxE,qCAAqC;YACrC,IAAIG,gBAAgB,CAACZ,UAAU,EAAEa,GAAGC,WAAW,GAAG;gBAChD,MAAMC,SACJhB,WAAWiB,IAAI,KAAKZ,KAAKG,GAAG,CAACE,IAAI,CAACV,UAAU,GACxC;oBAAEkB,IAAI;wBAAEC,QAAQd,KAAKG,GAAG,CAACE,IAAI,CAACQ,EAAE;oBAAC;gBAAE,IACnC;gBAEN,OAAOpB,uBACHA,qBAAqB;oBAAED;oBAAWc,cAAcK;oBAAQ,GAAGX,IAAI;gBAAC,KAChEW;YACN;YAEA,IAAIhB,WAAWiB,IAAI,KAAKZ,KAAKG,GAAG,CAACE,IAAI,CAACV,UAAU,EAAE;gBAChDM,YAAYM,IAAI,CAAC;oBACfQ,IAAI;wBACF;4BACEF,IAAI;gCACFC,QAAQd,KAAKG,GAAG,CAACE,IAAI,CAACQ,EAAE;4BAC1B;wBACF;wBACAL;qBACD;gBACH;YACF,OAAO;gBACLP,YAAYM,IAAI,CAACC;YACnB;YAEA,IAAIf,sBAAsB;gBACxB,OAAOA,qBAAqB;oBAC1BD;oBACAc,cAAclB,wBAAwBa;oBACtC,GAAGD,IAAI;gBACT;YACF,OAAO;gBACL,OAAOZ,wBAAwBa;YACjC;QACF;QAEA,IAAIR,sBAAsB;YACxB,OAAOA,qBAAqB;gBAC1BD;gBACAc;gBACA,GAAGN,IAAI;YACT;QACF,OAAO;YACL,OAAOM;QACT;IACF,EAAC"}