payload 3.0.0-alpha.48 → 3.0.0-alpha.49
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/config.d.ts +4 -1
- package/config.js +4 -1
- package/dist/admin/RichText.d.ts +3 -7
- package/dist/admin/RichText.d.ts.map +1 -1
- package/dist/admin/RichText.js.map +1 -1
- package/dist/admin/forms/Error.d.ts +1 -0
- package/dist/admin/forms/Error.d.ts.map +1 -1
- package/dist/admin/forms/Error.js.map +1 -1
- package/dist/admin/forms/Form.d.ts +5 -0
- package/dist/admin/forms/Form.d.ts.map +1 -1
- package/dist/admin/forms/Form.js.map +1 -1
- package/dist/admin/forms/Label.d.ts +2 -1
- package/dist/admin/forms/Label.d.ts.map +1 -1
- package/dist/admin/forms/Label.js.map +1 -1
- package/dist/admin/forms/RowLabel.d.ts +2 -9
- package/dist/admin/forms/RowLabel.d.ts.map +1 -1
- package/dist/admin/forms/RowLabel.js.map +1 -1
- package/dist/admin/types.d.ts +2 -2
- package/dist/admin/types.d.ts.map +1 -1
- package/dist/admin/types.js.map +1 -1
- package/dist/admin/views/types.d.ts +8 -3
- package/dist/admin/views/types.d.ts.map +1 -1
- package/dist/admin/views/types.js.map +1 -1
- package/dist/auth/baseFields/apiKey.js +1 -1
- package/dist/auth/baseFields/apiKey.js.map +1 -1
- package/dist/auth/cookies.d.ts +4 -0
- package/dist/auth/cookies.d.ts.map +1 -1
- package/dist/auth/cookies.js +1 -1
- package/dist/auth/cookies.js.map +1 -1
- package/dist/auth/operations/forgotPassword.js +1 -1
- package/dist/auth/operations/forgotPassword.js.map +1 -1
- package/dist/auth/operations/login.d.ts +1 -5
- package/dist/auth/operations/login.d.ts.map +1 -1
- package/dist/auth/operations/login.js +0 -3
- package/dist/auth/operations/login.js.map +1 -1
- package/dist/auth/operations/me.d.ts +4 -4
- package/dist/auth/operations/me.d.ts.map +1 -1
- package/dist/auth/operations/me.js.map +1 -1
- package/dist/auth/operations/registerFirstUser.d.ts +1 -9
- package/dist/auth/operations/registerFirstUser.d.ts.map +1 -1
- package/dist/auth/operations/resetPassword.js +1 -1
- package/dist/auth/operations/resetPassword.js.map +1 -1
- package/dist/auth/strategies/apiKey.d.ts.map +1 -1
- package/dist/auth/strategies/apiKey.js +2 -0
- package/dist/auth/strategies/apiKey.js.map +1 -1
- package/dist/auth/strategies/local/incrementLoginAttempts.d.ts.map +1 -1
- package/dist/auth/strategies/local/incrementLoginAttempts.js +2 -0
- package/dist/auth/strategies/local/incrementLoginAttempts.js.map +1 -1
- package/dist/auth/strategies/local/register.d.ts.map +1 -1
- package/dist/auth/strategies/local/register.js +3 -0
- package/dist/auth/strategies/local/register.js.map +1 -1
- package/dist/auth/strategies/local/resetLoginAttempts.d.ts.map +1 -1
- package/dist/auth/strategies/local/resetLoginAttempts.js +1 -0
- package/dist/auth/strategies/local/resetLoginAttempts.js.map +1 -1
- package/dist/auth/types.d.ts +6 -1
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/auth/types.js.map +1 -1
- package/dist/collections/config/client.d.ts +311 -0
- package/dist/collections/config/client.d.ts.map +1 -0
- package/dist/collections/config/client.js +56 -0
- package/dist/collections/config/client.js.map +1 -0
- package/dist/collections/config/defaults.d.ts +5 -5
- package/dist/collections/config/sanitize.d.ts.map +1 -1
- package/dist/collections/config/sanitize.js +4 -0
- package/dist/collections/config/sanitize.js.map +1 -1
- package/dist/collections/config/schema.d.ts.map +1 -1
- package/dist/collections/config/schema.js +0 -3
- package/dist/collections/config/schema.js.map +1 -1
- package/dist/collections/config/types.d.ts +4 -36
- package/dist/collections/config/types.d.ts.map +1 -1
- package/dist/collections/config/types.js.map +1 -1
- package/dist/collections/operations/create.d.ts +1 -9
- package/dist/collections/operations/create.d.ts.map +1 -1
- package/dist/collections/operations/delete.d.ts +2 -10
- package/dist/collections/operations/delete.d.ts.map +1 -1
- package/dist/collections/operations/duplicate.d.ts +14 -0
- package/dist/collections/operations/duplicate.d.ts.map +1 -0
- package/dist/collections/operations/duplicate.js +275 -0
- package/dist/collections/operations/duplicate.js.map +1 -0
- package/dist/collections/operations/find.d.ts.map +1 -1
- package/dist/collections/operations/findByID.d.ts.map +1 -1
- package/dist/collections/operations/findVersionByID.d.ts.map +1 -1
- package/dist/collections/operations/findVersions.d.ts.map +1 -1
- package/dist/collections/operations/local/create.js +1 -1
- package/dist/collections/operations/local/create.js.map +1 -1
- package/dist/collections/operations/local/duplicate.d.ts +21 -0
- package/dist/collections/operations/local/duplicate.d.ts.map +1 -0
- package/dist/collections/operations/local/duplicate.js +22 -0
- package/dist/collections/operations/local/duplicate.js.map +1 -0
- package/dist/collections/operations/local/index.d.ts +7 -5
- package/dist/collections/operations/local/index.d.ts.map +1 -1
- package/dist/collections/operations/local/index.js +2 -0
- package/dist/collections/operations/local/index.js.map +1 -1
- package/dist/collections/operations/local/update.js +1 -1
- package/dist/collections/operations/local/update.js.map +1 -1
- package/dist/collections/operations/restoreVersion.d.ts.map +1 -1
- package/dist/collections/operations/update.d.ts +1 -5
- package/dist/collections/operations/update.d.ts.map +1 -1
- package/dist/collections/operations/updateByID.d.ts +1 -9
- package/dist/collections/operations/updateByID.d.ts.map +1 -1
- package/dist/collections/operations/utils.d.ts +1 -1
- package/dist/collections/operations/utils.d.ts.map +1 -1
- package/dist/config/client.d.ts +14 -0
- package/dist/config/client.d.ts.map +1 -0
- package/dist/config/client.js +59 -0
- package/dist/config/client.js.map +1 -0
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +0 -2
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +3 -4
- package/dist/config/load.js.map +1 -1
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +0 -2
- package/dist/config/schema.js.map +1 -1
- package/dist/config/types.d.ts +23 -20
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js.map +1 -1
- package/dist/config/validate.d.ts +1 -2
- package/dist/config/validate.d.ts.map +1 -1
- package/dist/config/validate.js +3 -4
- package/dist/config/validate.js.map +1 -1
- package/dist/database/types.d.ts +2 -2
- package/dist/database/types.d.ts.map +1 -1
- package/dist/database/types.js.map +1 -1
- package/dist/exports/config.d.ts +4 -1
- package/dist/exports/config.d.ts.map +1 -1
- package/dist/exports/config.js +4 -1
- package/dist/exports/config.js.map +1 -1
- package/dist/exports/operations.d.ts +1 -0
- package/dist/exports/operations.d.ts.map +1 -1
- package/dist/exports/operations.js +1 -0
- package/dist/exports/operations.js.map +1 -1
- package/dist/exports/types.d.ts +9 -4
- package/dist/exports/types.d.ts.map +1 -1
- package/dist/exports/types.js.map +1 -1
- package/dist/exports/uploads.d.ts +2 -0
- package/dist/exports/uploads.d.ts.map +1 -0
- package/dist/exports/uploads.js +3 -0
- package/dist/exports/uploads.js.map +1 -0
- package/dist/exports/utilities.d.ts +4 -1
- package/dist/exports/utilities.d.ts.map +1 -1
- package/dist/exports/utilities.js +4 -1
- package/dist/exports/utilities.js.map +1 -1
- package/dist/fields/config/client.d.ts +1272 -0
- package/dist/{config/createClientConfig.d.ts.map → fields/config/client.d.ts.map} +1 -1
- package/dist/fields/config/client.js +54 -0
- package/dist/fields/config/client.js.map +1 -0
- package/dist/fields/config/sanitize.d.ts.map +1 -1
- package/dist/fields/config/sanitize.js +2 -0
- package/dist/fields/config/sanitize.js.map +1 -1
- package/dist/fields/config/schema.d.ts.map +1 -1
- package/dist/fields/config/schema.js +1 -2
- package/dist/fields/config/schema.js.map +1 -1
- package/dist/fields/config/types.d.ts +25 -6
- package/dist/fields/config/types.d.ts.map +1 -1
- package/dist/fields/config/types.js +1 -1
- package/dist/fields/config/types.js.map +1 -1
- package/dist/fields/hooks/afterChange/index.d.ts.map +1 -1
- package/dist/fields/hooks/beforeChange/index.d.ts.map +1 -1
- package/dist/fields/hooks/beforeValidate/index.d.ts +2 -1
- package/dist/fields/hooks/beforeValidate/index.d.ts.map +1 -1
- package/dist/fields/hooks/beforeValidate/index.js +2 -1
- package/dist/fields/hooks/beforeValidate/index.js.map +1 -1
- package/dist/fields/hooks/beforeValidate/promise.d.ts +2 -1
- package/dist/fields/hooks/beforeValidate/promise.d.ts.map +1 -1
- package/dist/fields/hooks/beforeValidate/promise.js +30 -1
- package/dist/fields/hooks/beforeValidate/promise.js.map +1 -1
- package/dist/fields/hooks/beforeValidate/traverseFields.d.ts +2 -1
- package/dist/fields/hooks/beforeValidate/traverseFields.d.ts.map +1 -1
- package/dist/fields/hooks/beforeValidate/traverseFields.js +2 -1
- package/dist/fields/hooks/beforeValidate/traverseFields.js.map +1 -1
- package/dist/fields/setDefaultBeforeDuplicate.d.ts +3 -0
- package/dist/fields/setDefaultBeforeDuplicate.d.ts.map +1 -0
- package/dist/fields/setDefaultBeforeDuplicate.js +23 -0
- package/dist/fields/setDefaultBeforeDuplicate.js.map +1 -0
- package/dist/fields/validations.d.ts +3 -3
- package/dist/globals/config/client.d.ts +14 -0
- package/dist/globals/config/client.d.ts.map +1 -0
- package/dist/globals/config/client.js +42 -0
- package/dist/globals/config/client.js.map +1 -0
- package/dist/globals/config/types.d.ts +2 -21
- package/dist/globals/config/types.d.ts.map +1 -1
- package/dist/globals/config/types.js.map +1 -1
- package/dist/globals/operations/findOne.d.ts.map +1 -1
- package/dist/globals/operations/findVersionByID.d.ts.map +1 -1
- package/dist/globals/operations/findVersions.d.ts.map +1 -1
- package/dist/globals/operations/restoreVersion.d.ts.map +1 -1
- package/dist/globals/operations/update.d.ts +1 -9
- package/dist/globals/operations/update.d.ts.map +1 -1
- package/dist/index.d.ts +16 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -9
- package/dist/index.js.map +1 -1
- package/dist/preferences/operations/findOne.d.ts.map +1 -1
- package/dist/preferences/operations/findOne.js +3 -7
- package/dist/preferences/operations/findOne.js.map +1 -1
- package/dist/preferences/types.d.ts +5 -4
- package/dist/preferences/types.d.ts.map +1 -1
- package/dist/preferences/types.js.map +1 -1
- package/dist/uploads/generateFileData.d.ts.map +1 -1
- package/dist/uploads/generateFileData.js +1 -1
- package/dist/uploads/generateFileData.js.map +1 -1
- package/dist/uploads/getFileByPath.d.ts +1 -2
- package/dist/uploads/getFileByPath.d.ts.map +1 -1
- package/dist/uploads/getFileByPath.js +1 -2
- package/dist/uploads/getFileByPath.js.map +1 -1
- package/dist/utilities/createLocalReq.d.ts +1 -1
- package/dist/utilities/createLocalReq.d.ts.map +1 -1
- package/dist/utilities/createLocalReq.js +20 -23
- package/dist/utilities/createLocalReq.js.map +1 -1
- package/dist/utilities/fieldSchemaToJSON.d.ts +2 -2
- package/dist/utilities/fieldSchemaToJSON.d.ts.map +1 -1
- package/dist/utilities/fieldSchemaToJSON.js +20 -10
- package/dist/utilities/fieldSchemaToJSON.js.map +1 -1
- package/dist/utilities/flattenTopLevelFields.d.ts +2 -1
- package/dist/utilities/flattenTopLevelFields.d.ts.map +1 -1
- package/dist/utilities/flattenTopLevelFields.js +1 -1
- package/dist/utilities/flattenTopLevelFields.js.map +1 -1
- package/dist/utilities/getEntityPolicies.js +3 -3
- package/dist/utilities/getEntityPolicies.js.map +1 -1
- package/dist/utilities/getObjectDotNotation.d.ts.map +1 -1
- package/dist/utilities/mergeListSearchAndWhere.d.ts +12 -0
- package/dist/utilities/mergeListSearchAndWhere.d.ts.map +1 -0
- package/dist/utilities/mergeListSearchAndWhere.js +57 -0
- package/dist/utilities/mergeListSearchAndWhere.js.map +1 -0
- package/dist/utilities/sanitizeInternalFields.d.ts.map +1 -1
- package/dist/utilities/telemetry/events/adminInit.d.ts +1 -1
- package/dist/utilities/telemetry/events/adminInit.d.ts.map +1 -1
- package/dist/utilities/telemetry/events/adminInit.js +1 -1
- package/dist/utilities/telemetry/events/adminInit.js.map +1 -1
- package/dist/utilities/telemetry/oneWayHash.d.ts +1 -0
- package/dist/utilities/telemetry/oneWayHash.d.ts.map +1 -1
- package/dist/utilities/wait.d.ts +1 -2
- package/dist/utilities/wait.d.ts.map +1 -1
- package/dist/utilities/wait.js +1 -2
- package/dist/utilities/wait.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/enforceMaxVersions.d.ts.map +1 -1
- package/dist/versions/enforceMaxVersions.js +1 -0
- package/dist/versions/enforceMaxVersions.js.map +1 -1
- package/dist/versions/getLatestCollectionVersion.d.ts.map +1 -1
- package/dist/versions/getLatestCollectionVersion.js +2 -0
- package/dist/versions/getLatestCollectionVersion.js.map +1 -1
- package/dist/versions/getLatestGlobalVersion.d.ts.map +1 -1
- package/dist/versions/getLatestGlobalVersion.js +1 -0
- package/dist/versions/getLatestGlobalVersion.js.map +1 -1
- package/dist/versions/saveVersion.d.ts.map +1 -1
- package/dist/versions/saveVersion.js +1 -0
- package/dist/versions/saveVersion.js.map +1 -1
- package/operations.d.ts +1 -0
- package/operations.js +1 -0
- package/package.json +3 -3
- package/types.d.ts +9 -4
- package/uploads.d.ts +2 -0
- package/uploads.js +3 -0
- package/utilities.d.ts +4 -1
- package/utilities.js +4 -1
- package/components.d.ts +0 -14
- package/components.js +0 -71
- package/dist/config/createClientConfig.d.ts +0 -1246
- package/dist/config/createClientConfig.js +0 -175
- package/dist/config/createClientConfig.js.map +0 -1
- package/dist/localization/middleware.d.ts +0 -5
- package/dist/localization/middleware.d.ts.map +0 -1
- package/dist/localization/middleware.js +0 -37
- package/dist/localization/middleware.js.map +0 -1
- package/dist/localization/sanitizeFallbackLocale.d.ts +0 -3
- package/dist/localization/sanitizeFallbackLocale.d.ts.map +0 -1
- package/dist/localization/sanitizeFallbackLocale.js +0 -9
- package/dist/localization/sanitizeFallbackLocale.js.map +0 -1
- package/graphql.d.ts +0 -3
- package/graphql.js +0 -27
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/uploads/generateFileData.ts"],"sourcesContent":["import type { OutputInfo, Sharp, SharpOptions } from 'sharp'\n\nimport fileType from 'file-type'\nconst { fromBuffer } = fileType\nimport fs from 'fs'\nimport mkdirp from 'mkdirp'\nimport sanitize from 'sanitize-filename'\n\nimport type { Collection } from '../collections/config/types.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { PayloadRequest } from '../types/index.js'\nimport type { FileData, FileToSave, ProbedImageSize } from './types.js'\n\nimport { FileUploadError, MissingFile } from '../errors/index.js'\nimport canResizeImage from './canResizeImage.js'\nimport cropImage from './cropImage.js'\nimport { getExternalFile } from './getExternalFile.js'\nimport getFileByPath from './getFileByPath.js'\nimport { getImageSize } from './getImageSize.js'\nimport getSafeFileName from './getSafeFilename.js'\nimport resizeAndTransformImageSizes from './imageResizer.js'\nimport isImage from './isImage.js'\n\ntype Args<T> = {\n collection: Collection\n config: SanitizedConfig\n data: T\n overwriteExistingFiles?: boolean\n req: PayloadRequest\n throwOnMissingFile?: boolean\n}\n\ntype Result<T> = Promise<{\n data: T\n files: FileToSave[]\n}>\n\nexport const generateFileData = async <T>({\n collection: { config: collectionConfig },\n data,\n overwriteExistingFiles,\n req,\n throwOnMissingFile,\n}: Args<T>): Result<T> => {\n if (!collectionConfig.upload) {\n return {\n data,\n files: [],\n }\n }\n\n const { sharp } = req.payload.config\n\n let file = req.file\n\n const uploadEdits = req.query['upload.js'] || {}\n\n const { disableLocalStorage, formatOptions, imageSizes, resizeOptions, staticDir, trimOptions } =\n collectionConfig.upload\n\n const staticPath = staticDir\n\n if (!file && uploadEdits && data) {\n const { filename, url } = data as FileData\n\n try {\n if (url && url.startsWith('/') && !disableLocalStorage) {\n const filePath = `${staticPath}/${filename}`\n const response = await getFileByPath(filePath)\n file = response\n overwriteExistingFiles = true\n } else if (filename && url) {\n file = await getExternalFile({ data: data as FileData, req })\n overwriteExistingFiles = true\n }\n } catch (err) {\n throw new FileUploadError(req.t)\n }\n }\n\n if (!file) {\n if (throwOnMissingFile) throw new MissingFile(req.t)\n\n return {\n data,\n files: [],\n }\n }\n\n if (!disableLocalStorage) {\n mkdirp.sync(staticPath)\n }\n\n let newData = data\n const filesToSave: FileToSave[] = []\n const fileData: Partial<FileData> = {}\n const fileIsAnimated = file.mimetype === 'image/gif' || file.mimetype === 'image/webp'\n const cropData =\n typeof uploadEdits === 'object' && 'crop' in uploadEdits ? uploadEdits.crop : undefined\n\n try {\n const fileSupportsResize = canResizeImage(file.mimetype)\n let fsSafeName: string\n let sharpFile: Sharp | undefined\n let dimensions: ProbedImageSize | undefined\n let fileBuffer: { data: Buffer; info: OutputInfo }\n let ext\n let mime: string\n const fileHasAdjustments =\n fileSupportsResize &&\n Boolean(resizeOptions || formatOptions || trimOptions || file.tempFilePath)\n\n const sharpOptions: SharpOptions = {}\n\n if (fileIsAnimated) sharpOptions.animated = true\n\n if (fileHasAdjustments && sharp) {\n if (file.tempFilePath) {\n sharpFile = sharp(file.tempFilePath, sharpOptions).rotate() // pass rotate() to auto-rotate based on EXIF data. https://github.com/payloadcms/payload/pull/3081\n } else {\n sharpFile = sharp(file.data, sharpOptions).rotate() // pass rotate() to auto-rotate based on EXIF data. https://github.com/payloadcms/payload/pull/3081\n }\n\n if (resizeOptions) {\n sharpFile = sharpFile.resize(resizeOptions)\n }\n if (formatOptions) {\n sharpFile = sharpFile.toFormat(formatOptions.format, formatOptions.options)\n }\n if (trimOptions) {\n sharpFile = sharpFile.trim(trimOptions)\n }\n }\n\n if (isImage(file.mimetype)) {\n dimensions = getImageSize(file)\n fileData.width = dimensions.width\n fileData.height = dimensions.height\n }\n\n if (sharpFile) {\n const metadata = await sharpFile.metadata()\n fileBuffer = await sharpFile.toBuffer({ resolveWithObject: true })\n ;({ ext, mime } = await fromBuffer(fileBuffer.data)) // This is getting an incorrect gif height back.\n fileData.width = fileBuffer.info.width\n fileData.height = fileBuffer.info.height\n fileData.filesize = fileBuffer.info.size\n\n // Animated GIFs + WebP aggregate the height from every frame, so we need to use divide by number of pages\n if (metadata.pages) {\n fileData.height = fileBuffer.info.height / metadata.pages\n fileData.filesize = fileBuffer.data.length\n }\n } else {\n mime = file.mimetype\n fileData.filesize = file.size\n\n if (file.name.includes('.')) {\n ext = file.name.split('.').pop()\n } else {\n ext = ''\n }\n }\n\n // Adust SVG mime type. fromBuffer modifies it.\n if (mime === 'application/xml' && ext === 'svg') mime = 'image/svg+xml'\n fileData.mimeType = mime\n\n const baseFilename = sanitize(file.name.substring(0, file.name.lastIndexOf('.')) || file.name)\n fsSafeName = `${baseFilename}${ext ? `.${ext}` : ''}`\n\n if (!overwriteExistingFiles) {\n fsSafeName = await getSafeFileName({\n collectionSlug: collectionConfig.slug,\n desiredFilename: fsSafeName,\n req,\n staticPath,\n })\n }\n\n fileData.filename = fsSafeName\n let fileForResize = file\n\n if (cropData && sharp) {\n const { data: croppedImage, info } = await cropImage({ cropData, dimensions, file, sharp })\n\n filesToSave.push({\n buffer: croppedImage,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n fileForResize = {\n ...file,\n data: croppedImage,\n size: info.size,\n }\n fileData.width = info.width\n fileData.height = info.height\n fileData.filesize = info.size\n\n if (file.tempFilePath) {\n await fs.promises.writeFile(file.tempFilePath, croppedImage) // write fileBuffer to the temp path\n } else {\n req.file = fileForResize\n }\n } else {\n filesToSave.push({\n buffer: fileBuffer?.data || file.data,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n // If using temp files and the image is being resized, write the file to the temp path\n if (fileBuffer?.data || file.data.length > 0) {\n if (file.tempFilePath) {\n await fs.promises.writeFile(file.tempFilePath, fileBuffer?.data || file.data) // write fileBuffer to the temp path\n } else {\n // Assign the _possibly modified_ file to the request object\n req.file = {\n ...file,\n data: fileBuffer?.data || file.data,\n size: fileBuffer?.info.size,\n }\n }\n }\n }\n\n if (Array.isArray(imageSizes) && fileSupportsResize && sharp) {\n req.payloadUploadSizes = {}\n const { sizeData, sizesToSave } = await resizeAndTransformImageSizes({\n config: collectionConfig,\n dimensions: !cropData\n ? dimensions\n : {\n ...dimensions,\n height: fileData.height,\n width: fileData.width,\n },\n file: fileForResize,\n mimeType: fileData.mimeType,\n req,\n savedFilename: fsSafeName || file.name,\n sharp,\n staticPath,\n })\n\n fileData.sizes = sizeData\n filesToSave.push(...sizesToSave)\n }\n } catch (err) {\n console.error(err)\n throw new FileUploadError(req.t)\n }\n\n newData = {\n ...newData,\n ...fileData,\n }\n\n return {\n data: newData,\n files: filesToSave,\n }\n}\n"],"names":["fileType","fromBuffer","fs","mkdirp","sanitize","FileUploadError","MissingFile","canResizeImage","cropImage","getExternalFile","getFileByPath","getImageSize","getSafeFileName","resizeAndTransformImageSizes","isImage","generateFileData","collection","config","collectionConfig","data","overwriteExistingFiles","req","throwOnMissingFile","upload","files","sharp","payload","file","uploadEdits","query","disableLocalStorage","formatOptions","imageSizes","resizeOptions","staticDir","trimOptions","staticPath","filename","url","startsWith","filePath","response","err","t","sync","newData","filesToSave","fileData","fileIsAnimated","mimetype","cropData","crop","undefined","fileSupportsResize","fsSafeName","sharpFile","dimensions","fileBuffer","ext","mime","fileHasAdjustments","Boolean","tempFilePath","sharpOptions","animated","rotate","resize","toFormat","format","options","trim","width","height","metadata","toBuffer","resolveWithObject","info","filesize","size","pages","length","name","includes","split","pop","mimeType","baseFilename","substring","lastIndexOf","collectionSlug","slug","desiredFilename","fileForResize","croppedImage","push","buffer","path","promises","writeFile","Array","isArray","payloadUploadSizes","sizeData","sizesToSave","savedFilename","sizes","console","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/uploads/generateFileData.ts"],"sourcesContent":["import type { OutputInfo, Sharp, SharpOptions } from 'sharp'\n\nimport fileType from 'file-type'\nconst { fromBuffer } = fileType\nimport fs from 'fs'\nimport mkdirp from 'mkdirp'\nimport sanitize from 'sanitize-filename'\n\nimport type { Collection } from '../collections/config/types.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { PayloadRequest } from '../types/index.js'\nimport type { FileData, FileToSave, ProbedImageSize } from './types.js'\n\nimport { FileUploadError, MissingFile } from '../errors/index.js'\nimport canResizeImage from './canResizeImage.js'\nimport cropImage from './cropImage.js'\nimport { getExternalFile } from './getExternalFile.js'\nimport { getFileByPath } from './getFileByPath.js'\nimport { getImageSize } from './getImageSize.js'\nimport getSafeFileName from './getSafeFilename.js'\nimport resizeAndTransformImageSizes from './imageResizer.js'\nimport isImage from './isImage.js'\n\ntype Args<T> = {\n collection: Collection\n config: SanitizedConfig\n data: T\n overwriteExistingFiles?: boolean\n req: PayloadRequest\n throwOnMissingFile?: boolean\n}\n\ntype Result<T> = Promise<{\n data: T\n files: FileToSave[]\n}>\n\nexport const generateFileData = async <T>({\n collection: { config: collectionConfig },\n data,\n overwriteExistingFiles,\n req,\n throwOnMissingFile,\n}: Args<T>): Result<T> => {\n if (!collectionConfig.upload) {\n return {\n data,\n files: [],\n }\n }\n\n const { sharp } = req.payload.config\n\n let file = req.file\n\n const uploadEdits = req.query['upload.js'] || {}\n\n const { disableLocalStorage, formatOptions, imageSizes, resizeOptions, staticDir, trimOptions } =\n collectionConfig.upload\n\n const staticPath = staticDir\n\n if (!file && uploadEdits && data) {\n const { filename, url } = data as FileData\n\n try {\n if (url && url.startsWith('/') && !disableLocalStorage) {\n const filePath = `${staticPath}/${filename}`\n const response = await getFileByPath(filePath)\n file = response\n overwriteExistingFiles = true\n } else if (filename && url) {\n file = await getExternalFile({ data: data as FileData, req })\n overwriteExistingFiles = true\n }\n } catch (err) {\n throw new FileUploadError(req.t)\n }\n }\n\n if (!file) {\n if (throwOnMissingFile) throw new MissingFile(req.t)\n\n return {\n data,\n files: [],\n }\n }\n\n if (!disableLocalStorage) {\n mkdirp.sync(staticPath)\n }\n\n let newData = data\n const filesToSave: FileToSave[] = []\n const fileData: Partial<FileData> = {}\n const fileIsAnimated = file.mimetype === 'image/gif' || file.mimetype === 'image/webp'\n const cropData =\n typeof uploadEdits === 'object' && 'crop' in uploadEdits ? uploadEdits.crop : undefined\n\n try {\n const fileSupportsResize = canResizeImage(file.mimetype)\n let fsSafeName: string\n let sharpFile: Sharp | undefined\n let dimensions: ProbedImageSize | undefined\n let fileBuffer: { data: Buffer; info: OutputInfo }\n let ext\n let mime: string\n const fileHasAdjustments =\n fileSupportsResize &&\n Boolean(resizeOptions || formatOptions || trimOptions || file.tempFilePath)\n\n const sharpOptions: SharpOptions = {}\n\n if (fileIsAnimated) sharpOptions.animated = true\n\n if (fileHasAdjustments && sharp) {\n if (file.tempFilePath) {\n sharpFile = sharp(file.tempFilePath, sharpOptions).rotate() // pass rotate() to auto-rotate based on EXIF data. https://github.com/payloadcms/payload/pull/3081\n } else {\n sharpFile = sharp(file.data, sharpOptions).rotate() // pass rotate() to auto-rotate based on EXIF data. https://github.com/payloadcms/payload/pull/3081\n }\n\n if (resizeOptions) {\n sharpFile = sharpFile.resize(resizeOptions)\n }\n if (formatOptions) {\n sharpFile = sharpFile.toFormat(formatOptions.format, formatOptions.options)\n }\n if (trimOptions) {\n sharpFile = sharpFile.trim(trimOptions)\n }\n }\n\n if (isImage(file.mimetype)) {\n dimensions = getImageSize(file)\n fileData.width = dimensions.width\n fileData.height = dimensions.height\n }\n\n if (sharpFile) {\n const metadata = await sharpFile.metadata()\n fileBuffer = await sharpFile.toBuffer({ resolveWithObject: true })\n ;({ ext, mime } = await fromBuffer(fileBuffer.data)) // This is getting an incorrect gif height back.\n fileData.width = fileBuffer.info.width\n fileData.height = fileBuffer.info.height\n fileData.filesize = fileBuffer.info.size\n\n // Animated GIFs + WebP aggregate the height from every frame, so we need to use divide by number of pages\n if (metadata.pages) {\n fileData.height = fileBuffer.info.height / metadata.pages\n fileData.filesize = fileBuffer.data.length\n }\n } else {\n mime = file.mimetype\n fileData.filesize = file.size\n\n if (file.name.includes('.')) {\n ext = file.name.split('.').pop()\n } else {\n ext = ''\n }\n }\n\n // Adust SVG mime type. fromBuffer modifies it.\n if (mime === 'application/xml' && ext === 'svg') mime = 'image/svg+xml'\n fileData.mimeType = mime\n\n const baseFilename = sanitize(file.name.substring(0, file.name.lastIndexOf('.')) || file.name)\n fsSafeName = `${baseFilename}${ext ? `.${ext}` : ''}`\n\n if (!overwriteExistingFiles) {\n fsSafeName = await getSafeFileName({\n collectionSlug: collectionConfig.slug,\n desiredFilename: fsSafeName,\n req,\n staticPath,\n })\n }\n\n fileData.filename = fsSafeName\n let fileForResize = file\n\n if (cropData && sharp) {\n const { data: croppedImage, info } = await cropImage({ cropData, dimensions, file, sharp })\n\n filesToSave.push({\n buffer: croppedImage,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n fileForResize = {\n ...file,\n data: croppedImage,\n size: info.size,\n }\n fileData.width = info.width\n fileData.height = info.height\n fileData.filesize = info.size\n\n if (file.tempFilePath) {\n await fs.promises.writeFile(file.tempFilePath, croppedImage) // write fileBuffer to the temp path\n } else {\n req.file = fileForResize\n }\n } else {\n filesToSave.push({\n buffer: fileBuffer?.data || file.data,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n // If using temp files and the image is being resized, write the file to the temp path\n if (fileBuffer?.data || file.data.length > 0) {\n if (file.tempFilePath) {\n await fs.promises.writeFile(file.tempFilePath, fileBuffer?.data || file.data) // write fileBuffer to the temp path\n } else {\n // Assign the _possibly modified_ file to the request object\n req.file = {\n ...file,\n data: fileBuffer?.data || file.data,\n size: fileBuffer?.info.size,\n }\n }\n }\n }\n\n if (Array.isArray(imageSizes) && fileSupportsResize && sharp) {\n req.payloadUploadSizes = {}\n const { sizeData, sizesToSave } = await resizeAndTransformImageSizes({\n config: collectionConfig,\n dimensions: !cropData\n ? dimensions\n : {\n ...dimensions,\n height: fileData.height,\n width: fileData.width,\n },\n file: fileForResize,\n mimeType: fileData.mimeType,\n req,\n savedFilename: fsSafeName || file.name,\n sharp,\n staticPath,\n })\n\n fileData.sizes = sizeData\n filesToSave.push(...sizesToSave)\n }\n } catch (err) {\n console.error(err)\n throw new FileUploadError(req.t)\n }\n\n newData = {\n ...newData,\n ...fileData,\n }\n\n return {\n data: newData,\n files: filesToSave,\n }\n}\n"],"names":["fileType","fromBuffer","fs","mkdirp","sanitize","FileUploadError","MissingFile","canResizeImage","cropImage","getExternalFile","getFileByPath","getImageSize","getSafeFileName","resizeAndTransformImageSizes","isImage","generateFileData","collection","config","collectionConfig","data","overwriteExistingFiles","req","throwOnMissingFile","upload","files","sharp","payload","file","uploadEdits","query","disableLocalStorage","formatOptions","imageSizes","resizeOptions","staticDir","trimOptions","staticPath","filename","url","startsWith","filePath","response","err","t","sync","newData","filesToSave","fileData","fileIsAnimated","mimetype","cropData","crop","undefined","fileSupportsResize","fsSafeName","sharpFile","dimensions","fileBuffer","ext","mime","fileHasAdjustments","Boolean","tempFilePath","sharpOptions","animated","rotate","resize","toFormat","format","options","trim","width","height","metadata","toBuffer","resolveWithObject","info","filesize","size","pages","length","name","includes","split","pop","mimeType","baseFilename","substring","lastIndexOf","collectionSlug","slug","desiredFilename","fileForResize","croppedImage","push","buffer","path","promises","writeFile","Array","isArray","payloadUploadSizes","sizeData","sizesToSave","savedFilename","sizes","console","error"],"mappings":"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"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
1
|
import type { CustomPayloadRequest } from '../types/index.js';
|
|
2
|
-
declare const getFileByPath: (filePath: string) => Promise<CustomPayloadRequest['file']>;
|
|
3
|
-
export default getFileByPath;
|
|
2
|
+
export declare const getFileByPath: (filePath: string) => Promise<CustomPayloadRequest['file']>;
|
|
4
3
|
//# sourceMappingURL=getFileByPath.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getFileByPath.d.ts","sourceRoot":"","sources":["../../src/uploads/getFileByPath.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAM7D,
|
|
1
|
+
{"version":3,"file":"getFileByPath.d.ts","sourceRoot":"","sources":["../../src/uploads/getFileByPath.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAM7D,eAAO,MAAM,aAAa,aAAoB,MAAM,KAAG,QAAQ,oBAAoB,CAAC,MAAM,CAAC,CAoB1F,CAAA"}
|
|
@@ -5,7 +5,7 @@ const { fromFile } = fileType;
|
|
|
5
5
|
const mimeTypeEstimate = {
|
|
6
6
|
svg: 'image/svg+xml'
|
|
7
7
|
};
|
|
8
|
-
const getFileByPath = async (filePath)=>{
|
|
8
|
+
export const getFileByPath = async (filePath)=>{
|
|
9
9
|
if (typeof filePath === 'string') {
|
|
10
10
|
const data = fs.readFileSync(filePath);
|
|
11
11
|
const mimetype = fromFile(filePath);
|
|
@@ -22,6 +22,5 @@ const getFileByPath = async (filePath)=>{
|
|
|
22
22
|
}
|
|
23
23
|
return undefined;
|
|
24
24
|
};
|
|
25
|
-
export default getFileByPath;
|
|
26
25
|
|
|
27
26
|
//# sourceMappingURL=getFileByPath.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/uploads/getFileByPath.ts"],"sourcesContent":["import fileType from 'file-type'\nimport fs from 'fs'\nimport path from 'path'\nconst { fromFile } = fileType\n\nimport type { CustomPayloadRequest } from '../types/index.js'\n\nconst mimeTypeEstimate = {\n svg: 'image/svg+xml',\n}\n\
|
|
1
|
+
{"version":3,"sources":["../../src/uploads/getFileByPath.ts"],"sourcesContent":["import fileType from 'file-type'\nimport fs from 'fs'\nimport path from 'path'\nconst { fromFile } = fileType\n\nimport type { CustomPayloadRequest } from '../types/index.js'\n\nconst mimeTypeEstimate = {\n svg: 'image/svg+xml',\n}\n\nexport const getFileByPath = async (filePath: string): Promise<CustomPayloadRequest['file']> => {\n if (typeof filePath === 'string') {\n const data = fs.readFileSync(filePath)\n const mimetype = fromFile(filePath)\n const { size } = fs.statSync(filePath)\n\n const name = path.basename(filePath)\n const ext = path.extname(filePath).slice(1)\n\n const mime = (await mimetype)?.mime || mimeTypeEstimate[ext]\n\n return {\n name,\n data,\n mimetype: mime,\n size,\n }\n }\n\n return undefined\n}\n"],"names":["fileType","fs","path","fromFile","mimeTypeEstimate","svg","getFileByPath","filePath","data","readFileSync","mimetype","size","statSync","name","basename","ext","extname","slice","mime","undefined"],"mappings":"AAAA,OAAOA,cAAc,YAAW;AAChC,OAAOC,QAAQ,KAAI;AACnB,OAAOC,UAAU,OAAM;AACvB,MAAM,EAAEC,QAAQ,EAAE,GAAGH;AAIrB,MAAMI,mBAAmB;IACvBC,KAAK;AACP;AAEA,OAAO,MAAMC,gBAAgB,OAAOC;IAClC,IAAI,OAAOA,aAAa,UAAU;QAChC,MAAMC,OAAOP,GAAGQ,YAAY,CAACF;QAC7B,MAAMG,WAAWP,SAASI;QAC1B,MAAM,EAAEI,IAAI,EAAE,GAAGV,GAAGW,QAAQ,CAACL;QAE7B,MAAMM,OAAOX,KAAKY,QAAQ,CAACP;QAC3B,MAAMQ,MAAMb,KAAKc,OAAO,CAACT,UAAUU,KAAK,CAAC;QAEzC,MAAMC,OAAO,AAAC,CAAA,MAAMR,QAAO,GAAIQ,QAAQd,gBAAgB,CAACW,IAAI;QAE5D,OAAO;YACLF;YACAL;YACAE,UAAUQ;YACVP;QACF;IACF;IAEA,OAAOQ;AACT,EAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { Payload, RequestContext } from '../index.js';
|
|
2
1
|
import type { User } from '../auth/types.js';
|
|
2
|
+
import type { Payload, RequestContext } from '../index.js';
|
|
3
3
|
import type { PayloadRequest } from '../types/index.js';
|
|
4
4
|
type CreateLocalReq = (options: {
|
|
5
5
|
context?: RequestContext;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createLocalReq.d.ts","sourceRoot":"","sources":["../../src/utilities/createLocalReq.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"createLocalReq.d.ts","sourceRoot":"","sources":["../../src/utilities/createLocalReq.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAsDvD,KAAK,cAAc,GAAG,CACpB,OAAO,EAAE;IACP,OAAO,CAAC,EAAE,cAAc,CAAA;IACxB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,GAAG,CAAC,EAAE,cAAc,CAAA;IACpB,IAAI,CAAC,EAAE,IAAI,CAAA;CACZ,EACD,OAAO,EAAE,OAAO,KACb,OAAO,CAAC,cAAc,CAAC,CAAA;AAC5B,eAAO,MAAM,cAAc,EAAE,cAiC5B,CAAA"}
|
|
@@ -24,36 +24,33 @@ const attachFakeURLProperties = (req)=>{
|
|
|
24
24
|
* the context of a request. Therefore we create a fake URL object.
|
|
25
25
|
* `ts-ignore` is used below for properties that are 'read-only'
|
|
26
26
|
* since they do not exist yet we can safely ignore the error.
|
|
27
|
-
*/
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
req.
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
req.host = 'localhost';
|
|
42
|
-
req.protocol = 'https:';
|
|
43
|
-
req.pathname = '/';
|
|
27
|
+
*/ let urlObject;
|
|
28
|
+
function getURLObject() {
|
|
29
|
+
if (urlObject) return urlObject;
|
|
30
|
+
const urlToUse = req?.url || req.payload.config?.serverURL || 'http://localhost';
|
|
31
|
+
try {
|
|
32
|
+
urlObject = new URL(urlToUse);
|
|
33
|
+
} catch (error) {
|
|
34
|
+
urlObject = new URL('http://localhost');
|
|
35
|
+
}
|
|
36
|
+
return urlObject;
|
|
37
|
+
}
|
|
38
|
+
if (!req.host) req.host = getURLObject().host;
|
|
39
|
+
if (!req.protocol) req.protocol = getURLObject().protocol;
|
|
40
|
+
if (!req.pathname) req.pathname = getURLObject().pathname;
|
|
44
41
|
// @ts-expect-error
|
|
45
|
-
req.searchParams =
|
|
42
|
+
if (!req.searchParams) req.searchParams = getURLObject().searchParams;
|
|
46
43
|
// @ts-expect-error
|
|
47
|
-
req.origin =
|
|
44
|
+
if (!req.origin) req.origin = getURLObject().origin;
|
|
48
45
|
// @ts-expect-error
|
|
49
|
-
req.url =
|
|
50
|
-
return;
|
|
46
|
+
if (!req?.url) req.url = getURLObject().url;
|
|
51
47
|
};
|
|
52
|
-
export const createLocalReq = async ({ context, fallbackLocale, locale, req = {}, user }, payload)=>{
|
|
48
|
+
export const createLocalReq = async ({ context, fallbackLocale, locale: localeArg, req = {}, user }, payload)=>{
|
|
53
49
|
const i18n = req?.i18n || await getLocalI18n({
|
|
54
50
|
config: payload.config
|
|
55
51
|
});
|
|
56
52
|
if (payload.config?.localization) {
|
|
53
|
+
const locale = localeArg === '*' ? 'all' : localeArg;
|
|
57
54
|
const defaultLocale = payload.config.localization.defaultLocale;
|
|
58
55
|
req.locale = locale || req?.locale || defaultLocale;
|
|
59
56
|
const fallbackLocaleFromConfig = payload.config.localization.locales.find(({ code })=>req.locale === code)?.fallbackLocale;
|
|
@@ -72,7 +69,7 @@ export const createLocalReq = async ({ context, fallbackLocale, locale, req = {}
|
|
|
72
69
|
req.payloadDataLoader = req?.payloadDataLoader || getDataLoader(req);
|
|
73
70
|
req.routeParams = req?.routeParams || {};
|
|
74
71
|
req.query = req?.query || {};
|
|
75
|
-
|
|
72
|
+
attachFakeURLProperties(req);
|
|
76
73
|
return req;
|
|
77
74
|
};
|
|
78
75
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/createLocalReq.ts"],"sourcesContent":["import type {
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/createLocalReq.ts"],"sourcesContent":["import type { User } from '../auth/types.js'\nimport type { Payload, RequestContext } from '../index.js'\nimport type { PayloadRequest } from '../types/index.js'\n\nimport { getDataLoader } from '../collections/dataloader.js'\nimport { getLocalI18n } from '../translations/getLocalI18n.js'\n\nfunction getRequestContext(\n req: PayloadRequest = { context: null } as PayloadRequest,\n context: RequestContext = {},\n): RequestContext {\n if (req.context) {\n if (Object.keys(req.context).length === 0 && req.context.constructor === Object) {\n // if req.context is `{}` avoid unnecessary spread\n return context\n } else {\n return { ...req.context, ...context }\n }\n } else {\n return context\n }\n}\n\nconst attachFakeURLProperties = (req: PayloadRequest) => {\n /**\n * *NOTE*\n * If no URL is provided, the local API was called directly outside\n * the context of a request. Therefore we create a fake URL object.\n * `ts-ignore` is used below for properties that are 'read-only'\n * since they do not exist yet we can safely ignore the error.\n */\n let urlObject\n\n function getURLObject() {\n if (urlObject) return urlObject\n const urlToUse = req?.url || req.payload.config?.serverURL || 'http://localhost'\n try {\n urlObject = new URL(urlToUse)\n } catch (error) {\n urlObject = new URL('http://localhost')\n }\n\n return urlObject\n }\n\n if (!req.host) req.host = getURLObject().host\n if (!req.protocol) req.protocol = getURLObject().protocol\n if (!req.pathname) req.pathname = getURLObject().pathname\n // @ts-expect-error\n if (!req.searchParams) req.searchParams = getURLObject().searchParams\n // @ts-expect-error\n if (!req.origin) req.origin = getURLObject().origin\n // @ts-expect-error\n if (!req?.url) req.url = getURLObject().url\n}\n\ntype CreateLocalReq = (\n options: {\n context?: RequestContext\n fallbackLocale?: string\n locale?: string\n req?: PayloadRequest\n user?: User\n },\n payload: Payload,\n) => Promise<PayloadRequest>\nexport const createLocalReq: CreateLocalReq = async (\n { context, fallbackLocale, locale: localeArg, req = {} as PayloadRequest, user },\n payload,\n) => {\n const i18n = req?.i18n || (await getLocalI18n({ config: payload.config }))\n\n if (payload.config?.localization) {\n const locale = localeArg === '*' ? 'all' : localeArg\n const defaultLocale = payload.config.localization.defaultLocale\n req.locale = locale || req?.locale || defaultLocale\n const fallbackLocaleFromConfig = payload.config.localization.locales.find(\n ({ code }) => req.locale === code,\n )?.fallbackLocale\n if (typeof fallbackLocale !== 'undefined') {\n req.fallbackLocale = fallbackLocale\n } else if (typeof req?.fallbackLocale === 'undefined') {\n req.fallbackLocale = fallbackLocaleFromConfig || defaultLocale\n }\n }\n\n req.context = getRequestContext(req, context)\n req.payloadAPI = req?.payloadAPI || 'local'\n req.payload = payload\n req.i18n = i18n\n req.t = i18n.t\n req.user = user || req?.user || null\n req.payloadDataLoader = req?.payloadDataLoader || getDataLoader(req)\n req.routeParams = req?.routeParams || {}\n req.query = req?.query || {}\n\n attachFakeURLProperties(req)\n\n return req\n}\n"],"names":["getDataLoader","getLocalI18n","getRequestContext","req","context","Object","keys","length","constructor","attachFakeURLProperties","urlObject","getURLObject","urlToUse","url","payload","config","serverURL","URL","error","host","protocol","pathname","searchParams","origin","createLocalReq","fallbackLocale","locale","localeArg","user","i18n","localization","defaultLocale","fallbackLocaleFromConfig","locales","find","code","payloadAPI","t","payloadDataLoader","routeParams","query"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { FieldTypes } from '../exports/config.js';
|
|
2
|
-
import type {
|
|
2
|
+
import type { ClientFieldConfig } from '../fields/config/client.js';
|
|
3
3
|
export type FieldSchemaJSON = {
|
|
4
4
|
blocks?: FieldSchemaJSON;
|
|
5
5
|
fields?: FieldSchemaJSON;
|
|
@@ -9,5 +9,5 @@ export type FieldSchemaJSON = {
|
|
|
9
9
|
slug?: string;
|
|
10
10
|
type: keyof FieldTypes;
|
|
11
11
|
}[];
|
|
12
|
-
export declare const fieldSchemaToJSON: (fields:
|
|
12
|
+
export declare const fieldSchemaToJSON: (fields: ClientFieldConfig[]) => FieldSchemaJSON;
|
|
13
13
|
//# sourceMappingURL=fieldSchemaToJSON.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fieldSchemaToJSON.d.ts","sourceRoot":"","sources":["../../src/utilities/fieldSchemaToJSON.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"fieldSchemaToJSON.d.ts","sourceRoot":"","sources":["../../src/utilities/fieldSchemaToJSON.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AAEnE,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,MAAM,UAAU,CAAA;CACvB,EAAE,CAAA;AAEH,eAAO,MAAM,iBAAiB,WAAY,iBAAiB,EAAE,oBA4G5D,CAAA"}
|
|
@@ -4,27 +4,34 @@ export const fieldSchemaToJSON = (fields)=>{
|
|
|
4
4
|
switch(field.type){
|
|
5
5
|
case 'group':
|
|
6
6
|
acc.push({
|
|
7
|
+
// @ts-expect-error
|
|
7
8
|
name: field.name,
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
type: field.type,
|
|
10
|
+
// @ts-expect-error
|
|
11
|
+
fields: fieldSchemaToJSON(field.fields)
|
|
10
12
|
});
|
|
11
13
|
break;
|
|
12
14
|
case 'array':
|
|
13
15
|
acc.push({
|
|
16
|
+
// @ts-expect-error
|
|
14
17
|
name: field.name,
|
|
18
|
+
type: field.type,
|
|
15
19
|
fields: fieldSchemaToJSON([
|
|
20
|
+
// @ts-expect-error
|
|
16
21
|
...field.fields,
|
|
17
22
|
{
|
|
18
23
|
name: 'id',
|
|
19
24
|
type: 'text'
|
|
20
25
|
}
|
|
21
|
-
])
|
|
22
|
-
type: field.type
|
|
26
|
+
])
|
|
23
27
|
});
|
|
24
28
|
break;
|
|
25
29
|
case 'blocks':
|
|
26
30
|
acc.push({
|
|
31
|
+
// @ts-expect-error
|
|
27
32
|
name: field.name,
|
|
33
|
+
type: field.type,
|
|
34
|
+
// @ts-expect-error
|
|
28
35
|
blocks: field.blocks.reduce((acc, block)=>{
|
|
29
36
|
acc[block.slug] = {
|
|
30
37
|
fields: fieldSchemaToJSON([
|
|
@@ -36,23 +43,24 @@ export const fieldSchemaToJSON = (fields)=>{
|
|
|
36
43
|
])
|
|
37
44
|
};
|
|
38
45
|
return acc;
|
|
39
|
-
}, {})
|
|
40
|
-
type: field.type
|
|
46
|
+
}, {})
|
|
41
47
|
});
|
|
42
48
|
break;
|
|
43
49
|
case 'row':
|
|
44
50
|
case 'collapsible':
|
|
51
|
+
// @ts-expect-error
|
|
45
52
|
result = result.concat(fieldSchemaToJSON(field.fields));
|
|
46
53
|
break;
|
|
47
54
|
case 'tabs':
|
|
48
55
|
{
|
|
49
56
|
let tabFields = [];
|
|
57
|
+
// @ts-expect-error
|
|
50
58
|
field.tabs.forEach((tab)=>{
|
|
51
59
|
if ('name' in tab) {
|
|
52
60
|
tabFields.push({
|
|
53
61
|
name: tab.name,
|
|
54
|
-
|
|
55
|
-
|
|
62
|
+
type: field.type,
|
|
63
|
+
fields: fieldSchemaToJSON(tab.fields)
|
|
56
64
|
});
|
|
57
65
|
return;
|
|
58
66
|
}
|
|
@@ -64,10 +72,12 @@ export const fieldSchemaToJSON = (fields)=>{
|
|
|
64
72
|
case 'relationship':
|
|
65
73
|
case 'upload':
|
|
66
74
|
acc.push({
|
|
75
|
+
// @ts-expect-error
|
|
67
76
|
name: field.name,
|
|
77
|
+
type: field.type,
|
|
68
78
|
hasMany: 'hasMany' in field ? Boolean(field.hasMany) : false,
|
|
69
|
-
|
|
70
|
-
|
|
79
|
+
// @ts-expect-error
|
|
80
|
+
relationTo: field.relationTo
|
|
71
81
|
});
|
|
72
82
|
break;
|
|
73
83
|
default:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/fieldSchemaToJSON.ts"],"sourcesContent":["import type { FieldTypes } from '../exports/config.js'\nimport type {
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/fieldSchemaToJSON.ts"],"sourcesContent":["import type { FieldTypes } from '../exports/config.js'\nimport type { ClientFieldConfig } from '../fields/config/client.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: keyof FieldTypes\n}[]\n\nexport const fieldSchemaToJSON = (fields: ClientFieldConfig[]): FieldSchemaJSON => {\n return fields.reduce((acc, field) => {\n let result = acc\n\n switch (field.type) {\n case 'group':\n acc.push({\n // @ts-expect-error\n name: field.name,\n type: field.type,\n // @ts-expect-error\n fields: fieldSchemaToJSON(field.fields),\n })\n\n break\n\n case 'array':\n acc.push({\n // @ts-expect-error\n name: field.name,\n type: field.type,\n fields: fieldSchemaToJSON([\n // @ts-expect-error\n ...field.fields,\n {\n name: 'id',\n type: 'text',\n },\n ]),\n })\n\n break\n\n case 'blocks':\n acc.push({\n // @ts-expect-error\n name: field.name,\n type: field.type,\n // @ts-expect-error\n blocks: field.blocks.reduce((acc, block) => {\n acc[block.slug] = {\n fields: fieldSchemaToJSON([\n ...block.fields,\n {\n name: 'id',\n type: 'text',\n },\n ]),\n }\n\n return acc\n }, {}),\n })\n\n break\n\n case 'row':\n case 'collapsible':\n // @ts-expect-error\n result = result.concat(fieldSchemaToJSON(field.fields))\n break\n\n case 'tabs': {\n let tabFields = []\n\n // @ts-expect-error\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),\n })\n return\n }\n\n tabFields = tabFields.concat(fieldSchemaToJSON(tab.fields))\n })\n\n result = result.concat(tabFields)\n\n break\n }\n\n case 'relationship':\n case 'upload':\n acc.push({\n // @ts-expect-error\n name: field.name,\n type: field.type,\n hasMany: 'hasMany' in field ? Boolean(field.hasMany) : false, // TODO: type this\n // @ts-expect-error\n relationTo: field.relationTo,\n })\n\n break\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 }, [])\n}\n"],"names":["fieldSchemaToJSON","fields","reduce","acc","field","result","type","push","name","blocks","block","slug","concat","tabFields","tabs","forEach","tab","hasMany","Boolean","relationTo"],"mappings":"AAaA,OAAO,MAAMA,oBAAoB,CAACC;IAChC,OAAOA,OAAOC,MAAM,CAAC,CAACC,KAAKC;QACzB,IAAIC,SAASF;QAEb,OAAQC,MAAME,IAAI;YAChB,KAAK;gBACHH,IAAII,IAAI,CAAC;oBACP,mBAAmB;oBACnBC,MAAMJ,MAAMI,IAAI;oBAChBF,MAAMF,MAAME,IAAI;oBAChB,mBAAmB;oBACnBL,QAAQD,kBAAkBI,MAAMH,MAAM;gBACxC;gBAEA;YAEF,KAAK;gBACHE,IAAII,IAAI,CAAC;oBACP,mBAAmB;oBACnBC,MAAMJ,MAAMI,IAAI;oBAChBF,MAAMF,MAAME,IAAI;oBAChBL,QAAQD,kBAAkB;wBACxB,mBAAmB;2BAChBI,MAAMH,MAAM;wBACf;4BACEO,MAAM;4BACNF,MAAM;wBACR;qBACD;gBACH;gBAEA;YAEF,KAAK;gBACHH,IAAII,IAAI,CAAC;oBACP,mBAAmB;oBACnBC,MAAMJ,MAAMI,IAAI;oBAChBF,MAAMF,MAAME,IAAI;oBAChB,mBAAmB;oBACnBG,QAAQL,MAAMK,MAAM,CAACP,MAAM,CAAC,CAACC,KAAKO;wBAChCP,GAAG,CAACO,MAAMC,IAAI,CAAC,GAAG;4BAChBV,QAAQD,kBAAkB;mCACrBU,MAAMT,MAAM;gCACf;oCACEO,MAAM;oCACNF,MAAM;gCACR;6BACD;wBACH;wBAEA,OAAOH;oBACT,GAAG,CAAC;gBACN;gBAEA;YAEF,KAAK;YACL,KAAK;gBACH,mBAAmB;gBACnBE,SAASA,OAAOO,MAAM,CAACZ,kBAAkBI,MAAMH,MAAM;gBACrD;YAEF,KAAK;gBAAQ;oBACX,IAAIY,YAAY,EAAE;oBAElB,mBAAmB;oBACnBT,MAAMU,IAAI,CAACC,OAAO,CAAC,CAACC;wBAClB,IAAI,UAAUA,KAAK;4BACjBH,UAAUN,IAAI,CAAC;gCACbC,MAAMQ,IAAIR,IAAI;gCACdF,MAAMF,MAAME,IAAI;gCAChBL,QAAQD,kBAAkBgB,IAAIf,MAAM;4BACtC;4BACA;wBACF;wBAEAY,YAAYA,UAAUD,MAAM,CAACZ,kBAAkBgB,IAAIf,MAAM;oBAC3D;oBAEAI,SAASA,OAAOO,MAAM,CAACC;oBAEvB;gBACF;YAEA,KAAK;YACL,KAAK;gBACHV,IAAII,IAAI,CAAC;oBACP,mBAAmB;oBACnBC,MAAMJ,MAAMI,IAAI;oBAChBF,MAAMF,MAAME,IAAI;oBAChBW,SAAS,aAAab,QAAQc,QAAQd,MAAMa,OAAO,IAAI;oBACvD,mBAAmB;oBACnBE,YAAYf,MAAMe,UAAU;gBAC9B;gBAEA;YAEF;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,3 +1,4 @@
|
|
|
1
|
+
import type { ClientFieldConfig } from '../fields/config/client.js';
|
|
1
2
|
import type { Field, FieldAffectingData, FieldPresentationalOnly } from '../fields/config/types.js';
|
|
2
3
|
/**
|
|
3
4
|
* Flattens a collection's fields into a single array of fields, as long
|
|
@@ -6,6 +7,6 @@ import type { Field, FieldAffectingData, FieldPresentationalOnly } from '../fiel
|
|
|
6
7
|
* @param fields
|
|
7
8
|
* @param keepPresentationalFields if true, will skip flattening fields that are presentational only
|
|
8
9
|
*/
|
|
9
|
-
declare const flattenFields: (fields: Field[], keepPresentationalFields?: boolean) => (FieldAffectingData | FieldPresentationalOnly)[];
|
|
10
|
+
declare const flattenFields: (fields: (ClientFieldConfig | Field)[], keepPresentationalFields?: boolean) => (FieldAffectingData | FieldPresentationalOnly)[];
|
|
10
11
|
export default flattenFields;
|
|
11
12
|
//# sourceMappingURL=flattenTopLevelFields.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flattenTopLevelFields.d.ts","sourceRoot":"","sources":["../../src/utilities/flattenTopLevelFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AASnG;;;;;;GAMG;AACH,QAAA,MAAM,aAAa,WACT,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"flattenTopLevelFields.d.ts","sourceRoot":"","sources":["../../src/utilities/flattenTopLevelFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AACnE,OAAO,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AASnG;;;;;;GAMG;AACH,QAAA,MAAM,aAAa,WACT,CAAC,iBAAiB,GAAG,KAAK,CAAC,EAAE,6BACV,OAAO,KACjC,CAAC,kBAAkB,GAAG,uBAAuB,CAAC,EA0BhD,CAAA;AAED,eAAe,aAAa,CAAA"}
|
|
@@ -19,7 +19,7 @@ import { fieldAffectsData, fieldHasSubFields, fieldIsPresentationalOnly, tabHasN
|
|
|
19
19
|
...flattenFields(field.fields, keepPresentationalFields)
|
|
20
20
|
];
|
|
21
21
|
}
|
|
22
|
-
if (field.type === 'tabs') {
|
|
22
|
+
if (field.type === 'tabs' && 'tabs' in field) {
|
|
23
23
|
return [
|
|
24
24
|
...fieldsToUse,
|
|
25
25
|
...field.tabs.reduce((tabFields, tab)=>{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/flattenTopLevelFields.ts"],"sourcesContent":["import type { Field, FieldAffectingData, FieldPresentationalOnly } from '../fields/config/types.js'\n\nimport {\n fieldAffectsData,\n fieldHasSubFields,\n fieldIsPresentationalOnly,\n tabHasName,\n} from '../fields/config/types.js'\n\n/**\n * Flattens a collection's fields into a single array of fields, as long\n * as the fields do not affect data.\n *\n * @param fields\n * @param keepPresentationalFields if true, will skip flattening fields that are presentational only\n */\nconst flattenFields = (\n fields: Field[],\n keepPresentationalFields?: boolean,\n): (FieldAffectingData | FieldPresentationalOnly)[] => {\n return fields.reduce((fieldsToUse, field) => {\n if (fieldAffectsData(field) || (keepPresentationalFields && fieldIsPresentationalOnly(field))) {\n return [...fieldsToUse, field]\n }\n\n if (fieldHasSubFields(field)) {\n return [...fieldsToUse, ...flattenFields(field.fields, keepPresentationalFields)]\n }\n\n if (field.type === 'tabs') {\n return [\n ...fieldsToUse,\n ...field.tabs.reduce((tabFields, tab) => {\n return [\n ...tabFields,\n ...(tabHasName(tab)\n ? [{ ...tab, type: 'tab' }]\n : flattenFields(tab.fields, keepPresentationalFields)),\n ]\n }, []),\n ]\n }\n return fieldsToUse\n }, [])\n}\n\nexport default flattenFields\n"],"names":["fieldAffectsData","fieldHasSubFields","fieldIsPresentationalOnly","tabHasName","flattenFields","fields","keepPresentationalFields","reduce","fieldsToUse","field","type","tabs","tabFields","tab"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/flattenTopLevelFields.ts"],"sourcesContent":["import type { ClientFieldConfig } from '../fields/config/client.js'\nimport type { Field, FieldAffectingData, FieldPresentationalOnly } from '../fields/config/types.js'\n\nimport {\n fieldAffectsData,\n fieldHasSubFields,\n fieldIsPresentationalOnly,\n tabHasName,\n} from '../fields/config/types.js'\n\n/**\n * Flattens a collection's fields into a single array of fields, as long\n * as the fields do not affect data.\n *\n * @param fields\n * @param keepPresentationalFields if true, will skip flattening fields that are presentational only\n */\nconst flattenFields = (\n fields: (ClientFieldConfig | Field)[],\n keepPresentationalFields?: boolean,\n): (FieldAffectingData | FieldPresentationalOnly)[] => {\n return fields.reduce((fieldsToUse, field) => {\n if (fieldAffectsData(field) || (keepPresentationalFields && fieldIsPresentationalOnly(field))) {\n return [...fieldsToUse, field]\n }\n\n if (fieldHasSubFields(field)) {\n return [...fieldsToUse, ...flattenFields(field.fields, keepPresentationalFields)]\n }\n\n if (field.type === 'tabs' && 'tabs' in field) {\n return [\n ...fieldsToUse,\n ...field.tabs.reduce((tabFields, tab) => {\n return [\n ...tabFields,\n ...(tabHasName(tab)\n ? [{ ...tab, type: 'tab' }]\n : flattenFields(tab.fields, keepPresentationalFields)),\n ]\n }, []),\n ]\n }\n\n return fieldsToUse\n }, [])\n}\n\nexport default flattenFields\n"],"names":["fieldAffectsData","fieldHasSubFields","fieldIsPresentationalOnly","tabHasName","flattenFields","fields","keepPresentationalFields","reduce","fieldsToUse","field","type","tabs","tabFields","tab"],"mappings":"AAGA,SACEA,gBAAgB,EAChBC,iBAAiB,EACjBC,yBAAyB,EACzBC,UAAU,QACL,4BAA2B;AAElC;;;;;;CAMC,GACD,MAAMC,gBAAgB,CACpBC,QACAC;IAEA,OAAOD,OAAOE,MAAM,CAAC,CAACC,aAAaC;QACjC,IAAIT,iBAAiBS,UAAWH,4BAA4BJ,0BAA0BO,QAAS;YAC7F,OAAO;mBAAID;gBAAaC;aAAM;QAChC;QAEA,IAAIR,kBAAkBQ,QAAQ;YAC5B,OAAO;mBAAID;mBAAgBJ,cAAcK,MAAMJ,MAAM,EAAEC;aAA0B;QACnF;QAEA,IAAIG,MAAMC,IAAI,KAAK,UAAU,UAAUD,OAAO;YAC5C,OAAO;mBACFD;mBACAC,MAAME,IAAI,CAACJ,MAAM,CAAC,CAACK,WAAWC;oBAC/B,OAAO;2BACFD;2BACCT,WAAWU,OACX;4BAAC;gCAAE,GAAGA,GAAG;gCAAEH,MAAM;4BAAM;yBAAE,GACzBN,cAAcS,IAAIR,MAAM,EAAEC;qBAC/B;gBACH,GAAG,EAAE;aACN;QACH;QAEA,OAAOE;IACT,GAAG,EAAE;AACP;AAEA,eAAeJ,cAAa"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { tabHasName } from '../fields/config/types.js';
|
|
2
2
|
export async function getEntityPolicies(args) {
|
|
3
|
-
const { id, entity, operations, req
|
|
3
|
+
const { id, type, entity, operations, req } = args;
|
|
4
4
|
const { data, payload, user } = req;
|
|
5
5
|
const isLoggedIn = !!user;
|
|
6
6
|
const policies = {
|
|
@@ -11,9 +11,9 @@ export async function getEntityPolicies(args) {
|
|
|
11
11
|
if (entity.slug) {
|
|
12
12
|
if (type === 'global') {
|
|
13
13
|
return payload.findGlobal({
|
|
14
|
+
slug: entity.slug,
|
|
14
15
|
overrideAccess: true,
|
|
15
|
-
req
|
|
16
|
-
slug: entity.slug
|
|
16
|
+
req
|
|
17
17
|
});
|
|
18
18
|
}
|
|
19
19
|
if (type === 'collection' && id) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/getEntityPolicies.ts"],"sourcesContent":["import type { CollectionPermission, GlobalPermission } from '../auth/types.js'\nimport type { SanitizedCollectionConfig, TypeWithID } from '../collections/config/types.js'\nimport type { Access } from '../config/types.js'\nimport type { FieldAccess } from '../fields/config/types.js'\nimport type { SanitizedGlobalConfig } from '../globals/config/types.js'\nimport type { AllOperations, Document, PayloadRequest, Where } from '../types/index.js'\n\nimport { tabHasName } from '../fields/config/types.js'\n\ntype Args = {\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: {\n [key: string]: any\n }\n}) => Promise<void>\n\nexport async function getEntityPolicies<T extends Args>(args: T): Promise<ReturnType<T>> {\n const { id, entity, operations, req, type } = args\n const { data, payload, user } = req\n const isLoggedIn = !!user\n\n const policies = {\n fields: {},\n } as ReturnType<T>\n\n let docBeingAccessed\n\n async function getEntityDoc({ where }: { where?: Where } = {}): Promise<TypeWithID & Document> {\n if (entity.slug) {\n if (type === 'global') {\n return payload.findGlobal({\n overrideAccess: true,\n req,\n slug: entity.slug,\n })\n }\n\n if (type === 'collection' && id) {\n if (typeof where === 'object') {\n const paginatedRes = await payload.find({\n collection: entity.slug,\n depth: 0,\n limit: 1,\n overrideAccess: true,\n pagination: false,\n req,\n where: {\n ...where,\n and: [\n ...(where.and || []),\n {\n id: {\n equals: id,\n },\n },\n ],\n },\n })\n\n return paginatedRes?.docs?.[0] || undefined\n }\n\n return payload.findByID({\n id,\n collection: entity.slug,\n depth: 0,\n overrideAccess: true,\n req,\n })\n }\n }\n\n return undefined\n }\n\n const createAccessPromise: CreateAccessPromise = async ({\n access,\n accessLevel,\n disableWhere = false,\n operation,\n policiesObj,\n }) => {\n const mutablePolicies = policiesObj\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 // 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 if (typeof accessResult === 'object' && !disableWhere) {\n mutablePolicies[operation] = {\n permission:\n id || type === 'global' ? !!(await getEntityDoc({ where: accessResult })) : true,\n where: accessResult,\n }\n } else if (mutablePolicies[operation]?.permission !== false) {\n mutablePolicies[operation] = {\n permission: !!accessResult,\n }\n }\n }\n\n const executeFieldPolicies = async ({ entityPermission, fields, operation, policiesObj }) => {\n const mutablePolicies = policiesObj.fields\n\n await Promise.all(\n fields.map(async (field) => {\n if (field.name) {\n if (!mutablePolicies[field.name]) mutablePolicies[field.name] = {}\n\n if (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 (field.fields) {\n if (!mutablePolicies[field.name].fields) mutablePolicies[field.name].fields = {}\n\n await executeFieldPolicies({\n entityPermission,\n fields: field.fields,\n operation,\n policiesObj: mutablePolicies[field.name],\n })\n }\n\n if (field?.blocks) {\n if (!mutablePolicies[field.name]?.blocks) mutablePolicies[field.name].blocks = {}\n\n await Promise.all(\n field.blocks.map(async (block) => {\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 entityPermission,\n fields: block.fields,\n operation,\n policiesObj: mutablePolicies[field.name].blocks[block.slug],\n })\n }),\n )\n }\n } else if (field.fields) {\n await executeFieldPolicies({\n entityPermission,\n fields: field.fields,\n operation,\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 entityPermission,\n fields: tab.fields,\n operation,\n policiesObj: mutablePolicies[tab.name],\n })\n } else {\n await executeFieldPolicies({\n entityPermission,\n fields: tab.fields,\n operation,\n policiesObj,\n })\n }\n }),\n )\n }\n }),\n )\n }\n\n await operations.reduce(async (priorOperation, operation) => {\n await priorOperation\n\n let entityAccessPromise: Promise<void>\n\n if (typeof entity.access[operation] === 'function') {\n entityAccessPromise = 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 entityAccessPromise\n\n await executeFieldPolicies({\n entityPermission: policies[operation].permission,\n fields: entity.fields,\n operation,\n policiesObj: policies,\n })\n }, Promise.resolve())\n\n return policies\n}\n"],"names":["tabHasName","getEntityPolicies","args","id","entity","operations","req","type","data","payload","user","isLoggedIn","policies","fields","docBeingAccessed","getEntityDoc","where","slug","findGlobal","overrideAccess","paginatedRes","find","collection","depth","limit","pagination","and","equals","docs","undefined","findByID","createAccessPromise","access","accessLevel","disableWhere","operation","policiesObj","mutablePolicies","then","doc","accessResult","permission","executeFieldPolicies","entityPermission","Promise","all","map","field","name","blocks","block","tabs","tab","reduce","priorOperation","entityAccessPromise","resolve"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/getEntityPolicies.ts"],"sourcesContent":["import type { CollectionPermission, GlobalPermission } from '../auth/types.js'\nimport type { SanitizedCollectionConfig, TypeWithID } from '../collections/config/types.js'\nimport type { Access } from '../config/types.js'\nimport type { FieldAccess } from '../fields/config/types.js'\nimport type { SanitizedGlobalConfig } from '../globals/config/types.js'\nimport type { AllOperations, Document, PayloadRequest, Where } from '../types/index.js'\n\nimport { tabHasName } from '../fields/config/types.js'\n\ntype Args = {\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: {\n [key: string]: any\n }\n}) => Promise<void>\n\nexport async function getEntityPolicies<T extends Args>(args: T): Promise<ReturnType<T>> {\n const { id, type, entity, operations, req } = args\n const { data, payload, user } = req\n const isLoggedIn = !!user\n\n const policies = {\n fields: {},\n } as ReturnType<T>\n\n let docBeingAccessed\n\n async function getEntityDoc({ where }: { where?: Where } = {}): Promise<TypeWithID & Document> {\n if (entity.slug) {\n if (type === 'global') {\n return payload.findGlobal({\n slug: entity.slug,\n overrideAccess: true,\n req,\n })\n }\n\n if (type === 'collection' && id) {\n if (typeof where === 'object') {\n const paginatedRes = await payload.find({\n collection: entity.slug,\n depth: 0,\n limit: 1,\n overrideAccess: true,\n pagination: false,\n req,\n where: {\n ...where,\n and: [\n ...(where.and || []),\n {\n id: {\n equals: id,\n },\n },\n ],\n },\n })\n\n return paginatedRes?.docs?.[0] || undefined\n }\n\n return payload.findByID({\n id,\n collection: entity.slug,\n depth: 0,\n overrideAccess: true,\n req,\n })\n }\n }\n\n return undefined\n }\n\n const createAccessPromise: CreateAccessPromise = async ({\n access,\n accessLevel,\n disableWhere = false,\n operation,\n policiesObj,\n }) => {\n const mutablePolicies = policiesObj\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 // 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 if (typeof accessResult === 'object' && !disableWhere) {\n mutablePolicies[operation] = {\n permission:\n id || type === 'global' ? !!(await getEntityDoc({ where: accessResult })) : true,\n where: accessResult,\n }\n } else if (mutablePolicies[operation]?.permission !== false) {\n mutablePolicies[operation] = {\n permission: !!accessResult,\n }\n }\n }\n\n const executeFieldPolicies = async ({ entityPermission, fields, operation, policiesObj }) => {\n const mutablePolicies = policiesObj.fields\n\n await Promise.all(\n fields.map(async (field) => {\n if (field.name) {\n if (!mutablePolicies[field.name]) mutablePolicies[field.name] = {}\n\n if (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 (field.fields) {\n if (!mutablePolicies[field.name].fields) mutablePolicies[field.name].fields = {}\n\n await executeFieldPolicies({\n entityPermission,\n fields: field.fields,\n operation,\n policiesObj: mutablePolicies[field.name],\n })\n }\n\n if (field?.blocks) {\n if (!mutablePolicies[field.name]?.blocks) mutablePolicies[field.name].blocks = {}\n\n await Promise.all(\n field.blocks.map(async (block) => {\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 entityPermission,\n fields: block.fields,\n operation,\n policiesObj: mutablePolicies[field.name].blocks[block.slug],\n })\n }),\n )\n }\n } else if (field.fields) {\n await executeFieldPolicies({\n entityPermission,\n fields: field.fields,\n operation,\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 entityPermission,\n fields: tab.fields,\n operation,\n policiesObj: mutablePolicies[tab.name],\n })\n } else {\n await executeFieldPolicies({\n entityPermission,\n fields: tab.fields,\n operation,\n policiesObj,\n })\n }\n }),\n )\n }\n }),\n )\n }\n\n await operations.reduce(async (priorOperation, operation) => {\n await priorOperation\n\n let entityAccessPromise: Promise<void>\n\n if (typeof entity.access[operation] === 'function') {\n entityAccessPromise = 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 entityAccessPromise\n\n await executeFieldPolicies({\n entityPermission: policies[operation].permission,\n fields: entity.fields,\n operation,\n policiesObj: policies,\n })\n }, Promise.resolve())\n\n return policies\n}\n"],"names":["tabHasName","getEntityPolicies","args","id","type","entity","operations","req","data","payload","user","isLoggedIn","policies","fields","docBeingAccessed","getEntityDoc","where","slug","findGlobal","overrideAccess","paginatedRes","find","collection","depth","limit","pagination","and","equals","docs","undefined","findByID","createAccessPromise","access","accessLevel","disableWhere","operation","policiesObj","mutablePolicies","then","doc","accessResult","permission","executeFieldPolicies","entityPermission","Promise","all","map","field","name","blocks","block","tabs","tab","reduce","priorOperation","entityAccessPromise","resolve"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getObjectDotNotation.d.ts","sourceRoot":"","sources":["../../src/utilities/getObjectDotNotation.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,WAC1B,OAAO,MAAM,EAAE,OAAO,CAAC,QACtB,MAAM,
|
|
1
|
+
{"version":3,"file":"getObjectDotNotation.d.ts","sourceRoot":"","sources":["../../src/utilities/getObjectDotNotation.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,WAC1B,OAAO,MAAM,EAAE,OAAO,CAAC,QACtB,MAAM,iBACG,CAAC,KACf,CAIF,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { SanitizedCollectionConfig } from '../collections/config/types.js';
|
|
2
|
+
import type { Where } from '../types/index.js';
|
|
3
|
+
type Args = {
|
|
4
|
+
collectionConfig: SanitizedCollectionConfig;
|
|
5
|
+
query: {
|
|
6
|
+
search?: string;
|
|
7
|
+
where?: Where;
|
|
8
|
+
};
|
|
9
|
+
};
|
|
10
|
+
export declare const mergeListSearchAndWhere: ({ collectionConfig, query }: Args) => Where;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=mergeListSearchAndWhere.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mergeListSearchAndWhere.d.ts","sourceRoot":"","sources":["../../src/utilities/mergeListSearchAndWhere.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAE/E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAiC9C,KAAK,IAAI,GAAG;IACV,gBAAgB,EAAE,yBAAyB,CAAA;IAC3C,KAAK,EAAE;QACL,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,KAAK,CAAC,EAAE,KAAK,CAAA;KACd,CAAA;CACF,CAAA;AAED,eAAO,MAAM,uBAAuB,gCAAiC,IAAI,KAAG,KA4B3E,CAAA"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { fieldAffectsData } from '../fields/config/types.js';
|
|
2
|
+
import { default as flattenTopLevelFields } from './flattenTopLevelFields.js';
|
|
3
|
+
const hoistQueryParamsToAnd = (where, queryParams)=>{
|
|
4
|
+
if ('and' in where) {
|
|
5
|
+
where.and.push(queryParams);
|
|
6
|
+
} else if ('or' in where) {
|
|
7
|
+
where = {
|
|
8
|
+
and: [
|
|
9
|
+
where,
|
|
10
|
+
queryParams
|
|
11
|
+
]
|
|
12
|
+
};
|
|
13
|
+
} else {
|
|
14
|
+
where = {
|
|
15
|
+
and: [
|
|
16
|
+
where,
|
|
17
|
+
queryParams
|
|
18
|
+
]
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
return where;
|
|
22
|
+
};
|
|
23
|
+
const getTitleField = (collection)=>{
|
|
24
|
+
const { admin: { useAsTitle }, fields } = collection;
|
|
25
|
+
const topLevelFields = flattenTopLevelFields(fields);
|
|
26
|
+
return topLevelFields.find((field)=>fieldAffectsData(field) && field.name === useAsTitle);
|
|
27
|
+
};
|
|
28
|
+
export const mergeListSearchAndWhere = ({ collectionConfig, query })=>{
|
|
29
|
+
const search = query?.search || undefined;
|
|
30
|
+
let where = query?.where || undefined;
|
|
31
|
+
if (search) {
|
|
32
|
+
let copyOfWhere = {
|
|
33
|
+
...where || {}
|
|
34
|
+
};
|
|
35
|
+
const searchAsConditions = (collectionConfig.admin.listSearchableFields || [
|
|
36
|
+
getTitleField(collectionConfig)?.name || 'id'
|
|
37
|
+
]).map((fieldName)=>{
|
|
38
|
+
return {
|
|
39
|
+
[fieldName]: {
|
|
40
|
+
like: search
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
}, []);
|
|
44
|
+
if (searchAsConditions.length > 0) {
|
|
45
|
+
const conditionalSearchFields = {
|
|
46
|
+
or: [
|
|
47
|
+
...searchAsConditions
|
|
48
|
+
]
|
|
49
|
+
};
|
|
50
|
+
copyOfWhere = hoistQueryParamsToAnd(copyOfWhere, conditionalSearchFields);
|
|
51
|
+
}
|
|
52
|
+
where = copyOfWhere;
|
|
53
|
+
}
|
|
54
|
+
return where;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
//# sourceMappingURL=mergeListSearchAndWhere.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/mergeListSearchAndWhere.ts"],"sourcesContent":["import type { SanitizedCollectionConfig } from '../collections/config/types.js'\nimport type { FieldAffectingData } from '../fields/config/types.js'\nimport type { Where } from '../types/index.js'\n\nimport { fieldAffectsData } from '../fields/config/types.js'\nimport { default as flattenTopLevelFields } from './flattenTopLevelFields.js'\n\nconst hoistQueryParamsToAnd = (where: Where, queryParams: Where) => {\n if ('and' in where) {\n where.and.push(queryParams)\n } else if ('or' in where) {\n where = {\n and: [where, queryParams],\n }\n } else {\n where = {\n and: [where, queryParams],\n }\n }\n\n return where\n}\n\nconst getTitleField = (collection: SanitizedCollectionConfig): FieldAffectingData => {\n const {\n admin: { useAsTitle },\n fields,\n } = collection\n\n const topLevelFields = flattenTopLevelFields(fields)\n return topLevelFields.find(\n (field) => fieldAffectsData(field) && field.name === useAsTitle,\n ) as FieldAffectingData\n}\n\ntype Args = {\n collectionConfig: SanitizedCollectionConfig\n query: {\n search?: string\n where?: Where\n }\n}\n\nexport const mergeListSearchAndWhere = ({ collectionConfig, query }: Args): Where => {\n const search = query?.search || undefined\n let where = query?.where || undefined\n\n if (search) {\n let copyOfWhere = { ...(where || {}) }\n\n const searchAsConditions = (\n collectionConfig.admin.listSearchableFields || [getTitleField(collectionConfig)?.name || 'id']\n ).map((fieldName) => {\n return {\n [fieldName]: {\n like: search,\n },\n }\n }, [])\n\n if (searchAsConditions.length > 0) {\n const conditionalSearchFields = {\n or: [...searchAsConditions],\n }\n copyOfWhere = hoistQueryParamsToAnd(copyOfWhere, conditionalSearchFields)\n }\n\n where = copyOfWhere\n }\n\n return where\n}\n"],"names":["fieldAffectsData","default","flattenTopLevelFields","hoistQueryParamsToAnd","where","queryParams","and","push","getTitleField","collection","admin","useAsTitle","fields","topLevelFields","find","field","name","mergeListSearchAndWhere","collectionConfig","query","search","undefined","copyOfWhere","searchAsConditions","listSearchableFields","map","fieldName","like","length","conditionalSearchFields","or"],"mappings":"AAIA,SAASA,gBAAgB,QAAQ,4BAA2B;AAC5D,SAASC,WAAWC,qBAAqB,QAAQ,6BAA4B;AAE7E,MAAMC,wBAAwB,CAACC,OAAcC;IAC3C,IAAI,SAASD,OAAO;QAClBA,MAAME,GAAG,CAACC,IAAI,CAACF;IACjB,OAAO,IAAI,QAAQD,OAAO;QACxBA,QAAQ;YACNE,KAAK;gBAACF;gBAAOC;aAAY;QAC3B;IACF,OAAO;QACLD,QAAQ;YACNE,KAAK;gBAACF;gBAAOC;aAAY;QAC3B;IACF;IAEA,OAAOD;AACT;AAEA,MAAMI,gBAAgB,CAACC;IACrB,MAAM,EACJC,OAAO,EAAEC,UAAU,EAAE,EACrBC,MAAM,EACP,GAAGH;IAEJ,MAAMI,iBAAiBX,sBAAsBU;IAC7C,OAAOC,eAAeC,IAAI,CACxB,CAACC,QAAUf,iBAAiBe,UAAUA,MAAMC,IAAI,KAAKL;AAEzD;AAUA,OAAO,MAAMM,0BAA0B,CAAC,EAAEC,gBAAgB,EAAEC,KAAK,EAAQ;IACvE,MAAMC,SAASD,OAAOC,UAAUC;IAChC,IAAIjB,QAAQe,OAAOf,SAASiB;IAE5B,IAAID,QAAQ;QACV,IAAIE,cAAc;YAAE,GAAIlB,SAAS,CAAC,CAAC;QAAE;QAErC,MAAMmB,qBAAqB,AACzBL,CAAAA,iBAAiBR,KAAK,CAACc,oBAAoB,IAAI;YAAChB,cAAcU,mBAAmBF,QAAQ;SAAK,AAAD,EAC7FS,GAAG,CAAC,CAACC;YACL,OAAO;gBACL,CAACA,UAAU,EAAE;oBACXC,MAAMP;gBACR;YACF;QACF,GAAG,EAAE;QAEL,IAAIG,mBAAmBK,MAAM,GAAG,GAAG;YACjC,MAAMC,0BAA0B;gBAC9BC,IAAI;uBAAIP;iBAAmB;YAC7B;YACAD,cAAcnB,sBAAsBmB,aAAaO;QACnD;QAEAzB,QAAQkB;IACV;IAEA,OAAOlB;AACT,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sanitizeInternalFields.d.ts","sourceRoot":"","sources":["../../src/utilities/sanitizeInternalFields.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,sBAAsB,
|
|
1
|
+
{"version":3,"file":"sanitizeInternalFields.d.ts","sourceRoot":"","sources":["../../src/utilities/sanitizeInternalFields.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,sBAAsB,mDAAoD,CAAC,KAAG,CAiBvE,CAAA;AAEb,eAAe,sBAAsB,CAAA"}
|