payload 4.0.0-internal.ea6e8f8 → 4.0.0-internal.ec73d44
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/forms/Diff.d.ts +0 -4
- package/dist/admin/forms/Diff.d.ts.map +1 -1
- package/dist/admin/forms/Diff.js.map +1 -1
- package/dist/admin/getAdminPreferences.js +1 -1
- package/dist/admin/getAdminPreferences.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/operations/resetPassword.d.ts.map +1 -1
- package/dist/auth/operations/resetPassword.js +50 -1
- package/dist/auth/operations/resetPassword.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/branching/discard.js +1 -1
- package/dist/branching/discard.js.map +1 -1
- package/dist/branching/merge/prepareMerge.js +1 -1
- package/dist/branching/merge/prepareMerge.js.map +1 -1
- package/dist/branching/merge/retryFailedCleanups.js.map +1 -1
- package/dist/branching/resolveBranchQuery.d.ts.map +1 -1
- package/dist/branching/resolveBranchQuery.js +0 -3
- package/dist/branching/resolveBranchQuery.js.map +1 -1
- package/dist/branching/sanitizeBranchingConfig.d.ts.map +1 -1
- package/dist/branching/sanitizeBranchingConfig.js +0 -3
- package/dist/branching/sanitizeBranchingConfig.js.map +1 -1
- package/dist/branching/schedule/job.d.ts.map +1 -1
- package/dist/branching/schedule/job.js +7 -0
- package/dist/branching/schedule/job.js.map +1 -1
- package/dist/branching/types.d.ts +4 -13
- package/dist/branching/types.d.ts.map +1 -1
- package/dist/branching/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 +4 -1
- package/dist/collections/config/types.d.ts.map +1 -1
- package/dist/collections/config/types.js.map +1 -1
- package/dist/collections/operations/delete.js.map +1 -1
- package/dist/collections/operations/deleteByID.js.map +1 -1
- package/dist/collections/operations/findByID.js.map +1 -1
- package/dist/collections/operations/findVersionByID.d.ts.map +1 -1
- package/dist/collections/operations/findVersionByID.js +11 -0
- package/dist/collections/operations/findVersionByID.js.map +1 -1
- package/dist/collections/operations/findVersions.d.ts.map +1 -1
- package/dist/collections/operations/findVersions.js +11 -0
- 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/update.js.map +1 -1
- package/dist/collections/operations/updateByID.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/client.d.ts.map +1 -1
- package/dist/config/client.js +1 -0
- package/dist/config/client.js.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +1 -0
- package/dist/config/defaults.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 +8 -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 +2 -1
- package/dist/globals/config/types.d.ts.map +1 -1
- package/dist/globals/config/types.js.map +1 -1
- package/dist/globals/operations/findVersionByID.d.ts.map +1 -1
- package/dist/globals/operations/findVersionByID.js +7 -0
- package/dist/globals/operations/findVersionByID.js.map +1 -1
- package/dist/globals/operations/findVersions.d.ts.map +1 -1
- package/dist/globals/operations/findVersions.js +5 -0
- package/dist/globals/operations/findVersions.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 +24 -20
- 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/addHierarchyToCollection.d.ts.map +1 -1
- package/dist/hierarchy/addHierarchyToCollection.js +32 -21
- package/dist/hierarchy/addHierarchyToCollection.js.map +1 -1
- package/dist/hierarchy/createFolderField.js.map +1 -1
- package/dist/hierarchy/resolveHierarchyCollections.js +9 -3
- 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 +47 -27
- package/dist/llm-instructions/getInstructionsCollection.d.ts.map +1 -1
- package/dist/llm-instructions/getInstructionsCollection.js +2 -0
- package/dist/llm-instructions/getInstructionsCollection.js.map +1 -1
- package/dist/preferences/keys.d.ts +3 -9
- package/dist/preferences/keys.d.ts.map +1 -1
- package/dist/preferences/keys.js +3 -9
- package/dist/preferences/keys.js.map +1 -1
- package/dist/preferences/types.d.ts +1 -1
- package/dist/preferences/types.js.map +1 -1
- 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 +9 -3
- 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/formatFilesize.js +1 -1
- package/dist/uploads/formatFilesize.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.d.ts +4 -0
- package/dist/utilities/getVersionsConfig.d.ts.map +1 -1
- package/dist/utilities/getVersionsConfig.js +5 -0
- 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/dist/versions/types.d.ts +2 -0
- package/dist/versions/types.d.ts.map +1 -1
- package/dist/versions/types.js.map +1 -1
- package/package.json +30 -28
- package/skills/payload/reference/ENDPOINTS.md +3 -9
- package/skills/payload/reference/PLUGIN-DEVELOPMENT.md +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/collections/operations/findByID.ts"],"sourcesContent":["import type { FindOneArgs } from '../../database/types.js'\nimport type { CollectionSlug, FindOptions, JoinQuery } from '../../index.js'\nimport type {\n ApplyDisableErrors,\n JsonObject,\n PayloadRequest,\n PopulateType,\n SelectType,\n TransformCollectionWithSelect,\n} from '../../types/index.js'\nimport type {\n Collection,\n DataFromCollectionSlug,\n SelectFromCollectionSlug,\n TypeWithID,\n} from '../config/types.js'\n\nimport { executeAccess } from '../../auth/executeAccess.js'\nimport { combineQueries } from '../../database/combineQueries.js'\nimport { sanitizeJoinQuery } from '../../database/sanitizeJoinQuery.js'\nimport { sanitizeWhereQuery } from '../../database/sanitizeWhereQuery.js'\nimport { NotFound } from '../../errors/index.js'\nimport { afterRead, type AfterReadArgs } from '../../fields/hooks/afterRead/index.js'\nimport { validateQueryPaths } from '../../index.js'\nimport { lockedDocumentsCollectionSlug } from '../../locked-documents/config.js'\nimport { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js'\nimport { getSelectMode } from '../../utilities/getSelectMode.js'\nimport { hasDraftsEnabled } from '../../utilities/getVersionsConfig.js'\nimport { resolveSelect } from '../../utilities/resolveSelect.js'\nimport { sanitizeSelect } from '../../utilities/sanitizeSelect.js'\nimport { buildVersionCollectionFields } from '../../versions/buildCollectionFields.js'\nimport { appendVersionToQueryKey } from '../../versions/drafts/appendVersionToQueryKey.js'\nimport { getQueryDraftsSelect } from '../../versions/drafts/getQueryDraftsSelect.js'\nimport { replaceWithDraftIfAvailable } from '../../versions/drafts/replaceWithDraftIfAvailable.js'\nimport { buildAfterOperation } from './utilities/buildAfterOperation.js'\nimport { buildBeforeOperation } from './utilities/buildBeforeOperation.js'\n\nexport type FindByIDArgs = {\n collection: Collection\n currentDepth?: number\n /**\n * You may pass the document data directly which will skip the `db.findOne` database query.\n * This is useful if you want to use this endpoint solely for running hooks and populating data.\n */\n data?: Record<string, unknown>\n depth?: number\n disableErrors?: boolean\n draft?: boolean\n id: number | string\n includeLockStatus?: boolean\n joins?: JoinQuery\n overrideAccess?: boolean\n populate?: PopulateType\n req: PayloadRequest\n showHiddenFields?: boolean\n trash?: boolean\n} & Pick<AfterReadArgs<JsonObject>, 'flattenLocales'> &\n Pick<FindOptions<string, SelectType>, 'select'>\n\nexport const findByIDOperation = async <\n TSlug extends CollectionSlug,\n TDisableErrors extends boolean,\n TSelect extends SelectFromCollectionSlug<TSlug>,\n>(\n incomingArgs: FindByIDArgs,\n): Promise<ApplyDisableErrors<TransformCollectionWithSelect<TSlug, TSelect>, TDisableErrors>> => {\n let args = incomingArgs\n\n // /////////////////////////////////////\n // beforeOperation - Collection\n // /////////////////////////////////////\n\n args = await buildBeforeOperation({\n args,\n collection: args.collection.config,\n operation: 'read',\n overrideAccess: args.overrideAccess!,\n })\n\n const {\n id,\n collection: { config: collectionConfig },\n currentDepth,\n depth,\n disableErrors,\n draft: replaceWithVersion = false,\n flattenLocales,\n includeLockStatus: includeLockStatusFromArgs,\n joins,\n overrideAccess = false,\n populate,\n req: { fallbackLocale, locale, t },\n req,\n select: incomingSelect,\n showHiddenFields,\n trash = false,\n } = args\n\n const includeLockStatus =\n includeLockStatusFromArgs && req.payload.collections?.[lockedDocumentsCollectionSlug]\n\n const select = sanitizeSelect({\n fields: collectionConfig.flattenedFields,\n select: resolveSelect({\n config: collectionConfig.select,\n operation: 'read',\n req,\n select: incomingSelect,\n }),\n })\n\n // /////////////////////////////////////\n // Access\n // /////////////////////////////////////\n\n const accessResult = !overrideAccess\n ? await executeAccess(\n { id, slug: collectionConfig.slug, disableErrors, req },\n collectionConfig.access.read,\n )\n : true\n\n // If errors are disabled, and access returns false, return null\n if (accessResult === false) {\n return null!\n }\n\n const isValidID =\n (typeof id === 'string' && id.length > 0) || (typeof id === 'number' && Number.isFinite(id))\n\n if (!isValidID) {\n throw new NotFound(t)\n }\n\n const where = { id: { equals: id } }\n\n let fullWhere = combineQueries(where, accessResult)\n\n // Exclude trashed documents when trash: false\n fullWhere = appendNonTrashedFilter({\n enableTrash: collectionConfig.trash,\n trash,\n where: fullWhere,\n })\n\n sanitizeWhereQuery({\n fields: collectionConfig.flattenedFields,\n payload: args.req.payload,\n where: fullWhere,\n })\n\n const sanitizedJoins = await sanitizeJoinQuery({\n collectionConfig,\n joins,\n overrideAccess,\n req,\n })\n\n // execute only if there's a custom ID and potentially overwriten access on id\n if (req.payload.collections[collectionConfig.slug]!.customIDType) {\n await validateQueryPaths({\n collectionConfig,\n overrideAccess,\n req,\n where,\n })\n }\n\n // /////////////////////////////////////\n // Find by ID\n // /////////////////////////////////////\n\n const shouldQueryDrafts = !args.data && replaceWithVersion && hasDraftsEnabled(collectionConfig)\n let docWithLocales: DataFromCollectionSlug<TSlug> | null | undefined\n let query = fullWhere\n\n let dbSelect = select\n\n if (\n collectionConfig.versions?.drafts &&\n replaceWithVersion &&\n select &&\n getSelectMode(select) === 'include'\n ) {\n dbSelect = { ...select, createdAt: true, updatedAt: true }\n }\n\n const findOneArgs: FindOneArgs = {\n collection: collectionConfig.slug,\n draftsEnabled: replaceWithVersion,\n joins: req.payloadAPI === 'GraphQL' ? false : sanitizedJoins,\n locale: locale!,\n req: {\n // `branch`, `context` and `payload` are needed so the adapter can apply\n // the branch predicate and reuse this request's memoized change\n // manifest. Without them the read silently resolves against main.\n branch: req.branch,\n context: req.context,\n payload: req.payload,\n transactionID: req.transactionID,\n } as PayloadRequest,\n select: dbSelect,\n where: fullWhere,\n }\n\n if (shouldQueryDrafts) {\n query = appendVersionToQueryKey(fullWhere)\n\n await validateQueryPaths({\n collectionConfig,\n overrideAccess,\n req,\n versionFields: buildVersionCollectionFields(req.payload.config, collectionConfig, true),\n where: appendVersionToQueryKey(where),\n })\n\n const { docs } = await req.payload.db.queryDrafts<DataFromCollectionSlug<TSlug>>({\n collection: collectionConfig.slug,\n joins: req.payloadAPI === 'GraphQL' ? false : sanitizedJoins,\n limit: 1,\n locale: locale!,\n pagination: false,\n req,\n select: getQueryDraftsSelect({ select }),\n where: query,\n })\n\n docWithLocales = docs[0]\n\n if (!docWithLocales) {\n const { docs: existingVersions } = await req.payload.db.queryDrafts({\n collection: collectionConfig.slug,\n limit: 1,\n locale: locale!,\n pagination: false,\n req,\n select: { parent: true },\n where: appendVersionToQueryKey(where),\n })\n\n if (!existingVersions[0]) {\n query = fullWhere\n docWithLocales = await req.payload.db.findOne(findOneArgs)\n }\n }\n } else {\n docWithLocales = await req.payload.db.findOne(findOneArgs)\n }\n\n if (!docWithLocales && !args.data) {\n if (!disableErrors) {\n throw new NotFound(req.t)\n }\n return null!\n }\n\n let result: DataFromCollectionSlug<TSlug> =\n (args.data as DataFromCollectionSlug<TSlug>) ?? docWithLocales!\n\n // /////////////////////////////////////\n // Add collection property for auth collections\n // /////////////////////////////////////\n\n if (collectionConfig.auth) {\n result = { ...result, collection: collectionConfig.slug }\n }\n\n // /////////////////////////////////////\n // Include Lock Status if required\n // /////////////////////////////////////\n\n if (includeLockStatus && id) {\n let lockStatus: (JsonObject & TypeWithID) | null = null\n\n try {\n const lockDocumentsProp = collectionConfig?.lockDocuments\n\n const lockDurationDefault = 300 // Default 5 minutes in seconds\n const lockDuration =\n typeof lockDocumentsProp === 'object' ? lockDocumentsProp.duration : lockDurationDefault\n const lockDurationInMilliseconds = lockDuration * 1000\n\n const lockedDocument = await req.payload.find({\n collection: lockedDocumentsCollectionSlug,\n depth: 1,\n limit: 1,\n overrideAccess: false,\n pagination: false,\n req,\n where: {\n and: [\n {\n 'document.relationTo': {\n equals: collectionConfig.slug,\n },\n },\n {\n 'document.value': {\n equals: id,\n },\n },\n // Query where the lock is newer than the current time minus lock time\n {\n updatedAt: {\n greater_than: new Date(new Date().getTime() - lockDurationInMilliseconds),\n },\n },\n ],\n },\n })\n\n if (lockedDocument && lockedDocument.docs.length > 0) {\n lockStatus = lockedDocument.docs[0]!\n }\n } catch {\n // swallow error\n }\n\n result._isLocked = !!lockStatus\n result._userEditing = lockStatus?.user?.value ?? null\n }\n\n // /////////////////////////////////////\n // Replace document with draft if available\n // /////////////////////////////////////\n\n if (!shouldQueryDrafts && replaceWithVersion && hasDraftsEnabled(collectionConfig)) {\n result = await replaceWithDraftIfAvailable({\n accessResult,\n doc: result,\n entity: collectionConfig,\n entityType: 'collection',\n overrideAccess,\n req,\n select,\n })\n }\n\n // /////////////////////////////////////\n // beforeRead - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.beforeRead?.length) {\n for (const hook of collectionConfig.hooks.beforeRead) {\n result =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n doc: result,\n overrideAccess,\n query,\n req,\n })) || result\n }\n }\n\n // /////////////////////////////////////\n // afterRead - Fields\n // /////////////////////////////////////\n\n result = await afterRead({\n collection: collectionConfig,\n context: req.context,\n currentDepth,\n depth: depth!,\n doc: result,\n draft: replaceWithVersion,\n fallbackLocale: fallbackLocale!,\n flattenLocales,\n global: null,\n locale: locale!,\n overrideAccess,\n populate,\n req,\n select,\n showHiddenFields: 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 query,\n req,\n })) || result\n }\n }\n\n // /////////////////////////////////////\n // afterOperation - Collection\n // /////////////////////////////////////\n\n result = await buildAfterOperation({\n args,\n collection: collectionConfig,\n operation: 'findByID',\n overrideAccess,\n result,\n })\n\n // /////////////////////////////////////\n // Return results\n // /////////////////////////////////////\n\n return result as ApplyDisableErrors<TransformCollectionWithSelect<TSlug, TSelect>, TDisableErrors>\n}\n"],"names":["executeAccess","combineQueries","sanitizeJoinQuery","sanitizeWhereQuery","NotFound","afterRead","validateQueryPaths","lockedDocumentsCollectionSlug","appendNonTrashedFilter","getSelectMode","hasDraftsEnabled","resolveSelect","sanitizeSelect","buildVersionCollectionFields","appendVersionToQueryKey","getQueryDraftsSelect","replaceWithDraftIfAvailable","buildAfterOperation","buildBeforeOperation","findByIDOperation","incomingArgs","args","collection","config","operation","overrideAccess","id","collectionConfig","currentDepth","depth","disableErrors","draft","replaceWithVersion","flattenLocales","includeLockStatus","includeLockStatusFromArgs","joins","populate","req","fallbackLocale","locale","t","select","incomingSelect","showHiddenFields","trash","payload","collections","fields","flattenedFields","accessResult","slug","access","read","isValidID","length","Number","isFinite","where","equals","fullWhere","enableTrash","sanitizedJoins","customIDType","shouldQueryDrafts","data","docWithLocales","query","dbSelect","versions","drafts","createdAt","updatedAt","findOneArgs","draftsEnabled","payloadAPI","branch","context","transactionID","versionFields","docs","db","queryDrafts","limit","pagination","existingVersions","parent","findOne","result","auth","lockStatus","lockDocumentsProp","lockDocuments","lockDurationDefault","lockDuration","duration","lockDurationInMilliseconds","lockedDocument","find","and","greater_than","Date","getTime","_isLocked","_userEditing","user","value","doc","entity","entityType","hooks","beforeRead","hook","global"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/collections/operations/findByID.ts"],"sourcesContent":["import type { FindOneArgs } from '../../database/types.js'\nimport type { CollectionSlug, FindOptions, JoinQuery } from '../../index.js'\nimport type {\n ApplyDisableErrors,\n JsonObject,\n PayloadRequest,\n PopulateType,\n SelectType,\n TransformCollectionWithSelect,\n} from '../../types/index.js'\nimport type {\n Collection,\n DataFromCollectionSlug,\n SelectFromCollectionSlug,\n TypeWithID,\n} from '../config/types.js'\n\nimport { executeAccess } from '../../auth/executeAccess.js'\nimport { combineQueries } from '../../database/combineQueries.js'\nimport { sanitizeJoinQuery } from '../../database/sanitizeJoinQuery.js'\nimport { sanitizeWhereQuery } from '../../database/sanitizeWhereQuery.js'\nimport { NotFound } from '../../errors/index.js'\nimport { afterRead, type AfterReadArgs } from '../../fields/hooks/afterRead/index.js'\nimport { validateQueryPaths } from '../../index.js'\nimport { lockedDocumentsCollectionSlug } from '../../locked-documents/config.js'\nimport { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js'\nimport { getSelectMode } from '../../utilities/getSelectMode.js'\nimport { hasDraftsEnabled } from '../../utilities/getVersionsConfig.js'\nimport { resolveSelect } from '../../utilities/resolveSelect.js'\nimport { sanitizeSelect } from '../../utilities/sanitizeSelect.js'\nimport { buildVersionCollectionFields } from '../../versions/buildCollectionFields.js'\nimport { appendVersionToQueryKey } from '../../versions/drafts/appendVersionToQueryKey.js'\nimport { getQueryDraftsSelect } from '../../versions/drafts/getQueryDraftsSelect.js'\nimport { replaceWithDraftIfAvailable } from '../../versions/drafts/replaceWithDraftIfAvailable.js'\nimport { buildAfterOperation } from './utilities/buildAfterOperation.js'\nimport { buildBeforeOperation } from './utilities/buildBeforeOperation.js'\n\nexport type FindByIDArgs = {\n collection: Collection\n currentDepth?: number\n /**\n * You may pass the document data directly which will skip the `db.findOne` database query.\n * This is useful if you want to use this endpoint solely for running hooks and populating data.\n */\n data?: Record<string, unknown>\n depth?: number\n disableErrors?: boolean\n draft?: boolean\n id: number | string\n includeLockStatus?: boolean\n joins?: JoinQuery\n overrideAccess?: boolean\n populate?: PopulateType\n req: PayloadRequest\n showHiddenFields?: boolean\n trash?: boolean\n} & Pick<AfterReadArgs<JsonObject>, 'flattenLocales'> &\n Pick<FindOptions<string, SelectType>, 'select'>\n\nexport const findByIDOperation = async <\n TSlug extends CollectionSlug,\n TDisableErrors extends boolean,\n TSelect extends SelectFromCollectionSlug<TSlug>,\n>(\n incomingArgs: FindByIDArgs,\n): Promise<ApplyDisableErrors<TransformCollectionWithSelect<TSlug, TSelect>, TDisableErrors>> => {\n let args = incomingArgs\n\n // /////////////////////////////////////\n // beforeOperation - Collection\n // /////////////////////////////////////\n\n args = await buildBeforeOperation({\n args,\n collection: args.collection.config,\n operation: 'read',\n overrideAccess: args.overrideAccess!,\n })\n\n const {\n id,\n collection: { config: collectionConfig },\n currentDepth,\n depth,\n disableErrors,\n draft: replaceWithVersion = false,\n flattenLocales,\n includeLockStatus: includeLockStatusFromArgs,\n joins,\n overrideAccess = false,\n populate,\n req: { fallbackLocale, locale, t },\n req,\n select: incomingSelect,\n showHiddenFields,\n trash = false,\n } = args\n\n const includeLockStatus =\n includeLockStatusFromArgs && req.payload.collections?.[lockedDocumentsCollectionSlug]\n\n const select = sanitizeSelect({\n fields: collectionConfig.flattenedFields,\n select: resolveSelect({\n config: collectionConfig.select,\n operation: 'read',\n req,\n select: incomingSelect,\n }),\n })\n\n // /////////////////////////////////////\n // Access\n // /////////////////////////////////////\n\n const accessResult = !overrideAccess\n ? await executeAccess(\n { id, slug: collectionConfig.slug, disableErrors, req },\n collectionConfig.access.read,\n )\n : true\n\n // If errors are disabled, and access returns false, return null\n if (accessResult === false) {\n return null!\n }\n\n const isValidID =\n (typeof id === 'string' && id.length > 0) || (typeof id === 'number' && Number.isFinite(id))\n\n if (!isValidID) {\n throw new NotFound(t)\n }\n\n const where = { id: { equals: id } }\n\n let fullWhere = combineQueries(where, accessResult)\n\n // Exclude trashed documents when trash: false\n fullWhere = appendNonTrashedFilter({\n enableTrash: collectionConfig.trash,\n trash,\n where: fullWhere,\n })\n\n sanitizeWhereQuery({\n fields: collectionConfig.flattenedFields,\n payload: args.req.payload,\n where: fullWhere,\n })\n\n const sanitizedJoins = await sanitizeJoinQuery({\n collectionConfig,\n joins,\n overrideAccess,\n req,\n })\n\n // execute only if there's a custom ID and potentially overwriten access on id\n if (req.payload.collections[collectionConfig.slug]!.customIDType) {\n await validateQueryPaths({\n collectionConfig,\n overrideAccess,\n req,\n where,\n })\n }\n\n // /////////////////////////////////////\n // Find by ID\n // /////////////////////////////////////\n\n const shouldQueryDrafts = !args.data && replaceWithVersion && hasDraftsEnabled(collectionConfig)\n let docWithLocales: DataFromCollectionSlug<TSlug> | null | undefined\n let query = fullWhere\n\n let dbSelect = select\n\n if (\n collectionConfig.versions?.drafts &&\n replaceWithVersion &&\n select &&\n getSelectMode(select) === 'include'\n ) {\n dbSelect = { ...select, createdAt: true, updatedAt: true }\n }\n\n const findOneArgs: FindOneArgs = {\n collection: collectionConfig.slug,\n draftsEnabled: replaceWithVersion,\n joins: req.payloadAPI === 'GraphQL' ? false : sanitizedJoins,\n locale: locale!,\n req: {\n // `branch`, `context` and `payload` are needed so the adapter can apply\n // the branch predicate and reuse this request's memoized change\n // manifest. Without them the read silently resolves against main.\n branch: req.branch,\n context: req.context,\n payload: req.payload,\n transactionID: req.transactionID,\n },\n select: dbSelect,\n where: fullWhere,\n }\n\n if (shouldQueryDrafts) {\n query = appendVersionToQueryKey(fullWhere)\n\n await validateQueryPaths({\n collectionConfig,\n overrideAccess,\n req,\n versionFields: buildVersionCollectionFields(req.payload.config, collectionConfig, true),\n where: appendVersionToQueryKey(where),\n })\n\n const { docs } = await req.payload.db.queryDrafts<DataFromCollectionSlug<TSlug>>({\n collection: collectionConfig.slug,\n joins: req.payloadAPI === 'GraphQL' ? false : sanitizedJoins,\n limit: 1,\n locale: locale!,\n pagination: false,\n req,\n select: getQueryDraftsSelect({ select }),\n where: query,\n })\n\n docWithLocales = docs[0]\n\n if (!docWithLocales) {\n const { docs: existingVersions } = await req.payload.db.queryDrafts({\n collection: collectionConfig.slug,\n limit: 1,\n locale: locale!,\n pagination: false,\n req,\n select: { parent: true },\n where: appendVersionToQueryKey(where),\n })\n\n if (!existingVersions[0]) {\n query = fullWhere\n docWithLocales = await req.payload.db.findOne(findOneArgs)\n }\n }\n } else {\n docWithLocales = await req.payload.db.findOne(findOneArgs)\n }\n\n if (!docWithLocales && !args.data) {\n if (!disableErrors) {\n throw new NotFound(req.t)\n }\n return null!\n }\n\n let result: DataFromCollectionSlug<TSlug> =\n (args.data as DataFromCollectionSlug<TSlug>) ?? docWithLocales!\n\n // /////////////////////////////////////\n // Add collection property for auth collections\n // /////////////////////////////////////\n\n if (collectionConfig.auth) {\n result = { ...result, collection: collectionConfig.slug }\n }\n\n // /////////////////////////////////////\n // Include Lock Status if required\n // /////////////////////////////////////\n\n if (includeLockStatus && id) {\n let lockStatus: (JsonObject & TypeWithID) | null = null\n\n try {\n const lockDocumentsProp = collectionConfig?.lockDocuments\n\n const lockDurationDefault = 300 // Default 5 minutes in seconds\n const lockDuration =\n typeof lockDocumentsProp === 'object' ? lockDocumentsProp.duration : lockDurationDefault\n const lockDurationInMilliseconds = lockDuration * 1000\n\n const lockedDocument = await req.payload.find({\n collection: lockedDocumentsCollectionSlug,\n depth: 1,\n limit: 1,\n overrideAccess: false,\n pagination: false,\n req,\n where: {\n and: [\n {\n 'document.relationTo': {\n equals: collectionConfig.slug,\n },\n },\n {\n 'document.value': {\n equals: id,\n },\n },\n // Query where the lock is newer than the current time minus lock time\n {\n updatedAt: {\n greater_than: new Date(new Date().getTime() - lockDurationInMilliseconds),\n },\n },\n ],\n },\n })\n\n if (lockedDocument && lockedDocument.docs.length > 0) {\n lockStatus = lockedDocument.docs[0]!\n }\n } catch {\n // swallow error\n }\n\n result._isLocked = !!lockStatus\n result._userEditing = lockStatus?.user?.value ?? null\n }\n\n // /////////////////////////////////////\n // Replace document with draft if available\n // /////////////////////////////////////\n\n if (!shouldQueryDrafts && replaceWithVersion && hasDraftsEnabled(collectionConfig)) {\n result = await replaceWithDraftIfAvailable({\n accessResult,\n doc: result,\n entity: collectionConfig,\n entityType: 'collection',\n overrideAccess,\n req,\n select,\n })\n }\n\n // /////////////////////////////////////\n // beforeRead - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.beforeRead?.length) {\n for (const hook of collectionConfig.hooks.beforeRead) {\n result =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n doc: result,\n overrideAccess,\n query,\n req,\n })) || result\n }\n }\n\n // /////////////////////////////////////\n // afterRead - Fields\n // /////////////////////////////////////\n\n result = await afterRead({\n collection: collectionConfig,\n context: req.context,\n currentDepth,\n depth: depth!,\n doc: result,\n draft: replaceWithVersion,\n fallbackLocale: fallbackLocale!,\n flattenLocales,\n global: null,\n locale: locale!,\n overrideAccess,\n populate,\n req,\n select,\n showHiddenFields: 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 query,\n req,\n })) || result\n }\n }\n\n // /////////////////////////////////////\n // afterOperation - Collection\n // /////////////////////////////////////\n\n result = await buildAfterOperation({\n args,\n collection: collectionConfig,\n operation: 'findByID',\n overrideAccess,\n result,\n })\n\n // /////////////////////////////////////\n // Return results\n // /////////////////////////////////////\n\n return result as ApplyDisableErrors<TransformCollectionWithSelect<TSlug, TSelect>, TDisableErrors>\n}\n"],"names":["executeAccess","combineQueries","sanitizeJoinQuery","sanitizeWhereQuery","NotFound","afterRead","validateQueryPaths","lockedDocumentsCollectionSlug","appendNonTrashedFilter","getSelectMode","hasDraftsEnabled","resolveSelect","sanitizeSelect","buildVersionCollectionFields","appendVersionToQueryKey","getQueryDraftsSelect","replaceWithDraftIfAvailable","buildAfterOperation","buildBeforeOperation","findByIDOperation","incomingArgs","args","collection","config","operation","overrideAccess","id","collectionConfig","currentDepth","depth","disableErrors","draft","replaceWithVersion","flattenLocales","includeLockStatus","includeLockStatusFromArgs","joins","populate","req","fallbackLocale","locale","t","select","incomingSelect","showHiddenFields","trash","payload","collections","fields","flattenedFields","accessResult","slug","access","read","isValidID","length","Number","isFinite","where","equals","fullWhere","enableTrash","sanitizedJoins","customIDType","shouldQueryDrafts","data","docWithLocales","query","dbSelect","versions","drafts","createdAt","updatedAt","findOneArgs","draftsEnabled","payloadAPI","branch","context","transactionID","versionFields","docs","db","queryDrafts","limit","pagination","existingVersions","parent","findOne","result","auth","lockStatus","lockDocumentsProp","lockDocuments","lockDurationDefault","lockDuration","duration","lockDurationInMilliseconds","lockedDocument","find","and","greater_than","Date","getTime","_isLocked","_userEditing","user","value","doc","entity","entityType","hooks","beforeRead","hook","global"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findVersionByID.d.ts","sourceRoot":"","sources":["../../../src/collections/operations/findVersionByID.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACpF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"findVersionByID.d.ts","sourceRoot":"","sources":["../../../src/collections/operations/findVersionByID.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACpF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAwBhE,MAAM,MAAM,SAAS,GAAG;IACtB,UAAU,EAAE,UAAU,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,GAAG,EAAE,cAAc,CAAA;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,QAAQ,CAAC,CAAA;AAEnD,eAAO,MAAM,wBAAwB,GAAU,KAAK,SAAS,UAAU,GAAG,GAAG,QACrE,SAAS,KACd,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,CAiPhC,CAAA"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { executeAccess } from '../../auth/executeAccess.js';
|
|
2
|
+
import { branchParentField } from '../../branching/types.js';
|
|
2
3
|
import { combineQueries } from '../../database/combineQueries.js';
|
|
3
4
|
import { sanitizeWhereQuery } from '../../database/sanitizeWhereQuery.js';
|
|
4
5
|
import { APIError, Forbidden, NotFound } from '../../errors/index.js';
|
|
@@ -6,6 +7,7 @@ import { afterRead } from '../../fields/hooks/afterRead/index.js';
|
|
|
6
7
|
import { checkFileAccess } from '../../uploads/checkFileAccess.js';
|
|
7
8
|
import { markHistoricalFileURLs } from '../../uploads/fileVersioning/markHistoricalFileURLs.js';
|
|
8
9
|
import { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js';
|
|
10
|
+
import { hasVersionsEnabled } from '../../utilities/getVersionsConfig.js';
|
|
9
11
|
import { httpStatus } from '../../utilities/httpStatus.js';
|
|
10
12
|
import { resolveSelect } from '../../utilities/resolveSelect.js';
|
|
11
13
|
import { sanitizeSelect } from '../../utilities/sanitizeSelect.js';
|
|
@@ -19,6 +21,12 @@ export const findVersionByIDOperation = async (args)=>{
|
|
|
19
21
|
if (!id) {
|
|
20
22
|
throw new APIError('Missing ID of version.', httpStatus.BAD_REQUEST);
|
|
21
23
|
}
|
|
24
|
+
if (!hasVersionsEnabled(collectionConfig)) {
|
|
25
|
+
if (disableErrors) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
throw new NotFound(req.t);
|
|
29
|
+
}
|
|
22
30
|
// /////////////////////////////////////
|
|
23
31
|
// beforeOperation - Collection
|
|
24
32
|
// /////////////////////////////////////
|
|
@@ -192,6 +200,9 @@ export const findVersionByIDOperation = async (args)=>{
|
|
|
192
200
|
// /////////////////////////////////////
|
|
193
201
|
// Return results
|
|
194
202
|
// /////////////////////////////////////
|
|
203
|
+
if (!req.context._branchBypass) {
|
|
204
|
+
Reflect.deleteProperty(result, branchParentField);
|
|
205
|
+
}
|
|
195
206
|
return result;
|
|
196
207
|
};
|
|
197
208
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/collections/operations/findVersionByID.ts"],"sourcesContent":["import type { FindOptions } from '../../index.js'\nimport type { PayloadRequest, PopulateType, SelectType } from '../../types/index.js'\nimport type { TypeWithVersion } from '../../versions/types.js'\nimport type { Collection, TypeWithID } from '../config/types.js'\n\nimport { executeAccess } from '../../auth/executeAccess.js'\nimport { combineQueries } from '../../database/combineQueries.js'\nimport { sanitizeWhereQuery } from '../../database/sanitizeWhereQuery.js'\nimport { APIError, Forbidden, NotFound } from '../../errors/index.js'\nimport { afterRead } from '../../fields/hooks/afterRead/index.js'\nimport { checkFileAccess } from '../../uploads/checkFileAccess.js'\nimport { markHistoricalFileURLs } from '../../uploads/fileVersioning/markHistoricalFileURLs.js'\nimport { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js'\nimport { httpStatus } from '../../utilities/httpStatus.js'\nimport { resolveSelect } from '../../utilities/resolveSelect.js'\nimport { sanitizeSelect } from '../../utilities/sanitizeSelect.js'\nimport { buildVersionCollectionFields } from '../../versions/buildCollectionFields.js'\nimport {\n isInheritedReadVersionsAccess,\n withInheritedReadVersionsParentID,\n} from '../../versions/isInheritedReadVersionsAccess.js'\nimport { buildAfterOperation } from './utilities/buildAfterOperation.js'\nimport { buildBeforeOperation } from './utilities/buildBeforeOperation.js'\nimport { prefetchVersionForInheritedReadAccess } from './utilities/prefetchVersionForInheritedReadAccess.js'\n\nexport type Arguments = {\n collection: Collection\n currentDepth?: number\n depth?: number\n disableErrors?: boolean\n id: number | string\n overrideAccess?: boolean\n populate?: PopulateType\n req: PayloadRequest\n showHiddenFields?: boolean\n trash?: boolean\n} & Pick<FindOptions<string, SelectType>, 'select'>\n\nexport const findVersionByIDOperation = async <TData extends TypeWithID = any>(\n args: Arguments,\n): Promise<TypeWithVersion<TData>> => {\n const {\n id,\n collection: { config: collectionConfig },\n currentDepth,\n depth,\n disableErrors,\n overrideAccess,\n populate,\n req: { fallbackLocale, locale, payload },\n req,\n select: incomingSelect,\n showHiddenFields,\n trash = false,\n } = args\n\n if (!id) {\n throw new APIError('Missing ID of version.', httpStatus.BAD_REQUEST)\n }\n\n // /////////////////////////////////////\n // beforeOperation - Collection\n // /////////////////////////////////////\n\n args = await buildBeforeOperation({\n args,\n collection: collectionConfig,\n operation: 'findVersionByID',\n overrideAccess,\n })\n\n const where = { id: { equals: id } }\n const versionFields = buildVersionCollectionFields(payload.config, collectionConfig, true)\n const select = sanitizeSelect({\n fields: versionFields,\n select: resolveSelect({\n config: collectionConfig.select,\n operation: 'read',\n req,\n select: incomingSelect,\n }),\n versions: true,\n })\n\n const inheritsReadAccess = isInheritedReadVersionsAccess(collectionConfig.access.readVersions)\n const shouldPrefetchVersion = !overrideAccess && inheritsReadAccess\n const prefetched = shouldPrefetchVersion\n ? await prefetchVersionForInheritedReadAccess<TData>({\n id,\n collectionConfig,\n locale: locale!,\n req,\n select,\n trash,\n })\n : undefined\n\n // /////////////////////////////////////\n // Access\n // /////////////////////////////////////\n\n const accessResults = !overrideAccess\n ? await executeAccess(\n {\n id,\n slug: collectionConfig.slug,\n disableErrors,\n req,\n },\n inheritsReadAccess\n ? (accessArgs) =>\n collectionConfig.access.readVersions(\n withInheritedReadVersionsParentID(accessArgs, prefetched?.parentID),\n )\n : collectionConfig.access.readVersions,\n )\n : true\n\n // If errors are disabled, and access returns false, return null\n if (accessResults === false) {\n return null!\n }\n\n const hasWhereAccess = typeof accessResults === 'object'\n\n let fullWhere = combineQueries(where, accessResults)\n\n fullWhere = appendNonTrashedFilter({\n deletedAtPath: 'version.deletedAt',\n enableTrash: collectionConfig.trash,\n trash,\n where: fullWhere,\n })\n\n sanitizeWhereQuery({ fields: versionFields, payload, where: fullWhere })\n\n // /////////////////////////////////////\n // Find by ID\n // /////////////////////////////////////\n\n let result = prefetched?.version as TypeWithVersion<TData>\n\n if (!shouldPrefetchVersion || hasWhereAccess) {\n const versionsQuery = await payload.db.findVersions<TData>({\n collection: collectionConfig.slug,\n limit: 1,\n locale: locale!,\n pagination: false,\n req,\n select,\n where: fullWhere,\n })\n\n result = versionsQuery.docs[0]!\n }\n\n if (!result) {\n if (!disableErrors) {\n if (!hasWhereAccess) {\n throw new NotFound(req.t)\n }\n if (hasWhereAccess) {\n throw new Forbidden(req.t)\n }\n }\n\n return null!\n }\n\n if (collectionConfig.upload && !overrideAccess) {\n const filename = (result.version as Record<string, unknown>)?.filename\n\n await checkFileAccess({\n collection: args.collection,\n documentID: result.parent,\n filename: typeof filename === 'string' ? filename : '',\n req,\n })\n }\n\n if (!result.version) {\n // Fallback if not selected\n ;(result as any).version = {}\n }\n\n // /////////////////////////////////////\n // beforeRead - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.beforeRead?.length) {\n for (const hook of collectionConfig.hooks.beforeRead) {\n result.version =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n doc: result.version,\n overrideAccess,\n query: fullWhere,\n req,\n })) || result.version\n }\n }\n\n // /////////////////////////////////////\n // afterRead - Fields\n // /////////////////////////////////////\n\n result.version = await afterRead({\n collection: collectionConfig,\n context: req.context,\n currentDepth,\n depth: depth!,\n doc: result.version,\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n draft: undefined,\n fallbackLocale: fallbackLocale!,\n global: null,\n locale: locale!,\n overrideAccess: overrideAccess!,\n populate,\n req,\n select: typeof select?.version === 'object' ? select.version : undefined,\n showHiddenFields: 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.version =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n doc: result.version,\n overrideAccess,\n query: fullWhere,\n req,\n })) || result.version\n }\n }\n\n if (collectionConfig.upload) {\n result.version = markHistoricalFileURLs({\n collectionSlug: collectionConfig.slug,\n doc: result.version as Record<string, unknown>,\n req,\n versionID: result.id,\n }) as TData\n }\n\n // /////////////////////////////////////\n // afterOperation - Collection\n // /////////////////////////////////////\n\n result = await buildAfterOperation({\n args,\n collection: collectionConfig,\n operation: 'findVersionByID',\n overrideAccess,\n result,\n })\n\n // /////////////////////////////////////\n // Return results\n // /////////////////////////////////////\n\n return result\n}\n"],"names":["executeAccess","combineQueries","sanitizeWhereQuery","APIError","Forbidden","NotFound","afterRead","checkFileAccess","markHistoricalFileURLs","appendNonTrashedFilter","httpStatus","resolveSelect","sanitizeSelect","buildVersionCollectionFields","isInheritedReadVersionsAccess","withInheritedReadVersionsParentID","buildAfterOperation","buildBeforeOperation","prefetchVersionForInheritedReadAccess","findVersionByIDOperation","args","id","collection","config","collectionConfig","currentDepth","depth","disableErrors","overrideAccess","populate","req","fallbackLocale","locale","payload","select","incomingSelect","showHiddenFields","trash","BAD_REQUEST","operation","where","equals","versionFields","fields","versions","inheritsReadAccess","access","readVersions","shouldPrefetchVersion","prefetched","undefined","accessResults","slug","accessArgs","parentID","hasWhereAccess","fullWhere","deletedAtPath","enableTrash","result","version","versionsQuery","db","findVersions","limit","pagination","docs","t","upload","filename","documentID","parent","hooks","beforeRead","length","hook","context","doc","query","draft","global","collectionSlug","versionID"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/collections/operations/findVersionByID.ts"],"sourcesContent":["import type { FindOptions } from '../../index.js'\nimport type { PayloadRequest, PopulateType, SelectType } from '../../types/index.js'\nimport type { TypeWithVersion } from '../../versions/types.js'\nimport type { Collection, TypeWithID } from '../config/types.js'\n\nimport { executeAccess } from '../../auth/executeAccess.js'\nimport { branchParentField } from '../../branching/types.js'\nimport { combineQueries } from '../../database/combineQueries.js'\nimport { sanitizeWhereQuery } from '../../database/sanitizeWhereQuery.js'\nimport { APIError, Forbidden, NotFound } from '../../errors/index.js'\nimport { afterRead } from '../../fields/hooks/afterRead/index.js'\nimport { checkFileAccess } from '../../uploads/checkFileAccess.js'\nimport { markHistoricalFileURLs } from '../../uploads/fileVersioning/markHistoricalFileURLs.js'\nimport { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js'\nimport { hasVersionsEnabled } from '../../utilities/getVersionsConfig.js'\nimport { httpStatus } from '../../utilities/httpStatus.js'\nimport { resolveSelect } from '../../utilities/resolveSelect.js'\nimport { sanitizeSelect } from '../../utilities/sanitizeSelect.js'\nimport { buildVersionCollectionFields } from '../../versions/buildCollectionFields.js'\nimport {\n isInheritedReadVersionsAccess,\n withInheritedReadVersionsParentID,\n} from '../../versions/isInheritedReadVersionsAccess.js'\nimport { buildAfterOperation } from './utilities/buildAfterOperation.js'\nimport { buildBeforeOperation } from './utilities/buildBeforeOperation.js'\nimport { prefetchVersionForInheritedReadAccess } from './utilities/prefetchVersionForInheritedReadAccess.js'\n\nexport type Arguments = {\n collection: Collection\n currentDepth?: number\n depth?: number\n disableErrors?: boolean\n id: number | string\n overrideAccess?: boolean\n populate?: PopulateType\n req: PayloadRequest\n showHiddenFields?: boolean\n trash?: boolean\n} & Pick<FindOptions<string, SelectType>, 'select'>\n\nexport const findVersionByIDOperation = async <TData extends TypeWithID = any>(\n args: Arguments,\n): Promise<TypeWithVersion<TData>> => {\n const {\n id,\n collection: { config: collectionConfig },\n currentDepth,\n depth,\n disableErrors,\n overrideAccess,\n populate,\n req: { fallbackLocale, locale, payload },\n req,\n select: incomingSelect,\n showHiddenFields,\n trash = false,\n } = args\n\n if (!id) {\n throw new APIError('Missing ID of version.', httpStatus.BAD_REQUEST)\n }\n\n if (!hasVersionsEnabled(collectionConfig)) {\n if (disableErrors) {\n return null!\n }\n\n throw new NotFound(req.t)\n }\n\n // /////////////////////////////////////\n // beforeOperation - Collection\n // /////////////////////////////////////\n\n args = await buildBeforeOperation({\n args,\n collection: collectionConfig,\n operation: 'findVersionByID',\n overrideAccess,\n })\n\n const where = { id: { equals: id } }\n const versionFields = buildVersionCollectionFields(payload.config, collectionConfig, true)\n const select = sanitizeSelect({\n fields: versionFields,\n select: resolveSelect({\n config: collectionConfig.select,\n operation: 'read',\n req,\n select: incomingSelect,\n }),\n versions: true,\n })\n\n const inheritsReadAccess = isInheritedReadVersionsAccess(collectionConfig.access.readVersions)\n const shouldPrefetchVersion = !overrideAccess && inheritsReadAccess\n const prefetched = shouldPrefetchVersion\n ? await prefetchVersionForInheritedReadAccess<TData>({\n id,\n collectionConfig,\n locale: locale!,\n req,\n select,\n trash,\n })\n : undefined\n\n // /////////////////////////////////////\n // Access\n // /////////////////////////////////////\n\n const accessResults = !overrideAccess\n ? await executeAccess(\n {\n id,\n slug: collectionConfig.slug,\n disableErrors,\n req,\n },\n inheritsReadAccess\n ? (accessArgs) =>\n collectionConfig.access.readVersions(\n withInheritedReadVersionsParentID(accessArgs, prefetched?.parentID),\n )\n : collectionConfig.access.readVersions,\n )\n : true\n\n // If errors are disabled, and access returns false, return null\n if (accessResults === false) {\n return null!\n }\n\n const hasWhereAccess = typeof accessResults === 'object'\n\n let fullWhere = combineQueries(where, accessResults)\n\n fullWhere = appendNonTrashedFilter({\n deletedAtPath: 'version.deletedAt',\n enableTrash: collectionConfig.trash,\n trash,\n where: fullWhere,\n })\n\n sanitizeWhereQuery({ fields: versionFields, payload, where: fullWhere })\n\n // /////////////////////////////////////\n // Find by ID\n // /////////////////////////////////////\n\n let result = prefetched?.version as TypeWithVersion<TData>\n\n if (!shouldPrefetchVersion || hasWhereAccess) {\n const versionsQuery = await payload.db.findVersions<TData>({\n collection: collectionConfig.slug,\n limit: 1,\n locale: locale!,\n pagination: false,\n req,\n select,\n where: fullWhere,\n })\n\n result = versionsQuery.docs[0]!\n }\n\n if (!result) {\n if (!disableErrors) {\n if (!hasWhereAccess) {\n throw new NotFound(req.t)\n }\n if (hasWhereAccess) {\n throw new Forbidden(req.t)\n }\n }\n\n return null!\n }\n\n if (collectionConfig.upload && !overrideAccess) {\n const filename = (result.version as Record<string, unknown>)?.filename\n\n await checkFileAccess({\n collection: args.collection,\n documentID: result.parent,\n filename: typeof filename === 'string' ? filename : '',\n req,\n })\n }\n\n if (!result.version) {\n // Fallback if not selected\n ;(result as any).version = {}\n }\n\n // /////////////////////////////////////\n // beforeRead - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks?.beforeRead?.length) {\n for (const hook of collectionConfig.hooks.beforeRead) {\n result.version =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n doc: result.version,\n overrideAccess,\n query: fullWhere,\n req,\n })) || result.version\n }\n }\n\n // /////////////////////////////////////\n // afterRead - Fields\n // /////////////////////////////////////\n\n result.version = await afterRead({\n collection: collectionConfig,\n context: req.context,\n currentDepth,\n depth: depth!,\n doc: result.version,\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n draft: undefined,\n fallbackLocale: fallbackLocale!,\n global: null,\n locale: locale!,\n overrideAccess: overrideAccess!,\n populate,\n req,\n select: typeof select?.version === 'object' ? select.version : undefined,\n showHiddenFields: 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.version =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n doc: result.version,\n overrideAccess,\n query: fullWhere,\n req,\n })) || result.version\n }\n }\n\n if (collectionConfig.upload) {\n result.version = markHistoricalFileURLs({\n collectionSlug: collectionConfig.slug,\n doc: result.version,\n req,\n versionID: result.id,\n })\n }\n\n // /////////////////////////////////////\n // afterOperation - Collection\n // /////////////////////////////////////\n\n result = await buildAfterOperation({\n args,\n collection: collectionConfig,\n operation: 'findVersionByID',\n overrideAccess,\n result,\n })\n\n // /////////////////////////////////////\n // Return results\n // /////////////////////////////////////\n\n if (!req.context._branchBypass) {\n Reflect.deleteProperty(result, branchParentField)\n }\n\n return result\n}\n"],"names":["executeAccess","branchParentField","combineQueries","sanitizeWhereQuery","APIError","Forbidden","NotFound","afterRead","checkFileAccess","markHistoricalFileURLs","appendNonTrashedFilter","hasVersionsEnabled","httpStatus","resolveSelect","sanitizeSelect","buildVersionCollectionFields","isInheritedReadVersionsAccess","withInheritedReadVersionsParentID","buildAfterOperation","buildBeforeOperation","prefetchVersionForInheritedReadAccess","findVersionByIDOperation","args","id","collection","config","collectionConfig","currentDepth","depth","disableErrors","overrideAccess","populate","req","fallbackLocale","locale","payload","select","incomingSelect","showHiddenFields","trash","BAD_REQUEST","t","operation","where","equals","versionFields","fields","versions","inheritsReadAccess","access","readVersions","shouldPrefetchVersion","prefetched","undefined","accessResults","slug","accessArgs","parentID","hasWhereAccess","fullWhere","deletedAtPath","enableTrash","result","version","versionsQuery","db","findVersions","limit","pagination","docs","upload","filename","documentID","parent","hooks","beforeRead","length","hook","context","doc","query","draft","global","collectionSlug","versionID","_branchBypass","Reflect","deleteProperty"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findVersions.d.ts","sourceRoot":"","sources":["../../../src/collections/operations/findVersions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AACjG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"findVersions.d.ts","sourceRoot":"","sources":["../../../src/collections/operations/findVersions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AACjG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAqBlD,MAAM,MAAM,SAAS,GAAG;IACtB,UAAU,EAAE,UAAU,CAAA;IACtB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,GAAG,CAAC,EAAE,cAAc,CAAA;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,QAAQ,CAAC,CAAA;AAEnD,eAAO,MAAM,qBAAqB,GAAU,KAAK,SAAS,eAAe,CAAC,KAAK,CAAC,QACxE,SAAS,KACd,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAgP9B,CAAA"}
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import { executeAccess } from '../../auth/executeAccess.js';
|
|
2
|
+
import { branchParentField } from '../../branching/types.js';
|
|
2
3
|
import { combineQueries } from '../../database/combineQueries.js';
|
|
3
4
|
import { validateQueryPaths } from '../../database/queryValidation/validateQueryPaths.js';
|
|
4
5
|
import { validateSortQuery } from '../../database/queryValidation/validateSortQuery.js';
|
|
5
6
|
import { sanitizeWhereQuery } from '../../database/sanitizeWhereQuery.js';
|
|
7
|
+
import { NotFound } from '../../errors/index.js';
|
|
6
8
|
import { afterRead } from '../../fields/hooks/afterRead/index.js';
|
|
7
9
|
import { checkFileAccess } from '../../uploads/checkFileAccess.js';
|
|
8
10
|
import { markHistoricalFileURLs } from '../../uploads/fileVersioning/markHistoricalFileURLs.js';
|
|
9
11
|
import { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js';
|
|
12
|
+
import { hasVersionsEnabled } from '../../utilities/getVersionsConfig.js';
|
|
10
13
|
import { resolveSelect } from '../../utilities/resolveSelect.js';
|
|
11
14
|
import { sanitizeInternalFields } from '../../utilities/sanitizeInternalFields.js';
|
|
12
15
|
import { sanitizeSelect } from '../../utilities/sanitizeSelect.js';
|
|
@@ -26,6 +29,9 @@ export const findVersionsOperation = async (args)=>{
|
|
|
26
29
|
const { collection: { config: collectionConfig }, depth, limit, overrideAccess, page, pagination = true, populate, select: incomingSelect, showHiddenFields, sort, trash = false, where } = args;
|
|
27
30
|
const req = args.req;
|
|
28
31
|
const { fallbackLocale, locale, payload } = req;
|
|
32
|
+
if (!hasVersionsEnabled(collectionConfig)) {
|
|
33
|
+
throw new NotFound(req.t);
|
|
34
|
+
}
|
|
29
35
|
// /////////////////////////////////////
|
|
30
36
|
// Access
|
|
31
37
|
// /////////////////////////////////////
|
|
@@ -195,6 +201,11 @@ export const findVersionsOperation = async (args)=>{
|
|
|
195
201
|
overrideAccess,
|
|
196
202
|
result
|
|
197
203
|
});
|
|
204
|
+
if (!req.context._branchBypass) {
|
|
205
|
+
for (const doc of result.docs){
|
|
206
|
+
Reflect.deleteProperty(doc, branchParentField);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
198
209
|
return result;
|
|
199
210
|
};
|
|
200
211
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/collections/operations/findVersions.ts"],"sourcesContent":["import type { AccessResult } from '../../config/types.js'\nimport type { PaginatedDocs } from '../../database/types.js'\nimport type { PayloadRequest, PopulateType, SelectType, Sort, Where } from '../../types/index.js'\nimport type { TypeWithVersion } from '../../versions/types.js'\nimport type { Collection } from '../config/types.js'\nimport type { FindOptions } from './local/find.js'\n\nimport { executeAccess } from '../../auth/executeAccess.js'\nimport { combineQueries } from '../../database/combineQueries.js'\nimport { validateQueryPaths } from '../../database/queryValidation/validateQueryPaths.js'\nimport { validateSortQuery } from '../../database/queryValidation/validateSortQuery.js'\nimport { sanitizeWhereQuery } from '../../database/sanitizeWhereQuery.js'\nimport { afterRead } from '../../fields/hooks/afterRead/index.js'\nimport { checkFileAccess } from '../../uploads/checkFileAccess.js'\nimport { markHistoricalFileURLs } from '../../uploads/fileVersioning/markHistoricalFileURLs.js'\nimport { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js'\nimport { resolveSelect } from '../../utilities/resolveSelect.js'\nimport { sanitizeInternalFields } from '../../utilities/sanitizeInternalFields.js'\nimport { sanitizeSelect } from '../../utilities/sanitizeSelect.js'\nimport { buildVersionCollectionFields } from '../../versions/buildCollectionFields.js'\nimport { buildAfterOperation } from './utilities/buildAfterOperation.js'\nimport { buildBeforeOperation } from './utilities/buildBeforeOperation.js'\n\nexport type Arguments = {\n collection: Collection\n depth?: number\n limit?: number\n overrideAccess?: boolean\n page?: number\n pagination?: boolean\n populate?: PopulateType\n req?: PayloadRequest\n showHiddenFields?: boolean\n sort?: Sort\n trash?: boolean\n where?: Where\n} & Pick<FindOptions<string, SelectType>, 'select'>\n\nexport const findVersionsOperation = async <TData extends TypeWithVersion<TData>>(\n args: Arguments,\n): Promise<PaginatedDocs<TData>> => {\n // /////////////////////////////////////\n // beforeOperation - Collection\n // /////////////////////////////////////\n\n args = await buildBeforeOperation({\n args,\n collection: args.collection.config,\n operation: 'findVersions',\n overrideAccess: args.overrideAccess!,\n })\n\n const {\n collection: { config: collectionConfig },\n depth,\n limit,\n overrideAccess,\n page,\n pagination = true,\n populate,\n select: incomingSelect,\n showHiddenFields,\n sort,\n trash = false,\n where,\n } = args\n\n const req = args.req!\n const { fallbackLocale, locale, payload } = req\n\n // /////////////////////////////////////\n // Access\n // /////////////////////////////////////\n\n let accessResults!: AccessResult\n\n if (!overrideAccess) {\n accessResults = await executeAccess(\n { slug: collectionConfig.slug, req },\n collectionConfig.access.readVersions,\n )\n }\n\n const versionFields = buildVersionCollectionFields(payload.config, collectionConfig, true)\n\n await validateQueryPaths({\n collectionConfig,\n overrideAccess: overrideAccess!,\n req,\n versionFields,\n where: where!,\n })\n\n await validateSortQuery({\n collectionConfig,\n overrideAccess: overrideAccess!,\n req,\n sort,\n versionFields,\n })\n\n let fullWhere = combineQueries(where!, accessResults)\n\n // Exclude trashed documents when trash: false\n fullWhere = appendNonTrashedFilter({\n deletedAtPath: 'version.deletedAt',\n enableTrash: collectionConfig.trash,\n trash,\n where: fullWhere,\n })\n\n sanitizeWhereQuery({ fields: versionFields, payload, where: fullWhere })\n\n const select = sanitizeSelect({\n fields: versionFields,\n select: resolveSelect({\n config: collectionConfig.select,\n operation: 'read',\n req,\n select: incomingSelect,\n }),\n versions: true,\n })\n\n // /////////////////////////////////////\n // Find\n // /////////////////////////////////////\n\n const usePagination = pagination && limit !== 0\n const sanitizedLimit = limit ?? (usePagination ? 10 : 0)\n const sanitizedPage = page || 1\n\n const paginatedDocs = await payload.db.findVersions<TData>({\n collection: collectionConfig.slug,\n limit: sanitizedLimit,\n locale: locale!,\n page: sanitizedPage,\n pagination,\n req,\n select,\n sort,\n where: fullWhere,\n })\n\n if (collectionConfig.upload && !overrideAccess) {\n for (const row of paginatedDocs.docs) {\n const filename = (row.version as Record<string, unknown>)?.filename\n\n await checkFileAccess({\n collection: args.collection,\n documentID: row.parent,\n filename: typeof filename === 'string' ? filename : '',\n req,\n })\n }\n }\n\n // /////////////////////////////////////\n // beforeRead - Collection\n // /////////////////////////////////////\n let result: PaginatedDocs<TData> = paginatedDocs as unknown as PaginatedDocs<TData>\n result.docs = (await Promise.all(\n paginatedDocs.docs.map(async (doc) => {\n const docRef = doc\n // Fallback if not selected\n if (!docRef.version) {\n ;(docRef as any).version = {}\n }\n\n if (collectionConfig.hooks?.beforeRead?.length) {\n for (const hook of collectionConfig.hooks.beforeRead) {\n docRef.version =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n doc: docRef.version,\n overrideAccess,\n query: fullWhere,\n req,\n })) || docRef.version\n }\n }\n\n return docRef\n }),\n )) as TData[]\n // /////////////////////////////////////\n // afterRead - Fields\n // /////////////////////////////////////\n\n result.docs = await Promise.all(\n result.docs.map(async (data) => {\n data.version = await afterRead({\n collection: collectionConfig,\n context: req.context,\n depth: depth!,\n doc: data.version,\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n draft: undefined,\n fallbackLocale: fallbackLocale!,\n findMany: true,\n global: null,\n locale: locale!,\n overrideAccess: overrideAccess!,\n populate,\n req,\n select: typeof select?.version === 'object' ? select.version : undefined,\n showHiddenFields: showHiddenFields!,\n })\n return data\n }),\n )\n\n // /////////////////////////////////////\n // afterRead - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks.afterRead?.length) {\n result.docs = await Promise.all(\n result.docs.map(async (doc) => {\n const docRef = doc\n\n for (const hook of collectionConfig.hooks.afterRead) {\n docRef.version =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n doc: doc.version,\n findMany: true,\n overrideAccess,\n query: fullWhere,\n req,\n })) || doc.version\n }\n\n return docRef\n }),\n )\n }\n\n if (collectionConfig.upload) {\n result.docs = result.docs.map((row) => ({\n ...row,\n version: markHistoricalFileURLs({\n collectionSlug: collectionConfig.slug,\n doc: row.version as Record<string, unknown>,\n req,\n versionID: row.id,\n }) as TData,\n }))\n }\n\n // /////////////////////////////////////\n // Return results\n // /////////////////////////////////////\n result.docs = result.docs.map((doc) => sanitizeInternalFields<TData>(doc))\n\n // /////////////////////////////////////\n // afterOperation - Collection\n // /////////////////////////////////////\n\n result = await buildAfterOperation({\n args,\n collection: collectionConfig,\n operation: 'findVersions',\n overrideAccess,\n result,\n })\n\n return result\n}\n"],"names":["executeAccess","combineQueries","validateQueryPaths","validateSortQuery","sanitizeWhereQuery","afterRead","checkFileAccess","markHistoricalFileURLs","appendNonTrashedFilter","resolveSelect","sanitizeInternalFields","sanitizeSelect","buildVersionCollectionFields","buildAfterOperation","buildBeforeOperation","findVersionsOperation","args","collection","config","operation","overrideAccess","collectionConfig","depth","limit","page","pagination","populate","select","incomingSelect","showHiddenFields","sort","trash","where","req","fallbackLocale","locale","payload","accessResults","slug","access","readVersions","versionFields","fullWhere","deletedAtPath","enableTrash","fields","versions","usePagination","sanitizedLimit","sanitizedPage","paginatedDocs","db","findVersions","upload","row","docs","filename","version","documentID","parent","result","Promise","all","map","doc","docRef","hooks","beforeRead","length","hook","context","query","data","draft","undefined","findMany","global","collectionSlug","versionID","id"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/collections/operations/findVersions.ts"],"sourcesContent":["import type { AccessResult } from '../../config/types.js'\nimport type { PaginatedDocs } from '../../database/types.js'\nimport type { PayloadRequest, PopulateType, SelectType, Sort, Where } from '../../types/index.js'\nimport type { TypeWithVersion } from '../../versions/types.js'\nimport type { Collection } from '../config/types.js'\nimport type { FindOptions } from './local/find.js'\n\nimport { executeAccess } from '../../auth/executeAccess.js'\nimport { branchParentField } from '../../branching/types.js'\nimport { combineQueries } from '../../database/combineQueries.js'\nimport { validateQueryPaths } from '../../database/queryValidation/validateQueryPaths.js'\nimport { validateSortQuery } from '../../database/queryValidation/validateSortQuery.js'\nimport { sanitizeWhereQuery } from '../../database/sanitizeWhereQuery.js'\nimport { NotFound } from '../../errors/index.js'\nimport { afterRead } from '../../fields/hooks/afterRead/index.js'\nimport { checkFileAccess } from '../../uploads/checkFileAccess.js'\nimport { markHistoricalFileURLs } from '../../uploads/fileVersioning/markHistoricalFileURLs.js'\nimport { appendNonTrashedFilter } from '../../utilities/appendNonTrashedFilter.js'\nimport { hasVersionsEnabled } from '../../utilities/getVersionsConfig.js'\nimport { resolveSelect } from '../../utilities/resolveSelect.js'\nimport { sanitizeInternalFields } from '../../utilities/sanitizeInternalFields.js'\nimport { sanitizeSelect } from '../../utilities/sanitizeSelect.js'\nimport { buildVersionCollectionFields } from '../../versions/buildCollectionFields.js'\nimport { buildAfterOperation } from './utilities/buildAfterOperation.js'\nimport { buildBeforeOperation } from './utilities/buildBeforeOperation.js'\n\nexport type Arguments = {\n collection: Collection\n depth?: number\n limit?: number\n overrideAccess?: boolean\n page?: number\n pagination?: boolean\n populate?: PopulateType\n req?: PayloadRequest\n showHiddenFields?: boolean\n sort?: Sort\n trash?: boolean\n where?: Where\n} & Pick<FindOptions<string, SelectType>, 'select'>\n\nexport const findVersionsOperation = async <TData extends TypeWithVersion<TData>>(\n args: Arguments,\n): Promise<PaginatedDocs<TData>> => {\n // /////////////////////////////////////\n // beforeOperation - Collection\n // /////////////////////////////////////\n\n args = await buildBeforeOperation({\n args,\n collection: args.collection.config,\n operation: 'findVersions',\n overrideAccess: args.overrideAccess!,\n })\n\n const {\n collection: { config: collectionConfig },\n depth,\n limit,\n overrideAccess,\n page,\n pagination = true,\n populate,\n select: incomingSelect,\n showHiddenFields,\n sort,\n trash = false,\n where,\n } = args\n\n const req = args.req!\n const { fallbackLocale, locale, payload } = req\n\n if (!hasVersionsEnabled(collectionConfig)) {\n throw new NotFound(req.t)\n }\n\n // /////////////////////////////////////\n // Access\n // /////////////////////////////////////\n\n let accessResults!: AccessResult\n\n if (!overrideAccess) {\n accessResults = await executeAccess(\n { slug: collectionConfig.slug, req },\n collectionConfig.access.readVersions,\n )\n }\n\n const versionFields = buildVersionCollectionFields(payload.config, collectionConfig, true)\n\n await validateQueryPaths({\n collectionConfig,\n overrideAccess: overrideAccess!,\n req,\n versionFields,\n where: where!,\n })\n\n await validateSortQuery({\n collectionConfig,\n overrideAccess: overrideAccess!,\n req,\n sort,\n versionFields,\n })\n\n let fullWhere = combineQueries(where!, accessResults)\n\n // Exclude trashed documents when trash: false\n fullWhere = appendNonTrashedFilter({\n deletedAtPath: 'version.deletedAt',\n enableTrash: collectionConfig.trash,\n trash,\n where: fullWhere,\n })\n\n sanitizeWhereQuery({ fields: versionFields, payload, where: fullWhere })\n\n const select = sanitizeSelect({\n fields: versionFields,\n select: resolveSelect({\n config: collectionConfig.select,\n operation: 'read',\n req,\n select: incomingSelect,\n }),\n versions: true,\n })\n\n // /////////////////////////////////////\n // Find\n // /////////////////////////////////////\n\n const usePagination = pagination && limit !== 0\n const sanitizedLimit = limit ?? (usePagination ? 10 : 0)\n const sanitizedPage = page || 1\n\n const paginatedDocs = await payload.db.findVersions<TData>({\n collection: collectionConfig.slug,\n limit: sanitizedLimit,\n locale: locale!,\n page: sanitizedPage,\n pagination,\n req,\n select,\n sort,\n where: fullWhere,\n })\n\n if (collectionConfig.upload && !overrideAccess) {\n for (const row of paginatedDocs.docs) {\n const filename = (row.version as Record<string, unknown>)?.filename\n\n await checkFileAccess({\n collection: args.collection,\n documentID: row.parent,\n filename: typeof filename === 'string' ? filename : '',\n req,\n })\n }\n }\n\n // /////////////////////////////////////\n // beforeRead - Collection\n // /////////////////////////////////////\n let result: PaginatedDocs<TData> = paginatedDocs as unknown as PaginatedDocs<TData>\n result.docs = (await Promise.all(\n paginatedDocs.docs.map(async (doc) => {\n const docRef = doc\n // Fallback if not selected\n if (!docRef.version) {\n ;(docRef as any).version = {}\n }\n\n if (collectionConfig.hooks?.beforeRead?.length) {\n for (const hook of collectionConfig.hooks.beforeRead) {\n docRef.version =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n doc: docRef.version,\n overrideAccess,\n query: fullWhere,\n req,\n })) || docRef.version\n }\n }\n\n return docRef\n }),\n )) as TData[]\n // /////////////////////////////////////\n // afterRead - Fields\n // /////////////////////////////////////\n\n result.docs = await Promise.all(\n result.docs.map(async (data) => {\n data.version = await afterRead({\n collection: collectionConfig,\n context: req.context,\n depth: depth!,\n doc: data.version,\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n draft: undefined,\n fallbackLocale: fallbackLocale!,\n findMany: true,\n global: null,\n locale: locale!,\n overrideAccess: overrideAccess!,\n populate,\n req,\n select: typeof select?.version === 'object' ? select.version : undefined,\n showHiddenFields: showHiddenFields!,\n })\n return data\n }),\n )\n\n // /////////////////////////////////////\n // afterRead - Collection\n // /////////////////////////////////////\n\n if (collectionConfig.hooks.afterRead?.length) {\n result.docs = await Promise.all(\n result.docs.map(async (doc) => {\n const docRef = doc\n\n for (const hook of collectionConfig.hooks.afterRead) {\n docRef.version =\n (await hook({\n collection: collectionConfig,\n context: req.context,\n doc: doc.version,\n findMany: true,\n overrideAccess,\n query: fullWhere,\n req,\n })) || doc.version\n }\n\n return docRef\n }),\n )\n }\n\n if (collectionConfig.upload) {\n result.docs = result.docs.map((row) => ({\n ...row,\n version: markHistoricalFileURLs({\n collectionSlug: collectionConfig.slug,\n doc: row.version,\n req,\n versionID: row.id,\n }),\n }))\n }\n\n // /////////////////////////////////////\n // Return results\n // /////////////////////////////////////\n result.docs = result.docs.map((doc) => sanitizeInternalFields<TData>(doc))\n\n // /////////////////////////////////////\n // afterOperation - Collection\n // /////////////////////////////////////\n\n result = await buildAfterOperation({\n args,\n collection: collectionConfig,\n operation: 'findVersions',\n overrideAccess,\n result,\n })\n\n if (!req.context._branchBypass) {\n for (const doc of result.docs) {\n Reflect.deleteProperty(doc, branchParentField)\n }\n }\n\n return result\n}\n"],"names":["executeAccess","branchParentField","combineQueries","validateQueryPaths","validateSortQuery","sanitizeWhereQuery","NotFound","afterRead","checkFileAccess","markHistoricalFileURLs","appendNonTrashedFilter","hasVersionsEnabled","resolveSelect","sanitizeInternalFields","sanitizeSelect","buildVersionCollectionFields","buildAfterOperation","buildBeforeOperation","findVersionsOperation","args","collection","config","operation","overrideAccess","collectionConfig","depth","limit","page","pagination","populate","select","incomingSelect","showHiddenFields","sort","trash","where","req","fallbackLocale","locale","payload","t","accessResults","slug","access","readVersions","versionFields","fullWhere","deletedAtPath","enableTrash","fields","versions","usePagination","sanitizedLimit","sanitizedPage","paginatedDocs","db","findVersions","upload","row","docs","filename","version","documentID","parent","result","Promise","all","map","doc","docRef","hooks","beforeRead","length","hook","context","query","data","draft","undefined","findMany","global","collectionSlug","versionID","id","_branchBypass","Reflect","deleteProperty"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/collections/operations/local/findDistinct.ts"],"sourcesContent":["import type {\n CollectionSlug,\n DataFromCollectionSlug,\n PaginatedDistinctDocs,\n Payload,\n PayloadRequest,\n PopulateType,\n RequestContext,\n Sort,\n TypedLocale,\n User,\n Where,\n} from '../../../index.js'\nimport type { SharedLocalAPIOptions } from '../../../types/operations.js'\nimport type { CreatePayloadRequestArgs } from '../../../utilities/createPayloadRequest.js'\n\nimport { APIError, createPayloadRequest } from '../../../index.js'\nimport { findDistinctOperation } from '../findDistinct.js'\n\nexport type Options<\n TSlug extends CollectionSlug,\n TField extends keyof DataFromCollectionSlug<TSlug>,\n> = {\n /**\n * Read against a specific content branch instead of resolving one from the\n * request. `false` bypasses branching entirely.\n */\n branch?: false | string\n /**\n * the Collection slug to operate against.\n */\n collection: TSlug\n /**\n * [Context](https://payloadcms.com/docs/hooks/context), which will then be passed to `context` and `req.context`,\n * which can be read by hooks. Useful if you want to pass additional information to the hooks which\n * shouldn't be necessarily part of the document, for example a `triggerBeforeChange` option which can be read by the BeforeChange hook\n * to determine if it should run or not.\n */\n context?: RequestContext\n /**\n * [Control auto-population](https://payloadcms.com/docs/queries/depth) of nested relationship and upload fields.\n */\n depth?: number\n /**\n * When set to `true`, errors will not be thrown.\n */\n disableErrors?: boolean\n /**\n * The field to get distinct values for\n */\n field: ({} & string) | TField\n /**\n * The maximum distinct field values to be returned.\n * By default the operation returns all the values.\n */\n limit?: number\n /**\n * Specify [locale](https://payloadcms.com/docs/configuration/localization) for any returned documents.\n */\n locale?: 'all' | TypedLocale\n /**\n * Get a specific page number (if limit is specified)\n * @default 1\n */\n page?: number\n /**\n * Specify [populate](https://payloadcms.com/docs/queries/select#populate) to control which fields to include to the result from populated documents.\n */\n populate?: PopulateType\n /**\n * The `PayloadRequest` object. You can pass it to thread the current [transaction](https://payloadcms.com/docs/database/transactions), user and locale to the operation.\n * Recommended to pass when using the Local API from hooks, as usually you want to execute the operation within the current transaction.\n */\n req?: Partial<PayloadRequest>\n /**\n * Opt-in to receiving hidden fields. By default, they are hidden from returned documents in accordance to your config.\n * @default false\n */\n showHiddenFields?: boolean\n /**\n * Sort the documents, can be a string or an array of strings\n * @example '-createdAt' // Sort DESC by createdAt\n * @example ['group', '-createdAt'] // sort by 2 fields, ASC group and DESC createdAt\n */\n sort?: Sort\n /**\n * When set to `true`, the query will include both normal and trashed documents.\n * To query only trashed documents, pass `trash: true` and combine with a `where` clause filtering by `deletedAt`.\n * By default (`false`), the query will only include normal documents and exclude those with a `deletedAt` field.\n *\n * This argument has no effect unless `trash` is enabled on the collection.\n * @default false\n */\n trash?: boolean\n /**\n * If you set `overrideAccess` to `false`, you can pass a user to use against the access control checks.\n */\n user?: null | User\n /**\n * A filter [query](https://payloadcms.com/docs/queries/overview)\n */\n where?: Where\n} & Pick<SharedLocalAPIOptions, 'overrideAccess'>\n\nexport async function findDistinct<\n TSlug extends CollectionSlug,\n TField extends keyof DataFromCollectionSlug<TSlug> & string,\n>(\n payload: Payload,\n options: Options<TSlug, TField>,\n): Promise<PaginatedDistinctDocs<Record<TField, DataFromCollectionSlug<TSlug>[TField]>>> {\n const {\n collection: collectionSlug,\n depth = 0,\n disableErrors,\n field,\n limit,\n overrideAccess = false,\n page,\n populate,\n showHiddenFields,\n sort,\n trash = false,\n where,\n } = options\n const collection = payload.collections[collectionSlug]\n\n if (!collection) {\n throw new APIError(\n `The collection with slug ${String(collectionSlug)} can't be found. Find Operation.`,\n )\n }\n\n return findDistinctOperation({\n collection,\n depth,\n disableErrors,\n field,\n limit,\n overrideAccess,\n page,\n populate,\n req: await createPayloadRequest({\n ...(options as Omit<CreatePayloadRequestArgs, 'payload'>),\n payload,\n }),\n showHiddenFields,\n sort,\n trash,\n where,\n })
|
|
1
|
+
{"version":3,"sources":["../../../../src/collections/operations/local/findDistinct.ts"],"sourcesContent":["import type {\n CollectionSlug,\n DataFromCollectionSlug,\n PaginatedDistinctDocs,\n Payload,\n PayloadRequest,\n PopulateType,\n RequestContext,\n Sort,\n TypedLocale,\n User,\n Where,\n} from '../../../index.js'\nimport type { SharedLocalAPIOptions } from '../../../types/operations.js'\nimport type { CreatePayloadRequestArgs } from '../../../utilities/createPayloadRequest.js'\n\nimport { APIError, createPayloadRequest } from '../../../index.js'\nimport { findDistinctOperation } from '../findDistinct.js'\n\nexport type Options<\n TSlug extends CollectionSlug,\n TField extends keyof DataFromCollectionSlug<TSlug>,\n> = {\n /**\n * Read against a specific content branch instead of resolving one from the\n * request. `false` bypasses branching entirely.\n */\n branch?: false | string\n /**\n * the Collection slug to operate against.\n */\n collection: TSlug\n /**\n * [Context](https://payloadcms.com/docs/hooks/context), which will then be passed to `context` and `req.context`,\n * which can be read by hooks. Useful if you want to pass additional information to the hooks which\n * shouldn't be necessarily part of the document, for example a `triggerBeforeChange` option which can be read by the BeforeChange hook\n * to determine if it should run or not.\n */\n context?: RequestContext\n /**\n * [Control auto-population](https://payloadcms.com/docs/queries/depth) of nested relationship and upload fields.\n */\n depth?: number\n /**\n * When set to `true`, errors will not be thrown.\n */\n disableErrors?: boolean\n /**\n * The field to get distinct values for\n */\n field: ({} & string) | TField\n /**\n * The maximum distinct field values to be returned.\n * By default the operation returns all the values.\n */\n limit?: number\n /**\n * Specify [locale](https://payloadcms.com/docs/configuration/localization) for any returned documents.\n */\n locale?: 'all' | TypedLocale\n /**\n * Get a specific page number (if limit is specified)\n * @default 1\n */\n page?: number\n /**\n * Specify [populate](https://payloadcms.com/docs/queries/select#populate) to control which fields to include to the result from populated documents.\n */\n populate?: PopulateType\n /**\n * The `PayloadRequest` object. You can pass it to thread the current [transaction](https://payloadcms.com/docs/database/transactions), user and locale to the operation.\n * Recommended to pass when using the Local API from hooks, as usually you want to execute the operation within the current transaction.\n */\n req?: Partial<PayloadRequest>\n /**\n * Opt-in to receiving hidden fields. By default, they are hidden from returned documents in accordance to your config.\n * @default false\n */\n showHiddenFields?: boolean\n /**\n * Sort the documents, can be a string or an array of strings\n * @example '-createdAt' // Sort DESC by createdAt\n * @example ['group', '-createdAt'] // sort by 2 fields, ASC group and DESC createdAt\n */\n sort?: Sort\n /**\n * When set to `true`, the query will include both normal and trashed documents.\n * To query only trashed documents, pass `trash: true` and combine with a `where` clause filtering by `deletedAt`.\n * By default (`false`), the query will only include normal documents and exclude those with a `deletedAt` field.\n *\n * This argument has no effect unless `trash` is enabled on the collection.\n * @default false\n */\n trash?: boolean\n /**\n * If you set `overrideAccess` to `false`, you can pass a user to use against the access control checks.\n */\n user?: null | User\n /**\n * A filter [query](https://payloadcms.com/docs/queries/overview)\n */\n where?: Where\n} & Pick<SharedLocalAPIOptions, 'overrideAccess'>\n\nexport async function findDistinct<\n TSlug extends CollectionSlug,\n TField extends keyof DataFromCollectionSlug<TSlug> & string,\n>(\n payload: Payload,\n options: Options<TSlug, TField>,\n): Promise<PaginatedDistinctDocs<Record<TField, DataFromCollectionSlug<TSlug>[TField]>>> {\n const {\n collection: collectionSlug,\n depth = 0,\n disableErrors,\n field,\n limit,\n overrideAccess = false,\n page,\n populate,\n showHiddenFields,\n sort,\n trash = false,\n where,\n } = options\n const collection = payload.collections[collectionSlug]\n\n if (!collection) {\n throw new APIError(\n `The collection with slug ${String(collectionSlug)} can't be found. Find Operation.`,\n )\n }\n\n return findDistinctOperation({\n collection,\n depth,\n disableErrors,\n field,\n limit,\n overrideAccess,\n page,\n populate,\n req: await createPayloadRequest({\n ...(options as Omit<CreatePayloadRequestArgs, 'payload'>),\n payload,\n }),\n showHiddenFields,\n sort,\n trash,\n where,\n })\n}\n"],"names":["APIError","createPayloadRequest","findDistinctOperation","findDistinct","payload","options","collection","collectionSlug","depth","disableErrors","field","limit","overrideAccess","page","populate","showHiddenFields","sort","trash","where","collections","String","req"],"mappings":"AAgBA,SAASA,QAAQ,EAAEC,oBAAoB,QAAQ,oBAAmB;AAClE,SAASC,qBAAqB,QAAQ,qBAAoB;AAuF1D,OAAO,eAAeC,aAIpBC,OAAgB,EAChBC,OAA+B;IAE/B,MAAM,EACJC,YAAYC,cAAc,EAC1BC,QAAQ,CAAC,EACTC,aAAa,EACbC,KAAK,EACLC,KAAK,EACLC,iBAAiB,KAAK,EACtBC,IAAI,EACJC,QAAQ,EACRC,gBAAgB,EAChBC,IAAI,EACJC,QAAQ,KAAK,EACbC,KAAK,EACN,GAAGb;IACJ,MAAMC,aAAaF,QAAQe,WAAW,CAACZ,eAAe;IAEtD,IAAI,CAACD,YAAY;QACf,MAAM,IAAIN,SACR,CAAC,yBAAyB,EAAEoB,OAAOb,gBAAgB,gCAAgC,CAAC;IAExF;IAEA,OAAOL,sBAAsB;QAC3BI;QACAE;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAO,KAAK,MAAMpB,qBAAqB;YAC9B,GAAII,OAAO;YACXD;QACF;QACAW;QACAC;QACAC;QACAC;IACF;AACF"}
|
|
@@ -229,7 +229,7 @@ import { updateDocument } from './utilities/update.js';
|
|
|
229
229
|
autosave: false,
|
|
230
230
|
collectionConfig: collection.config,
|
|
231
231
|
config: req.payload.config,
|
|
232
|
-
data
|
|
232
|
+
data,
|
|
233
233
|
depth: args.depth ?? 0,
|
|
234
234
|
docWithLocales: stored,
|
|
235
235
|
draftArg: draft,
|
|
@@ -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":"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"}
|
|
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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"}
|