payload 4.0.0-beta.2 → 4.0.0-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/adapters/router.d.ts +1 -1
- package/dist/admin/adapters/router.d.ts.map +1 -1
- package/dist/admin/adapters/router.js.map +1 -1
- package/dist/admin/initAdminContext.js.map +1 -1
- package/dist/auth/getFieldsToSign.js.map +1 -1
- package/dist/auth/loginWithCookie.js.map +1 -1
- package/dist/auth/serverFunctions/cookies.js.map +1 -1
- package/dist/auth/serverFunctions/login.js.map +1 -1
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/auth/types.js.map +1 -1
- package/dist/cli/commands/data/utilities.d.ts +1 -1
- package/dist/cli/commands/data/utilities.d.ts.map +1 -1
- package/dist/cli/commands/data/utilities.js.map +1 -1
- package/dist/cli/defineCLICommand.js +1 -1
- package/dist/cli/defineCLICommand.js.map +1 -1
- package/dist/collections/config/client.js.map +1 -1
- package/dist/collections/config/types.d.ts.map +1 -1
- package/dist/collections/config/types.js.map +1 -1
- package/dist/collections/operations/findByID.js.map +1 -1
- package/dist/collections/operations/findVersionByID.js.map +1 -1
- package/dist/collections/operations/findVersions.js.map +1 -1
- package/dist/collections/operations/local/findDistinct.js.map +1 -1
- package/dist/collections/operations/renameFile.js +1 -1
- package/dist/collections/operations/renameFile.js.map +1 -1
- package/dist/collections/operations/utilities/update.js +1 -1
- package/dist/collections/operations/utilities/update.js.map +1 -1
- package/dist/collections/operations/validate.js +4 -4
- package/dist/collections/operations/validate.js.map +1 -1
- package/dist/config/definePlugin.js.map +1 -1
- package/dist/config/sanitize.js +2 -2
- package/dist/config/sanitize.js.map +1 -1
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js.map +1 -1
- package/dist/database/types.d.ts +4 -0
- package/dist/database/types.d.ts.map +1 -1
- package/dist/database/types.js.map +1 -1
- package/dist/exports/build-config.d.ts +9 -0
- package/dist/exports/build-config.d.ts.map +1 -0
- package/dist/exports/build-config.js +38 -0
- package/dist/exports/build-config.js.map +1 -0
- package/dist/fields/config/client.js.map +1 -1
- package/dist/fields/config/reservedFieldNames.d.ts.map +1 -1
- package/dist/fields/config/reservedFieldNames.js.map +1 -1
- package/dist/fields/config/types.d.ts.map +1 -1
- package/dist/fields/config/types.js.map +1 -1
- package/dist/fields/hooks/afterChange/promise.js.map +1 -1
- package/dist/fields/hooks/afterRead/promise.js.map +1 -1
- package/dist/fields/hooks/beforeChange/flattenValidationData.d.ts +14 -0
- package/dist/fields/hooks/beforeChange/flattenValidationData.d.ts.map +1 -0
- package/dist/fields/hooks/beforeChange/flattenValidationData.js +36 -0
- package/dist/fields/hooks/beforeChange/flattenValidationData.js.map +1 -0
- package/dist/fields/hooks/beforeChange/promise.d.ts +2 -1
- package/dist/fields/hooks/beforeChange/promise.d.ts.map +1 -1
- package/dist/fields/hooks/beforeChange/promise.js +96 -22
- package/dist/fields/hooks/beforeChange/promise.js.map +1 -1
- package/dist/fields/hooks/beforeChange/traverseFields.d.ts +2 -1
- package/dist/fields/hooks/beforeChange/traverseFields.d.ts.map +1 -1
- package/dist/fields/hooks/beforeChange/traverseFields.js +2 -1
- package/dist/fields/hooks/beforeChange/traverseFields.js.map +1 -1
- package/dist/fields/validations.d.ts.map +1 -1
- package/dist/fields/validations.js +4 -1
- package/dist/fields/validations.js.map +1 -1
- package/dist/globals/config/types.d.ts.map +1 -1
- package/dist/globals/config/types.js.map +1 -1
- package/dist/globals/operations/local/findOne.js.map +1 -1
- package/dist/globals/operations/local/update.js.map +1 -1
- package/dist/globals/operations/restoreVersion.d.ts +2 -3
- package/dist/globals/operations/restoreVersion.d.ts.map +1 -1
- package/dist/globals/operations/restoreVersion.js +22 -15
- package/dist/globals/operations/restoreVersion.js.map +1 -1
- package/dist/globals/operations/validate.js +1 -1
- package/dist/globals/operations/validate.js.map +1 -1
- package/dist/hierarchy/createFolderField.js.map +1 -1
- package/dist/hierarchy/resolveHierarchyCollections.js +2 -2
- package/dist/hierarchy/resolveHierarchyCollections.js.map +1 -1
- package/dist/hierarchy/utils/computePaths.d.ts.map +1 -1
- package/dist/hierarchy/utils/computePaths.js.map +1 -1
- package/dist/index.bundled.d.ts +18 -4
- package/dist/queues/operations/runJobs/runJob/getRunTaskFunction.js +1 -1
- package/dist/queues/operations/runJobs/runJob/getRunTaskFunction.js.map +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/uploads/fileVersioning/archive.js.map +1 -1
- package/dist/uploads/fileVersioning/cloudStorage.js.map +1 -1
- package/dist/uploads/fileVersioning/resolveHistoricalFile.js.map +1 -1
- package/dist/uploads/generateFileData.d.ts.map +1 -1
- package/dist/uploads/generateFileData.js.map +1 -1
- package/dist/uploads/getFileContentRequirement.js.map +1 -1
- package/dist/uploads/getFileFromUploadInstructions.js.map +1 -1
- package/dist/uploads/safeFetch.js.map +1 -1
- package/dist/uploads/stagedUpload.js.map +1 -1
- package/dist/uploads/transformers/handleDynamicFileRequest.js +11 -2
- package/dist/uploads/transformers/handleDynamicFileRequest.js.map +1 -1
- package/dist/utilities/addSelectGenericsToGeneretedTypes.d.ts.map +1 -1
- package/dist/utilities/addSelectGenericsToGeneretedTypes.js +0 -1
- package/dist/utilities/addSelectGenericsToGeneretedTypes.js.map +1 -1
- package/dist/utilities/appendDateTimezoneSelectFields.js.map +1 -1
- package/dist/utilities/cloneValidationRequest.js.map +1 -1
- package/dist/utilities/createPayloadRequest.js.map +1 -1
- package/dist/utilities/deepCopyObject.js.map +1 -1
- package/dist/utilities/documentMatchingWhereExists.js +1 -1
- package/dist/utilities/documentMatchingWhereExists.js.map +1 -1
- package/dist/utilities/entityInputSchema/validateEntityData.d.ts.map +1 -1
- package/dist/utilities/entityInputSchema/validateEntityData.js.map +1 -1
- package/dist/utilities/filterDataToSelectedLocales.js.map +1 -1
- package/dist/utilities/getEntityPermissions/getEntityPermissions.d.ts.map +1 -1
- package/dist/utilities/getEntityPermissions/getEntityPermissions.js +1 -0
- package/dist/utilities/getEntityPermissions/getEntityPermissions.js.map +1 -1
- package/dist/utilities/getEntityPermissions/populateFieldPermissions.js.map +1 -1
- package/dist/utilities/getVersionsConfig.js.map +1 -1
- package/dist/utilities/parseParams/index.js.map +1 -1
- package/dist/utilities/parseValidationLocale.js.map +1 -1
- package/dist/utilities/sanitizePopulateParam.js.map +1 -1
- package/dist/utilities/telemetry/conf/index.d.ts +4 -1
- package/dist/utilities/telemetry/conf/index.d.ts.map +1 -1
- package/dist/utilities/telemetry/conf/index.js.map +1 -1
- package/dist/utilities/telemetry/featureInfo/getFeatureInfo.js.map +1 -1
- package/dist/versions/allLocalesPublicationStatus.js.map +1 -1
- package/dist/versions/isInheritedReadVersionsAccess.js.map +1 -1
- package/package.json +29 -27
- package/skills/payload/reference/ENDPOINTS.md +3 -9
- package/skills/payload/reference/PLUGIN-DEVELOPMENT.md +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/collections/operations/renameFile.ts"],"sourcesContent":["import fs from 'node:fs/promises'\nimport path from 'node:path'\n\nimport type { JsonObject, PayloadRequest } from '../../types/index.js'\nimport type { Collection } from '../config/types.js'\n\nimport { executeAccess } from '../../auth/executeAccess.js'\nimport { hasWhereAccessResult } from '../../auth/types.js'\nimport { combineQueries } from '../../database/combineQueries.js'\nimport { APIError, Forbidden, NotFound } from '../../errors/index.js'\nimport { replaceStoredFileReferences } from '../../uploads/fileVersioning/archive.js'\nimport {\n removeUnreferencedStagedObjects,\n scheduleUnreferencedFileCleanup,\n} from '../../uploads/fileVersioning/cleanup.js'\nimport {\n abortFileOperationScope,\n beginFileOperationScope,\n completeFileOperationScope,\n runFileOperationPlan,\n} from '../../uploads/fileVersioning/fileOperationManager.js'\nimport { copyLocalFile } from '../../uploads/fileVersioning/localStorage.js'\nimport { getOriginalFilename, normalizeStorageKey } from '../../uploads/fileVersioning/naming.js'\nimport {\n collectStoredFiles,\n getStoredFileIdentity,\n withLegacyCloudUploadFileData,\n} from '../../uploads/fileVersioning/storedFiles.js'\nimport { commitTransaction } from '../../utilities/commitTransaction.js'\nimport { initTransaction } from '../../utilities/initTransaction.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport { getLatestCollectionVersion } from '../../versions/getLatestCollectionVersion.js'\nimport { saveVersion } from '../../versions/saveVersion.js'\nimport { buildAfterOperation } from './utilities/buildAfterOperation.js'\nimport { buildBeforeOperation } from './utilities/buildBeforeOperation.js'\nimport { updateDocument } from './utilities/update.js'\n\nexport type RenameFileArguments = {\n collection: Collection\n depth?: number\n disableTransaction?: boolean\n draft?: boolean\n filename: string\n id: number | string\n overrideAccess?: boolean\n req: PayloadRequest\n}\n\n/** Renames the current managed file set without changing its bytes. */\nexport const renameFileOperation = async (\n incomingArgs: RenameFileArguments,\n): Promise<JsonObject> => {\n let args = { ...incomingArgs, data: { filename: incomingArgs.filename } }\n const { req } = args\n beginFileOperationScope({ req })\n\n try {\n const shouldCommit = !args.disableTransaction && (await initTransaction(req))\n args = await buildBeforeOperation({\n args,\n collection: args.collection.config,\n operation: 'updateByID',\n overrideAccess: args.overrideAccess ?? false,\n })\n\n const { id, collection, draft = false, overrideAccess = false } = args\n const { filename } = args.data\n if (!collection.config.upload) {\n throw new APIError('This collection does not support file rename.', 400)\n }\n\n const access = overrideAccess\n ? true\n : await executeAccess(\n { id, slug: collection.config.slug, data: { filename }, req },\n collection.config.access.update,\n )\n const where = combineQueries({ id: { equals: id } }, access)\n const query = { collection: collection.config.slug, locale: 'all' as const, req, where }\n const current = draft\n ? await getLatestCollectionVersion({\n id,\n config: collection.config,\n payload: req.payload,\n query,\n req,\n })\n : await req.payload.db.findOne(query)\n\n if (!current) {\n throw hasWhereAccessResult(access) ? new Forbidden(req.t) : new NotFound(req.t)\n }\n const stored = await withLegacyCloudUploadFileData({\n collection: collection.config,\n doc: current as JsonObject,\n req,\n })\n const operations = collection.config.upload.fileOperations\n const storedFiles = collectStoredFiles({ collection: collection.config, doc: stored, req })\n const oldOriginal = (stored.original as { filename?: string } | undefined)?.filename\n const oldFilename = oldOriginal ?? (stored.filename as string | undefined)\n\n if (!oldFilename || !storedFiles.length) {\n throw new APIError('This upload has no managed files to rename.', 400)\n }\n\n const { newStem } = validateRename({ filename, oldFilename })\n const originalStem = path.posix.parse(oldFilename).name\n const originalMarkerIndex = originalStem.lastIndexOf('-original')\n const oldStem =\n originalMarkerIndex > 0\n ? originalStem.slice(0, originalMarkerIndex)\n : path.posix.parse(stored.filename as string).name\n if (filename === `${oldStem}${path.posix.extname(oldFilename)}`) {\n throw new APIError('The upload already has this filename.', 400)\n }\n\n const originalFilename = getOriginalFilename({ filename })\n const plannedKeys = new Set(\n storedFiles\n .filter(({ roles }) => roles.some(({ type }) => type === 'original'))\n .map(({ key }) =>\n getStoredFileIdentity({\n key: path.posix.join(path.posix.dirname(key), originalFilename),\n }),\n ),\n )\n const replacements = new Map<string, string>()\n for (const file of storedFiles) {\n const previousFilename = path.posix.basename(file.key)\n const hasOriginalRole = file.roles.some(({ type }) => type === 'original')\n const suffix = previousFilename.startsWith(oldStem)\n ? previousFilename.slice(oldStem.length)\n : `-${previousFilename}`\n let nextFilename = hasOriginalRole ? originalFilename : `${newStem}${suffix}`\n const directory = path.posix.dirname(file.key)\n let nextKey = path.posix.join(directory, nextFilename)\n let nextIdentity = getStoredFileIdentity({\n key: nextKey,\n })\n const extension = path.posix.extname(nextFilename)\n const stem = nextFilename.slice(0, -extension.length || undefined)\n let collisionNumber = 1\n while (!hasOriginalRole && plannedKeys.has(nextIdentity)) {\n nextFilename = `${stem}-${collisionNumber}${extension}`\n nextKey = path.posix.join(directory, nextFilename)\n nextIdentity = getStoredFileIdentity({\n key: nextKey,\n })\n collisionNumber++\n }\n plannedKeys.add(nextIdentity)\n const key = normalizeStorageKey({ key: nextKey })\n replacements.set(getStoredFileIdentity(file), key)\n }\n\n const renamed = replaceStoredFileReferences({\n files: storedFiles,\n replacements,\n version: stored,\n })\n if (!renamed) {\n throw new APIError('The upload has no files to rename.', 400)\n }\n\n const staticDir = collection.config.upload.staticDir\n const result = await runFileOperationPlan({\n cleanupStagedAfterWriteFailure: (objects) =>\n removeUnreferencedStagedObjects({ collection: collection.config, objects, req }),\n req,\n stage: async ({ trackStagedObject }) => {\n for (const file of storedFiles) {\n const to = replacements.get(getStoredFileIdentity(file))!\n if (!operations && staticDir) {\n try {\n await copyLocalFile({ from: file.key, staticDir, to })\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'EEXIST') {\n throw new APIError(`A file named ${path.posix.basename(to)} already exists.`, 409)\n }\n throw err\n }\n trackStagedObject({\n key: to,\n remove: () => fs.rm(path.join(staticDir, to), { force: true }),\n })\n } else if (operations?.copy) {\n // Keep source files readable until the document update and its transaction succeed.\n try {\n await operations.copy({ from: file.key, req, to, trackStagedObject })\n } catch (err) {\n if (isStorageCollision({ err })) {\n throw new APIError(`A file named ${path.posix.basename(to)} already exists.`, 409)\n }\n throw err\n }\n } else {\n throw new APIError('No safe copy operation is available for this upload.', 400)\n }\n }\n },\n write: async () => {\n if (collection.config.versions) {\n const previousVersions = await req.payload.db.findVersions({\n collection: collection.config.slug,\n limit: 1,\n req,\n where: { parent: { equals: id } },\n })\n\n if (!previousVersions.docs.length) {\n await saveVersion({\n id,\n collection: collection.config,\n docWithLocales: stored,\n draft: false,\n operation: 'update',\n payload: req.payload,\n req,\n })\n }\n }\n\n const data = {\n filename: renamed.filename,\n original: renamed.original,\n url: renamed.url,\n variants: renamed.variants,\n ...(draft ? { _status: 'draft' } : {}),\n }\n const updated = await updateDocument({\n id,\n autosave: false,\n collectionConfig: collection.config,\n config: req.payload.config,\n data: data as never,\n depth: args.depth ?? 0,\n docWithLocales: stored as never,\n draftArg: draft,\n fallbackLocale: req.fallbackLocale!,\n filesToUpload: [],\n locale: req.locale!,\n overrideAccess,\n overrideLock: false,\n payload: req.payload,\n req,\n select: undefined!,\n shouldManageLocalFiles: false,\n showHiddenFields: false,\n })\n\n await scheduleUnreferencedFileCleanup({\n candidates: storedFiles,\n collection: collection.config,\n req,\n })\n return updated as JsonObject\n },\n })\n\n const finalResult = await buildAfterOperation({\n args,\n collection: collection.config,\n operation: 'updateByID',\n overrideAccess,\n result,\n })\n\n if (shouldCommit) {\n await commitTransaction(req)\n }\n await completeFileOperationScope({ req })\n return finalResult as JsonObject\n } catch (err) {\n await killTransaction(req)\n await abortFileOperationScope({ req })\n throw err\n }\n}\n\nconst validateRename = ({ filename, oldFilename }: { filename: string; oldFilename: string }) => {\n if (\n typeof filename !== 'string' ||\n !filename ||\n filename === '.' ||\n filename === '..' ||\n filename.includes('/') ||\n filename.includes('\\\\') ||\n filename.includes('\\0')\n ) {\n throw new APIError('Invalid filename.', 400)\n }\n\n const oldExtension = path.posix.extname(oldFilename)\n const newExtension = path.posix.extname(filename)\n if (oldExtension.toLowerCase() !== newExtension.toLowerCase()) {\n throw new APIError('The new filename must keep the original file extension.', 400)\n }\n\n return {\n newStem: filename.slice(0, -newExtension.length || undefined),\n }\n}\n\nconst isStorageCollision = ({ err }: { err: unknown }): boolean => {\n if (!err || typeof err !== 'object') {\n return false\n }\n\n const { name, code, message, statusCode } = err as {\n code?: number | string\n message?: string\n name?: string\n statusCode?: number\n }\n\n return (\n code === 'EEXIST' ||\n code === 'PreconditionFailed' ||\n code === 412 ||\n name === 'PreconditionFailed' ||\n statusCode === 409 ||\n statusCode === 412 ||\n Boolean(message?.includes('Storage destination already exists'))\n )\n}\n"],"names":["fs","path","executeAccess","hasWhereAccessResult","combineQueries","APIError","Forbidden","NotFound","replaceStoredFileReferences","removeUnreferencedStagedObjects","scheduleUnreferencedFileCleanup","abortFileOperationScope","beginFileOperationScope","completeFileOperationScope","runFileOperationPlan","copyLocalFile","getOriginalFilename","normalizeStorageKey","collectStoredFiles","getStoredFileIdentity","withLegacyCloudUploadFileData","commitTransaction","initTransaction","killTransaction","getLatestCollectionVersion","saveVersion","buildAfterOperation","buildBeforeOperation","updateDocument","renameFileOperation","incomingArgs","args","data","filename","req","shouldCommit","disableTransaction","collection","config","operation","overrideAccess","id","draft","upload","access","slug","update","where","equals","query","locale","current","payload","db","findOne","t","stored","doc","operations","fileOperations","storedFiles","oldOriginal","original","oldFilename","length","newStem","validateRename","originalStem","posix","parse","name","originalMarkerIndex","lastIndexOf","oldStem","slice","extname","originalFilename","plannedKeys","Set","filter","roles","some","type","map","key","join","dirname","replacements","Map","file","previousFilename","basename","hasOriginalRole","suffix","startsWith","nextFilename","directory","nextKey","nextIdentity","extension","stem","undefined","collisionNumber","has","add","set","renamed","files","version","staticDir","result","cleanupStagedAfterWriteFailure","objects","stage","trackStagedObject","to","get","from","err","code","remove","rm","force","copy","isStorageCollision","write","versions","previousVersions","findVersions","limit","parent","docs","docWithLocales","url","variants","_status","updated","autosave","collectionConfig","depth","draftArg","fallbackLocale","filesToUpload","overrideLock","select","shouldManageLocalFiles","showHiddenFields","candidates","finalResult","includes","oldExtension","newExtension","toLowerCase","message","statusCode","Boolean"],"mappings":"AAAA,OAAOA,QAAQ,mBAAkB;AACjC,OAAOC,UAAU,YAAW;AAK5B,SAASC,aAAa,QAAQ,8BAA6B;AAC3D,SAASC,oBAAoB,QAAQ,sBAAqB;AAC1D,SAASC,cAAc,QAAQ,mCAAkC;AACjE,SAASC,QAAQ,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,wBAAuB;AACrE,SAASC,2BAA2B,QAAQ,0CAAyC;AACrF,SACEC,+BAA+B,EAC/BC,+BAA+B,QAC1B,0CAAyC;AAChD,SACEC,uBAAuB,EACvBC,uBAAuB,EACvBC,0BAA0B,EAC1BC,oBAAoB,QACf,uDAAsD;AAC7D,SAASC,aAAa,QAAQ,+CAA8C;AAC5E,SAASC,mBAAmB,EAAEC,mBAAmB,QAAQ,yCAAwC;AACjG,SACEC,kBAAkB,EAClBC,qBAAqB,EACrBC,6BAA6B,QACxB,8CAA6C;AACpD,SAASC,iBAAiB,QAAQ,uCAAsC;AACxE,SAASC,eAAe,QAAQ,qCAAoC;AACpE,SAASC,eAAe,QAAQ,qCAAoC;AACpE,SAASC,0BAA0B,QAAQ,+CAA8C;AACzF,SAASC,WAAW,QAAQ,gCAA+B;AAC3D,SAASC,mBAAmB,QAAQ,qCAAoC;AACxE,SAASC,oBAAoB,QAAQ,sCAAqC;AAC1E,SAASC,cAAc,QAAQ,wBAAuB;AAatD,qEAAqE,GACrE,OAAO,MAAMC,sBAAsB,OACjCC;IAEA,IAAIC,OAAO;QAAE,GAAGD,YAAY;QAAEE,MAAM;YAAEC,UAAUH,aAAaG,QAAQ;QAAC;IAAE;IACxE,MAAM,EAAEC,GAAG,EAAE,GAAGH;IAChBnB,wBAAwB;QAAEsB;IAAI;IAE9B,IAAI;QACF,MAAMC,eAAe,CAACJ,KAAKK,kBAAkB,IAAK,MAAMd,gBAAgBY;QACxEH,OAAO,MAAMJ,qBAAqB;YAChCI;YACAM,YAAYN,KAAKM,UAAU,CAACC,MAAM;YAClCC,WAAW;YACXC,gBAAgBT,KAAKS,cAAc,IAAI;QACzC;QAEA,MAAM,EAAEC,EAAE,EAAEJ,UAAU,EAAEK,QAAQ,KAAK,EAAEF,iBAAiB,KAAK,EAAE,GAAGT;QAClE,MAAM,EAAEE,QAAQ,EAAE,GAAGF,KAAKC,IAAI;QAC9B,IAAI,CAACK,WAAWC,MAAM,CAACK,MAAM,EAAE;YAC7B,MAAM,IAAItC,SAAS,iDAAiD;QACtE;QAEA,MAAMuC,SAASJ,iBACX,OACA,MAAMtC,cACJ;YAAEuC;YAAII,MAAMR,WAAWC,MAAM,CAACO,IAAI;YAAEb,MAAM;gBAAEC;YAAS;YAAGC;QAAI,GAC5DG,WAAWC,MAAM,CAACM,MAAM,CAACE,MAAM;QAErC,MAAMC,QAAQ3C,eAAe;YAAEqC,IAAI;gBAAEO,QAAQP;YAAG;QAAE,GAAGG;QACrD,MAAMK,QAAQ;YAAEZ,YAAYA,WAAWC,MAAM,CAACO,IAAI;YAAEK,QAAQ;YAAgBhB;YAAKa;QAAM;QACvF,MAAMI,UAAUT,QACZ,MAAMlB,2BAA2B;YAC/BiB;YACAH,QAAQD,WAAWC,MAAM;YACzBc,SAASlB,IAAIkB,OAAO;YACpBH;YACAf;QACF,KACA,MAAMA,IAAIkB,OAAO,CAACC,EAAE,CAACC,OAAO,CAACL;QAEjC,IAAI,CAACE,SAAS;YACZ,MAAMhD,qBAAqByC,UAAU,IAAItC,UAAU4B,IAAIqB,CAAC,IAAI,IAAIhD,SAAS2B,IAAIqB,CAAC;QAChF;QACA,MAAMC,SAAS,MAAMpC,8BAA8B;YACjDiB,YAAYA,WAAWC,MAAM;YAC7BmB,KAAKN;YACLjB;QACF;QACA,MAAMwB,aAAarB,WAAWC,MAAM,CAACK,MAAM,CAACgB,cAAc;QAC1D,MAAMC,cAAc1C,mBAAmB;YAAEmB,YAAYA,WAAWC,MAAM;YAAEmB,KAAKD;YAAQtB;QAAI;QACzF,MAAM2B,cAAeL,OAAOM,QAAQ,EAAwC7B;QAC5E,MAAM8B,cAAcF,eAAgBL,OAAOvB,QAAQ;QAEnD,IAAI,CAAC8B,eAAe,CAACH,YAAYI,MAAM,EAAE;YACvC,MAAM,IAAI3D,SAAS,+CAA+C;QACpE;QAEA,MAAM,EAAE4D,OAAO,EAAE,GAAGC,eAAe;YAAEjC;YAAU8B;QAAY;QAC3D,MAAMI,eAAelE,KAAKmE,KAAK,CAACC,KAAK,CAACN,aAAaO,IAAI;QACvD,MAAMC,sBAAsBJ,aAAaK,WAAW,CAAC;QACrD,MAAMC,UACJF,sBAAsB,IAClBJ,aAAaO,KAAK,CAAC,GAAGH,uBACtBtE,KAAKmE,KAAK,CAACC,KAAK,CAACb,OAAOvB,QAAQ,EAAYqC,IAAI;QACtD,IAAIrC,aAAa,GAAGwC,UAAUxE,KAAKmE,KAAK,CAACO,OAAO,CAACZ,cAAc,EAAE;YAC/D,MAAM,IAAI1D,SAAS,yCAAyC;QAC9D;QAEA,MAAMuE,mBAAmB5D,oBAAoB;YAAEiB;QAAS;QACxD,MAAM4C,cAAc,IAAIC,IACtBlB,YACGmB,MAAM,CAAC,CAAC,EAAEC,KAAK,EAAE,GAAKA,MAAMC,IAAI,CAAC,CAAC,EAAEC,IAAI,EAAE,GAAKA,SAAS,aACxDC,GAAG,CAAC,CAAC,EAAEC,GAAG,EAAE,GACXjE,sBAAsB;gBACpBiE,KAAKnF,KAAKmE,KAAK,CAACiB,IAAI,CAACpF,KAAKmE,KAAK,CAACkB,OAAO,CAACF,MAAMR;YAChD;QAGN,MAAMW,eAAe,IAAIC;QACzB,KAAK,MAAMC,QAAQ7B,YAAa;YAC9B,MAAM8B,mBAAmBzF,KAAKmE,KAAK,CAACuB,QAAQ,CAACF,KAAKL,GAAG;YACrD,MAAMQ,kBAAkBH,KAAKT,KAAK,CAACC,IAAI,CAAC,CAAC,EAAEC,IAAI,EAAE,GAAKA,SAAS;YAC/D,MAAMW,SAASH,iBAAiBI,UAAU,CAACrB,WACvCiB,iBAAiBhB,KAAK,CAACD,QAAQT,MAAM,IACrC,CAAC,CAAC,EAAE0B,kBAAkB;YAC1B,IAAIK,eAAeH,kBAAkBhB,mBAAmB,GAAGX,UAAU4B,QAAQ;YAC7E,MAAMG,YAAY/F,KAAKmE,KAAK,CAACkB,OAAO,CAACG,KAAKL,GAAG;YAC7C,IAAIa,UAAUhG,KAAKmE,KAAK,CAACiB,IAAI,CAACW,WAAWD;YACzC,IAAIG,eAAe/E,sBAAsB;gBACvCiE,KAAKa;YACP;YACA,MAAME,YAAYlG,KAAKmE,KAAK,CAACO,OAAO,CAACoB;YACrC,MAAMK,OAAOL,aAAarB,KAAK,CAAC,GAAG,CAACyB,UAAUnC,MAAM,IAAIqC;YACxD,IAAIC,kBAAkB;YACtB,MAAO,CAACV,mBAAmBf,YAAY0B,GAAG,CAACL,cAAe;gBACxDH,eAAe,GAAGK,KAAK,CAAC,EAAEE,kBAAkBH,WAAW;gBACvDF,UAAUhG,KAAKmE,KAAK,CAACiB,IAAI,CAACW,WAAWD;gBACrCG,eAAe/E,sBAAsB;oBACnCiE,KAAKa;gBACP;gBACAK;YACF;YACAzB,YAAY2B,GAAG,CAACN;YAChB,MAAMd,MAAMnE,oBAAoB;gBAAEmE,KAAKa;YAAQ;YAC/CV,aAAakB,GAAG,CAACtF,sBAAsBsE,OAAOL;QAChD;QAEA,MAAMsB,UAAUlG,4BAA4B;YAC1CmG,OAAO/C;YACP2B;YACAqB,SAASpD;QACX;QACA,IAAI,CAACkD,SAAS;YACZ,MAAM,IAAIrG,SAAS,sCAAsC;QAC3D;QAEA,MAAMwG,YAAYxE,WAAWC,MAAM,CAACK,MAAM,CAACkE,SAAS;QACpD,MAAMC,SAAS,MAAMhG,qBAAqB;YACxCiG,gCAAgC,CAACC,UAC/BvG,gCAAgC;oBAAE4B,YAAYA,WAAWC,MAAM;oBAAE0E;oBAAS9E;gBAAI;YAChFA;YACA+E,OAAO,OAAO,EAAEC,iBAAiB,EAAE;gBACjC,KAAK,MAAMzB,QAAQ7B,YAAa;oBAC9B,MAAMuD,KAAK5B,aAAa6B,GAAG,CAACjG,sBAAsBsE;oBAClD,IAAI,CAAC/B,cAAcmD,WAAW;wBAC5B,IAAI;4BACF,MAAM9F,cAAc;gCAAEsG,MAAM5B,KAAKL,GAAG;gCAAEyB;gCAAWM;4BAAG;wBACtD,EAAE,OAAOG,KAAK;4BACZ,IAAI,AAACA,IAA8BC,IAAI,KAAK,UAAU;gCACpD,MAAM,IAAIlH,SAAS,CAAC,aAAa,EAAEJ,KAAKmE,KAAK,CAACuB,QAAQ,CAACwB,IAAI,gBAAgB,CAAC,EAAE;4BAChF;4BACA,MAAMG;wBACR;wBACAJ,kBAAkB;4BAChB9B,KAAK+B;4BACLK,QAAQ,IAAMxH,GAAGyH,EAAE,CAACxH,KAAKoF,IAAI,CAACwB,WAAWM,KAAK;oCAAEO,OAAO;gCAAK;wBAC9D;oBACF,OAAO,IAAIhE,YAAYiE,MAAM;wBAC3B,oFAAoF;wBACpF,IAAI;4BACF,MAAMjE,WAAWiE,IAAI,CAAC;gCAAEN,MAAM5B,KAAKL,GAAG;gCAAElD;gCAAKiF;gCAAID;4BAAkB;wBACrE,EAAE,OAAOI,KAAK;4BACZ,IAAIM,mBAAmB;gCAAEN;4BAAI,IAAI;gCAC/B,MAAM,IAAIjH,SAAS,CAAC,aAAa,EAAEJ,KAAKmE,KAAK,CAACuB,QAAQ,CAACwB,IAAI,gBAAgB,CAAC,EAAE;4BAChF;4BACA,MAAMG;wBACR;oBACF,OAAO;wBACL,MAAM,IAAIjH,SAAS,wDAAwD;oBAC7E;gBACF;YACF;YACAwH,OAAO;gBACL,IAAIxF,WAAWC,MAAM,CAACwF,QAAQ,EAAE;oBAC9B,MAAMC,mBAAmB,MAAM7F,IAAIkB,OAAO,CAACC,EAAE,CAAC2E,YAAY,CAAC;wBACzD3F,YAAYA,WAAWC,MAAM,CAACO,IAAI;wBAClCoF,OAAO;wBACP/F;wBACAa,OAAO;4BAAEmF,QAAQ;gCAAElF,QAAQP;4BAAG;wBAAE;oBAClC;oBAEA,IAAI,CAACsF,iBAAiBI,IAAI,CAACnE,MAAM,EAAE;wBACjC,MAAMvC,YAAY;4BAChBgB;4BACAJ,YAAYA,WAAWC,MAAM;4BAC7B8F,gBAAgB5E;4BAChBd,OAAO;4BACPH,WAAW;4BACXa,SAASlB,IAAIkB,OAAO;4BACpBlB;wBACF;oBACF;gBACF;gBAEA,MAAMF,OAAO;oBACXC,UAAUyE,QAAQzE,QAAQ;oBAC1B6B,UAAU4C,QAAQ5C,QAAQ;oBAC1BuE,KAAK3B,QAAQ2B,GAAG;oBAChBC,UAAU5B,QAAQ4B,QAAQ;oBAC1B,GAAI5F,QAAQ;wBAAE6F,SAAS;oBAAQ,IAAI,CAAC,CAAC;gBACvC;gBACA,MAAMC,UAAU,MAAM5G,eAAe;oBACnCa;oBACAgG,UAAU;oBACVC,kBAAkBrG,WAAWC,MAAM;oBACnCA,QAAQJ,IAAIkB,OAAO,CAACd,MAAM;oBAC1BN,MAAMA;oBACN2G,OAAO5G,KAAK4G,KAAK,IAAI;oBACrBP,gBAAgB5E;oBAChBoF,UAAUlG;oBACVmG,gBAAgB3G,IAAI2G,cAAc;oBAClCC,eAAe,EAAE;oBACjB5F,QAAQhB,IAAIgB,MAAM;oBAClBV;oBACAuG,cAAc;oBACd3F,SAASlB,IAAIkB,OAAO;oBACpBlB;oBACA8G,QAAQ3C;oBACR4C,wBAAwB;oBACxBC,kBAAkB;gBACpB;gBAEA,MAAMxI,gCAAgC;oBACpCyI,YAAYvF;oBACZvB,YAAYA,WAAWC,MAAM;oBAC7BJ;gBACF;gBACA,OAAOsG;YACT;QACF;QAEA,MAAMY,cAAc,MAAM1H,oBAAoB;YAC5CK;YACAM,YAAYA,WAAWC,MAAM;YAC7BC,WAAW;YACXC;YACAsE;QACF;QAEA,IAAI3E,cAAc;YAChB,MAAMd,kBAAkBa;QAC1B;QACA,MAAMrB,2BAA2B;YAAEqB;QAAI;QACvC,OAAOkH;IACT,EAAE,OAAO9B,KAAK;QACZ,MAAM/F,gBAAgBW;QACtB,MAAMvB,wBAAwB;YAAEuB;QAAI;QACpC,MAAMoF;IACR;AACF,EAAC;AAED,MAAMpD,iBAAiB,CAAC,EAAEjC,QAAQ,EAAE8B,WAAW,EAA6C;IAC1F,IACE,OAAO9B,aAAa,YACpB,CAACA,YACDA,aAAa,OACbA,aAAa,QACbA,SAASoH,QAAQ,CAAC,QAClBpH,SAASoH,QAAQ,CAAC,SAClBpH,SAASoH,QAAQ,CAAC,OAClB;QACA,MAAM,IAAIhJ,SAAS,qBAAqB;IAC1C;IAEA,MAAMiJ,eAAerJ,KAAKmE,KAAK,CAACO,OAAO,CAACZ;IACxC,MAAMwF,eAAetJ,KAAKmE,KAAK,CAACO,OAAO,CAAC1C;IACxC,IAAIqH,aAAaE,WAAW,OAAOD,aAAaC,WAAW,IAAI;QAC7D,MAAM,IAAInJ,SAAS,2DAA2D;IAChF;IAEA,OAAO;QACL4D,SAAShC,SAASyC,KAAK,CAAC,GAAG,CAAC6E,aAAavF,MAAM,IAAIqC;IACrD;AACF;AAEA,MAAMuB,qBAAqB,CAAC,EAAEN,GAAG,EAAoB;IACnD,IAAI,CAACA,OAAO,OAAOA,QAAQ,UAAU;QACnC,OAAO;IACT;IAEA,MAAM,EAAEhD,IAAI,EAAEiD,IAAI,EAAEkC,OAAO,EAAEC,UAAU,EAAE,GAAGpC;IAO5C,OACEC,SAAS,YACTA,SAAS,wBACTA,SAAS,OACTjD,SAAS,wBACToF,eAAe,OACfA,eAAe,OACfC,QAAQF,SAASJ,SAAS;AAE9B"}
|
|
1
|
+
{"version":3,"sources":["../../../src/collections/operations/renameFile.ts"],"sourcesContent":["import fs from 'node:fs/promises'\nimport path from 'node:path'\n\nimport type { JsonObject, PayloadRequest } from '../../types/index.js'\nimport type { Collection } from '../config/types.js'\n\nimport { executeAccess } from '../../auth/executeAccess.js'\nimport { hasWhereAccessResult } from '../../auth/types.js'\nimport { combineQueries } from '../../database/combineQueries.js'\nimport { APIError, Forbidden, NotFound } from '../../errors/index.js'\nimport { replaceStoredFileReferences } from '../../uploads/fileVersioning/archive.js'\nimport {\n removeUnreferencedStagedObjects,\n scheduleUnreferencedFileCleanup,\n} from '../../uploads/fileVersioning/cleanup.js'\nimport {\n abortFileOperationScope,\n beginFileOperationScope,\n completeFileOperationScope,\n runFileOperationPlan,\n} from '../../uploads/fileVersioning/fileOperationManager.js'\nimport { copyLocalFile } from '../../uploads/fileVersioning/localStorage.js'\nimport { getOriginalFilename, normalizeStorageKey } from '../../uploads/fileVersioning/naming.js'\nimport {\n collectStoredFiles,\n getStoredFileIdentity,\n withLegacyCloudUploadFileData,\n} from '../../uploads/fileVersioning/storedFiles.js'\nimport { commitTransaction } from '../../utilities/commitTransaction.js'\nimport { initTransaction } from '../../utilities/initTransaction.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport { getLatestCollectionVersion } from '../../versions/getLatestCollectionVersion.js'\nimport { saveVersion } from '../../versions/saveVersion.js'\nimport { buildAfterOperation } from './utilities/buildAfterOperation.js'\nimport { buildBeforeOperation } from './utilities/buildBeforeOperation.js'\nimport { updateDocument } from './utilities/update.js'\n\nexport type RenameFileArguments = {\n collection: Collection\n depth?: number\n disableTransaction?: boolean\n draft?: boolean\n filename: string\n id: number | string\n overrideAccess?: boolean\n req: PayloadRequest\n}\n\n/** Renames the current managed file set without changing its bytes. */\nexport const renameFileOperation = async (\n incomingArgs: RenameFileArguments,\n): Promise<JsonObject> => {\n let args = { ...incomingArgs, data: { filename: incomingArgs.filename } }\n const { req } = args\n beginFileOperationScope({ req })\n\n try {\n const shouldCommit = !args.disableTransaction && (await initTransaction(req))\n args = await buildBeforeOperation({\n args,\n collection: args.collection.config,\n operation: 'updateByID',\n overrideAccess: args.overrideAccess ?? false,\n })\n\n const { id, collection, draft = false, overrideAccess = false } = args\n const { filename } = args.data\n if (!collection.config.upload) {\n throw new APIError('This collection does not support file rename.', 400)\n }\n\n const access = overrideAccess\n ? true\n : await executeAccess(\n { id, slug: collection.config.slug, data: { filename }, req },\n collection.config.access.update,\n )\n const where = combineQueries({ id: { equals: id } }, access)\n const query = { collection: collection.config.slug, locale: 'all' as const, req, where }\n const current = draft\n ? await getLatestCollectionVersion({\n id,\n config: collection.config,\n payload: req.payload,\n query,\n req,\n })\n : await req.payload.db.findOne(query)\n\n if (!current) {\n throw hasWhereAccessResult(access) ? new Forbidden(req.t) : new NotFound(req.t)\n }\n const stored = await withLegacyCloudUploadFileData({\n collection: collection.config,\n doc: current as JsonObject,\n req,\n })\n const operations = collection.config.upload.fileOperations\n const storedFiles = collectStoredFiles({ collection: collection.config, doc: stored, req })\n const oldOriginal = (stored.original as { filename?: string } | undefined)?.filename\n const oldFilename = oldOriginal ?? (stored.filename as string | undefined)\n\n if (!oldFilename || !storedFiles.length) {\n throw new APIError('This upload has no managed files to rename.', 400)\n }\n\n const { newStem } = validateRename({ filename, oldFilename })\n const originalStem = path.posix.parse(oldFilename).name\n const originalMarkerIndex = originalStem.lastIndexOf('-original')\n const oldStem =\n originalMarkerIndex > 0\n ? originalStem.slice(0, originalMarkerIndex)\n : path.posix.parse(stored.filename as string).name\n if (filename === `${oldStem}${path.posix.extname(oldFilename)}`) {\n throw new APIError('The upload already has this filename.', 400)\n }\n\n const originalFilename = getOriginalFilename({ filename })\n const plannedKeys = new Set(\n storedFiles\n .filter(({ roles }) => roles.some(({ type }) => type === 'original'))\n .map(({ key }) =>\n getStoredFileIdentity({\n key: path.posix.join(path.posix.dirname(key), originalFilename),\n }),\n ),\n )\n const replacements = new Map<string, string>()\n for (const file of storedFiles) {\n const previousFilename = path.posix.basename(file.key)\n const hasOriginalRole = file.roles.some(({ type }) => type === 'original')\n const suffix = previousFilename.startsWith(oldStem)\n ? previousFilename.slice(oldStem.length)\n : `-${previousFilename}`\n let nextFilename = hasOriginalRole ? originalFilename : `${newStem}${suffix}`\n const directory = path.posix.dirname(file.key)\n let nextKey = path.posix.join(directory, nextFilename)\n let nextIdentity = getStoredFileIdentity({\n key: nextKey,\n })\n const extension = path.posix.extname(nextFilename)\n const stem = nextFilename.slice(0, -extension.length || undefined)\n let collisionNumber = 1\n while (!hasOriginalRole && plannedKeys.has(nextIdentity)) {\n nextFilename = `${stem}-${collisionNumber}${extension}`\n nextKey = path.posix.join(directory, nextFilename)\n nextIdentity = getStoredFileIdentity({\n key: nextKey,\n })\n collisionNumber++\n }\n plannedKeys.add(nextIdentity)\n const key = normalizeStorageKey({ key: nextKey })\n replacements.set(getStoredFileIdentity(file), key)\n }\n\n const renamed = replaceStoredFileReferences({\n files: storedFiles,\n replacements,\n version: stored,\n })\n if (!renamed) {\n throw new APIError('The upload has no files to rename.', 400)\n }\n\n const staticDir = collection.config.upload.staticDir\n const result = await runFileOperationPlan({\n cleanupStagedAfterWriteFailure: (objects) =>\n removeUnreferencedStagedObjects({ collection: collection.config, objects, req }),\n req,\n stage: async ({ trackStagedObject }) => {\n for (const file of storedFiles) {\n const to = replacements.get(getStoredFileIdentity(file))!\n if (!operations && staticDir) {\n try {\n await copyLocalFile({ from: file.key, staticDir, to })\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'EEXIST') {\n throw new APIError(`A file named ${path.posix.basename(to)} already exists.`, 409)\n }\n throw err\n }\n trackStagedObject({\n key: to,\n remove: () => fs.rm(path.join(staticDir, to), { force: true }),\n })\n } else if (operations?.copy) {\n // Keep source files readable until the document update and its transaction succeed.\n try {\n await operations.copy({ from: file.key, req, to, trackStagedObject })\n } catch (err) {\n if (isStorageCollision({ err })) {\n throw new APIError(`A file named ${path.posix.basename(to)} already exists.`, 409)\n }\n throw err\n }\n } else {\n throw new APIError('No safe copy operation is available for this upload.', 400)\n }\n }\n },\n write: async () => {\n if (collection.config.versions) {\n const previousVersions = await req.payload.db.findVersions({\n collection: collection.config.slug,\n limit: 1,\n req,\n where: { parent: { equals: id } },\n })\n\n if (!previousVersions.docs.length) {\n await saveVersion({\n id,\n collection: collection.config,\n docWithLocales: stored,\n draft: false,\n operation: 'update',\n payload: req.payload,\n req,\n })\n }\n }\n\n const data = {\n filename: renamed.filename,\n original: renamed.original,\n url: renamed.url,\n variants: renamed.variants,\n ...(draft ? { _status: 'draft' } : {}),\n }\n const updated = await updateDocument({\n id,\n autosave: false,\n collectionConfig: collection.config,\n config: req.payload.config,\n data,\n depth: args.depth ?? 0,\n docWithLocales: stored as never,\n draftArg: draft,\n fallbackLocale: req.fallbackLocale!,\n filesToUpload: [],\n locale: req.locale!,\n overrideAccess,\n overrideLock: false,\n payload: req.payload,\n req,\n select: undefined!,\n shouldManageLocalFiles: false,\n showHiddenFields: false,\n })\n\n await scheduleUnreferencedFileCleanup({\n candidates: storedFiles,\n collection: collection.config,\n req,\n })\n return updated\n },\n })\n\n const finalResult = await buildAfterOperation({\n args,\n collection: collection.config,\n operation: 'updateByID',\n overrideAccess,\n result,\n })\n\n if (shouldCommit) {\n await commitTransaction(req)\n }\n await completeFileOperationScope({ req })\n return finalResult as JsonObject\n } catch (err) {\n await killTransaction(req)\n await abortFileOperationScope({ req })\n throw err\n }\n}\n\nconst validateRename = ({ filename, oldFilename }: { filename: string; oldFilename: string }) => {\n if (\n typeof filename !== 'string' ||\n !filename ||\n filename === '.' ||\n filename === '..' ||\n filename.includes('/') ||\n filename.includes('\\\\') ||\n filename.includes('\\0')\n ) {\n throw new APIError('Invalid filename.', 400)\n }\n\n const oldExtension = path.posix.extname(oldFilename)\n const newExtension = path.posix.extname(filename)\n if (oldExtension.toLowerCase() !== newExtension.toLowerCase()) {\n throw new APIError('The new filename must keep the original file extension.', 400)\n }\n\n return {\n newStem: filename.slice(0, -newExtension.length || undefined),\n }\n}\n\nconst isStorageCollision = ({ err }: { err: unknown }): boolean => {\n if (!err || typeof err !== 'object') {\n return false\n }\n\n const { name, code, message, statusCode } = err as {\n code?: number | string\n message?: string\n name?: string\n statusCode?: number\n }\n\n return (\n code === 'EEXIST' ||\n code === 'PreconditionFailed' ||\n code === 412 ||\n name === 'PreconditionFailed' ||\n statusCode === 409 ||\n statusCode === 412 ||\n Boolean(message?.includes('Storage destination already exists'))\n )\n}\n"],"names":["fs","path","executeAccess","hasWhereAccessResult","combineQueries","APIError","Forbidden","NotFound","replaceStoredFileReferences","removeUnreferencedStagedObjects","scheduleUnreferencedFileCleanup","abortFileOperationScope","beginFileOperationScope","completeFileOperationScope","runFileOperationPlan","copyLocalFile","getOriginalFilename","normalizeStorageKey","collectStoredFiles","getStoredFileIdentity","withLegacyCloudUploadFileData","commitTransaction","initTransaction","killTransaction","getLatestCollectionVersion","saveVersion","buildAfterOperation","buildBeforeOperation","updateDocument","renameFileOperation","incomingArgs","args","data","filename","req","shouldCommit","disableTransaction","collection","config","operation","overrideAccess","id","draft","upload","access","slug","update","where","equals","query","locale","current","payload","db","findOne","t","stored","doc","operations","fileOperations","storedFiles","oldOriginal","original","oldFilename","length","newStem","validateRename","originalStem","posix","parse","name","originalMarkerIndex","lastIndexOf","oldStem","slice","extname","originalFilename","plannedKeys","Set","filter","roles","some","type","map","key","join","dirname","replacements","Map","file","previousFilename","basename","hasOriginalRole","suffix","startsWith","nextFilename","directory","nextKey","nextIdentity","extension","stem","undefined","collisionNumber","has","add","set","renamed","files","version","staticDir","result","cleanupStagedAfterWriteFailure","objects","stage","trackStagedObject","to","get","from","err","code","remove","rm","force","copy","isStorageCollision","write","versions","previousVersions","findVersions","limit","parent","docs","docWithLocales","url","variants","_status","updated","autosave","collectionConfig","depth","draftArg","fallbackLocale","filesToUpload","overrideLock","select","shouldManageLocalFiles","showHiddenFields","candidates","finalResult","includes","oldExtension","newExtension","toLowerCase","message","statusCode","Boolean"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/collections/operations/utilities/update.ts"],"sourcesContent":["import type { DeepPartial } from 'ts-essentials'\n\nimport type { UserSession } from '../../../auth/types.js'\nimport type { Args } from '../../../fields/hooks/beforeChange/index.js'\nimport type {\n CollectionSlug,\n FileToSave,\n SanitizedConfig,\n TypedFallbackLocale,\n} from '../../../index.js'\nimport type {\n JsonObject,\n Payload,\n PayloadRequest,\n PopulateType,\n SelectType,\n TransformCollectionWithSelect,\n} from '../../../types/index.js'\nimport type { SharedLocalAPIOptions } from '../../../types/operations.js'\nimport type {\n DataFromCollectionSlug,\n SanitizedCollectionConfig,\n SelectFromCollectionSlug,\n TypeWithID,\n} from '../../config/types.js'\n\nimport { ensureUsernameOrEmail } from '../../../auth/ensureUsernameOrEmail.js'\nimport { removeExpiredSessions } from '../../../auth/sessions.js'\nimport { generatePasswordSaltHash } from '../../../auth/strategies/local/generatePasswordSaltHash.js'\nimport { ValidationError } from '../../../errors/index.js'\nimport { afterChange } from '../../../fields/hooks/afterChange/index.js'\nimport { afterRead } from '../../../fields/hooks/afterRead/index.js'\nimport { beforeChange } from '../../../fields/hooks/beforeChange/index.js'\nimport { beforeValidate } from '../../../fields/hooks/beforeValidate/index.js'\nimport { deepCopyObjectSimple, saveVersion } from '../../../index.js'\nimport { deleteAssociatedFiles } from '../../../uploads/deleteAssociatedFiles.js'\nimport { runLocalFileUpdate } from '../../../uploads/fileVersioning/archive.js'\nimport { uploadFiles } from '../../../uploads/uploadFiles.js'\nimport { checkDocumentLockStatus } from '../../../utilities/checkDocumentLockStatus.js'\nimport { getTopLevelFieldNames } from '../../../utilities/getTopLevelFieldNames.js'\nimport {\n hasDraftsEnabled,\n hasDraftValidationEnabled,\n hasLocalizeStatusEnabled,\n} from '../../../utilities/getVersionsConfig.js'\nimport { resolvePublishAllLocales } from '../../../utilities/resolvePublishAllLocales.js'\nimport {\n buildAllLocalesPublicationHookDoc,\n getAllLocalesPublicationStatus,\n hasAuthorizedAllLocalesPublicationStatus,\n validateAllLocalesPublicationFlags,\n} from '../../../versions/allLocalesPublicationStatus.js'\nimport { buildLocalizedPublishData } from '../../../versions/buildSingleLocalePublishData.js'\nimport { validateLocalWithLocaleKeyedData } from '../local/validate.js'\nexport type SharedUpdateDocumentArgs<TSlug extends CollectionSlug> = {\n autosave: boolean\n collectionConfig: SanitizedCollectionConfig\n config: SanitizedConfig\n data: DeepPartial<DataFromCollectionSlug<TSlug>>\n depth: number\n docWithLocales: JsonObject & TypeWithID\n draftArg: boolean\n fallbackLocale: TypedFallbackLocale\n filesToUpload: FileToSave[]\n id: number | string\n locale: string\n overrideLock: boolean\n payload: Payload\n populate?: PopulateType\n publishAllLocales?: boolean\n req: PayloadRequest\n select: SelectType\n shouldManageLocalFiles: boolean\n showHiddenFields: boolean\n unpublishAllLocales?: boolean\n} & Pick<Required<SharedLocalAPIOptions>, 'overrideAccess'>\n\n/**\n * This function is used to update a document in the DB and return the result.\n *\n * It runs the following hooks in order:\n * - beforeValidate - Fields\n * - beforeValidate - Collection\n * - beforeChange - Collection\n * - beforeChange - Fields\n * - afterRead - Fields\n * - afterRead - Collection\n * - afterChange - Fields\n * - afterChange - Collection\n */\nexport const updateDocument = async <\n TSlug extends CollectionSlug,\n TSelect extends SelectFromCollectionSlug<TSlug> = SelectType,\n>({\n id,\n autosave,\n collectionConfig,\n config,\n data,\n depth,\n docWithLocales,\n draftArg,\n fallbackLocale,\n filesToUpload,\n locale,\n overrideAccess,\n overrideLock,\n payload,\n populate,\n publishAllLocales: publishAllLocalesArg,\n req,\n select,\n shouldManageLocalFiles,\n showHiddenFields,\n unpublishAllLocales: unpublishAllLocalesArg,\n}: SharedUpdateDocumentArgs<TSlug>): Promise<TransformCollectionWithSelect<TSlug, TSelect>> => {\n const nextFileData =\n collectionConfig.upload && shouldManageLocalFiles && !collectionConfig.upload.fileOperations\n ? deepCopyObjectSimple(data)\n : undefined\n\n validateAllLocalesPublicationFlags({\n publishAllLocales: publishAllLocalesArg,\n unpublishAllLocales: unpublishAllLocalesArg,\n })\n\n const publishAllLocales = resolvePublishAllLocales({\n draft: draftArg,\n hasLocalizeStatusEnabled: hasLocalizeStatusEnabled(collectionConfig),\n locale,\n publishAllLocalesArg,\n })\n const unpublishAllLocales =\n typeof unpublishAllLocalesArg === 'string'\n ? unpublishAllLocalesArg === 'true'\n : !!unpublishAllLocalesArg\n const allLocalesPublicationStatus = getAllLocalesPublicationStatus({\n hasLocalizedStatus: Boolean(config.localization && hasLocalizeStatusEnabled(collectionConfig)),\n publishAllLocales,\n unpublishAllLocales,\n })\n const isSavingDraft =\n Boolean(draftArg && hasDraftsEnabled(collectionConfig)) &&\n data._status !== 'published' &&\n !publishAllLocales\n if (allLocalesPublicationStatus || isSavingDraft) {\n data._status = allLocalesPublicationStatus ?? 'draft'\n }\n\n // /////////////////////////////////////\n // Handle potentially locked documents\n // /////////////////////////////////////\n\n await checkDocumentLockStatus({\n id,\n collectionSlug: collectionConfig.slug,\n lockErrorMessage: `Document with ID ${id} is currently locked by another user and cannot be updated.`,\n overrideLock,\n req,\n })\n\n const originalDoc = await afterRead({\n collection: collectionConfig,\n context: req.context,\n depth: 0,\n doc: deepCopyObjectSimple(docWithLocales),\n draft: draftArg,\n fallbackLocale: id ? null : fallbackLocale,\n global: null,\n locale,\n overrideAccess: true,\n req,\n showHiddenFields: true,\n })\n const isRestoringDraftFromTrash = Boolean(originalDoc?.deletedAt) && data?._status !== 'published'\n const shouldLimitValidationToSubmittedFields =\n (collectionConfig.trash && (Boolean(data?.deletedAt) || isRestoringDraftFromTrash)) ||\n unpublishAllLocales\n const submittedTopLevelFieldNames = shouldLimitValidationToSubmittedFields\n ? getTopLevelFieldNames(data)\n : undefined\n\n if (collectionConfig.auth) {\n ensureUsernameOrEmail<TSlug>({\n authOptions: collectionConfig.auth,\n collectionSlug: collectionConfig.slug,\n data,\n operation: 'update',\n originalDoc,\n req,\n })\n }\n\n // When saving a draft on a document whose latest version is published, the file\n // referenced by docWithLocales is still actively used by the published main document.\n // Deleting it during the update would break the published document's file even though no publish\n // is happening. Only skip deletion in this case; when the latest version is already a\n // draft, it is safe to delete the old draft file as it is being replaced.\n const isDraftOverPublished = isSavingDraft && docWithLocales._status === 'published'\n\n const hasManagedLocalUpload =\n filesToUpload.length > 0 &&\n Boolean(data.original) &&\n !collectionConfig.upload.disableLocalStorage\n\n // /////////////////////////////////////\n // beforeValidate - Fields\n // /////////////////////////////////////\n\n let statusFieldAccess = false\n const publicationFieldPolicyDoc = buildAllLocalesPublicationHookDoc({\n doc: originalDoc,\n docWithLocales,\n status: data._status === allLocalesPublicationStatus ? allLocalesPublicationStatus : undefined,\n })\n\n data = await beforeValidate<DeepPartial<DataFromCollectionSlug<TSlug>>>({\n id,\n collection: collectionConfig,\n context: req.context,\n data,\n doc: originalDoc,\n docForHooks: publicationFieldPolicyDoc,\n global: null,\n onFieldAccess: ({ accessResult, path }) => {\n if (path === '_status') {\n statusFieldAccess = accessResult\n }\n },\n operation: 'update',\n overrideAccess,\n req,\n })\n\n const password = data?.password\n const shouldSavePassword = Boolean(\n password &&\n collectionConfig.auth &&\n (!collectionConfig.auth.disableLocalStrategy ||\n (typeof collectionConfig.auth.disableLocalStrategy === 'object' &&\n collectionConfig.auth.disableLocalStrategy.enableFields)) &&\n !isSavingDraft,\n )\n\n const publicationHookDoc = buildAllLocalesPublicationHookDoc({\n doc: originalDoc,\n docWithLocales,\n status:\n statusFieldAccess && data._status === allLocalesPublicationStatus\n ? allLocalesPublicationStatus\n : undefined,\n })\n\n // /////////////////////////////////////\n // beforeValidate - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.beforeValidate?.length) {\n for (const hook of collectionConfig.hooks.beforeValidate) {\n data =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n data,\n operation: 'update',\n originalDoc: publicationHookDoc,\n req,\n })) || data\n }\n }\n\n // /////////////////////////////////////\n // beforeChange - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.beforeChange?.length) {\n for (const hook of collectionConfig.hooks.beforeChange) {\n data =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n data,\n operation: 'update',\n originalDoc: publicationHookDoc,\n req,\n })) || data\n }\n }\n\n const publicationData = { ...data }\n\n // /////////////////////////////////////\n // beforeChange - Fields\n // /////////////////////////////////////\n\n const beforeChangeArgs: Args<DataFromCollectionSlug<TSlug>> = {\n id,\n collection: collectionConfig,\n context: req.context,\n data: { ...data, id },\n doc: publicationHookDoc,\n docWithLocales,\n fieldsToValidate: submittedTopLevelFieldNames,\n global: null,\n operation: 'update',\n overrideAccess,\n req,\n // only skip validation for drafts when draft validation is false\n skipValidation: isSavingDraft && !hasDraftValidationEnabled(collectionConfig),\n }\n\n // /////////////////////////////////////\n // Handle Localized Data Merging\n // /////////////////////////////////////\n\n let statusFieldValue: unknown\n\n let result: JsonObject = await beforeChange({\n ...beforeChangeArgs,\n onDataProcessed: (processedData) => {\n statusFieldValue = processedData._status\n },\n })\n\n const hasAuthorizedPublicationStatus = hasAuthorizedAllLocalesPublicationStatus({\n data: publicationData,\n fieldAccessDenied: !statusFieldAccess,\n fieldValue: statusFieldValue,\n status: allLocalesPublicationStatus,\n })\n\n if (\n allLocalesPublicationStatus &&\n !hasAuthorizedPublicationStatus &&\n typeof statusFieldValue === 'undefined' &&\n typeof docWithLocales._status === 'object' &&\n docWithLocales._status !== null\n ) {\n result._status = { ...docWithLocales._status }\n }\n\n if (\n config.localization &&\n hasLocalizeStatusEnabled(collectionConfig) &&\n typeof result._status === 'string'\n ) {\n const statusStr = result._status\n\n if (\n hasAuthorizedPublicationStatus &&\n typeof docWithLocales._status === 'object' &&\n docWithLocales._status !== null\n ) {\n result._status = { ...docWithLocales._status }\n } else {\n result._status = {}\n }\n\n if (!hasAuthorizedPublicationStatus) {\n for (const localeCode of config.localization.localeCodes) {\n ;(result._status as Record<string, unknown>)[localeCode] = statusStr\n }\n }\n }\n\n let localizedPublishData: JsonObject | null = null\n\n if (config.localization && collectionConfig.versions) {\n if (hasLocalizeStatusEnabled(collectionConfig)) {\n if (hasAuthorizedPublicationStatus) {\n let accessibleLocaleCodes = config.localization.localeCodes\n\n if (config.localization.filterAvailableLocales) {\n const filteredLocales = await config.localization.filterAvailableLocales({\n locales: config.localization.locales,\n req,\n })\n accessibleLocaleCodes = filteredLocales.map((locale) =>\n typeof locale === 'string' ? locale : locale.code,\n )\n }\n\n if (typeof result._status !== 'object' || result._status === null) {\n result._status = {}\n }\n\n for (const localeCode of accessibleLocaleCodes) {\n result._status[localeCode] = unpublishAllLocales ? 'draft' : 'published'\n }\n } else if (\n !isSavingDraft &&\n result._status &&\n typeof result._status === 'object' &&\n !Array.isArray(result._status) &&\n (result._status as Record<string, unknown>)[locale] === 'published'\n ) {\n const currentDoc = await payload.db.findOne<DataFromCollectionSlug<TSlug>>({\n collection: collectionConfig.slug,\n locale: 'all',\n req,\n where: { id: { equals: id } },\n })\n\n localizedPublishData = buildLocalizedPublishData({\n config,\n currentDoc: currentDoc as JsonObject,\n fields: collectionConfig.fields,\n locale,\n result,\n })\n }\n }\n }\n\n if (\n config.localization &&\n hasDraftsEnabled(collectionConfig) &&\n publishAllLocales &&\n !unpublishAllLocales &&\n (!hasLocalizeStatusEnabled(collectionConfig) || hasAuthorizedPublicationStatus)\n ) {\n const validationResult = await validateLocalWithLocaleKeyedData({\n operation: 'update',\n options: {\n id,\n collection: collectionConfig.slug,\n data: result,\n draft: true,\n locale: 'all',\n overrideAccess,\n req,\n },\n payload,\n sourceData: {\n docWithLocales,\n originalDoc: publicationHookDoc,\n originalLocale: locale,\n },\n trash: Boolean(originalDoc?.deletedAt),\n })\n\n if (!validationResult.valid) {\n throw new ValidationError(\n {\n id,\n collection: collectionConfig.slug,\n errors: validationResult.errors,\n req,\n },\n req.t,\n )\n }\n }\n\n // File deletion and writes must occur after the final publish validation. Validation failures\n // leave both the persisted upload and local files untouched.\n if (!isDraftOverPublished && !hasManagedLocalUpload) {\n await deleteAssociatedFiles({\n collectionConfig,\n config,\n doc: docWithLocales,\n files: filesToUpload,\n overrideDelete: false,\n req,\n })\n }\n\n if (!collectionConfig.upload.disableLocalStorage && !hasManagedLocalUpload) {\n await uploadFiles(payload, filesToUpload, req)\n }\n\n const writeDocument = async (): Promise<TransformCollectionWithSelect<TSlug, TSelect>> => {\n const dataToUpdate: JsonObject = { ...(localizedPublishData ?? result) }\n\n // /////////////////////////////////////\n // Handle potential password update\n // /////////////////////////////////////\n\n if (shouldSavePassword && typeof password === 'string') {\n const { hash, salt } = await generatePasswordSaltHash({\n collection: collectionConfig,\n password,\n req,\n })\n dataToUpdate.salt = salt\n dataToUpdate.hash = hash\n delete dataToUpdate.password\n delete data.password\n\n if (collectionConfig.auth?.useSessions) {\n const currentSid =\n req.user?.collection === collectionConfig.slug && String(req.user.id) === String(id)\n ? req.user._sid\n : undefined\n const existingSessions = removeExpiredSessions(\n (docWithLocales.sessions as undefined | UserSession[]) ?? [],\n )\n\n dataToUpdate.sessions = currentSid\n ? existingSessions.filter((session) => session.id === currentSid)\n : []\n }\n }\n\n // /////////////////////////////////////\n // Update\n // /////////////////////////////////////\n\n let resultWithLocales: JsonObject = result\n\n if (!isSavingDraft) {\n // Ensure updatedAt date is always updated\n dataToUpdate.updatedAt = new Date().toISOString()\n if (localizedPublishData) {\n // Single-locale publish: save filtered data to main doc but keep full locale data for\n // the version so draft fetches (replaceWithDraftIfAvailable) return complete data.\n await req.payload.db.updateOne({\n id,\n collection: collectionConfig.slug,\n data: dataToUpdate,\n locale,\n req,\n })\n resultWithLocales = { ...result, updatedAt: dataToUpdate.updatedAt }\n } else {\n resultWithLocales = await req.payload.db.updateOne({\n id,\n collection: collectionConfig.slug,\n data: dataToUpdate,\n locale,\n req,\n })\n }\n }\n\n // /////////////////////////////////////\n // Create version\n // /////////////////////////////////////\n\n if (collectionConfig.versions) {\n resultWithLocales = await saveVersion({\n id,\n autosave,\n collection: collectionConfig,\n docWithLocales: resultWithLocales,\n draft: isSavingDraft,\n operation: 'update',\n payload,\n req,\n unpublish: unpublishAllLocales,\n })\n }\n\n // /////////////////////////////////////\n // afterRead - Fields\n // /////////////////////////////////////\n\n result = await afterRead({\n collection: collectionConfig,\n context: req.context,\n depth,\n doc: resultWithLocales,\n draft: draftArg,\n fallbackLocale,\n global: null,\n locale,\n overrideAccess,\n populate,\n req,\n select,\n showHiddenFields,\n })\n\n // /////////////////////////////////////\n // afterRead - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.afterRead?.length) {\n for (const hook of collectionConfig.hooks.afterRead) {\n result =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n doc: result,\n overrideAccess,\n req,\n })) || result\n }\n }\n\n // /////////////////////////////////////\n // afterChange - Fields\n // /////////////////////////////////////\n\n result = await afterChange({\n collection: collectionConfig,\n context: req.context,\n data,\n doc: result,\n global: null,\n operation: 'update',\n previousDoc: originalDoc,\n req,\n })\n\n // /////////////////////////////////////\n // afterChange - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.afterChange?.length) {\n for (const hook of collectionConfig.hooks.afterChange) {\n result =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n data,\n doc: result,\n operation: 'update',\n overrideAccess,\n previousDoc: originalDoc,\n req,\n select,\n })) || result\n }\n }\n\n return result as TransformCollectionWithSelect<TSlug, TSelect>\n }\n\n if (!nextFileData) {\n return writeDocument()\n }\n\n return runLocalFileUpdate({\n id,\n collection: collectionConfig,\n current: docWithLocales,\n files: hasManagedLocalUpload ? filesToUpload : [],\n next: nextFileData as JsonObject,\n req,\n write: writeDocument,\n })\n}\n"],"names":["ensureUsernameOrEmail","removeExpiredSessions","generatePasswordSaltHash","ValidationError","afterChange","afterRead","beforeChange","beforeValidate","deepCopyObjectSimple","saveVersion","deleteAssociatedFiles","runLocalFileUpdate","uploadFiles","checkDocumentLockStatus","getTopLevelFieldNames","hasDraftsEnabled","hasDraftValidationEnabled","hasLocalizeStatusEnabled","resolvePublishAllLocales","buildAllLocalesPublicationHookDoc","getAllLocalesPublicationStatus","hasAuthorizedAllLocalesPublicationStatus","validateAllLocalesPublicationFlags","buildLocalizedPublishData","validateLocalWithLocaleKeyedData","updateDocument","id","autosave","collectionConfig","config","data","depth","docWithLocales","draftArg","fallbackLocale","filesToUpload","locale","overrideAccess","overrideLock","payload","populate","publishAllLocales","publishAllLocalesArg","req","select","shouldManageLocalFiles","showHiddenFields","unpublishAllLocales","unpublishAllLocalesArg","nextFileData","upload","fileOperations","undefined","draft","allLocalesPublicationStatus","hasLocalizedStatus","Boolean","localization","isSavingDraft","_status","collectionSlug","slug","lockErrorMessage","originalDoc","collection","context","doc","global","isRestoringDraftFromTrash","deletedAt","shouldLimitValidationToSubmittedFields","trash","submittedTopLevelFieldNames","auth","authOptions","operation","isDraftOverPublished","hasManagedLocalUpload","length","original","disableLocalStorage","statusFieldAccess","publicationFieldPolicyDoc","status","docForHooks","onFieldAccess","accessResult","path","password","shouldSavePassword","disableLocalStrategy","enableFields","publicationHookDoc","hooks","hook","publicationData","beforeChangeArgs","fieldsToValidate","skipValidation","statusFieldValue","result","onDataProcessed","processedData","hasAuthorizedPublicationStatus","fieldAccessDenied","fieldValue","statusStr","localeCode","localeCodes","localizedPublishData","versions","accessibleLocaleCodes","filterAvailableLocales","filteredLocales","locales","map","code","Array","isArray","currentDoc","db","findOne","where","equals","fields","validationResult","options","sourceData","originalLocale","valid","errors","t","files","overrideDelete","writeDocument","dataToUpdate","hash","salt","useSessions","currentSid","user","String","_sid","existingSessions","sessions","filter","session","resultWithLocales","updatedAt","Date","toISOString","updateOne","unpublish","previousDoc","current","next","write"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/collections/operations/utilities/update.ts"],"sourcesContent":["import type { DeepPartial } from 'ts-essentials'\n\nimport type { UserSession } from '../../../auth/types.js'\nimport type { Args } from '../../../fields/hooks/beforeChange/index.js'\nimport type {\n CollectionSlug,\n FileToSave,\n SanitizedConfig,\n TypedFallbackLocale,\n} from '../../../index.js'\nimport type {\n JsonObject,\n Payload,\n PayloadRequest,\n PopulateType,\n SelectType,\n TransformCollectionWithSelect,\n} from '../../../types/index.js'\nimport type { SharedLocalAPIOptions } from '../../../types/operations.js'\nimport type {\n DataFromCollectionSlug,\n SanitizedCollectionConfig,\n SelectFromCollectionSlug,\n TypeWithID,\n} from '../../config/types.js'\n\nimport { ensureUsernameOrEmail } from '../../../auth/ensureUsernameOrEmail.js'\nimport { removeExpiredSessions } from '../../../auth/sessions.js'\nimport { generatePasswordSaltHash } from '../../../auth/strategies/local/generatePasswordSaltHash.js'\nimport { ValidationError } from '../../../errors/index.js'\nimport { afterChange } from '../../../fields/hooks/afterChange/index.js'\nimport { afterRead } from '../../../fields/hooks/afterRead/index.js'\nimport { beforeChange } from '../../../fields/hooks/beforeChange/index.js'\nimport { beforeValidate } from '../../../fields/hooks/beforeValidate/index.js'\nimport { deepCopyObjectSimple, saveVersion } from '../../../index.js'\nimport { deleteAssociatedFiles } from '../../../uploads/deleteAssociatedFiles.js'\nimport { runLocalFileUpdate } from '../../../uploads/fileVersioning/archive.js'\nimport { uploadFiles } from '../../../uploads/uploadFiles.js'\nimport { checkDocumentLockStatus } from '../../../utilities/checkDocumentLockStatus.js'\nimport { getTopLevelFieldNames } from '../../../utilities/getTopLevelFieldNames.js'\nimport {\n hasDraftsEnabled,\n hasDraftValidationEnabled,\n hasLocalizeStatusEnabled,\n} from '../../../utilities/getVersionsConfig.js'\nimport { resolvePublishAllLocales } from '../../../utilities/resolvePublishAllLocales.js'\nimport {\n buildAllLocalesPublicationHookDoc,\n getAllLocalesPublicationStatus,\n hasAuthorizedAllLocalesPublicationStatus,\n validateAllLocalesPublicationFlags,\n} from '../../../versions/allLocalesPublicationStatus.js'\nimport { buildLocalizedPublishData } from '../../../versions/buildSingleLocalePublishData.js'\nimport { validateLocalWithLocaleKeyedData } from '../local/validate.js'\nexport type SharedUpdateDocumentArgs<TSlug extends CollectionSlug> = {\n autosave: boolean\n collectionConfig: SanitizedCollectionConfig\n config: SanitizedConfig\n data: DeepPartial<DataFromCollectionSlug<TSlug>>\n depth: number\n docWithLocales: JsonObject & TypeWithID\n draftArg: boolean\n fallbackLocale: TypedFallbackLocale\n filesToUpload: FileToSave[]\n id: number | string\n locale: string\n overrideLock: boolean\n payload: Payload\n populate?: PopulateType\n publishAllLocales?: boolean\n req: PayloadRequest\n select: SelectType\n shouldManageLocalFiles: boolean\n showHiddenFields: boolean\n unpublishAllLocales?: boolean\n} & Pick<Required<SharedLocalAPIOptions>, 'overrideAccess'>\n\n/**\n * This function is used to update a document in the DB and return the result.\n *\n * It runs the following hooks in order:\n * - beforeValidate - Fields\n * - beforeValidate - Collection\n * - beforeChange - Collection\n * - beforeChange - Fields\n * - afterRead - Fields\n * - afterRead - Collection\n * - afterChange - Fields\n * - afterChange - Collection\n */\nexport const updateDocument = async <\n TSlug extends CollectionSlug,\n TSelect extends SelectFromCollectionSlug<TSlug> = SelectType,\n>({\n id,\n autosave,\n collectionConfig,\n config,\n data,\n depth,\n docWithLocales,\n draftArg,\n fallbackLocale,\n filesToUpload,\n locale,\n overrideAccess,\n overrideLock,\n payload,\n populate,\n publishAllLocales: publishAllLocalesArg,\n req,\n select,\n shouldManageLocalFiles,\n showHiddenFields,\n unpublishAllLocales: unpublishAllLocalesArg,\n}: SharedUpdateDocumentArgs<TSlug>): Promise<TransformCollectionWithSelect<TSlug, TSelect>> => {\n const nextFileData =\n collectionConfig.upload && shouldManageLocalFiles && !collectionConfig.upload.fileOperations\n ? deepCopyObjectSimple(data)\n : undefined\n\n validateAllLocalesPublicationFlags({\n publishAllLocales: publishAllLocalesArg,\n unpublishAllLocales: unpublishAllLocalesArg,\n })\n\n const publishAllLocales = resolvePublishAllLocales({\n draft: draftArg,\n hasLocalizeStatusEnabled: hasLocalizeStatusEnabled(collectionConfig),\n locale,\n publishAllLocalesArg,\n })\n const unpublishAllLocales =\n typeof unpublishAllLocalesArg === 'string'\n ? unpublishAllLocalesArg === 'true'\n : !!unpublishAllLocalesArg\n const allLocalesPublicationStatus = getAllLocalesPublicationStatus({\n hasLocalizedStatus: Boolean(config.localization && hasLocalizeStatusEnabled(collectionConfig)),\n publishAllLocales,\n unpublishAllLocales,\n })\n const isSavingDraft =\n Boolean(draftArg && hasDraftsEnabled(collectionConfig)) &&\n data._status !== 'published' &&\n !publishAllLocales\n if (allLocalesPublicationStatus || isSavingDraft) {\n data._status = allLocalesPublicationStatus ?? 'draft'\n }\n\n // /////////////////////////////////////\n // Handle potentially locked documents\n // /////////////////////////////////////\n\n await checkDocumentLockStatus({\n id,\n collectionSlug: collectionConfig.slug,\n lockErrorMessage: `Document with ID ${id} is currently locked by another user and cannot be updated.`,\n overrideLock,\n req,\n })\n\n const originalDoc = await afterRead({\n collection: collectionConfig,\n context: req.context,\n depth: 0,\n doc: deepCopyObjectSimple(docWithLocales),\n draft: draftArg,\n fallbackLocale: id ? null : fallbackLocale,\n global: null,\n locale,\n overrideAccess: true,\n req,\n showHiddenFields: true,\n })\n const isRestoringDraftFromTrash = Boolean(originalDoc?.deletedAt) && data?._status !== 'published'\n const shouldLimitValidationToSubmittedFields =\n (collectionConfig.trash && (Boolean(data?.deletedAt) || isRestoringDraftFromTrash)) ||\n unpublishAllLocales\n const submittedTopLevelFieldNames = shouldLimitValidationToSubmittedFields\n ? getTopLevelFieldNames(data)\n : undefined\n\n if (collectionConfig.auth) {\n ensureUsernameOrEmail<TSlug>({\n authOptions: collectionConfig.auth,\n collectionSlug: collectionConfig.slug,\n data,\n operation: 'update',\n originalDoc,\n req,\n })\n }\n\n // When saving a draft on a document whose latest version is published, the file\n // referenced by docWithLocales is still actively used by the published main document.\n // Deleting it during the update would break the published document's file even though no publish\n // is happening. Only skip deletion in this case; when the latest version is already a\n // draft, it is safe to delete the old draft file as it is being replaced.\n const isDraftOverPublished = isSavingDraft && docWithLocales._status === 'published'\n\n const hasManagedLocalUpload =\n filesToUpload.length > 0 &&\n Boolean(data.original) &&\n !collectionConfig.upload.disableLocalStorage\n\n // /////////////////////////////////////\n // beforeValidate - Fields\n // /////////////////////////////////////\n\n let statusFieldAccess = false\n const publicationFieldPolicyDoc = buildAllLocalesPublicationHookDoc({\n doc: originalDoc,\n docWithLocales,\n status: data._status === allLocalesPublicationStatus ? allLocalesPublicationStatus : undefined,\n })\n\n data = await beforeValidate<DeepPartial<DataFromCollectionSlug<TSlug>>>({\n id,\n collection: collectionConfig,\n context: req.context,\n data,\n doc: originalDoc,\n docForHooks: publicationFieldPolicyDoc,\n global: null,\n onFieldAccess: ({ accessResult, path }) => {\n if (path === '_status') {\n statusFieldAccess = accessResult\n }\n },\n operation: 'update',\n overrideAccess,\n req,\n })\n\n const password = data?.password\n const shouldSavePassword = Boolean(\n password &&\n collectionConfig.auth &&\n (!collectionConfig.auth.disableLocalStrategy ||\n (typeof collectionConfig.auth.disableLocalStrategy === 'object' &&\n collectionConfig.auth.disableLocalStrategy.enableFields)) &&\n !isSavingDraft,\n )\n\n const publicationHookDoc = buildAllLocalesPublicationHookDoc({\n doc: originalDoc,\n docWithLocales,\n status:\n statusFieldAccess && data._status === allLocalesPublicationStatus\n ? allLocalesPublicationStatus\n : undefined,\n })\n\n // /////////////////////////////////////\n // beforeValidate - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.beforeValidate?.length) {\n for (const hook of collectionConfig.hooks.beforeValidate) {\n data =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n data,\n operation: 'update',\n originalDoc: publicationHookDoc,\n req,\n })) || data\n }\n }\n\n // /////////////////////////////////////\n // beforeChange - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.beforeChange?.length) {\n for (const hook of collectionConfig.hooks.beforeChange) {\n data =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n data,\n operation: 'update',\n originalDoc: publicationHookDoc,\n req,\n })) || data\n }\n }\n\n const publicationData = { ...data }\n\n // /////////////////////////////////////\n // beforeChange - Fields\n // /////////////////////////////////////\n\n const beforeChangeArgs: Args<DataFromCollectionSlug<TSlug>> = {\n id,\n collection: collectionConfig,\n context: req.context,\n data: { ...data, id },\n doc: publicationHookDoc,\n docWithLocales,\n fieldsToValidate: submittedTopLevelFieldNames,\n global: null,\n operation: 'update',\n overrideAccess,\n req,\n // only skip validation for drafts when draft validation is false\n skipValidation: isSavingDraft && !hasDraftValidationEnabled(collectionConfig),\n }\n\n // /////////////////////////////////////\n // Handle Localized Data Merging\n // /////////////////////////////////////\n\n let statusFieldValue: unknown\n\n let result: JsonObject = await beforeChange({\n ...beforeChangeArgs,\n onDataProcessed: (processedData) => {\n statusFieldValue = processedData._status\n },\n })\n\n const hasAuthorizedPublicationStatus = hasAuthorizedAllLocalesPublicationStatus({\n data: publicationData,\n fieldAccessDenied: !statusFieldAccess,\n fieldValue: statusFieldValue,\n status: allLocalesPublicationStatus,\n })\n\n if (\n allLocalesPublicationStatus &&\n !hasAuthorizedPublicationStatus &&\n typeof statusFieldValue === 'undefined' &&\n typeof docWithLocales._status === 'object' &&\n docWithLocales._status !== null\n ) {\n result._status = { ...docWithLocales._status }\n }\n\n if (\n config.localization &&\n hasLocalizeStatusEnabled(collectionConfig) &&\n typeof result._status === 'string'\n ) {\n const statusStr = result._status\n\n if (\n hasAuthorizedPublicationStatus &&\n typeof docWithLocales._status === 'object' &&\n docWithLocales._status !== null\n ) {\n result._status = { ...docWithLocales._status }\n } else {\n result._status = {}\n }\n\n if (!hasAuthorizedPublicationStatus) {\n for (const localeCode of config.localization.localeCodes) {\n ;(result._status as Record<string, unknown>)[localeCode] = statusStr\n }\n }\n }\n\n let localizedPublishData: JsonObject | null = null\n\n if (config.localization && collectionConfig.versions) {\n if (hasLocalizeStatusEnabled(collectionConfig)) {\n if (hasAuthorizedPublicationStatus) {\n let accessibleLocaleCodes = config.localization.localeCodes\n\n if (config.localization.filterAvailableLocales) {\n const filteredLocales = await config.localization.filterAvailableLocales({\n locales: config.localization.locales,\n req,\n })\n accessibleLocaleCodes = filteredLocales.map((locale) =>\n typeof locale === 'string' ? locale : locale.code,\n )\n }\n\n if (typeof result._status !== 'object' || result._status === null) {\n result._status = {}\n }\n\n for (const localeCode of accessibleLocaleCodes) {\n result._status[localeCode] = unpublishAllLocales ? 'draft' : 'published'\n }\n } else if (\n !isSavingDraft &&\n result._status &&\n typeof result._status === 'object' &&\n !Array.isArray(result._status) &&\n (result._status as Record<string, unknown>)[locale] === 'published'\n ) {\n const currentDoc = await payload.db.findOne<DataFromCollectionSlug<TSlug>>({\n collection: collectionConfig.slug,\n locale: 'all',\n req,\n where: { id: { equals: id } },\n })\n\n localizedPublishData = buildLocalizedPublishData({\n config,\n currentDoc,\n fields: collectionConfig.fields,\n locale,\n result,\n })\n }\n }\n }\n\n if (\n config.localization &&\n hasDraftsEnabled(collectionConfig) &&\n publishAllLocales &&\n !unpublishAllLocales &&\n (!hasLocalizeStatusEnabled(collectionConfig) || hasAuthorizedPublicationStatus)\n ) {\n const validationResult = await validateLocalWithLocaleKeyedData({\n operation: 'update',\n options: {\n id,\n collection: collectionConfig.slug,\n data: result,\n draft: true,\n locale: 'all',\n overrideAccess,\n req,\n },\n payload,\n sourceData: {\n docWithLocales,\n originalDoc: publicationHookDoc,\n originalLocale: locale,\n },\n trash: Boolean(originalDoc?.deletedAt),\n })\n\n if (!validationResult.valid) {\n throw new ValidationError(\n {\n id,\n collection: collectionConfig.slug,\n errors: validationResult.errors,\n req,\n },\n req.t,\n )\n }\n }\n\n // File deletion and writes must occur after the final publish validation. Validation failures\n // leave both the persisted upload and local files untouched.\n if (!isDraftOverPublished && !hasManagedLocalUpload) {\n await deleteAssociatedFiles({\n collectionConfig,\n config,\n doc: docWithLocales,\n files: filesToUpload,\n overrideDelete: false,\n req,\n })\n }\n\n if (!collectionConfig.upload.disableLocalStorage && !hasManagedLocalUpload) {\n await uploadFiles(payload, filesToUpload, req)\n }\n\n const writeDocument = async (): Promise<TransformCollectionWithSelect<TSlug, TSelect>> => {\n const dataToUpdate: JsonObject = { ...(localizedPublishData ?? result) }\n\n // /////////////////////////////////////\n // Handle potential password update\n // /////////////////////////////////////\n\n if (shouldSavePassword && typeof password === 'string') {\n const { hash, salt } = await generatePasswordSaltHash({\n collection: collectionConfig,\n password,\n req,\n })\n dataToUpdate.salt = salt\n dataToUpdate.hash = hash\n delete dataToUpdate.password\n delete data.password\n\n if (collectionConfig.auth?.useSessions) {\n const currentSid =\n req.user?.collection === collectionConfig.slug && String(req.user.id) === String(id)\n ? req.user._sid\n : undefined\n const existingSessions = removeExpiredSessions(\n (docWithLocales.sessions as undefined | UserSession[]) ?? [],\n )\n\n dataToUpdate.sessions = currentSid\n ? existingSessions.filter((session) => session.id === currentSid)\n : []\n }\n }\n\n // /////////////////////////////////////\n // Update\n // /////////////////////////////////////\n\n let resultWithLocales: JsonObject = result\n\n if (!isSavingDraft) {\n // Ensure updatedAt date is always updated\n dataToUpdate.updatedAt = new Date().toISOString()\n if (localizedPublishData) {\n // Single-locale publish: save filtered data to main doc but keep full locale data for\n // the version so draft fetches (replaceWithDraftIfAvailable) return complete data.\n await req.payload.db.updateOne({\n id,\n collection: collectionConfig.slug,\n data: dataToUpdate,\n locale,\n req,\n })\n resultWithLocales = { ...result, updatedAt: dataToUpdate.updatedAt }\n } else {\n resultWithLocales = await req.payload.db.updateOne({\n id,\n collection: collectionConfig.slug,\n data: dataToUpdate,\n locale,\n req,\n })\n }\n }\n\n // /////////////////////////////////////\n // Create version\n // /////////////////////////////////////\n\n if (collectionConfig.versions) {\n resultWithLocales = await saveVersion({\n id,\n autosave,\n collection: collectionConfig,\n docWithLocales: resultWithLocales,\n draft: isSavingDraft,\n operation: 'update',\n payload,\n req,\n unpublish: unpublishAllLocales,\n })\n }\n\n // /////////////////////////////////////\n // afterRead - Fields\n // /////////////////////////////////////\n\n result = await afterRead({\n collection: collectionConfig,\n context: req.context,\n depth,\n doc: resultWithLocales,\n draft: draftArg,\n fallbackLocale,\n global: null,\n locale,\n overrideAccess,\n populate,\n req,\n select,\n showHiddenFields,\n })\n\n // /////////////////////////////////////\n // afterRead - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.afterRead?.length) {\n for (const hook of collectionConfig.hooks.afterRead) {\n result =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n doc: result,\n overrideAccess,\n req,\n })) || result\n }\n }\n\n // /////////////////////////////////////\n // afterChange - Fields\n // /////////////////////////////////////\n\n result = await afterChange({\n collection: collectionConfig,\n context: req.context,\n data,\n doc: result,\n global: null,\n operation: 'update',\n previousDoc: originalDoc,\n req,\n })\n\n // /////////////////////////////////////\n // afterChange - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.afterChange?.length) {\n for (const hook of collectionConfig.hooks.afterChange) {\n result =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n data,\n doc: result,\n operation: 'update',\n overrideAccess,\n previousDoc: originalDoc,\n req,\n select,\n })) || result\n }\n }\n\n return result as TransformCollectionWithSelect<TSlug, TSelect>\n }\n\n if (!nextFileData) {\n return writeDocument()\n }\n\n return runLocalFileUpdate({\n id,\n collection: collectionConfig,\n current: docWithLocales,\n files: hasManagedLocalUpload ? filesToUpload : [],\n next: nextFileData,\n req,\n write: writeDocument,\n })\n}\n"],"names":["ensureUsernameOrEmail","removeExpiredSessions","generatePasswordSaltHash","ValidationError","afterChange","afterRead","beforeChange","beforeValidate","deepCopyObjectSimple","saveVersion","deleteAssociatedFiles","runLocalFileUpdate","uploadFiles","checkDocumentLockStatus","getTopLevelFieldNames","hasDraftsEnabled","hasDraftValidationEnabled","hasLocalizeStatusEnabled","resolvePublishAllLocales","buildAllLocalesPublicationHookDoc","getAllLocalesPublicationStatus","hasAuthorizedAllLocalesPublicationStatus","validateAllLocalesPublicationFlags","buildLocalizedPublishData","validateLocalWithLocaleKeyedData","updateDocument","id","autosave","collectionConfig","config","data","depth","docWithLocales","draftArg","fallbackLocale","filesToUpload","locale","overrideAccess","overrideLock","payload","populate","publishAllLocales","publishAllLocalesArg","req","select","shouldManageLocalFiles","showHiddenFields","unpublishAllLocales","unpublishAllLocalesArg","nextFileData","upload","fileOperations","undefined","draft","allLocalesPublicationStatus","hasLocalizedStatus","Boolean","localization","isSavingDraft","_status","collectionSlug","slug","lockErrorMessage","originalDoc","collection","context","doc","global","isRestoringDraftFromTrash","deletedAt","shouldLimitValidationToSubmittedFields","trash","submittedTopLevelFieldNames","auth","authOptions","operation","isDraftOverPublished","hasManagedLocalUpload","length","original","disableLocalStorage","statusFieldAccess","publicationFieldPolicyDoc","status","docForHooks","onFieldAccess","accessResult","path","password","shouldSavePassword","disableLocalStrategy","enableFields","publicationHookDoc","hooks","hook","publicationData","beforeChangeArgs","fieldsToValidate","skipValidation","statusFieldValue","result","onDataProcessed","processedData","hasAuthorizedPublicationStatus","fieldAccessDenied","fieldValue","statusStr","localeCode","localeCodes","localizedPublishData","versions","accessibleLocaleCodes","filterAvailableLocales","filteredLocales","locales","map","code","Array","isArray","currentDoc","db","findOne","where","equals","fields","validationResult","options","sourceData","originalLocale","valid","errors","t","files","overrideDelete","writeDocument","dataToUpdate","hash","salt","useSessions","currentSid","user","String","_sid","existingSessions","sessions","filter","session","resultWithLocales","updatedAt","Date","toISOString","updateOne","unpublish","previousDoc","current","next","write"],"mappings":"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"}
|
|
@@ -128,7 +128,7 @@ async function validateOperationWithScopedRequest({ id, collection, data: incomi
|
|
|
128
128
|
ensureUsernameOrEmail({
|
|
129
129
|
authOptions: collectionConfig.auth,
|
|
130
130
|
collectionSlug: collectionConfig.slug,
|
|
131
|
-
data
|
|
131
|
+
data,
|
|
132
132
|
operation: 'create',
|
|
133
133
|
req
|
|
134
134
|
});
|
|
@@ -136,9 +136,9 @@ async function validateOperationWithScopedRequest({ id, collection, data: incomi
|
|
|
136
136
|
ensureUsernameOrEmail({
|
|
137
137
|
authOptions: collectionConfig.auth,
|
|
138
138
|
collectionSlug: collectionConfig.slug,
|
|
139
|
-
data
|
|
139
|
+
data,
|
|
140
140
|
operation: 'update',
|
|
141
|
-
originalDoc
|
|
141
|
+
originalDoc,
|
|
142
142
|
req
|
|
143
143
|
});
|
|
144
144
|
}
|
|
@@ -146,7 +146,7 @@ async function validateOperationWithScopedRequest({ id, collection, data: incomi
|
|
|
146
146
|
collection: collectionConfig,
|
|
147
147
|
docWithLocales,
|
|
148
148
|
global: null,
|
|
149
|
-
incomingData
|
|
149
|
+
incomingData,
|
|
150
150
|
onValidationData,
|
|
151
151
|
originalDoc,
|
|
152
152
|
overrideAccess,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/collections/operations/validate.ts"],"sourcesContent":["import type { DeepPartial } from 'ts-essentials'\n\nimport type { FindOneArgs } from '../../database/types.js'\nimport type { CollectionSlug, JsonObject } from '../../index.js'\nimport type { PayloadRequest } from '../../types/index.js'\nimport type { ValidationResult } from '../../types/validation.js'\nimport type { ValidationSourceData } from '../../utilities/runValidationLifecycle.js'\nimport type { Collection, RequiredDataFromCollectionSlug, TypeWithID } from '../config/types.js'\n\nimport { ensureUsernameOrEmail } from '../../auth/ensureUsernameOrEmail.js'\nimport { executeAccess } from '../../auth/executeAccess.js'\nimport { hasWhereAccessResult } from '../../auth/types.js'\nimport { combineQueries } from '../../database/combineQueries.js'\nimport { Forbidden, NotFound } from '../../errors/index.js'\nimport { afterRead } from '../../fields/hooks/afterRead/index.js'\nimport { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js'\nimport { deepCopyObjectSimple } from '../../utilities/deepCopyObject.js'\nimport { flattenDataByLocale } from '../../utilities/flattenDataByLocale.js'\nimport { runValidationLifecycle } from '../../utilities/runValidationLifecycle.js'\nimport { appendVersionToQueryKey } from '../../versions/drafts/appendVersionToQueryKey.js'\nimport { validateUniqueConstraints } from './utilities/validateUniqueConstraints.js'\n\nexport type Arguments<TSlug extends CollectionSlug> = {\n collection: Collection\n data?: DeepPartial<RequiredDataFromCollectionSlug<TSlug>>\n draft: boolean\n id?: number | string\n onValidationData?: (data: JsonObject) => void\n overrideAccess: boolean\n req: PayloadRequest\n skipAccessControl?: boolean\n skipMutationHooks?: boolean\n sourceData?: ValidationSourceData\n trash?: boolean\n validationOperation?: 'create' | 'update' | 'validate'\n}\n\nexport async function validateOperation<TSlug extends CollectionSlug>(\n args: Arguments<TSlug>,\n): Promise<ValidationResult> {\n const previousOperation = args.req.operation\n args.req.operation = args.validationOperation ?? 'validate'\n\n try {\n return await validateOperationWithScopedRequest(args)\n } finally {\n args.req.operation = previousOperation\n }\n}\n\nasync function validateOperationWithScopedRequest<TSlug extends CollectionSlug>({\n id,\n collection,\n data: incomingData,\n draft,\n onValidationData,\n overrideAccess,\n req,\n skipAccessControl = false,\n skipMutationHooks = false,\n sourceData,\n trash = false,\n validationOperation = 'validate',\n}: Arguments<TSlug>): Promise<ValidationResult> {\n const collectionConfig = collection.config\n\n const accessResult =\n !skipAccessControl && !overrideAccess\n ? await executeAccess(\n { id, slug: collectionConfig.slug, data: incomingData, req },\n collectionConfig.access.validate,\n )\n : true\n const hasWherePolicy = hasWhereAccessResult(accessResult)\n\n if (id === undefined && hasWherePolicy) {\n throw new Forbidden(req.t)\n }\n\n let docWithLocales: JsonObject = sourceData ? deepCopyObjectSimple(sourceData.docWithLocales) : {}\n\n if (id !== undefined && !sourceData) {\n const idWhere = appendNonTrashedFilter({\n enableTrash: collectionConfig.trash,\n trash,\n where: { id: { equals: id } },\n })\n const where = combineQueries(idWhere, accessResult)\n const query: FindOneArgs = {\n collection: collectionConfig.slug,\n locale: req.locale!,\n req,\n where,\n }\n\n let storedDocument: (RequiredDataFromCollectionSlug<TSlug> & TypeWithID) | undefined\n\n if (draft && collectionConfig.versions?.drafts) {\n const { docs } = await req.payload.db.queryDrafts<\n RequiredDataFromCollectionSlug<TSlug> & TypeWithID\n >({\n collection: collectionConfig.slug,\n limit: 1,\n locale: req.locale!,\n pagination: false,\n req,\n where: appendVersionToQueryKey(where),\n })\n\n storedDocument = docs[0]\n\n if (!storedDocument && hasWherePolicy) {\n const { docs: existingVersions } = await req.payload.db.queryDrafts({\n collection: collectionConfig.slug,\n limit: 1,\n locale: req.locale!,\n pagination: false,\n req,\n select: { parent: true },\n where: appendVersionToQueryKey(idWhere),\n })\n\n if (existingVersions[0]) {\n throw new Forbidden(req.t)\n }\n }\n }\n\n if (!storedDocument) {\n storedDocument =\n (await req.payload.db.findOne<RequiredDataFromCollectionSlug<TSlug> & TypeWithID>({\n ...query,\n req,\n })) ?? undefined\n }\n\n if (!storedDocument && hasWherePolicy) {\n throw new Forbidden(req.t)\n }\n if (!storedDocument) {\n throw new NotFound(req.t)\n }\n\n docWithLocales = deepCopyObjectSimple(storedDocument)\n }\n\n let originalDoc: JsonObject\n\n if (id === undefined) {\n originalDoc = docWithLocales\n } else if (!sourceData) {\n originalDoc = await afterRead({\n collection: collectionConfig,\n context: req.context,\n depth: 0,\n doc: deepCopyObjectSimple(docWithLocales),\n draft,\n fallbackLocale: null,\n global: null,\n locale: req.locale!,\n overrideAccess: true,\n req,\n showHiddenFields: true,\n })\n } else if (req.locale === sourceData.originalLocale) {\n originalDoc = deepCopyObjectSimple(sourceData.originalDoc)\n } else {\n originalDoc = flattenDataByLocale({\n configBlockReferences: req.payload.config.blocks,\n docWithLocales,\n fields: collectionConfig.fields,\n locale: req.locale!,\n })\n }\n\n return runValidationLifecycle({\n id,\n beforeValidation: ({ data }) => {\n if (!collectionConfig.auth) {\n return\n }\n\n if (id === undefined) {\n ensureUsernameOrEmail<TSlug>({\n authOptions: collectionConfig.auth,\n collectionSlug: collectionConfig.slug,\n data: data as RequiredDataFromCollectionSlug<TSlug>,\n operation: 'create',\n req,\n })\n } else {\n ensureUsernameOrEmail<TSlug>({\n authOptions: collectionConfig.auth,\n collectionSlug: collectionConfig.slug,\n data: data as RequiredDataFromCollectionSlug<TSlug>,\n operation: 'update',\n originalDoc: originalDoc as RequiredDataFromCollectionSlug<TSlug>,\n req,\n })\n }\n },\n collection: collectionConfig,\n docWithLocales,\n global: null,\n incomingData: incomingData as JsonObject | undefined,\n onValidationData,\n originalDoc,\n overrideAccess,\n req,\n skipMutationHooks,\n validateData: ({ data }) =>\n validateUniqueConstraints({\n id,\n collection: collectionConfig,\n data,\n req,\n }),\n validationOperation,\n })\n}\n"],"names":["ensureUsernameOrEmail","executeAccess","hasWhereAccessResult","combineQueries","Forbidden","NotFound","afterRead","appendNonTrashedFilter","deepCopyObjectSimple","flattenDataByLocale","runValidationLifecycle","appendVersionToQueryKey","validateUniqueConstraints","validateOperation","args","previousOperation","req","operation","validationOperation","validateOperationWithScopedRequest","id","collection","data","incomingData","draft","onValidationData","overrideAccess","skipAccessControl","skipMutationHooks","sourceData","trash","collectionConfig","config","accessResult","slug","access","validate","hasWherePolicy","undefined","t","docWithLocales","idWhere","enableTrash","where","equals","query","locale","storedDocument","versions","drafts","docs","payload","db","queryDrafts","limit","pagination","existingVersions","select","parent","findOne","originalDoc","context","depth","doc","fallbackLocale","global","showHiddenFields","originalLocale","configBlockReferences","blocks","fields","beforeValidation","auth","authOptions","collectionSlug","validateData"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/collections/operations/validate.ts"],"sourcesContent":["import type { DeepPartial } from 'ts-essentials'\n\nimport type { FindOneArgs } from '../../database/types.js'\nimport type { CollectionSlug, JsonObject } from '../../index.js'\nimport type { PayloadRequest } from '../../types/index.js'\nimport type { ValidationResult } from '../../types/validation.js'\nimport type { ValidationSourceData } from '../../utilities/runValidationLifecycle.js'\nimport type { Collection, RequiredDataFromCollectionSlug, TypeWithID } from '../config/types.js'\n\nimport { ensureUsernameOrEmail } from '../../auth/ensureUsernameOrEmail.js'\nimport { executeAccess } from '../../auth/executeAccess.js'\nimport { hasWhereAccessResult } from '../../auth/types.js'\nimport { combineQueries } from '../../database/combineQueries.js'\nimport { Forbidden, NotFound } from '../../errors/index.js'\nimport { afterRead } from '../../fields/hooks/afterRead/index.js'\nimport { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js'\nimport { deepCopyObjectSimple } from '../../utilities/deepCopyObject.js'\nimport { flattenDataByLocale } from '../../utilities/flattenDataByLocale.js'\nimport { runValidationLifecycle } from '../../utilities/runValidationLifecycle.js'\nimport { appendVersionToQueryKey } from '../../versions/drafts/appendVersionToQueryKey.js'\nimport { validateUniqueConstraints } from './utilities/validateUniqueConstraints.js'\n\nexport type Arguments<TSlug extends CollectionSlug> = {\n collection: Collection\n data?: DeepPartial<RequiredDataFromCollectionSlug<TSlug>>\n draft: boolean\n id?: number | string\n onValidationData?: (data: JsonObject) => void\n overrideAccess: boolean\n req: PayloadRequest\n skipAccessControl?: boolean\n skipMutationHooks?: boolean\n sourceData?: ValidationSourceData\n trash?: boolean\n validationOperation?: 'create' | 'update' | 'validate'\n}\n\nexport async function validateOperation<TSlug extends CollectionSlug>(\n args: Arguments<TSlug>,\n): Promise<ValidationResult> {\n const previousOperation = args.req.operation\n args.req.operation = args.validationOperation ?? 'validate'\n\n try {\n return await validateOperationWithScopedRequest(args)\n } finally {\n args.req.operation = previousOperation\n }\n}\n\nasync function validateOperationWithScopedRequest<TSlug extends CollectionSlug>({\n id,\n collection,\n data: incomingData,\n draft,\n onValidationData,\n overrideAccess,\n req,\n skipAccessControl = false,\n skipMutationHooks = false,\n sourceData,\n trash = false,\n validationOperation = 'validate',\n}: Arguments<TSlug>): Promise<ValidationResult> {\n const collectionConfig = collection.config\n\n const accessResult =\n !skipAccessControl && !overrideAccess\n ? await executeAccess(\n { id, slug: collectionConfig.slug, data: incomingData, req },\n collectionConfig.access.validate,\n )\n : true\n const hasWherePolicy = hasWhereAccessResult(accessResult)\n\n if (id === undefined && hasWherePolicy) {\n throw new Forbidden(req.t)\n }\n\n let docWithLocales: JsonObject = sourceData ? deepCopyObjectSimple(sourceData.docWithLocales) : {}\n\n if (id !== undefined && !sourceData) {\n const idWhere = appendNonTrashedFilter({\n enableTrash: collectionConfig.trash,\n trash,\n where: { id: { equals: id } },\n })\n const where = combineQueries(idWhere, accessResult)\n const query: FindOneArgs = {\n collection: collectionConfig.slug,\n locale: req.locale!,\n req,\n where,\n }\n\n let storedDocument: (RequiredDataFromCollectionSlug<TSlug> & TypeWithID) | undefined\n\n if (draft && collectionConfig.versions?.drafts) {\n const { docs } = await req.payload.db.queryDrafts<\n RequiredDataFromCollectionSlug<TSlug> & TypeWithID\n >({\n collection: collectionConfig.slug,\n limit: 1,\n locale: req.locale!,\n pagination: false,\n req,\n where: appendVersionToQueryKey(where),\n })\n\n storedDocument = docs[0]\n\n if (!storedDocument && hasWherePolicy) {\n const { docs: existingVersions } = await req.payload.db.queryDrafts({\n collection: collectionConfig.slug,\n limit: 1,\n locale: req.locale!,\n pagination: false,\n req,\n select: { parent: true },\n where: appendVersionToQueryKey(idWhere),\n })\n\n if (existingVersions[0]) {\n throw new Forbidden(req.t)\n }\n }\n }\n\n if (!storedDocument) {\n storedDocument =\n (await req.payload.db.findOne<RequiredDataFromCollectionSlug<TSlug> & TypeWithID>({\n ...query,\n req,\n })) ?? undefined\n }\n\n if (!storedDocument && hasWherePolicy) {\n throw new Forbidden(req.t)\n }\n if (!storedDocument) {\n throw new NotFound(req.t)\n }\n\n docWithLocales = deepCopyObjectSimple(storedDocument)\n }\n\n let originalDoc: JsonObject\n\n if (id === undefined) {\n originalDoc = docWithLocales\n } else if (!sourceData) {\n originalDoc = await afterRead({\n collection: collectionConfig,\n context: req.context,\n depth: 0,\n doc: deepCopyObjectSimple(docWithLocales),\n draft,\n fallbackLocale: null,\n global: null,\n locale: req.locale!,\n overrideAccess: true,\n req,\n showHiddenFields: true,\n })\n } else if (req.locale === sourceData.originalLocale) {\n originalDoc = deepCopyObjectSimple(sourceData.originalDoc)\n } else {\n originalDoc = flattenDataByLocale({\n configBlockReferences: req.payload.config.blocks,\n docWithLocales,\n fields: collectionConfig.fields,\n locale: req.locale!,\n })\n }\n\n return runValidationLifecycle({\n id,\n beforeValidation: ({ data }) => {\n if (!collectionConfig.auth) {\n return\n }\n\n if (id === undefined) {\n ensureUsernameOrEmail<TSlug>({\n authOptions: collectionConfig.auth,\n collectionSlug: collectionConfig.slug,\n data,\n operation: 'create',\n req,\n })\n } else {\n ensureUsernameOrEmail<TSlug>({\n authOptions: collectionConfig.auth,\n collectionSlug: collectionConfig.slug,\n data,\n operation: 'update',\n originalDoc,\n req,\n })\n }\n },\n collection: collectionConfig,\n docWithLocales,\n global: null,\n incomingData,\n onValidationData,\n originalDoc,\n overrideAccess,\n req,\n skipMutationHooks,\n validateData: ({ data }) =>\n validateUniqueConstraints({\n id,\n collection: collectionConfig,\n data,\n req,\n }),\n validationOperation,\n })\n}\n"],"names":["ensureUsernameOrEmail","executeAccess","hasWhereAccessResult","combineQueries","Forbidden","NotFound","afterRead","appendNonTrashedFilter","deepCopyObjectSimple","flattenDataByLocale","runValidationLifecycle","appendVersionToQueryKey","validateUniqueConstraints","validateOperation","args","previousOperation","req","operation","validationOperation","validateOperationWithScopedRequest","id","collection","data","incomingData","draft","onValidationData","overrideAccess","skipAccessControl","skipMutationHooks","sourceData","trash","collectionConfig","config","accessResult","slug","access","validate","hasWherePolicy","undefined","t","docWithLocales","idWhere","enableTrash","where","equals","query","locale","storedDocument","versions","drafts","docs","payload","db","queryDrafts","limit","pagination","existingVersions","select","parent","findOne","originalDoc","context","depth","doc","fallbackLocale","global","showHiddenFields","originalLocale","configBlockReferences","blocks","fields","beforeValidation","auth","authOptions","collectionSlug","validateData"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/config/definePlugin.ts"],"sourcesContent":["import type { Config, Plugin, PluginsMap } from './types.js'\n\nfunction buildPluginsMap(plugins: Plugin[] | undefined): PluginsMap {\n const map: Record<string, Plugin | undefined> = {}\n if (plugins) {\n for (const p of plugins) {\n if (p.slug) {\n map[p.slug] = p\n }\n }\n }\n return map
|
|
1
|
+
{"version":3,"sources":["../../src/config/definePlugin.ts"],"sourcesContent":["import type { Config, Plugin, PluginsMap } from './types.js'\n\nfunction buildPluginsMap(plugins: Plugin[] | undefined): PluginsMap {\n const map: Record<string, Plugin | undefined> = {}\n if (plugins) {\n for (const p of plugins) {\n if (p.slug) {\n map[p.slug] = p\n }\n }\n }\n return map\n}\n\n/**\n * Helper for authoring plugins with order, slug, and typed options.\n * Eliminates boilerplate and ensures metadata is always set consistently.\n *\n * The `plugin` function receives `config`, `plugins` (a slug-keyed map of other\n * plugins), and the user-provided `options`.\n *\n * @experimental\n *\n * @example\n * // With options:\n * export const seoPlugin = definePlugin<SEOPluginConfig>({\n * slug: 'plugin-seo',\n * plugin: ({ config, options }) => ({ ...config }),\n * })\n *\n * // Without options:\n * export const myPlugin = definePlugin({\n * slug: 'my-plugin',\n * plugin: ({ config }) => ({ ...config }),\n * })\n */\nexport function definePlugin(descriptor: {\n order?: number\n plugin: (args: { config: Config; plugins: PluginsMap }) => Config | Promise<Config>\n slug: string\n}): () => Plugin\nexport function definePlugin<TOptions>(descriptor: {\n order?: number\n plugin: (args: {\n config: Config\n options: TOptions\n plugins: PluginsMap\n }) => Config | Promise<Config>\n slug: string\n}): undefined extends TOptions ? (options?: TOptions) => Plugin : (options: TOptions) => Plugin\nexport function definePlugin<TOptions>(descriptor: {\n order?: number\n plugin: (args: {\n config: Config\n options: TOptions\n plugins: PluginsMap\n }) => Config | Promise<Config>\n slug: string\n}): (options: TOptions) => Plugin {\n return (options?: TOptions): Plugin => {\n const pluginFn: Plugin = (config) =>\n descriptor.plugin({\n config,\n options: options as TOptions,\n plugins: buildPluginsMap(config.plugins),\n })\n\n if (options !== undefined) {\n pluginFn.options = options as Record<string, unknown>\n }\n pluginFn.slug = descriptor.slug\n if (descriptor.order !== undefined) {\n pluginFn.order = descriptor.order\n }\n\n return pluginFn\n }\n}\n"],"names":["buildPluginsMap","plugins","map","p","slug","definePlugin","descriptor","options","pluginFn","config","plugin","undefined","order"],"mappings":"AAEA,SAASA,gBAAgBC,OAA6B;IACpD,MAAMC,MAA0C,CAAC;IACjD,IAAID,SAAS;QACX,KAAK,MAAME,KAAKF,QAAS;YACvB,IAAIE,EAAEC,IAAI,EAAE;gBACVF,GAAG,CAACC,EAAEC,IAAI,CAAC,GAAGD;YAChB;QACF;IACF;IACA,OAAOD;AACT;AAsCA,OAAO,SAASG,aAAuBC,UAQtC;IACC,OAAO,CAACC;QACN,MAAMC,WAAmB,CAACC,SACxBH,WAAWI,MAAM,CAAC;gBAChBD;gBACAF,SAASA;gBACTN,SAASD,gBAAgBS,OAAOR,OAAO;YACzC;QAEF,IAAIM,YAAYI,WAAW;YACzBH,SAASD,OAAO,GAAGA;QACrB;QACAC,SAASJ,IAAI,GAAGE,WAAWF,IAAI;QAC/B,IAAIE,WAAWM,KAAK,KAAKD,WAAW;YAClCH,SAASI,KAAK,GAAGN,WAAWM,KAAK;QACnC;QAEA,OAAOJ;IACT;AACF"}
|
package/dist/config/sanitize.js
CHANGED
|
@@ -141,7 +141,7 @@ const addDefaultDashboardWidgets = ({ config, richTextSanitizers, validRelations
|
|
|
141
141
|
components: {
|
|
142
142
|
// Presents an inclusion filter (all collections checked by default) while persisting the
|
|
143
143
|
// inverse as an exclusion list, so collections added later stay visible by default.
|
|
144
|
-
Field: '@payloadcms/ui#
|
|
144
|
+
Field: '@payloadcms/ui#CollectionFilter'
|
|
145
145
|
},
|
|
146
146
|
description: ({ t })=>t('dashboard:widgetRecentlyViewedFilterDescription')
|
|
147
147
|
},
|
|
@@ -191,7 +191,7 @@ const addDefaultDashboardWidgets = ({ config, richTextSanitizers, validRelations
|
|
|
191
191
|
});
|
|
192
192
|
dashboard.widgets.push({
|
|
193
193
|
slug: 'activity',
|
|
194
|
-
Component: '@payloadcms/ui/rsc#
|
|
194
|
+
Component: '@payloadcms/ui/rsc#ActivityWidget',
|
|
195
195
|
fields: sanitizeFields({
|
|
196
196
|
config: config,
|
|
197
197
|
existingFieldNames: new Set(),
|