payload 4.0.0-beta.1 → 4.0.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/auth/types.d.ts.map +1 -1
  2. package/dist/auth/types.js.map +1 -1
  3. package/dist/cli/commands/data/utilities.d.ts +1 -1
  4. package/dist/cli/commands/data/utilities.d.ts.map +1 -1
  5. package/dist/cli/commands/data/utilities.js.map +1 -1
  6. package/dist/collections/config/types.d.ts +4 -1
  7. package/dist/collections/config/types.d.ts.map +1 -1
  8. package/dist/collections/config/types.js.map +1 -1
  9. package/dist/collections/operations/utilities/update.js.map +1 -1
  10. package/dist/config/sanitize.js.map +1 -1
  11. package/dist/config/types.d.ts.map +1 -1
  12. package/dist/config/types.js.map +1 -1
  13. package/dist/database/types.d.ts +4 -0
  14. package/dist/database/types.d.ts.map +1 -1
  15. package/dist/database/types.js.map +1 -1
  16. package/dist/fields/config/reservedFieldNames.d.ts.map +1 -1
  17. package/dist/fields/config/reservedFieldNames.js.map +1 -1
  18. package/dist/fields/config/types.d.ts.map +1 -1
  19. package/dist/fields/config/types.js.map +1 -1
  20. package/dist/fields/hooks/afterRead/promise.js.map +1 -1
  21. package/dist/fields/hooks/beforeChange/flattenValidationData.d.ts +14 -0
  22. package/dist/fields/hooks/beforeChange/flattenValidationData.d.ts.map +1 -0
  23. package/dist/fields/hooks/beforeChange/flattenValidationData.js +36 -0
  24. package/dist/fields/hooks/beforeChange/flattenValidationData.js.map +1 -0
  25. package/dist/fields/hooks/beforeChange/promise.d.ts +2 -1
  26. package/dist/fields/hooks/beforeChange/promise.d.ts.map +1 -1
  27. package/dist/fields/hooks/beforeChange/promise.js +96 -22
  28. package/dist/fields/hooks/beforeChange/promise.js.map +1 -1
  29. package/dist/fields/hooks/beforeChange/traverseFields.d.ts +2 -1
  30. package/dist/fields/hooks/beforeChange/traverseFields.d.ts.map +1 -1
  31. package/dist/fields/hooks/beforeChange/traverseFields.js +2 -1
  32. package/dist/fields/hooks/beforeChange/traverseFields.js.map +1 -1
  33. package/dist/globals/config/types.d.ts +2 -1
  34. package/dist/globals/config/types.d.ts.map +1 -1
  35. package/dist/globals/config/types.js.map +1 -1
  36. package/dist/hierarchy/addHierarchyToCollection.d.ts.map +1 -1
  37. package/dist/hierarchy/addHierarchyToCollection.js +32 -21
  38. package/dist/hierarchy/addHierarchyToCollection.js.map +1 -1
  39. package/dist/hierarchy/resolveHierarchyCollections.js +7 -1
  40. package/dist/hierarchy/resolveHierarchyCollections.js.map +1 -1
  41. package/dist/index.bundled.d.ts +12 -3
  42. package/dist/llm-instructions/getInstructionsCollection.d.ts.map +1 -1
  43. package/dist/llm-instructions/getInstructionsCollection.js +2 -0
  44. package/dist/llm-instructions/getInstructionsCollection.js.map +1 -1
  45. package/dist/types/index.d.ts.map +1 -1
  46. package/dist/types/index.js.map +1 -1
  47. package/dist/uploads/fileVersioning/cloudStorage.js.map +1 -1
  48. package/dist/uploads/formatFilesize.js +1 -1
  49. package/dist/uploads/formatFilesize.js.map +1 -1
  50. package/dist/uploads/generateFileData.js.map +1 -1
  51. package/dist/uploads/getFileContentRequirement.js.map +1 -1
  52. package/dist/utilities/entityInputSchema/validateEntityData.d.ts.map +1 -1
  53. package/dist/utilities/entityInputSchema/validateEntityData.js.map +1 -1
  54. package/dist/utilities/getVersionsConfig.js.map +1 -1
  55. package/dist/utilities/telemetry/conf/index.d.ts +4 -1
  56. package/dist/utilities/telemetry/conf/index.d.ts.map +1 -1
  57. package/dist/utilities/telemetry/conf/index.js.map +1 -1
  58. package/dist/versions/isInheritedReadVersionsAccess.js.map +1 -1
  59. package/package.json +21 -21
  60. package/skills/payload/reference/ENDPOINTS.md +3 -9
  61. package/skills/payload/reference/PLUGIN-DEVELOPMENT.md +3 -3
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/uploads/generateFileData.ts"],"sourcesContent":["import { fileTypeFromBuffer } from 'file-type'\nimport fs from 'fs/promises'\nimport { randomUUID } from 'node:crypto'\nimport { openAsBlob } from 'node:fs'\n\nimport type { Collection, TypeWithID } from '../collections/config/types.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { Document, PayloadRequest } from '../types/index.js'\nimport type { ExternalUploadSource } from './sanitizeUploadData.js'\nimport type { PreparedUploadTransformation } from './transformers/uploadTransformerBridge.js'\nimport type { FileData, FileSizes, FileToSave, UploadEdits } from './types.js'\n\nimport { FileRetrievalError, FileUploadError, Forbidden, MissingFile } from '../errors/index.js'\nimport { formatAdminURL } from '../utilities/formatAdminURL.js'\nimport { isNumber } from '../utilities/isNumber.js'\nimport { canResizeImage } from './canResizeImage.js'\nimport { checkFileRestrictions } from './checkFileRestrictions.js'\nimport { downloadFileToBuffer } from './downloadFileToBuffer.js'\nimport { getOriginalFilename } from './fileVersioning/naming.js'\nimport { generateImageSizeFilename } from './generateImageSizeFilename.js'\nimport { getFileByPath } from './getFileByPath.js'\nimport { getFileExtension, getSanitizedUploadFilename } from './getFileTypeIdentity.js'\nimport { getImageSize } from './getImageSize.js'\nimport { getSafeFileName, incrementName } from './getSafeFilename.js'\nimport { hasCropOrResizeEdit } from './hasCropOrResizeEdit.js'\nimport { hasFullFileContents } from './hasFullFileContents.js'\nimport { isProcessableImage } from './isProcessableImage.js'\nimport { parseFilename } from './parseFilename.js'\nimport { planTransformerPipeline } from './transformers/planTransformerPipeline.js'\nimport { transformUploadFile } from './transformers/transformUploadFile.js'\nimport {\n getUploadTransformerInternal,\n setUploadFilePath,\n} from './transformers/uploadTransformerBridge.js'\ntype Args<T> = {\n collection: Collection\n config: SanitizedConfig\n data: T\n draft?: boolean\n externalUploadSource?: ExternalUploadSource\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: undefined | UploadEdits,\n fileData: Record<string, unknown> | undefined,\n) => {\n if (!fileData || !uploadEdits) {\n return false\n }\n\n if (hasCropOrResizeEdit(uploadEdits)) {\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 type TempFileHandling =\n | { sourcePath: string; type: 'copyFromTempFile' }\n | { type: 'skip' }\n | { type: 'useBuffer' }\n\n/**\n * Decides how to get a file's bytes onto disk when no transformer rewrote it (a transformed\n * file is already an in-memory buffer, so it always takes the `useBuffer` path). Copies straight\n * from the temp file when possible, rather than reading a potentially large temp file into memory\n * just to write it back out - see the `generateFileData` function doc for why.\n */\nexport const resolveTempFileHandling = ({\n disableLocalStorage,\n hasProcessedBuffer,\n tempFilePath,\n}: {\n disableLocalStorage: boolean\n hasProcessedBuffer: boolean\n tempFilePath: string | undefined\n}): TempFileHandling => {\n if (hasProcessedBuffer || !tempFilePath) {\n return { type: 'useBuffer' }\n }\n\n return disableLocalStorage\n ? { type: 'skip' }\n : { type: 'copyFromTempFile', sourcePath: tempFilePath }\n}\n\n/**\n * Builds the document's file metadata and the list of files to write to disk.\n *\n * A large client upload may arrive as a temp file instead of an in-memory buffer (see\n * getFileFromUploadInstructions.ts), and `file.data` can hold only a partial probe rather than\n * the full file. To avoid loading such files into memory unnecessarily, no transformer runs\n * unless the full bytes are available, this skips reading a temp file entirely when local\n * storage is disabled, and copies it straight to its destination when local storage is enabled.\n */\nexport const generateFileData = async <T>({\n collection: { config: collectionConfig },\n data,\n draft,\n externalUploadSource,\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 { serverURL } = req.payload.config\n\n let file = isDuplicating ? undefined : req.file\n\n const uploadEdits = parseUploadEditsFromReqOrIncomingData({\n data,\n isDuplicating,\n operation,\n // Only a duplication source informs edit parsing. Updates now also pass `originalDoc` so the\n // stored file can be reprocessed, and that must not change which edits are applied.\n originalDoc: isDuplicating ? originalDoc : undefined,\n req,\n })\n\n const {\n disableLocalStorage,\n focalPoint: focalPointEnabled = true,\n staticDir,\n } = collectionConfig.upload\n const hasManagedCloudStorage = Boolean(collectionConfig.upload.fileOperations)\n const uploadReference = file?.uploadReference\n const hasProviderDirectReference =\n uploadReference && typeof uploadReference === 'object' && !('uploadId' in uploadReference)\n const verifiedOriginal = req.context?._payloadVerifiedProviderOriginal as\n | {\n _objectKey?: string\n filename: string\n key: string\n prefix?: string\n signedReceipt: string\n }\n | undefined\n const providerOriginal =\n hasProviderDirectReference &&\n 'signedReceipt' in uploadReference &&\n uploadReference.signedReceipt === verifiedOriginal?.signedReceipt &&\n verifiedOriginal &&\n typeof collectionConfig.upload.adapter === 'string'\n ? {\n _objectKey: verifiedOriginal._objectKey,\n filename: verifiedOriginal.filename,\n key: verifiedOriginal.key,\n prefix: verifiedOriginal.prefix,\n }\n : undefined\n const shouldStageCloudFiles = hasManagedCloudStorage && !hasProviderDirectReference\n\n const staticPath = staticDir\n\n const incomingFileData: Document = isDuplicating ? originalDoc : data\n const currentFileData = (operation === 'update' ? originalDoc : incomingFileData) as\n | FileData\n | undefined\n const retainedOriginal =\n operation === 'update' &&\n !file &&\n !externalUploadSource &&\n typeof currentFileData?.original?.filename === 'string' &&\n typeof currentFileData.original.url === 'string'\n ? currentFileData.original\n : undefined\n const fileSourceData = externalUploadSource ?? retainedOriginal ?? currentFileData\n let isLocalFile = false\n\n if (\n !file &&\n fileSourceData &&\n (externalUploadSource ||\n isDuplicating ||\n shouldReupload(uploadEdits, incomingFileData as Record<string, unknown>))\n ) {\n const { filename, url } = fileSourceData\n if (filename && (filename.includes('../') || filename.includes('..\\\\'))) {\n throw new Forbidden(req.t)\n }\n\n if ((serverURL && url?.startsWith(serverURL)) || url?.startsWith('/')) {\n isLocalFile = true\n }\n\n try {\n if (!externalUploadSource && !disableLocalStorage && isLocalFile) {\n // File is stored locally\n const filePath = `${staticPath}/${filename}`\n const response = await getFileByPath(filePath)\n file = response\n overwriteExistingFiles = true\n } else if (filename && retainedOriginal && hasManagedCloudStorage) {\n const { retrieveFileResponse } = await import('./endpoints/getFile.js')\n const response = await retrieveFileResponse({\n collection: { config: collectionConfig },\n doc: originalDoc as TypeWithID,\n filename,\n operation: 'transform',\n req,\n })\n if (!response.ok) {\n throw new Error(`Unable to read retained original ${filename}`)\n }\n const buffer = Buffer.from(await response.arrayBuffer())\n file = {\n name: filename,\n data: buffer,\n mimetype: retainedOriginal.mimeType,\n size: buffer.length,\n }\n overwriteExistingFiles = true\n } else if (filename && url) {\n // File is remote\n file = await downloadFileToBuffer({\n data: fileSourceData,\n req,\n uploadConfig: collectionConfig.upload,\n })\n overwriteExistingFiles = !externalUploadSource\n }\n } catch (err: unknown) {\n throw new FileRetrievalError(req.t, err instanceof Error ? err.message : undefined)\n }\n\n if (file && retainedOriginal && currentFileData?.filename) {\n file = { ...file, name: currentFileData.filename }\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: incomingFileData!,\n files: [],\n }\n }\n\n const detectedFileType = await checkFileRestrictions({\n collection: collectionConfig,\n file,\n req,\n })\n\n const shouldUseDetectedFileType =\n detectedFileType &&\n (isProcessableImage(file.mimetype) || isProcessableImage(detectedFileType.mime))\n\n if (shouldUseDetectedFileType && detectedFileType.mime !== file.mimetype) {\n file = { ...file, mimetype: detectedFileType.mime }\n }\n\n if (!disableLocalStorage) {\n await fs.mkdir(staticPath!, { recursive: true })\n }\n\n let newData = incomingFileData as T\n const filesToSave: FileToSave[] = []\n const fileData: Partial<FileData> = {}\n const crop = uploadEdits?.crop\n const isResettingCrop =\n retainedOriginal &&\n crop?.unit === '%' &&\n Number(crop.width) === 100 &&\n Number(crop.height) === 100 &&\n Number(crop.x) === 0 &&\n Number(crop.y) === 0 &&\n (uploadEdits.widthInPixels === undefined ||\n Number(uploadEdits.widthInPixels) === retainedOriginal.width) &&\n (uploadEdits.heightInPixels === undefined ||\n Number(uploadEdits.heightInPixels) === retainedOriginal.height)\n const hasFocalPointChange =\n uploadEdits?.focalPoint &&\n (Number(uploadEdits.focalPoint.x) !== (currentFileData?.focalX ?? 50) ||\n Number(uploadEdits.focalPoint.y) !== (currentFileData?.focalY ?? 50))\n const editsForTransformer = isResettingCrop\n ? { ...uploadEdits, crop: undefined, heightInPixels: undefined, widthInPixels: undefined }\n : uploadEdits\n\n try {\n const pipeline = await planTransformerPipeline({\n args: {\n collectionSlug: collectionConfig.slug,\n mimeType: file.mimetype,\n operation: 'upload',\n req,\n },\n capability: 'transformFile',\n transformers: req.payload.config.upload?.transformers ?? [],\n })\n\n // A large client upload can arrive as a bounded probe alongside a temp file. Transformers\n // need the whole file, so leave such an upload untouched rather than buffering it.\n const canRunTransformers = pipeline.length > 0 && hasFullFileContents(file)\n\n const bridgeTransformers = canRunTransformers\n ? pipeline.filter((transformer) =>\n Boolean(getUploadTransformerInternal(transformer)?.prepareUpload),\n )\n : []\n\n const bridgeTransformer =\n bridgeTransformers.find((transformer) =>\n getUploadTransformerInternal(transformer)!.handlesCollection?.({\n collectionSlug: collectionConfig.slug,\n }),\n ) ?? bridgeTransformers[0]\n\n // The chosen bridge's task options are private to it, so other bridges must not see them.\n const bridgeTaskPipeline = pipeline.filter(\n (transformer) =>\n transformer === bridgeTransformer || !bridgeTransformers.includes(transformer),\n )\n\n let originalWebFile: File | undefined\n let mainWebFile: File | undefined\n let hasDimensionsFromBridge = false\n let sizeResults: PreparedUploadTransformation[] = []\n\n if (canRunTransformers) {\n const fileContents = file.tempFilePath ? await openAsBlob(file.tempFilePath) : file.data\n originalWebFile = new File([fileContents], file.name, { type: file.mimetype })\n if (file.tempFilePath) {\n setUploadFilePath(originalWebFile, file.tempFilePath)\n }\n\n if (bridgeTransformer) {\n const bridge = getUploadTransformerInternal(bridgeTransformer)!\n\n const results = await bridge.prepareUpload!({\n collectionSlug: collectionConfig.slug,\n file: originalWebFile,\n req,\n transform: (task) =>\n transformUploadFile({\n collectionSlug: collectionConfig.slug,\n file: task.file ?? originalWebFile!,\n options: task.options,\n pipeline: bridgeTaskPipeline,\n req,\n }),\n uploadEdits: editsForTransformer,\n })\n\n const mainResult = results.find((result) => result.fieldPath === 'filename')\n\n mainWebFile = mainResult?.file ?? originalWebFile\n fileData.width = mainResult?.width\n fileData.height = mainResult?.height\n hasDimensionsFromBridge = true\n sizeResults = results.filter((result) => result.fieldPath !== 'filename')\n } else {\n mainWebFile = await transformUploadFile({\n collectionSlug: collectionConfig.slug,\n file: originalWebFile,\n options: undefined,\n pipeline,\n req,\n })\n }\n }\n\n // Saved for any resizable image, not just one a transformer processed, so it's kept with no\n // transformer registered and on a header-only client upload.\n if (\n focalPointEnabled &&\n uploadEdits?.focalPoint &&\n (hasDimensionsFromBridge || canResizeImage(file.mimetype))\n ) {\n fileData.focalX = isNumber(uploadEdits.focalPoint.x)\n ? Math.round(uploadEdits.focalPoint.x)\n : 50\n fileData.focalY = isNumber(uploadEdits.focalPoint.y)\n ? Math.round(uploadEdits.focalPoint.y)\n : 50\n }\n\n const fileWasTransformed = Boolean(mainWebFile && mainWebFile !== originalWebFile)\n const hasReusableOriginalMain = Boolean(\n isResettingCrop && !fileWasTransformed && retainedOriginal,\n )\n if (hasReusableOriginalMain && !hasFocalPointChange && retainedOriginal) {\n return {\n data: {\n ...incomingFileData,\n _objectKey: retainedOriginal._objectKey,\n filename: retainedOriginal.filename,\n filesize: retainedOriginal.filesize,\n height: retainedOriginal.height,\n mimeType: retainedOriginal.mimeType,\n original: retainedOriginal,\n prefix: retainedOriginal.prefix,\n url: retainedOriginal.url,\n variants: currentFileData?.variants,\n width: retainedOriginal.width,\n ...(draft ? { _status: 'draft' } : {}),\n } as T,\n files: [],\n }\n }\n const mainBuffer = fileWasTransformed\n ? Buffer.from(await mainWebFile!.arrayBuffer())\n : undefined\n\n // A transformed file is named after what the transformer returned, not the upload.\n const outputName = hasReusableOriginalMain\n ? retainedOriginal!.filename\n : (fileWasTransformed && mainWebFile!.name) || file.name\n\n let mimeType: string\n let ext: string | undefined\n\n if (mainBuffer) {\n // Detected bytes win for binary formats (Sharp keeps the input's name and type on a\n // converted output), but text-like output such as CSV has no signature to detect, so\n // fall back to the type and extension the transformer declared on the returned File.\n const typeResult = await fileTypeFromBuffer(mainBuffer)\n ext =\n typeResult?.ext ?? (getFileExtension(getSanitizedUploadFilename(outputName)) || undefined)\n mimeType = typeResult?.mime ?? (mainWebFile!.type || file.mimetype)\n } else {\n mimeType = file.mimetype\n ext = getFileExtension(getSanitizedUploadFilename(file.name))\n }\n\n // Adjust SVG mime type. fromBuffer modifies it.\n if (mimeType === 'application/xml' && ext === 'svg') {\n mimeType = 'image/svg+xml'\n }\n fileData.mimeType = mimeType\n fileData.filesize = mainBuffer ? mainBuffer.length : file.size\n\n // Only probe formats that could carry dimensions - probing reads the file, and a large\n // non-image upload may only exist as a temp file we deliberately never buffer.\n if (!hasDimensionsFromBridge && isProcessableImage(mimeType)) {\n try {\n const probed = await getImageSize({\n file: mainBuffer ? { ...file, data: mainBuffer, tempFilePath: undefined } : file,\n })\n fileData.width = probed.width\n fileData.height = probed.height\n } catch {\n // Not a recognized image format — leave width/height unset.\n }\n }\n\n let fsSafeName = getSanitizedUploadFilename(outputName, ext)\n const isDuplicatingAnOriginal =\n isDuplicating && file.name === (originalDoc as FileData | undefined)?.original?.filename\n\n // A provider reference without a receipt names an object the client already stored; renaming\n // it would point the document at a key that was never uploaded.\n const isUnverifiedProviderReference = Boolean(hasProviderDirectReference && !providerOriginal)\n\n if (\n !fileWasTransformed &&\n !retainedOriginal &&\n !providerOriginal &&\n !isDuplicatingAnOriginal &&\n !isUnverifiedProviderReference\n ) {\n fsSafeName = getOriginalFilename({ filename: fsSafeName })\n }\n\n if (hasReusableOriginalMain) {\n fsSafeName = retainedOriginal!.filename\n } else if (\n !overwriteExistingFiles ||\n !disableLocalStorage ||\n (shouldStageCloudFiles && retainedOriginal)\n ) {\n // Extract prefix if present (added by plugin-cloud-storage)\n const prefix = (data as Record<string, unknown>)?.prefix as string | undefined\n fsSafeName = await getSafeFileName({\n collectionSlug: collectionConfig.slug,\n desiredFilename: fsSafeName,\n prefix,\n req,\n staticPath: staticPath!,\n })\n }\n\n fileData.filename = fsSafeName\n if (hasReusableOriginalMain) {\n fileData.url = retainedOriginal!.url\n }\n\n const hasGeneratedProviderRepresentations = Boolean(\n providerOriginal &&\n (fileWasTransformed || sizeResults.some((result) => Boolean(result.file))),\n )\n const newObjectKey =\n hasManagedCloudStorage && (shouldStageCloudFiles || hasGeneratedProviderRepresentations)\n ? randomUUID()\n : undefined\n if (newObjectKey) {\n fileData._objectKey = newObjectKey\n }\n if (providerOriginal && !fileWasTransformed) {\n fileData._objectKey = providerOriginal._objectKey\n fileData.prefix = providerOriginal.prefix\n }\n if (hasReusableOriginalMain && retainedOriginal) {\n fileData._objectKey = retainedOriginal._objectKey\n fileData.prefix = retainedOriginal.prefix\n }\n\n if (!disableLocalStorage || shouldStageCloudFiles || providerOriginal) {\n const originalFilename =\n retainedOriginal?.filename ??\n providerOriginal?.filename ??\n (fileWasTransformed\n ? await getSafeFileName({\n collectionSlug: collectionConfig.slug,\n desiredFilename: getOriginalFilename({\n filename: getSanitizedUploadFilename(file.name),\n }),\n req,\n staticPath: staticPath!,\n })\n : fsSafeName)\n const original =\n retainedOriginal ??\n ({\n _objectKey: providerOriginal ? providerOriginal._objectKey : newObjectKey,\n filename: originalFilename,\n filesize: file.size,\n mimeType: file.mimetype,\n prefix: providerOriginal?.prefix ?? currentFileData?.prefix,\n url: formatAdminURL({\n apiRoute: req.payload.config.routes.api,\n path: `/${collectionConfig.slug}/file/${encodeURIComponent(originalFilename)}`,\n relative: true,\n serverURL: req.payload.config.serverURL,\n }),\n } as NonNullable<FileData['original']>)\n\n if (!retainedOriginal && isProcessableImage(file.mimetype)) {\n try {\n const dimensions = await getImageSize({ file })\n original.width = dimensions.width\n original.height = dimensions.height\n } catch {\n // Files with an image MIME type may not have readable dimensions.\n }\n }\n\n fileData.original = original\n\n if (providerOriginal) {\n if (!fileWasTransformed) {\n fileData.filename = originalFilename\n }\n }\n\n if (fileWasTransformed && !retainedOriginal && !providerOriginal) {\n filesToSave.push({\n buffer: Buffer.from(await originalWebFile!.arrayBuffer()),\n path: `${staticPath}/${originalFilename}`,\n })\n }\n }\n\n if (mainBuffer) {\n // The stored bytes are no longer the ones the client uploaded, so the client's upload\n // reference must not be reused for them.\n delete file.uploadReference\n\n filesToSave.push({\n buffer: mainBuffer,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n if (file.tempFilePath) {\n await fs.writeFile(file.tempFilePath, mainBuffer)\n } else {\n req.file = {\n ...file,\n data: mainBuffer,\n size: mainBuffer.length,\n }\n }\n } else if (!hasReusableOriginalMain) {\n // file.data is empty when useTempFiles is on, so the real content lives at\n // file.tempFilePath instead (see the function doc for why we avoid buffering it).\n const tempFileHandling = resolveTempFileHandling({\n disableLocalStorage: Boolean(disableLocalStorage) && !shouldStageCloudFiles,\n hasProcessedBuffer: false,\n tempFilePath: file.tempFilePath,\n })\n\n if (tempFileHandling.type === 'copyFromTempFile') {\n filesToSave.push({\n path: `${staticPath}/${fsSafeName}`,\n sourcePath: tempFileHandling.sourcePath,\n })\n } else if (tempFileHandling.type === 'useBuffer') {\n const bufferToSave = file.tempFilePath ? await fs.readFile(file.tempFilePath) : file.data\n\n // A 'header'/'none' content requirement (see getFileContentRequirement.ts) means\n // file.data is only a partial probe, not the real content - never save it as-is.\n const fileDataIsPartialView = !file.tempFilePath && bufferToSave.length !== file.size\n\n if (!fileDataIsPartialView) {\n filesToSave.push({\n buffer: bufferToSave,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n if (bufferToSave.length > 0) {\n if (file.tempFilePath) {\n await fs.writeFile(file.tempFilePath, bufferToSave)\n } else {\n // Keep req.file in sync, since downstream hooks/plugins may read it.\n req.file = {\n ...file,\n data: bufferToSave,\n size: bufferToSave.length,\n }\n }\n }\n }\n }\n }\n\n if (sizeResults.length > 0) {\n req.payloadUploadSizes = {}\n const sizes: FileSizes = {}\n const { name: baseName, ext: baseExt } = parseFilename(fsSafeName)\n const plannedNames = new Set([fileData.original?.filename, fsSafeName])\n const plannedSizeBuffers = new Map<string, Buffer>()\n\n for (const result of sizeResults) {\n const sizeName = result.fieldPath.slice('variants.'.length)\n\n if (!result.file) {\n sizes[sizeName] = {\n filename: null,\n filesize: null,\n height: null,\n mimeType: null,\n url: null,\n width: null,\n }\n continue\n }\n\n const sizeBuffer = Buffer.from(await result.file.arrayBuffer())\n const sizeTypeResult = await fileTypeFromBuffer(sizeBuffer)\n const sizeExt = sizeTypeResult?.ext || baseExt\n const sizeMimeType = sizeTypeResult?.mime || result.mimeType || fileData.mimeType\n\n req.payloadUploadSizes[sizeName] = sizeBuffer\n\n const imageSizeConfig = collectionConfig.upload.variants?.find(\n (imageSize) => imageSize.name === sizeName,\n )\n\n const imageNameWithDimensions = imageSizeConfig?.generateImageName\n ? imageSizeConfig.generateImageName({\n extension: sizeExt,\n height: result.height!,\n originalName: baseName,\n sizeName,\n width: result.width!,\n })\n : generateImageSizeFilename({\n extension: sizeExt,\n height: result.height!,\n outputImageName: baseName,\n width: result.width!,\n })\n\n let imageName = imageNameWithDimensions\n\n if (!disableLocalStorage || shouldStageCloudFiles) {\n const prefix = (data as Record<string, unknown>)?.prefix as string | undefined\n\n while (true) {\n imageName = await getSafeFileName({\n collectionSlug: collectionConfig.slug,\n desiredFilename: imageName,\n prefix,\n req,\n staticPath: disableLocalStorage ? undefined : staticPath!,\n })\n if (plannedSizeBuffers.get(imageName)?.equals(sizeBuffer)) {\n break\n }\n if (!plannedNames.has(imageName)) {\n break\n }\n imageName = incrementName(imageName)\n }\n plannedNames.add(imageName)\n }\n\n const imagePath = `${staticPath}/${imageName}`\n\n sizes[sizeName] = {\n _objectKey: newObjectKey,\n filename: imageName,\n filesize: sizeBuffer.length,\n height: result.height!,\n mimeType: sizeMimeType,\n prefix: providerOriginal?.prefix ?? currentFileData?.prefix,\n url: null,\n width: result.width!,\n }\n\n if (!plannedSizeBuffers.has(imageName)) {\n plannedSizeBuffers.set(imageName, sizeBuffer)\n filesToSave.push({\n buffer: sizeBuffer,\n path: imagePath,\n })\n }\n }\n\n fileData.variants = sizes\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 ...(draft ? { _status: 'draft' } : {}),\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 // Admin always resends the current focal point, so treat an unchanged value as no edit.\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.focalY!,\n }\n return uploadEdits\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","randomUUID","openAsBlob","FileRetrievalError","FileUploadError","Forbidden","MissingFile","formatAdminURL","isNumber","canResizeImage","checkFileRestrictions","downloadFileToBuffer","getOriginalFilename","generateImageSizeFilename","getFileByPath","getFileExtension","getSanitizedUploadFilename","getImageSize","getSafeFileName","incrementName","hasCropOrResizeEdit","hasFullFileContents","isProcessableImage","parseFilename","planTransformerPipeline","transformUploadFile","getUploadTransformerInternal","setUploadFilePath","shouldReupload","uploadEdits","fileData","focalPoint","incomingFocalX","x","incomingFocalY","y","currentFocalX","focalX","currentFocalY","focalY","isEqual","resolveTempFileHandling","disableLocalStorage","hasProcessedBuffer","tempFilePath","type","sourcePath","generateFileData","collection","config","collectionConfig","data","draft","externalUploadSource","isDuplicating","operation","originalDoc","overwriteExistingFiles","req","throwOnMissingFile","upload","files","serverURL","payload","file","undefined","parseUploadEditsFromReqOrIncomingData","focalPointEnabled","staticDir","hasManagedCloudStorage","Boolean","fileOperations","uploadReference","hasProviderDirectReference","verifiedOriginal","context","_payloadVerifiedProviderOriginal","providerOriginal","signedReceipt","adapter","_objectKey","filename","key","prefix","shouldStageCloudFiles","staticPath","incomingFileData","currentFileData","retainedOriginal","original","url","fileSourceData","isLocalFile","includes","t","startsWith","filePath","response","retrieveFileResponse","doc","ok","Error","buffer","Buffer","from","arrayBuffer","name","mimetype","mimeType","size","length","uploadConfig","err","message","detectedFileType","shouldUseDetectedFileType","mime","mkdir","recursive","newData","filesToSave","crop","isResettingCrop","unit","Number","width","height","widthInPixels","heightInPixels","hasFocalPointChange","editsForTransformer","pipeline","args","collectionSlug","slug","capability","transformers","canRunTransformers","bridgeTransformers","filter","transformer","prepareUpload","bridgeTransformer","find","handlesCollection","bridgeTaskPipeline","originalWebFile","mainWebFile","hasDimensionsFromBridge","sizeResults","fileContents","File","bridge","results","transform","task","options","mainResult","result","fieldPath","Math","round","fileWasTransformed","hasReusableOriginalMain","filesize","variants","_status","mainBuffer","outputName","ext","typeResult","probed","fsSafeName","isDuplicatingAnOriginal","isUnverifiedProviderReference","desiredFilename","hasGeneratedProviderRepresentations","some","newObjectKey","originalFilename","apiRoute","routes","api","path","encodeURIComponent","relative","dimensions","push","writeFile","tempFileHandling","bufferToSave","readFile","fileDataIsPartialView","payloadUploadSizes","sizes","baseName","baseExt","plannedNames","Set","plannedSizeBuffers","Map","sizeName","slice","sizeBuffer","sizeTypeResult","sizeExt","sizeMimeType","imageSizeConfig","imageSize","imageNameWithDimensions","generateImageName","extension","originalName","outputImageName","imageName","get","equals","has","add","imagePath","set","logger","error","query","incomingData","origDoc"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/uploads/generateFileData.ts"],"sourcesContent":["import { fileTypeFromBuffer } from 'file-type'\nimport fs from 'fs/promises'\nimport { randomUUID } from 'node:crypto'\nimport { openAsBlob } from 'node:fs'\n\nimport type { Collection, TypeWithID } from '../collections/config/types.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { Document, PayloadRequest } from '../types/index.js'\nimport type { ExternalUploadSource } from './sanitizeUploadData.js'\nimport type { PreparedUploadTransformation } from './transformers/uploadTransformerBridge.js'\nimport type { FileData, FileSizes, FileToSave, UploadEdits } from './types.js'\n\nimport { FileRetrievalError, FileUploadError, Forbidden, MissingFile } from '../errors/index.js'\nimport { formatAdminURL } from '../utilities/formatAdminURL.js'\nimport { isNumber } from '../utilities/isNumber.js'\nimport { canResizeImage } from './canResizeImage.js'\nimport { checkFileRestrictions } from './checkFileRestrictions.js'\nimport { downloadFileToBuffer } from './downloadFileToBuffer.js'\nimport { getOriginalFilename } from './fileVersioning/naming.js'\nimport { generateImageSizeFilename } from './generateImageSizeFilename.js'\nimport { getFileByPath } from './getFileByPath.js'\nimport { getFileExtension, getSanitizedUploadFilename } from './getFileTypeIdentity.js'\nimport { getImageSize } from './getImageSize.js'\nimport { getSafeFileName, incrementName } from './getSafeFilename.js'\nimport { hasCropOrResizeEdit } from './hasCropOrResizeEdit.js'\nimport { hasFullFileContents } from './hasFullFileContents.js'\nimport { isProcessableImage } from './isProcessableImage.js'\nimport { parseFilename } from './parseFilename.js'\nimport { planTransformerPipeline } from './transformers/planTransformerPipeline.js'\nimport { transformUploadFile } from './transformers/transformUploadFile.js'\nimport {\n getUploadTransformerInternal,\n setUploadFilePath,\n} from './transformers/uploadTransformerBridge.js'\ntype Args<T> = {\n collection: Collection\n config: SanitizedConfig\n data: T\n draft?: boolean\n externalUploadSource?: ExternalUploadSource\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: undefined | UploadEdits,\n fileData: Record<string, unknown> | undefined,\n) => {\n if (!fileData || !uploadEdits) {\n return false\n }\n\n if (hasCropOrResizeEdit(uploadEdits)) {\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 type TempFileHandling =\n | { sourcePath: string; type: 'copyFromTempFile' }\n | { type: 'skip' }\n | { type: 'useBuffer' }\n\n/**\n * Decides how to get a file's bytes onto disk when no transformer rewrote it (a transformed\n * file is already an in-memory buffer, so it always takes the `useBuffer` path). Copies straight\n * from the temp file when possible, rather than reading a potentially large temp file into memory\n * just to write it back out - see the `generateFileData` function doc for why.\n */\nexport const resolveTempFileHandling = ({\n disableLocalStorage,\n hasProcessedBuffer,\n tempFilePath,\n}: {\n disableLocalStorage: boolean\n hasProcessedBuffer: boolean\n tempFilePath: string | undefined\n}): TempFileHandling => {\n if (hasProcessedBuffer || !tempFilePath) {\n return { type: 'useBuffer' }\n }\n\n return disableLocalStorage\n ? { type: 'skip' }\n : { type: 'copyFromTempFile', sourcePath: tempFilePath }\n}\n\n/**\n * Builds the document's file metadata and the list of files to write to disk.\n *\n * A large client upload may arrive as a temp file instead of an in-memory buffer (see\n * getFileFromUploadInstructions.ts), and `file.data` can hold only a partial probe rather than\n * the full file. To avoid loading such files into memory unnecessarily, no transformer runs\n * unless the full bytes are available, this skips reading a temp file entirely when local\n * storage is disabled, and copies it straight to its destination when local storage is enabled.\n */\nexport const generateFileData = async <T>({\n collection: { config: collectionConfig },\n data,\n draft,\n externalUploadSource,\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 { serverURL } = req.payload.config\n\n let file = isDuplicating ? undefined : req.file\n\n const uploadEdits = parseUploadEditsFromReqOrIncomingData({\n data,\n isDuplicating,\n operation,\n // Only a duplication source informs edit parsing. Updates now also pass `originalDoc` so the\n // stored file can be reprocessed, and that must not change which edits are applied.\n originalDoc: isDuplicating ? originalDoc : undefined,\n req,\n })\n\n const {\n disableLocalStorage,\n focalPoint: focalPointEnabled = true,\n staticDir,\n } = collectionConfig.upload\n const hasManagedCloudStorage = Boolean(collectionConfig.upload.fileOperations)\n const uploadReference = file?.uploadReference\n const hasProviderDirectReference =\n uploadReference && typeof uploadReference === 'object' && !('uploadId' in uploadReference)\n const verifiedOriginal = req.context?._payloadVerifiedProviderOriginal as\n | {\n _objectKey?: string\n filename: string\n key: string\n prefix?: string\n signedReceipt: string\n }\n | undefined\n const providerOriginal =\n hasProviderDirectReference &&\n 'signedReceipt' in uploadReference &&\n uploadReference.signedReceipt === verifiedOriginal?.signedReceipt &&\n verifiedOriginal &&\n typeof collectionConfig.upload.adapter === 'string'\n ? {\n _objectKey: verifiedOriginal._objectKey,\n filename: verifiedOriginal.filename,\n key: verifiedOriginal.key,\n prefix: verifiedOriginal.prefix,\n }\n : undefined\n const shouldStageCloudFiles = hasManagedCloudStorage && !hasProviderDirectReference\n\n const staticPath = staticDir\n\n const incomingFileData: Document = isDuplicating ? originalDoc : data\n const currentFileData = (operation === 'update' ? originalDoc : incomingFileData) as\n | FileData\n | undefined\n const retainedOriginal =\n operation === 'update' &&\n !file &&\n !externalUploadSource &&\n typeof currentFileData?.original?.filename === 'string' &&\n typeof currentFileData.original.url === 'string'\n ? currentFileData.original\n : undefined\n const fileSourceData = externalUploadSource ?? retainedOriginal ?? currentFileData\n let isLocalFile = false\n\n if (\n !file &&\n fileSourceData &&\n (externalUploadSource ||\n isDuplicating ||\n shouldReupload(uploadEdits, incomingFileData as Record<string, unknown>))\n ) {\n const { filename, url } = fileSourceData\n if (filename && (filename.includes('../') || filename.includes('..\\\\'))) {\n throw new Forbidden(req.t)\n }\n\n if ((serverURL && url?.startsWith(serverURL)) || url?.startsWith('/')) {\n isLocalFile = true\n }\n\n try {\n if (!externalUploadSource && !disableLocalStorage && isLocalFile) {\n // File is stored locally\n const filePath = `${staticPath}/${filename}`\n const response = await getFileByPath(filePath)\n file = response\n overwriteExistingFiles = true\n } else if (filename && retainedOriginal && hasManagedCloudStorage) {\n const { retrieveFileResponse } = await import('./endpoints/getFile.js')\n const response = await retrieveFileResponse({\n collection: { config: collectionConfig },\n doc: originalDoc as TypeWithID,\n filename,\n operation: 'transform',\n req,\n })\n if (!response.ok) {\n throw new Error(`Unable to read retained original ${filename}`)\n }\n const buffer = Buffer.from(await response.arrayBuffer())\n file = {\n name: filename,\n data: buffer,\n mimetype: retainedOriginal.mimeType,\n size: buffer.length,\n }\n overwriteExistingFiles = true\n } else if (filename && url) {\n // File is remote\n file = await downloadFileToBuffer({\n data: fileSourceData,\n req,\n uploadConfig: collectionConfig.upload,\n })\n overwriteExistingFiles = !externalUploadSource\n }\n } catch (err: unknown) {\n throw new FileRetrievalError(req.t, err instanceof Error ? err.message : undefined)\n }\n\n if (file && retainedOriginal && currentFileData?.filename) {\n file = { ...file, name: currentFileData.filename }\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: incomingFileData!,\n files: [],\n }\n }\n\n const detectedFileType = await checkFileRestrictions({\n collection: collectionConfig,\n file,\n req,\n })\n\n const shouldUseDetectedFileType =\n detectedFileType &&\n (isProcessableImage(file.mimetype) || isProcessableImage(detectedFileType.mime))\n\n if (shouldUseDetectedFileType && detectedFileType.mime !== file.mimetype) {\n file = { ...file, mimetype: detectedFileType.mime }\n }\n\n if (!disableLocalStorage) {\n await fs.mkdir(staticPath!, { recursive: true })\n }\n\n let newData = incomingFileData as T\n const filesToSave: FileToSave[] = []\n const fileData: Partial<FileData> = {}\n const crop = uploadEdits?.crop\n const isResettingCrop =\n retainedOriginal &&\n crop?.unit === '%' &&\n Number(crop.width) === 100 &&\n Number(crop.height) === 100 &&\n Number(crop.x) === 0 &&\n Number(crop.y) === 0 &&\n (uploadEdits.widthInPixels === undefined ||\n Number(uploadEdits.widthInPixels) === retainedOriginal.width) &&\n (uploadEdits.heightInPixels === undefined ||\n Number(uploadEdits.heightInPixels) === retainedOriginal.height)\n const hasFocalPointChange =\n uploadEdits?.focalPoint &&\n (Number(uploadEdits.focalPoint.x) !== (currentFileData?.focalX ?? 50) ||\n Number(uploadEdits.focalPoint.y) !== (currentFileData?.focalY ?? 50))\n const editsForTransformer = isResettingCrop\n ? { ...uploadEdits, crop: undefined, heightInPixels: undefined, widthInPixels: undefined }\n : uploadEdits\n\n try {\n const pipeline = await planTransformerPipeline({\n args: {\n collectionSlug: collectionConfig.slug,\n mimeType: file.mimetype,\n operation: 'upload',\n req,\n },\n capability: 'transformFile',\n transformers: req.payload.config.upload?.transformers ?? [],\n })\n\n // A large client upload can arrive as a bounded probe alongside a temp file. Transformers\n // need the whole file, so leave such an upload untouched rather than buffering it.\n const canRunTransformers = pipeline.length > 0 && hasFullFileContents(file)\n\n const bridgeTransformers = canRunTransformers\n ? pipeline.filter((transformer) =>\n Boolean(getUploadTransformerInternal(transformer)?.prepareUpload),\n )\n : []\n\n const bridgeTransformer =\n bridgeTransformers.find((transformer) =>\n getUploadTransformerInternal(transformer)!.handlesCollection?.({\n collectionSlug: collectionConfig.slug,\n }),\n ) ?? bridgeTransformers[0]\n\n // The chosen bridge's task options are private to it, so other bridges must not see them.\n const bridgeTaskPipeline = pipeline.filter(\n (transformer) =>\n transformer === bridgeTransformer || !bridgeTransformers.includes(transformer),\n )\n\n let originalWebFile: File | undefined\n let mainWebFile: File | undefined\n let hasDimensionsFromBridge = false\n let sizeResults: PreparedUploadTransformation[] = []\n\n if (canRunTransformers) {\n const fileContents = file.tempFilePath ? await openAsBlob(file.tempFilePath) : file.data\n originalWebFile = new File([fileContents], file.name, { type: file.mimetype })\n if (file.tempFilePath) {\n setUploadFilePath(originalWebFile, file.tempFilePath)\n }\n\n if (bridgeTransformer) {\n const bridge = getUploadTransformerInternal(bridgeTransformer)!\n\n const results = await bridge.prepareUpload!({\n collectionSlug: collectionConfig.slug,\n file: originalWebFile,\n req,\n transform: (task) =>\n transformUploadFile({\n collectionSlug: collectionConfig.slug,\n file: task.file ?? originalWebFile!,\n options: task.options,\n pipeline: bridgeTaskPipeline,\n req,\n }),\n uploadEdits: editsForTransformer,\n })\n\n const mainResult = results.find((result) => result.fieldPath === 'filename')\n\n mainWebFile = mainResult?.file ?? originalWebFile\n fileData.width = mainResult?.width\n fileData.height = mainResult?.height\n hasDimensionsFromBridge = true\n sizeResults = results.filter((result) => result.fieldPath !== 'filename')\n } else {\n mainWebFile = await transformUploadFile({\n collectionSlug: collectionConfig.slug,\n file: originalWebFile,\n options: undefined,\n pipeline,\n req,\n })\n }\n }\n\n // Saved for any resizable image, not just one a transformer processed, so it's kept with no\n // transformer registered and on a header-only client upload.\n if (\n focalPointEnabled &&\n uploadEdits?.focalPoint &&\n (hasDimensionsFromBridge || canResizeImage(file.mimetype))\n ) {\n fileData.focalX = isNumber(uploadEdits.focalPoint.x)\n ? Math.round(uploadEdits.focalPoint.x)\n : 50\n fileData.focalY = isNumber(uploadEdits.focalPoint.y)\n ? Math.round(uploadEdits.focalPoint.y)\n : 50\n }\n\n const fileWasTransformed = Boolean(mainWebFile && mainWebFile !== originalWebFile)\n const hasReusableOriginalMain = Boolean(\n isResettingCrop && !fileWasTransformed && retainedOriginal,\n )\n if (hasReusableOriginalMain && !hasFocalPointChange && retainedOriginal) {\n return {\n data: {\n ...incomingFileData,\n _objectKey: retainedOriginal._objectKey,\n filename: retainedOriginal.filename,\n filesize: retainedOriginal.filesize,\n height: retainedOriginal.height,\n mimeType: retainedOriginal.mimeType,\n original: retainedOriginal,\n prefix: retainedOriginal.prefix,\n url: retainedOriginal.url,\n variants: currentFileData?.variants,\n width: retainedOriginal.width,\n ...(draft ? { _status: 'draft' } : {}),\n } as T,\n files: [],\n }\n }\n const mainBuffer = fileWasTransformed\n ? Buffer.from(await mainWebFile!.arrayBuffer())\n : undefined\n\n // A transformed file is named after what the transformer returned, not the upload.\n const outputName = hasReusableOriginalMain\n ? retainedOriginal!.filename\n : (fileWasTransformed && mainWebFile!.name) || file.name\n\n let mimeType: string\n let ext: string | undefined\n\n if (mainBuffer) {\n // Detected bytes win for binary formats (Sharp keeps the input's name and type on a\n // converted output), but text-like output such as CSV has no signature to detect, so\n // fall back to the type and extension the transformer declared on the returned File.\n const typeResult = await fileTypeFromBuffer(mainBuffer)\n ext =\n typeResult?.ext ?? (getFileExtension(getSanitizedUploadFilename(outputName)) || undefined)\n mimeType = typeResult?.mime ?? (mainWebFile!.type || file.mimetype)\n } else {\n mimeType = file.mimetype\n ext = getFileExtension(getSanitizedUploadFilename(file.name))\n }\n\n // Adjust SVG mime type. fromBuffer modifies it.\n if (mimeType === 'application/xml' && ext === 'svg') {\n mimeType = 'image/svg+xml'\n }\n fileData.mimeType = mimeType\n fileData.filesize = mainBuffer ? mainBuffer.length : file.size\n\n // Only probe formats that could carry dimensions - probing reads the file, and a large\n // non-image upload may only exist as a temp file we deliberately never buffer.\n if (!hasDimensionsFromBridge && isProcessableImage(mimeType)) {\n try {\n const probed = await getImageSize({\n file: mainBuffer ? { ...file, data: mainBuffer, tempFilePath: undefined } : file,\n })\n fileData.width = probed.width\n fileData.height = probed.height\n } catch {\n // Not a recognized image format — leave width/height unset.\n }\n }\n\n let fsSafeName = getSanitizedUploadFilename(outputName, ext)\n const isDuplicatingAnOriginal =\n isDuplicating && file.name === (originalDoc as FileData | undefined)?.original?.filename\n\n // A provider reference without a receipt names an object the client already stored; renaming\n // it would point the document at a key that was never uploaded.\n const isUnverifiedProviderReference = Boolean(hasProviderDirectReference && !providerOriginal)\n\n if (\n !fileWasTransformed &&\n !retainedOriginal &&\n !providerOriginal &&\n !isDuplicatingAnOriginal &&\n !isUnverifiedProviderReference\n ) {\n fsSafeName = getOriginalFilename({ filename: fsSafeName })\n }\n\n if (hasReusableOriginalMain) {\n fsSafeName = retainedOriginal!.filename\n } else if (\n !overwriteExistingFiles ||\n !disableLocalStorage ||\n (shouldStageCloudFiles && retainedOriginal)\n ) {\n // Extract prefix if present (added by plugin-cloud-storage)\n const prefix = (data as Record<string, unknown>)?.prefix as string | undefined\n fsSafeName = await getSafeFileName({\n collectionSlug: collectionConfig.slug,\n desiredFilename: fsSafeName,\n prefix,\n req,\n staticPath: staticPath!,\n })\n }\n\n fileData.filename = fsSafeName\n if (hasReusableOriginalMain) {\n fileData.url = retainedOriginal!.url\n }\n\n const hasGeneratedProviderRepresentations = Boolean(\n providerOriginal &&\n (fileWasTransformed || sizeResults.some((result) => Boolean(result.file))),\n )\n const newObjectKey =\n hasManagedCloudStorage && (shouldStageCloudFiles || hasGeneratedProviderRepresentations)\n ? randomUUID()\n : undefined\n if (newObjectKey) {\n fileData._objectKey = newObjectKey\n }\n if (providerOriginal && !fileWasTransformed) {\n fileData._objectKey = providerOriginal._objectKey\n fileData.prefix = providerOriginal.prefix\n }\n if (hasReusableOriginalMain && retainedOriginal) {\n fileData._objectKey = retainedOriginal._objectKey\n fileData.prefix = retainedOriginal.prefix\n }\n\n if (!disableLocalStorage || shouldStageCloudFiles || providerOriginal) {\n const originalFilename =\n retainedOriginal?.filename ??\n providerOriginal?.filename ??\n (fileWasTransformed\n ? await getSafeFileName({\n collectionSlug: collectionConfig.slug,\n desiredFilename: getOriginalFilename({\n filename: getSanitizedUploadFilename(file.name),\n }),\n req,\n staticPath: staticPath!,\n })\n : fsSafeName)\n const original =\n retainedOriginal ??\n ({\n _objectKey: providerOriginal ? providerOriginal._objectKey : newObjectKey,\n filename: originalFilename,\n filesize: file.size,\n mimeType: file.mimetype,\n prefix: providerOriginal?.prefix ?? currentFileData?.prefix,\n url: formatAdminURL({\n apiRoute: req.payload.config.routes.api,\n path: `/${collectionConfig.slug}/file/${encodeURIComponent(originalFilename)}`,\n relative: true,\n serverURL: req.payload.config.serverURL,\n }),\n } as NonNullable<FileData['original']>)\n\n if (!retainedOriginal && isProcessableImage(file.mimetype)) {\n try {\n const dimensions = await getImageSize({ file })\n original.width = dimensions.width\n original.height = dimensions.height\n } catch {\n // Files with an image MIME type may not have readable dimensions.\n }\n }\n\n fileData.original = original\n\n if (providerOriginal) {\n if (!fileWasTransformed) {\n fileData.filename = originalFilename\n }\n }\n\n if (fileWasTransformed && !retainedOriginal && !providerOriginal) {\n filesToSave.push({\n buffer: Buffer.from(await originalWebFile!.arrayBuffer()),\n path: `${staticPath}/${originalFilename}`,\n })\n }\n }\n\n if (mainBuffer) {\n // The stored bytes are no longer the ones the client uploaded, so the client's upload\n // reference must not be reused for them.\n delete file.uploadReference\n\n filesToSave.push({\n buffer: mainBuffer,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n if (file.tempFilePath) {\n await fs.writeFile(file.tempFilePath, mainBuffer)\n } else {\n req.file = {\n ...file,\n data: mainBuffer,\n size: mainBuffer.length,\n }\n }\n } else if (!hasReusableOriginalMain) {\n // file.data is empty when useTempFiles is on, so the real content lives at\n // file.tempFilePath instead (see the function doc for why we avoid buffering it).\n const tempFileHandling = resolveTempFileHandling({\n disableLocalStorage: Boolean(disableLocalStorage) && !shouldStageCloudFiles,\n hasProcessedBuffer: false,\n tempFilePath: file.tempFilePath,\n })\n\n if (tempFileHandling.type === 'copyFromTempFile') {\n filesToSave.push({\n path: `${staticPath}/${fsSafeName}`,\n sourcePath: tempFileHandling.sourcePath,\n })\n } else if (tempFileHandling.type === 'useBuffer') {\n const bufferToSave = file.tempFilePath ? await fs.readFile(file.tempFilePath) : file.data\n\n // A 'header'/'none' content requirement (see getFileContentRequirement.ts) means\n // file.data is only a partial probe, not the real content - never save it as-is.\n const fileDataIsPartialView = !file.tempFilePath && bufferToSave.length !== file.size\n\n if (!fileDataIsPartialView) {\n filesToSave.push({\n buffer: bufferToSave,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n if (bufferToSave.length > 0) {\n if (file.tempFilePath) {\n await fs.writeFile(file.tempFilePath, bufferToSave)\n } else {\n // Keep req.file in sync, since downstream hooks/plugins may read it.\n req.file = {\n ...file,\n data: bufferToSave,\n size: bufferToSave.length,\n }\n }\n }\n }\n }\n }\n\n if (sizeResults.length > 0) {\n req.payloadUploadSizes = {}\n const sizes: FileSizes = {}\n const { name: baseName, ext: baseExt } = parseFilename(fsSafeName)\n const plannedNames = new Set([fileData.original?.filename, fsSafeName])\n const plannedSizeBuffers = new Map<string, Buffer>()\n\n for (const result of sizeResults) {\n const sizeName = result.fieldPath.slice('variants.'.length)\n\n if (!result.file) {\n sizes[sizeName] = {\n filename: null,\n filesize: null,\n height: null,\n mimeType: null,\n url: null,\n width: null,\n }\n continue\n }\n\n const sizeBuffer = Buffer.from(await result.file.arrayBuffer())\n const sizeTypeResult = await fileTypeFromBuffer(sizeBuffer)\n const sizeExt = sizeTypeResult?.ext || baseExt\n const sizeMimeType = sizeTypeResult?.mime || result.mimeType || fileData.mimeType\n\n req.payloadUploadSizes[sizeName] = sizeBuffer\n\n const imageSizeConfig = collectionConfig.upload.variants?.find(\n (imageSize) => imageSize.name === sizeName,\n )\n\n const imageNameWithDimensions = imageSizeConfig?.generateImageName\n ? imageSizeConfig.generateImageName({\n extension: sizeExt,\n height: result.height!,\n originalName: baseName,\n sizeName,\n width: result.width!,\n })\n : generateImageSizeFilename({\n extension: sizeExt,\n height: result.height!,\n outputImageName: baseName,\n width: result.width!,\n })\n\n let imageName = imageNameWithDimensions\n\n if (!disableLocalStorage || shouldStageCloudFiles) {\n const prefix = (data as Record<string, unknown>)?.prefix as string | undefined\n\n while (true) {\n imageName = await getSafeFileName({\n collectionSlug: collectionConfig.slug,\n desiredFilename: imageName,\n prefix,\n req,\n staticPath: disableLocalStorage ? undefined : staticPath!,\n })\n if (plannedSizeBuffers.get(imageName)?.equals(sizeBuffer)) {\n break\n }\n if (!plannedNames.has(imageName)) {\n break\n }\n imageName = incrementName(imageName)\n }\n plannedNames.add(imageName)\n }\n\n const imagePath = `${staticPath}/${imageName}`\n\n sizes[sizeName] = {\n _objectKey: newObjectKey,\n filename: imageName,\n filesize: sizeBuffer.length,\n height: result.height!,\n mimeType: sizeMimeType,\n prefix: providerOriginal?.prefix ?? currentFileData?.prefix,\n url: null,\n width: result.width!,\n }\n\n if (!plannedSizeBuffers.has(imageName)) {\n plannedSizeBuffers.set(imageName, sizeBuffer)\n filesToSave.push({\n buffer: sizeBuffer,\n path: imagePath,\n })\n }\n }\n\n fileData.variants = sizes\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 ...(draft ? { _status: 'draft' } : {}),\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 // Admin always resends the current focal point, so treat an unchanged value as no edit.\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.focalY!,\n }\n return uploadEdits\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","randomUUID","openAsBlob","FileRetrievalError","FileUploadError","Forbidden","MissingFile","formatAdminURL","isNumber","canResizeImage","checkFileRestrictions","downloadFileToBuffer","getOriginalFilename","generateImageSizeFilename","getFileByPath","getFileExtension","getSanitizedUploadFilename","getImageSize","getSafeFileName","incrementName","hasCropOrResizeEdit","hasFullFileContents","isProcessableImage","parseFilename","planTransformerPipeline","transformUploadFile","getUploadTransformerInternal","setUploadFilePath","shouldReupload","uploadEdits","fileData","focalPoint","incomingFocalX","x","incomingFocalY","y","currentFocalX","focalX","currentFocalY","focalY","isEqual","resolveTempFileHandling","disableLocalStorage","hasProcessedBuffer","tempFilePath","type","sourcePath","generateFileData","collection","config","collectionConfig","data","draft","externalUploadSource","isDuplicating","operation","originalDoc","overwriteExistingFiles","req","throwOnMissingFile","upload","files","serverURL","payload","file","undefined","parseUploadEditsFromReqOrIncomingData","focalPointEnabled","staticDir","hasManagedCloudStorage","Boolean","fileOperations","uploadReference","hasProviderDirectReference","verifiedOriginal","context","_payloadVerifiedProviderOriginal","providerOriginal","signedReceipt","adapter","_objectKey","filename","key","prefix","shouldStageCloudFiles","staticPath","incomingFileData","currentFileData","retainedOriginal","original","url","fileSourceData","isLocalFile","includes","t","startsWith","filePath","response","retrieveFileResponse","doc","ok","Error","buffer","Buffer","from","arrayBuffer","name","mimetype","mimeType","size","length","uploadConfig","err","message","detectedFileType","shouldUseDetectedFileType","mime","mkdir","recursive","newData","filesToSave","crop","isResettingCrop","unit","Number","width","height","widthInPixels","heightInPixels","hasFocalPointChange","editsForTransformer","pipeline","args","collectionSlug","slug","capability","transformers","canRunTransformers","bridgeTransformers","filter","transformer","prepareUpload","bridgeTransformer","find","handlesCollection","bridgeTaskPipeline","originalWebFile","mainWebFile","hasDimensionsFromBridge","sizeResults","fileContents","File","bridge","results","transform","task","options","mainResult","result","fieldPath","Math","round","fileWasTransformed","hasReusableOriginalMain","filesize","variants","_status","mainBuffer","outputName","ext","typeResult","probed","fsSafeName","isDuplicatingAnOriginal","isUnverifiedProviderReference","desiredFilename","hasGeneratedProviderRepresentations","some","newObjectKey","originalFilename","apiRoute","routes","api","path","encodeURIComponent","relative","dimensions","push","writeFile","tempFileHandling","bufferToSave","readFile","fileDataIsPartialView","payloadUploadSizes","sizes","baseName","baseExt","plannedNames","Set","plannedSizeBuffers","Map","sizeName","slice","sizeBuffer","sizeTypeResult","sizeExt","sizeMimeType","imageSizeConfig","imageSize","imageNameWithDimensions","generateImageName","extension","originalName","outputImageName","imageName","get","equals","has","add","imagePath","set","logger","error","query","incomingData","origDoc"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/uploads/getFileContentRequirement.ts"],"sourcesContent":["import type { SanitizedUploadConfig } from './types.js'\n\nimport { canResizeImage } from './canResizeImage.js'\nimport { isAnimatedImage } from './isAnimatedImage.js'\nimport { isImage } from './isImage.js'\n\n/**\n * Bytes read from the start of a file to sniff its mime type and, for images, probe its\n * dimensions. Generous enough to cover real-world header/metadata layouts (EXIF, ICC\n * profiles, etc.) while staying tiny next to a multi-gigabyte upload.\n */\nexport const HEADER_PROBE_BYTE_LENGTH = 1024 * 1024\n\nexport type FileContentRequirement = 'full' | 'header' | 'none'\n\n/**\n * Decides how much of an uploaded file's content, if any, is needed to save the document -\n * so a client upload (e.g. Azure's chunkLargeFiles) only pays for what post-processing\n * actually reads instead of always being re-downloaded in full.\n *\n * - `full`: local storage needs the real bytes, or a registered file transformer will adjust\n * the image (`upload.hasImageAdjustments`), or a custom `transformFile` transformer will\n * process the file (`hasTransformFileStages`), or the file is animated, or additional image\n * sizes will be generated from it, or the collection restricts mime types (which also runs\n * SVG/PDF content-safety checks that must see the whole file), or the request itself carries\n * a crop/resize edit (`uploadEdits`) that will be applied to the fetched bytes.\n * - `header`: the file is an image and only its dimensions are needed.\n * - `none`: nothing downstream reads file content at all.\n */\nexport function getFileContentRequirement({\n hasSizeEdits,\n hasTransformFileStages,\n mimeType,\n uploadConfig,\n}: {\n /**\n * Whether the request's `uploadEdits` (crop, heightInPixels, widthInPixels) will resize the\n * fetched file - if so, the full file is needed even when the collection config alone would\n * only require a header probe.\n */\n hasSizeEdits?: boolean\n /**\n * Whether a registered transformer without its own content projection (anything other than a\n * built-in bridge transformer like `sharpTransformer`) will run `transformFile` on this file.\n * Such a transformer reads the whole file, so neither a header probe nor no content is enough.\n */\n hasTransformFileStages?: boolean\n mimeType: string\n uploadConfig: SanitizedUploadConfig\n}): FileContentRequirement {\n if (!uploadConfig.disableLocalStorage) {\n return 'full'\n }\n\n const hasMimeTypeAllowList =\n Array.isArray(uploadConfig.mimeTypes) && uploadConfig.mimeTypes.length > 0\n\n if (hasMimeTypeAllowList || hasTransformFileStages) {\n return 'full'\n }\n\n const isResizableImage = canResizeImage(mimeType)\n // `hasImageAdjustments` and `variants` are the transformer-agnostic projection a file\n // transformer writes back onto the sanitized upload config at startup (see\n // `@payloadcms/transformer-sharp`'s `initSharpCollections`), so core can make this decision\n // without knowing which transformer is registered or how it is configured.\n const hasConfiguredAdjustments = Boolean(\n uploadConfig.hasImageAdjustments ||\n (Array.isArray(uploadConfig.variants) && uploadConfig.variants.length > 0),\n )\n\n if (hasSizeEdits || (isResizableImage && hasConfiguredAdjustments) || isAnimatedImage(mimeType)) {\n return 'full'\n }\n\n if (isResizableImage || isImage(mimeType)) {\n return 'header'\n }\n\n return 'none'\n}\n"],"names":["canResizeImage","isAnimatedImage","isImage","HEADER_PROBE_BYTE_LENGTH","getFileContentRequirement","hasSizeEdits","hasTransformFileStages","mimeType","uploadConfig","disableLocalStorage","hasMimeTypeAllowList","Array","isArray","mimeTypes","length","isResizableImage","hasConfiguredAdjustments","Boolean","hasImageAdjustments","variants"],"mappings":"AAEA,SAASA,cAAc,QAAQ,sBAAqB;AACpD,SAASC,eAAe,QAAQ,uBAAsB;AACtD,SAASC,OAAO,QAAQ,eAAc;AAEtC;;;;CAIC,GACD,OAAO,MAAMC,2BAA2B,OAAO,KAAI;AAInD;;;;;;;;;;;;;CAaC,GACD,OAAO,SAASC,0BAA0B,EACxCC,YAAY,EACZC,sBAAsB,EACtBC,QAAQ,EACRC,YAAY,EAgBb;IACC,IAAI,CAACA,aAAaC,mBAAmB,EAAE;QACrC,OAAO;IACT;IAEA,MAAMC,uBACJC,MAAMC,OAAO,CAACJ,aAAaK,SAAS,KAAKL,aAAaK,SAAS,CAACC,MAAM,GAAG;IAE3E,IAAIJ,wBAAwBJ,wBAAwB;QAClD,OAAO;IACT;IAEA,MAAMS,mBAAmBf,eAAeO;IACxC,sFAAsF;IACtF,2EAA2E;IAC3E,4FAA4F;IAC5F,2EAA2E;IAC3E,MAAMS,2BAA2BC,QAC/BT,aAAaU,mBAAmB,IAC7BP,MAAMC,OAAO,CAACJ,aAAaW,QAAQ,KAAKX,aAAaW,QAAQ,CAACL,MAAM,GAAG;IAG5E,IAAIT,gBAAiBU,oBAAoBC,4BAA6Bf,gBAAgBM,WAAW;QAC/F,OAAO;IACT;IAEA,IAAIQ,oBAAoBb,QAAQK,WAAW;QACzC,OAAO;IACT;IAEA,OAAO;AACT"}
1
+ {"version":3,"sources":["../../src/uploads/getFileContentRequirement.ts"],"sourcesContent":["import type { SanitizedUploadConfig } from './types.js'\n\nimport { canResizeImage } from './canResizeImage.js'\nimport { isAnimatedImage } from './isAnimatedImage.js'\nimport { isImage } from './isImage.js'\n\n/**\n * Bytes read from the start of a file to sniff its mime type and, for images, probe its\n * dimensions. Generous enough to cover real-world header/metadata layouts (EXIF, ICC\n * profiles, etc.) while staying tiny next to a multi-gigabyte upload.\n */\nexport const HEADER_PROBE_BYTE_LENGTH = 1024 * 1024\n\nexport type FileContentRequirement = 'full' | 'header' | 'none'\n\n/**\n * Decides how much of an uploaded file's content, if any, is needed to save the document -\n * so a client upload (e.g. Azure's chunkLargeFiles) only pays for what post-processing\n * actually reads instead of always being re-downloaded in full.\n *\n * - `full`: local storage needs the real bytes, or a registered file transformer will adjust\n * the image (`upload.hasImageAdjustments`), or a custom `transformFile` transformer will\n * process the file (`hasTransformFileStages`), or the file is animated, or additional image\n * sizes will be generated from it, or the collection restricts mime types (which also runs\n * SVG/PDF content-safety checks that must see the whole file), or the request itself carries\n * a crop/resize edit (`uploadEdits`) that will be applied to the fetched bytes.\n * - `header`: the file is an image and only its dimensions are needed.\n * - `none`: nothing downstream reads file content at all.\n */\nexport function getFileContentRequirement({\n hasSizeEdits,\n hasTransformFileStages,\n mimeType,\n uploadConfig,\n}: {\n /**\n * Whether the request's `uploadEdits` (crop, heightInPixels, widthInPixels) will resize the\n * fetched file - if so, the full file is needed even when the collection config alone would\n * only require a header probe.\n */\n hasSizeEdits?: boolean\n /**\n * Whether a registered transformer without its own content projection (anything other than a\n * built-in bridge transformer like `sharpTransformer`) will run `transformFile` on this file.\n * Such a transformer reads the whole file, so neither a header probe nor no content is enough.\n */\n hasTransformFileStages?: boolean\n mimeType: string\n uploadConfig: SanitizedUploadConfig\n}): FileContentRequirement {\n if (!uploadConfig.disableLocalStorage) {\n return 'full'\n }\n\n const hasMimeTypeAllowList =\n Array.isArray(uploadConfig.mimeTypes) && uploadConfig.mimeTypes.length > 0\n\n if (hasMimeTypeAllowList || hasTransformFileStages) {\n return 'full'\n }\n\n const isResizableImage = canResizeImage(mimeType)\n // `hasImageAdjustments` and `variants` are the transformer-agnostic projection a file\n // transformer writes back onto the sanitized upload config at startup (see\n // `@payloadcms/transformer-sharp`'s `initSharpCollections`), so core can make this decision\n // without knowing which transformer is registered or how it is configured.\n const hasConfiguredAdjustments = Boolean(\n uploadConfig.hasImageAdjustments ||\n (Array.isArray(uploadConfig.variants) && uploadConfig.variants.length > 0),\n )\n\n if (hasSizeEdits || (isResizableImage && hasConfiguredAdjustments) || isAnimatedImage(mimeType)) {\n return 'full'\n }\n\n if (isResizableImage || isImage(mimeType)) {\n return 'header'\n }\n\n return 'none'\n}\n"],"names":["canResizeImage","isAnimatedImage","isImage","HEADER_PROBE_BYTE_LENGTH","getFileContentRequirement","hasSizeEdits","hasTransformFileStages","mimeType","uploadConfig","disableLocalStorage","hasMimeTypeAllowList","Array","isArray","mimeTypes","length","isResizableImage","hasConfiguredAdjustments","Boolean","hasImageAdjustments","variants"],"mappings":"AAEA,SAASA,cAAc,QAAQ,sBAAqB;AACpD,SAASC,eAAe,QAAQ,uBAAsB;AACtD,SAASC,OAAO,QAAQ,eAAc;AAEtC;;;;CAIC,GACD,OAAO,MAAMC,2BAA2B,OAAO,KAAI;AAInD;;;;;;;;;;;;;CAaC,GACD,OAAO,SAASC,0BAA0B,EACxCC,YAAY,EACZC,sBAAsB,EACtBC,QAAQ,EACRC,YAAY,EAgBb;IACC,IAAI,CAACA,aAAaC,mBAAmB,EAAE;QACrC,OAAO;IACT;IAEA,MAAMC,uBACJC,MAAMC,OAAO,CAACJ,aAAaK,SAAS,KAAKL,aAAaK,SAAS,CAACC,MAAM,GAAG;IAE3E,IAAIJ,wBAAwBJ,wBAAwB;QAClD,OAAO;IACT;IAEA,MAAMS,mBAAmBf,eAAeO;IACxC,sFAAsF;IACtF,2EAA2E;IAC3E,4FAA4F;IAC5F,2EAA2E;IAC3E,MAAMS,2BAA2BC,QAC/BT,aAAaU,mBAAmB,IAC/BP,MAAMC,OAAO,CAACJ,aAAaW,QAAQ,KAAKX,aAAaW,QAAQ,CAACL,MAAM,GAAG;IAG1E,IAAIT,gBAAiBU,oBAAoBC,4BAA6Bf,gBAAgBM,WAAW;QAC/F,OAAO;IACT;IAEA,IAAIQ,oBAAoBb,QAAQK,WAAW;QACzC,OAAO;IACT;IAEA,OAAO;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"validateEntityData.d.ts","sourceRoot":"","sources":["../../../src/utilities/entityInputSchema/validateEntityData.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAMhF,eAAO,MAAM,sBAAsB,kCAKhC;IACD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,GAAG,EAAE,cAAc,CAAA;IACnB,IAAI,EAAE,cAAc,CAAA;CACrB,KAAG,IAQH,CAAA;AAED,eAAO,MAAM,kBAAkB,yBAI5B;IACD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,GAAG,EAAE,cAAc,CAAA;IACnB,IAAI,EAAE,UAAU,CAAA;CACjB,KAAG,IAIH,CAAA"}
1
+ {"version":3,"file":"validateEntityData.d.ts","sourceRoot":"","sources":["../../../src/utilities/entityInputSchema/validateEntityData.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAMhF,eAAO,MAAM,sBAAsB,kCAKhC;IACD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,GAAG,EAAE,cAAc,CAAA;IACnB,IAAI,EAAE,cAAc,CAAA;CACrB,KAAG,IAQH,CAAA;AAED,eAAO,MAAM,kBAAkB,yBAI5B;IACD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,GAAG,EAAE,cAAc,CAAA;IACnB,IAAI,EAAE,UAAU,CAAA;CACjB,KAAG,IAQH,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utilities/entityInputSchema/validateEntityData.ts"],"sourcesContent":["import type { core } from 'zod'\n\nimport { fromJSONSchema } from 'zod'\n\nimport type { CollectionSlug, GlobalSlug, PayloadRequest } from '../../index.js'\nimport type { EntityInputSchema } from './types.js'\n\nimport { ValidationError } from '../../errors/ValidationError.js'\nimport { getCollectionInputSchema, getGlobalInputSchema } from './getEntityInputSchema.js'\n\nexport const validateCollectionData = ({\n slug,\n data,\n partial,\n req,\n}: {\n data: Record<string, unknown>\n partial?: boolean\n req: PayloadRequest\n slug: CollectionSlug\n}): void => {\n const schema = getCollectionInputSchema({\n collectionSlug: slug,\n req,\n shouldKeepDeprecatedProperties: true,\n })\n\n validateEntityData({ slug, data, entity: 'collection', partial, req, schema })\n}\n\nexport const validateGlobalData = ({\n slug,\n data,\n req,\n}: {\n data: Record<string, unknown>\n req: PayloadRequest\n slug: GlobalSlug\n}): void => {\n const schema = getGlobalInputSchema({ globalSlug: slug, req, shouldKeepDeprecatedProperties: true })\n\n validateEntityData({ slug, data, entity: 'global', partial: true, req, schema })\n}\n\nconst validateEntityData = ({\n slug,\n data,\n entity,\n partial,\n req,\n schema,\n}: {\n data: Record<string, unknown>\n entity: 'collection' | 'global'\n partial?: boolean\n req: PayloadRequest\n schema: EntityInputSchema | null\n slug: string\n}): void => {\n if (!schema) {\n return\n }\n\n const validationSchema = partial ? withoutRequired(schema) : schema\n const result = fromJSONSchema(validationSchema as Parameters<typeof fromJSONSchema>[0]).safeParse(\n data,\n )\n\n if (result.success) {\n return\n }\n\n throw new ValidationError({\n [entity]: slug,\n errors: getUsefulIssues(result.error.issues).map(({ message, path }) => ({\n message,\n path: formatDataPath(path),\n })),\n req,\n })\n}\n\n/** Updates and drafts accept partial data, including partial nested objects and array rows. */\nconst withoutRequired = (schema: EntityInputSchema): EntityInputSchema => {\n const {\n $defs,\n additionalProperties,\n anyOf,\n items,\n oneOf,\n properties,\n required: _required,\n ...partialSchema\n } = schema\n\n return {\n ...partialSchema,\n ...($defs ? { $defs: mapSchemaRecord($defs) } : {}),\n ...(typeof additionalProperties === 'object'\n ? { additionalProperties: withoutRequired(additionalProperties) }\n : additionalProperties !== undefined\n ? { additionalProperties }\n : {}),\n ...(anyOf ? { anyOf: anyOf.map(makeSchemaPartial) } : {}),\n ...(items\n ? {\n items: Array.isArray(items)\n ? items.map((item) => withoutRequired(item))\n : withoutRequired(items),\n }\n : {}),\n ...(oneOf ? { oneOf: oneOf.map(makeSchemaPartial) } : {}),\n ...(properties ? { properties: mapSchemaRecord(properties) } : {}),\n }\n}\n\nconst makeSchemaPartial = (schema: boolean | EntityInputSchema): boolean | EntityInputSchema =>\n typeof schema === 'boolean' ? schema : withoutRequired(schema)\n\nconst mapSchemaRecord = <T extends boolean | EntityInputSchema>(\n schemas: Record<string, T>,\n): Record<string, T> =>\n Object.fromEntries(\n Object.entries(schemas).map(([name, schema]) => [name, makeSchemaPartial(schema)]),\n ) as Record<string, T>\n\n/**\n * Zod keeps every failed recursive-union branch. Select the closest matching branch instead of\n * returning a very large error tree to CLI and MCP clients.\n */\nconst getUsefulIssues = (\n issues: core.$ZodIssue[],\n parentPath: PropertyKey[] = [],\n): core.$ZodIssue[] => {\n const selectedIssues = issues.flatMap((issue) => {\n if (issue.code !== 'invalid_union') {\n return [{ ...issue, path: [...parentPath, ...issue.path] }]\n }\n\n const unionPath = [...parentPath, ...issue.path]\n const closestBranch = issue.errors\n .filter((branch) => branch.length > 0)\n .sort(compareIssueBranches)[0]\n\n return closestBranch\n ? getUsefulIssues(closestBranch, unionPath)\n : [{ ...issue, path: unionPath }]\n })\n const uniqueIssues = new Map<string, core.$ZodIssue>()\n\n for (const issue of selectedIssues) {\n const key = `${issue.path.map(String).join('.')}:${issue.message}`\n\n if (!uniqueIssues.has(key)) {\n uniqueIssues.set(key, issue)\n }\n }\n\n return [...uniqueIssues.values()].slice(0, 10)\n}\n\nconst compareIssueBranches = (left: core.$ZodIssue[], right: core.$ZodIssue[]): number => {\n const discriminatorDifference = countDiscriminatorIssues(left) - countDiscriminatorIssues(right)\n\n if (discriminatorDifference !== 0) {\n return discriminatorDifference\n }\n\n const pathDepthDifference = getDeepestPath(right) - getDeepestPath(left)\n\n if (pathDepthDifference !== 0) {\n return pathDepthDifference\n }\n\n return left.length - right.length\n}\n\nconst countDiscriminatorIssues = (issues: core.$ZodIssue[]): number =>\n issues.filter((issue) => {\n const field = issue.path.at(-1)\n\n return field === 'blockType' || field === 'relationTo' || field === 'type'\n }).length\n\nconst getDeepestPath = (issues: core.$ZodIssue[]): number =>\n Math.max(0, ...issues.map((issue) => issue.path.length))\n\nconst formatDataPath = (path: PropertyKey[]): string =>\n path.reduce<string>(\n (result, segment) =>\n typeof segment === 'number' ? `${result}[${segment}]` : `${result}.${String(segment)}`,\n 'data',\n )\n"],"names":["fromJSONSchema","ValidationError","getCollectionInputSchema","getGlobalInputSchema","validateCollectionData","slug","data","partial","req","schema","collectionSlug","shouldKeepDeprecatedProperties","validateEntityData","entity","validateGlobalData","globalSlug","validationSchema","withoutRequired","result","safeParse","success","errors","getUsefulIssues","error","issues","map","message","path","formatDataPath","$defs","additionalProperties","anyOf","items","oneOf","properties","required","_required","partialSchema","mapSchemaRecord","undefined","makeSchemaPartial","Array","isArray","item","schemas","Object","fromEntries","entries","name","parentPath","selectedIssues","flatMap","issue","code","unionPath","closestBranch","filter","branch","length","sort","compareIssueBranches","uniqueIssues","Map","key","String","join","has","set","values","slice","left","right","discriminatorDifference","countDiscriminatorIssues","pathDepthDifference","getDeepestPath","field","at","Math","max","reduce","segment"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/utilities/entityInputSchema/validateEntityData.ts"],"sourcesContent":["import type { core } from 'zod'\n\nimport { fromJSONSchema } from 'zod'\n\nimport type { CollectionSlug, GlobalSlug, PayloadRequest } from '../../index.js'\nimport type { EntityInputSchema } from './types.js'\n\nimport { ValidationError } from '../../errors/ValidationError.js'\nimport { getCollectionInputSchema, getGlobalInputSchema } from './getEntityInputSchema.js'\n\nexport const validateCollectionData = ({\n slug,\n data,\n partial,\n req,\n}: {\n data: Record<string, unknown>\n partial?: boolean\n req: PayloadRequest\n slug: CollectionSlug\n}): void => {\n const schema = getCollectionInputSchema({\n collectionSlug: slug,\n req,\n shouldKeepDeprecatedProperties: true,\n })\n\n validateEntityData({ slug, data, entity: 'collection', partial, req, schema })\n}\n\nexport const validateGlobalData = ({\n slug,\n data,\n req,\n}: {\n data: Record<string, unknown>\n req: PayloadRequest\n slug: GlobalSlug\n}): void => {\n const schema = getGlobalInputSchema({\n globalSlug: slug,\n req,\n shouldKeepDeprecatedProperties: true,\n })\n\n validateEntityData({ slug, data, entity: 'global', partial: true, req, schema })\n}\n\nconst validateEntityData = ({\n slug,\n data,\n entity,\n partial,\n req,\n schema,\n}: {\n data: Record<string, unknown>\n entity: 'collection' | 'global'\n partial?: boolean\n req: PayloadRequest\n schema: EntityInputSchema | null\n slug: string\n}): void => {\n if (!schema) {\n return\n }\n\n const validationSchema = partial ? withoutRequired(schema) : schema\n const result = fromJSONSchema(validationSchema as Parameters<typeof fromJSONSchema>[0]).safeParse(\n data,\n )\n\n if (result.success) {\n return\n }\n\n throw new ValidationError({\n [entity]: slug,\n errors: getUsefulIssues(result.error.issues).map(({ message, path }) => ({\n message,\n path: formatDataPath(path),\n })),\n req,\n })\n}\n\n/** Updates and drafts accept partial data, including partial nested objects and array rows. */\nconst withoutRequired = (schema: EntityInputSchema): EntityInputSchema => {\n const {\n $defs,\n additionalProperties,\n anyOf,\n items,\n oneOf,\n properties,\n required: _required,\n ...partialSchema\n } = schema\n\n return {\n ...partialSchema,\n ...($defs ? { $defs: mapSchemaRecord($defs) } : {}),\n ...(typeof additionalProperties === 'object'\n ? { additionalProperties: withoutRequired(additionalProperties) }\n : additionalProperties !== undefined\n ? { additionalProperties }\n : {}),\n ...(anyOf ? { anyOf: anyOf.map(makeSchemaPartial) } : {}),\n ...(items\n ? {\n items: Array.isArray(items)\n ? items.map((item) => withoutRequired(item))\n : withoutRequired(items),\n }\n : {}),\n ...(oneOf ? { oneOf: oneOf.map(makeSchemaPartial) } : {}),\n ...(properties ? { properties: mapSchemaRecord(properties) } : {}),\n }\n}\n\nconst makeSchemaPartial = (schema: boolean | EntityInputSchema): boolean | EntityInputSchema =>\n typeof schema === 'boolean' ? schema : withoutRequired(schema)\n\nconst mapSchemaRecord = <T extends boolean | EntityInputSchema>(\n schemas: Record<string, T>,\n): Record<string, T> =>\n Object.fromEntries(\n Object.entries(schemas).map(([name, schema]) => [name, makeSchemaPartial(schema)]),\n ) as Record<string, T>\n\n/**\n * Zod keeps every failed recursive-union branch. Select the closest matching branch instead of\n * returning a very large error tree to CLI and MCP clients.\n */\nconst getUsefulIssues = (\n issues: core.$ZodIssue[],\n parentPath: PropertyKey[] = [],\n): core.$ZodIssue[] => {\n const selectedIssues = issues.flatMap((issue) => {\n if (issue.code !== 'invalid_union') {\n return [{ ...issue, path: [...parentPath, ...issue.path] }]\n }\n\n const unionPath = [...parentPath, ...issue.path]\n const closestBranch = issue.errors\n .filter((branch) => branch.length > 0)\n .sort(compareIssueBranches)[0]\n\n return closestBranch\n ? getUsefulIssues(closestBranch, unionPath)\n : [{ ...issue, path: unionPath }]\n })\n const uniqueIssues = new Map<string, core.$ZodIssue>()\n\n for (const issue of selectedIssues) {\n const key = `${issue.path.map(String).join('.')}:${issue.message}`\n\n if (!uniqueIssues.has(key)) {\n uniqueIssues.set(key, issue)\n }\n }\n\n return [...uniqueIssues.values()].slice(0, 10)\n}\n\nconst compareIssueBranches = (left: core.$ZodIssue[], right: core.$ZodIssue[]): number => {\n const discriminatorDifference = countDiscriminatorIssues(left) - countDiscriminatorIssues(right)\n\n if (discriminatorDifference !== 0) {\n return discriminatorDifference\n }\n\n const pathDepthDifference = getDeepestPath(right) - getDeepestPath(left)\n\n if (pathDepthDifference !== 0) {\n return pathDepthDifference\n }\n\n return left.length - right.length\n}\n\nconst countDiscriminatorIssues = (issues: core.$ZodIssue[]): number =>\n issues.filter((issue) => {\n const field = issue.path.at(-1)\n\n return field === 'blockType' || field === 'relationTo' || field === 'type'\n }).length\n\nconst getDeepestPath = (issues: core.$ZodIssue[]): number =>\n Math.max(0, ...issues.map((issue) => issue.path.length))\n\nconst formatDataPath = (path: PropertyKey[]): string =>\n path.reduce<string>(\n (result, segment) =>\n typeof segment === 'number' ? `${result}[${segment}]` : `${result}.${String(segment)}`,\n 'data',\n )\n"],"names":["fromJSONSchema","ValidationError","getCollectionInputSchema","getGlobalInputSchema","validateCollectionData","slug","data","partial","req","schema","collectionSlug","shouldKeepDeprecatedProperties","validateEntityData","entity","validateGlobalData","globalSlug","validationSchema","withoutRequired","result","safeParse","success","errors","getUsefulIssues","error","issues","map","message","path","formatDataPath","$defs","additionalProperties","anyOf","items","oneOf","properties","required","_required","partialSchema","mapSchemaRecord","undefined","makeSchemaPartial","Array","isArray","item","schemas","Object","fromEntries","entries","name","parentPath","selectedIssues","flatMap","issue","code","unionPath","closestBranch","filter","branch","length","sort","compareIssueBranches","uniqueIssues","Map","key","String","join","has","set","values","slice","left","right","discriminatorDifference","countDiscriminatorIssues","pathDepthDifference","getDeepestPath","field","at","Math","max","reduce","segment"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/getVersionsConfig.ts"],"sourcesContent":["import type { CollectionConfig } from '../collections/config/types.js'\nimport type { GlobalConfig } from '../globals/config/types.js'\nimport type { Autosave, SanitizedDrafts } from '../versions/types.js'\n\nimport { versionDefaults } from '../versions/defaults.js'\n\ntype EntityConfig = Pick<CollectionConfig | GlobalConfig, 'versions'>\n\n/**\n * Check if an entity has versions enabled at all\n */\nexport const hasVersionsEnabled = (config: EntityConfig): boolean => {\n return Boolean(config?.versions)\n}\n\n/**\n * Check if an entity has drafts enabled\n */\nexport const hasDraftsEnabled = (config: EntityConfig): boolean => {\n return Boolean(config?.versions && typeof config.versions === 'object' && config.versions.drafts)\n}\n\n/**\n * Check if an entity has localized status enabled\n */\nexport const hasLocalizeStatusEnabled = (config: EntityConfig): boolean => {\n return Boolean(\n config?.versions &&\n typeof config.versions === 'object' &&\n config.versions.drafts &&\n typeof config.versions.drafts === 'object' &&\n (config.versions.drafts as SanitizedDrafts).localizeStatus,\n )\n}\n\n/**\n * Check if an entity has autosave enabled\n */\nexport const hasAutosaveEnabled = (\n config: EntityConfig,\n): config is {\n versions: {\n drafts: { autosave: Autosave | false }\n }\n} & EntityConfig => {\n return Boolean(\n config?.versions &&\n typeof config.versions === 'object' &&\n config.versions.drafts &&\n typeof config.versions.drafts === 'object' &&\n config.versions.drafts.autosave,\n )\n}\n\n/**\n * Check if an entity has validate drafts enabled\n */\nexport const hasDraftValidationEnabled = (config: EntityConfig): boolean => {\n return Boolean(\n config?.versions &&\n typeof config.versions === 'object' &&\n config.versions.drafts &&\n typeof config.versions.drafts === 'object' &&\n config.versions.drafts.validate,\n )\n}\n\nexport const hasScheduledPublishEnabled = (\n config: EntityConfig,\n): config is {\n versions: {\n drafts: { schedulePublish: SanitizedDrafts['schedulePublish'] }\n }\n} & EntityConfig => {\n return Boolean(\n config?.versions &&\n typeof config.versions === 'object' &&\n config.versions.drafts &&\n typeof config.versions.drafts === 'object' &&\n config.versions.drafts.schedulePublish,\n )\n}\n\n/**\n * Get the maximum number of versions to keep for an entity\n * Returns maxPerDoc for collections or max for globals\n */\nexport const getVersionsMax = (config: EntityConfig): number => {\n if (!config?.versions || typeof config.versions !== 'object') {\n return 0\n }\n // Collections have maxPerDoc, globals have max\n if ('maxPerDoc' in config.versions) {\n return config.versions.maxPerDoc ?? 100\n }\n if ('max' in config.versions) {\n return config.versions.max ?? 100\n }\n return 0\n}\n\nexport const getAutosaveInterval = (config: EntityConfig): number => {\n let interval = versionDefaults.autosaveInterval\n if (\n config?.versions &&\n typeof config.versions === 'object' &&\n config.versions.drafts &&\n typeof config.versions.drafts === 'object' &&\n config.versions.drafts.autosave &&\n typeof config.versions.drafts.autosave === 'object'\n ) {\n interval = config.versions.drafts.autosave.interval ?? versionDefaults.autosaveInterval\n }\n return interval\n}\n"],"names":["versionDefaults","hasVersionsEnabled","config","Boolean","versions","hasDraftsEnabled","drafts","hasLocalizeStatusEnabled","localizeStatus","hasAutosaveEnabled","autosave","hasDraftValidationEnabled","validate","hasScheduledPublishEnabled","schedulePublish","getVersionsMax","maxPerDoc","max","getAutosaveInterval","interval","autosaveInterval"],"mappings":"AAIA,SAASA,eAAe,QAAQ,0BAAyB;AAIzD;;CAEC,GACD,OAAO,MAAMC,qBAAqB,CAACC;IACjC,OAAOC,QAAQD,QAAQE;AACzB,EAAC;AAED;;CAEC,GACD,OAAO,MAAMC,mBAAmB,CAACH;IAC/B,OAAOC,QAAQD,QAAQE,YAAY,OAAOF,OAAOE,QAAQ,KAAK,YAAYF,OAAOE,QAAQ,CAACE,MAAM;AAClG,EAAC;AAED;;CAEC,GACD,OAAO,MAAMC,2BAA2B,CAACL;IACvC,OAAOC,QACLD,QAAQE,YACN,OAAOF,OAAOE,QAAQ,KAAK,YAC3BF,OAAOE,QAAQ,CAACE,MAAM,IACtB,OAAOJ,OAAOE,QAAQ,CAACE,MAAM,KAAK,YAClC,AAACJ,OAAOE,QAAQ,CAACE,MAAM,CAAqBE,cAAc;AAEhE,EAAC;AAED;;CAEC,GACD,OAAO,MAAMC,qBAAqB,CAChCP;IAMA,OAAOC,QACLD,QAAQE,YACN,OAAOF,OAAOE,QAAQ,KAAK,YAC3BF,OAAOE,QAAQ,CAACE,MAAM,IACtB,OAAOJ,OAAOE,QAAQ,CAACE,MAAM,KAAK,YAClCJ,OAAOE,QAAQ,CAACE,MAAM,CAACI,QAAQ;AAErC,EAAC;AAED;;CAEC,GACD,OAAO,MAAMC,4BAA4B,CAACT;IACxC,OAAOC,QACLD,QAAQE,YACN,OAAOF,OAAOE,QAAQ,KAAK,YAC3BF,OAAOE,QAAQ,CAACE,MAAM,IACtB,OAAOJ,OAAOE,QAAQ,CAACE,MAAM,KAAK,YAClCJ,OAAOE,QAAQ,CAACE,MAAM,CAACM,QAAQ;AAErC,EAAC;AAED,OAAO,MAAMC,6BAA6B,CACxCX;IAMA,OAAOC,QACLD,QAAQE,YACN,OAAOF,OAAOE,QAAQ,KAAK,YAC3BF,OAAOE,QAAQ,CAACE,MAAM,IACtB,OAAOJ,OAAOE,QAAQ,CAACE,MAAM,KAAK,YAClCJ,OAAOE,QAAQ,CAACE,MAAM,CAACQ,eAAe;AAE5C,EAAC;AAED;;;CAGC,GACD,OAAO,MAAMC,iBAAiB,CAACb;IAC7B,IAAI,CAACA,QAAQE,YAAY,OAAOF,OAAOE,QAAQ,KAAK,UAAU;QAC5D,OAAO;IACT;IACA,+CAA+C;IAC/C,IAAI,eAAeF,OAAOE,QAAQ,EAAE;QAClC,OAAOF,OAAOE,QAAQ,CAACY,SAAS,IAAI;IACtC;IACA,IAAI,SAASd,OAAOE,QAAQ,EAAE;QAC5B,OAAOF,OAAOE,QAAQ,CAACa,GAAG,IAAI;IAChC;IACA,OAAO;AACT,EAAC;AAED,OAAO,MAAMC,sBAAsB,CAAChB;IAClC,IAAIiB,WAAWnB,gBAAgBoB,gBAAgB;IAC/C,IACElB,QAAQE,YACR,OAAOF,OAAOE,QAAQ,KAAK,YAC3BF,OAAOE,QAAQ,CAACE,MAAM,IACtB,OAAOJ,OAAOE,QAAQ,CAACE,MAAM,KAAK,YAClCJ,OAAOE,QAAQ,CAACE,MAAM,CAACI,QAAQ,IAC/B,OAAOR,OAAOE,QAAQ,CAACE,MAAM,CAACI,QAAQ,KAAK,UAC3C;QACAS,WAAWjB,OAAOE,QAAQ,CAACE,MAAM,CAACI,QAAQ,CAACS,QAAQ,IAAInB,gBAAgBoB,gBAAgB;IACzF;IACA,OAAOD;AACT,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/getVersionsConfig.ts"],"sourcesContent":["import type { CollectionConfig } from '../collections/config/types.js'\nimport type { GlobalConfig } from '../globals/config/types.js'\nimport type { Autosave, SanitizedDrafts } from '../versions/types.js'\n\nimport { versionDefaults } from '../versions/defaults.js'\n\ntype EntityConfig = Pick<CollectionConfig | GlobalConfig, 'versions'>\n\n/**\n * Check if an entity has versions enabled at all\n */\nexport const hasVersionsEnabled = (config: EntityConfig): boolean => {\n return Boolean(config?.versions)\n}\n\n/**\n * Check if an entity has drafts enabled\n */\nexport const hasDraftsEnabled = (config: EntityConfig): boolean => {\n return Boolean(config?.versions && typeof config.versions === 'object' && config.versions.drafts)\n}\n\n/**\n * Check if an entity has localized status enabled\n */\nexport const hasLocalizeStatusEnabled = (config: EntityConfig): boolean => {\n return Boolean(\n config?.versions &&\n typeof config.versions === 'object' &&\n config.versions.drafts &&\n typeof config.versions.drafts === 'object' &&\n (config.versions.drafts as SanitizedDrafts).localizeStatus,\n )\n}\n\n/**\n * Check if an entity has autosave enabled\n */\nexport const hasAutosaveEnabled = (\n config: EntityConfig,\n): config is {\n versions: {\n drafts: { autosave: Autosave | false }\n }\n} & EntityConfig => {\n return Boolean(\n config?.versions &&\n typeof config.versions === 'object' &&\n config.versions.drafts &&\n typeof config.versions.drafts === 'object' &&\n config.versions.drafts.autosave,\n )\n}\n\n/**\n * Check if an entity has validate drafts enabled\n */\nexport const hasDraftValidationEnabled = (config: EntityConfig): boolean => {\n return Boolean(\n config?.versions &&\n typeof config.versions === 'object' &&\n config.versions.drafts &&\n typeof config.versions.drafts === 'object' &&\n config.versions.drafts.validate,\n )\n}\n\nexport const hasScheduledPublishEnabled = (\n config: EntityConfig,\n): config is {\n versions: {\n drafts: { schedulePublish: SanitizedDrafts['schedulePublish'] }\n }\n} & EntityConfig => {\n return Boolean(\n config?.versions &&\n typeof config.versions === 'object' &&\n config.versions.drafts &&\n typeof config.versions.drafts === 'object' &&\n config.versions.drafts.schedulePublish,\n )\n}\n\n/**\n * Get the maximum number of versions to keep for an entity\n * Returns maxPerDoc for collections or max for globals\n */\nexport const getVersionsMax = (config: EntityConfig): number => {\n if (!config?.versions || typeof config.versions !== 'object') {\n return 0\n }\n // Collections have maxPerDoc, globals have max\n if ('maxPerDoc' in config.versions) {\n return config.versions.maxPerDoc ?? 100\n }\n if ('max' in config.versions) {\n return config.versions.max ?? 100\n }\n return 0\n}\n\nexport const getAutosaveInterval = (config: EntityConfig): number => {\n let interval = versionDefaults.autosaveInterval\n if (\n config?.versions &&\n typeof config.versions === 'object' &&\n config.versions.drafts &&\n typeof config.versions.drafts === 'object' &&\n config.versions.drafts.autosave &&\n typeof config.versions.drafts.autosave === 'object'\n ) {\n interval = config.versions.drafts.autosave.interval ?? versionDefaults.autosaveInterval\n }\n return interval\n}\n"],"names":["versionDefaults","hasVersionsEnabled","config","Boolean","versions","hasDraftsEnabled","drafts","hasLocalizeStatusEnabled","localizeStatus","hasAutosaveEnabled","autosave","hasDraftValidationEnabled","validate","hasScheduledPublishEnabled","schedulePublish","getVersionsMax","maxPerDoc","max","getAutosaveInterval","interval","autosaveInterval"],"mappings":"AAIA,SAASA,eAAe,QAAQ,0BAAyB;AAIzD;;CAEC,GACD,OAAO,MAAMC,qBAAqB,CAACC;IACjC,OAAOC,QAAQD,QAAQE;AACzB,EAAC;AAED;;CAEC,GACD,OAAO,MAAMC,mBAAmB,CAACH;IAC/B,OAAOC,QAAQD,QAAQE,YAAY,OAAOF,OAAOE,QAAQ,KAAK,YAAYF,OAAOE,QAAQ,CAACE,MAAM;AAClG,EAAC;AAED;;CAEC,GACD,OAAO,MAAMC,2BAA2B,CAACL;IACvC,OAAOC,QACLD,QAAQE,YACR,OAAOF,OAAOE,QAAQ,KAAK,YAC3BF,OAAOE,QAAQ,CAACE,MAAM,IACtB,OAAOJ,OAAOE,QAAQ,CAACE,MAAM,KAAK,YAClC,AAACJ,OAAOE,QAAQ,CAACE,MAAM,CAAqBE,cAAc;AAE9D,EAAC;AAED;;CAEC,GACD,OAAO,MAAMC,qBAAqB,CAChCP;IAMA,OAAOC,QACLD,QAAQE,YACR,OAAOF,OAAOE,QAAQ,KAAK,YAC3BF,OAAOE,QAAQ,CAACE,MAAM,IACtB,OAAOJ,OAAOE,QAAQ,CAACE,MAAM,KAAK,YAClCJ,OAAOE,QAAQ,CAACE,MAAM,CAACI,QAAQ;AAEnC,EAAC;AAED;;CAEC,GACD,OAAO,MAAMC,4BAA4B,CAACT;IACxC,OAAOC,QACLD,QAAQE,YACR,OAAOF,OAAOE,QAAQ,KAAK,YAC3BF,OAAOE,QAAQ,CAACE,MAAM,IACtB,OAAOJ,OAAOE,QAAQ,CAACE,MAAM,KAAK,YAClCJ,OAAOE,QAAQ,CAACE,MAAM,CAACM,QAAQ;AAEnC,EAAC;AAED,OAAO,MAAMC,6BAA6B,CACxCX;IAMA,OAAOC,QACLD,QAAQE,YACR,OAAOF,OAAOE,QAAQ,KAAK,YAC3BF,OAAOE,QAAQ,CAACE,MAAM,IACtB,OAAOJ,OAAOE,QAAQ,CAACE,MAAM,KAAK,YAClCJ,OAAOE,QAAQ,CAACE,MAAM,CAACQ,eAAe;AAE1C,EAAC;AAED;;;CAGC,GACD,OAAO,MAAMC,iBAAiB,CAACb;IAC7B,IAAI,CAACA,QAAQE,YAAY,OAAOF,OAAOE,QAAQ,KAAK,UAAU;QAC5D,OAAO;IACT;IACA,+CAA+C;IAC/C,IAAI,eAAeF,OAAOE,QAAQ,EAAE;QAClC,OAAOF,OAAOE,QAAQ,CAACY,SAAS,IAAI;IACtC;IACA,IAAI,SAASd,OAAOE,QAAQ,EAAE;QAC5B,OAAOF,OAAOE,QAAQ,CAACa,GAAG,IAAI;IAChC;IACA,OAAO;AACT,EAAC;AAED,OAAO,MAAMC,sBAAsB,CAAChB;IAClC,IAAIiB,WAAWnB,gBAAgBoB,gBAAgB;IAC/C,IACElB,QAAQE,YACR,OAAOF,OAAOE,QAAQ,KAAK,YAC3BF,OAAOE,QAAQ,CAACE,MAAM,IACtB,OAAOJ,OAAOE,QAAQ,CAACE,MAAM,KAAK,YAClCJ,OAAOE,QAAQ,CAACE,MAAM,CAACI,QAAQ,IAC/B,OAAOR,OAAOE,QAAQ,CAACE,MAAM,CAACI,QAAQ,KAAK,UAC3C;QACAS,WAAWjB,OAAOE,QAAQ,CAACE,MAAM,CAACI,QAAQ,CAACS,QAAQ,IAAInB,gBAAgBoB,gBAAgB;IACzF;IACA,OAAOD;AACT,EAAC"}
@@ -11,7 +11,10 @@
11
11
  *
12
12
  * 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.
13
13
  */
14
- export declare class Conf<T extends Record<string, any> = Record<string, unknown>> implements Iterable<[keyof T, T[keyof T]]> {
14
+ export declare class Conf<T extends Record<string, any> = Record<string, unknown>> implements Iterable<[
15
+ keyof T,
16
+ T[keyof T]
17
+ ]> {
15
18
  #private;
16
19
  private readonly _deserialize;
17
20
  private readonly _serialize;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/utilities/telemetry/conf/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAsBH,qBAAa,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CACvE,YAAW,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;;IAG1C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA+C;IAC5E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkE;IAE7F,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;IAE5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IAErB,cAyBC;IAED,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,MAAM;IAMd;;;;OAIG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAKxB;IAED;;;;OAIG;IACH,GAAG,CAAC,GAAG,SAAS,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAGzC;IAED;;;;;OAKG;IACH,GAAG,CAAC,GAAG,SAAS,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO,GAAG,IAAI,CA4BpE;IAEA,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAI5D;IACD,IAAI,IAAI,IAAI,MAAM,CAEjB;IACD,IAAI,KAAK,IAAI,CAAC,CAab;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC,EAMjB;CACF;AAED,MAAM,MAAM,OAAO,GAAG;IACpB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAE5B;;;;;;;;OAQG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAEhC;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IAEtB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAChC,CAAA;AAED,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAA;AAC/C,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,KAAK,CAAC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/utilities/telemetry/conf/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAsBH,qBAAa,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAE,YAAW,QAAQ,CAC5F;IAAC,MAAM,CAAC;IAAE,CAAC,CAAC,MAAM,CAAC,CAAC;CAAC,CACtB;;IAEC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA+C;IAC5E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkE;IAE7F,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;IAE5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IAErB,cAyBC;IAED,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,MAAM;IAMd;;;;OAIG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAKxB;IAED;;;;OAIG;IACH,GAAG,CAAC,GAAG,SAAS,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAGzC;IAED;;;;;OAKG;IACH,GAAG,CAAC,GAAG,SAAS,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO,GAAG,IAAI,CA4BpE;IAEA,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAI5D;IACD,IAAI,IAAI,IAAI,MAAM,CAEjB;IACD,IAAI,KAAK,IAAI,CAAC,CAab;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC,EAMjB;CACF;AAED,MAAM,MAAM,OAAO,GAAG;IACpB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAE5B;;;;;;;;OAQG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAEhC;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IAEtB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAChC,CAAA;AAED,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAA;AAC/C,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,KAAK,CAAC,CAAA"}
@@ -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","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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"}
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>> implements Iterable<\n [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":"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;IAErB,aAAc;QACZ,MAAMqB,UAA4B;YAChCC,gBAAgB;YAChBC,YAAY;YACZC,eAAe;YACfC,eAAe;QACjB;QAEA,MAAMC,MAAMzB,SAAS,WAAW;YAAE0B,QAAQN,QAAQI,aAAa;QAAC,GAAGG,MAAM;QAEzE,IAAI,CAAC,CAAA,OAAQ,GAAGP;QAEhB,IAAI,CAACD,MAAM,GAAG,IAAIS;QAElB,MAAML,gBAAgBH,QAAQG,aAAa,GAAG,CAAC,CAAC,EAAEH,QAAQG,aAAa,EAAE,GAAG;QAC5E,IAAI,CAACxB,IAAI,GAAGA,KAAK8B,OAAO,CAACJ,KAAK,GAAGL,QAAQE,UAAU,IAAI,WAAWC,eAAe;QAEjF,MAAMO,YAAY,IAAI,CAACC,KAAK;QAC5B,MAAMA,QAAQ7B,OAAO8B,MAAM,CAAC/B,qBAAqB6B;QAEjD,IAAI;YACFjC,OAAOoC,SAAS,CAACH,WAAWC;QAC9B,EAAE,OAAM;YACN,IAAI,CAACA,KAAK,GAAGA;QACf;IACF;IAEQG,mBAAyB;QAC/B,6EAA6E;QAC7EpC,GAAGqC,SAAS,CAACpC,KAAKqC,OAAO,CAAC,IAAI,CAACrC,IAAI,GAAG;YAAEsC,WAAW;QAAK;IAC1D;IAEQC,OAAOhC,KAAQ,EAAQ;QAC7B,MAAMiC,OAA4B,IAAI,CAACvB,UAAU,CAACV;QAElDR,GAAG0C,aAAa,CAAC,IAAI,CAACzC,IAAI,EAAEwC,MAAM;YAAEE,MAAM,IAAI,CAAC,CAAA,OAAQ,CAACpB,cAAc;QAAC;IACzE;IAEA;;;;GAIC,GACDqB,OAAOrC,GAAW,EAAQ;QACxB,MAAM,EAAE0B,KAAK,EAAE,GAAG,IAAI;QACtB,OAAOA,KAAK,CAAC1B,IAAI;QAEjB,IAAI,CAAC0B,KAAK,GAAGA;IACf;IAEA;;;;GAIC,GACDY,IAAyBtC,GAAQ,EAAU;QACzC,MAAM,EAAE0B,KAAK,EAAE,GAAG,IAAI;QACtB,OAAOA,KAAK,CAAC1B,IAAI;IACnB;IAEA;;;;;GAKC,GACDuC,IAAyBvC,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,EAAEoB,KAAK,EAAE,GAAG,IAAI;QAEtB,MAAMa,MAAM,CAACvC,KAAaC;YACxBF,eAAeC,KAAKC;YACpByB,KAAK,CAAC1B,IAAW,GAAGC;QACtB;QAEA,IAAI,OAAOD,QAAQ,UAAU;YAC3B,MAAMwC,SAASxC;YACf,KAAK,MAAM,CAACA,KAAKC,MAAM,IAAIJ,OAAO4C,OAAO,CAACD,QAAS;gBACjDD,IAAIvC,KAAKC;YACX;QACF,OAAO;YACLsC,IAAIvC,KAAKC;QACX;QAEA,IAAI,CAACyB,KAAK,GAAGA;IACf;IAEA,CAAC,CAACgB,OAAOC,QAAQ,CAAC,GAA4C;QAC5D,KAAK,MAAM,CAAC3C,KAAKC,MAAM,IAAIJ,OAAO4C,OAAO,CAAC,IAAI,CAACf,KAAK,EAAG;YACrD,MAAM;gBAAC1B;gBAAKC;aAAM;QACpB;IACF;IACA,IAAI2C,OAAe;QACjB,OAAO/C,OAAOgD,IAAI,CAAC,IAAI,CAACnB,KAAK,EAAEoB,MAAM;IACvC;IACA,IAAIpB,QAAW;QACb,IAAI;YACF,MAAMqB,aAAatD,GAAGuD,YAAY,CAAC,IAAI,CAACtD,IAAI,EAAE;YAC9C,MAAMuD,mBAAmB,IAAI,CAACzC,YAAY,CAACuC;YAC3C,OAAOlD,OAAO8B,MAAM,CAAC/B,qBAAqBqD;QAC5C,EAAE,OAAOC,OAAgB;YACvB,IAAI,AAACA,OAAeC,SAAS,UAAU;gBACrC,IAAI,CAACtB,gBAAgB;gBACrB,OAAOjC;YACT;YAEA,MAAMsD;QACR;IACF;IAEA,IAAIxB,MAAMzB,KAAQ,EAAE;QAClB,IAAI,CAAC4B,gBAAgB;QAErB,IAAI,CAACI,MAAM,CAAChC;QAEZ,IAAI,CAACa,MAAM,CAACsC,aAAa,CAAC,IAAIC,MAAM;IACtC;AACF"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/versions/isInheritedReadVersionsAccess.ts"],"sourcesContent":["import type { Access, AccessArgs } from '../config/types.js'\n\nconst inheritedReadVersionsAccess = Symbol('inheritedReadVersionsAccess')\nconst inheritedReadVersionsParentID = Symbol('inheritedReadVersionsParentID')\n\ntype InheritedReadVersionsAccess = {\n [inheritedReadVersionsAccess]: true\n} & Access\n\ntype InheritedReadVersionsAccessArgs = {\n [inheritedReadVersionsParentID]?: AccessArgs['id']\n} & AccessArgs\n\nexport const markInheritedReadVersionsAccess = <TAccess extends Access>(\n access: TAccess,\n): TAccess => {\n Object.defineProperty(access, inheritedReadVersionsAccess, { value: true })\n\n return access\n}\n\nexport const isInheritedReadVersionsAccess = (access?: Access): boolean =>\n Boolean(\n access &&\n (access as Partial<InheritedReadVersionsAccess>)[inheritedReadVersionsAccess] === true,\n )\n\nexport const resolveInheritedReadVersionsAccessArgs = (args: AccessArgs): AccessArgs => {\n const inheritedArgs = args as InheritedReadVersionsAccessArgs\n\n if (!(inheritedReadVersionsParentID in inheritedArgs)) {\n return args\n }\n\n const readArgs = {\n ...args,\n id: inheritedArgs[inheritedReadVersionsParentID],\n } as InheritedReadVersionsAccessArgs\n\n delete readArgs[inheritedReadVersionsParentID]\n\n return readArgs\n}\n\nexport const withInheritedReadVersionsParentID = (\n args: AccessArgs,\n parentID: AccessArgs['id'],\n): AccessArgs => {\n const inheritedArgs: InheritedReadVersionsAccessArgs = {\n ...args,\n [inheritedReadVersionsParentID]: parentID,\n }\n\n return inheritedArgs\n}\n"],"names":["inheritedReadVersionsAccess","Symbol","inheritedReadVersionsParentID","markInheritedReadVersionsAccess","access","Object","defineProperty","value","isInheritedReadVersionsAccess","Boolean","resolveInheritedReadVersionsAccessArgs","args","inheritedArgs","readArgs","id","withInheritedReadVersionsParentID","parentID"],"mappings":"AAEA,MAAMA,8BAA8BC,OAAO;AAC3C,MAAMC,gCAAgCD,OAAO;AAU7C,OAAO,MAAME,kCAAkC,CAC7CC;IAEAC,OAAOC,cAAc,CAACF,QAAQJ,6BAA6B;QAAEO,OAAO;IAAK;IAEzE,OAAOH;AACT,EAAC;AAED,OAAO,MAAMI,gCAAgC,CAACJ,SAC5CK,QACEL,UACE,AAACA,MAA+C,CAACJ,4BAA4B,KAAK,MACrF;AAEH,OAAO,MAAMU,yCAAyC,CAACC;IACrD,MAAMC,gBAAgBD;IAEtB,IAAI,CAAET,CAAAA,iCAAiCU,aAAY,GAAI;QACrD,OAAOD;IACT;IAEA,MAAME,WAAW;QACf,GAAGF,IAAI;QACPG,IAAIF,aAAa,CAACV,8BAA8B;IAClD;IAEA,OAAOW,QAAQ,CAACX,8BAA8B;IAE9C,OAAOW;AACT,EAAC;AAED,OAAO,MAAME,oCAAoC,CAC/CJ,MACAK;IAEA,MAAMJ,gBAAiD;QACrD,GAAGD,IAAI;QACP,CAACT,8BAA8B,EAAEc;IACnC;IAEA,OAAOJ;AACT,EAAC"}
1
+ {"version":3,"sources":["../../src/versions/isInheritedReadVersionsAccess.ts"],"sourcesContent":["import type { Access, AccessArgs } from '../config/types.js'\n\nconst inheritedReadVersionsAccess = Symbol('inheritedReadVersionsAccess')\nconst inheritedReadVersionsParentID = Symbol('inheritedReadVersionsParentID')\n\ntype InheritedReadVersionsAccess = {\n [inheritedReadVersionsAccess]: true\n} & Access\n\ntype InheritedReadVersionsAccessArgs = {\n [inheritedReadVersionsParentID]?: AccessArgs['id']\n} & AccessArgs\n\nexport const markInheritedReadVersionsAccess = <TAccess extends Access>(\n access: TAccess,\n): TAccess => {\n Object.defineProperty(access, inheritedReadVersionsAccess, { value: true })\n\n return access\n}\n\nexport const isInheritedReadVersionsAccess = (access?: Access): boolean =>\n Boolean(\n access &&\n (access as Partial<InheritedReadVersionsAccess>)[inheritedReadVersionsAccess] === true,\n )\n\nexport const resolveInheritedReadVersionsAccessArgs = (args: AccessArgs): AccessArgs => {\n const inheritedArgs = args as InheritedReadVersionsAccessArgs\n\n if (!(inheritedReadVersionsParentID in inheritedArgs)) {\n return args\n }\n\n const readArgs = {\n ...args,\n id: inheritedArgs[inheritedReadVersionsParentID],\n } as InheritedReadVersionsAccessArgs\n\n delete readArgs[inheritedReadVersionsParentID]\n\n return readArgs\n}\n\nexport const withInheritedReadVersionsParentID = (\n args: AccessArgs,\n parentID: AccessArgs['id'],\n): AccessArgs => {\n const inheritedArgs: InheritedReadVersionsAccessArgs = {\n ...args,\n [inheritedReadVersionsParentID]: parentID,\n }\n\n return inheritedArgs\n}\n"],"names":["inheritedReadVersionsAccess","Symbol","inheritedReadVersionsParentID","markInheritedReadVersionsAccess","access","Object","defineProperty","value","isInheritedReadVersionsAccess","Boolean","resolveInheritedReadVersionsAccessArgs","args","inheritedArgs","readArgs","id","withInheritedReadVersionsParentID","parentID"],"mappings":"AAEA,MAAMA,8BAA8BC,OAAO;AAC3C,MAAMC,gCAAgCD,OAAO;AAU7C,OAAO,MAAME,kCAAkC,CAC7CC;IAEAC,OAAOC,cAAc,CAACF,QAAQJ,6BAA6B;QAAEO,OAAO;IAAK;IAEzE,OAAOH;AACT,EAAC;AAED,OAAO,MAAMI,gCAAgC,CAACJ,SAC5CK,QACEL,UACA,AAACA,MAA+C,CAACJ,4BAA4B,KAAK,MACnF;AAEH,OAAO,MAAMU,yCAAyC,CAACC;IACrD,MAAMC,gBAAgBD;IAEtB,IAAI,CAAET,CAAAA,iCAAiCU,aAAY,GAAI;QACrD,OAAOD;IACT;IAEA,MAAME,WAAW;QACf,GAAGF,IAAI;QACPG,IAAIF,aAAa,CAACV,8BAA8B;IAClD;IAEA,OAAOW,QAAQ,CAACX,8BAA8B;IAE9C,OAAOW;AACT,EAAC;AAED,OAAO,MAAME,oCAAoC,CAC/CJ,MACAK;IAEA,MAAMJ,gBAAiD;QACrD,GAAGD,IAAI;QACP,CAACT,8BAA8B,EAAEc;IACnC;IAEA,OAAOJ;AACT,EAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "payload",
3
- "version": "4.0.0-beta.1",
3
+ "version": "4.0.0-beta.3",
4
4
  "description": "Node, React, Headless CMS and Application Framework built on Next.js",
5
5
  "keywords": [
6
6
  "admin panel",
@@ -23,11 +23,6 @@
23
23
  "bugs": {
24
24
  "url": "https://github.com/payloadcms/payload"
25
25
  },
26
- "repository": {
27
- "type": "git",
28
- "url": "https://github.com/payloadcms/payload.git",
29
- "directory": "packages/payload"
30
- },
31
26
  "license": "MIT",
32
27
  "author": "Payload <dev@payloadcms.com> (https://payloadcms.com)",
33
28
  "maintainers": [
@@ -37,8 +32,23 @@
37
32
  "url": "https://payloadcms.com"
38
33
  }
39
34
  ],
40
- "sideEffects": false,
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "https://github.com/payloadcms/payload.git",
38
+ "directory": "packages/payload"
39
+ },
40
+ "bin": {
41
+ "payload": "bin.js"
42
+ },
43
+ "files": [
44
+ "dist",
45
+ "bin.js",
46
+ "skills"
47
+ ],
41
48
  "type": "module",
49
+ "sideEffects": false,
50
+ "main": "./dist/index.js",
51
+ "types": "./dist/index.d.ts",
42
52
  "imports": {
43
53
  "#validateJSONSchema": {
44
54
  "types": "./dist/fields/validateJSONSchema.d.ts",
@@ -98,18 +108,11 @@
98
108
  "default": "./dist/__testing__/predefinedMigration.js"
99
109
  }
100
110
  },
101
- "main": "./dist/index.js",
102
- "types": "./dist/index.d.ts",
103
- "bin": {
104
- "payload": "bin.js"
111
+ "publishConfig": {
112
+ "registry": "https://registry.npmjs.org/"
105
113
  },
106
- "files": [
107
- "dist",
108
- "bin.js",
109
- "skills"
110
- ],
111
114
  "dependencies": {
112
- "@next/env": "16.4.0",
115
+ "@next/env": "16.4.2",
113
116
  "@standard-schema/spec": "1.1.0",
114
117
  "@types/busboy": "1.5.4",
115
118
  "bson-objectid": "2.0.4",
@@ -142,7 +145,7 @@
142
145
  "uuid": "14.0.0",
143
146
  "ws": "^8.16.0",
144
147
  "zod": "^4.6.0",
145
- "@payloadcms/translations": "4.0.0-beta.1"
148
+ "@payloadcms/translations": "4.0.0-beta.3"
146
149
  },
147
150
  "devDependencies": {
148
151
  "@hyrious/esbuild-plugin-commonjs": "0.2.6",
@@ -169,9 +172,6 @@
169
172
  "engines": {
170
173
  "node": ">=24.15.0"
171
174
  },
172
- "publishConfig": {
173
- "registry": "https://registry.npmjs.org/"
174
- },
175
175
  "scripts": {
176
176
  "build": "rimraf .dist && rimraf tsconfig.tsbuildinfo && pnpm copyfiles && pnpm build:types && pnpm build:swc && pnpm bundle:types && echo skipping esbuild",
177
177
  "build:bundle-for-analysis": "node ./bundle.js esbuild",
@@ -493,9 +493,7 @@ import type { CollectionConfig } from 'payload'
493
493
 
494
494
  export const Orders: CollectionConfig = {
495
495
  slug: 'orders',
496
- fields: [
497
- /* ... */
498
- ],
496
+ fields: [/* ... */],
499
497
  endpoints: [
500
498
  {
501
499
  path: '/:id/tracking',
@@ -519,9 +517,7 @@ import type { GlobalConfig } from 'payload'
519
517
 
520
518
  export const Settings: GlobalConfig = {
521
519
  slug: 'settings',
522
- fields: [
523
- /* ... */
524
- ],
520
+ fields: [/* ... */],
525
521
  endpoints: [
526
522
  {
527
523
  path: '/clear-cache',
@@ -568,9 +564,7 @@ Add endpoints based on config options.
568
564
  ```ts
569
565
  export const MyCollection: CollectionConfig = {
570
566
  slug: 'posts',
571
- fields: [
572
- /* ... */
573
- ],
567
+ fields: [/* ... */],
574
568
  endpoints: [
575
569
  // Always included
576
570
  {
@@ -149,10 +149,10 @@ plugin-<name>/
149
149
  "copyfiles": "^2.4.1",
150
150
  "cross-env": "10.1.0",
151
151
  "eslint": "^9.39.2",
152
- "next": "^16.4.0",
152
+ "next": "^16.4.2",
153
153
  "payload": "^3.82.1",
154
- "react": "^19.3.0",
155
- "react-dom": "^19.3.0",
154
+ "react": "^19.3.1",
155
+ "react-dom": "^19.3.1",
156
156
  "rimraf": "^6.0.1",
157
157
  "typescript": "^6.0.3",
158
158
  "vitest": "5.0.1"