payload 3.0.2 → 3.0.3-canary.5a65a90
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/collections/operations/docAccess.d.ts.map +1 -1
- package/dist/collections/operations/docAccess.js +1 -2
- package/dist/collections/operations/docAccess.js.map +1 -1
- package/dist/globals/operations/docAccess.d.ts.map +1 -1
- package/dist/globals/operations/docAccess.js +1 -2
- package/dist/globals/operations/docAccess.js.map +1 -1
- package/dist/utilities/sanitizePermissions.d.ts +2 -1
- package/dist/utilities/sanitizePermissions.d.ts.map +1 -1
- package/dist/utilities/sanitizePermissions.js.map +1 -1
- package/dist/utilities/traverseFields.d.ts.map +1 -1
- package/dist/utilities/traverseFields.js +13 -10
- package/dist/utilities/traverseFields.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docAccess.d.ts","sourceRoot":"","sources":["../../../src/collections/operations/docAccess.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"docAccess.d.ts","sourceRoot":"","sources":["../../../src/collections/operations/docAccess.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,qBAAqB,CAAA;AACxE,OAAO,KAAK,EAAiB,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAQpD,KAAK,SAAS,GAAG;IACf,UAAU,EAAE,UAAU,CAAA;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,cAAc,CAAA;CACpB,CAAA;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAyChG"}
|
|
@@ -27,12 +27,11 @@ export async function docAccessOperation(args) {
|
|
|
27
27
|
req
|
|
28
28
|
});
|
|
29
29
|
const sanitizedPermissions = sanitizePermissions({
|
|
30
|
-
canAccessAdmin: true,
|
|
31
30
|
collections: {
|
|
32
31
|
[config.slug]: result
|
|
33
32
|
}
|
|
34
33
|
});
|
|
35
|
-
return sanitizedPermissions
|
|
34
|
+
return sanitizedPermissions?.collections?.[config.slug];
|
|
36
35
|
} catch (e) {
|
|
37
36
|
await killTransaction(req);
|
|
38
37
|
throw e;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/collections/operations/docAccess.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"sources":["../../../src/collections/operations/docAccess.ts"],"sourcesContent":["import type { SanitizedCollectionPermission } from '../../auth/index.js'\nimport type { AllOperations, PayloadRequest } from '../../types/index.js'\nimport type { Collection } from '../config/types.js'\n\nimport { getEntityPolicies } from '../../utilities/getEntityPolicies.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport { sanitizePermissions } from '../../utilities/sanitizePermissions.js'\n\nconst allOperations: AllOperations[] = ['create', 'read', 'update', 'delete']\n\ntype Arguments = {\n collection: Collection\n id: string\n req: PayloadRequest\n}\n\nexport async function docAccessOperation(args: Arguments): Promise<SanitizedCollectionPermission> {\n const {\n id,\n collection: { config },\n req,\n } = args\n\n const collectionOperations = [...allOperations]\n\n if (\n config.auth &&\n typeof config.auth.maxLoginAttempts !== 'undefined' &&\n config.auth.maxLoginAttempts !== 0\n ) {\n collectionOperations.push('unlock')\n }\n\n if (config.versions) {\n collectionOperations.push('readVersions')\n }\n\n try {\n const result = await getEntityPolicies({\n id,\n type: 'collection',\n entity: config,\n operations: collectionOperations,\n req,\n })\n\n const sanitizedPermissions = sanitizePermissions({\n collections: {\n [config.slug]: result,\n },\n })\n\n return sanitizedPermissions?.collections?.[config.slug]\n } catch (e: unknown) {\n await killTransaction(req)\n throw e\n }\n}\n"],"names":["getEntityPolicies","killTransaction","sanitizePermissions","allOperations","docAccessOperation","args","id","collection","config","req","collectionOperations","auth","maxLoginAttempts","push","versions","result","type","entity","operations","sanitizedPermissions","collections","slug","e"],"mappings":"AAIA,SAASA,iBAAiB,QAAQ,uCAAsC;AACxE,SAASC,eAAe,QAAQ,qCAAoC;AACpE,SAASC,mBAAmB,QAAQ,yCAAwC;AAE5E,MAAMC,gBAAiC;IAAC;IAAU;IAAQ;IAAU;CAAS;AAQ7E,OAAO,eAAeC,mBAAmBC,IAAe;IACtD,MAAM,EACJC,EAAE,EACFC,YAAY,EAAEC,MAAM,EAAE,EACtBC,GAAG,EACJ,GAAGJ;IAEJ,MAAMK,uBAAuB;WAAIP;KAAc;IAE/C,IACEK,OAAOG,IAAI,IACX,OAAOH,OAAOG,IAAI,CAACC,gBAAgB,KAAK,eACxCJ,OAAOG,IAAI,CAACC,gBAAgB,KAAK,GACjC;QACAF,qBAAqBG,IAAI,CAAC;IAC5B;IAEA,IAAIL,OAAOM,QAAQ,EAAE;QACnBJ,qBAAqBG,IAAI,CAAC;IAC5B;IAEA,IAAI;QACF,MAAME,SAAS,MAAMf,kBAAkB;YACrCM;YACAU,MAAM;YACNC,QAAQT;YACRU,YAAYR;YACZD;QACF;QAEA,MAAMU,uBAAuBjB,oBAAoB;YAC/CkB,aAAa;gBACX,CAACZ,OAAOa,IAAI,CAAC,EAAEN;YACjB;QACF;QAEA,OAAOI,sBAAsBC,aAAa,CAACZ,OAAOa,IAAI,CAAC;IACzD,EAAE,OAAOC,GAAY;QACnB,MAAMrB,gBAAgBQ;QACtB,MAAMa;IACR;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docAccess.d.ts","sourceRoot":"","sources":["../../../src/globals/operations/docAccess.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAA;AACpE,OAAO,KAAK,EAAiB,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACzE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAQ/D,KAAK,SAAS,GAAG;IACf,YAAY,EAAE,qBAAqB,CAAA;IACnC,GAAG,EAAE,cAAc,CAAA;CACpB,CAAA;AAED,eAAO,MAAM,kBAAkB,SAAgB,SAAS,KAAG,OAAO,CAAC,yBAAyB,
|
|
1
|
+
{"version":3,"file":"docAccess.d.ts","sourceRoot":"","sources":["../../../src/globals/operations/docAccess.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAA;AACpE,OAAO,KAAK,EAAiB,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACzE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAQ/D,KAAK,SAAS,GAAG;IACf,YAAY,EAAE,qBAAqB,CAAA;IACnC,GAAG,EAAE,cAAc,CAAA;CACpB,CAAA;AAED,eAAO,MAAM,kBAAkB,SAAgB,SAAS,KAAG,OAAO,CAAC,yBAAyB,CA+B3F,CAAA"}
|
|
@@ -24,12 +24,11 @@ export const docAccessOperation = async (args)=>{
|
|
|
24
24
|
await commitTransaction(req);
|
|
25
25
|
}
|
|
26
26
|
const sanitizedPermissions = sanitizePermissions({
|
|
27
|
-
canAccessAdmin: true,
|
|
28
27
|
globals: {
|
|
29
28
|
[globalConfig.slug]: result
|
|
30
29
|
}
|
|
31
30
|
});
|
|
32
|
-
return sanitizedPermissions
|
|
31
|
+
return sanitizedPermissions?.globals?.[globalConfig.slug];
|
|
33
32
|
} catch (e) {
|
|
34
33
|
await killTransaction(req);
|
|
35
34
|
throw e;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/globals/operations/docAccess.ts"],"sourcesContent":["import type { SanitizedGlobalPermission } from '../../auth/index.js'\nimport type { AllOperations, PayloadRequest } from '../../types/index.js'\nimport type { SanitizedGlobalConfig } from '../config/types.js'\n\nimport { commitTransaction } from '../../utilities/commitTransaction.js'\nimport { getEntityPolicies } from '../../utilities/getEntityPolicies.js'\nimport { initTransaction } from '../../utilities/initTransaction.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport { sanitizePermissions } from '../../utilities/sanitizePermissions.js'\n\ntype Arguments = {\n globalConfig: SanitizedGlobalConfig\n req: PayloadRequest\n}\n\nexport const docAccessOperation = async (args: Arguments): Promise<SanitizedGlobalPermission> => {\n const { globalConfig, req } = args\n\n const globalOperations: AllOperations[] = ['read', 'update']\n\n if (globalConfig.versions) {\n globalOperations.push('readVersions')\n }\n\n try {\n const shouldCommit = await initTransaction(req)\n const result = await getEntityPolicies({\n type: 'global',\n entity: globalConfig,\n operations: globalOperations,\n req,\n })\n if (shouldCommit) {\n await commitTransaction(req)\n }\n const sanitizedPermissions = sanitizePermissions({\n
|
|
1
|
+
{"version":3,"sources":["../../../src/globals/operations/docAccess.ts"],"sourcesContent":["import type { SanitizedGlobalPermission } from '../../auth/index.js'\nimport type { AllOperations, PayloadRequest } from '../../types/index.js'\nimport type { SanitizedGlobalConfig } from '../config/types.js'\n\nimport { commitTransaction } from '../../utilities/commitTransaction.js'\nimport { getEntityPolicies } from '../../utilities/getEntityPolicies.js'\nimport { initTransaction } from '../../utilities/initTransaction.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport { sanitizePermissions } from '../../utilities/sanitizePermissions.js'\n\ntype Arguments = {\n globalConfig: SanitizedGlobalConfig\n req: PayloadRequest\n}\n\nexport const docAccessOperation = async (args: Arguments): Promise<SanitizedGlobalPermission> => {\n const { globalConfig, req } = args\n\n const globalOperations: AllOperations[] = ['read', 'update']\n\n if (globalConfig.versions) {\n globalOperations.push('readVersions')\n }\n\n try {\n const shouldCommit = await initTransaction(req)\n const result = await getEntityPolicies({\n type: 'global',\n entity: globalConfig,\n operations: globalOperations,\n req,\n })\n if (shouldCommit) {\n await commitTransaction(req)\n }\n const sanitizedPermissions = sanitizePermissions({\n globals: {\n [globalConfig.slug]: result,\n },\n })\n\n return sanitizedPermissions?.globals?.[globalConfig.slug]\n } catch (e: unknown) {\n await killTransaction(req)\n throw e\n }\n}\n"],"names":["commitTransaction","getEntityPolicies","initTransaction","killTransaction","sanitizePermissions","docAccessOperation","args","globalConfig","req","globalOperations","versions","push","shouldCommit","result","type","entity","operations","sanitizedPermissions","globals","slug","e"],"mappings":"AAIA,SAASA,iBAAiB,QAAQ,uCAAsC;AACxE,SAASC,iBAAiB,QAAQ,uCAAsC;AACxE,SAASC,eAAe,QAAQ,qCAAoC;AACpE,SAASC,eAAe,QAAQ,qCAAoC;AACpE,SAASC,mBAAmB,QAAQ,yCAAwC;AAO5E,OAAO,MAAMC,qBAAqB,OAAOC;IACvC,MAAM,EAAEC,YAAY,EAAEC,GAAG,EAAE,GAAGF;IAE9B,MAAMG,mBAAoC;QAAC;QAAQ;KAAS;IAE5D,IAAIF,aAAaG,QAAQ,EAAE;QACzBD,iBAAiBE,IAAI,CAAC;IACxB;IAEA,IAAI;QACF,MAAMC,eAAe,MAAMV,gBAAgBM;QAC3C,MAAMK,SAAS,MAAMZ,kBAAkB;YACrCa,MAAM;YACNC,QAAQR;YACRS,YAAYP;YACZD;QACF;QACA,IAAII,cAAc;YAChB,MAAMZ,kBAAkBQ;QAC1B;QACA,MAAMS,uBAAuBb,oBAAoB;YAC/Cc,SAAS;gBACP,CAACX,aAAaY,IAAI,CAAC,EAAEN;YACvB;QACF;QAEA,OAAOI,sBAAsBC,SAAS,CAACX,aAAaY,IAAI,CAAC;IAC3D,EAAE,OAAOC,GAAY;QACnB,MAAMjB,gBAAgBK;QACtB,MAAMY;IACR;AACF,EAAC"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import type { MarkOptional } from 'ts-essentials';
|
|
1
2
|
import type { Permissions, SanitizedPermissions } from '../auth/types.js';
|
|
2
3
|
export declare function recursivelySanitizeCollections(obj: Permissions['collections']): void;
|
|
3
4
|
export declare function recursivelySanitizeGlobals(obj: Permissions['globals']): void;
|
|
4
5
|
/**
|
|
5
6
|
* Recursively remove empty objects and false values from an object.
|
|
6
7
|
*/
|
|
7
|
-
export declare function sanitizePermissions(data: Permissions): SanitizedPermissions;
|
|
8
|
+
export declare function sanitizePermissions(data: MarkOptional<Permissions, 'canAccessAdmin'>): SanitizedPermissions;
|
|
8
9
|
//# sourceMappingURL=sanitizePermissions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sanitizePermissions.d.ts","sourceRoot":"","sources":["../../src/utilities/sanitizePermissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAKV,WAAW,EAIX,oBAAoB,EACrB,MAAM,kBAAkB,CAAA;AAiKzB,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,WAAW,CAAC,aAAa,CAAC,GAAG,IAAI,CAUpF;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,WAAW,CAAC,SAAS,CAAC,GAAG,IAAI,CAU5E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"sanitizePermissions.d.ts","sourceRoot":"","sources":["../../src/utilities/sanitizePermissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAEjD,OAAO,KAAK,EAKV,WAAW,EAIX,oBAAoB,EACrB,MAAM,kBAAkB,CAAA;AAiKzB,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,WAAW,CAAC,aAAa,CAAC,GAAG,IAAI,CAUpF;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,WAAW,CAAC,SAAS,CAAC,GAAG,IAAI,CAU5E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,YAAY,CAAC,WAAW,EAAE,gBAAgB,CAAC,GAChD,oBAAoB,CAiBtB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/sanitizePermissions.ts"],"sourcesContent":["import type {\n CollectionPermission,\n FieldPermissions,\n FieldsPermissions,\n GlobalPermission,\n Permissions,\n SanitizedBlocksPermissions,\n SanitizedFieldPermissions,\n SanitizedFieldsPermissions,\n SanitizedPermissions,\n} from '../auth/types.js'\n\nfunction checkAndSanitizeFieldsPermssions(data: FieldsPermissions): boolean {\n let allFieldPermissionsTrue = true\n for (const key in data) {\n if (typeof data[key] === 'object') {\n if (!checkAndSanitizePermissions(data[key])) {\n allFieldPermissionsTrue = false\n } else {\n ;(data[key] as unknown as SanitizedFieldPermissions) = true\n }\n } else if (data[key] !== true) {\n allFieldPermissionsTrue = false\n }\n }\n\n // If all values are true or it's an empty object, return true\n return allFieldPermissionsTrue\n}\n\n/**\n * Check if all permissions in a FieldPermissions, CollectionPermission or GlobalPermission object are true.\n * If nested fields or blocks are present, the function will recursively check those as well.\n */\nfunction checkAndSanitizePermissions(\n data: CollectionPermission | FieldPermissions | GlobalPermission,\n): boolean {\n /**\n * Check blocks permissions\n */\n let blocksPermissions = true\n if ('blocks' in data && data.blocks) {\n for (const blockSlug in data.blocks) {\n if (typeof data.blocks[blockSlug] === 'object') {\n for (const key in data.blocks[blockSlug]) {\n /**\n * Check fields in nested blocks\n */\n if (key === 'fields') {\n if (data.blocks[blockSlug].fields) {\n if (!checkAndSanitizeFieldsPermssions(data.blocks[blockSlug].fields)) {\n blocksPermissions = false\n } else {\n ;(data.blocks[blockSlug].fields as unknown as SanitizedFieldsPermissions) = true\n }\n }\n } else {\n if (typeof data.blocks[blockSlug][key] === 'object') {\n /**\n * Check Permissions in nested blocks\n */\n if (isPermissionObject(data.blocks[blockSlug][key])) {\n if (\n data.blocks[blockSlug][key]['permission'] === true &&\n !('where' in data.blocks[blockSlug][key])\n ) {\n // If the permission is true and there is no where clause, set the key to true\n data.blocks[blockSlug][key] = true\n continue\n } else if (\n data.blocks[blockSlug][key]['permission'] === true &&\n 'where' in data.blocks[blockSlug][key]\n ) {\n // otherwise do nothing so we can keep the where clause\n blocksPermissions = false\n } else {\n blocksPermissions = false\n data.blocks[blockSlug][key] = false\n delete data.blocks[blockSlug][key]\n continue\n }\n } else {\n throw new Error('Unexpected object in block permissions')\n }\n }\n }\n }\n } else if (data.blocks[blockSlug] !== true) {\n // If any value is not true, return false\n blocksPermissions = false\n delete data.blocks[blockSlug]\n }\n }\n if (blocksPermissions) {\n ;(data.blocks as unknown as SanitizedBlocksPermissions) = true\n }\n }\n\n /**\n * Check nested Fields permissions\n */\n let fieldsPermissions = true\n if (data.fields) {\n if (!checkAndSanitizeFieldsPermssions(data.fields)) {\n fieldsPermissions = false\n } else {\n ;(data.fields as unknown as SanitizedFieldsPermissions) = true\n }\n }\n\n /**\n * Check other Permissions objects (e.g. read, write)\n */\n let otherPermissions = true\n for (const key in data) {\n if (key === 'fields' || key === 'blocks') {\n continue\n }\n if (typeof data[key] === 'object') {\n if (isPermissionObject(data[key])) {\n if (data[key]['permission'] === true && !('where' in data[key])) {\n // If the permission is true and there is no where clause, set the key to true\n data[key] = true\n continue\n } else if (data[key]['permission'] === true && 'where' in data[key]) {\n // otherwise do nothing so we can keep the where clause\n otherPermissions = false\n } else {\n otherPermissions = false\n data[key] = false\n delete data[key]\n continue\n }\n } else {\n throw new Error('Unexpected object in fields permissions')\n }\n } else if (data[key] !== true) {\n // If any value is not true, return false\n otherPermissions = false\n }\n }\n\n // If all values are true or it's an empty object, return true\n return fieldsPermissions && blocksPermissions && otherPermissions\n}\n\n/**\n * Check if an object is a permission object.\n */\nfunction isPermissionObject(data: unknown): boolean {\n return typeof data === 'object' && 'permission' in data && typeof data['permission'] === 'boolean'\n}\n\n/**\n * Recursively remove empty objects from an object.\n */\nfunction cleanEmptyObjects(obj: any): void {\n Object.keys(obj).forEach((key) => {\n if (typeof obj[key] === 'object' && obj[key] !== null) {\n // Recursive call\n cleanEmptyObjects(obj[key])\n if (Object.keys(obj[key]).length === 0) {\n // Delete the key if the object is empty\n delete obj[key]\n }\n } else if (obj[key] === null || obj[key] === undefined) {\n delete obj[key]\n }\n })\n}\n\nexport function recursivelySanitizeCollections(obj: Permissions['collections']): void {\n if (typeof obj !== 'object') {\n return\n }\n\n const collectionPermissions = Object.values(obj)\n\n for (const collectionPermission of collectionPermissions) {\n checkAndSanitizePermissions(collectionPermission)\n }\n}\n\nexport function recursivelySanitizeGlobals(obj: Permissions['globals']): void {\n if (typeof obj !== 'object') {\n return\n }\n\n const globalPermissions = Object.values(obj)\n\n for (const globalPermission of globalPermissions) {\n checkAndSanitizePermissions(globalPermission)\n }\n}\n\n/**\n * Recursively remove empty objects and false values from an object.\n */\nexport function sanitizePermissions(data: Permissions): SanitizedPermissions {\n if (data.canAccessAdmin === false) {\n delete data.canAccessAdmin\n }\n\n if (data.collections) {\n recursivelySanitizeCollections(data.collections)\n }\n\n if (data.globals) {\n recursivelySanitizeGlobals(data.globals)\n }\n\n // Run clean up of empty objects at the end\n cleanEmptyObjects(data)\n\n return data as unknown as SanitizedPermissions\n}\n"],"names":["checkAndSanitizeFieldsPermssions","data","allFieldPermissionsTrue","key","checkAndSanitizePermissions","blocksPermissions","blocks","blockSlug","fields","isPermissionObject","Error","fieldsPermissions","otherPermissions","cleanEmptyObjects","obj","Object","keys","forEach","length","undefined","recursivelySanitizeCollections","collectionPermissions","values","collectionPermission","recursivelySanitizeGlobals","globalPermissions","globalPermission","sanitizePermissions","canAccessAdmin","collections","globals"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/sanitizePermissions.ts"],"sourcesContent":["import type { MarkOptional } from 'ts-essentials'\n\nimport type {\n CollectionPermission,\n FieldPermissions,\n FieldsPermissions,\n GlobalPermission,\n Permissions,\n SanitizedBlocksPermissions,\n SanitizedFieldPermissions,\n SanitizedFieldsPermissions,\n SanitizedPermissions,\n} from '../auth/types.js'\n\nfunction checkAndSanitizeFieldsPermssions(data: FieldsPermissions): boolean {\n let allFieldPermissionsTrue = true\n for (const key in data) {\n if (typeof data[key] === 'object') {\n if (!checkAndSanitizePermissions(data[key])) {\n allFieldPermissionsTrue = false\n } else {\n ;(data[key] as unknown as SanitizedFieldPermissions) = true\n }\n } else if (data[key] !== true) {\n allFieldPermissionsTrue = false\n }\n }\n\n // If all values are true or it's an empty object, return true\n return allFieldPermissionsTrue\n}\n\n/**\n * Check if all permissions in a FieldPermissions, CollectionPermission or GlobalPermission object are true.\n * If nested fields or blocks are present, the function will recursively check those as well.\n */\nfunction checkAndSanitizePermissions(\n data: CollectionPermission | FieldPermissions | GlobalPermission,\n): boolean {\n /**\n * Check blocks permissions\n */\n let blocksPermissions = true\n if ('blocks' in data && data.blocks) {\n for (const blockSlug in data.blocks) {\n if (typeof data.blocks[blockSlug] === 'object') {\n for (const key in data.blocks[blockSlug]) {\n /**\n * Check fields in nested blocks\n */\n if (key === 'fields') {\n if (data.blocks[blockSlug].fields) {\n if (!checkAndSanitizeFieldsPermssions(data.blocks[blockSlug].fields)) {\n blocksPermissions = false\n } else {\n ;(data.blocks[blockSlug].fields as unknown as SanitizedFieldsPermissions) = true\n }\n }\n } else {\n if (typeof data.blocks[blockSlug][key] === 'object') {\n /**\n * Check Permissions in nested blocks\n */\n if (isPermissionObject(data.blocks[blockSlug][key])) {\n if (\n data.blocks[blockSlug][key]['permission'] === true &&\n !('where' in data.blocks[blockSlug][key])\n ) {\n // If the permission is true and there is no where clause, set the key to true\n data.blocks[blockSlug][key] = true\n continue\n } else if (\n data.blocks[blockSlug][key]['permission'] === true &&\n 'where' in data.blocks[blockSlug][key]\n ) {\n // otherwise do nothing so we can keep the where clause\n blocksPermissions = false\n } else {\n blocksPermissions = false\n data.blocks[blockSlug][key] = false\n delete data.blocks[blockSlug][key]\n continue\n }\n } else {\n throw new Error('Unexpected object in block permissions')\n }\n }\n }\n }\n } else if (data.blocks[blockSlug] !== true) {\n // If any value is not true, return false\n blocksPermissions = false\n delete data.blocks[blockSlug]\n }\n }\n if (blocksPermissions) {\n ;(data.blocks as unknown as SanitizedBlocksPermissions) = true\n }\n }\n\n /**\n * Check nested Fields permissions\n */\n let fieldsPermissions = true\n if (data.fields) {\n if (!checkAndSanitizeFieldsPermssions(data.fields)) {\n fieldsPermissions = false\n } else {\n ;(data.fields as unknown as SanitizedFieldsPermissions) = true\n }\n }\n\n /**\n * Check other Permissions objects (e.g. read, write)\n */\n let otherPermissions = true\n for (const key in data) {\n if (key === 'fields' || key === 'blocks') {\n continue\n }\n if (typeof data[key] === 'object') {\n if (isPermissionObject(data[key])) {\n if (data[key]['permission'] === true && !('where' in data[key])) {\n // If the permission is true and there is no where clause, set the key to true\n data[key] = true\n continue\n } else if (data[key]['permission'] === true && 'where' in data[key]) {\n // otherwise do nothing so we can keep the where clause\n otherPermissions = false\n } else {\n otherPermissions = false\n data[key] = false\n delete data[key]\n continue\n }\n } else {\n throw new Error('Unexpected object in fields permissions')\n }\n } else if (data[key] !== true) {\n // If any value is not true, return false\n otherPermissions = false\n }\n }\n\n // If all values are true or it's an empty object, return true\n return fieldsPermissions && blocksPermissions && otherPermissions\n}\n\n/**\n * Check if an object is a permission object.\n */\nfunction isPermissionObject(data: unknown): boolean {\n return typeof data === 'object' && 'permission' in data && typeof data['permission'] === 'boolean'\n}\n\n/**\n * Recursively remove empty objects from an object.\n */\nfunction cleanEmptyObjects(obj: any): void {\n Object.keys(obj).forEach((key) => {\n if (typeof obj[key] === 'object' && obj[key] !== null) {\n // Recursive call\n cleanEmptyObjects(obj[key])\n if (Object.keys(obj[key]).length === 0) {\n // Delete the key if the object is empty\n delete obj[key]\n }\n } else if (obj[key] === null || obj[key] === undefined) {\n delete obj[key]\n }\n })\n}\n\nexport function recursivelySanitizeCollections(obj: Permissions['collections']): void {\n if (typeof obj !== 'object') {\n return\n }\n\n const collectionPermissions = Object.values(obj)\n\n for (const collectionPermission of collectionPermissions) {\n checkAndSanitizePermissions(collectionPermission)\n }\n}\n\nexport function recursivelySanitizeGlobals(obj: Permissions['globals']): void {\n if (typeof obj !== 'object') {\n return\n }\n\n const globalPermissions = Object.values(obj)\n\n for (const globalPermission of globalPermissions) {\n checkAndSanitizePermissions(globalPermission)\n }\n}\n\n/**\n * Recursively remove empty objects and false values from an object.\n */\nexport function sanitizePermissions(\n data: MarkOptional<Permissions, 'canAccessAdmin'>,\n): SanitizedPermissions {\n if (data.canAccessAdmin === false) {\n delete data.canAccessAdmin\n }\n\n if (data.collections) {\n recursivelySanitizeCollections(data.collections)\n }\n\n if (data.globals) {\n recursivelySanitizeGlobals(data.globals)\n }\n\n // Run clean up of empty objects at the end\n cleanEmptyObjects(data)\n\n return data as unknown as SanitizedPermissions\n}\n"],"names":["checkAndSanitizeFieldsPermssions","data","allFieldPermissionsTrue","key","checkAndSanitizePermissions","blocksPermissions","blocks","blockSlug","fields","isPermissionObject","Error","fieldsPermissions","otherPermissions","cleanEmptyObjects","obj","Object","keys","forEach","length","undefined","recursivelySanitizeCollections","collectionPermissions","values","collectionPermission","recursivelySanitizeGlobals","globalPermissions","globalPermission","sanitizePermissions","canAccessAdmin","collections","globals"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../../src/utilities/traverseFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA2B,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AA8B3F,MAAM,MAAM,sBAAsB,GAAG,CAAC,IAAI,EAAE;IAC1C;;OAEG;IACH,KAAK,EAAE,KAAK,GAAG,UAAU,CAAA;IACzB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,IAAI,CAAA;IACjB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;IAC7C;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;CACxC,KAAK,OAAO,GAAG,IAAI,CAAA;AAEpB,KAAK,kBAAkB,GAAG;IACxB,QAAQ,EAAE,sBAAsB,CAAA;IAChC,MAAM,EAAE,CAAC,KAAK,GAAG,UAAU,CAAC,EAAE,CAAA;IAC9B,qDAAqD;IACrD,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;CACxC,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,qDAMxB,kBAAkB,KAAG,
|
|
1
|
+
{"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../../src/utilities/traverseFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA2B,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AA8B3F,MAAM,MAAM,sBAAsB,GAAG,CAAC,IAAI,EAAE;IAC1C;;OAEG;IACH,KAAK,EAAE,KAAK,GAAG,UAAU,CAAA;IACzB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,IAAI,CAAA;IACjB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;IAC7C;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;CACxC,KAAK,OAAO,GAAG,IAAI,CAAA;AAEpB,KAAK,kBAAkB,GAAG;IACxB,QAAQ,EAAE,sBAAsB,CAAA;IAChC,MAAM,EAAE,CAAC,KAAK,GAAG,UAAU,CAAC,EAAE,CAAA;IAC9B,qDAAqD;IACrD,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;CACxC,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,qDAMxB,kBAAkB,KAAG,IA4JvB,CAAA"}
|
|
@@ -31,6 +31,9 @@ const traverseArrayOrBlocksField = ({ callback, data, field, parentRef })=>{
|
|
|
31
31
|
const next = ()=>{
|
|
32
32
|
skip = true;
|
|
33
33
|
};
|
|
34
|
+
if (!ref || typeof ref !== 'object') {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
34
37
|
if (callback && callback({
|
|
35
38
|
field,
|
|
36
39
|
next,
|
|
@@ -47,6 +50,7 @@ const traverseArrayOrBlocksField = ({ callback, data, field, parentRef })=>{
|
|
|
47
50
|
let currentParentRef = parentRef;
|
|
48
51
|
if (field.type === 'tabs' && 'tabs' in field) {
|
|
49
52
|
for (const tab of field.tabs){
|
|
53
|
+
let tabRef = ref;
|
|
50
54
|
if ('name' in tab && tab.name) {
|
|
51
55
|
if (!ref[tab.name] || typeof ref[tab.name] !== 'object') {
|
|
52
56
|
if (fillEmpty) {
|
|
@@ -55,16 +59,15 @@ const traverseArrayOrBlocksField = ({ callback, data, field, parentRef })=>{
|
|
|
55
59
|
continue;
|
|
56
60
|
}
|
|
57
61
|
}
|
|
58
|
-
|
|
59
|
-
currentRef = ref[tab.name];
|
|
62
|
+
tabRef = tabRef[tab.name];
|
|
60
63
|
if (tab.localized) {
|
|
61
|
-
for(const key in
|
|
62
|
-
if (
|
|
64
|
+
for(const key in tabRef){
|
|
65
|
+
if (tabRef[key] && typeof tabRef[key] === 'object') {
|
|
63
66
|
traverseFields({
|
|
64
67
|
callback,
|
|
65
68
|
fields: tab.fields,
|
|
66
|
-
parentRef,
|
|
67
|
-
ref:
|
|
69
|
+
parentRef: currentParentRef,
|
|
70
|
+
ref: tabRef[key]
|
|
68
71
|
});
|
|
69
72
|
}
|
|
70
73
|
}
|
|
@@ -77,16 +80,16 @@ const traverseArrayOrBlocksField = ({ callback, data, field, parentRef })=>{
|
|
|
77
80
|
type: 'tab'
|
|
78
81
|
},
|
|
79
82
|
next,
|
|
80
|
-
parentRef,
|
|
81
|
-
ref:
|
|
83
|
+
parentRef: currentParentRef,
|
|
84
|
+
ref: tabRef
|
|
82
85
|
})) {
|
|
83
86
|
return true;
|
|
84
87
|
}
|
|
85
88
|
traverseFields({
|
|
86
89
|
callback,
|
|
87
90
|
fields: tab.fields,
|
|
88
|
-
parentRef,
|
|
89
|
-
ref:
|
|
91
|
+
parentRef: currentParentRef,
|
|
92
|
+
ref: tabRef
|
|
90
93
|
});
|
|
91
94
|
}
|
|
92
95
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/traverseFields.ts"],"sourcesContent":["import type { ArrayField, BlocksField, Field, TabAsField } from '../fields/config/types.js'\n\nimport { fieldHasSubFields } from '../fields/config/types.js'\n\nconst traverseArrayOrBlocksField = ({\n callback,\n data,\n field,\n parentRef,\n}: {\n callback: TraverseFieldsCallback\n data: Record<string, unknown>[]\n field: ArrayField | BlocksField\n parentRef?: unknown\n}) => {\n for (const ref of data) {\n let fields: Field[]\n if (field.type === 'blocks' && typeof ref?.blockType === 'string') {\n const block = field.blocks.find((block) => block.slug === ref.blockType)\n fields = block?.fields\n } else if (field.type === 'array') {\n fields = field.fields\n }\n\n if (fields) {\n traverseFields({ callback, fields, parentRef, ref })\n }\n }\n}\n\nexport type TraverseFieldsCallback = (args: {\n /**\n * The current field\n */\n field: Field | TabAsField\n /**\n * Function that when called will skip the current field and continue to the next\n */\n next?: () => void\n /**\n * The parent reference object\n */\n parentRef?: Record<string, unknown> | unknown\n /**\n * The current reference object\n */\n ref?: Record<string, unknown> | unknown\n}) => boolean | void\n\ntype TraverseFieldsArgs = {\n callback: TraverseFieldsCallback\n fields: (Field | TabAsField)[]\n /** fill empty properties to use this without data */\n fillEmpty?: boolean\n parentRef?: Record<string, unknown> | unknown\n ref?: Record<string, unknown> | unknown\n}\n\n/**\n * Iterate a recurse an array of fields, calling a callback for each field\n *\n * @param fields\n * @param callback callback called for each field, discontinue looping if callback returns truthy\n * @param ref\n * @param parentRef\n */\nexport const traverseFields = ({\n callback,\n fields,\n fillEmpty = true,\n parentRef = {},\n ref = {},\n}: TraverseFieldsArgs): void => {\n fields.some((field) => {\n let skip = false\n const next = () => {\n skip = true\n }\n if (callback && callback({ field, next, parentRef, ref })) {\n return true\n }\n if (skip) {\n return false\n }\n\n // avoid mutation of ref for all fields\n let currentRef = ref\n let currentParentRef = parentRef\n\n if (field.type === 'tabs' && 'tabs' in field) {\n for (const tab of field.tabs) {\n if ('name' in tab && tab.name) {\n if (!ref[tab.name] || typeof ref[tab.name] !== 'object') {\n if (fillEmpty) {\n ref[tab.name] = {}\n } else {\n continue\n }\n }\n\n
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/traverseFields.ts"],"sourcesContent":["import type { ArrayField, BlocksField, Field, TabAsField } from '../fields/config/types.js'\n\nimport { fieldHasSubFields } from '../fields/config/types.js'\n\nconst traverseArrayOrBlocksField = ({\n callback,\n data,\n field,\n parentRef,\n}: {\n callback: TraverseFieldsCallback\n data: Record<string, unknown>[]\n field: ArrayField | BlocksField\n parentRef?: unknown\n}) => {\n for (const ref of data) {\n let fields: Field[]\n if (field.type === 'blocks' && typeof ref?.blockType === 'string') {\n const block = field.blocks.find((block) => block.slug === ref.blockType)\n fields = block?.fields\n } else if (field.type === 'array') {\n fields = field.fields\n }\n\n if (fields) {\n traverseFields({ callback, fields, parentRef, ref })\n }\n }\n}\n\nexport type TraverseFieldsCallback = (args: {\n /**\n * The current field\n */\n field: Field | TabAsField\n /**\n * Function that when called will skip the current field and continue to the next\n */\n next?: () => void\n /**\n * The parent reference object\n */\n parentRef?: Record<string, unknown> | unknown\n /**\n * The current reference object\n */\n ref?: Record<string, unknown> | unknown\n}) => boolean | void\n\ntype TraverseFieldsArgs = {\n callback: TraverseFieldsCallback\n fields: (Field | TabAsField)[]\n /** fill empty properties to use this without data */\n fillEmpty?: boolean\n parentRef?: Record<string, unknown> | unknown\n ref?: Record<string, unknown> | unknown\n}\n\n/**\n * Iterate a recurse an array of fields, calling a callback for each field\n *\n * @param fields\n * @param callback callback called for each field, discontinue looping if callback returns truthy\n * @param ref\n * @param parentRef\n */\nexport const traverseFields = ({\n callback,\n fields,\n fillEmpty = true,\n parentRef = {},\n ref = {},\n}: TraverseFieldsArgs): void => {\n fields.some((field) => {\n let skip = false\n const next = () => {\n skip = true\n }\n\n if (!ref || typeof ref !== 'object') {\n return\n }\n\n if (callback && callback({ field, next, parentRef, ref })) {\n return true\n }\n\n if (skip) {\n return false\n }\n\n // avoid mutation of ref for all fields\n let currentRef = ref\n let currentParentRef = parentRef\n\n if (field.type === 'tabs' && 'tabs' in field) {\n for (const tab of field.tabs) {\n let tabRef = ref\n if ('name' in tab && tab.name) {\n if (!ref[tab.name] || typeof ref[tab.name] !== 'object') {\n if (fillEmpty) {\n ref[tab.name] = {}\n } else {\n continue\n }\n }\n\n tabRef = tabRef[tab.name]\n\n if (tab.localized) {\n for (const key in tabRef as Record<string, unknown>) {\n if (tabRef[key] && typeof tabRef[key] === 'object') {\n traverseFields({\n callback,\n fields: tab.fields,\n parentRef: currentParentRef,\n ref: tabRef[key],\n })\n }\n }\n continue\n }\n }\n\n if (\n callback &&\n callback({\n field: { ...tab, type: 'tab' },\n next,\n parentRef: currentParentRef,\n ref: tabRef,\n })\n ) {\n return true\n }\n\n traverseFields({\n callback,\n fields: tab.fields,\n parentRef: currentParentRef,\n ref: tabRef,\n })\n }\n\n return\n }\n\n if (field.type !== 'tab' && (fieldHasSubFields(field) || field.type === 'blocks')) {\n if ('name' in field && field.name) {\n currentParentRef = currentRef\n if (!ref[field.name]) {\n if (fillEmpty) {\n if (field.type === 'group') {\n ref[field.name] = {}\n } else if (field.type === 'array' || field.type === 'blocks') {\n if (field.localized) {\n ref[field.name] = {}\n } else {\n ref[field.name] = []\n }\n }\n } else {\n return\n }\n }\n currentRef = ref[field.name]\n }\n\n if (\n field.type === 'group' &&\n field.localized &&\n currentRef &&\n typeof currentRef === 'object'\n ) {\n for (const key in currentRef as Record<string, unknown>) {\n if (currentRef[key]) {\n traverseFields({\n callback,\n fields: field.fields,\n parentRef: currentParentRef,\n ref: currentRef[key],\n })\n }\n }\n return\n }\n\n if (\n (field.type === 'blocks' || field.type === 'array') &&\n currentRef &&\n typeof currentRef === 'object'\n ) {\n if (field.localized) {\n if (Array.isArray(currentRef)) {\n return\n }\n\n for (const key in currentRef as Record<string, unknown>) {\n const localeData = currentRef[key]\n if (!Array.isArray(localeData)) {\n continue\n }\n\n traverseArrayOrBlocksField({\n callback,\n data: localeData,\n field,\n parentRef: currentParentRef,\n })\n }\n } else if (Array.isArray(currentRef)) {\n traverseArrayOrBlocksField({\n callback,\n data: currentRef as Record<string, unknown>[],\n field,\n parentRef: currentParentRef,\n })\n }\n } else if (currentRef && typeof currentRef === 'object' && 'fields' in field) {\n traverseFields({\n callback,\n fields: field.fields,\n parentRef: currentParentRef,\n ref: currentRef,\n })\n }\n }\n })\n}\n"],"names":["fieldHasSubFields","traverseArrayOrBlocksField","callback","data","field","parentRef","ref","fields","type","blockType","block","blocks","find","slug","traverseFields","fillEmpty","some","skip","next","currentRef","currentParentRef","tab","tabs","tabRef","name","localized","key","Array","isArray","localeData"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "payload",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.3-canary.5a65a90",
|
|
4
4
|
"description": "Node, React, Headless CMS and Application Framework built on Next.js",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"admin panel",
|
|
@@ -97,7 +97,7 @@
|
|
|
97
97
|
"tsx": "4.19.2",
|
|
98
98
|
"uuid": "10.0.0",
|
|
99
99
|
"ws": "^8.16.0",
|
|
100
|
-
"@payloadcms/translations": "3.0.
|
|
100
|
+
"@payloadcms/translations": "3.0.3-canary.5a65a90"
|
|
101
101
|
},
|
|
102
102
|
"devDependencies": {
|
|
103
103
|
"@hyrious/esbuild-plugin-commonjs": "^0.2.4",
|