payload 3.68.0-internal-debug.591ab42 → 3.68.0-internal.2b8df4a
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/auth/strategies/local/incrementLoginAttempts.js +1 -2
- package/dist/auth/strategies/local/incrementLoginAttempts.js.map +1 -1
- package/dist/bin/generateImportMap/iterateFields.js +1 -2
- package/dist/bin/generateImportMap/iterateFields.js.map +1 -1
- package/dist/bin/index.js +2 -4
- package/dist/bin/index.js.map +1 -1
- package/dist/bin/migrate.js +1 -2
- package/dist/bin/migrate.js.map +1 -1
- package/dist/collections/config/defaults.js +1 -2
- package/dist/collections/config/defaults.js.map +1 -1
- package/dist/config/find.js +1 -2
- package/dist/config/find.js.map +1 -1
- package/dist/errors/APIError.js +1 -2
- package/dist/errors/APIError.js.map +1 -1
- package/dist/errors/AuthenticationError.js.map +1 -1
- package/dist/errors/DuplicateCollection.js.map +1 -1
- package/dist/errors/DuplicateFieldName.js.map +1 -1
- package/dist/errors/DuplicateGlobal.js.map +1 -1
- package/dist/errors/ErrorDeletingFile.js.map +1 -1
- package/dist/errors/FileRetrievalError.js.map +1 -1
- package/dist/errors/FileUploadError.js.map +1 -1
- package/dist/errors/Forbidden.js.map +1 -1
- package/dist/errors/InvalidConfiguration.js.map +1 -1
- package/dist/errors/InvalidFieldJoin.js.map +1 -1
- package/dist/errors/InvalidFieldName.js.map +1 -1
- package/dist/errors/InvalidFieldRelationship.js.map +1 -1
- package/dist/errors/InvalidSchema.js.map +1 -1
- package/dist/errors/Locked.js.map +1 -1
- package/dist/errors/LockedAuth.js.map +1 -1
- package/dist/errors/MissingCollectionLabel.js.map +1 -1
- package/dist/errors/MissingEditorProp.js.map +1 -1
- package/dist/errors/MissingFieldInputOptions.js.map +1 -1
- package/dist/errors/MissingFieldType.js.map +1 -1
- package/dist/errors/MissingFile.js.map +1 -1
- package/dist/errors/NotFound.js.map +1 -1
- package/dist/errors/QueryError.js.map +1 -1
- package/dist/errors/ReservedFieldName.js.map +1 -1
- package/dist/errors/TimestampsRequired.js.map +1 -1
- package/dist/errors/UnauthorizedError.js.map +1 -1
- package/dist/errors/UnverifiedEmail.js.map +1 -1
- package/dist/errors/ValidationError.js.map +1 -1
- package/dist/fields/config/client.js +1 -2
- package/dist/fields/config/client.js.map +1 -1
- package/dist/kv/adapters/DatabaseKVAdapter.js.map +1 -1
- package/dist/queues/errors/index.js.map +1 -1
- package/dist/queues/operations/runJobs/index.js +1 -2
- package/dist/queues/operations/runJobs/index.js.map +1 -1
- package/dist/uploads/fetchAPI-multipart/utilities.js +1 -2
- package/dist/uploads/fetchAPI-multipart/utilities.js.map +1 -1
- package/dist/uploads/generateFileData.js +4 -8
- package/dist/uploads/generateFileData.js.map +1 -1
- package/dist/utilities/createLocalReq.js.map +1 -1
- package/dist/utilities/deepCopyObject.js.map +1 -1
- package/dist/utilities/findUp.js +4 -8
- package/dist/utilities/findUp.js.map +1 -1
- package/dist/utilities/formatErrors.js.map +1 -1
- package/dist/utilities/getFieldPermissions.spec.js +2 -4
- package/dist/utilities/getFieldPermissions.spec.js.map +1 -1
- package/dist/utilities/parseParams/index.spec.js +5 -10
- package/dist/utilities/parseParams/index.spec.js.map +1 -1
- package/dist/utilities/telemetry/conf/index.js.map +1 -1
- package/dist/utilities/transformColumnPreferences.js +1 -2
- package/dist/utilities/transformColumnPreferences.js.map +1 -1
- package/dist/utilities/unflatten.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/uploads/generateFileData.ts"],"sourcesContent":["import type { OutputInfo, Sharp, SharpOptions } from 'sharp'\n\nimport { fileTypeFromBuffer } from 'file-type'\nimport fs from 'fs/promises'\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, UploadEdits } from './types.js'\n\nimport { FileRetrievalError, FileUploadError, Forbidden, MissingFile } from '../errors/index.js'\nimport { canResizeImage } from './canResizeImage.js'\nimport { checkFileRestrictions } from './checkFileRestrictions.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'\nimport { optionallyAppendMetadata } from './optionallyAppendMetadata.js'\ntype Args<T> = {\n collection: Collection\n config: SanitizedConfig\n data: T\n isDuplicating?: boolean\n operation: 'create' | 'update'\n originalDoc?: T\n overwriteExistingFiles?: boolean\n req: PayloadRequest\n throwOnMissingFile?: boolean\n}\n\ntype Result<T> = Promise<{\n data: T\n files: FileToSave[]\n}>\n\nconst shouldReupload = (\n uploadEdits: UploadEdits,\n fileData: Record<string, unknown> | undefined,\n) => {\n if (!fileData) {\n return false\n }\n\n if (uploadEdits.crop || uploadEdits.heightInPixels || uploadEdits.widthInPixels) {\n return true\n }\n\n // Since uploadEdits always has focalPoint, compare to the value in the data if it was changed\n if (uploadEdits.focalPoint) {\n const incomingFocalX = uploadEdits.focalPoint.x\n const incomingFocalY = uploadEdits.focalPoint.y\n\n const currentFocalX = 'focalX' in fileData && fileData.focalX\n const currentFocalY = 'focalY' in fileData && fileData.focalY\n\n const isEqual = incomingFocalX === currentFocalX && incomingFocalY === currentFocalY\n return !isEqual\n }\n\n return false\n}\n\nexport const generateFileData = async <T>({\n collection: { config: collectionConfig },\n data,\n isDuplicating,\n operation,\n originalDoc,\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 = parseUploadEditsFromReqOrIncomingData({\n data,\n isDuplicating,\n operation,\n originalDoc,\n req,\n })\n\n const {\n constructorOptions,\n disableLocalStorage,\n focalPoint: focalPointEnabled = true,\n formatOptions,\n imageSizes,\n resizeOptions,\n staticDir,\n trimOptions,\n withMetadata,\n } = collectionConfig.upload\n\n const staticPath = staticDir\n\n const incomingFileData = isDuplicating ? originalDoc : data\n\n if (\n !file &&\n (isDuplicating || shouldReupload(uploadEdits, incomingFileData as Record<string, unknown>))\n ) {\n const { filename, url } = incomingFileData as unknown as FileData\n\n if (filename && (filename.includes('../') || filename.includes('..\\\\'))) {\n throw new Forbidden(req.t)\n }\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({\n data: incomingFileData as unknown as FileData,\n req,\n uploadConfig: collectionConfig.upload,\n })\n overwriteExistingFiles = true\n }\n } catch (err: unknown) {\n throw new FileRetrievalError(req.t, err instanceof Error ? err.message : undefined)\n }\n }\n\n if (isDuplicating) {\n overwriteExistingFiles = false\n }\n\n if (!file) {\n if (throwOnMissingFile) {\n throw new MissingFile(req.t)\n }\n\n return {\n data,\n files: [],\n }\n }\n\n await checkFileRestrictions({\n collection: collectionConfig,\n file,\n req,\n })\n\n if (!disableLocalStorage) {\n await fs.mkdir(staticPath!, { recursive: true })\n }\n\n let newData = data\n const filesToSave: FileToSave[] = []\n const fileData: Partial<FileData> = {}\n const fileIsAnimatedType = ['image/avif', 'image/gif', 'image/webp'].includes(file.mimetype)\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(\n resizeOptions || formatOptions || trimOptions || constructorOptions || file.tempFilePath,\n )\n\n const sharpOptions: SharpOptions = { ...constructorOptions }\n\n if (fileIsAnimatedType) {\n sharpOptions.animated = true\n }\n\n if (sharp && (fileIsAnimatedType || fileHasAdjustments)) {\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 (fileHasAdjustments) {\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\n if (fileSupportsResize || isImage(file.mimetype)) {\n dimensions = await getImageSize(file)\n fileData.width = dimensions.width\n fileData.height = dimensions.height\n }\n\n if (sharpFile) {\n const metadata = await sharpFile.metadata()\n sharpFile = await optionallyAppendMetadata({\n req,\n sharpFile,\n withMetadata: withMetadata!,\n })\n fileBuffer = await sharpFile.toBuffer({ resolveWithObject: true })\n ;({ ext, mime } = (await fileTypeFromBuffer(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()?.split('?')[0]\n } else {\n ext = ''\n }\n }\n\n // Adjust SVG mime type. fromBuffer modifies it.\n if (mime === 'application/xml' && ext === 'svg') {\n mime = 'image/svg+xml'\n }\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: staticPath!,\n })\n }\n\n fileData.filename = fsSafeName\n let fileForResize = file\n\n if (cropData && sharp) {\n const { data: croppedImage, info } = await cropImage({\n cropData,\n dimensions: dimensions!,\n file,\n heightInPixels: uploadEdits.heightInPixels!,\n req,\n sharp,\n widthInPixels: uploadEdits.widthInPixels!,\n withMetadata,\n })\n\n // Apply resize after cropping to ensure it conforms to resizeOptions\n if (resizeOptions && !resizeOptions.withoutEnlargement) {\n const resizedAfterCrop = await sharp(croppedImage)\n .resize({\n fit: resizeOptions?.fit || 'cover',\n height: resizeOptions?.height,\n position: resizeOptions?.position || 'center',\n width: resizeOptions?.width,\n })\n .toBuffer({ resolveWithObject: true })\n\n filesToSave.push({\n buffer: resizedAfterCrop.data,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n fileForResize = {\n ...fileForResize,\n data: resizedAfterCrop.data,\n size: resizedAfterCrop.info.size,\n }\n\n fileData.width = resizedAfterCrop.info.width\n fileData.height = resizedAfterCrop.info.height\n if (fileIsAnimatedType) {\n const metadata = await sharpFile!.metadata()\n fileData.height = metadata.pages\n ? resizedAfterCrop.info.height / metadata.pages\n : resizedAfterCrop.info.height\n }\n fileData.filesize = resizedAfterCrop.info.size\n } else {\n // If resizeOptions is not present, just save the cropped image\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\n fileData.width = info.width\n fileData.height = info.height\n if (fileIsAnimatedType) {\n const metadata = await sharpFile!.metadata()\n fileData.height = metadata.pages ? info.height / metadata.pages : info.height\n }\n fileData.filesize = info.size\n }\n\n if (file.tempFilePath) {\n await fs.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.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 (fileSupportsResize && (Array.isArray(imageSizes) || focalPointEnabled !== false)) {\n req.payloadUploadSizes = {}\n const { focalPoint, 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: staticPath!,\n uploadEdits,\n withMetadata,\n })\n\n fileData.sizes = sizeData\n fileData.focalX = focalPoint?.x\n fileData.focalY = focalPoint?.y\n filesToSave.push(...sizesToSave)\n }\n } catch (err) {\n req.payload.logger.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\n/**\n * Parse upload edits from req or incoming data\n */\nfunction parseUploadEditsFromReqOrIncomingData(args: {\n data: unknown\n isDuplicating?: boolean\n operation: 'create' | 'update'\n originalDoc: unknown\n req: PayloadRequest\n}): UploadEdits {\n const { data, isDuplicating, operation, originalDoc, req } = args\n\n // Get intended focal point change from query string or incoming data\n const uploadEdits =\n req.query?.uploadEdits && typeof req.query.uploadEdits === 'object'\n ? (req.query.uploadEdits as UploadEdits)\n : {}\n\n if (uploadEdits.focalPoint) {\n return uploadEdits\n }\n\n const incomingData = data as FileData\n const origDoc = originalDoc as FileData\n\n if (origDoc && 'focalX' in origDoc && 'focalY' in origDoc) {\n // If no change in focal point, return undefined.\n // This prevents a refocal operation triggered from admin, because it always sends the focal point.\n if (incomingData.focalX === origDoc.focalX && incomingData.focalY === origDoc.focalY) {\n return undefined!\n }\n\n if (isDuplicating) {\n uploadEdits.focalPoint = {\n x: incomingData?.focalX || origDoc.focalX!,\n y: incomingData?.focalY || origDoc.focalX!,\n }\n }\n }\n\n if (incomingData?.focalX && incomingData?.focalY) {\n uploadEdits.focalPoint = {\n x: incomingData.focalX,\n y: incomingData.focalY,\n }\n return uploadEdits\n }\n\n // If no focal point is set, default to center\n if (operation === 'create') {\n uploadEdits.focalPoint = {\n x: 50,\n y: 50,\n }\n }\n\n return uploadEdits\n}\n"],"names":["fileTypeFromBuffer","fs","sanitize","FileRetrievalError","FileUploadError","Forbidden","MissingFile","canResizeImage","checkFileRestrictions","cropImage","getExternalFile","getFileByPath","getImageSize","getSafeFileName","resizeAndTransformImageSizes","isImage","optionallyAppendMetadata","shouldReupload","uploadEdits","fileData","crop","heightInPixels","widthInPixels","focalPoint","incomingFocalX","x","incomingFocalY","y","currentFocalX","focalX","currentFocalY","focalY","isEqual","generateFileData","collection","config","collectionConfig","data","isDuplicating","operation","originalDoc","overwriteExistingFiles","req","throwOnMissingFile","upload","files","sharp","payload","file","parseUploadEditsFromReqOrIncomingData","constructorOptions","disableLocalStorage","focalPointEnabled","formatOptions","imageSizes","resizeOptions","staticDir","trimOptions","withMetadata","staticPath","incomingFileData","filename","url","includes","t","startsWith","filePath","response","uploadConfig","err","Error","message","undefined","mkdir","recursive","newData","filesToSave","fileIsAnimatedType","mimetype","cropData","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","split","pop","mimeType","baseFilename","substring","lastIndexOf","collectionSlug","slug","desiredFilename","fileForResize","croppedImage","withoutEnlargement","resizedAfterCrop","fit","position","push","buffer","path","writeFile","Array","isArray","payloadUploadSizes","sizeData","sizesToSave","savedFilename","sizes","logger","error","args","query","incomingData","origDoc"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/uploads/generateFileData.ts"],"sourcesContent":["import type { OutputInfo, Sharp, SharpOptions } from 'sharp'\n\nimport { fileTypeFromBuffer } from 'file-type'\nimport fs from 'fs/promises'\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, UploadEdits } from './types.js'\n\nimport { FileRetrievalError, FileUploadError, Forbidden, MissingFile } from '../errors/index.js'\nimport { canResizeImage } from './canResizeImage.js'\nimport { checkFileRestrictions } from './checkFileRestrictions.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'\nimport { optionallyAppendMetadata } from './optionallyAppendMetadata.js'\ntype Args<T> = {\n collection: Collection\n config: SanitizedConfig\n data: T\n isDuplicating?: boolean\n operation: 'create' | 'update'\n originalDoc?: T\n overwriteExistingFiles?: boolean\n req: PayloadRequest\n throwOnMissingFile?: boolean\n}\n\ntype Result<T> = Promise<{\n data: T\n files: FileToSave[]\n}>\n\nconst shouldReupload = (\n uploadEdits: UploadEdits,\n fileData: Record<string, unknown> | undefined,\n) => {\n if (!fileData) {\n return false\n }\n\n if (uploadEdits.crop || uploadEdits.heightInPixels || uploadEdits.widthInPixels) {\n return true\n }\n\n // Since uploadEdits always has focalPoint, compare to the value in the data if it was changed\n if (uploadEdits.focalPoint) {\n const incomingFocalX = uploadEdits.focalPoint.x\n const incomingFocalY = uploadEdits.focalPoint.y\n\n const currentFocalX = 'focalX' in fileData && fileData.focalX\n const currentFocalY = 'focalY' in fileData && fileData.focalY\n\n const isEqual = incomingFocalX === currentFocalX && incomingFocalY === currentFocalY\n return !isEqual\n }\n\n return false\n}\n\nexport const generateFileData = async <T>({\n collection: { config: collectionConfig },\n data,\n isDuplicating,\n operation,\n originalDoc,\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 = parseUploadEditsFromReqOrIncomingData({\n data,\n isDuplicating,\n operation,\n originalDoc,\n req,\n })\n\n const {\n constructorOptions,\n disableLocalStorage,\n focalPoint: focalPointEnabled = true,\n formatOptions,\n imageSizes,\n resizeOptions,\n staticDir,\n trimOptions,\n withMetadata,\n } = collectionConfig.upload\n\n const staticPath = staticDir\n\n const incomingFileData = isDuplicating ? originalDoc : data\n\n if (\n !file &&\n (isDuplicating || shouldReupload(uploadEdits, incomingFileData as Record<string, unknown>))\n ) {\n const { filename, url } = incomingFileData as unknown as FileData\n\n if (filename && (filename.includes('../') || filename.includes('..\\\\'))) {\n throw new Forbidden(req.t)\n }\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({\n data: incomingFileData as unknown as FileData,\n req,\n uploadConfig: collectionConfig.upload,\n })\n overwriteExistingFiles = true\n }\n } catch (err: unknown) {\n throw new FileRetrievalError(req.t, err instanceof Error ? err.message : undefined)\n }\n }\n\n if (isDuplicating) {\n overwriteExistingFiles = false\n }\n\n if (!file) {\n if (throwOnMissingFile) {\n throw new MissingFile(req.t)\n }\n\n return {\n data,\n files: [],\n }\n }\n\n await checkFileRestrictions({\n collection: collectionConfig,\n file,\n req,\n })\n\n if (!disableLocalStorage) {\n await fs.mkdir(staticPath!, { recursive: true })\n }\n\n let newData = data\n const filesToSave: FileToSave[] = []\n const fileData: Partial<FileData> = {}\n const fileIsAnimatedType = ['image/avif', 'image/gif', 'image/webp'].includes(file.mimetype)\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(\n resizeOptions || formatOptions || trimOptions || constructorOptions || file.tempFilePath,\n )\n\n const sharpOptions: SharpOptions = { ...constructorOptions }\n\n if (fileIsAnimatedType) {\n sharpOptions.animated = true\n }\n\n if (sharp && (fileIsAnimatedType || fileHasAdjustments)) {\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 (fileHasAdjustments) {\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\n if (fileSupportsResize || isImage(file.mimetype)) {\n dimensions = await getImageSize(file)\n fileData.width = dimensions.width\n fileData.height = dimensions.height\n }\n\n if (sharpFile) {\n const metadata = await sharpFile.metadata()\n sharpFile = await optionallyAppendMetadata({\n req,\n sharpFile,\n withMetadata: withMetadata!,\n })\n fileBuffer = await sharpFile.toBuffer({ resolveWithObject: true })\n ;({ ext, mime } = (await fileTypeFromBuffer(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()?.split('?')[0]\n } else {\n ext = ''\n }\n }\n\n // Adjust SVG mime type. fromBuffer modifies it.\n if (mime === 'application/xml' && ext === 'svg') {\n mime = 'image/svg+xml'\n }\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: staticPath!,\n })\n }\n\n fileData.filename = fsSafeName\n let fileForResize = file\n\n if (cropData && sharp) {\n const { data: croppedImage, info } = await cropImage({\n cropData,\n dimensions: dimensions!,\n file,\n heightInPixels: uploadEdits.heightInPixels!,\n req,\n sharp,\n widthInPixels: uploadEdits.widthInPixels!,\n withMetadata,\n })\n\n // Apply resize after cropping to ensure it conforms to resizeOptions\n if (resizeOptions && !resizeOptions.withoutEnlargement) {\n const resizedAfterCrop = await sharp(croppedImage)\n .resize({\n fit: resizeOptions?.fit || 'cover',\n height: resizeOptions?.height,\n position: resizeOptions?.position || 'center',\n width: resizeOptions?.width,\n })\n .toBuffer({ resolveWithObject: true })\n\n filesToSave.push({\n buffer: resizedAfterCrop.data,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n fileForResize = {\n ...fileForResize,\n data: resizedAfterCrop.data,\n size: resizedAfterCrop.info.size,\n }\n\n fileData.width = resizedAfterCrop.info.width\n fileData.height = resizedAfterCrop.info.height\n if (fileIsAnimatedType) {\n const metadata = await sharpFile!.metadata()\n fileData.height = metadata.pages\n ? resizedAfterCrop.info.height / metadata.pages\n : resizedAfterCrop.info.height\n }\n fileData.filesize = resizedAfterCrop.info.size\n } else {\n // If resizeOptions is not present, just save the cropped image\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\n fileData.width = info.width\n fileData.height = info.height\n if (fileIsAnimatedType) {\n const metadata = await sharpFile!.metadata()\n fileData.height = metadata.pages ? info.height / metadata.pages : info.height\n }\n fileData.filesize = info.size\n }\n\n if (file.tempFilePath) {\n await fs.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.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 (fileSupportsResize && (Array.isArray(imageSizes) || focalPointEnabled !== false)) {\n req.payloadUploadSizes = {}\n const { focalPoint, 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: staticPath!,\n uploadEdits,\n withMetadata,\n })\n\n fileData.sizes = sizeData\n fileData.focalX = focalPoint?.x\n fileData.focalY = focalPoint?.y\n filesToSave.push(...sizesToSave)\n }\n } catch (err) {\n req.payload.logger.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\n/**\n * Parse upload edits from req or incoming data\n */\nfunction parseUploadEditsFromReqOrIncomingData(args: {\n data: unknown\n isDuplicating?: boolean\n operation: 'create' | 'update'\n originalDoc: unknown\n req: PayloadRequest\n}): UploadEdits {\n const { data, isDuplicating, operation, originalDoc, req } = args\n\n // Get intended focal point change from query string or incoming data\n const uploadEdits =\n req.query?.uploadEdits && typeof req.query.uploadEdits === 'object'\n ? (req.query.uploadEdits as UploadEdits)\n : {}\n\n if (uploadEdits.focalPoint) {\n return uploadEdits\n }\n\n const incomingData = data as FileData\n const origDoc = originalDoc as FileData\n\n if (origDoc && 'focalX' in origDoc && 'focalY' in origDoc) {\n // If no change in focal point, return undefined.\n // This prevents a refocal operation triggered from admin, because it always sends the focal point.\n if (incomingData.focalX === origDoc.focalX && incomingData.focalY === origDoc.focalY) {\n return undefined!\n }\n\n if (isDuplicating) {\n uploadEdits.focalPoint = {\n x: incomingData?.focalX || origDoc.focalX!,\n y: incomingData?.focalY || origDoc.focalX!,\n }\n }\n }\n\n if (incomingData?.focalX && incomingData?.focalY) {\n uploadEdits.focalPoint = {\n x: incomingData.focalX,\n y: incomingData.focalY,\n }\n return uploadEdits\n }\n\n // If no focal point is set, default to center\n if (operation === 'create') {\n uploadEdits.focalPoint = {\n x: 50,\n y: 50,\n }\n }\n\n return uploadEdits\n}\n"],"names":["fileTypeFromBuffer","fs","sanitize","FileRetrievalError","FileUploadError","Forbidden","MissingFile","canResizeImage","checkFileRestrictions","cropImage","getExternalFile","getFileByPath","getImageSize","getSafeFileName","resizeAndTransformImageSizes","isImage","optionallyAppendMetadata","shouldReupload","uploadEdits","fileData","crop","heightInPixels","widthInPixels","focalPoint","incomingFocalX","x","incomingFocalY","y","currentFocalX","focalX","currentFocalY","focalY","isEqual","generateFileData","collection","config","collectionConfig","data","isDuplicating","operation","originalDoc","overwriteExistingFiles","req","throwOnMissingFile","upload","files","sharp","payload","file","parseUploadEditsFromReqOrIncomingData","constructorOptions","disableLocalStorage","focalPointEnabled","formatOptions","imageSizes","resizeOptions","staticDir","trimOptions","withMetadata","staticPath","incomingFileData","filename","url","includes","t","startsWith","filePath","response","uploadConfig","err","Error","message","undefined","mkdir","recursive","newData","filesToSave","fileIsAnimatedType","mimetype","cropData","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","split","pop","mimeType","baseFilename","substring","lastIndexOf","collectionSlug","slug","desiredFilename","fileForResize","croppedImage","withoutEnlargement","resizedAfterCrop","fit","position","push","buffer","path","writeFile","Array","isArray","payloadUploadSizes","sizeData","sizesToSave","savedFilename","sizes","logger","error","args","query","incomingData","origDoc"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/createLocalReq.ts"],"sourcesContent":["import type { Payload, RequestContext, TypedLocale, TypedUser } from '../index.js'\nimport type { PayloadRequest } from '../types/index.js'\n\nimport { getDataLoader } from '../collections/dataloader.js'\nimport { getLocalI18n } from '../translations/getLocalI18n.js'\nimport { sanitizeFallbackLocale } from '../utilities/sanitizeFallbackLocale.js'\n\nfunction getRequestContext(\n req: Partial<PayloadRequest> = { context: null } as unknown 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: Partial<PayloadRequest>, urlSuffix?: string) => {\n /**\n * *NOTE*\n * If no URL is provided, the local API was called outside\n * the context of a request. Therefore we create a fake URL object.\n * `ts-expect-error` 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: undefined | URL\n\n function getURLObject() {\n if (urlObject) {\n return urlObject\n }\n\n const fallbackURL = `http://${req.host || 'localhost'}${urlSuffix || ''}`\n\n const urlToUse =\n req?.url || req.payload?.config?.serverURL\n ? `${req.payload?.config.serverURL}${urlSuffix || ''}`\n : fallbackURL\n\n try {\n urlObject = new URL(urlToUse)\n } catch (_err) {\n req.payload?.logger.error(\n `Failed to create URL object from URL: ${urlToUse}, falling back to ${fallbackURL}`,\n )\n\n urlObject = new URL(fallbackURL)\n }\n\n return urlObject\n }\n\n if (!req.host) {\n req.host = getURLObject().host\n }\n\n if (!req.protocol) {\n req.protocol = getURLObject().protocol\n }\n\n if (!req.pathname) {\n req.pathname = getURLObject().pathname\n }\n\n if (!req.searchParams) {\n // @ts-expect-error eslint-disable-next-line no-param-reassign\n req.searchParams = getURLObject().searchParams\n }\n\n if (!req.origin) {\n // @ts-expect-error eslint-disable-next-line no-param-reassign\n req.origin = getURLObject().origin\n }\n\n if (!req?.url) {\n // @ts-expect-error eslint-disable-next-line no-param-reassign\n req.url = getURLObject().href\n }\n}\n\nexport type CreateLocalReqOptions = {\n context?: RequestContext\n fallbackLocale?: false | TypedLocale\n locale?: string\n req?: Partial<PayloadRequest>\n urlSuffix?: string\n user?: TypedUser\n}\n\ntype CreateLocalReq = (options: CreateLocalReqOptions, payload: Payload) => Promise<PayloadRequest>\n\nexport const createLocalReq: CreateLocalReq = async (\n { context, fallbackLocale, locale: localeArg, req = {} as PayloadRequest, urlSuffix, user },\n payload,\n): Promise<PayloadRequest> => {\n const localization = payload.config?.localization\n\n if (localization) {\n const locale = localeArg === '*' ? 'all' : localeArg\n const defaultLocale = localization.defaultLocale\n const localeCandidate = locale || req?.locale || req?.query?.locale\n\n req.locale =\n localeCandidate && typeof localeCandidate === 'string' ? localeCandidate : defaultLocale\n\n const sanitizedFallback = sanitizeFallbackLocale({\n fallbackLocale: fallbackLocale!,\n locale: req.locale,\n localization,\n })\n\n req.fallbackLocale = sanitizedFallback!\n }\n\n const i18n =\n req?.i18n ||\n (await getLocalI18n({ config: payload.config, language: payload.config.i18n.fallbackLanguage }))\n\n if (!req.headers) {\n req.headers = new Headers()\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 as PayloadRequest)\n req.routeParams = req?.routeParams || {}\n req.query = req?.query || {}\n\n attachFakeURLProperties(req, urlSuffix)\n\n return req as PayloadRequest\n}\n"],"names":["getDataLoader","getLocalI18n","sanitizeFallbackLocale","getRequestContext","req","context","Object","keys","length","
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/createLocalReq.ts"],"sourcesContent":["import type { Payload, RequestContext, TypedLocale, TypedUser } from '../index.js'\nimport type { PayloadRequest } from '../types/index.js'\n\nimport { getDataLoader } from '../collections/dataloader.js'\nimport { getLocalI18n } from '../translations/getLocalI18n.js'\nimport { sanitizeFallbackLocale } from '../utilities/sanitizeFallbackLocale.js'\n\nfunction getRequestContext(\n req: Partial<PayloadRequest> = { context: null } as unknown 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: Partial<PayloadRequest>, urlSuffix?: string) => {\n /**\n * *NOTE*\n * If no URL is provided, the local API was called outside\n * the context of a request. Therefore we create a fake URL object.\n * `ts-expect-error` 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: undefined | URL\n\n function getURLObject() {\n if (urlObject) {\n return urlObject\n }\n\n const fallbackURL = `http://${req.host || 'localhost'}${urlSuffix || ''}`\n\n const urlToUse =\n req?.url || req.payload?.config?.serverURL\n ? `${req.payload?.config.serverURL}${urlSuffix || ''}`\n : fallbackURL\n\n try {\n urlObject = new URL(urlToUse)\n } catch (_err) {\n req.payload?.logger.error(\n `Failed to create URL object from URL: ${urlToUse}, falling back to ${fallbackURL}`,\n )\n\n urlObject = new URL(fallbackURL)\n }\n\n return urlObject\n }\n\n if (!req.host) {\n req.host = getURLObject().host\n }\n\n if (!req.protocol) {\n req.protocol = getURLObject().protocol\n }\n\n if (!req.pathname) {\n req.pathname = getURLObject().pathname\n }\n\n if (!req.searchParams) {\n // @ts-expect-error eslint-disable-next-line no-param-reassign\n req.searchParams = getURLObject().searchParams\n }\n\n if (!req.origin) {\n // @ts-expect-error eslint-disable-next-line no-param-reassign\n req.origin = getURLObject().origin\n }\n\n if (!req?.url) {\n // @ts-expect-error eslint-disable-next-line no-param-reassign\n req.url = getURLObject().href\n }\n}\n\nexport type CreateLocalReqOptions = {\n context?: RequestContext\n fallbackLocale?: false | TypedLocale\n locale?: string\n req?: Partial<PayloadRequest>\n urlSuffix?: string\n user?: TypedUser\n}\n\ntype CreateLocalReq = (options: CreateLocalReqOptions, payload: Payload) => Promise<PayloadRequest>\n\nexport const createLocalReq: CreateLocalReq = async (\n { context, fallbackLocale, locale: localeArg, req = {} as PayloadRequest, urlSuffix, user },\n payload,\n): Promise<PayloadRequest> => {\n const localization = payload.config?.localization\n\n if (localization) {\n const locale = localeArg === '*' ? 'all' : localeArg\n const defaultLocale = localization.defaultLocale\n const localeCandidate = locale || req?.locale || req?.query?.locale\n\n req.locale =\n localeCandidate && typeof localeCandidate === 'string' ? localeCandidate : defaultLocale\n\n const sanitizedFallback = sanitizeFallbackLocale({\n fallbackLocale: fallbackLocale!,\n locale: req.locale,\n localization,\n })\n\n req.fallbackLocale = sanitizedFallback!\n }\n\n const i18n =\n req?.i18n ||\n (await getLocalI18n({ config: payload.config, language: payload.config.i18n.fallbackLanguage }))\n\n if (!req.headers) {\n req.headers = new Headers()\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 as PayloadRequest)\n req.routeParams = req?.routeParams || {}\n req.query = req?.query || {}\n\n attachFakeURLProperties(req, urlSuffix)\n\n return req as PayloadRequest\n}\n"],"names":["getDataLoader","getLocalI18n","sanitizeFallbackLocale","getRequestContext","req","context","Object","keys","length","attachFakeURLProperties","urlSuffix","urlObject","getURLObject","fallbackURL","host","urlToUse","url","payload","config","serverURL","URL","_err","logger","error","protocol","pathname","searchParams","origin","href","createLocalReq","fallbackLocale","locale","localeArg","user","localization","defaultLocale","localeCandidate","query","sanitizedFallback","i18n","language","fallbackLanguage","headers","Headers","payloadAPI","t","payloadDataLoader","routeParams"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
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
|
+
{"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","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":"AAAA,qDAAqD,GAGrD;;;;;;;;;;;;;;;;;;AAkBA,GAEA,SAASA,WAAWC,GAAQ;IAC1B,IAAIA,eAAeC,QAAQ;QACzB,OAAOA,OAAOC,IAAI,CAACF;IACrB;IAEA,OAAO,IAAIA,IAAI,WAAW,CAACA,IAAIG,MAAM,CAACC,KAAK,IAAIJ,IAAIK,UAAU,EAAEL,IAAIM,MAAM;AAC3E;AAEA,MAAMC,sBAAsB,IAAIC;AAChCD,oBAAoBE,GAAG,CAACC,MAAM,CAACC,IAAW,IAAID,KAAKC;AACnDJ,oBAAoBE,GAAG,CAACD,KAAK,CAACG,GAAQC,KAAY,IAAIJ,IAAIK,WAAgBC,MAAMZ,IAAI,CAACS,IAAIC;AACzFL,oBAAoBE,GAAG,CAACM,KAAK,CAACJ,GAAQC,KAAY,IAAIG,IAAIF,WAAWC,MAAMZ,IAAI,CAACS,IAAIC;AACpFL,oBAAoBE,GAAG,CAACO,QAAQ,CAACC,QAAkB,IAAID,OAAOC,MAAMC,MAAM,EAAED,MAAME,KAAK;AAEvF,IAAIC,UAA6C;AAEjD,SAASP,WAA6BQ,CAAI,EAAET,EAAmB;IAC7D,MAAMU,OAAOC,OAAOD,IAAI,CAACD;IACzB,MAAMG,KAAK,IAAIV,MAAMQ,KAAKhB,MAAM;IAChC,IAAK,IAAImB,IAAI,GAAGA,IAAIH,KAAKhB,MAAM,EAAEmB,IAAK;QACpC,MAAMC,IAAIJ,IAAI,CAACG,EAAE;QACjB,MAAMzB,MAAMqB,CAAC,CAACK,EAAE;QAChB,IAAI,OAAO1B,QAAQ,YAAYA,QAAQ,MAAM;YAC3CwB,EAAE,CAACE,EAAE,GAAG1B;QACV,OAAO,IAAIA,eAAegB,QAAQ;YAChCQ,EAAE,CAACE,EAAE,GAAG,IAAIV,OAAOhB,IAAIkB,MAAM,EAAElB,IAAImB,KAAK;QAC1C,OAAO,IAAInB,IAAI,WAAW,KAAKuB,UAAWH,CAAAA,UAAUb,oBAAoBoB,GAAG,CAAC3B,IAAI,WAAW,CAAA,GAAI;YAC7FwB,EAAE,CAACE,EAAE,GAAGN,QAAQpB,KAAKY;QACvB,OAAO,IAAIgB,YAAYC,MAAM,CAAC7B,MAAM;YAClCwB,EAAE,CAACE,EAAE,GAAG3B,WAAWC;QACrB,OAAO;YACLwB,EAAE,CAACE,EAAE,GAAGd,GAAGZ;QACb;IACF;IACA,OAAOwB;AACT;AAEA,OAAO,MAAMM,iBAAiB,CAAInB;IAChC,IAAI,OAAOA,MAAM,YAAYA,MAAM,MAAM;QACvC,OAAOA;IACT;IACA,IAAIG,MAAMiB,OAAO,CAACpB,IAAI;QACpB,OAAOE,WAAWF,GAAGmB;IACvB;IACA,IAAInB,aAAaK,QAAQ;QACvB,OAAO,IAAIA,OAAOL,EAAEO,MAAM,EAAEP,EAAEQ,KAAK;IACrC;IAEA,IAAIR,EAAE,WAAW,KAAKY,UAAWH,CAAAA,UAAUb,oBAAoBoB,GAAG,CAAChB,EAAE,WAAW,CAAA,GAAI;QAClF,OAAOS,QAAQT,GAAGmB;IACpB;IACA,MAAME,KAAK,CAAC;IACZ,IAAK,MAAMN,KAAKf,EAAG;QACjB,IAAIY,OAAOU,cAAc,CAACC,IAAI,CAACvB,GAAGe,OAAO,OAAO;YAC9C;QACF;QACA,MAAM1B,MAAMW,CAAC,CAACe,EAAE;QAChB,IAAI,OAAO1B,QAAQ,YAAYA,QAAQ,MAAM;YAC3CgC,EAAE,CAACN,EAAE,GAAG1B;QACV,OAAO,IAAIA,eAAegB,QAAQ;YAChCgB,EAAE,CAACN,EAAE,GAAG,IAAIV,OAAOhB,IAAIkB,MAAM,EAAElB,IAAImB,KAAK;QAC1C,OAAO,IAAInB,IAAI,WAAW,KAAKuB,UAAWH,CAAAA,UAAUb,oBAAoBoB,GAAG,CAAC3B,IAAI,WAAW,CAAA,GAAI;YAC7FgC,EAAE,CAACN,EAAE,GAAGN,QAAQpB,KAAK8B;QACvB,OAAO,IAAIF,YAAYC,MAAM,CAAC7B,MAAM;YAClCgC,EAAE,CAACN,EAAE,GAAG3B,WAAWC;QACrB,OAAO;YACLgC,EAAE,CAACN,EAAE,GAAGI,eAAe9B;QACzB;IACF;IACA,OAAOgC;AACT,EAAC;AAED;;;;AAIA,GAEA;;;;;;;;;CASC,GACD,OAAO,SAASG,qBAA0CC,KAAQ,EAAEC,kBAAkB,KAAK;IACzF,IAAI,OAAOD,UAAU,YAAYA,UAAU,MAAM;QAC/C,OAAOA;IACT,OAAO,IAAItB,MAAMiB,OAAO,CAACK,QAAQ;QAC/B,OAAOA,MAAME,GAAG,CAAC,CAACC,IAChB,OAAOA,MAAM,YAAYA,MAAM,OAAOA,IAAIJ,qBAAqBI,GAAGF;IAEtE,OAAO;QACL,IAAID,iBAAiB1B,MAAM;YACzB,OAAO,IAAIA,KAAK0B;QAClB;QACA,MAAMI,MAA4B,CAAC;QACnC,IAAK,MAAMd,KAAKU,MAAO;YACrB,MAAMK,IAAIL,KAAK,CAACV,EAAE;YAClB,IAAIW,mBAAmBI,MAAMC,WAAW;gBACtC;YACF;YACAF,GAAG,CAACd,EAAE,GACJ,OAAOe,MAAM,YAAYA,MAAM,OAC3BA,IACCN,qBAAqBM,GAAQJ;QACtC;QACA,OAAOG;IACT;AACF;AAEA,OAAO,SAASG,2CAAgEP,KAAQ;IACtF,IACE,OAAOA,UAAU,YACjBA,UAAU,QACV,cAAcA,SACd,OAAOA,MAAMQ,QAAQ,KAAK,UAC1B;QACA,OAAOF;IACT,OAAO,IAAI,OAAON,UAAU,YAAYA,UAAU,MAAM;QACtD,OAAOA;IACT,OAAO,IAAItB,MAAMiB,OAAO,CAACK,QAAQ;QAC/B,OAAOA,MAAME,GAAG,CAAC,CAACC,IAChB,OAAOA,MAAM,YAAYA,MAAM,OAAOA,IAAII,2CAA2CJ;IAEzF,OAAO;QACL,IAAIH,iBAAiB1B,MAAM;YACzB,OAAO,IAAIA,KAAK0B;QAClB;QACA,MAAMI,MAA4B,CAAC;QACnC,IAAK,MAAMd,KAAKU,MAAO;YACrB,MAAMK,IAAIL,KAAK,CAACV,EAAE;YAClBc,GAAG,CAACd,EAAE,GACJ,OAAOe,MAAM,YAAYA,MAAM,OAC3BA,IACCE,2CAA2CF;QACpD;QACA,OAAOD;IACT;AACF;AAEA;;;CAGC,GACD,OAAO,SAASK,sBAAyBC,MAAS,EAAEC,QAA2B,IAAIC,SAAS;IAC1F,IAAIF,WAAW,MAAM;QACnB,OAAO;IACT;IAEA,IAAIC,MAAME,GAAG,CAACH,SAAS;QACrB,OAAOC,MAAMpB,GAAG,CAACmB;IACnB;IAEA,cAAc;IACd,IAAIA,kBAAkBI,MAAM;QAC1B,OAAOJ;IACT;IAEA,cAAc;IACd,IAAIA,kBAAkBpC,MAAM;QAC1B,OAAO,IAAIA,KAAKoC,OAAOK,OAAO;IAChC;IAEA,gBAAgB;IAChB,IAAIL,kBAAkB9B,QAAQ;QAC5B,OAAO,IAAIA,OAAO8B,OAAO5B,MAAM,EAAE4B,OAAO3B,KAAK;IAC/C;IAEA,aAAa;IACb,IAAI2B,kBAAkBtC,KAAK;QACzB,MAAM4C,YAAY,IAAI5C;QACtBuC,MAAMtC,GAAG,CAACqC,QAAQM;QAClB,KAAK,MAAM,CAACC,KAAKjB,MAAM,IAAIU,OAAOQ,OAAO,GAAI;YAC3CF,UAAU3C,GAAG,CAAC4C,KAAKR,sBAAsBT,OAAOW;QAClD;QACA,OAAOK;IACT;IAEA,aAAa;IACb,IAAIN,kBAAkB/B,KAAK;QACzB,MAAMwC,YAAY,IAAIxC;QACtBgC,MAAMtC,GAAG,CAACqC,QAAQS;QAClB,KAAK,MAAMnB,SAASU,OAAOU,MAAM,GAAI;YACnCD,UAAUE,GAAG,CAACZ,sBAAsBT,OAAOW;QAC7C;QACA,OAAOQ;IACT;IAEA,0BAA0B;IAC1B,IAAI,OAAOT,WAAW,YAAYA,WAAW,MAAM;QACjD,IAAI,cAAcA,UAAU,OAAOA,OAAOF,QAAQ,KAAK,UAAU;YAC/D,OAAOE;QACT;QAEA,MAAMY,eAAoB5C,MAAMiB,OAAO,CAACe,UACpC,EAAE,GACFvB,OAAOoC,MAAM,CAACpC,OAAOqC,cAAc,CAACd;QACxCC,MAAMtC,GAAG,CAACqC,QAAQY;QAElB,IAAK,MAAML,OAAOP,OAAQ;YACxB,IACEvB,OAAOsC,SAAS,CAAC5B,cAAc,CAACC,IAAI,CAACY,QAAQO,QAC7C9B,OAAOuC,qBAAqB,CAAChB,QAAQiB,QAAQ,CAACV,MAC9C;gBACAK,YAAY,CAACL,IAAI,GAAGR,sBAAsBC,MAAM,CAACO,IAAI,EAAEN;YACzD;QACF;QAEA,OAAOW;IACT;IAEA,yBAAyB;IACzB,OAAOZ;AACT"}
|
package/dist/utilities/findUp.js
CHANGED
|
@@ -19,8 +19,7 @@ import path from 'path';
|
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
if (!found && dir !== root) {
|
|
22
|
-
dir = path.dirname(dir) // Move up one directory level.
|
|
23
|
-
;
|
|
22
|
+
dir = path.dirname(dir); // Move up one directory level.
|
|
24
23
|
continue;
|
|
25
24
|
}
|
|
26
25
|
}
|
|
@@ -35,8 +34,7 @@ import path from 'path';
|
|
|
35
34
|
return null // Reached the root directory without a match.
|
|
36
35
|
;
|
|
37
36
|
}
|
|
38
|
-
dir = path.dirname(dir) // Move up one directory level.
|
|
39
|
-
;
|
|
37
|
+
dir = path.dirname(dir); // Move up one directory level.
|
|
40
38
|
}
|
|
41
39
|
}
|
|
42
40
|
/**
|
|
@@ -58,8 +56,7 @@ import path from 'path';
|
|
|
58
56
|
}
|
|
59
57
|
}
|
|
60
58
|
if (!found && dir !== root) {
|
|
61
|
-
dir = path.dirname(dir) // Move up one directory level.
|
|
62
|
-
;
|
|
59
|
+
dir = path.dirname(dir); // Move up one directory level.
|
|
63
60
|
continue;
|
|
64
61
|
}
|
|
65
62
|
}
|
|
@@ -74,8 +71,7 @@ import path from 'path';
|
|
|
74
71
|
return null // Reached the root directory without a match.
|
|
75
72
|
;
|
|
76
73
|
}
|
|
77
|
-
dir = path.dirname(dir) // Move up one directory level.
|
|
78
|
-
;
|
|
74
|
+
dir = path.dirname(dir); // Move up one directory level.
|
|
79
75
|
}
|
|
80
76
|
}
|
|
81
77
|
// From https://github.com/sindresorhus/path-exists/blob/main/index.js
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/findUp.ts"],"sourcesContent":["import fs from 'fs'\nimport path from 'path'\n\n/**\n * Synchronously walks up parent directories until a condition is met and/or one of the file names within the fileNames array is found.\n */\nexport function findUpSync({\n condition,\n dir,\n fileNames,\n}: {\n condition?: (dir: string) => boolean | Promise<boolean | string> | string\n dir: string\n fileNames?: string[]\n}): null | string {\n const { root } = path.parse(dir)\n\n while (true) {\n if (fileNames?.length) {\n let found = false\n for (const fileName of fileNames) {\n const filePath = path.join(dir, fileName)\n const exists = pathExistsAndIsAccessibleSync(filePath)\n if (exists) {\n if (!condition) {\n return filePath\n }\n found = true\n break\n }\n }\n if (!found && dir !== root) {\n dir = path.dirname(dir) // Move up one directory level.\n continue\n }\n }\n const result = condition?.(dir)\n if (result === true) {\n return dir\n }\n if (typeof result === 'string' && result?.length) {\n return result\n }\n if (dir === root) {\n return null // Reached the root directory without a match.\n }\n dir = path.dirname(dir) // Move up one directory level.\n }\n}\n\n/**\n * Asynchronously walks up parent directories until a condition is met and/or one of the file names within the fileNames array is found.\n */\nexport async function findUp({\n condition,\n dir,\n fileNames,\n}: {\n condition?: (dir: string) => boolean | Promise<boolean | string> | string\n dir: string\n fileNames?: string[]\n}): Promise<null | string> {\n const { root } = path.parse(dir)\n\n while (true) {\n if (fileNames?.length) {\n let found = false\n for (const fileName of fileNames) {\n const filePath = path.resolve(dir, fileName)\n const exists = await pathExistsAndIsAccessible(filePath)\n if (exists) {\n if (!condition) {\n return filePath\n }\n found = true\n break\n }\n }\n if (!found && dir !== root) {\n dir = path.dirname(dir) // Move up one directory level.\n continue\n }\n }\n const result = await condition?.(dir)\n if (result === true) {\n return dir\n }\n if (typeof result === 'string' && result?.length) {\n return result\n }\n if (dir === root) {\n return null // Reached the root directory without a match.\n }\n dir = path.dirname(dir) // Move up one directory level.\n }\n}\n\n// From https://github.com/sindresorhus/path-exists/blob/main/index.js\n// fs.accessSync is preferred over fs.existsSync as it's usually a good idea\n// to check if the process has permission to read/write to a file before doing so.\n// Also see https://github.com/nodejs/node/issues/39960\nexport function pathExistsAndIsAccessibleSync(path: string) {\n try {\n fs.accessSync(path)\n return true\n } catch {\n return false\n }\n}\n\nexport async function pathExistsAndIsAccessible(path: string) {\n try {\n await fs.promises.access(path)\n return true\n } catch {\n return false\n }\n}\n"],"names":["fs","path","findUpSync","condition","dir","fileNames","root","parse","length","found","fileName","filePath","join","exists","pathExistsAndIsAccessibleSync","dirname","result","findUp","resolve","pathExistsAndIsAccessible","accessSync","promises","access"],"mappings":"AAAA,OAAOA,QAAQ,KAAI;AACnB,OAAOC,UAAU,OAAM;AAEvB;;CAEC,GACD,OAAO,SAASC,WAAW,EACzBC,SAAS,EACTC,GAAG,EACHC,SAAS,EAKV;IACC,MAAM,EAAEC,IAAI,EAAE,GAAGL,KAAKM,KAAK,CAACH;IAE5B,MAAO,KAAM;QACX,IAAIC,WAAWG,QAAQ;YACrB,IAAIC,QAAQ;YACZ,KAAK,MAAMC,YAAYL,UAAW;gBAChC,MAAMM,WAAWV,KAAKW,IAAI,CAACR,KAAKM;gBAChC,MAAMG,SAASC,8BAA8BH;gBAC7C,IAAIE,QAAQ;oBACV,IAAI,CAACV,WAAW;wBACd,OAAOQ;oBACT;oBACAF,QAAQ;oBACR;gBACF;YACF;YACA,IAAI,CAACA,SAASL,QAAQE,MAAM;gBAC1BF,MAAMH,KAAKc,OAAO,CAACX,
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/findUp.ts"],"sourcesContent":["import fs from 'fs'\nimport path from 'path'\n\n/**\n * Synchronously walks up parent directories until a condition is met and/or one of the file names within the fileNames array is found.\n */\nexport function findUpSync({\n condition,\n dir,\n fileNames,\n}: {\n condition?: (dir: string) => boolean | Promise<boolean | string> | string\n dir: string\n fileNames?: string[]\n}): null | string {\n const { root } = path.parse(dir)\n\n while (true) {\n if (fileNames?.length) {\n let found = false\n for (const fileName of fileNames) {\n const filePath = path.join(dir, fileName)\n const exists = pathExistsAndIsAccessibleSync(filePath)\n if (exists) {\n if (!condition) {\n return filePath\n }\n found = true\n break\n }\n }\n if (!found && dir !== root) {\n dir = path.dirname(dir) // Move up one directory level.\n continue\n }\n }\n const result = condition?.(dir)\n if (result === true) {\n return dir\n }\n if (typeof result === 'string' && result?.length) {\n return result\n }\n if (dir === root) {\n return null // Reached the root directory without a match.\n }\n dir = path.dirname(dir) // Move up one directory level.\n }\n}\n\n/**\n * Asynchronously walks up parent directories until a condition is met and/or one of the file names within the fileNames array is found.\n */\nexport async function findUp({\n condition,\n dir,\n fileNames,\n}: {\n condition?: (dir: string) => boolean | Promise<boolean | string> | string\n dir: string\n fileNames?: string[]\n}): Promise<null | string> {\n const { root } = path.parse(dir)\n\n while (true) {\n if (fileNames?.length) {\n let found = false\n for (const fileName of fileNames) {\n const filePath = path.resolve(dir, fileName)\n const exists = await pathExistsAndIsAccessible(filePath)\n if (exists) {\n if (!condition) {\n return filePath\n }\n found = true\n break\n }\n }\n if (!found && dir !== root) {\n dir = path.dirname(dir) // Move up one directory level.\n continue\n }\n }\n const result = await condition?.(dir)\n if (result === true) {\n return dir\n }\n if (typeof result === 'string' && result?.length) {\n return result\n }\n if (dir === root) {\n return null // Reached the root directory without a match.\n }\n dir = path.dirname(dir) // Move up one directory level.\n }\n}\n\n// From https://github.com/sindresorhus/path-exists/blob/main/index.js\n// fs.accessSync is preferred over fs.existsSync as it's usually a good idea\n// to check if the process has permission to read/write to a file before doing so.\n// Also see https://github.com/nodejs/node/issues/39960\nexport function pathExistsAndIsAccessibleSync(path: string) {\n try {\n fs.accessSync(path)\n return true\n } catch {\n return false\n }\n}\n\nexport async function pathExistsAndIsAccessible(path: string) {\n try {\n await fs.promises.access(path)\n return true\n } catch {\n return false\n }\n}\n"],"names":["fs","path","findUpSync","condition","dir","fileNames","root","parse","length","found","fileName","filePath","join","exists","pathExistsAndIsAccessibleSync","dirname","result","findUp","resolve","pathExistsAndIsAccessible","accessSync","promises","access"],"mappings":"AAAA,OAAOA,QAAQ,KAAI;AACnB,OAAOC,UAAU,OAAM;AAEvB;;CAEC,GACD,OAAO,SAASC,WAAW,EACzBC,SAAS,EACTC,GAAG,EACHC,SAAS,EAKV;IACC,MAAM,EAAEC,IAAI,EAAE,GAAGL,KAAKM,KAAK,CAACH;IAE5B,MAAO,KAAM;QACX,IAAIC,WAAWG,QAAQ;YACrB,IAAIC,QAAQ;YACZ,KAAK,MAAMC,YAAYL,UAAW;gBAChC,MAAMM,WAAWV,KAAKW,IAAI,CAACR,KAAKM;gBAChC,MAAMG,SAASC,8BAA8BH;gBAC7C,IAAIE,QAAQ;oBACV,IAAI,CAACV,WAAW;wBACd,OAAOQ;oBACT;oBACAF,QAAQ;oBACR;gBACF;YACF;YACA,IAAI,CAACA,SAASL,QAAQE,MAAM;gBAC1BF,MAAMH,KAAKc,OAAO,CAACX,MAAK,+BAA+B;gBACvD;YACF;QACF;QACA,MAAMY,SAASb,YAAYC;QAC3B,IAAIY,WAAW,MAAM;YACnB,OAAOZ;QACT;QACA,IAAI,OAAOY,WAAW,YAAYA,QAAQR,QAAQ;YAChD,OAAOQ;QACT;QACA,IAAIZ,QAAQE,MAAM;YAChB,OAAO,KAAK,8CAA8C;;QAC5D;QACAF,MAAMH,KAAKc,OAAO,CAACX,MAAK,+BAA+B;IACzD;AACF;AAEA;;CAEC,GACD,OAAO,eAAea,OAAO,EAC3Bd,SAAS,EACTC,GAAG,EACHC,SAAS,EAKV;IACC,MAAM,EAAEC,IAAI,EAAE,GAAGL,KAAKM,KAAK,CAACH;IAE5B,MAAO,KAAM;QACX,IAAIC,WAAWG,QAAQ;YACrB,IAAIC,QAAQ;YACZ,KAAK,MAAMC,YAAYL,UAAW;gBAChC,MAAMM,WAAWV,KAAKiB,OAAO,CAACd,KAAKM;gBACnC,MAAMG,SAAS,MAAMM,0BAA0BR;gBAC/C,IAAIE,QAAQ;oBACV,IAAI,CAACV,WAAW;wBACd,OAAOQ;oBACT;oBACAF,QAAQ;oBACR;gBACF;YACF;YACA,IAAI,CAACA,SAASL,QAAQE,MAAM;gBAC1BF,MAAMH,KAAKc,OAAO,CAACX,MAAK,+BAA+B;gBACvD;YACF;QACF;QACA,MAAMY,SAAS,MAAMb,YAAYC;QACjC,IAAIY,WAAW,MAAM;YACnB,OAAOZ;QACT;QACA,IAAI,OAAOY,WAAW,YAAYA,QAAQR,QAAQ;YAChD,OAAOQ;QACT;QACA,IAAIZ,QAAQE,MAAM;YAChB,OAAO,KAAK,8CAA8C;;QAC5D;QACAF,MAAMH,KAAKc,OAAO,CAACX,MAAK,+BAA+B;IACzD;AACF;AAEA,sEAAsE;AACtE,4EAA4E;AAC5E,kFAAkF;AAClF,uDAAuD;AACvD,OAAO,SAASU,8BAA8Bb,IAAY;IACxD,IAAI;QACFD,GAAGoB,UAAU,CAACnB;QACd,OAAO;IACT,EAAE,OAAM;QACN,OAAO;IACT;AACF;AAEA,OAAO,eAAekB,0BAA0BlB,IAAY;IAC1D,IAAI;QACF,MAAMD,GAAGqB,QAAQ,CAACC,MAAM,CAACrB;QACzB,OAAO;IACT,EAAE,OAAM;QACN,OAAO;IACT;AACF"}
|
|
@@ -1 +1 @@
|
|
|
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","
|
|
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","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,MAAM,WAAW,CAACG,IAAI,KAAKN,uBAAuBG,MAAM,WAAW,CAACG,IAAI,KAAKP,YAAW,KACzFG,SAASK,IAAI,EACb;YACA,OAAO;gBACLC,QAAQ;oBACN;wBACEF,MAAMJ,SAASI,IAAI;wBACnBC,MAAML,SAASK,IAAI;wBACnBE,SAASP,SAASO,OAAO;oBAC3B;iBACD;YACH;QACF;QAEA,+FAA+F;QAC/F,IAAIN,MAAM,WAAW,CAACG,IAAI,KAAKN,uBAAuB,YAAYE,YAAYA,SAASM,MAAM,EAAE;YAC7F,OAAO;gBACLA,QAAQJ,OAAOM,IAAI,CAACR,SAASM,MAAM,EAAEG,MAAM,CACzC,CAACC,KAAKC;oBACJD,IAAIE,IAAI,CAAC;wBACPC,OAAO,AAACb,SAASM,MAAM,AAAQ,CAACK,IAAI,CAACG,IAAI;wBACzCP,SAAS,AAACP,SAASM,MAAM,AAAQ,CAACK,IAAI,CAACJ,OAAO;oBAChD;oBACA,OAAOG;gBACT,GACA,EAAE;YAEN;QACF;QAEA,IAAIK,MAAMC,OAAO,CAAChB,SAASO,OAAO,GAAG;YACnC,OAAO;gBACLD,QAAQN,SAASO,OAAO;YAC1B;QACF;QAEA,IAAIP,SAASI,IAAI,EAAE;YACjB,OAAO;gBACLE,QAAQ;oBACN;wBACEC,SAASP,SAASO,OAAO;oBAC3B;iBACD;YACH;QACF;IACF;IAEA,OAAO;QACLD,QAAQ;YACN;gBACEC,SAAS;YACX;SACD;IACH;AACF,EAAC"}
|
|
@@ -20,8 +20,7 @@ describe('getFieldPermissions with collection fallback', ()=>{
|
|
|
20
20
|
collectionPermissions
|
|
21
21
|
});
|
|
22
22
|
expect(result.read).toBe(true);
|
|
23
|
-
expect(result.operation).toBe(false) // Should be read-only
|
|
24
|
-
;
|
|
23
|
+
expect(result.operation).toBe(false); // Should be read-only
|
|
25
24
|
expect(result.permissions).toEqual({
|
|
26
25
|
read: true
|
|
27
26
|
});
|
|
@@ -40,8 +39,7 @@ describe('getFieldPermissions with collection fallback', ()=>{
|
|
|
40
39
|
permissions: fieldPermissions
|
|
41
40
|
});
|
|
42
41
|
expect(result.read).toBe(true);
|
|
43
|
-
expect(result.operation).toBe(true) // Should have operation permission
|
|
44
|
-
;
|
|
42
|
+
expect(result.operation).toBe(true); // Should have operation permission
|
|
45
43
|
expect(result.permissions).toBe(true);
|
|
46
44
|
});
|
|
47
45
|
it('should not provide access when neither field nor collection has read permission', ()=>{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/getFieldPermissions.spec.ts"],"sourcesContent":["import type { SanitizedDocumentPermissions } from '../auth/types.js'\n\nimport { getFieldPermissions } from './getFieldPermissions.js'\n\ndescribe('getFieldPermissions with collection fallback', () => {\n const mockField = {\n name: 'testField',\n type: 'text' as const,\n }\n\n describe('fallback to collection permissions', () => {\n it('should enable read-only mode when field permissions are missing but collection has read access', () => {\n const fieldPermissions = {} // Empty/sanitized field permissions\n const collectionPermissions: SanitizedDocumentPermissions = {\n read: true,\n fields: {},\n }\n\n const result = getFieldPermissions({\n field: mockField,\n operation: 'update',\n parentName: '',\n permissions: fieldPermissions,\n collectionPermissions,\n })\n\n expect(result.read).toBe(true)\n expect(result.operation).toBe(false) // Should be read-only\n expect(result.permissions).toEqual({ read: true })\n })\n\n it('should respect existing field permissions when they exist', () => {\n const fieldPermissions = true // All permissions are true\n const collectionPermissions: SanitizedDocumentPermissions = {\n read: true,\n fields: {},\n }\n\n const result = getFieldPermissions({\n field: mockField,\n operation: 'update',\n parentName: '',\n permissions: fieldPermissions,\n })\n\n expect(result.read).toBe(true)\n expect(result.operation).toBe(true) // Should have operation permission\n expect(result.permissions).toBe(true)\n })\n\n it('should not provide access when neither field nor collection has read permission', () => {\n const fieldPermissions = {}\n const collectionPermissions: SanitizedDocumentPermissions = {\n // No read permission at collection level\n fields: {},\n }\n\n const result = getFieldPermissions({\n field: mockField,\n operation: 'update',\n parentName: '',\n permissions: fieldPermissions,\n collectionPermissions,\n })\n\n expect(result.read).toBe(false)\n expect(result.operation).toBe(false)\n })\n\n it('should work without collection permissions (backward compatibility)', () => {\n const fieldPermissions = true // All permissions\n\n const result = getFieldPermissions({\n field: mockField,\n operation: 'update',\n parentName: '',\n permissions: fieldPermissions,\n // No collectionPermissions provided\n })\n\n expect(result.read).toBe(true)\n expect(result.operation).toBe(true)\n expect(result.permissions).toBe(true)\n })\n })\n})\n"],"names":["getFieldPermissions","describe","mockField","name","type","it","fieldPermissions","collectionPermissions","read","fields","result","field","operation","parentName","permissions","expect","toBe","toEqual"],"mappings":"AAEA,SAASA,mBAAmB,QAAQ,2BAA0B;AAE9DC,SAAS,gDAAgD;IACvD,MAAMC,YAAY;QAChBC,MAAM;QACNC,MAAM;IACR;IAEAH,SAAS,sCAAsC;QAC7CI,GAAG,kGAAkG;YACnG,MAAMC,mBAAmB,CAAC,EAAE,oCAAoC;;YAChE,MAAMC,wBAAsD;gBAC1DC,MAAM;gBACNC,QAAQ,CAAC;YACX;YAEA,MAAMC,SAASV,oBAAoB;gBACjCW,OAAOT;gBACPU,WAAW;gBACXC,YAAY;gBACZC,aAAaR;gBACbC;YACF;YAEAQ,OAAOL,OAAOF,IAAI,EAAEQ,IAAI,CAAC;YACzBD,OAAOL,OAAOE,SAAS,EAAEI,IAAI,CAAC,
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/getFieldPermissions.spec.ts"],"sourcesContent":["import type { SanitizedDocumentPermissions } from '../auth/types.js'\n\nimport { getFieldPermissions } from './getFieldPermissions.js'\n\ndescribe('getFieldPermissions with collection fallback', () => {\n const mockField = {\n name: 'testField',\n type: 'text' as const,\n }\n\n describe('fallback to collection permissions', () => {\n it('should enable read-only mode when field permissions are missing but collection has read access', () => {\n const fieldPermissions = {} // Empty/sanitized field permissions\n const collectionPermissions: SanitizedDocumentPermissions = {\n read: true,\n fields: {},\n }\n\n const result = getFieldPermissions({\n field: mockField,\n operation: 'update',\n parentName: '',\n permissions: fieldPermissions,\n collectionPermissions,\n })\n\n expect(result.read).toBe(true)\n expect(result.operation).toBe(false) // Should be read-only\n expect(result.permissions).toEqual({ read: true })\n })\n\n it('should respect existing field permissions when they exist', () => {\n const fieldPermissions = true // All permissions are true\n const collectionPermissions: SanitizedDocumentPermissions = {\n read: true,\n fields: {},\n }\n\n const result = getFieldPermissions({\n field: mockField,\n operation: 'update',\n parentName: '',\n permissions: fieldPermissions,\n })\n\n expect(result.read).toBe(true)\n expect(result.operation).toBe(true) // Should have operation permission\n expect(result.permissions).toBe(true)\n })\n\n it('should not provide access when neither field nor collection has read permission', () => {\n const fieldPermissions = {}\n const collectionPermissions: SanitizedDocumentPermissions = {\n // No read permission at collection level\n fields: {},\n }\n\n const result = getFieldPermissions({\n field: mockField,\n operation: 'update',\n parentName: '',\n permissions: fieldPermissions,\n collectionPermissions,\n })\n\n expect(result.read).toBe(false)\n expect(result.operation).toBe(false)\n })\n\n it('should work without collection permissions (backward compatibility)', () => {\n const fieldPermissions = true // All permissions\n\n const result = getFieldPermissions({\n field: mockField,\n operation: 'update',\n parentName: '',\n permissions: fieldPermissions,\n // No collectionPermissions provided\n })\n\n expect(result.read).toBe(true)\n expect(result.operation).toBe(true)\n expect(result.permissions).toBe(true)\n })\n })\n})\n"],"names":["getFieldPermissions","describe","mockField","name","type","it","fieldPermissions","collectionPermissions","read","fields","result","field","operation","parentName","permissions","expect","toBe","toEqual"],"mappings":"AAEA,SAASA,mBAAmB,QAAQ,2BAA0B;AAE9DC,SAAS,gDAAgD;IACvD,MAAMC,YAAY;QAChBC,MAAM;QACNC,MAAM;IACR;IAEAH,SAAS,sCAAsC;QAC7CI,GAAG,kGAAkG;YACnG,MAAMC,mBAAmB,CAAC,EAAE,oCAAoC;;YAChE,MAAMC,wBAAsD;gBAC1DC,MAAM;gBACNC,QAAQ,CAAC;YACX;YAEA,MAAMC,SAASV,oBAAoB;gBACjCW,OAAOT;gBACPU,WAAW;gBACXC,YAAY;gBACZC,aAAaR;gBACbC;YACF;YAEAQ,OAAOL,OAAOF,IAAI,EAAEQ,IAAI,CAAC;YACzBD,OAAOL,OAAOE,SAAS,EAAEI,IAAI,CAAC,QAAO,sBAAsB;YAC3DD,OAAOL,OAAOI,WAAW,EAAEG,OAAO,CAAC;gBAAET,MAAM;YAAK;QAClD;QAEAH,GAAG,6DAA6D;YAC9D,MAAMC,mBAAmB,KAAK,2BAA2B;;YACzD,MAAMC,wBAAsD;gBAC1DC,MAAM;gBACNC,QAAQ,CAAC;YACX;YAEA,MAAMC,SAASV,oBAAoB;gBACjCW,OAAOT;gBACPU,WAAW;gBACXC,YAAY;gBACZC,aAAaR;YACf;YAEAS,OAAOL,OAAOF,IAAI,EAAEQ,IAAI,CAAC;YACzBD,OAAOL,OAAOE,SAAS,EAAEI,IAAI,CAAC,OAAM,mCAAmC;YACvED,OAAOL,OAAOI,WAAW,EAAEE,IAAI,CAAC;QAClC;QAEAX,GAAG,mFAAmF;YACpF,MAAMC,mBAAmB,CAAC;YAC1B,MAAMC,wBAAsD;gBAC1D,yCAAyC;gBACzCE,QAAQ,CAAC;YACX;YAEA,MAAMC,SAASV,oBAAoB;gBACjCW,OAAOT;gBACPU,WAAW;gBACXC,YAAY;gBACZC,aAAaR;gBACbC;YACF;YAEAQ,OAAOL,OAAOF,IAAI,EAAEQ,IAAI,CAAC;YACzBD,OAAOL,OAAOE,SAAS,EAAEI,IAAI,CAAC;QAChC;QAEAX,GAAG,uEAAuE;YACxE,MAAMC,mBAAmB,KAAK,kBAAkB;;YAEhD,MAAMI,SAASV,oBAAoB;gBACjCW,OAAOT;gBACPU,WAAW;gBACXC,YAAY;gBACZC,aAAaR;YAEf;YAEAS,OAAOL,OAAOF,IAAI,EAAEQ,IAAI,CAAC;YACzBD,OAAOL,OAAOE,SAAS,EAAEI,IAAI,CAAC;YAC9BD,OAAOL,OAAOI,WAAW,EAAEE,IAAI,CAAC;QAClC;IACF;AACF"}
|
|
@@ -79,15 +79,13 @@ describe('parseParams', ()=>{
|
|
|
79
79
|
const result = parseParams({
|
|
80
80
|
[param]: 'not-a-number'
|
|
81
81
|
});
|
|
82
|
-
expect(result[param]).toBe('not-a-number') // remains as string
|
|
83
|
-
;
|
|
82
|
+
expect(result[param]).toBe('not-a-number'); // remains as string
|
|
84
83
|
});
|
|
85
84
|
it('should not parse empty string', ()=>{
|
|
86
85
|
const result = parseParams({
|
|
87
86
|
[param]: ''
|
|
88
87
|
});
|
|
89
|
-
expect(result[param]).toBe('') // remains as string
|
|
90
|
-
;
|
|
88
|
+
expect(result[param]).toBe(''); // remains as string
|
|
91
89
|
});
|
|
92
90
|
it('should handle already numeric values', ()=>{
|
|
93
91
|
const result = parseParams({
|
|
@@ -180,8 +178,7 @@ describe('parseParams', ()=>{
|
|
|
180
178
|
const result = parseParams({
|
|
181
179
|
data: ''
|
|
182
180
|
});
|
|
183
|
-
expect(result.data).toBe('') // empty string is not processed, remains as string
|
|
184
|
-
;
|
|
181
|
+
expect(result.data).toBe(''); // empty string is not processed, remains as string
|
|
185
182
|
});
|
|
186
183
|
it('should throw error for invalid JSON', ()=>{
|
|
187
184
|
expect(()=>{
|
|
@@ -316,10 +313,8 @@ describe('parseParams', ()=>{
|
|
|
316
313
|
unknownString: 'test'
|
|
317
314
|
};
|
|
318
315
|
const result = parseParams(params);
|
|
319
|
-
expect(result.unknownBoolean).toBe('true') // should remain string
|
|
320
|
-
;
|
|
321
|
-
expect(result.unknownNumber).toBe('42') // should remain string
|
|
322
|
-
;
|
|
316
|
+
expect(result.unknownBoolean).toBe('true'); // should remain string
|
|
317
|
+
expect(result.unknownNumber).toBe('42'); // should remain string
|
|
323
318
|
expect(result.unknownString).toBe('test');
|
|
324
319
|
});
|
|
325
320
|
it('should only process parameters that exist in the input', ()=>{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/utilities/parseParams/index.spec.ts"],"sourcesContent":["import { parseParams, booleanParams, numberParams } from './index.js'\n\ndescribe('parseParams', () => {\n describe('boolean parameters', () => {\n booleanParams.forEach((param) => {\n describe(param, () => {\n it('should parse string \"true\" to boolean true', () => {\n const result = parseParams({ [param]: 'true' })\n expect(result[param]).toBe(true)\n })\n\n it('should parse string \"false\" to boolean false', () => {\n const result = parseParams({ [param]: 'false' })\n expect(result[param]).toBe(false)\n })\n\n it('should parse boolean true to boolean true', () => {\n const result = parseParams({ [param]: true })\n expect(result[param]).toBe(true)\n })\n\n it('should parse boolean false to boolean false', () => {\n const result = parseParams({ [param]: false })\n expect(result[param]).toBe(false)\n })\n\n it('should return undefined for truthy strings (not exact \"true\")', () => {\n const result = parseParams({ [param]: '1' })\n expect(result[param]).toBeUndefined()\n })\n\n it('should return undefined for falsy strings (not exact \"false\")', () => {\n const result = parseParams({ [param]: '0' })\n expect(result[param]).toBeUndefined()\n })\n\n it('should return undefined for empty string', () => {\n const result = parseParams({ [param]: '' })\n expect(result[param]).toBeUndefined()\n })\n })\n })\n })\n\n describe('number parameters', () => {\n numberParams.forEach((param) => {\n describe(param, () => {\n it('should parse valid number string to number', () => {\n const result = parseParams({ [param]: '42' })\n expect(result[param]).toBe(42)\n })\n\n it('should parse zero string to zero', () => {\n const result = parseParams({ [param]: '0' })\n expect(result[param]).toBe(0)\n })\n\n it('should parse negative number string to negative number', () => {\n const result = parseParams({ [param]: '-5' })\n expect(result[param]).toBe(-5)\n })\n\n it('should parse decimal number string to decimal number', () => {\n const result = parseParams({ [param]: '3.14' })\n expect(result[param]).toBe(3.14)\n })\n\n it('should not parse invalid number strings', () => {\n const result = parseParams({ [param]: 'not-a-number' })\n expect(result[param]).toBe('not-a-number') // remains as string\n })\n\n it('should not parse empty string', () => {\n const result = parseParams({ [param]: '' })\n expect(result[param]).toBe('') // remains as string\n })\n\n it('should handle already numeric values', () => {\n const result = parseParams({ [param]: 123 })\n expect(result[param]).toBe(123)\n })\n })\n })\n })\n\n describe('sort parameter', () => {\n it('should parse comma-separated string to array', () => {\n const result = parseParams({ sort: 'name,createdAt,-updatedAt' })\n expect(result.sort).toEqual(['name', 'createdAt', '-updatedAt'])\n })\n\n it('should parse single value string to array with one element', () => {\n const result = parseParams({ sort: 'name' })\n expect(result.sort).toEqual(['name'])\n })\n\n it('should handle empty string', () => {\n const result = parseParams({ sort: '' })\n expect(result.sort).toEqual([''])\n })\n\n it('should handle comma-separated string with spaces', () => {\n const result = parseParams({ sort: 'name, createdAt , -updatedAt' })\n expect(result.sort).toEqual(['name', ' createdAt ', ' -updatedAt'])\n })\n\n it('should return undefined for non-string sort values', () => {\n const result = parseParams({ sort: 123 as any })\n expect(result.sort).toBeUndefined()\n })\n\n it('should return undefined for null sort values', () => {\n const result = parseParams({ sort: null as any })\n expect(result.sort).toBeUndefined()\n })\n })\n\n describe('data parameter', () => {\n it('should parse valid JSON string', () => {\n const data = { name: 'test', value: 42 }\n const result = parseParams({ data: JSON.stringify(data) })\n expect(result.data).toEqual(data)\n })\n\n it('should parse empty object JSON string', () => {\n const result = parseParams({ data: '{}' })\n expect(result.data).toEqual({})\n })\n\n it('should parse array JSON string', () => {\n const data = [1, 2, 3]\n const result = parseParams({ data: JSON.stringify(data) })\n expect(result.data).toEqual(data)\n })\n\n it('should not process empty string', () => {\n const result = parseParams({ data: '' })\n expect(result.data).toBe('') // empty string is not processed, remains as string\n })\n\n it('should throw error for invalid JSON', () => {\n expect(() => {\n parseParams({ data: 'invalid-json' })\n }).toThrow()\n })\n\n it('should not process non-string data values', () => {\n const result = parseParams({ data: { already: 'parsed' } as any })\n expect(result.data).toEqual({ already: 'parsed' })\n })\n })\n\n describe('special parameters', () => {\n it('should handle populate parameter', () => {\n const result = parseParams({ populate: 'field1,field2' })\n expect(result).toHaveProperty('populate')\n // Note: actual sanitization logic is tested in sanitizePopulateParam tests\n })\n\n it('should handle select parameter', () => {\n const result = parseParams({ select: 'field1,field2' })\n expect(result).toHaveProperty('select')\n // Note: actual sanitization logic is tested in sanitizeSelectParam tests\n })\n\n it('should handle joins parameter', () => {\n const joins = { collection: 'posts' }\n const result = parseParams({ joins })\n expect(result).toHaveProperty('joins')\n // Note: actual sanitization logic is tested in sanitizeJoinParams tests\n })\n })\n\n describe('selectedLocales parameter', () => {\n it('should pass through selectedLocales as-is', () => {\n const selectedLocales = 'en,es,fr'\n const result = parseParams({ selectedLocales })\n expect(result.selectedLocales).toBe(selectedLocales)\n })\n })\n\n describe('publishSpecificLocale parameter', () => {\n it('should pass through publishSpecificLocale as-is', () => {\n const publishSpecificLocale = 'en'\n const result = parseParams({ publishSpecificLocale })\n expect(result.publishSpecificLocale).toBe(publishSpecificLocale)\n })\n })\n\n describe('field parameter', () => {\n it('should pass through field as-is', () => {\n const field = 'myField'\n const result = parseParams({ field })\n expect(result.field).toBe(field)\n })\n })\n\n describe('where parameter', () => {\n it('should pass through where as-is', () => {\n const where = { name: { equals: 'test' } }\n const result = parseParams({ where })\n expect(result.where).toBe(where)\n })\n })\n\n describe('edge cases', () => {\n it('should handle empty params object', () => {\n const result = parseParams({})\n expect(result).toEqual({})\n })\n\n it('should throw error for null params (current implementation bug)', () => {\n expect(() => {\n parseParams(null as any)\n }).toThrow(TypeError)\n })\n\n it('should throw error for undefined params (current implementation bug)', () => {\n expect(() => {\n parseParams(undefined as any)\n }).toThrow(TypeError)\n })\n\n it('should preserve unknown parameters', () => {\n const result = parseParams({ customParam: 'customValue' })\n expect(result.customParam).toBe('customValue')\n })\n\n it('should handle mixed parameter types', () => {\n const result = parseParams({\n draft: 'true',\n depth: '5',\n sort: 'name,createdAt',\n data: '{\"test\": true}',\n customParam: 'custom',\n })\n\n expect(result.draft).toBe(true)\n expect(result.depth).toBe(5)\n expect(result.sort).toEqual(['name', 'createdAt'])\n expect(result.data).toEqual({ test: true })\n expect(result.customParam).toBe('custom')\n })\n })\n\n describe('parameter preservation', () => {\n it('should not modify parameters that are not in known lists', () => {\n const params = {\n unknownBoolean: 'true',\n unknownNumber: '42',\n unknownString: 'test',\n }\n const result = parseParams(params)\n\n expect(result.unknownBoolean).toBe('true') // should remain string\n expect(result.unknownNumber).toBe('42') // should remain string\n expect(result.unknownString).toBe('test')\n })\n\n it('should only process parameters that exist in the input', () => {\n const result = parseParams({ draft: 'true' })\n\n expect(result.draft).toBe(true)\n expect(result).not.toHaveProperty('autosave')\n expect(result).not.toHaveProperty('depth')\n expect(result).not.toHaveProperty('sort')\n })\n })\n})\n"],"names":["parseParams","booleanParams","numberParams","describe","forEach","param","it","result","expect","toBe","toBeUndefined","sort","toEqual","data","name","value","JSON","stringify","toThrow","already","populate","toHaveProperty","select","joins","collection","selectedLocales","publishSpecificLocale","field","where","equals","TypeError","undefined","customParam","draft","depth","test","params","unknownBoolean","unknownNumber","unknownString","not"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/utilities/parseParams/index.spec.ts"],"sourcesContent":["import { parseParams, booleanParams, numberParams } from './index.js'\n\ndescribe('parseParams', () => {\n describe('boolean parameters', () => {\n booleanParams.forEach((param) => {\n describe(param, () => {\n it('should parse string \"true\" to boolean true', () => {\n const result = parseParams({ [param]: 'true' })\n expect(result[param]).toBe(true)\n })\n\n it('should parse string \"false\" to boolean false', () => {\n const result = parseParams({ [param]: 'false' })\n expect(result[param]).toBe(false)\n })\n\n it('should parse boolean true to boolean true', () => {\n const result = parseParams({ [param]: true })\n expect(result[param]).toBe(true)\n })\n\n it('should parse boolean false to boolean false', () => {\n const result = parseParams({ [param]: false })\n expect(result[param]).toBe(false)\n })\n\n it('should return undefined for truthy strings (not exact \"true\")', () => {\n const result = parseParams({ [param]: '1' })\n expect(result[param]).toBeUndefined()\n })\n\n it('should return undefined for falsy strings (not exact \"false\")', () => {\n const result = parseParams({ [param]: '0' })\n expect(result[param]).toBeUndefined()\n })\n\n it('should return undefined for empty string', () => {\n const result = parseParams({ [param]: '' })\n expect(result[param]).toBeUndefined()\n })\n })\n })\n })\n\n describe('number parameters', () => {\n numberParams.forEach((param) => {\n describe(param, () => {\n it('should parse valid number string to number', () => {\n const result = parseParams({ [param]: '42' })\n expect(result[param]).toBe(42)\n })\n\n it('should parse zero string to zero', () => {\n const result = parseParams({ [param]: '0' })\n expect(result[param]).toBe(0)\n })\n\n it('should parse negative number string to negative number', () => {\n const result = parseParams({ [param]: '-5' })\n expect(result[param]).toBe(-5)\n })\n\n it('should parse decimal number string to decimal number', () => {\n const result = parseParams({ [param]: '3.14' })\n expect(result[param]).toBe(3.14)\n })\n\n it('should not parse invalid number strings', () => {\n const result = parseParams({ [param]: 'not-a-number' })\n expect(result[param]).toBe('not-a-number') // remains as string\n })\n\n it('should not parse empty string', () => {\n const result = parseParams({ [param]: '' })\n expect(result[param]).toBe('') // remains as string\n })\n\n it('should handle already numeric values', () => {\n const result = parseParams({ [param]: 123 })\n expect(result[param]).toBe(123)\n })\n })\n })\n })\n\n describe('sort parameter', () => {\n it('should parse comma-separated string to array', () => {\n const result = parseParams({ sort: 'name,createdAt,-updatedAt' })\n expect(result.sort).toEqual(['name', 'createdAt', '-updatedAt'])\n })\n\n it('should parse single value string to array with one element', () => {\n const result = parseParams({ sort: 'name' })\n expect(result.sort).toEqual(['name'])\n })\n\n it('should handle empty string', () => {\n const result = parseParams({ sort: '' })\n expect(result.sort).toEqual([''])\n })\n\n it('should handle comma-separated string with spaces', () => {\n const result = parseParams({ sort: 'name, createdAt , -updatedAt' })\n expect(result.sort).toEqual(['name', ' createdAt ', ' -updatedAt'])\n })\n\n it('should return undefined for non-string sort values', () => {\n const result = parseParams({ sort: 123 as any })\n expect(result.sort).toBeUndefined()\n })\n\n it('should return undefined for null sort values', () => {\n const result = parseParams({ sort: null as any })\n expect(result.sort).toBeUndefined()\n })\n })\n\n describe('data parameter', () => {\n it('should parse valid JSON string', () => {\n const data = { name: 'test', value: 42 }\n const result = parseParams({ data: JSON.stringify(data) })\n expect(result.data).toEqual(data)\n })\n\n it('should parse empty object JSON string', () => {\n const result = parseParams({ data: '{}' })\n expect(result.data).toEqual({})\n })\n\n it('should parse array JSON string', () => {\n const data = [1, 2, 3]\n const result = parseParams({ data: JSON.stringify(data) })\n expect(result.data).toEqual(data)\n })\n\n it('should not process empty string', () => {\n const result = parseParams({ data: '' })\n expect(result.data).toBe('') // empty string is not processed, remains as string\n })\n\n it('should throw error for invalid JSON', () => {\n expect(() => {\n parseParams({ data: 'invalid-json' })\n }).toThrow()\n })\n\n it('should not process non-string data values', () => {\n const result = parseParams({ data: { already: 'parsed' } as any })\n expect(result.data).toEqual({ already: 'parsed' })\n })\n })\n\n describe('special parameters', () => {\n it('should handle populate parameter', () => {\n const result = parseParams({ populate: 'field1,field2' })\n expect(result).toHaveProperty('populate')\n // Note: actual sanitization logic is tested in sanitizePopulateParam tests\n })\n\n it('should handle select parameter', () => {\n const result = parseParams({ select: 'field1,field2' })\n expect(result).toHaveProperty('select')\n // Note: actual sanitization logic is tested in sanitizeSelectParam tests\n })\n\n it('should handle joins parameter', () => {\n const joins = { collection: 'posts' }\n const result = parseParams({ joins })\n expect(result).toHaveProperty('joins')\n // Note: actual sanitization logic is tested in sanitizeJoinParams tests\n })\n })\n\n describe('selectedLocales parameter', () => {\n it('should pass through selectedLocales as-is', () => {\n const selectedLocales = 'en,es,fr'\n const result = parseParams({ selectedLocales })\n expect(result.selectedLocales).toBe(selectedLocales)\n })\n })\n\n describe('publishSpecificLocale parameter', () => {\n it('should pass through publishSpecificLocale as-is', () => {\n const publishSpecificLocale = 'en'\n const result = parseParams({ publishSpecificLocale })\n expect(result.publishSpecificLocale).toBe(publishSpecificLocale)\n })\n })\n\n describe('field parameter', () => {\n it('should pass through field as-is', () => {\n const field = 'myField'\n const result = parseParams({ field })\n expect(result.field).toBe(field)\n })\n })\n\n describe('where parameter', () => {\n it('should pass through where as-is', () => {\n const where = { name: { equals: 'test' } }\n const result = parseParams({ where })\n expect(result.where).toBe(where)\n })\n })\n\n describe('edge cases', () => {\n it('should handle empty params object', () => {\n const result = parseParams({})\n expect(result).toEqual({})\n })\n\n it('should throw error for null params (current implementation bug)', () => {\n expect(() => {\n parseParams(null as any)\n }).toThrow(TypeError)\n })\n\n it('should throw error for undefined params (current implementation bug)', () => {\n expect(() => {\n parseParams(undefined as any)\n }).toThrow(TypeError)\n })\n\n it('should preserve unknown parameters', () => {\n const result = parseParams({ customParam: 'customValue' })\n expect(result.customParam).toBe('customValue')\n })\n\n it('should handle mixed parameter types', () => {\n const result = parseParams({\n draft: 'true',\n depth: '5',\n sort: 'name,createdAt',\n data: '{\"test\": true}',\n customParam: 'custom',\n })\n\n expect(result.draft).toBe(true)\n expect(result.depth).toBe(5)\n expect(result.sort).toEqual(['name', 'createdAt'])\n expect(result.data).toEqual({ test: true })\n expect(result.customParam).toBe('custom')\n })\n })\n\n describe('parameter preservation', () => {\n it('should not modify parameters that are not in known lists', () => {\n const params = {\n unknownBoolean: 'true',\n unknownNumber: '42',\n unknownString: 'test',\n }\n const result = parseParams(params)\n\n expect(result.unknownBoolean).toBe('true') // should remain string\n expect(result.unknownNumber).toBe('42') // should remain string\n expect(result.unknownString).toBe('test')\n })\n\n it('should only process parameters that exist in the input', () => {\n const result = parseParams({ draft: 'true' })\n\n expect(result.draft).toBe(true)\n expect(result).not.toHaveProperty('autosave')\n expect(result).not.toHaveProperty('depth')\n expect(result).not.toHaveProperty('sort')\n })\n })\n})\n"],"names":["parseParams","booleanParams","numberParams","describe","forEach","param","it","result","expect","toBe","toBeUndefined","sort","toEqual","data","name","value","JSON","stringify","toThrow","already","populate","toHaveProperty","select","joins","collection","selectedLocales","publishSpecificLocale","field","where","equals","TypeError","undefined","customParam","draft","depth","test","params","unknownBoolean","unknownNumber","unknownString","not"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/utilities/telemetry/conf/index.ts"],"sourcesContent":["/**\n * Taken & simplified from https://github.com/sindresorhus/conf/blob/main/source/index.ts\n *\n * MIT License\n *\n * Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\nimport assert from 'node:assert'\nimport fs from 'node:fs'\nimport path from 'node:path'\n\nimport { envPaths } from './envPaths.js'\n\nconst createPlainObject = <T = Record<string, unknown>>(): T => Object.create(null)\n\nconst checkValueType = (key: string, value: unknown): void => {\n const nonJsonTypes = new Set(['function', 'symbol', 'undefined'])\n\n const type = typeof value\n\n if (nonJsonTypes.has(type)) {\n throw new TypeError(\n `Setting a value of type \\`${type}\\` for key \\`${key}\\` is not allowed as it's not supported by JSON`,\n )\n }\n}\n\nexport class Conf<T extends Record<string, any> = Record<string, unknown>>\n implements Iterable<[keyof T, T[keyof T]]>\n{\n readonly #options: Readonly<Partial<Options>>\n private readonly _deserialize: Deserialize<T> = (value) => JSON.parse(value)\n private readonly _serialize: Serialize<T> = (value) => JSON.stringify(value, undefined, '\\t')\n\n readonly events: EventTarget\n\n readonly path: string\n\n constructor() {\n const options: Partial<Options> = {\n configFileMode: 0o666,\n configName: 'config',\n fileExtension: 'json',\n projectSuffix: 'nodejs',\n }\n\n const cwd = envPaths('payload', { suffix: options.projectSuffix }).config\n\n this.#options = options\n\n this.events = new EventTarget()\n\n const fileExtension = options.fileExtension ? `.${options.fileExtension}` : ''\n this.path = path.resolve(cwd, `${options.configName ?? 'config'}${fileExtension}`)\n\n const fileStore = this.store\n const store = Object.assign(createPlainObject(), fileStore)\n\n try {\n assert.deepEqual(fileStore, store)\n } catch {\n this.store = store\n }\n }\n\n private _ensureDirectory(): void {\n // Ensure the directory exists as it could have been deleted in the meantime.\n fs.mkdirSync(path.dirname(this.path), { recursive: true })\n }\n\n private _write(value: T): void {\n const data: string | Uint8Array = this._serialize(value)\n\n fs.writeFileSync(this.path, data, { mode: this.#options.configFileMode })\n }\n\n /**\n Delete an item.\n\n @param key - The key of the item to delete.\n */\n delete(key: string): void {\n const { store } = this\n delete store[key]\n\n this.store = store\n }\n\n /**\n Get an item.\n\n @param key - The key of the item to get.\n */\n get<Key extends keyof T>(key: Key): T[Key] {\n const { store } = this\n return store[key]\n }\n\n /**\n Set an item or multiple items at once.\n\n @param key - You can use [dot-notation](https://github.com/sindresorhus/dot-prop) in a key to access nested properties. Or a hashmap of items to set at once.\n @param value - Must be JSON serializable. Trying to set the type `undefined`, `function`, or `symbol` will result in a `TypeError`.\n */\n set<Key extends keyof T>(key: string, value?: T[Key] | unknown): void {\n if (typeof key !== 'string' && typeof key !== 'object') {\n throw new TypeError(\n `Expected \\`key\\` to be of type \\`string\\` or \\`object\\`, got ${typeof key}`,\n )\n }\n\n if (typeof key !== 'object' && value === undefined) {\n throw new TypeError('Use `delete()` to clear values')\n }\n\n const { store } = this\n\n const set = (key: string, value?: T | T[Key] | unknown): void => {\n checkValueType(key, value)\n store[key as Key] = value as T[Key]\n }\n\n if (typeof key === 'object') {\n const object = key\n for (const [key, value] of Object.entries(object)) {\n set(key, value)\n }\n } else {\n set(key, value)\n }\n\n this.store = store\n }\n\n *[Symbol.iterator](): IterableIterator<[keyof T, T[keyof T]]> {\n for (const [key, value] of Object.entries(this.store)) {\n yield [key, value]\n }\n }\n get size(): number {\n return Object.keys(this.store).length\n }\n get store(): T {\n try {\n const dataString = fs.readFileSync(this.path, 'utf8')\n const deserializedData = this._deserialize(dataString)\n return Object.assign(createPlainObject(), deserializedData)\n } catch (error: unknown) {\n if ((error as any)?.code === 'ENOENT') {\n this._ensureDirectory()\n return createPlainObject()\n }\n\n throw error\n }\n }\n\n set store(value: T) {\n this._ensureDirectory()\n\n this._write(value)\n\n this.events.dispatchEvent(new Event('change'))\n }\n}\n\nexport type Options = {\n /**\n The config is cleared if reading the config file causes a `SyntaxError`. This is a good behavior for unimportant data, as the config file is not intended to be hand-edited, so it usually means the config is corrupt and there's nothing the user can do about it anyway. However, if you let the user edit the config file directly, mistakes might happen and it could be more useful to throw an error when the config is invalid instead of clearing.\n\n @default false\n */\n clearInvalidConfig?: boolean\n\n /**\n The [mode](https://en.wikipedia.org/wiki/File-system_permissions#Numeric_notation) that will be used for the config file.\n\n You would usually not need this, but it could be useful if you want to restrict the permissions of the config file. Setting a permission such as `0o600` would result in a config file that can only be accessed by the user running the program.\n\n Note that setting restrictive permissions can cause problems if different users need to read the file. A common problem is a user running your tool with and without `sudo` and then not being able to access the config the second time.\n\n @default 0o666\n */\n readonly configFileMode?: number\n\n /**\n Name of the config file (without extension).\n\n Useful if you need multiple config files for your app or module. For example, different config files between two major versions.\n\n @default 'config'\n */\n configName?: string\n\n /**\n Extension of the config file.\n\n You would usually not need this, but could be useful if you want to interact with a file with a custom file extension that can be associated with your app. These might be simple save/export/preference files that are intended to be shareable or saved outside of the app.\n\n @default 'json'\n */\n fileExtension?: string\n\n readonly projectSuffix?: string\n}\n\nexport type Serialize<T> = (value: T) => string\nexport type Deserialize<T> = (text: string) => T\n"],"names":["assert","fs","path","envPaths","createPlainObject","Object","create","checkValueType","key","value","nonJsonTypes","Set","type","has","TypeError","Conf","_deserialize","JSON","parse","_serialize","stringify","undefined","events","constructor","options","configFileMode","configName","fileExtension","projectSuffix","cwd","suffix","config","EventTarget","resolve","fileStore","store","assign","deepEqual","_ensureDirectory","mkdirSync","dirname","recursive","_write","data","writeFileSync","mode","delete","get","set","object","entries","Symbol","iterator","size","keys","length","dataString","readFileSync","deserializedData","error","code","dispatchEvent","Event"],"mappings":"AAAA;;;;;;;;;;;;CAYC,GAED,OAAOA,YAAY,cAAa;AAChC,OAAOC,QAAQ,UAAS;AACxB,OAAOC,UAAU,YAAW;AAE5B,SAASC,QAAQ,QAAQ,gBAAe;AAExC,MAAMC,oBAAoB,IAAsCC,OAAOC,MAAM,CAAC;AAE9E,MAAMC,iBAAiB,CAACC,KAAaC;IACnC,MAAMC,eAAe,IAAIC,IAAI;QAAC;QAAY;QAAU;KAAY;IAEhE,MAAMC,OAAO,OAAOH;IAEpB,IAAIC,aAAaG,GAAG,CAACD,OAAO;QAC1B,MAAM,IAAIE,UACR,CAAC,0BAA0B,EAAEF,KAAK,aAAa,EAAEJ,IAAI,+CAA+C,CAAC;IAEzG;AACF;AAEA,OAAO,MAAMO;IAGF,CAAA,OAAQ,CAA4B;IAC5BC,eAA+B,CAACP,QAAUQ,KAAKC,KAAK,CAACT,OAAM;IAC3DU,aAA2B,CAACV,QAAUQ,KAAKG,SAAS,CAACX,OAAOY,WAAW,MAAK;IAEpFC,OAAmB;IAEnBpB,KAAY;IAErBqB,aAAc;QACZ,MAAMC,UAA4B;YAChCC,gBAAgB;YAChBC,YAAY;YACZC,eAAe;YACfC,eAAe;QACjB;QAEA,MAAMC,MAAM1B,SAAS,WAAW;YAAE2B,QAAQN,QAAQI,aAAa;QAAC,GAAGG,MAAM;QAEzE,IAAI,CAAC,CAAA,OAAQ,GAAGP;QAEhB,IAAI,CAACF,MAAM,GAAG,IAAIU;QAElB,MAAML,gBAAgBH,QAAQG,aAAa,GAAG,CAAC,CAAC,EAAEH,QAAQG,aAAa,EAAE,GAAG;QAC5E,IAAI,CAACzB,IAAI,GAAGA,KAAK+B,OAAO,CAACJ,KAAK,GAAGL,QAAQE,UAAU,IAAI,WAAWC,eAAe;QAEjF,MAAMO,YAAY,IAAI,CAACC,KAAK;QAC5B,MAAMA,QAAQ9B,OAAO+B,MAAM,CAAChC,qBAAqB8B;QAEjD,IAAI;YACFlC,OAAOqC,SAAS,CAACH,WAAWC;QAC9B,EAAE,OAAM;YACN,IAAI,CAACA,KAAK,GAAGA;QACf;IACF;IAEQG,mBAAyB;QAC/B,6EAA6E;QAC7ErC,GAAGsC,SAAS,CAACrC,KAAKsC,OAAO,CAAC,IAAI,CAACtC,IAAI,GAAG;YAAEuC,WAAW;QAAK;IAC1D;IAEQC,OAAOjC,KAAQ,EAAQ;QAC7B,MAAMkC,OAA4B,IAAI,CAACxB,UAAU,CAACV;QAElDR,GAAG2C,aAAa,CAAC,IAAI,CAAC1C,IAAI,EAAEyC,MAAM;YAAEE,MAAM,IAAI,CAAC,CAAA,OAAQ,CAACpB,cAAc;QAAC;IACzE;IAEA;;;;GAIC,GACDqB,OAAOtC,GAAW,EAAQ;QACxB,MAAM,EAAE2B,KAAK,EAAE,GAAG,IAAI;QACtB,OAAOA,KAAK,CAAC3B,IAAI;QAEjB,IAAI,CAAC2B,KAAK,GAAGA;IACf;IAEA;;;;GAIC,GACDY,IAAyBvC,GAAQ,EAAU;QACzC,MAAM,EAAE2B,KAAK,EAAE,GAAG,IAAI;QACtB,OAAOA,KAAK,CAAC3B,IAAI;IACnB;IAEA;;;;;GAKC,GACDwC,IAAyBxC,GAAW,EAAEC,KAAwB,EAAQ;QACpE,IAAI,OAAOD,QAAQ,YAAY,OAAOA,QAAQ,UAAU;YACtD,MAAM,IAAIM,UACR,CAAC,6DAA6D,EAAE,OAAON,KAAK;QAEhF;QAEA,IAAI,OAAOA,QAAQ,YAAYC,UAAUY,WAAW;YAClD,MAAM,IAAIP,UAAU;QACtB;QAEA,MAAM,EAAEqB,KAAK,EAAE,GAAG,IAAI;QAEtB,MAAMa,MAAM,CAACxC,KAAaC;YACxBF,eAAeC,KAAKC;YACpB0B,KAAK,CAAC3B,IAAW,GAAGC;QACtB;QAEA,IAAI,OAAOD,QAAQ,UAAU;YAC3B,MAAMyC,SAASzC;YACf,KAAK,MAAM,CAACA,KAAKC,MAAM,IAAIJ,OAAO6C,OAAO,CAACD,QAAS;gBACjDD,IAAIxC,KAAKC;YACX;QACF,OAAO;YACLuC,IAAIxC,KAAKC;QACX;QAEA,IAAI,CAAC0B,KAAK,GAAGA;IACf;IAEA,CAAC,CAACgB,OAAOC,QAAQ,CAAC,GAA4C;QAC5D,KAAK,MAAM,CAAC5C,KAAKC,MAAM,IAAIJ,OAAO6C,OAAO,CAAC,IAAI,CAACf,KAAK,EAAG;YACrD,MAAM;gBAAC3B;gBAAKC;aAAM;QACpB;IACF;IACA,IAAI4C,OAAe;QACjB,OAAOhD,OAAOiD,IAAI,CAAC,IAAI,CAACnB,KAAK,EAAEoB,MAAM;IACvC;IACA,IAAIpB,QAAW;QACb,IAAI;YACF,MAAMqB,aAAavD,GAAGwD,YAAY,CAAC,IAAI,CAACvD,IAAI,EAAE;YAC9C,MAAMwD,mBAAmB,IAAI,CAAC1C,YAAY,CAACwC;YAC3C,OAAOnD,OAAO+B,MAAM,CAAChC,qBAAqBsD;QAC5C,EAAE,OAAOC,OAAgB;YACvB,IAAI,AAACA,OAAeC,SAAS,UAAU;gBACrC,IAAI,CAACtB,gBAAgB;gBACrB,OAAOlC;YACT;YAEA,MAAMuD;QACR;IACF;IAEA,IAAIxB,MAAM1B,KAAQ,EAAE;QAClB,IAAI,CAAC6B,gBAAgB;QAErB,IAAI,CAACI,MAAM,CAACjC;QAEZ,IAAI,CAACa,MAAM,CAACuC,aAAa,CAAC,IAAIC,MAAM;IACtC;AACF"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/utilities/telemetry/conf/index.ts"],"sourcesContent":["/**\n * Taken & simplified from https://github.com/sindresorhus/conf/blob/main/source/index.ts\n *\n * MIT License\n *\n * Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\nimport assert from 'node:assert'\nimport fs from 'node:fs'\nimport path from 'node:path'\n\nimport { envPaths } from './envPaths.js'\n\nconst createPlainObject = <T = Record<string, unknown>>(): T => Object.create(null)\n\nconst checkValueType = (key: string, value: unknown): void => {\n const nonJsonTypes = new Set(['function', 'symbol', 'undefined'])\n\n const type = typeof value\n\n if (nonJsonTypes.has(type)) {\n throw new TypeError(\n `Setting a value of type \\`${type}\\` for key \\`${key}\\` is not allowed as it's not supported by JSON`,\n )\n }\n}\n\nexport class Conf<T extends Record<string, any> = Record<string, unknown>>\n implements Iterable<[keyof T, T[keyof T]]>\n{\n readonly #options: Readonly<Partial<Options>>\n private readonly _deserialize: Deserialize<T> = (value) => JSON.parse(value)\n private readonly _serialize: Serialize<T> = (value) => JSON.stringify(value, undefined, '\\t')\n\n readonly events: EventTarget\n\n readonly path: string\n\n constructor() {\n const options: Partial<Options> = {\n configFileMode: 0o666,\n configName: 'config',\n fileExtension: 'json',\n projectSuffix: 'nodejs',\n }\n\n const cwd = envPaths('payload', { suffix: options.projectSuffix }).config\n\n this.#options = options\n\n this.events = new EventTarget()\n\n const fileExtension = options.fileExtension ? `.${options.fileExtension}` : ''\n this.path = path.resolve(cwd, `${options.configName ?? 'config'}${fileExtension}`)\n\n const fileStore = this.store\n const store = Object.assign(createPlainObject(), fileStore)\n\n try {\n assert.deepEqual(fileStore, store)\n } catch {\n this.store = store\n }\n }\n\n private _ensureDirectory(): void {\n // Ensure the directory exists as it could have been deleted in the meantime.\n fs.mkdirSync(path.dirname(this.path), { recursive: true })\n }\n\n private _write(value: T): void {\n const data: string | Uint8Array = this._serialize(value)\n\n fs.writeFileSync(this.path, data, { mode: this.#options.configFileMode })\n }\n\n /**\n Delete an item.\n\n @param key - The key of the item to delete.\n */\n delete(key: string): void {\n const { store } = this\n delete store[key]\n\n this.store = store\n }\n\n /**\n Get an item.\n\n @param key - The key of the item to get.\n */\n get<Key extends keyof T>(key: Key): T[Key] {\n const { store } = this\n return store[key]\n }\n\n /**\n Set an item or multiple items at once.\n\n @param key - You can use [dot-notation](https://github.com/sindresorhus/dot-prop) in a key to access nested properties. Or a hashmap of items to set at once.\n @param value - Must be JSON serializable. Trying to set the type `undefined`, `function`, or `symbol` will result in a `TypeError`.\n */\n set<Key extends keyof T>(key: string, value?: T[Key] | unknown): void {\n if (typeof key !== 'string' && typeof key !== 'object') {\n throw new TypeError(\n `Expected \\`key\\` to be of type \\`string\\` or \\`object\\`, got ${typeof key}`,\n )\n }\n\n if (typeof key !== 'object' && value === undefined) {\n throw new TypeError('Use `delete()` to clear values')\n }\n\n const { store } = this\n\n const set = (key: string, value?: T | T[Key] | unknown): void => {\n checkValueType(key, value)\n store[key as Key] = value as T[Key]\n }\n\n if (typeof key === 'object') {\n const object = key\n for (const [key, value] of Object.entries(object)) {\n set(key, value)\n }\n } else {\n set(key, value)\n }\n\n this.store = store\n }\n\n *[Symbol.iterator](): IterableIterator<[keyof T, T[keyof T]]> {\n for (const [key, value] of Object.entries(this.store)) {\n yield [key, value]\n }\n }\n get size(): number {\n return Object.keys(this.store).length\n }\n get store(): T {\n try {\n const dataString = fs.readFileSync(this.path, 'utf8')\n const deserializedData = this._deserialize(dataString)\n return Object.assign(createPlainObject(), deserializedData)\n } catch (error: unknown) {\n if ((error as any)?.code === 'ENOENT') {\n this._ensureDirectory()\n return createPlainObject()\n }\n\n throw error\n }\n }\n\n set store(value: T) {\n this._ensureDirectory()\n\n this._write(value)\n\n this.events.dispatchEvent(new Event('change'))\n }\n}\n\nexport type Options = {\n /**\n The config is cleared if reading the config file causes a `SyntaxError`. This is a good behavior for unimportant data, as the config file is not intended to be hand-edited, so it usually means the config is corrupt and there's nothing the user can do about it anyway. However, if you let the user edit the config file directly, mistakes might happen and it could be more useful to throw an error when the config is invalid instead of clearing.\n\n @default false\n */\n clearInvalidConfig?: boolean\n\n /**\n The [mode](https://en.wikipedia.org/wiki/File-system_permissions#Numeric_notation) that will be used for the config file.\n\n You would usually not need this, but it could be useful if you want to restrict the permissions of the config file. Setting a permission such as `0o600` would result in a config file that can only be accessed by the user running the program.\n\n Note that setting restrictive permissions can cause problems if different users need to read the file. A common problem is a user running your tool with and without `sudo` and then not being able to access the config the second time.\n\n @default 0o666\n */\n readonly configFileMode?: number\n\n /**\n Name of the config file (without extension).\n\n Useful if you need multiple config files for your app or module. For example, different config files between two major versions.\n\n @default 'config'\n */\n configName?: string\n\n /**\n Extension of the config file.\n\n You would usually not need this, but could be useful if you want to interact with a file with a custom file extension that can be associated with your app. These might be simple save/export/preference files that are intended to be shareable or saved outside of the app.\n\n @default 'json'\n */\n fileExtension?: string\n\n readonly projectSuffix?: string\n}\n\nexport type Serialize<T> = (value: T) => string\nexport type Deserialize<T> = (text: string) => T\n"],"names":["assert","fs","path","envPaths","createPlainObject","Object","create","checkValueType","key","value","nonJsonTypes","Set","type","has","TypeError","Conf","_deserialize","JSON","parse","_serialize","stringify","undefined","events","options","configFileMode","configName","fileExtension","projectSuffix","cwd","suffix","config","EventTarget","resolve","fileStore","store","assign","deepEqual","_ensureDirectory","mkdirSync","dirname","recursive","_write","data","writeFileSync","mode","delete","get","set","object","entries","Symbol","iterator","size","keys","length","dataString","readFileSync","deserializedData","error","code","dispatchEvent","Event"],"mappings":"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"}
|
|
@@ -14,8 +14,7 @@
|
|
|
14
14
|
try {
|
|
15
15
|
columnsToTransform = JSON.parse(columns);
|
|
16
16
|
} catch (e) {
|
|
17
|
-
console.error('Error parsing columns', columns, e) // eslint-disable-line no-console
|
|
18
|
-
;
|
|
17
|
+
console.error('Error parsing columns', columns, e); // eslint-disable-line no-console
|
|
19
18
|
}
|
|
20
19
|
}
|
|
21
20
|
if (columnsToTransform && Array.isArray(columnsToTransform)) {
|