payload 3.42.0 → 3.43.0-internal.c5bbc84
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/admin/functions/index.d.ts +8 -0
- package/dist/admin/functions/index.d.ts.map +1 -1
- package/dist/admin/functions/index.js.map +1 -1
- package/dist/admin/types.d.ts +1 -1
- package/dist/admin/types.d.ts.map +1 -1
- package/dist/admin/types.js.map +1 -1
- package/dist/admin/views/folderList.d.ts +14 -5
- package/dist/admin/views/folderList.d.ts.map +1 -1
- package/dist/admin/views/folderList.js.map +1 -1
- package/dist/auth/crypto.d.ts.map +1 -1
- package/dist/auth/crypto.js +6 -3
- package/dist/auth/crypto.js.map +1 -1
- package/dist/auth/operations/unlock.d.ts.map +1 -1
- package/dist/auth/operations/unlock.js +1 -2
- package/dist/auth/operations/unlock.js.map +1 -1
- package/dist/auth/strategies/local/authenticate.d.ts.map +1 -1
- package/dist/auth/strategies/local/authenticate.js +1 -0
- package/dist/auth/strategies/local/authenticate.js.map +1 -1
- package/dist/bin/index.js.map +1 -1
- package/dist/bin/migrate.d.ts.map +1 -1
- package/dist/bin/migrate.js +2 -2
- package/dist/bin/migrate.js.map +1 -1
- package/dist/collections/config/client.d.ts.map +1 -1
- package/dist/collections/config/client.js +3 -1
- package/dist/collections/config/client.js.map +1 -1
- package/dist/collections/dataloader.d.ts.map +1 -1
- package/dist/collections/dataloader.js +0 -1
- package/dist/collections/dataloader.js.map +1 -1
- package/dist/collections/operations/delete.d.ts.map +1 -1
- package/dist/collections/operations/delete.js +1 -2
- package/dist/collections/operations/delete.js.map +1 -1
- package/dist/collections/operations/findVersions.js +0 -1
- package/dist/collections/operations/findVersions.js.map +1 -1
- package/dist/collections/operations/update.d.ts.map +1 -1
- package/dist/collections/operations/update.js +3 -2
- package/dist/collections/operations/update.js.map +1 -1
- package/dist/config/client.d.ts.map +1 -1
- package/dist/config/client.js +1 -1
- package/dist/config/client.js.map +1 -1
- package/dist/config/sanitize.d.ts.map +1 -1
- package/dist/config/sanitize.js +1 -2
- package/dist/config/sanitize.js.map +1 -1
- package/dist/database/queryValidation/validateQueryPaths.d.ts.map +1 -1
- package/dist/database/queryValidation/validateQueryPaths.js +0 -1
- package/dist/database/queryValidation/validateQueryPaths.js.map +1 -1
- package/dist/database/queryValidation/validateSearchParams.d.ts.map +1 -1
- package/dist/database/queryValidation/validateSearchParams.js +0 -1
- package/dist/database/queryValidation/validateSearchParams.js.map +1 -1
- package/dist/database/sanitizeJoinQuery.d.ts.map +1 -1
- package/dist/database/sanitizeJoinQuery.js +3 -1
- package/dist/database/sanitizeJoinQuery.js.map +1 -1
- package/dist/fields/config/client.d.ts.map +1 -1
- package/dist/fields/config/client.js +6 -1
- package/dist/fields/config/client.js.map +1 -1
- package/dist/fields/config/sanitize.d.ts.map +1 -1
- package/dist/fields/config/sanitize.js +0 -1
- package/dist/fields/config/sanitize.js.map +1 -1
- package/dist/fields/hooks/afterRead/index.d.ts.map +1 -1
- package/dist/fields/hooks/afterRead/index.js +0 -1
- package/dist/fields/hooks/afterRead/index.js.map +1 -1
- package/dist/fields/hooks/afterRead/relationshipPopulationPromise.d.ts.map +1 -1
- package/dist/fields/hooks/afterRead/relationshipPopulationPromise.js +1 -2
- package/dist/fields/hooks/afterRead/relationshipPopulationPromise.js.map +1 -1
- package/dist/fields/hooks/beforeChange/promise.d.ts.map +1 -1
- package/dist/fields/hooks/beforeChange/promise.js +0 -1
- package/dist/fields/hooks/beforeChange/promise.js.map +1 -1
- package/dist/fields/setDefaultBeforeDuplicate.js.map +1 -1
- package/dist/fields/validations.d.ts.map +1 -1
- package/dist/fields/validations.js +1 -2
- package/dist/fields/validations.js.map +1 -1
- package/dist/folders/types.d.ts +2 -0
- package/dist/folders/types.d.ts.map +1 -1
- package/dist/folders/types.js.map +1 -1
- package/dist/globals/config/client.d.ts.map +1 -1
- package/dist/globals/config/client.js +2 -1
- package/dist/globals/config/client.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -3
- package/dist/index.js.map +1 -1
- package/dist/queues/operations/runJobs/index.d.ts.map +1 -1
- package/dist/queues/operations/runJobs/index.js +0 -1
- package/dist/queues/operations/runJobs/index.js.map +1 -1
- package/dist/queues/operations/runJobs/runJSONJob/index.d.ts.map +1 -1
- package/dist/queues/operations/runJobs/runJSONJob/index.js +2 -2
- package/dist/queues/operations/runJobs/runJSONJob/index.js.map +1 -1
- package/dist/queues/operations/runJobs/runJob/getRunTaskFunction.d.ts.map +1 -1
- package/dist/queues/operations/runJobs/runJob/getRunTaskFunction.js +0 -1
- package/dist/queues/operations/runJobs/runJob/getRunTaskFunction.js.map +1 -1
- package/dist/queues/operations/runJobs/runJob/getUpdateJobFunction.d.ts.map +1 -1
- package/dist/queues/operations/runJobs/runJob/getUpdateJobFunction.js +1 -1
- package/dist/queues/operations/runJobs/runJob/getUpdateJobFunction.js.map +1 -1
- package/dist/queues/operations/runJobs/runJob/importHandlerPath.d.ts.map +1 -1
- package/dist/queues/operations/runJobs/runJob/importHandlerPath.js +1 -2
- package/dist/queues/operations/runJobs/runJob/importHandlerPath.js.map +1 -1
- package/dist/queues/operations/runJobs/runJob/index.d.ts.map +1 -1
- package/dist/queues/operations/runJobs/runJob/index.js +2 -2
- package/dist/queues/operations/runJobs/runJob/index.js.map +1 -1
- package/dist/uploads/cropImage.d.ts +0 -1
- package/dist/uploads/cropImage.d.ts.map +1 -1
- package/dist/uploads/cropImage.js +2 -3
- package/dist/uploads/cropImage.js.map +1 -1
- package/dist/uploads/endpoints/getFile.d.ts.map +1 -1
- package/dist/uploads/endpoints/getFile.js +0 -1
- package/dist/uploads/endpoints/getFile.js.map +1 -1
- package/dist/uploads/endpoints/getFileFromURL.d.ts.map +1 -1
- package/dist/uploads/endpoints/getFileFromURL.js +2 -3
- package/dist/uploads/endpoints/getFileFromURL.js.map +1 -1
- package/dist/uploads/fetchAPI-multipart/fileFactory.d.ts.map +1 -1
- package/dist/uploads/fetchAPI-multipart/fileFactory.js +1 -0
- package/dist/uploads/fetchAPI-multipart/fileFactory.js.map +1 -1
- package/dist/uploads/fetchAPI-multipart/processMultipart.d.ts +6 -0
- package/dist/uploads/fetchAPI-multipart/processMultipart.d.ts.map +1 -1
- package/dist/uploads/fetchAPI-multipart/processMultipart.js +0 -1
- package/dist/uploads/fetchAPI-multipart/processMultipart.js.map +1 -1
- package/dist/uploads/fetchAPI-multipart/processNested.d.ts +1 -1
- package/dist/uploads/fetchAPI-multipart/processNested.d.ts.map +1 -1
- package/dist/uploads/fetchAPI-multipart/processNested.js +0 -1
- package/dist/uploads/fetchAPI-multipart/processNested.js.map +1 -1
- package/dist/uploads/fetchAPI-multipart/utilities.d.ts +1 -1
- package/dist/uploads/fetchAPI-multipart/utilities.d.ts.map +1 -1
- package/dist/uploads/fetchAPI-multipart/utilities.js +0 -1
- package/dist/uploads/fetchAPI-multipart/utilities.js.map +1 -1
- package/dist/uploads/fetchAPI-stream-file/index.d.ts +1 -1
- package/dist/uploads/fetchAPI-stream-file/index.d.ts.map +1 -1
- package/dist/uploads/fetchAPI-stream-file/index.js +0 -1
- package/dist/uploads/fetchAPI-stream-file/index.js.map +1 -1
- package/dist/uploads/tempFile.d.ts +1 -1
- package/dist/uploads/tempFile.d.ts.map +1 -1
- package/dist/uploads/tempFile.js +0 -1
- package/dist/uploads/tempFile.js.map +1 -1
- package/dist/utilities/addLocalesToRequest.d.ts.map +1 -1
- package/dist/utilities/addLocalesToRequest.js +0 -1
- package/dist/utilities/addLocalesToRequest.js.map +1 -1
- package/dist/utilities/configToJSONSchema.d.ts.map +1 -1
- package/dist/utilities/configToJSONSchema.js +2 -1
- package/dist/utilities/configToJSONSchema.js.map +1 -1
- package/dist/utilities/deepCopyObject.js +1 -2
- package/dist/utilities/deepCopyObject.js.map +1 -1
- package/dist/utilities/fieldSchemaToJSON.d.ts.map +1 -1
- package/dist/utilities/fieldSchemaToJSON.js +0 -1
- package/dist/utilities/fieldSchemaToJSON.js.map +1 -1
- package/dist/utilities/flattenTopLevelFields.d.ts.map +1 -1
- package/dist/utilities/flattenTopLevelFields.js +0 -1
- package/dist/utilities/flattenTopLevelFields.js.map +1 -1
- package/dist/utilities/formatErrors.d.ts.map +1 -1
- package/dist/utilities/formatErrors.js +0 -1
- package/dist/utilities/formatErrors.js.map +1 -1
- package/dist/utilities/getCollectionIDFieldTypes.d.ts.map +1 -1
- package/dist/utilities/getCollectionIDFieldTypes.js +0 -1
- package/dist/utilities/getCollectionIDFieldTypes.js.map +1 -1
- package/dist/utilities/getDataByPath.d.ts.map +1 -1
- package/dist/utilities/getDataByPath.js +0 -1
- package/dist/utilities/getDataByPath.js.map +1 -1
- package/dist/utilities/getEntityPolicies.d.ts.map +1 -1
- package/dist/utilities/getEntityPolicies.js +3 -2
- package/dist/utilities/getEntityPolicies.js.map +1 -1
- package/dist/utilities/getFieldPermissions.d.ts.map +1 -1
- package/dist/utilities/getFieldPermissions.js +2 -3
- package/dist/utilities/getFieldPermissions.js.map +1 -1
- package/dist/utilities/getObjectDotNotation.d.ts.map +1 -1
- package/dist/utilities/getObjectDotNotation.js +0 -1
- package/dist/utilities/getObjectDotNotation.js.map +1 -1
- package/dist/utilities/getSiblingData.d.ts.map +1 -1
- package/dist/utilities/getSiblingData.js +0 -1
- package/dist/utilities/getSiblingData.js.map +1 -1
- package/dist/utilities/getUniqueListBy.d.ts.map +1 -1
- package/dist/utilities/getUniqueListBy.js +0 -1
- package/dist/utilities/getUniqueListBy.js.map +1 -1
- package/dist/utilities/handleEndpoints.d.ts.map +1 -1
- package/dist/utilities/handleEndpoints.js +2 -2
- package/dist/utilities/handleEndpoints.js.map +1 -1
- package/dist/utilities/logError.d.ts.map +1 -1
- package/dist/utilities/logError.js +0 -1
- package/dist/utilities/logError.js.map +1 -1
- package/dist/utilities/reduceFieldsToValues.d.ts.map +1 -1
- package/dist/utilities/reduceFieldsToValues.js +0 -1
- package/dist/utilities/reduceFieldsToValues.js.map +1 -1
- package/dist/utilities/sanitizeJoinParams.d.ts +1 -1
- package/dist/utilities/sanitizeJoinParams.d.ts.map +1 -1
- package/dist/utilities/sanitizeJoinParams.js +2 -2
- package/dist/utilities/sanitizeJoinParams.js.map +1 -1
- package/dist/utilities/sanitizePermissions.d.ts.map +1 -1
- package/dist/utilities/sanitizePermissions.js +2 -2
- package/dist/utilities/sanitizePermissions.js.map +1 -1
- package/dist/utilities/sanitizePopulateParam.d.ts.map +1 -1
- package/dist/utilities/sanitizePopulateParam.js +1 -1
- package/dist/utilities/sanitizePopulateParam.js.map +1 -1
- package/dist/utilities/sanitizeSelectParam.d.ts.map +1 -1
- package/dist/utilities/sanitizeSelectParam.js +4 -2
- package/dist/utilities/sanitizeSelectParam.js.map +1 -1
- package/dist/utilities/telemetry/conf/envPaths.d.ts +1 -1
- package/dist/utilities/telemetry/conf/envPaths.d.ts.map +1 -1
- package/dist/utilities/telemetry/conf/envPaths.js.map +1 -1
- package/dist/utilities/timestamp.d.ts +1 -1
- package/dist/utilities/timestamp.d.ts.map +1 -1
- package/dist/utilities/timestamp.js +0 -1
- package/dist/utilities/timestamp.js.map +1 -1
- package/dist/utilities/traverseFields.d.ts.map +1 -1
- package/dist/utilities/traverseFields.js +6 -1
- package/dist/utilities/traverseFields.js.map +1 -1
- package/dist/utilities/unflatten.d.ts.map +1 -1
- package/dist/utilities/unflatten.js +1 -2
- package/dist/utilities/unflatten.js.map +1 -1
- package/dist/utilities/wait.d.ts +1 -1
- package/dist/utilities/wait.d.ts.map +1 -1
- package/dist/utilities/wait.js +0 -1
- package/dist/utilities/wait.js.map +1 -1
- package/dist/versions/baseFields.d.ts +2 -7
- package/dist/versions/baseFields.d.ts.map +1 -1
- package/dist/versions/baseFields.js.map +1 -1
- package/dist/versions/drafts/replaceWithDraftIfAvailable.d.ts.map +1 -1
- package/dist/versions/drafts/replaceWithDraftIfAvailable.js +1 -0
- package/dist/versions/drafts/replaceWithDraftIfAvailable.js.map +1 -1
- package/dist/versions/getLatestGlobalVersion.d.ts.map +1 -1
- package/dist/versions/getLatestGlobalVersion.js +3 -1
- package/dist/versions/getLatestGlobalVersion.js.map +1 -1
- package/dist/versions/saveVersion.js +1 -1
- package/dist/versions/saveVersion.js.map +1 -1
- package/package.json +3 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/deepCopyObject.ts"],"sourcesContent":["// @ts-strict-ignore\nimport type { JsonValue } from '../types/index.js'\n\n/*\nMain deepCopyObject handling - from rfdc: https://github.com/davidmarkclements/rfdc/blob/master/index.js\n\nCopyright 2019 \"David Mark Clements <david.mark.clements@gmail.com>\"\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\ndocumentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\nthe rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\nto permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions\nof the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\nTO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\nTHE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\nCONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\nIN THE SOFTWARE.\n*/\n\nfunction copyBuffer(cur) {\n if (cur instanceof Buffer) {\n return Buffer.from(cur)\n }\n\n return new cur.constructor(cur.buffer.slice(), cur.byteOffset, cur.length)\n}\n\nconst constructorHandlers = new Map()\nconstructorHandlers.set(Date, (o) => new Date(o))\nconstructorHandlers.set(Map, (o, fn) => new Map(cloneArray<any>(Array.from(o), fn)))\nconstructorHandlers.set(Set, (o, fn) => new Set(cloneArray(Array.from(o), fn)))\nconstructorHandlers.set(RegExp, (regex: RegExp) => new RegExp(regex.source, regex.flags))\n\nlet handler: ((o: any, fn: any) => any) | null = null\n\nfunction cloneArray<T extends object>(a: T, fn): T {\n const keys = Object.keys(a)\n const a2 = new Array(keys.length)\n for (let i = 0; i < keys.length; i++) {\n const k = keys[i]!\n const cur = a[k]\n if (typeof cur !== 'object' || cur === null) {\n a2[k] = cur\n } else if (cur instanceof RegExp) {\n a2[k] = new RegExp(cur.source, cur.flags)\n } else if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) {\n a2[k] = handler(cur, fn)\n } else if (ArrayBuffer.isView(cur)) {\n a2[k] = copyBuffer(cur)\n } else {\n a2[k] = fn(cur)\n }\n }\n return a2 as T\n}\n\nexport const deepCopyObject = <T>(o: T): T => {\n if (typeof o !== 'object' || o === null) {\n return o\n }\n if (Array.isArray(o)) {\n return cloneArray(o, deepCopyObject)\n }\n if (o instanceof RegExp) {\n return new RegExp(o.source, o.flags) as T\n }\n\n if (o.constructor !== Object && (handler = constructorHandlers.get(o.constructor))) {\n return handler(o, deepCopyObject)\n }\n const o2 = {}\n for (const k in o) {\n if (Object.hasOwnProperty.call(o, k) === false) {\n continue\n }\n const cur = o[k]\n if (typeof cur !== 'object' || cur === null) {\n o2[k as string] = cur\n } else if (cur instanceof RegExp) {\n o2[k as string] = new RegExp(cur.source, cur.flags)\n } else if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) {\n o2[k as string] = handler(cur, deepCopyObject)\n } else if (ArrayBuffer.isView(cur)) {\n o2[k as string] = copyBuffer(cur)\n } else {\n o2[k as string] = deepCopyObject(cur)\n }\n }\n return o2 as T\n}\n\n/*\nFast deepCopyObjectSimple handling - from fast-json-clone: https://github.com/rhysd/fast-json-clone\n\nBenchmark: https://github.com/AlessioGr/fastest-deep-clone-json/blob/main/test/benchmark.js\n*/\n\n/**\n * A deepCopyObject implementation which only works for JSON objects and arrays, and is faster than\n * JSON.parse(JSON.stringify(obj))\n *\n * @param value The JSON value to be cloned. There are two invariants. 1) It must not contain circles\n * as JSON does not allow it. This function will cause infinite loop for such values by\n * design. 2) It must contain JSON values only. Other values like `Date`, `Regexp`, `Map`,\n * `Set`, `Buffer`, ... are not allowed.\n * @returns The cloned JSON value.\n */\nexport function deepCopyObjectSimple<T extends JsonValue>(value: T, filterUndefined = false): T {\n if (typeof value !== 'object' || value === null) {\n return value\n } else if (Array.isArray(value)) {\n return value.map((e) =>\n typeof e !== 'object' || e === null ? e : deepCopyObjectSimple(e, filterUndefined),\n ) as T\n } else {\n if (value instanceof Date) {\n return new Date(value) as unknown as T\n }\n const ret: { [key: string]: T } = {}\n for (const k in value) {\n const v = value[k]\n if (filterUndefined && v === undefined) {\n continue\n }\n ret[k] =\n typeof v !== 'object' || v === null\n ? v\n : (deepCopyObjectSimple(v as T, filterUndefined) as any)\n }\n return ret as unknown as T\n }\n}\n\nexport function deepCopyObjectSimpleWithoutReactComponents<T extends JsonValue>(value: T): T {\n if (\n typeof value === 'object' &&\n value !== null &&\n '$$typeof' in value &&\n typeof value.$$typeof === 'symbol'\n ) {\n return undefined!\n } else if (typeof value !== 'object' || value === null) {\n return value\n } else if (Array.isArray(value)) {\n return value.map((e) =>\n typeof e !== 'object' || e === null ? e : deepCopyObjectSimpleWithoutReactComponents(e),\n ) as T\n } else {\n if (value instanceof Date) {\n return new Date(value) as unknown as T\n }\n const ret: { [key: string]: T } = {}\n for (const k in value) {\n const v = value[k]\n ret[k] =\n typeof v !== 'object' || v === null\n ? v\n : (deepCopyObjectSimpleWithoutReactComponents(v as T) as any)\n }\n return ret as unknown as T\n }\n}\n\n/**\n * A deepCopyObject implementation which is slower than deepCopyObject, but more correct.\n * Can be used if correctness is more important than speed. Supports circular dependencies\n */\nexport function deepCopyObjectComplex<T>(object: T, cache: WeakMap<any, any> = new WeakMap()): T {\n if (object === null) {\n return null!\n }\n\n if (cache.has(object)) {\n return cache.get(object)\n }\n\n // Handle File\n if (object instanceof File) {\n return object as unknown as T\n }\n\n // Handle Date\n if (object instanceof Date) {\n return new Date(object.getTime()) as unknown as T\n }\n\n // Handle RegExp\n if (object instanceof RegExp) {\n return new RegExp(object.source, object.flags) as unknown as T\n }\n\n // Handle Map\n if (object instanceof Map) {\n const clonedMap = new Map()\n cache.set(object, clonedMap)\n for (const [key, value] of object.entries()) {\n clonedMap.set(key, deepCopyObjectComplex(value, cache))\n }\n return clonedMap as unknown as T\n }\n\n // Handle Set\n if (object instanceof Set) {\n const clonedSet = new Set()\n cache.set(object, clonedSet)\n for (const value of object.values()) {\n clonedSet.add(deepCopyObjectComplex(value, cache))\n }\n return clonedSet as unknown as T\n }\n\n // Handle Array and Object\n if (typeof object === 'object' && object !== null) {\n if ('$$typeof' in object && typeof object.$$typeof === 'symbol') {\n return object\n }\n\n const clonedObject: any = Array.isArray(object)\n ? []\n : Object.create(Object.getPrototypeOf(object))\n cache.set(object, clonedObject)\n\n for (const key in object) {\n if (\n Object.prototype.hasOwnProperty.call(object, key) ||\n Object.getOwnPropertySymbols(object).includes(key as any)\n ) {\n clonedObject[key] = deepCopyObjectComplex(object[key], cache)\n }\n }\n\n return clonedObject as T\n }\n\n // Handle all other cases\n return object\n}\n"],"names":["copyBuffer","cur","Buffer","from","constructor","buffer","slice","byteOffset","length","constructorHandlers","Map","set","Date","o","fn","cloneArray","Array","Set","RegExp","regex","source","flags","handler","a","keys","Object","a2","i","k","get","ArrayBuffer","isView","deepCopyObject","isArray","o2","hasOwnProperty","call","deepCopyObjectSimple","value","filterUndefined","map","e","ret","v","undefined","deepCopyObjectSimpleWithoutReactComponents","$$typeof","deepCopyObjectComplex","object","cache","WeakMap","has","File","getTime","clonedMap","key","entries","clonedSet","values","add","clonedObject","create","getPrototypeOf","prototype","getOwnPropertySymbols","includes"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/deepCopyObject.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { JsonValue } from '../types/index.js'\n\n/*\nMain deepCopyObject handling - from rfdc: https://github.com/davidmarkclements/rfdc/blob/master/index.js\n\nCopyright 2019 \"David Mark Clements <david.mark.clements@gmail.com>\"\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\ndocumentation files (the \"Software\"), to deal in the Software without restriction, including without limitation\nthe rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and\nto permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions\nof the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\nTO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\nTHE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\nCONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\nIN THE SOFTWARE.\n*/\n\nfunction copyBuffer(cur: any) {\n if (cur instanceof Buffer) {\n return Buffer.from(cur)\n }\n\n return new cur.constructor(cur.buffer.slice(), cur.byteOffset, cur.length)\n}\n\nconst constructorHandlers = new Map()\nconstructorHandlers.set(Date, (o: any) => new Date(o))\nconstructorHandlers.set(Map, (o: any, fn: any) => new Map(cloneArray<any>(Array.from(o), fn)))\nconstructorHandlers.set(Set, (o: any, fn: any) => new Set(cloneArray(Array.from(o), fn)))\nconstructorHandlers.set(RegExp, (regex: RegExp) => new RegExp(regex.source, regex.flags))\n\nlet handler: ((o: any, fn: any) => any) | null = null\n\nfunction cloneArray<T extends object>(a: T, fn: (o: any) => any): T {\n const keys = Object.keys(a)\n const a2 = new Array(keys.length) as T\n for (let i = 0; i < keys.length; i++) {\n const k = keys[i] as keyof typeof a\n const cur = a[k] as any\n if (typeof cur !== 'object' || cur === null) {\n a2[k] = cur\n } else if (cur instanceof RegExp) {\n a2[k] = new RegExp(cur.source, cur.flags) as any\n } else if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) {\n a2[k] = handler(cur, fn)\n } else if (ArrayBuffer.isView(cur)) {\n a2[k] = copyBuffer(cur)\n } else {\n a2[k] = fn(cur)\n }\n }\n return a2\n}\n\nexport const deepCopyObject = <T>(o: T): T => {\n if (typeof o !== 'object' || o === null) {\n return o\n }\n if (Array.isArray(o)) {\n return cloneArray(o, deepCopyObject)\n }\n if (o instanceof RegExp) {\n return new RegExp(o.source, o.flags) as T\n }\n\n if (o.constructor !== Object && (handler = constructorHandlers.get(o.constructor))) {\n return handler(o, deepCopyObject)\n }\n const o2 = {} as T\n for (const k in o) {\n if (Object.hasOwnProperty.call(o, k) === false) {\n continue\n }\n const cur = o[k]\n if (typeof cur !== 'object' || cur === null) {\n o2[k] = cur\n } else if (cur instanceof RegExp) {\n o2[k] = new RegExp(cur.source, cur.flags) as any\n } else if (cur.constructor !== Object && (handler = constructorHandlers.get(cur.constructor))) {\n o2[k] = handler(cur, deepCopyObject)\n } else if (ArrayBuffer.isView(cur)) {\n o2[k] = copyBuffer(cur)\n } else {\n o2[k] = deepCopyObject(cur)\n }\n }\n return o2\n}\n\n/*\nFast deepCopyObjectSimple handling - from fast-json-clone: https://github.com/rhysd/fast-json-clone\n\nBenchmark: https://github.com/AlessioGr/fastest-deep-clone-json/blob/main/test/benchmark.js\n*/\n\n/**\n * A deepCopyObject implementation which only works for JSON objects and arrays, and is faster than\n * JSON.parse(JSON.stringify(obj))\n *\n * @param value The JSON value to be cloned. There are two invariants. 1) It must not contain circles\n * as JSON does not allow it. This function will cause infinite loop for such values by\n * design. 2) It must contain JSON values only. Other values like `Date`, `Regexp`, `Map`,\n * `Set`, `Buffer`, ... are not allowed.\n * @returns The cloned JSON value.\n */\nexport function deepCopyObjectSimple<T extends JsonValue>(value: T, filterUndefined = false): T {\n if (typeof value !== 'object' || value === null) {\n return value\n } else if (Array.isArray(value)) {\n return value.map((e) =>\n typeof e !== 'object' || e === null ? e : deepCopyObjectSimple(e, filterUndefined),\n ) as T\n } else {\n if (value instanceof Date) {\n return new Date(value) as unknown as T\n }\n const ret: { [key: string]: T } = {}\n for (const k in value) {\n const v = value[k]\n if (filterUndefined && v === undefined) {\n continue\n }\n ret[k] =\n typeof v !== 'object' || v === null\n ? v\n : (deepCopyObjectSimple(v as T, filterUndefined) as any)\n }\n return ret as unknown as T\n }\n}\n\nexport function deepCopyObjectSimpleWithoutReactComponents<T extends JsonValue>(value: T): T {\n if (\n typeof value === 'object' &&\n value !== null &&\n '$$typeof' in value &&\n typeof value.$$typeof === 'symbol'\n ) {\n return undefined!\n } else if (typeof value !== 'object' || value === null) {\n return value\n } else if (Array.isArray(value)) {\n return value.map((e) =>\n typeof e !== 'object' || e === null ? e : deepCopyObjectSimpleWithoutReactComponents(e),\n ) as T\n } else {\n if (value instanceof Date) {\n return new Date(value) as unknown as T\n }\n const ret: { [key: string]: T } = {}\n for (const k in value) {\n const v = value[k]\n ret[k] =\n typeof v !== 'object' || v === null\n ? v\n : (deepCopyObjectSimpleWithoutReactComponents(v as T) as any)\n }\n return ret as unknown as T\n }\n}\n\n/**\n * A deepCopyObject implementation which is slower than deepCopyObject, but more correct.\n * Can be used if correctness is more important than speed. Supports circular dependencies\n */\nexport function deepCopyObjectComplex<T>(object: T, cache: WeakMap<any, any> = new WeakMap()): T {\n if (object === null) {\n return null!\n }\n\n if (cache.has(object)) {\n return cache.get(object)\n }\n\n // Handle File\n if (object instanceof File) {\n return object as unknown as T\n }\n\n // Handle Date\n if (object instanceof Date) {\n return new Date(object.getTime()) as unknown as T\n }\n\n // Handle RegExp\n if (object instanceof RegExp) {\n return new RegExp(object.source, object.flags) as unknown as T\n }\n\n // Handle Map\n if (object instanceof Map) {\n const clonedMap = new Map()\n cache.set(object, clonedMap)\n for (const [key, value] of object.entries()) {\n clonedMap.set(key, deepCopyObjectComplex(value, cache))\n }\n return clonedMap as unknown as T\n }\n\n // Handle Set\n if (object instanceof Set) {\n const clonedSet = new Set()\n cache.set(object, clonedSet)\n for (const value of object.values()) {\n clonedSet.add(deepCopyObjectComplex(value, cache))\n }\n return clonedSet as unknown as T\n }\n\n // Handle Array and Object\n if (typeof object === 'object' && object !== null) {\n if ('$$typeof' in object && typeof object.$$typeof === 'symbol') {\n return object\n }\n\n const clonedObject: any = Array.isArray(object)\n ? []\n : Object.create(Object.getPrototypeOf(object))\n cache.set(object, clonedObject)\n\n for (const key in object) {\n if (\n Object.prototype.hasOwnProperty.call(object, key) ||\n Object.getOwnPropertySymbols(object).includes(key as any)\n ) {\n clonedObject[key] = deepCopyObjectComplex(object[key], cache)\n }\n }\n\n return clonedObject as T\n }\n\n // Handle all other cases\n return object\n}\n"],"names":["copyBuffer","cur","Buffer","from","constructor","buffer","slice","byteOffset","length","constructorHandlers","Map","set","Date","o","fn","cloneArray","Array","Set","RegExp","regex","source","flags","handler","a","keys","Object","a2","i","k","get","ArrayBuffer","isView","deepCopyObject","isArray","o2","hasOwnProperty","call","deepCopyObjectSimple","value","filterUndefined","map","e","ret","v","undefined","deepCopyObjectSimpleWithoutReactComponents","$$typeof","deepCopyObjectComplex","object","cache","WeakMap","has","File","getTime","clonedMap","key","entries","clonedSet","values","add","clonedObject","create","getPrototypeOf","prototype","getOwnPropertySymbols","includes"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fieldSchemaToJSON.d.ts","sourceRoot":"","sources":["../../src/utilities/fieldSchemaToJSON.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fieldSchemaToJSON.d.ts","sourceRoot":"","sources":["../../src/utilities/fieldSchemaToJSON.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAE7D,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAE7E,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,CAAC,EAAE,eAAe,CAAA;IACxB,MAAM,CAAC,EAAE,eAAe,CAAA;IACxB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,UAAU,CAAA;CACjB,EAAE,CAAA;AAEH,eAAO,MAAM,iBAAiB,WAAY,WAAW,EAAE,UAAU,YAAY,KAAG,eA6G/E,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/fieldSchemaToJSON.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/fieldSchemaToJSON.ts"],"sourcesContent":["import type { ClientConfig } from '../config/client.js'\nimport type { ClientField } from '../fields/config/client.js'\n\nimport { fieldAffectsData, type FieldTypes } from '../fields/config/types.js'\n\nexport type FieldSchemaJSON = {\n blocks?: FieldSchemaJSON // TODO: conditionally add based on `type`\n fields?: FieldSchemaJSON // TODO: conditionally add based on `type`\n hasMany?: boolean // TODO: conditionally add based on `type`\n name: string\n relationTo?: string // TODO: conditionally add based on `type`\n slug?: string // TODO: conditionally add based on `type`\n type: FieldTypes\n}[]\n\nexport const fieldSchemaToJSON = (fields: ClientField[], config: ClientConfig): FieldSchemaJSON => {\n return fields.reduce((acc, field) => {\n let result = acc\n\n switch (field.type) {\n case 'array':\n acc.push({\n name: field.name,\n type: field.type,\n fields: fieldSchemaToJSON(\n [\n ...field.fields,\n {\n name: 'id',\n type: 'text',\n },\n ],\n config,\n ),\n })\n\n break\n\n case 'blocks':\n acc.push({\n name: field.name,\n type: field.type,\n blocks: (field.blockReferences ?? field.blocks).reduce((acc, _block) => {\n const block = typeof _block === 'string' ? config.blocksMap[_block]! : _block\n ;(acc as any)[block.slug] = {\n fields: fieldSchemaToJSON(\n [\n ...block.fields,\n {\n name: 'id',\n type: 'text',\n },\n ],\n config,\n ),\n }\n\n return acc\n }, {} as FieldSchemaJSON),\n })\n\n break\n\n case 'collapsible': // eslint-disable no-fallthrough\n case 'row':\n result = result.concat(fieldSchemaToJSON(field.fields, config))\n break\n\n case 'group':\n if (fieldAffectsData(field)) {\n acc.push({\n name: field.name,\n type: field.type,\n fields: fieldSchemaToJSON(field.fields, config),\n })\n } else {\n result = result.concat(fieldSchemaToJSON(field.fields, config))\n }\n\n break\n\n case 'relationship': // eslint-disable no-fallthrough\n case 'upload':\n acc.push({\n name: field.name,\n type: field.type,\n hasMany: 'hasMany' in field ? Boolean(field.hasMany) : false, // TODO: type this\n relationTo: field.relationTo as string,\n })\n\n break\n\n case 'tabs': {\n let tabFields: FieldSchemaJSON = []\n\n field.tabs.forEach((tab) => {\n if ('name' in tab) {\n tabFields.push({\n name: tab.name,\n type: field.type,\n fields: fieldSchemaToJSON(tab.fields, config),\n })\n return\n }\n\n tabFields = tabFields.concat(fieldSchemaToJSON(tab.fields, config))\n })\n\n result = result.concat(tabFields)\n\n break\n }\n\n default:\n if ('name' in field) {\n acc.push({\n name: field.name,\n type: field.type,\n })\n }\n }\n\n return result\n }, [] as FieldSchemaJSON)\n}\n"],"names":["fieldAffectsData","fieldSchemaToJSON","fields","config","reduce","acc","field","result","type","push","name","blocks","blockReferences","_block","block","blocksMap","slug","concat","hasMany","Boolean","relationTo","tabFields","tabs","forEach","tab"],"mappings":"AAGA,SAASA,gBAAgB,QAAyB,4BAA2B;AAY7E,OAAO,MAAMC,oBAAoB,CAACC,QAAuBC;IACvD,OAAOD,OAAOE,MAAM,CAAC,CAACC,KAAKC;QACzB,IAAIC,SAASF;QAEb,OAAQC,MAAME,IAAI;YAChB,KAAK;gBACHH,IAAII,IAAI,CAAC;oBACPC,MAAMJ,MAAMI,IAAI;oBAChBF,MAAMF,MAAME,IAAI;oBAChBN,QAAQD,kBACN;2BACKK,MAAMJ,MAAM;wBACf;4BACEQ,MAAM;4BACNF,MAAM;wBACR;qBACD,EACDL;gBAEJ;gBAEA;YAEF,KAAK;gBACHE,IAAII,IAAI,CAAC;oBACPC,MAAMJ,MAAMI,IAAI;oBAChBF,MAAMF,MAAME,IAAI;oBAChBG,QAAQ,AAACL,CAAAA,MAAMM,eAAe,IAAIN,MAAMK,MAAM,AAAD,EAAGP,MAAM,CAAC,CAACC,KAAKQ;wBAC3D,MAAMC,QAAQ,OAAOD,WAAW,WAAWV,OAAOY,SAAS,CAACF,OAAO,GAAIA;wBACrER,GAAW,CAACS,MAAME,IAAI,CAAC,GAAG;4BAC1Bd,QAAQD,kBACN;mCACKa,MAAMZ,MAAM;gCACf;oCACEQ,MAAM;oCACNF,MAAM;gCACR;6BACD,EACDL;wBAEJ;wBAEA,OAAOE;oBACT,GAAG,CAAC;gBACN;gBAEA;YAEF,KAAK;YACL,KAAK;gBACHE,SAASA,OAAOU,MAAM,CAAChB,kBAAkBK,MAAMJ,MAAM,EAAEC;gBACvD;YAEF,KAAK;gBACH,IAAIH,iBAAiBM,QAAQ;oBAC3BD,IAAII,IAAI,CAAC;wBACPC,MAAMJ,MAAMI,IAAI;wBAChBF,MAAMF,MAAME,IAAI;wBAChBN,QAAQD,kBAAkBK,MAAMJ,MAAM,EAAEC;oBAC1C;gBACF,OAAO;oBACLI,SAASA,OAAOU,MAAM,CAAChB,kBAAkBK,MAAMJ,MAAM,EAAEC;gBACzD;gBAEA;YAEF,KAAK;YACL,KAAK;gBACHE,IAAII,IAAI,CAAC;oBACPC,MAAMJ,MAAMI,IAAI;oBAChBF,MAAMF,MAAME,IAAI;oBAChBU,SAAS,aAAaZ,QAAQa,QAAQb,MAAMY,OAAO,IAAI;oBACvDE,YAAYd,MAAMc,UAAU;gBAC9B;gBAEA;YAEF,KAAK;gBAAQ;oBACX,IAAIC,YAA6B,EAAE;oBAEnCf,MAAMgB,IAAI,CAACC,OAAO,CAAC,CAACC;wBAClB,IAAI,UAAUA,KAAK;4BACjBH,UAAUZ,IAAI,CAAC;gCACbC,MAAMc,IAAId,IAAI;gCACdF,MAAMF,MAAME,IAAI;gCAChBN,QAAQD,kBAAkBuB,IAAItB,MAAM,EAAEC;4BACxC;4BACA;wBACF;wBAEAkB,YAAYA,UAAUJ,MAAM,CAAChB,kBAAkBuB,IAAItB,MAAM,EAAEC;oBAC7D;oBAEAI,SAASA,OAAOU,MAAM,CAACI;oBAEvB;gBACF;YAEA;gBACE,IAAI,UAAUf,OAAO;oBACnBD,IAAII,IAAI,CAAC;wBACPC,MAAMJ,MAAMI,IAAI;wBAChBF,MAAMF,MAAME,IAAI;oBAClB;gBACF;QACJ;QAEA,OAAOD;IACT,GAAG,EAAE;AACP,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flattenTopLevelFields.d.ts","sourceRoot":"","sources":["../../src/utilities/flattenTopLevelFields.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"flattenTopLevelFields.d.ts","sourceRoot":"","sources":["../../src/utilities/flattenTopLevelFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAK1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAC7D,OAAO,KAAK,EACV,KAAK,EACL,kBAAkB,EAClB,wBAAwB,EACxB,uBAAuB,EACvB,6BAA6B,EAE9B,MAAM,2BAA2B,CAAA;AASlC,KAAK,cAAc,CAAC,MAAM,IAAI,MAAM,SAAS,WAAW,GACpD;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,CAC9C,wBAAwB,GACxB,6BAA6B,CAChC,GACD;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,CAAC,kBAAkB,GAAG,uBAAuB,CAAC,CAAA;AAIpG;;GAEG;AACH,KAAK,oBAAoB,GAAG;IAC1B;;OAEG;IACH,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB;;;;OAIG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAA;IAClC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,CAAA;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,SAAS,WAAW,GAAG,KAAK,EACtE,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,CAAC,EAAE,OAAO,GAAG,oBAAoB,GACvC,cAAc,CAAC,MAAM,CAAC,EAAE,CAkI1B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/flattenTopLevelFields.ts"],"sourcesContent":["// @ts-strict-ignore\nimport type { I18nClient } from '@payloadcms/translations'\n\nimport { getTranslation } from '@payloadcms/translations'\n\nimport type { ClientTab } from '../admin/fields/Tabs.js'\nimport type { ClientField } from '../fields/config/client.js'\nimport type {\n Field,\n FieldAffectingData,\n FieldAffectingDataClient,\n FieldPresentationalOnly,\n FieldPresentationalOnlyClient,\n Tab,\n} from '../fields/config/types.js'\n\nimport {\n fieldAffectsData,\n fieldHasSubFields,\n fieldIsPresentationalOnly,\n tabHasName,\n} from '../fields/config/types.js'\n\ntype FlattenedField<TField> = TField extends ClientField\n ? { accessor?: string; labelWithPrefix?: string } & (\n | FieldAffectingDataClient\n | FieldPresentationalOnlyClient\n )\n : { accessor?: string; labelWithPrefix?: string } & (FieldAffectingData | FieldPresentationalOnly)\n\ntype TabType<TField> = TField extends ClientField ? ClientTab : Tab\n\n/**\n * Options to control how fields are flattened.\n */\ntype FlattenFieldsOptions = {\n /**\n * i18n context used for translating `label` values via `getTranslation`.\n */\n i18n?: I18nClient\n /**\n * If true, presentational-only fields (like UI fields) will be included\n * in the output. Otherwise, they will be skipped.\n * Default: false.\n */\n keepPresentationalFields?: boolean\n /**\n * A label prefix to prepend to translated labels when building `labelWithPrefix`.\n * Used recursively when flattening nested fields.\n */\n labelPrefix?: string\n /**\n * If true, nested fields inside `group` & `tabs` fields will be lifted to the top level\n * and given contextual `accessor` and `labelWithPrefix` values.\n * Default: false.\n */\n moveSubFieldsToTop?: boolean\n /**\n * A path prefix to prepend to field names when building the `accessor`.\n * Used recursively when flattening nested fields.\n */\n pathPrefix?: string\n}\n\n/**\n * Flattens a collection's fields into a single array of fields, optionally\n * extracting nested fields in group fields.\n *\n * @param fields - Array of fields to flatten\n * @param options - Options to control the flattening behavior\n */\nexport function flattenTopLevelFields<TField extends ClientField | Field>(\n fields: TField[],\n options?: boolean | FlattenFieldsOptions,\n): FlattenedField<TField>[] {\n const normalizedOptions: FlattenFieldsOptions =\n typeof options === 'boolean' ? { keepPresentationalFields: options } : (options ?? {})\n\n const {\n i18n,\n keepPresentationalFields,\n labelPrefix,\n moveSubFieldsToTop = false,\n pathPrefix,\n } = normalizedOptions\n\n return fields.reduce<FlattenedField<TField>[]>((acc, field) => {\n if (field.type === 'group' && 'fields' in field) {\n if (moveSubFieldsToTop) {\n const isNamedGroup = 'name' in field && typeof field.name === 'string' && !!field.name\n const groupName = 'name' in field ? field.name : undefined\n\n const translatedLabel =\n 'label' in field && field.label && i18n\n ? getTranslation(field.label as string, i18n)\n : undefined\n\n const labelWithPrefix = labelPrefix\n ? `${labelPrefix} > ${translatedLabel ?? groupName}`\n : (translatedLabel ?? groupName)\n\n const nameWithPrefix =\n 'name' in field && field.name\n ? pathPrefix\n ? `${pathPrefix}-${field.name}`\n : field.name\n : pathPrefix\n\n acc.push(\n // Need to include the top-level group field when hoisting its subfields,\n // so that `buildColumnState` can detect and render a column if the group\n // has a custom admin Cell component defined in its configuration.\n // See: packages/ui/src/providers/TableColumns/buildColumnState/index.tsx\n field as FlattenedField<TField>,\n ...flattenTopLevelFields(field.fields as TField[], {\n i18n,\n keepPresentationalFields,\n labelPrefix: isNamedGroup ? labelWithPrefix : labelPrefix,\n moveSubFieldsToTop,\n pathPrefix: isNamedGroup ? nameWithPrefix : pathPrefix,\n }),\n )\n } else {\n // Hoisting diabled - keep as top level field\n acc.push(field as FlattenedField<TField>)\n }\n } else if (field.type === 'tabs' && 'tabs' in field) {\n return [\n ...acc,\n ...field.tabs.reduce<FlattenedField<TField>[]>((tabFields, tab: TabType<TField>) => {\n if (tabHasName(tab)) {\n if (moveSubFieldsToTop) {\n const translatedLabel =\n 'label' in tab && tab.label && i18n ? getTranslation(tab.label, i18n) : undefined\n\n const labelWithPrefixForTab = labelPrefix\n ? `${labelPrefix} > ${translatedLabel ?? tab.name}`\n : (translatedLabel ?? tab.name)\n\n const pathPrefixForTab = tab.name\n ? pathPrefix\n ? `${pathPrefix}-${tab.name}`\n : tab.name\n : pathPrefix\n\n return [\n ...tabFields,\n ...flattenTopLevelFields(tab.fields as TField[], {\n i18n,\n keepPresentationalFields,\n labelPrefix: labelWithPrefixForTab,\n moveSubFieldsToTop,\n pathPrefix: pathPrefixForTab,\n }),\n ]\n } else {\n // Named tab, hoisting disabled: keep as top-level field\n return [\n ...tabFields,\n {\n ...tab,\n type: 'tab',\n } as unknown as FlattenedField<TField>,\n ]\n }\n } else {\n // Unnamed tab: always hoist its fields\n return [...tabFields, ...flattenTopLevelFields<TField>(tab.fields as TField[], options)]\n }\n }, []),\n ]\n } else if (fieldHasSubFields(field) && ['collapsible', 'row'].includes(field.type)) {\n // Recurse into row and collapsible\n acc.push(...flattenTopLevelFields(field.fields as TField[], options))\n } else if (\n fieldAffectsData(field) ||\n (keepPresentationalFields && fieldIsPresentationalOnly(field))\n ) {\n // Ignore nested `id` fields when inside nested structure\n if (field.name === 'id' && labelPrefix !== undefined) {\n return acc\n }\n\n const translatedLabel =\n 'label' in field && field.label && i18n ? getTranslation(field.label, i18n) : undefined\n\n const name = 'name' in field ? field.name : undefined\n\n const isHoistingFromGroup = pathPrefix !== undefined || labelPrefix !== undefined\n\n acc.push({\n ...(field as FlattenedField<TField>),\n ...(moveSubFieldsToTop &&\n isHoistingFromGroup && {\n accessor: pathPrefix && name ? `${pathPrefix}-${name}` : (name ?? ''),\n labelWithPrefix: labelPrefix\n ? `${labelPrefix} > ${translatedLabel ?? name}`\n : (translatedLabel ?? name),\n }),\n })\n }\n\n return acc\n }, [])\n}\n"],"names":["getTranslation","fieldAffectsData","fieldHasSubFields","fieldIsPresentationalOnly","tabHasName","flattenTopLevelFields","fields","options","normalizedOptions","keepPresentationalFields","i18n","labelPrefix","moveSubFieldsToTop","pathPrefix","reduce","acc","field","type","isNamedGroup","name","groupName","undefined","translatedLabel","label","labelWithPrefix","nameWithPrefix","push","tabs","tabFields","tab","labelWithPrefixForTab","pathPrefixForTab","includes","isHoistingFromGroup","accessor"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/flattenTopLevelFields.ts"],"sourcesContent":["import type { I18nClient } from '@payloadcms/translations'\n\nimport { getTranslation } from '@payloadcms/translations'\n\nimport type { ClientTab } from '../admin/fields/Tabs.js'\nimport type { ClientField } from '../fields/config/client.js'\nimport type {\n Field,\n FieldAffectingData,\n FieldAffectingDataClient,\n FieldPresentationalOnly,\n FieldPresentationalOnlyClient,\n Tab,\n} from '../fields/config/types.js'\n\nimport {\n fieldAffectsData,\n fieldHasSubFields,\n fieldIsPresentationalOnly,\n tabHasName,\n} from '../fields/config/types.js'\n\ntype FlattenedField<TField> = TField extends ClientField\n ? { accessor?: string; labelWithPrefix?: string } & (\n | FieldAffectingDataClient\n | FieldPresentationalOnlyClient\n )\n : { accessor?: string; labelWithPrefix?: string } & (FieldAffectingData | FieldPresentationalOnly)\n\ntype TabType<TField> = TField extends ClientField ? ClientTab : Tab\n\n/**\n * Options to control how fields are flattened.\n */\ntype FlattenFieldsOptions = {\n /**\n * i18n context used for translating `label` values via `getTranslation`.\n */\n i18n?: I18nClient\n /**\n * If true, presentational-only fields (like UI fields) will be included\n * in the output. Otherwise, they will be skipped.\n * Default: false.\n */\n keepPresentationalFields?: boolean\n /**\n * A label prefix to prepend to translated labels when building `labelWithPrefix`.\n * Used recursively when flattening nested fields.\n */\n labelPrefix?: string\n /**\n * If true, nested fields inside `group` & `tabs` fields will be lifted to the top level\n * and given contextual `accessor` and `labelWithPrefix` values.\n * Default: false.\n */\n moveSubFieldsToTop?: boolean\n /**\n * A path prefix to prepend to field names when building the `accessor`.\n * Used recursively when flattening nested fields.\n */\n pathPrefix?: string\n}\n\n/**\n * Flattens a collection's fields into a single array of fields, optionally\n * extracting nested fields in group fields.\n *\n * @param fields - Array of fields to flatten\n * @param options - Options to control the flattening behavior\n */\nexport function flattenTopLevelFields<TField extends ClientField | Field>(\n fields: TField[],\n options?: boolean | FlattenFieldsOptions,\n): FlattenedField<TField>[] {\n const normalizedOptions: FlattenFieldsOptions =\n typeof options === 'boolean' ? { keepPresentationalFields: options } : (options ?? {})\n\n const {\n i18n,\n keepPresentationalFields,\n labelPrefix,\n moveSubFieldsToTop = false,\n pathPrefix,\n } = normalizedOptions\n\n return fields.reduce<FlattenedField<TField>[]>((acc, field) => {\n if (field.type === 'group' && 'fields' in field) {\n if (moveSubFieldsToTop) {\n const isNamedGroup = 'name' in field && typeof field.name === 'string' && !!field.name\n const groupName = 'name' in field ? field.name : undefined\n\n const translatedLabel =\n 'label' in field && field.label && i18n\n ? getTranslation(field.label as string, i18n)\n : undefined\n\n const labelWithPrefix = labelPrefix\n ? `${labelPrefix} > ${translatedLabel ?? groupName}`\n : (translatedLabel ?? groupName)\n\n const nameWithPrefix =\n 'name' in field && field.name\n ? pathPrefix\n ? `${pathPrefix}-${field.name}`\n : field.name\n : pathPrefix\n\n acc.push(\n // Need to include the top-level group field when hoisting its subfields,\n // so that `buildColumnState` can detect and render a column if the group\n // has a custom admin Cell component defined in its configuration.\n // See: packages/ui/src/providers/TableColumns/buildColumnState/index.tsx\n field as FlattenedField<TField>,\n ...flattenTopLevelFields(field.fields as TField[], {\n i18n,\n keepPresentationalFields,\n labelPrefix: isNamedGroup ? labelWithPrefix : labelPrefix,\n moveSubFieldsToTop,\n pathPrefix: isNamedGroup ? nameWithPrefix : pathPrefix,\n }),\n )\n } else {\n // Hoisting diabled - keep as top level field\n acc.push(field as FlattenedField<TField>)\n }\n } else if (field.type === 'tabs' && 'tabs' in field) {\n return [\n ...acc,\n ...field.tabs.reduce<FlattenedField<TField>[]>((tabFields, tab) => {\n if (tabHasName(tab)) {\n if (moveSubFieldsToTop) {\n const translatedLabel =\n 'label' in tab && tab.label && i18n ? getTranslation(tab.label, i18n) : undefined\n\n const labelWithPrefixForTab = labelPrefix\n ? `${labelPrefix} > ${translatedLabel ?? tab.name}`\n : (translatedLabel ?? tab.name)\n\n const pathPrefixForTab = tab.name\n ? pathPrefix\n ? `${pathPrefix}-${tab.name}`\n : tab.name\n : pathPrefix\n\n return [\n ...tabFields,\n ...flattenTopLevelFields(tab.fields as TField[], {\n i18n,\n keepPresentationalFields,\n labelPrefix: labelWithPrefixForTab,\n moveSubFieldsToTop,\n pathPrefix: pathPrefixForTab,\n }),\n ]\n } else {\n // Named tab, hoisting disabled: keep as top-level field\n return [\n ...tabFields,\n {\n ...tab,\n type: 'tab',\n } as unknown as FlattenedField<TField>,\n ]\n }\n } else {\n // Unnamed tab: always hoist its fields\n return [...tabFields, ...flattenTopLevelFields<TField>(tab.fields as TField[], options)]\n }\n }, []),\n ]\n } else if (fieldHasSubFields(field) && ['collapsible', 'row'].includes(field.type)) {\n // Recurse into row and collapsible\n acc.push(...flattenTopLevelFields(field.fields as TField[], options))\n } else if (\n fieldAffectsData(field) ||\n (keepPresentationalFields && fieldIsPresentationalOnly(field))\n ) {\n // Ignore nested `id` fields when inside nested structure\n if (field.name === 'id' && labelPrefix !== undefined) {\n return acc\n }\n\n const translatedLabel =\n 'label' in field && field.label && i18n ? getTranslation(field.label, i18n) : undefined\n\n const name = 'name' in field ? field.name : undefined\n\n const isHoistingFromGroup = pathPrefix !== undefined || labelPrefix !== undefined\n\n acc.push({\n ...(field as FlattenedField<TField>),\n ...(moveSubFieldsToTop &&\n isHoistingFromGroup && {\n accessor: pathPrefix && name ? `${pathPrefix}-${name}` : (name ?? ''),\n labelWithPrefix: labelPrefix\n ? `${labelPrefix} > ${translatedLabel ?? name}`\n : (translatedLabel ?? name),\n }),\n })\n }\n\n return acc\n }, [])\n}\n"],"names":["getTranslation","fieldAffectsData","fieldHasSubFields","fieldIsPresentationalOnly","tabHasName","flattenTopLevelFields","fields","options","normalizedOptions","keepPresentationalFields","i18n","labelPrefix","moveSubFieldsToTop","pathPrefix","reduce","acc","field","type","isNamedGroup","name","groupName","undefined","translatedLabel","label","labelWithPrefix","nameWithPrefix","push","tabs","tabFields","tab","labelWithPrefixForTab","pathPrefixForTab","includes","isHoistingFromGroup","accessor"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatErrors.d.ts","sourceRoot":"","sources":["../../src/utilities/formatErrors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"formatErrors.d.ts","sourceRoot":"","sources":["../../src/utilities/formatErrors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAKrD,eAAO,MAAM,YAAY,aAAc;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,GAAG,QAAQ,KAAG,WA8D9E,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/formatErrors.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/formatErrors.ts"],"sourcesContent":["import type { ErrorResult } from '../config/types.js'\nimport type { APIError } from '../errors/APIError.js'\n\nimport { APIErrorName } from '../errors/APIError.js'\nimport { ValidationErrorName } from '../errors/ValidationError.js'\n\nexport const formatErrors = (incoming: { [key: string]: unknown } | APIError): ErrorResult => {\n if (incoming) {\n // Cannot use `instanceof` to check error type: https://github.com/microsoft/TypeScript/issues/13965\n // Instead, get the prototype of the incoming error and check its constructor name\n const proto = Object.getPrototypeOf(incoming)\n\n // Payload 'ValidationError' and 'APIError'\n if (\n (proto.constructor.name === ValidationErrorName || proto.constructor.name === APIErrorName) &&\n incoming.data\n ) {\n return {\n errors: [\n {\n name: incoming.name,\n data: incoming.data,\n message: incoming.message,\n },\n ],\n }\n }\n\n // Mongoose 'ValidationError': https://mongoosejs.com/docs/api/error.html#Error.ValidationError\n if (proto.constructor.name === ValidationErrorName && 'errors' in incoming && incoming.errors) {\n return {\n errors: Object.keys(incoming.errors).reduce(\n (acc, key) => {\n acc.push({\n field: (incoming.errors as any)[key].path,\n message: (incoming.errors as any)[key].message,\n })\n return acc\n },\n [] as { field: string; message: string }[],\n ),\n }\n }\n\n if (Array.isArray(incoming.message)) {\n return {\n errors: incoming.message,\n }\n }\n\n if (incoming.name) {\n return {\n errors: [\n {\n message: incoming.message,\n },\n ],\n }\n }\n }\n\n return {\n errors: [\n {\n message: 'An unknown error occurred.',\n },\n ],\n }\n}\n"],"names":["APIErrorName","ValidationErrorName","formatErrors","incoming","proto","Object","getPrototypeOf","constructor","name","data","errors","message","keys","reduce","acc","key","push","field","path","Array","isArray"],"mappings":"AAGA,SAASA,YAAY,QAAQ,wBAAuB;AACpD,SAASC,mBAAmB,QAAQ,+BAA8B;AAElE,OAAO,MAAMC,eAAe,CAACC;IAC3B,IAAIA,UAAU;QACZ,oGAAoG;QACpG,kFAAkF;QAClF,MAAMC,QAAQC,OAAOC,cAAc,CAACH;QAEpC,2CAA2C;QAC3C,IACE,AAACC,CAAAA,MAAMG,WAAW,CAACC,IAAI,KAAKP,uBAAuBG,MAAMG,WAAW,CAACC,IAAI,KAAKR,YAAW,KACzFG,SAASM,IAAI,EACb;YACA,OAAO;gBACLC,QAAQ;oBACN;wBACEF,MAAML,SAASK,IAAI;wBACnBC,MAAMN,SAASM,IAAI;wBACnBE,SAASR,SAASQ,OAAO;oBAC3B;iBACD;YACH;QACF;QAEA,+FAA+F;QAC/F,IAAIP,MAAMG,WAAW,CAACC,IAAI,KAAKP,uBAAuB,YAAYE,YAAYA,SAASO,MAAM,EAAE;YAC7F,OAAO;gBACLA,QAAQL,OAAOO,IAAI,CAACT,SAASO,MAAM,EAAEG,MAAM,CACzC,CAACC,KAAKC;oBACJD,IAAIE,IAAI,CAAC;wBACPC,OAAO,AAACd,SAASO,MAAM,AAAQ,CAACK,IAAI,CAACG,IAAI;wBACzCP,SAAS,AAACR,SAASO,MAAM,AAAQ,CAACK,IAAI,CAACJ,OAAO;oBAChD;oBACA,OAAOG;gBACT,GACA,EAAE;YAEN;QACF;QAEA,IAAIK,MAAMC,OAAO,CAACjB,SAASQ,OAAO,GAAG;YACnC,OAAO;gBACLD,QAAQP,SAASQ,OAAO;YAC1B;QACF;QAEA,IAAIR,SAASK,IAAI,EAAE;YACjB,OAAO;gBACLE,QAAQ;oBACN;wBACEC,SAASR,SAASQ,OAAO;oBAC3B;iBACD;YACH;QACF;IACF;IAEA,OAAO;QACLD,QAAQ;YACN;gBACEC,SAAS;YACX;SACD;IACH;AACF,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getCollectionIDFieldTypes.d.ts","sourceRoot":"","sources":["../../src/utilities/getCollectionIDFieldTypes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"getCollectionIDFieldTypes.d.ts","sourceRoot":"","sources":["../../src/utilities/getCollectionIDFieldTypes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEzD;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,EACxC,MAAM,EACN,aAAa,GACd,EAAE;IACD,MAAM,EAAE,eAAe,CAAA;IACvB,aAAa,EAAE,QAAQ,GAAG,MAAM,CAAA;CACjC,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAA;CAAE,CAiBzC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/getCollectionIDFieldTypes.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/getCollectionIDFieldTypes.ts"],"sourcesContent":["import type { SanitizedConfig } from '../config/types.js'\n\n/**\n * While the default ID is determined by the db adapter, it can still differ for a collection if they\n * define a custom ID field. This builds a map of collection slugs to their ID field type.\n * @param defaultIDType as defined by the database adapter\n */\nexport function getCollectionIDFieldTypes({\n config,\n defaultIDType,\n}: {\n config: SanitizedConfig\n defaultIDType: 'number' | 'text'\n}): { [key: string]: 'number' | 'string' } {\n return config.collections.reduce(\n (acc, collection) => {\n const customCollectionIdField = collection.fields.find(\n (field) => 'name' in field && field.name === 'id',\n )\n\n acc[collection.slug] = defaultIDType === 'text' ? 'string' : 'number'\n\n if (customCollectionIdField) {\n acc[collection.slug] = customCollectionIdField.type === 'number' ? 'number' : 'string'\n }\n\n return acc\n },\n {} as Record<string, 'number' | 'string'>,\n )\n}\n"],"names":["getCollectionIDFieldTypes","config","defaultIDType","collections","reduce","acc","collection","customCollectionIdField","fields","find","field","name","slug","type"],"mappings":"AAEA;;;;CAIC,GACD,OAAO,SAASA,0BAA0B,EACxCC,MAAM,EACNC,aAAa,EAId;IACC,OAAOD,OAAOE,WAAW,CAACC,MAAM,CAC9B,CAACC,KAAKC;QACJ,MAAMC,0BAA0BD,WAAWE,MAAM,CAACC,IAAI,CACpD,CAACC,QAAU,UAAUA,SAASA,MAAMC,IAAI,KAAK;QAG/CN,GAAG,CAACC,WAAWM,IAAI,CAAC,GAAGV,kBAAkB,SAAS,WAAW;QAE7D,IAAIK,yBAAyB;YAC3BF,GAAG,CAACC,WAAWM,IAAI,CAAC,GAAGL,wBAAwBM,IAAI,KAAK,WAAW,WAAW;QAChF;QAEA,OAAOR;IACT,GACA,CAAC;AAEL"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getDataByPath.d.ts","sourceRoot":"","sources":["../../src/utilities/getDataByPath.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"getDataByPath.d.ts","sourceRoot":"","sources":["../../src/utilities/getDataByPath.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAIlD,eAAO,MAAM,aAAa,GAAI,CAAC,oBAAoB,SAAS,QAAQ,MAAM,KAAG,CAkB5E,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/getDataByPath.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/getDataByPath.ts"],"sourcesContent":["import type { FormState } from '../admin/types.js'\n\nimport { unflatten } from './unflatten.js'\n\nexport const getDataByPath = <T = unknown>(fields: FormState, path: string): T => {\n const pathPrefixToRemove = path.substring(0, path.lastIndexOf('.') + 1)\n const name = path.split('.').pop()\n\n const data: Record<string, any> = {}\n Object.keys(fields).forEach((key) => {\n if (!fields[key]?.disableFormData && (key.indexOf(`${path}.`) === 0 || key === path)) {\n data[key.replace(pathPrefixToRemove, '')] = fields[key]?.value\n\n if (fields[key]?.rows && fields[key].rows.length === 0) {\n data[key.replace(pathPrefixToRemove, '')] = []\n }\n }\n })\n\n const unflattenedData = unflatten(data)\n\n return unflattenedData?.[name!]\n}\n"],"names":["unflatten","getDataByPath","fields","path","pathPrefixToRemove","substring","lastIndexOf","name","split","pop","data","Object","keys","forEach","key","disableFormData","indexOf","replace","value","rows","length","unflattenedData"],"mappings":"AAEA,SAASA,SAAS,QAAQ,iBAAgB;AAE1C,OAAO,MAAMC,gBAAgB,CAAcC,QAAmBC;IAC5D,MAAMC,qBAAqBD,KAAKE,SAAS,CAAC,GAAGF,KAAKG,WAAW,CAAC,OAAO;IACrE,MAAMC,OAAOJ,KAAKK,KAAK,CAAC,KAAKC,GAAG;IAEhC,MAAMC,OAA4B,CAAC;IACnCC,OAAOC,IAAI,CAACV,QAAQW,OAAO,CAAC,CAACC;QAC3B,IAAI,CAACZ,MAAM,CAACY,IAAI,EAAEC,mBAAoBD,CAAAA,IAAIE,OAAO,CAAC,GAAGb,KAAK,CAAC,CAAC,MAAM,KAAKW,QAAQX,IAAG,GAAI;YACpFO,IAAI,CAACI,IAAIG,OAAO,CAACb,oBAAoB,IAAI,GAAGF,MAAM,CAACY,IAAI,EAAEI;YAEzD,IAAIhB,MAAM,CAACY,IAAI,EAAEK,QAAQjB,MAAM,CAACY,IAAI,CAACK,IAAI,CAACC,MAAM,KAAK,GAAG;gBACtDV,IAAI,CAACI,IAAIG,OAAO,CAACb,oBAAoB,IAAI,GAAG,EAAE;YAChD;QACF;IACF;IAEA,MAAMiB,kBAAkBrB,UAAUU;IAElC,OAAOW,iBAAiB,CAACd,KAAM;AACjC,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getEntityPolicies.d.ts","sourceRoot":"","sources":["../../src/utilities/getEntityPolicies.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"getEntityPolicies.d.ts","sourceRoot":"","sources":["../../src/utilities/getEntityPolicies.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AACjG,OAAO,KAAK,EAAE,yBAAyB,EAAc,MAAM,gCAAgC,CAAA;AAG3F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAuB,cAAc,EAAS,MAAM,mBAAmB,CAAA;AAKlG,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAA;AAC7F,KAAK,IAAI,GAAG;IACV,aAAa,EAAE,aAAa,CAAA;IAC5B,MAAM,EAAE,yBAAyB,GAAG,qBAAqB,CAAA;IACzD,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACpB,UAAU,EAAE,aAAa,EAAE,CAAA;IAC3B,GAAG,EAAE,cAAc,CAAA;IACnB,IAAI,EAAE,YAAY,GAAG,QAAQ,CAAA;CAC9B,CAAA;AAED,KAAK,UAAU,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,QAAQ,GACxD,gBAAgB,GAChB,oBAAoB,CAAA;AAYxB;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,SAAS,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAsIvF"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
// @ts-strict-ignore
|
|
2
1
|
import { combineQueries } from '../database/combineQueries.js';
|
|
3
2
|
import { tabHasName } from '../fields/config/types.js';
|
|
4
3
|
/**
|
|
@@ -69,7 +68,8 @@ import { tabHasName } from '../fields/config/types.js';
|
|
|
69
68
|
});
|
|
70
69
|
}
|
|
71
70
|
}
|
|
72
|
-
const createAccessPromise = async ({ access, accessLevel, disableWhere = false, operation, policiesObj
|
|
71
|
+
const createAccessPromise = async ({ access, accessLevel, disableWhere = false, operation, policiesObj })=>{
|
|
72
|
+
const mutablePolicies = policiesObj;
|
|
73
73
|
if (accessLevel === 'field' && docBeingAccessed === undefined) {
|
|
74
74
|
// assign docBeingAccessed first as the promise to avoid multiple calls to getEntityDoc
|
|
75
75
|
docBeingAccessed = getEntityDoc().then((doc)=>{
|
|
@@ -109,6 +109,7 @@ import { tabHasName } from '../fields/config/types.js';
|
|
|
109
109
|
policiesObj: policies
|
|
110
110
|
});
|
|
111
111
|
} else {
|
|
112
|
+
;
|
|
112
113
|
policies[operation] = {
|
|
113
114
|
permission: isLoggedIn
|
|
114
115
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/getEntityPolicies.ts"],"sourcesContent":["// @ts-strict-ignore\nimport type { CollectionPermission, FieldsPermissions, GlobalPermission } from '../auth/types.js'\nimport type { SanitizedCollectionConfig, TypeWithID } from '../collections/config/types.js'\nimport type { Access } from '../config/types.js'\nimport type { Field, FieldAccess } from '../fields/config/types.js'\nimport type { SanitizedGlobalConfig } from '../globals/config/types.js'\nimport type { BlockSlug } from '../index.js'\nimport type { AllOperations, JsonObject, Payload, PayloadRequest, Where } from '../types/index.js'\n\nimport { combineQueries } from '../database/combineQueries.js'\nimport { tabHasName } from '../fields/config/types.js'\n\nexport type BlockPolicies = Record<BlockSlug, FieldsPermissions | Promise<FieldsPermissions>>\ntype Args = {\n blockPolicies: BlockPolicies\n entity: SanitizedCollectionConfig | SanitizedGlobalConfig\n id?: number | string\n operations: AllOperations[]\n req: PayloadRequest\n type: 'collection' | 'global'\n}\n\ntype ReturnType<T extends Args> = T['type'] extends 'global'\n ? GlobalPermission\n : CollectionPermission\n\ntype CreateAccessPromise = (args: {\n access: Access | FieldAccess\n accessLevel: 'entity' | 'field'\n disableWhere?: boolean\n operation: AllOperations\n policiesObj: CollectionPermission | GlobalPermission\n}) => Promise<void>\n\ntype EntityDoc = JsonObject | TypeWithID\n\n/**\n * Build up permissions object for an entity (collection or global)\n */\nexport async function getEntityPolicies<T extends Args>(args: T): Promise<ReturnType<T>> {\n const { id, type, blockPolicies, entity, operations, req } = args\n const { data, locale, payload, user } = req\n const isLoggedIn = !!user\n\n const policies = {\n fields: {},\n } as ReturnType<T>\n\n let docBeingAccessed: EntityDoc | Promise<EntityDoc | undefined> | undefined\n\n async function getEntityDoc({\n operation,\n where,\n }: { operation?: AllOperations; where?: Where } = {}): Promise<EntityDoc | undefined> {\n if (!entity.slug) {\n return undefined\n }\n\n if (type === 'global') {\n return payload.findGlobal({\n slug: entity.slug,\n depth: 0,\n fallbackLocale: null,\n locale,\n overrideAccess: true,\n req,\n })\n }\n\n if (type === 'collection' && id) {\n if (typeof where === 'object') {\n const options = {\n collection: entity.slug,\n depth: 0,\n fallbackLocale: null,\n limit: 1,\n locale,\n overrideAccess: true,\n req,\n }\n\n if (operation === 'readVersions') {\n const paginatedRes = await payload.findVersions({\n ...options,\n where: combineQueries(where, { parent: { equals: id } }),\n })\n return paginatedRes?.docs?.[0] || undefined\n }\n\n const paginatedRes = await payload.find({\n ...options,\n pagination: false,\n where: combineQueries(where, { id: { equals: id } }),\n })\n\n return paginatedRes?.docs?.[0] || undefined\n }\n\n return payload.findByID({\n id,\n collection: entity.slug,\n depth: 0,\n fallbackLocale: null,\n locale,\n overrideAccess: true,\n req,\n })\n }\n }\n\n const createAccessPromise: CreateAccessPromise = async ({\n access,\n accessLevel,\n disableWhere = false,\n operation,\n policiesObj: mutablePolicies,\n }) => {\n if (accessLevel === 'field' && docBeingAccessed === undefined) {\n // assign docBeingAccessed first as the promise to avoid multiple calls to getEntityDoc\n docBeingAccessed = getEntityDoc().then((doc) => {\n docBeingAccessed = doc\n })\n }\n\n // awaiting the promise to ensure docBeingAccessed is assigned before it is used\n await docBeingAccessed\n\n // https://payloadcms.slack.com/archives/C048Z9C2BEX/p1702054928343769\n const accessResult = await access({ id, data, doc: docBeingAccessed, req })\n\n // Where query was returned from access function => check if document is returned when querying with where\n if (typeof accessResult === 'object' && !disableWhere) {\n mutablePolicies[operation] = {\n permission:\n id || type === 'global'\n ? !!(await getEntityDoc({ operation, where: accessResult }))\n : true,\n where: accessResult,\n }\n } else if (mutablePolicies[operation]?.permission !== false) {\n mutablePolicies[operation] = {\n permission: !!accessResult,\n }\n }\n }\n\n for (const operation of operations) {\n if (typeof entity.access[operation] === 'function') {\n await createAccessPromise({\n access: entity.access[operation],\n accessLevel: 'entity',\n operation,\n policiesObj: policies,\n })\n } else {\n policies[operation] = {\n permission: isLoggedIn,\n }\n }\n\n await executeFieldPolicies({\n blockPolicies,\n createAccessPromise,\n entityPermission: policies[operation].permission as boolean,\n fields: entity.fields,\n operation,\n payload,\n policiesObj: policies,\n })\n }\n\n return policies\n}\n\n/**\n * Build up permissions object and run access functions for each field of an entity\n */\nconst executeFieldPolicies = async ({\n blockPolicies,\n createAccessPromise,\n entityPermission,\n fields,\n operation,\n payload,\n policiesObj,\n}: {\n blockPolicies: BlockPolicies\n createAccessPromise: CreateAccessPromise\n entityPermission: boolean\n fields: Field[]\n operation: AllOperations\n payload: Payload\n policiesObj: CollectionPermission | FieldsPermissions | GlobalPermission\n}) => {\n const mutablePolicies = policiesObj.fields\n\n // Fields don't have all operations of a collection\n if (operation === 'delete' || operation === 'readVersions' || operation === 'unlock') {\n return\n }\n\n await Promise.all(\n fields.map(async (field) => {\n if ('name' in field && field.name) {\n if (!mutablePolicies[field.name]) {\n mutablePolicies[field.name] = {}\n }\n\n if ('access' in field && field.access && typeof field.access[operation] === 'function') {\n await createAccessPromise({\n access: field.access[operation],\n accessLevel: 'field',\n disableWhere: true,\n operation,\n policiesObj: mutablePolicies[field.name],\n })\n } else {\n mutablePolicies[field.name][operation] = {\n permission: policiesObj[operation]?.permission,\n }\n }\n\n if ('fields' in field && field.fields) {\n if (!mutablePolicies[field.name].fields) {\n mutablePolicies[field.name].fields = {}\n }\n\n await executeFieldPolicies({\n blockPolicies,\n createAccessPromise,\n entityPermission,\n fields: field.fields,\n operation,\n payload,\n policiesObj: mutablePolicies[field.name],\n })\n }\n\n if (\n ('blocks' in field && field.blocks?.length) ||\n ('blockReferences' in field && field.blockReferences?.length)\n ) {\n if (!mutablePolicies[field.name]?.blocks) {\n mutablePolicies[field.name].blocks = {}\n }\n\n await Promise.all(\n (field.blockReferences ?? field.blocks).map(async (_block) => {\n const block = typeof _block === 'string' ? payload.blocks[_block]! : _block\n\n if (typeof _block === 'string') {\n if (blockPolicies[_block]) {\n if (typeof blockPolicies[_block].then === 'function') {\n // Earlier access to this block is still pending, so await it instead of re-running executeFieldPolicies\n mutablePolicies[field.name].blocks[block.slug] = await blockPolicies[_block]\n } else {\n // It's already a resolved policy object\n mutablePolicies[field.name].blocks[block.slug] = blockPolicies[_block]\n }\n return\n } else {\n // We have not seen this block slug yet. Immediately create a promise\n // so that any parallel calls will just await this same promise\n // instead of re-running executeFieldPolicies.\n blockPolicies[_block] = (async () => {\n // If the block doesn’t exist yet in our mutablePolicies, initialize it\n if (!mutablePolicies[field.name].blocks?.[block.slug]) {\n mutablePolicies[field.name].blocks[block.slug] = {\n fields: {},\n [operation]: { permission: entityPermission },\n }\n } else if (!mutablePolicies[field.name].blocks[block.slug][operation]) {\n mutablePolicies[field.name].blocks[block.slug][operation] = {\n permission: entityPermission,\n }\n }\n\n await executeFieldPolicies({\n blockPolicies,\n createAccessPromise,\n entityPermission,\n fields: block.fields,\n operation,\n payload,\n policiesObj: mutablePolicies[field.name].blocks[block.slug],\n })\n\n return mutablePolicies[field.name].blocks[block.slug]\n })()\n\n mutablePolicies[field.name].blocks[block.slug] = await blockPolicies[_block]\n blockPolicies[_block] = mutablePolicies[field.name].blocks[block.slug]\n return\n }\n }\n\n if (!mutablePolicies[field.name].blocks?.[block.slug]) {\n mutablePolicies[field.name].blocks[block.slug] = {\n fields: {},\n [operation]: { permission: entityPermission },\n }\n } else if (!mutablePolicies[field.name].blocks[block.slug][operation]) {\n mutablePolicies[field.name].blocks[block.slug][operation] = {\n permission: entityPermission,\n }\n }\n\n await executeFieldPolicies({\n blockPolicies,\n createAccessPromise,\n entityPermission,\n fields: block.fields,\n operation,\n payload,\n policiesObj: mutablePolicies[field.name].blocks[block.slug],\n })\n }),\n )\n }\n } else if ('fields' in field && field.fields) {\n await executeFieldPolicies({\n blockPolicies,\n createAccessPromise,\n entityPermission,\n fields: field.fields,\n operation,\n payload,\n policiesObj,\n })\n } else if (field.type === 'tabs') {\n await Promise.all(\n field.tabs.map(async (tab) => {\n if (tabHasName(tab)) {\n if (!mutablePolicies[tab.name]) {\n mutablePolicies[tab.name] = {\n fields: {},\n [operation]: { permission: entityPermission },\n }\n } else if (!mutablePolicies[tab.name][operation]) {\n mutablePolicies[tab.name][operation] = { permission: entityPermission }\n }\n await executeFieldPolicies({\n blockPolicies,\n createAccessPromise,\n entityPermission,\n fields: tab.fields,\n operation,\n payload,\n policiesObj: mutablePolicies[tab.name],\n })\n } else {\n await executeFieldPolicies({\n blockPolicies,\n createAccessPromise,\n entityPermission,\n fields: tab.fields,\n operation,\n payload,\n policiesObj,\n })\n }\n }),\n )\n }\n }),\n )\n}\n"],"names":["combineQueries","tabHasName","getEntityPolicies","args","id","type","blockPolicies","entity","operations","req","data","locale","payload","user","isLoggedIn","policies","fields","docBeingAccessed","getEntityDoc","operation","where","slug","undefined","findGlobal","depth","fallbackLocale","overrideAccess","options","collection","limit","paginatedRes","findVersions","parent","equals","docs","find","pagination","findByID","createAccessPromise","access","accessLevel","disableWhere","policiesObj","mutablePolicies","then","doc","accessResult","permission","executeFieldPolicies","entityPermission","Promise","all","map","field","name","blocks","length","blockReferences","_block","block","tabs","tab"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/getEntityPolicies.ts"],"sourcesContent":["import type { CollectionPermission, FieldsPermissions, GlobalPermission } from '../auth/types.js'\nimport type { SanitizedCollectionConfig, TypeWithID } from '../collections/config/types.js'\nimport type { Access } from '../config/types.js'\nimport type { Field, FieldAccess } from '../fields/config/types.js'\nimport type { SanitizedGlobalConfig } from '../globals/config/types.js'\nimport type { BlockSlug } from '../index.js'\nimport type { AllOperations, JsonObject, Payload, PayloadRequest, Where } from '../types/index.js'\n\nimport { combineQueries } from '../database/combineQueries.js'\nimport { tabHasName } from '../fields/config/types.js'\n\nexport type BlockPolicies = Record<BlockSlug, FieldsPermissions | Promise<FieldsPermissions>>\ntype Args = {\n blockPolicies: BlockPolicies\n entity: SanitizedCollectionConfig | SanitizedGlobalConfig\n id?: number | string\n operations: AllOperations[]\n req: PayloadRequest\n type: 'collection' | 'global'\n}\n\ntype ReturnType<T extends Args> = T['type'] extends 'global'\n ? GlobalPermission\n : CollectionPermission\n\ntype CreateAccessPromise = (args: {\n access: Access | FieldAccess\n accessLevel: 'entity' | 'field'\n disableWhere?: boolean\n operation: AllOperations\n policiesObj: CollectionPermission | GlobalPermission\n}) => Promise<void>\n\ntype EntityDoc = JsonObject | TypeWithID\n\n/**\n * Build up permissions object for an entity (collection or global)\n */\nexport async function getEntityPolicies<T extends Args>(args: T): Promise<ReturnType<T>> {\n const { id, type, blockPolicies, entity, operations, req } = args\n const { data, locale, payload, user } = req\n const isLoggedIn = !!user\n\n const policies = {\n fields: {},\n } as ReturnType<T>\n\n let docBeingAccessed: EntityDoc | Promise<EntityDoc | undefined> | undefined\n\n async function getEntityDoc({\n operation,\n where,\n }: { operation?: AllOperations; where?: Where } = {}): Promise<EntityDoc | undefined> {\n if (!entity.slug) {\n return undefined\n }\n\n if (type === 'global') {\n return payload.findGlobal({\n slug: entity.slug,\n depth: 0,\n fallbackLocale: null,\n locale,\n overrideAccess: true,\n req,\n })\n }\n\n if (type === 'collection' && id) {\n if (typeof where === 'object') {\n const options = {\n collection: entity.slug,\n depth: 0,\n fallbackLocale: null,\n limit: 1,\n locale,\n overrideAccess: true,\n req,\n }\n\n if (operation === 'readVersions') {\n const paginatedRes = await payload.findVersions({\n ...options,\n where: combineQueries(where, { parent: { equals: id } }),\n })\n return paginatedRes?.docs?.[0] || undefined\n }\n\n const paginatedRes = await payload.find({\n ...options,\n pagination: false,\n where: combineQueries(where, { id: { equals: id } }),\n })\n\n return paginatedRes?.docs?.[0] || undefined\n }\n\n return payload.findByID({\n id,\n collection: entity.slug,\n depth: 0,\n fallbackLocale: null,\n locale,\n overrideAccess: true,\n req,\n })\n }\n }\n\n const createAccessPromise: CreateAccessPromise = async ({\n access,\n accessLevel,\n disableWhere = false,\n operation,\n policiesObj,\n }) => {\n const mutablePolicies = policiesObj as Record<string, any>\n if (accessLevel === 'field' && docBeingAccessed === undefined) {\n // assign docBeingAccessed first as the promise to avoid multiple calls to getEntityDoc\n docBeingAccessed = getEntityDoc().then((doc) => {\n docBeingAccessed = doc\n })\n }\n\n // awaiting the promise to ensure docBeingAccessed is assigned before it is used\n await docBeingAccessed\n\n // https://payloadcms.slack.com/archives/C048Z9C2BEX/p1702054928343769\n const accessResult = await access({ id, data, doc: docBeingAccessed, req })\n\n // Where query was returned from access function => check if document is returned when querying with where\n if (typeof accessResult === 'object' && !disableWhere) {\n mutablePolicies[operation] = {\n permission:\n id || type === 'global'\n ? !!(await getEntityDoc({ operation, where: accessResult }))\n : true,\n where: accessResult,\n }\n } else if (mutablePolicies[operation]?.permission !== false) {\n mutablePolicies[operation] = {\n permission: !!accessResult,\n }\n }\n }\n\n for (const operation of operations) {\n if (typeof entity.access[operation as keyof typeof entity.access] === 'function') {\n await createAccessPromise({\n access: entity.access[operation as keyof typeof entity.access],\n accessLevel: 'entity',\n operation,\n policiesObj: policies,\n })\n } else {\n ;(policies as any)[operation] = {\n permission: isLoggedIn,\n }\n }\n\n await executeFieldPolicies({\n blockPolicies,\n createAccessPromise,\n entityPermission: (policies as any)[operation].permission as boolean,\n fields: entity.fields,\n operation,\n payload,\n policiesObj: policies,\n })\n }\n\n return policies\n}\n\n/**\n * Build up permissions object and run access functions for each field of an entity\n */\nconst executeFieldPolicies = async ({\n blockPolicies,\n createAccessPromise,\n entityPermission,\n fields,\n operation,\n payload,\n policiesObj,\n}: {\n blockPolicies: BlockPolicies\n createAccessPromise: CreateAccessPromise\n entityPermission: boolean\n fields: Field[]\n operation: AllOperations\n payload: Payload\n policiesObj: CollectionPermission | FieldsPermissions | GlobalPermission\n}) => {\n const mutablePolicies = policiesObj.fields as Record<string, any>\n\n // Fields don't have all operations of a collection\n if (operation === 'delete' || operation === 'readVersions' || operation === 'unlock') {\n return\n }\n\n await Promise.all(\n fields.map(async (field) => {\n if ('name' in field && field.name) {\n if (!mutablePolicies[field.name]) {\n mutablePolicies[field.name] = {}\n }\n\n if ('access' in field && field.access && typeof field.access[operation] === 'function') {\n await createAccessPromise({\n access: field.access[operation],\n accessLevel: 'field',\n disableWhere: true,\n operation,\n policiesObj: mutablePolicies[field.name],\n })\n } else {\n mutablePolicies[field.name][operation] = {\n permission: (policiesObj as any)[operation]?.permission,\n }\n }\n\n if ('fields' in field && field.fields) {\n if (!mutablePolicies[field.name].fields) {\n mutablePolicies[field.name].fields = {}\n }\n\n await executeFieldPolicies({\n blockPolicies,\n createAccessPromise,\n entityPermission,\n fields: field.fields,\n operation,\n payload,\n policiesObj: mutablePolicies[field.name],\n })\n }\n\n if (\n ('blocks' in field && field.blocks?.length) ||\n ('blockReferences' in field && field.blockReferences?.length)\n ) {\n if (!mutablePolicies[field.name]?.blocks) {\n mutablePolicies[field.name].blocks = {}\n }\n\n await Promise.all(\n (field.blockReferences ?? field.blocks).map(async (_block) => {\n const block = typeof _block === 'string' ? payload.blocks[_block]! : _block\n\n if (typeof _block === 'string') {\n if (blockPolicies[_block]) {\n if (typeof blockPolicies[_block].then === 'function') {\n // Earlier access to this block is still pending, so await it instead of re-running executeFieldPolicies\n mutablePolicies[field.name].blocks[block.slug] = await blockPolicies[_block]\n } else {\n // It's already a resolved policy object\n mutablePolicies[field.name].blocks[block.slug] = blockPolicies[_block]\n }\n return\n } else {\n // We have not seen this block slug yet. Immediately create a promise\n // so that any parallel calls will just await this same promise\n // instead of re-running executeFieldPolicies.\n blockPolicies[_block] = (async () => {\n // If the block doesn’t exist yet in our mutablePolicies, initialize it\n if (!mutablePolicies[field.name].blocks?.[block.slug]) {\n mutablePolicies[field.name].blocks[block.slug] = {\n fields: {},\n [operation]: { permission: entityPermission },\n }\n } else if (!mutablePolicies[field.name].blocks[block.slug][operation]) {\n mutablePolicies[field.name].blocks[block.slug][operation] = {\n permission: entityPermission,\n }\n }\n\n await executeFieldPolicies({\n blockPolicies,\n createAccessPromise,\n entityPermission,\n fields: block.fields,\n operation,\n payload,\n policiesObj: mutablePolicies[field.name].blocks[block.slug],\n })\n\n return mutablePolicies[field.name].blocks[block.slug]\n })()\n\n mutablePolicies[field.name].blocks[block.slug] = await blockPolicies[_block]\n blockPolicies[_block] = mutablePolicies[field.name].blocks[block.slug]\n return\n }\n }\n\n if (!mutablePolicies[field.name].blocks?.[block.slug]) {\n mutablePolicies[field.name].blocks[block.slug] = {\n fields: {},\n [operation]: { permission: entityPermission },\n }\n } else if (!mutablePolicies[field.name].blocks[block.slug][operation]) {\n mutablePolicies[field.name].blocks[block.slug][operation] = {\n permission: entityPermission,\n }\n }\n\n await executeFieldPolicies({\n blockPolicies,\n createAccessPromise,\n entityPermission,\n fields: block.fields,\n operation,\n payload,\n policiesObj: mutablePolicies[field.name].blocks[block.slug],\n })\n }),\n )\n }\n } else if ('fields' in field && field.fields) {\n await executeFieldPolicies({\n blockPolicies,\n createAccessPromise,\n entityPermission,\n fields: field.fields,\n operation,\n payload,\n policiesObj,\n })\n } else if (field.type === 'tabs') {\n await Promise.all(\n field.tabs.map(async (tab) => {\n if (tabHasName(tab)) {\n if (!mutablePolicies[tab.name]) {\n mutablePolicies[tab.name] = {\n fields: {},\n [operation]: { permission: entityPermission },\n }\n } else if (!mutablePolicies[tab.name][operation]) {\n mutablePolicies[tab.name][operation] = { permission: entityPermission }\n }\n await executeFieldPolicies({\n blockPolicies,\n createAccessPromise,\n entityPermission,\n fields: tab.fields,\n operation,\n payload,\n policiesObj: mutablePolicies[tab.name],\n })\n } else {\n await executeFieldPolicies({\n blockPolicies,\n createAccessPromise,\n entityPermission,\n fields: tab.fields,\n operation,\n payload,\n policiesObj,\n })\n }\n }),\n )\n }\n }),\n )\n}\n"],"names":["combineQueries","tabHasName","getEntityPolicies","args","id","type","blockPolicies","entity","operations","req","data","locale","payload","user","isLoggedIn","policies","fields","docBeingAccessed","getEntityDoc","operation","where","slug","undefined","findGlobal","depth","fallbackLocale","overrideAccess","options","collection","limit","paginatedRes","findVersions","parent","equals","docs","find","pagination","findByID","createAccessPromise","access","accessLevel","disableWhere","policiesObj","mutablePolicies","then","doc","accessResult","permission","executeFieldPolicies","entityPermission","Promise","all","map","field","name","blocks","length","blockReferences","_block","block","tabs","tab"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getFieldPermissions.d.ts","sourceRoot":"","sources":["../../src/utilities/getFieldPermissions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAA;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAA;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAElD;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,mDAK7B;IACD,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,KAAK,CAAA;IACnC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAA;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,WAAW,EAChB;QACE,CAAC,SAAS,EAAE,MAAM,GAAG,yBAAyB,CAAA;KAC/C,GACD,yBAAyB,CAAA;CAC9B,KAAG;IACF,SAAS,EAAE,OAAO,CAAA;IAClB,WAAW,EAAE,yBAAyB,CAAA;IACtC,IAAI,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"getFieldPermissions.d.ts","sourceRoot":"","sources":["../../src/utilities/getFieldPermissions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAA;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAA;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAElD;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,mDAK7B;IACD,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,KAAK,CAAA;IACnC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAA;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,WAAW,EAChB;QACE,CAAC,SAAS,EAAE,MAAM,GAAG,yBAAyB,CAAA;KAC/C,GACD,yBAAyB,CAAA;CAC9B,KAAG;IACF,SAAS,EAAE,OAAO,CAAA;IAClB,WAAW,EAAE,yBAAyB,CAAA;IACtC,IAAI,EAAE,OAAO,CAAA;CA4Bb,CAAA"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */ /**
|
|
3
2
|
* Gets read and operation-level permissions for a given field based on cascading field permissions.
|
|
4
3
|
* @returns An object with the following properties:
|
|
5
4
|
* - `operation`: Whether the user has permission to perform the operation on the field (`create` or `update`).
|
|
@@ -7,7 +6,7 @@
|
|
|
7
6
|
* - `read`: Whether the user has permission to read the field.
|
|
8
7
|
*/ export const getFieldPermissions = ({ field, operation, parentName, permissions })=>({
|
|
9
8
|
operation: permissions === true || permissions?.[operation] === true || permissions?.[parentName] === true || 'name' in field && typeof permissions === 'object' && permissions?.[field.name] && (permissions[field.name] === true || operation in permissions[field.name] && permissions[field.name][operation]),
|
|
10
|
-
permissions: permissions === undefined || permissions === null || permissions === true ? true : 'name' in field ? permissions
|
|
9
|
+
permissions: permissions === undefined || permissions === null || permissions === true ? true : 'name' in field ? permissions[field.name] : permissions,
|
|
11
10
|
read: permissions === true || permissions?.read === true || permissions?.[parentName] === true || 'name' in field && typeof permissions === 'object' && permissions?.[field.name] && (permissions[field.name] === true || 'read' in permissions[field.name] && permissions[field.name].read)
|
|
12
11
|
});
|
|
13
12
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/getFieldPermissions.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/getFieldPermissions.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { SanitizedFieldPermissions } from '../auth/types.js'\nimport type { ClientField, Field } from '../fields/config/types.js'\nimport type { Operation } from '../types/index.js'\n\n/**\n * Gets read and operation-level permissions for a given field based on cascading field permissions.\n * @returns An object with the following properties:\n * - `operation`: Whether the user has permission to perform the operation on the field (`create` or `update`).\n * - `permissions`: The field-level permissions.\n * - `read`: Whether the user has permission to read the field.\n */\nexport const getFieldPermissions = ({\n field,\n operation,\n parentName,\n permissions,\n}: {\n readonly field: ClientField | Field\n readonly operation: Operation\n readonly parentName: string\n readonly permissions:\n | {\n [fieldName: string]: SanitizedFieldPermissions\n }\n | SanitizedFieldPermissions\n}): {\n operation: boolean\n permissions: SanitizedFieldPermissions\n read: boolean\n} => ({\n operation:\n permissions === true ||\n permissions?.[operation as keyof typeof permissions] === true ||\n permissions?.[parentName as keyof typeof permissions] === true ||\n ('name' in field &&\n typeof permissions === 'object' &&\n permissions?.[field.name as keyof typeof permissions] &&\n (permissions[field.name as keyof typeof permissions] === true ||\n (operation in (permissions as any)[field.name] &&\n (permissions as any)[field.name][operation]))),\n\n permissions:\n permissions === undefined || permissions === null || permissions === true\n ? true\n : 'name' in field\n ? (permissions as any)[field.name]\n : permissions,\n read:\n permissions === true ||\n permissions?.read === true ||\n permissions?.[parentName as keyof typeof permissions] === true ||\n ('name' in field &&\n typeof permissions === 'object' &&\n permissions?.[field.name as keyof typeof permissions] &&\n ((permissions as any)[field.name] === true ||\n ('read' in (permissions as any)[field.name] && (permissions as any)[field.name].read))),\n})\n"],"names":["getFieldPermissions","field","operation","parentName","permissions","name","undefined","read"],"mappings":"AAAA,qDAAqD,GAKrD;;;;;;CAMC,GACD,OAAO,MAAMA,sBAAsB,CAAC,EAClCC,KAAK,EACLC,SAAS,EACTC,UAAU,EACVC,WAAW,EAUZ,GAIK,CAAA;QACJF,WACEE,gBAAgB,QAChBA,aAAa,CAACF,UAAsC,KAAK,QACzDE,aAAa,CAACD,WAAuC,KAAK,QACzD,UAAUF,SACT,OAAOG,gBAAgB,YACvBA,aAAa,CAACH,MAAMI,IAAI,CAA6B,IACpDD,CAAAA,WAAW,CAACH,MAAMI,IAAI,CAA6B,KAAK,QACtDH,aAAa,AAACE,WAAmB,CAACH,MAAMI,IAAI,CAAC,IAC5C,AAACD,WAAmB,CAACH,MAAMI,IAAI,CAAC,CAACH,UAAU;QAEnDE,aACEA,gBAAgBE,aAAaF,gBAAgB,QAAQA,gBAAgB,OACjE,OACA,UAAUH,QACR,AAACG,WAAmB,CAACH,MAAMI,IAAI,CAAC,GAChCD;QACRG,MACEH,gBAAgB,QAChBA,aAAaG,SAAS,QACtBH,aAAa,CAACD,WAAuC,KAAK,QACzD,UAAUF,SACT,OAAOG,gBAAgB,YACvBA,aAAa,CAACH,MAAMI,IAAI,CAA6B,IACpD,CAAA,AAACD,WAAmB,CAACH,MAAMI,IAAI,CAAC,KAAK,QACnC,UAAU,AAACD,WAAmB,CAACH,MAAMI,IAAI,CAAC,IAAI,AAACD,WAAmB,CAACH,MAAMI,IAAI,CAAC,CAACE,IAAI;IAC5F,CAAA,EAAE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getObjectDotNotation.d.ts","sourceRoot":"","sources":["../../src/utilities/getObjectDotNotation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"getObjectDotNotation.d.ts","sourceRoot":"","sources":["../../src/utilities/getObjectDotNotation.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,GAAI,CAAC,OAC/B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QACtB,MAAM,iBACG,CAAC,KACf,CAMF,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/getObjectDotNotation.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/getObjectDotNotation.ts"],"sourcesContent":["export const getObjectDotNotation = <T>(\n obj: Record<string, unknown>,\n path: string,\n defaultValue?: T,\n): T => {\n if (!path || !obj) {\n return defaultValue!\n }\n const result = path.split('.').reduce((o, i) => o?.[i] as Record<string, unknown>, obj)\n return result === undefined ? defaultValue! : (result as T)\n}\n"],"names":["getObjectDotNotation","obj","path","defaultValue","result","split","reduce","o","i","undefined"],"mappings":"AAAA,OAAO,MAAMA,uBAAuB,CAClCC,KACAC,MACAC;IAEA,IAAI,CAACD,QAAQ,CAACD,KAAK;QACjB,OAAOE;IACT;IACA,MAAMC,SAASF,KAAKG,KAAK,CAAC,KAAKC,MAAM,CAAC,CAACC,GAAGC,IAAMD,GAAG,CAACC,EAAE,EAA6BP;IACnF,OAAOG,WAAWK,YAAYN,eAAiBC;AACjD,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getSiblingData.d.ts","sourceRoot":"","sources":["../../src/utilities/getSiblingData.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"getSiblingData.d.ts","sourceRoot":"","sources":["../../src/utilities/getSiblingData.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAKxD,eAAO,MAAM,cAAc,WAAY,SAAS,QAAQ,MAAM,KAAG,IAqChE,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/getSiblingData.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/getSiblingData.ts"],"sourcesContent":["import type { Data, FormState } from '../admin/types.js'\n\nimport { reduceFieldsToValues } from './reduceFieldsToValues.js'\nimport { unflatten } from './unflatten.js'\n\nexport const getSiblingData = (fields: FormState, path: string): Data => {\n if (!fields) {\n return null!\n }\n\n if (path.indexOf('.') === -1) {\n return reduceFieldsToValues(fields, true)\n }\n\n const siblingFields: Record<string, any> = {}\n\n // Determine if the last segment of the path is an array-based row\n const pathSegments = path.split('.')\n const lastSegment = pathSegments[pathSegments.length - 1]\n const lastSegmentIsRowIndex = !Number.isNaN(Number(lastSegment))\n\n let parentFieldPath: string\n\n if (lastSegmentIsRowIndex) {\n // If the last segment is a row index,\n // the sibling data is that row's contents\n // so create a parent field path that will\n // retrieve all contents of that row index only\n parentFieldPath = `${path}.`\n } else {\n // Otherwise, the last path segment is a field name\n // and it should be removed\n parentFieldPath = path.substring(0, path.lastIndexOf('.') + 1)\n }\n\n Object.keys(fields).forEach((fieldKey) => {\n if (!fields[fieldKey]?.disableFormData && fieldKey.indexOf(parentFieldPath) === 0) {\n siblingFields[fieldKey.replace(parentFieldPath, '')] = fields[fieldKey]?.value\n }\n })\n\n return unflatten(siblingFields)\n}\n"],"names":["reduceFieldsToValues","unflatten","getSiblingData","fields","path","indexOf","siblingFields","pathSegments","split","lastSegment","length","lastSegmentIsRowIndex","Number","isNaN","parentFieldPath","substring","lastIndexOf","Object","keys","forEach","fieldKey","disableFormData","replace","value"],"mappings":"AAEA,SAASA,oBAAoB,QAAQ,4BAA2B;AAChE,SAASC,SAAS,QAAQ,iBAAgB;AAE1C,OAAO,MAAMC,iBAAiB,CAACC,QAAmBC;IAChD,IAAI,CAACD,QAAQ;QACX,OAAO;IACT;IAEA,IAAIC,KAAKC,OAAO,CAAC,SAAS,CAAC,GAAG;QAC5B,OAAOL,qBAAqBG,QAAQ;IACtC;IAEA,MAAMG,gBAAqC,CAAC;IAE5C,kEAAkE;IAClE,MAAMC,eAAeH,KAAKI,KAAK,CAAC;IAChC,MAAMC,cAAcF,YAAY,CAACA,aAAaG,MAAM,GAAG,EAAE;IACzD,MAAMC,wBAAwB,CAACC,OAAOC,KAAK,CAACD,OAAOH;IAEnD,IAAIK;IAEJ,IAAIH,uBAAuB;QACzB,sCAAsC;QACtC,0CAA0C;QAC1C,0CAA0C;QAC1C,+CAA+C;QAC/CG,kBAAkB,GAAGV,KAAK,CAAC,CAAC;IAC9B,OAAO;QACL,mDAAmD;QACnD,2BAA2B;QAC3BU,kBAAkBV,KAAKW,SAAS,CAAC,GAAGX,KAAKY,WAAW,CAAC,OAAO;IAC9D;IAEAC,OAAOC,IAAI,CAACf,QAAQgB,OAAO,CAAC,CAACC;QAC3B,IAAI,CAACjB,MAAM,CAACiB,SAAS,EAAEC,mBAAmBD,SAASf,OAAO,CAACS,qBAAqB,GAAG;YACjFR,aAAa,CAACc,SAASE,OAAO,CAACR,iBAAiB,IAAI,GAAGX,MAAM,CAACiB,SAAS,EAAEG;QAC3E;IACF;IAEA,OAAOtB,UAAUK;AACnB,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getUniqueListBy.d.ts","sourceRoot":"","sources":["../../src/utilities/getUniqueListBy.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"getUniqueListBy.d.ts","sourceRoot":"","sources":["../../src/utilities/getUniqueListBy.ts"],"names":[],"mappings":"AAAA,wBAAgB,eAAe,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,CAE7D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/getUniqueListBy.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/getUniqueListBy.ts"],"sourcesContent":["export function getUniqueListBy<T>(arr: T[], key: string): T[] {\n return [...new Map(arr.map((item) => [item[key as keyof T], item])).values()]\n}\n"],"names":["getUniqueListBy","arr","key","Map","map","item","values"],"mappings":"AAAA,OAAO,SAASA,gBAAmBC,GAAQ,EAAEC,GAAW;IACtD,OAAO;WAAI,IAAIC,IAAIF,IAAIG,GAAG,CAAC,CAACC,OAAS;gBAACA,IAAI,CAACH,IAAe;gBAAEG;aAAK,GAAGC,MAAM;KAAG;AAC/E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handleEndpoints.d.ts","sourceRoot":"","sources":["../../src/utilities/handleEndpoints.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"handleEndpoints.d.ts","sourceRoot":"","sources":["../../src/utilities/handleEndpoints.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAA4B,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAyBnF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,eAAe,yDAKzB;IACD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,CAAA;IAClD,qCAAqC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,OAAO,CAAA;CACjB,KAAG,OAAO,CAAC,QAAQ,CA2KnB,CAAA"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
// @ts-strict-ignore
|
|
2
1
|
import { status as httpStatus } from 'http-status';
|
|
3
2
|
import { match } from 'path-to-regexp';
|
|
4
3
|
import { createPayloadRequest } from './createPayloadRequest.js';
|
|
@@ -175,7 +174,8 @@ const notFoundResponse = (req, pathname)=>{
|
|
|
175
174
|
status: response.status,
|
|
176
175
|
statusText: response.statusText
|
|
177
176
|
});
|
|
178
|
-
} catch (
|
|
177
|
+
} catch (_err) {
|
|
178
|
+
const err = _err;
|
|
179
179
|
return routeError({
|
|
180
180
|
collection,
|
|
181
181
|
config: incomingConfig,
|