payload 4.0.0-beta.3 → 4.0.0-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/adapters/router.d.ts +1 -1
- package/dist/admin/adapters/router.d.ts.map +1 -1
- package/dist/admin/adapters/router.js.map +1 -1
- package/dist/admin/initAdminContext.js.map +1 -1
- package/dist/auth/getFieldsToSign.js.map +1 -1
- package/dist/auth/loginWithCookie.js.map +1 -1
- package/dist/auth/serverFunctions/cookies.js.map +1 -1
- package/dist/auth/serverFunctions/login.js.map +1 -1
- package/dist/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/operations/findByID.js.map +1 -1
- package/dist/collections/operations/findVersionByID.js.map +1 -1
- package/dist/collections/operations/findVersions.js.map +1 -1
- package/dist/collections/operations/local/findDistinct.js.map +1 -1
- package/dist/collections/operations/renameFile.js +1 -1
- package/dist/collections/operations/renameFile.js.map +1 -1
- package/dist/collections/operations/utilities/update.js +1 -1
- package/dist/collections/operations/utilities/update.js.map +1 -1
- package/dist/collections/operations/validate.js +4 -4
- package/dist/collections/operations/validate.js.map +1 -1
- package/dist/config/definePlugin.js.map +1 -1
- package/dist/config/sanitize.js +2 -2
- package/dist/config/sanitize.js.map +1 -1
- package/dist/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/hooks/afterChange/promise.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/operations/local/findOne.js.map +1 -1
- package/dist/globals/operations/local/update.js.map +1 -1
- package/dist/globals/operations/restoreVersion.d.ts +2 -3
- package/dist/globals/operations/restoreVersion.d.ts.map +1 -1
- package/dist/globals/operations/restoreVersion.js +22 -15
- package/dist/globals/operations/restoreVersion.js.map +1 -1
- package/dist/globals/operations/validate.js +1 -1
- package/dist/globals/operations/validate.js.map +1 -1
- package/dist/hierarchy/createFolderField.js.map +1 -1
- package/dist/hierarchy/resolveHierarchyCollections.js +2 -2
- package/dist/hierarchy/resolveHierarchyCollections.js.map +1 -1
- package/dist/hierarchy/utils/computePaths.d.ts.map +1 -1
- package/dist/hierarchy/utils/computePaths.js.map +1 -1
- package/dist/index.bundled.d.ts +12 -3
- package/dist/queues/operations/runJobs/runJob/getRunTaskFunction.js +1 -1
- package/dist/queues/operations/runJobs/runJob/getRunTaskFunction.js.map +1 -1
- package/dist/uploads/fileVersioning/archive.js.map +1 -1
- package/dist/uploads/fileVersioning/resolveHistoricalFile.js.map +1 -1
- package/dist/uploads/generateFileData.d.ts.map +1 -1
- package/dist/uploads/generateFileData.js.map +1 -1
- package/dist/uploads/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/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/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/featureInfo/getFeatureInfo.js.map +1 -1
- package/dist/versions/allLocalesPublicationStatus.js.map +1 -1
- package/package.json +11 -9
- package/skills/payload/reference/PLUGIN-DEVELOPMENT.md +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/fields/validations.ts"],"sourcesContent":["import { validateJSONSchema } from '#validateJSONSchema'\nimport ObjectIdImport from 'bson-objectid'\n\nconst ObjectId = 'default' in ObjectIdImport ? ObjectIdImport.default : ObjectIdImport\n\nimport type { TFunction } from '@payloadcms/translations'\n\nimport type { RichTextAdapter } from '../admin/types.js'\nimport type { CollectionSlug } from '../index.js'\nimport type { Where } from '../types/index.js'\nimport type {\n ArrayField,\n BlocksField,\n CheckboxField,\n CodeField,\n DateField,\n EmailField,\n JSONField,\n NumberField,\n PointField,\n RadioField,\n RelationshipField,\n RelationshipValue,\n RelationshipValueMany,\n RelationshipValueSingle,\n RichTextField,\n SelectField,\n SlugField,\n TextareaField,\n TextField,\n UploadField,\n Validate,\n ValueWithRelation,\n} from './config/types.js'\n\nimport { isNumber } from '../utilities/isNumber.js'\nimport { isValidID } from '../utilities/isValidID.js'\n\nexport type TextFieldValidation = Validate<string, unknown, unknown, TextField>\n\nexport type TextFieldManyValidation = Validate<string[], unknown, unknown, TextField>\n\nexport type TextFieldSingleValidation = Validate<string, unknown, unknown, TextField>\n\nexport const text: TextFieldValidation = (\n value,\n {\n hasMany,\n maxLength: fieldMaxLength,\n maxRows,\n minLength,\n minRows,\n req: {\n payload: { config },\n t,\n },\n required,\n },\n) => {\n let maxLength!: number\n\n if (!required) {\n if (value === undefined || value === null) {\n return true\n }\n }\n\n if (hasMany === true) {\n const lengthValidationResult = validateArrayLength(value, { maxRows, minRows, required, t })\n if (typeof lengthValidationResult === 'string') {\n return lengthValidationResult\n }\n }\n\n if (typeof config?.defaultMaxTextLength === 'number') {\n maxLength = config.defaultMaxTextLength\n }\n if (typeof fieldMaxLength === 'number') {\n maxLength = fieldMaxLength\n }\n\n const stringsToValidate: string[] = Array.isArray(value) ? value : [value!]\n\n for (const stringValue of stringsToValidate) {\n const length = stringValue?.length || 0\n\n if (typeof maxLength === 'number' && length > maxLength) {\n return t('validation:shorterThanMax', { label: t('general:value'), maxLength, stringValue })\n }\n\n if (typeof minLength === 'number' && length < minLength) {\n return t('validation:longerThanMin', { label: t('general:value'), minLength, stringValue })\n }\n }\n\n if (required) {\n if (!value || ((typeof value === 'string' || Array.isArray(value)) && value.length === 0)) {\n return t('validation:required')\n }\n }\n\n return true\n}\n\nexport type SlugFieldValidation = Validate<string, unknown, unknown, SlugField>\n\n// A slug is always populated by the field's hooks (source-derived or the `<singular>-<N>` fallback),\n// so an empty value is never a user error — `required` only drives the admin asterisk. Uniqueness is\n// enforced in the field's `beforeChange` hook (see generateSlug) rather than here, because draft\n// saves skip validation but still run hooks.\nexport const slug: SlugFieldValidation = () => true\n\nexport type PasswordFieldValidation = Validate<string, unknown, unknown, TextField>\n\nexport const password: PasswordFieldValidation = (\n value,\n {\n maxLength: fieldMaxLength,\n minLength = 3,\n req: {\n payload: { config },\n t,\n },\n required,\n },\n) => {\n let maxLength!: number\n\n if (typeof config?.defaultMaxTextLength === 'number') {\n maxLength = config.defaultMaxTextLength\n }\n if (typeof fieldMaxLength === 'number') {\n maxLength = fieldMaxLength\n }\n\n if (value && maxLength && value.length > maxLength) {\n return t('validation:shorterThanMax', { maxLength })\n }\n\n if (value && minLength && value.length < minLength) {\n return t('validation:longerThanMin', { minLength })\n }\n\n if (required && !value) {\n return t('validation:required')\n }\n\n return true\n}\n\nexport type ConfirmPasswordFieldValidation = Validate<\n string,\n unknown,\n { password: string },\n TextField\n>\n\nexport const confirmPassword: ConfirmPasswordFieldValidation = (\n value,\n { req: { t }, required, siblingData },\n) => {\n if (required && !value) {\n return t('validation:required')\n }\n\n if (value && value !== siblingData.password) {\n return t('fields:passwordsDoNotMatch')\n }\n\n return true\n}\n\nexport type EmailFieldValidation = Validate<string, unknown, { username?: string }, EmailField>\n\nexport const email: EmailFieldValidation = (\n value,\n {\n collectionSlug,\n req: {\n payload: { collections, config },\n t,\n },\n required,\n siblingData,\n },\n) => {\n if (collectionSlug) {\n const collection =\n collections?.[collectionSlug]?.config ??\n config.collections.find(({ slug }) => slug === collectionSlug)! // If this is run on the client, `collections` will be undefined, but `config.collections` will be available\n\n if (\n collection.auth.loginWithUsername &&\n !collection.auth.loginWithUsername?.requireUsername &&\n !collection.auth.loginWithUsername?.requireEmail\n ) {\n if (!value && !siblingData?.username) {\n return t('validation:required')\n }\n }\n }\n\n /**\n * Disallows emails with double quotes (e.g., \"user\"@example.com, user@\"example.com\", \"user@example.com\")\n * Rejects spaces anywhere in the email (e.g., user @example.com, user@ example.com, user name@example.com)\n * Prevents consecutive dots in the local or domain part (e.g., user..name@example.com, user@example..com)\n * Disallows domains that start or end with a hyphen (e.g., user@-example.com, user@example-.com)\n * Allows standard email formats (e.g., user@example.com, user.name+alias@example.co.uk, user-name@example.org)\n * Allows domains with consecutive hyphens as long as they are not leading/trailing (e.g., user@ex--ample.com)\n * Supports multiple subdomains (e.g., user@sub.domain.example.com)\n */\n const emailRegex =\n /^(?!.*\\.\\.)[\\w!#$%&'*+/=?^`{|}~-](?:[\\w!#$%&'*+/=?^`{|}~.-]*[\\w!#$%&'*+/=?^`{|}~-])?@[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)*\\.[a-z]{2,}$/i\n\n if ((value && !emailRegex.test(value)) || (!value && required)) {\n return t('validation:emailAddress')\n }\n\n return true\n}\n\nexport type UsernameFieldValidation = Validate<string, unknown, { email?: string }, TextField>\n\nexport const username: UsernameFieldValidation = (\n value,\n {\n collectionSlug,\n req: {\n payload: { collections, config },\n t,\n },\n required,\n siblingData,\n },\n) => {\n let maxLength!: number\n\n if (collectionSlug) {\n const collection =\n collections?.[collectionSlug]?.config ??\n config.collections.find(({ slug }) => slug === collectionSlug)! // If this is run on the client, `collections` will be undefined, but `config.collections` will be available\n\n if (\n collection.auth.loginWithUsername &&\n !collection.auth.loginWithUsername?.requireUsername &&\n !collection.auth.loginWithUsername?.requireEmail\n ) {\n if (!value && !siblingData?.email) {\n return t('validation:required')\n }\n }\n }\n\n if (typeof config?.defaultMaxTextLength === 'number') {\n maxLength = config.defaultMaxTextLength\n }\n\n if (value && maxLength && value.length > maxLength) {\n return t('validation:shorterThanMax', { maxLength })\n }\n\n if (!value && required) {\n return t('validation:required')\n }\n\n return true\n}\n\nexport type TextareaFieldValidation = Validate<string, unknown, unknown, TextareaField>\n\nexport const textarea: TextareaFieldValidation = (\n value,\n {\n maxLength: fieldMaxLength,\n minLength,\n req: {\n payload: { config },\n t,\n },\n required,\n },\n) => {\n let maxLength!: number\n\n if (typeof config?.defaultMaxTextLength === 'number') {\n maxLength = config.defaultMaxTextLength\n }\n if (typeof fieldMaxLength === 'number') {\n maxLength = fieldMaxLength\n }\n if (value && maxLength && value.length > maxLength) {\n return t('validation:shorterThanMax', { maxLength })\n }\n\n if (value && minLength && value.length < minLength) {\n return t('validation:longerThanMin', { minLength })\n }\n\n if (required && !value) {\n return t('validation:required')\n }\n\n return true\n}\n\nexport type CodeFieldValidation = Validate<string, unknown, unknown, CodeField>\n\nexport const code: CodeFieldValidation = (value, { req: { t }, required }) => {\n if (required && (!value || (typeof value === 'string' && value.length === 0))) {\n return t('validation:required')\n }\n\n return true\n}\n\nexport type JSONFieldValidation = Validate<\n string,\n unknown,\n unknown,\n { jsonError?: string } & JSONField\n>\n\nexport const json: JSONFieldValidation = async (\n value,\n { jsonError, jsonSchema, req: { t }, required },\n) => {\n const isNotEmpty = (value: null | string | undefined) => {\n if (value === undefined || value === null) {\n return false\n }\n\n if (Array.isArray(value) && value.length === 0) {\n return false\n }\n\n if (typeof value === 'object' && Object.keys(value).length === 0) {\n return false\n }\n\n return true\n }\n\n if (required && !value) {\n return t('validation:required')\n }\n\n if (jsonError !== undefined) {\n return t('validation:invalidInput')\n }\n\n if (jsonSchema && isNotEmpty(value)) {\n return validateJSONSchema({ jsonSchema, value })\n }\n return true\n}\n\nexport type CheckboxFieldValidation = Validate<boolean, unknown, unknown, CheckboxField>\n\nexport const checkbox: CheckboxFieldValidation = (value, { req: { t }, required }) => {\n if ((value && typeof value !== 'boolean') || (required && typeof value !== 'boolean')) {\n return t('validation:trueOrFalse')\n }\n\n return true\n}\n\nexport type DateFieldValidation = Validate<Date, unknown, unknown, DateField>\n\nexport const date: DateFieldValidation = (\n value,\n { name, req: { t }, required, siblingData, timezone },\n) => {\n const validDate = value && !isNaN(Date.parse(value.toString()))\n\n // We need to also check for the timezone data based on this field's config\n // We cannot do this inside the timezone field validation as it's visually hidden\n const hasRequiredTimezone = timezone && required\n const selectedTimezone: string = siblingData?.[`${name}_tz` as keyof typeof siblingData]\n // Always resolve to true if the field is not required, as timezone may be optional too then\n const validTimezone = hasRequiredTimezone ? Boolean(selectedTimezone) : true\n\n if (validDate && validTimezone) {\n return true\n }\n\n if (validDate && !validTimezone) {\n return t('validation:timezoneRequired')\n }\n\n if (value) {\n return t('validation:notValidDate', { value })\n }\n\n if (required) {\n return t('validation:required')\n }\n\n return true\n}\n\nexport type RichTextFieldValidation = Validate<object, unknown, unknown, RichTextField>\n\nexport const richText: RichTextFieldValidation = async (value, options) => {\n if (!options?.editor) {\n throw new Error('richText field has no editor property.')\n }\n if (typeof options?.editor === 'function') {\n throw new Error('Attempted to access unsanitized rich text editor.')\n }\n\n const editor: RichTextAdapter = options?.editor\n\n return editor.validate(value, options)\n}\n\nconst validateArrayLength = (\n value: unknown,\n options: {\n maxRows?: number\n minRows?: number\n required?: boolean\n t: TFunction\n },\n) => {\n const { maxRows, minRows, required, t } = options\n\n const arrayLength = Array.isArray(value) ? value.length : (value as number) || 0\n\n if (!required && arrayLength === 0) {\n return true\n }\n\n if (minRows && arrayLength < minRows) {\n return t('validation:requiresAtLeast', { count: minRows, label: t('general:rows') })\n }\n\n if (maxRows && arrayLength > maxRows) {\n return t('validation:requiresNoMoreThan', { count: maxRows, label: t('general:rows') })\n }\n\n if (required && !arrayLength) {\n return t('validation:requiresAtLeast', { count: 1, label: t('general:row') })\n }\n\n return true\n}\n\nexport type NumberFieldValidation = Validate<number | number[], unknown, unknown, NumberField>\n\nexport type NumberFieldManyValidation = Validate<number[], unknown, unknown, NumberField>\n\nexport type NumberFieldSingleValidation = Validate<number, unknown, unknown, NumberField>\n\nexport const number: NumberFieldValidation = (\n value,\n { hasMany, max, maxRows, min, minRows, req: { t }, required },\n) => {\n if (hasMany === true) {\n const lengthValidationResult = validateArrayLength(value, { maxRows, minRows, required, t })\n if (typeof lengthValidationResult === 'string') {\n return lengthValidationResult\n }\n }\n\n if (!value && !isNumber(value)) {\n // if no value is present, validate based on required\n if (required) {\n return t('validation:required')\n }\n if (!required) {\n return true\n }\n }\n\n const numbersToValidate: number[] = Array.isArray(value) ? value : [value!]\n\n for (const number of numbersToValidate) {\n if (!isNumber(number)) {\n return t('validation:enterNumber')\n }\n\n const numberValue = parseFloat(number as unknown as string)\n\n if (typeof max === 'number' && numberValue > max) {\n return t('validation:greaterThanMax', { label: t('general:value'), max, value })\n }\n\n if (typeof min === 'number' && numberValue < min) {\n return t('validation:lessThanMin', { label: t('general:value'), min, value })\n }\n }\n\n return true\n}\n\nexport type ArrayFieldValidation = Validate<unknown[], unknown, unknown, ArrayField>\n\nexport const array: ArrayFieldValidation = (value, { maxRows, minRows, req: { t }, required }) => {\n return validateArrayLength(value, { maxRows, minRows, required, t })\n}\n\nexport type BlocksFieldValidation = Validate<unknown, unknown, unknown, BlocksField>\n\n/**\n * This function validates the blocks in a blocks field against the provided filterOptions.\n * It will return a list of all block slugs found in the value, the allowed block slugs (if any),\n * and a list of invalid block slugs that are used despite being disallowed.\n *\n * @internal - this may break or be removed at any time\n */\nexport async function validateBlocksFilterOptions({\n id,\n data,\n filterOptions,\n req,\n siblingData,\n value,\n}: { value: Parameters<BlocksFieldValidation>[0] } & Pick<\n Parameters<BlocksFieldValidation>[1],\n 'data' | 'filterOptions' | 'id' | 'req' | 'siblingData'\n>): Promise<{\n /**\n * All block slugs found in the value of the blocks field\n */\n allBlockSlugs: string[]\n /**\n * All block slugs that are allowed. If undefined, all blocks are allowed.\n */\n allowedBlockSlugs: string[] | undefined\n /**\n * A list of block slugs that are used despite being disallowed. If undefined, field passed validation.\n */\n invalidBlockSlugs: string[] | undefined\n}> {\n const allBlockSlugs = Array.isArray(value)\n ? (value as Array<{ blockType?: string }>)\n .map((b) => b.blockType)\n .filter((s): s is string => Boolean(s))\n : []\n\n // if undefined => all blocks allowed\n let allowedBlockSlugs: string[] | undefined = undefined\n\n if (typeof filterOptions === 'function') {\n const result = await filterOptions({\n id: id!, // original code asserted presence\n data,\n req,\n siblingData,\n user: req.user,\n })\n if (result !== true && Array.isArray(result)) {\n allowedBlockSlugs = result\n }\n } else if (Array.isArray(filterOptions)) {\n allowedBlockSlugs = filterOptions\n }\n\n const invalidBlockSlugs: string[] = []\n if (allowedBlockSlugs) {\n for (const blockSlug of allBlockSlugs) {\n if (!allowedBlockSlugs.includes(blockSlug)) {\n invalidBlockSlugs.push(blockSlug)\n }\n }\n }\n\n return {\n allBlockSlugs,\n allowedBlockSlugs,\n invalidBlockSlugs,\n }\n}\nexport const blocks: BlocksFieldValidation = async (\n value,\n { id, data, filterOptions, maxRows, minRows, req: { t }, req, required, siblingData },\n) => {\n const lengthValidationResult = validateArrayLength(value, { maxRows, minRows, required, t })\n if (typeof lengthValidationResult === 'string') {\n return lengthValidationResult\n }\n\n if (filterOptions) {\n const { invalidBlockSlugs } = await validateBlocksFilterOptions({\n id,\n data,\n filterOptions,\n req,\n siblingData,\n value,\n })\n if (invalidBlockSlugs?.length) {\n return t('validation:invalidBlocks', { blocks: invalidBlockSlugs.join(', ') })\n }\n }\n\n return true\n}\n\nconst validateFilterOptions: Validate<\n unknown,\n unknown,\n unknown,\n RelationshipField | UploadField\n> = async (\n value,\n {\n id,\n blockData,\n data,\n filterOptions,\n overrideAccess,\n relationTo,\n req,\n req: { t, user },\n siblingData,\n },\n) => {\n if (typeof filterOptions !== 'undefined' && value) {\n const options: {\n [collection: string]: (number | string)[]\n } = {}\n\n const falseCollections: CollectionSlug[] = []\n const collections = !Array.isArray(relationTo) ? [relationTo] : relationTo\n const values = Array.isArray(value) ? value : [value]\n\n for (const collection of collections) {\n try {\n let optionFilter =\n typeof filterOptions === 'function'\n ? await filterOptions({\n id: id!,\n blockData,\n data,\n relationTo: collection,\n req,\n siblingData,\n user,\n })\n : filterOptions\n\n if (optionFilter === true) {\n optionFilter = null\n }\n\n const valueIDs: (number | string)[] = []\n\n values.forEach((val) => {\n if (typeof val === 'object') {\n if (val?.value) {\n valueIDs.push(val.value)\n } else if (ObjectId.isValid(val)) {\n valueIDs.push(new ObjectId(val).toHexString())\n }\n }\n\n if (typeof val === 'string' || typeof val === 'number') {\n valueIDs.push(val)\n }\n })\n\n if (valueIDs.length > 0) {\n const findWhere: Where = {\n and: [{ id: { in: valueIDs } }],\n }\n\n // @ts-expect-error - I don't understand why optionFilter is inferred as `false | Where | null` instead of `boolean | Where | null`\n if (optionFilter && optionFilter !== true) {\n findWhere.and?.push(optionFilter)\n }\n\n if (optionFilter === false) {\n falseCollections.push(collection)\n }\n\n const result = await req.payloadDataLoader.find({\n collection,\n depth: 0,\n disableErrors: true,\n limit: 0,\n overrideAccess: overrideAccess ?? false,\n pagination: false,\n req,\n where: findWhere,\n })\n\n options[collection] = result.docs.map((doc) => doc.id)\n } else {\n options[collection] = []\n }\n } catch (err) {\n req.payload.logger.error({\n err,\n msg: `Error validating filter options for collection ${collection}`,\n })\n options[collection] = []\n }\n }\n\n const invalidRelationships = values.filter((val) => {\n let collection: string\n let requestedID: number | string\n\n if (typeof relationTo === 'string') {\n collection = relationTo\n\n if (typeof val === 'string' || typeof val === 'number') {\n requestedID = val\n }\n\n if (typeof val === 'object' && ObjectId.isValid(val)) {\n requestedID = new ObjectId(val).toHexString()\n }\n }\n\n if (Array.isArray(relationTo) && typeof val === 'object' && val?.relationTo) {\n collection = val.relationTo\n requestedID = val.value\n }\n\n if (falseCollections.find((slug) => relationTo === slug)) {\n return true\n }\n\n if (!options[collection!]) {\n return true\n }\n\n return options[collection!]!.indexOf(requestedID!) === -1\n })\n\n if (invalidRelationships.length > 0) {\n return invalidRelationships.reduce((err, invalid, i) => {\n return `${err} ${JSON.stringify(invalid)}${\n invalidRelationships.length === i + 1 ? ',' : ''\n } `\n }, t('validation:invalidSelections')) as string\n }\n\n return true\n }\n\n return true\n}\n\nexport type UploadFieldValidation = Validate<unknown, unknown, unknown, UploadField>\n\nexport type UploadFieldManyValidation = Validate<unknown[], unknown, unknown, UploadField>\n\nexport type UploadFieldSingleValidation = Validate<unknown, unknown, unknown, UploadField>\n\nexport const upload: UploadFieldValidation = async (value, options) => {\n const {\n event,\n maxRows,\n minRows,\n relationTo,\n req: { payload, t },\n required,\n } = options\n\n if (\n ((!value && typeof value !== 'number') || (Array.isArray(value) && value.length === 0)) &&\n required\n ) {\n return t('validation:required')\n }\n\n if (Array.isArray(value) && value.length > 0) {\n if (minRows && value.length < minRows) {\n return t('validation:lessThanMin', {\n label: t('general:rows'),\n min: minRows,\n value: value.length,\n })\n }\n\n if (maxRows && value.length > maxRows) {\n return t('validation:greaterThanMax', {\n label: t('general:rows'),\n max: maxRows,\n value: value.length,\n })\n }\n }\n\n if (typeof value !== 'undefined' && value !== null) {\n const values = Array.isArray(value) ? value : [value]\n\n const invalidRelationships = values.filter((val) => {\n let collectionSlug: string\n let requestedID\n\n if (typeof relationTo === 'string') {\n collectionSlug = relationTo\n\n // custom id\n if (val || typeof val === 'number') {\n requestedID = val\n }\n }\n\n if (Array.isArray(relationTo) && typeof val === 'object' && val?.relationTo) {\n collectionSlug = val.relationTo\n requestedID = val.value\n }\n\n if (requestedID === null) {\n return false\n }\n\n const idType =\n payload.collections[collectionSlug!]?.customIDType || payload?.db?.defaultIDType || 'text'\n\n return !isValidID(requestedID, idType)\n })\n\n if (invalidRelationships.length > 0) {\n return `This relationship field has the following invalid relationships: ${invalidRelationships\n .map((err, invalid) => {\n return `${err} ${JSON.stringify(invalid)}`\n })\n .join(', ')}`\n }\n }\n\n if (event === 'onChange') {\n return true\n }\n\n return validateFilterOptions(value, options)\n}\n\nexport type RelationshipFieldValidation = Validate<\n RelationshipValue,\n unknown,\n unknown,\n RelationshipField\n>\n\nexport type RelationshipFieldManyValidation = Validate<\n RelationshipValueMany,\n unknown,\n unknown,\n RelationshipField\n>\n\nexport type RelationshipFieldSingleValidation = Validate<\n RelationshipValueSingle,\n unknown,\n unknown,\n RelationshipField\n>\n\nexport const relationship: RelationshipFieldValidation = async (value, options) => {\n const {\n event,\n maxRows,\n minRows,\n relationTo,\n req: { payload, t },\n required,\n } = options\n\n if (\n ((!value && typeof value !== 'number') || (Array.isArray(value) && value.length === 0)) &&\n required\n ) {\n return t('validation:required')\n }\n\n if (Array.isArray(value) && value.length > 0) {\n if (minRows && value.length < minRows) {\n return t('validation:lessThanMin', {\n label: t('general:rows'),\n min: minRows,\n value: value.length,\n })\n }\n\n if (maxRows && value.length > maxRows) {\n return t('validation:greaterThanMax', {\n label: t('general:rows'),\n max: maxRows,\n value: value.length,\n })\n }\n }\n\n if (typeof value !== 'undefined' && value !== null) {\n const values = Array.isArray(value) ? value : [value]\n\n const invalidRelationships = values.filter((val) => {\n let collectionSlug: string\n let requestedID: number | string | undefined | ValueWithRelation\n\n if (typeof relationTo === 'string') {\n collectionSlug = relationTo\n\n // custom id\n if (val || typeof val === 'number') {\n requestedID = val\n }\n }\n\n if (Array.isArray(relationTo) && typeof val === 'object' && val?.relationTo) {\n collectionSlug = val.relationTo\n requestedID = val.value\n }\n\n if (requestedID === null) {\n return false\n }\n\n const idType =\n payload.collections[collectionSlug!]?.customIDType || payload?.db?.defaultIDType || 'text'\n\n return !isValidID(requestedID as number | string, idType)\n })\n\n if (invalidRelationships.length > 0) {\n return `This relationship field has the following invalid relationships: ${invalidRelationships\n .map((err, invalid) => {\n return `${err} ${JSON.stringify(invalid)}`\n })\n .join(', ')}`\n }\n }\n\n if (event === 'onChange') {\n return true\n }\n\n return validateFilterOptions(value, options)\n}\n\nexport type SelectFieldValidation = Validate<string | string[], unknown, unknown, SelectField>\n\nexport type SelectFieldManyValidation = Validate<string[], unknown, unknown, SelectField>\n\nexport type SelectFieldSingleValidation = Validate<string, unknown, unknown, SelectField>\n\nexport const select: SelectFieldValidation = async (\n value,\n { data, filterOptions, hasMany, options, req, req: { t }, required, siblingData },\n) => {\n const filteredOptions =\n typeof filterOptions === 'function'\n ? await filterOptions({\n data,\n options,\n req,\n siblingData,\n })\n : options\n\n if (\n Array.isArray(value) &&\n value.some(\n (input) =>\n !filteredOptions.some(\n (option) => option === input || (typeof option !== 'string' && option?.value === input),\n ),\n )\n ) {\n return t('validation:invalidSelection')\n }\n\n // Check for duplicate values when hasMany is true\n if (hasMany && Array.isArray(value) && value.length > 1) {\n const counts = new Map<unknown, number>()\n\n for (const item of value) {\n counts.set(item, (counts.get(item) || 0) + 1)\n }\n\n const duplicates: unknown[] = []\n for (const [item, count] of counts.entries()) {\n if (count > 1) {\n // Add the item 'count' times to show all occurrences\n for (let i = 0; i < count; i++) {\n duplicates.push(item)\n }\n }\n }\n\n if (duplicates.length > 0) {\n return duplicates.reduce((err, duplicate, i) => {\n return `${err} ${JSON.stringify(duplicate)}${i < duplicates.length - 1 ? ',' : ''}`\n }, t('validation:invalidSelections')) as string\n }\n }\n\n if (\n typeof value === 'string' &&\n !filteredOptions.some(\n (option) => option === value || (typeof option !== 'string' && option.value === value),\n )\n ) {\n return t('validation:invalidSelection')\n }\n\n if (\n required &&\n (typeof value === 'undefined' ||\n value === null ||\n (hasMany && Array.isArray(value) && (value as [])?.length === 0))\n ) {\n return t('validation:required')\n }\n\n return true\n}\n\nexport type RadioFieldValidation = Validate<unknown, unknown, unknown, RadioField>\n\nexport const radio: RadioFieldValidation = (value, { options, req: { t }, required }) => {\n if (value) {\n const valueMatchesOption = options.some(\n (option) => option === value || (typeof option !== 'string' && option.value === value),\n )\n return valueMatchesOption || t('validation:invalidSelection')\n }\n\n return required ? t('validation:required') : true\n}\n\nexport type PointFieldValidation = Validate<\n [number | string, number | string],\n unknown,\n unknown,\n PointField\n>\n\nexport const point: PointFieldValidation = (value = ['', ''], { req: { t }, required }) => {\n if (value === null) {\n if (required) {\n return t('validation:required')\n }\n\n return true\n }\n\n const lng = parseFloat(String(value[0]))\n const lat = parseFloat(String(value[1]))\n if (\n required &&\n ((value[0] && value[1] && typeof lng !== 'number' && typeof lat !== 'number') ||\n Number.isNaN(lng) ||\n Number.isNaN(lat) ||\n (Array.isArray(value) && value.length !== 2))\n ) {\n return t('validation:requiresTwoNumbers')\n }\n\n if ((value[1] && Number.isNaN(lng)) || (value[0] && Number.isNaN(lat))) {\n return t('validation:invalidInput')\n }\n\n // Validate longitude bounds (-180 to 180)\n if (value[0] && !Number.isNaN(lng) && (lng < -180 || lng > 180)) {\n return t('validation:longitudeOutOfBounds')\n }\n\n // Validate latitude bounds (-90 to 90)\n if (value[1] && !Number.isNaN(lat) && (lat < -90 || lat > 90)) {\n return t('validation:latitudeOutOfBounds')\n }\n\n return true\n}\n\n/**\n * Built-in field validations used by Payload\n *\n * These can be re-used in custom validations\n */\nexport const validations = {\n slug,\n array,\n blocks,\n checkbox,\n code,\n confirmPassword,\n date,\n email,\n json,\n number,\n password,\n point,\n radio,\n relationship,\n richText,\n select,\n text,\n textarea,\n upload,\n}\n"],"names":["validateJSONSchema","ObjectIdImport","ObjectId","default","isNumber","isValidID","text","value","hasMany","maxLength","fieldMaxLength","maxRows","minLength","minRows","req","payload","config","t","required","undefined","lengthValidationResult","validateArrayLength","defaultMaxTextLength","stringsToValidate","Array","isArray","stringValue","length","label","slug","password","confirmPassword","siblingData","email","collectionSlug","collections","collection","find","auth","loginWithUsername","requireUsername","requireEmail","username","emailRegex","test","textarea","code","json","jsonError","jsonSchema","isNotEmpty","Object","keys","checkbox","date","name","timezone","validDate","isNaN","Date","parse","toString","hasRequiredTimezone","selectedTimezone","validTimezone","Boolean","richText","options","editor","Error","validate","arrayLength","count","number","max","min","numbersToValidate","numberValue","parseFloat","array","validateBlocksFilterOptions","id","data","filterOptions","allBlockSlugs","map","b","blockType","filter","s","allowedBlockSlugs","result","user","invalidBlockSlugs","blockSlug","includes","push","blocks","join","validateFilterOptions","blockData","overrideAccess","relationTo","falseCollections","values","optionFilter","valueIDs","forEach","val","isValid","toHexString","findWhere","and","in","payloadDataLoader","depth","disableErrors","limit","pagination","where","docs","doc","err","logger","error","msg","invalidRelationships","requestedID","indexOf","reduce","invalid","i","JSON","stringify","upload","event","idType","customIDType","db","defaultIDType","relationship","select","filteredOptions","some","input","option","counts","Map","item","set","get","duplicates","entries","duplicate","radio","valueMatchesOption","point","lng","String","lat","Number","validations"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/fields/validations.ts"],"sourcesContent":["import { validateJSONSchema } from '#validateJSONSchema'\nimport ObjectIdImport from 'bson-objectid'\n\nconst ObjectId = 'default' in ObjectIdImport ? ObjectIdImport.default : ObjectIdImport\n\nimport type { TFunction } from '@payloadcms/translations'\n\nimport type { RichTextAdapter } from '../admin/types.js'\nimport type { CollectionSlug } from '../index.js'\nimport type { Where } from '../types/index.js'\nimport type {\n ArrayField,\n BlocksField,\n CheckboxField,\n CodeField,\n DateField,\n EmailField,\n JSONField,\n NumberField,\n PointField,\n RadioField,\n RelationshipField,\n RelationshipValue,\n RelationshipValueMany,\n RelationshipValueSingle,\n RichTextField,\n SelectField,\n SlugField,\n TextareaField,\n TextField,\n UploadField,\n Validate,\n ValueWithRelation,\n} from './config/types.js'\n\nimport { isNumber } from '../utilities/isNumber.js'\nimport { isValidID } from '../utilities/isValidID.js'\n\nexport type TextFieldValidation = Validate<string, unknown, unknown, TextField>\n\nexport type TextFieldManyValidation = Validate<string[], unknown, unknown, TextField>\n\nexport type TextFieldSingleValidation = Validate<string, unknown, unknown, TextField>\n\nexport const text: TextFieldValidation = (\n value,\n {\n hasMany,\n maxLength: fieldMaxLength,\n maxRows,\n minLength,\n minRows,\n req: {\n payload: { config },\n t,\n },\n required,\n },\n) => {\n let maxLength!: number\n\n if (!required) {\n if (value === undefined || value === null) {\n return true\n }\n }\n\n if (hasMany === true) {\n const lengthValidationResult = validateArrayLength(value, { maxRows, minRows, required, t })\n if (typeof lengthValidationResult === 'string') {\n return lengthValidationResult\n }\n }\n\n if (typeof config?.defaultMaxTextLength === 'number') {\n maxLength = config.defaultMaxTextLength\n }\n if (typeof fieldMaxLength === 'number') {\n maxLength = fieldMaxLength\n }\n\n const stringsToValidate: string[] = Array.isArray(value) ? value : [value!]\n\n for (const stringValue of stringsToValidate) {\n const length = stringValue?.length || 0\n\n if (typeof maxLength === 'number' && length > maxLength) {\n return t('validation:shorterThanMax', { label: t('general:value'), maxLength, stringValue })\n }\n\n if (typeof minLength === 'number' && length < minLength) {\n return t('validation:longerThanMin', { label: t('general:value'), minLength, stringValue })\n }\n }\n\n if (required) {\n if (!value || ((typeof value === 'string' || Array.isArray(value)) && value.length === 0)) {\n return t('validation:required')\n }\n }\n\n return true\n}\n\nexport type SlugFieldValidation = Validate<string, unknown, unknown, SlugField>\n\n// A slug is always populated by the field's hooks (source-derived or the `<singular>-<N>` fallback),\n// so an empty value is never a user error — `required` only drives the admin asterisk. Uniqueness is\n// enforced in the field's `beforeChange` hook (see generateSlug) rather than here, because draft\n// saves skip validation but still run hooks.\nexport const slug: SlugFieldValidation = () => true\n\nexport type PasswordFieldValidation = Validate<string, unknown, unknown, TextField>\n\nexport const password: PasswordFieldValidation = (\n value,\n {\n maxLength: fieldMaxLength,\n minLength = 3,\n req: {\n payload: { config },\n t,\n },\n required,\n },\n) => {\n let maxLength!: number\n\n if (typeof config?.defaultMaxTextLength === 'number') {\n maxLength = config.defaultMaxTextLength\n }\n if (typeof fieldMaxLength === 'number') {\n maxLength = fieldMaxLength\n }\n\n if (value && maxLength && value.length > maxLength) {\n return t('validation:shorterThanMax', { maxLength })\n }\n\n if (value && minLength && value.length < minLength) {\n return t('validation:longerThanMin', { minLength })\n }\n\n if (required && !value) {\n return t('validation:required')\n }\n\n return true\n}\n\nexport type ConfirmPasswordFieldValidation = Validate<\n string,\n unknown,\n { password: string },\n TextField\n>\n\nexport const confirmPassword: ConfirmPasswordFieldValidation = (\n value,\n { req: { t }, required, siblingData },\n) => {\n if (required && !value) {\n return t('validation:required')\n }\n\n if (value && value !== siblingData.password) {\n return t('fields:passwordsDoNotMatch')\n }\n\n return true\n}\n\nexport type EmailFieldValidation = Validate<string, unknown, { username?: string }, EmailField>\n\nexport const email: EmailFieldValidation = (\n value,\n {\n collectionSlug,\n req: {\n payload: { collections, config },\n t,\n },\n required,\n siblingData,\n },\n) => {\n if (collectionSlug) {\n const collection =\n collections?.[collectionSlug]?.config ??\n config.collections.find(({ slug }) => slug === collectionSlug)! // If this is run on the client, `collections` will be undefined, but `config.collections` will be available\n\n if (\n collection.auth.loginWithUsername &&\n !collection.auth.loginWithUsername?.requireUsername &&\n !collection.auth.loginWithUsername?.requireEmail\n ) {\n if (!value && !siblingData?.username) {\n return t('validation:required')\n }\n }\n }\n\n /**\n * Disallows emails with double quotes (e.g., \"user\"@example.com, user@\"example.com\", \"user@example.com\")\n * Rejects spaces anywhere in the email (e.g., user @example.com, user@ example.com, user name@example.com)\n * Prevents consecutive dots in the local or domain part (e.g., user..name@example.com, user@example..com)\n * Disallows domains that start or end with a hyphen (e.g., user@-example.com, user@example-.com)\n * Allows standard email formats (e.g., user@example.com, user.name+alias@example.co.uk, user-name@example.org)\n * Allows domains with consecutive hyphens as long as they are not leading/trailing (e.g., user@ex--ample.com)\n * Supports multiple subdomains (e.g., user@sub.domain.example.com)\n */\n const emailRegex =\n /^(?!.*\\.\\.)[\\w!#$%&'*+/=?^`{|}~-](?:[\\w!#$%&'*+/=?^`{|}~.-]*[\\w!#$%&'*+/=?^`{|}~-])?@[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)*\\.[a-z]{2,}$/i\n\n if (!value && required) {\n return t('validation:required')\n }\n\n if (value && !emailRegex.test(value)) {\n return t('validation:emailAddress')\n }\n\n return true\n}\n\nexport type UsernameFieldValidation = Validate<string, unknown, { email?: string }, TextField>\n\nexport const username: UsernameFieldValidation = (\n value,\n {\n collectionSlug,\n req: {\n payload: { collections, config },\n t,\n },\n required,\n siblingData,\n },\n) => {\n let maxLength!: number\n\n if (collectionSlug) {\n const collection =\n collections?.[collectionSlug]?.config ??\n config.collections.find(({ slug }) => slug === collectionSlug)! // If this is run on the client, `collections` will be undefined, but `config.collections` will be available\n\n if (\n collection.auth.loginWithUsername &&\n !collection.auth.loginWithUsername?.requireUsername &&\n !collection.auth.loginWithUsername?.requireEmail\n ) {\n if (!value && !siblingData?.email) {\n return t('validation:required')\n }\n }\n }\n\n if (typeof config?.defaultMaxTextLength === 'number') {\n maxLength = config.defaultMaxTextLength\n }\n\n if (value && maxLength && value.length > maxLength) {\n return t('validation:shorterThanMax', { maxLength })\n }\n\n if (!value && required) {\n return t('validation:required')\n }\n\n return true\n}\n\nexport type TextareaFieldValidation = Validate<string, unknown, unknown, TextareaField>\n\nexport const textarea: TextareaFieldValidation = (\n value,\n {\n maxLength: fieldMaxLength,\n minLength,\n req: {\n payload: { config },\n t,\n },\n required,\n },\n) => {\n let maxLength!: number\n\n if (typeof config?.defaultMaxTextLength === 'number') {\n maxLength = config.defaultMaxTextLength\n }\n if (typeof fieldMaxLength === 'number') {\n maxLength = fieldMaxLength\n }\n if (value && maxLength && value.length > maxLength) {\n return t('validation:shorterThanMax', { maxLength })\n }\n\n if (value && minLength && value.length < minLength) {\n return t('validation:longerThanMin', { minLength })\n }\n\n if (required && !value) {\n return t('validation:required')\n }\n\n return true\n}\n\nexport type CodeFieldValidation = Validate<string, unknown, unknown, CodeField>\n\nexport const code: CodeFieldValidation = (value, { req: { t }, required }) => {\n if (required && (!value || (typeof value === 'string' && value.length === 0))) {\n return t('validation:required')\n }\n\n return true\n}\n\nexport type JSONFieldValidation = Validate<\n string,\n unknown,\n unknown,\n { jsonError?: string } & JSONField\n>\n\nexport const json: JSONFieldValidation = async (\n value,\n { jsonError, jsonSchema, req: { t }, required },\n) => {\n const isNotEmpty = (value: null | string | undefined) => {\n if (value === undefined || value === null) {\n return false\n }\n\n if (Array.isArray(value) && value.length === 0) {\n return false\n }\n\n if (typeof value === 'object' && Object.keys(value).length === 0) {\n return false\n }\n\n return true\n }\n\n if (required && !value) {\n return t('validation:required')\n }\n\n if (jsonError !== undefined) {\n return t('validation:invalidInput')\n }\n\n if (jsonSchema && isNotEmpty(value)) {\n return validateJSONSchema({ jsonSchema, value })\n }\n return true\n}\n\nexport type CheckboxFieldValidation = Validate<boolean, unknown, unknown, CheckboxField>\n\nexport const checkbox: CheckboxFieldValidation = (value, { req: { t }, required }) => {\n if ((value && typeof value !== 'boolean') || (required && typeof value !== 'boolean')) {\n return t('validation:trueOrFalse')\n }\n\n return true\n}\n\nexport type DateFieldValidation = Validate<Date, unknown, unknown, DateField>\n\nexport const date: DateFieldValidation = (\n value,\n { name, req: { t }, required, siblingData, timezone },\n) => {\n const validDate = value && !isNaN(Date.parse(value.toString()))\n\n // We need to also check for the timezone data based on this field's config\n // We cannot do this inside the timezone field validation as it's visually hidden\n const hasRequiredTimezone = timezone && required\n const selectedTimezone: string = siblingData?.[`${name}_tz` as keyof typeof siblingData]\n // Always resolve to true if the field is not required, as timezone may be optional too then\n const validTimezone = hasRequiredTimezone ? Boolean(selectedTimezone) : true\n\n if (validDate && validTimezone) {\n return true\n }\n\n if (validDate && !validTimezone) {\n return t('validation:timezoneRequired')\n }\n\n if (value) {\n return t('validation:notValidDate', { value })\n }\n\n if (required) {\n return t('validation:required')\n }\n\n return true\n}\n\nexport type RichTextFieldValidation = Validate<object, unknown, unknown, RichTextField>\n\nexport const richText: RichTextFieldValidation = async (value, options) => {\n if (!options?.editor) {\n throw new Error('richText field has no editor property.')\n }\n if (typeof options?.editor === 'function') {\n throw new Error('Attempted to access unsanitized rich text editor.')\n }\n\n const editor: RichTextAdapter = options?.editor\n\n return editor.validate(value, options)\n}\n\nconst validateArrayLength = (\n value: unknown,\n options: {\n maxRows?: number\n minRows?: number\n required?: boolean\n t: TFunction\n },\n) => {\n const { maxRows, minRows, required, t } = options\n\n const arrayLength = Array.isArray(value) ? value.length : (value as number) || 0\n\n if (!required && arrayLength === 0) {\n return true\n }\n\n if (minRows && arrayLength < minRows) {\n return t('validation:requiresAtLeast', { count: minRows, label: t('general:rows') })\n }\n\n if (maxRows && arrayLength > maxRows) {\n return t('validation:requiresNoMoreThan', { count: maxRows, label: t('general:rows') })\n }\n\n if (required && !arrayLength) {\n return t('validation:requiresAtLeast', { count: 1, label: t('general:row') })\n }\n\n return true\n}\n\nexport type NumberFieldValidation = Validate<number | number[], unknown, unknown, NumberField>\n\nexport type NumberFieldManyValidation = Validate<number[], unknown, unknown, NumberField>\n\nexport type NumberFieldSingleValidation = Validate<number, unknown, unknown, NumberField>\n\nexport const number: NumberFieldValidation = (\n value,\n { hasMany, max, maxRows, min, minRows, req: { t }, required },\n) => {\n if (hasMany === true) {\n const lengthValidationResult = validateArrayLength(value, { maxRows, minRows, required, t })\n if (typeof lengthValidationResult === 'string') {\n return lengthValidationResult\n }\n }\n\n if (!value && !isNumber(value)) {\n // if no value is present, validate based on required\n if (required) {\n return t('validation:required')\n }\n if (!required) {\n return true\n }\n }\n\n const numbersToValidate: number[] = Array.isArray(value) ? value : [value!]\n\n for (const number of numbersToValidate) {\n if (!isNumber(number)) {\n return t('validation:enterNumber')\n }\n\n const numberValue = parseFloat(number as unknown as string)\n\n if (typeof max === 'number' && numberValue > max) {\n return t('validation:greaterThanMax', { label: t('general:value'), max, value })\n }\n\n if (typeof min === 'number' && numberValue < min) {\n return t('validation:lessThanMin', { label: t('general:value'), min, value })\n }\n }\n\n return true\n}\n\nexport type ArrayFieldValidation = Validate<unknown[], unknown, unknown, ArrayField>\n\nexport const array: ArrayFieldValidation = (value, { maxRows, minRows, req: { t }, required }) => {\n return validateArrayLength(value, { maxRows, minRows, required, t })\n}\n\nexport type BlocksFieldValidation = Validate<unknown, unknown, unknown, BlocksField>\n\n/**\n * This function validates the blocks in a blocks field against the provided filterOptions.\n * It will return a list of all block slugs found in the value, the allowed block slugs (if any),\n * and a list of invalid block slugs that are used despite being disallowed.\n *\n * @internal - this may break or be removed at any time\n */\nexport async function validateBlocksFilterOptions({\n id,\n data,\n filterOptions,\n req,\n siblingData,\n value,\n}: { value: Parameters<BlocksFieldValidation>[0] } & Pick<\n Parameters<BlocksFieldValidation>[1],\n 'data' | 'filterOptions' | 'id' | 'req' | 'siblingData'\n>): Promise<{\n /**\n * All block slugs found in the value of the blocks field\n */\n allBlockSlugs: string[]\n /**\n * All block slugs that are allowed. If undefined, all blocks are allowed.\n */\n allowedBlockSlugs: string[] | undefined\n /**\n * A list of block slugs that are used despite being disallowed. If undefined, field passed validation.\n */\n invalidBlockSlugs: string[] | undefined\n}> {\n const allBlockSlugs = Array.isArray(value)\n ? (value as Array<{ blockType?: string }>)\n .map((b) => b.blockType)\n .filter((s): s is string => Boolean(s))\n : []\n\n // if undefined => all blocks allowed\n let allowedBlockSlugs: string[] | undefined = undefined\n\n if (typeof filterOptions === 'function') {\n const result = await filterOptions({\n id: id!, // original code asserted presence\n data,\n req,\n siblingData,\n user: req.user,\n })\n if (result !== true && Array.isArray(result)) {\n allowedBlockSlugs = result\n }\n } else if (Array.isArray(filterOptions)) {\n allowedBlockSlugs = filterOptions\n }\n\n const invalidBlockSlugs: string[] = []\n if (allowedBlockSlugs) {\n for (const blockSlug of allBlockSlugs) {\n if (!allowedBlockSlugs.includes(blockSlug)) {\n invalidBlockSlugs.push(blockSlug)\n }\n }\n }\n\n return {\n allBlockSlugs,\n allowedBlockSlugs,\n invalidBlockSlugs,\n }\n}\nexport const blocks: BlocksFieldValidation = async (\n value,\n { id, data, filterOptions, maxRows, minRows, req: { t }, req, required, siblingData },\n) => {\n const lengthValidationResult = validateArrayLength(value, { maxRows, minRows, required, t })\n if (typeof lengthValidationResult === 'string') {\n return lengthValidationResult\n }\n\n if (filterOptions) {\n const { invalidBlockSlugs } = await validateBlocksFilterOptions({\n id,\n data,\n filterOptions,\n req,\n siblingData,\n value,\n })\n if (invalidBlockSlugs?.length) {\n return t('validation:invalidBlocks', { blocks: invalidBlockSlugs.join(', ') })\n }\n }\n\n return true\n}\n\nconst validateFilterOptions: Validate<\n unknown,\n unknown,\n unknown,\n RelationshipField | UploadField\n> = async (\n value,\n {\n id,\n blockData,\n data,\n filterOptions,\n overrideAccess,\n relationTo,\n req,\n req: { t, user },\n siblingData,\n },\n) => {\n if (typeof filterOptions !== 'undefined' && value) {\n const options: {\n [collection: string]: (number | string)[]\n } = {}\n\n const falseCollections: CollectionSlug[] = []\n const collections = !Array.isArray(relationTo) ? [relationTo] : relationTo\n const values = Array.isArray(value) ? value : [value]\n\n for (const collection of collections) {\n try {\n let optionFilter =\n typeof filterOptions === 'function'\n ? await filterOptions({\n id: id!,\n blockData,\n data,\n relationTo: collection,\n req,\n siblingData,\n user,\n })\n : filterOptions\n\n if (optionFilter === true) {\n optionFilter = null\n }\n\n const valueIDs: (number | string)[] = []\n\n values.forEach((val) => {\n if (typeof val === 'object') {\n if (val?.value) {\n valueIDs.push(val.value)\n } else if (ObjectId.isValid(val)) {\n valueIDs.push(new ObjectId(val).toHexString())\n }\n }\n\n if (typeof val === 'string' || typeof val === 'number') {\n valueIDs.push(val)\n }\n })\n\n if (valueIDs.length > 0) {\n const findWhere: Where = {\n and: [{ id: { in: valueIDs } }],\n }\n\n // @ts-expect-error - I don't understand why optionFilter is inferred as `false | Where | null` instead of `boolean | Where | null`\n if (optionFilter && optionFilter !== true) {\n findWhere.and?.push(optionFilter)\n }\n\n if (optionFilter === false) {\n falseCollections.push(collection)\n }\n\n const result = await req.payloadDataLoader.find({\n collection,\n depth: 0,\n disableErrors: true,\n limit: 0,\n overrideAccess: overrideAccess ?? false,\n pagination: false,\n req,\n where: findWhere,\n })\n\n options[collection] = result.docs.map((doc) => doc.id)\n } else {\n options[collection] = []\n }\n } catch (err) {\n req.payload.logger.error({\n err,\n msg: `Error validating filter options for collection ${collection}`,\n })\n options[collection] = []\n }\n }\n\n const invalidRelationships = values.filter((val) => {\n let collection: string\n let requestedID: number | string\n\n if (typeof relationTo === 'string') {\n collection = relationTo\n\n if (typeof val === 'string' || typeof val === 'number') {\n requestedID = val\n }\n\n if (typeof val === 'object' && ObjectId.isValid(val)) {\n requestedID = new ObjectId(val).toHexString()\n }\n }\n\n if (Array.isArray(relationTo) && typeof val === 'object' && val?.relationTo) {\n collection = val.relationTo\n requestedID = val.value\n }\n\n if (falseCollections.find((slug) => relationTo === slug)) {\n return true\n }\n\n if (!options[collection!]) {\n return true\n }\n\n return options[collection!]!.indexOf(requestedID!) === -1\n })\n\n if (invalidRelationships.length > 0) {\n return invalidRelationships.reduce((err, invalid, i) => {\n return `${err} ${JSON.stringify(invalid)}${\n invalidRelationships.length === i + 1 ? ',' : ''\n } `\n }, t('validation:invalidSelections')) as string\n }\n\n return true\n }\n\n return true\n}\n\nexport type UploadFieldValidation = Validate<unknown, unknown, unknown, UploadField>\n\nexport type UploadFieldManyValidation = Validate<unknown[], unknown, unknown, UploadField>\n\nexport type UploadFieldSingleValidation = Validate<unknown, unknown, unknown, UploadField>\n\nexport const upload: UploadFieldValidation = async (value, options) => {\n const {\n event,\n maxRows,\n minRows,\n relationTo,\n req: { payload, t },\n required,\n } = options\n\n if (\n ((!value && typeof value !== 'number') || (Array.isArray(value) && value.length === 0)) &&\n required\n ) {\n return t('validation:required')\n }\n\n if (Array.isArray(value) && value.length > 0) {\n if (minRows && value.length < minRows) {\n return t('validation:lessThanMin', {\n label: t('general:rows'),\n min: minRows,\n value: value.length,\n })\n }\n\n if (maxRows && value.length > maxRows) {\n return t('validation:greaterThanMax', {\n label: t('general:rows'),\n max: maxRows,\n value: value.length,\n })\n }\n }\n\n if (typeof value !== 'undefined' && value !== null) {\n const values = Array.isArray(value) ? value : [value]\n\n const invalidRelationships = values.filter((val) => {\n let collectionSlug: string\n let requestedID\n\n if (typeof relationTo === 'string') {\n collectionSlug = relationTo\n\n // custom id\n if (val || typeof val === 'number') {\n requestedID = val\n }\n }\n\n if (Array.isArray(relationTo) && typeof val === 'object' && val?.relationTo) {\n collectionSlug = val.relationTo\n requestedID = val.value\n }\n\n if (requestedID === null) {\n return false\n }\n\n const idType =\n payload.collections[collectionSlug!]?.customIDType || payload?.db?.defaultIDType || 'text'\n\n return !isValidID(requestedID, idType)\n })\n\n if (invalidRelationships.length > 0) {\n return `This relationship field has the following invalid relationships: ${invalidRelationships\n .map((err, invalid) => {\n return `${err} ${JSON.stringify(invalid)}`\n })\n .join(', ')}`\n }\n }\n\n if (event === 'onChange') {\n return true\n }\n\n return validateFilterOptions(value, options)\n}\n\nexport type RelationshipFieldValidation = Validate<\n RelationshipValue,\n unknown,\n unknown,\n RelationshipField\n>\n\nexport type RelationshipFieldManyValidation = Validate<\n RelationshipValueMany,\n unknown,\n unknown,\n RelationshipField\n>\n\nexport type RelationshipFieldSingleValidation = Validate<\n RelationshipValueSingle,\n unknown,\n unknown,\n RelationshipField\n>\n\nexport const relationship: RelationshipFieldValidation = async (value, options) => {\n const {\n event,\n maxRows,\n minRows,\n relationTo,\n req: { payload, t },\n required,\n } = options\n\n if (\n ((!value && typeof value !== 'number') || (Array.isArray(value) && value.length === 0)) &&\n required\n ) {\n return t('validation:required')\n }\n\n if (Array.isArray(value) && value.length > 0) {\n if (minRows && value.length < minRows) {\n return t('validation:lessThanMin', {\n label: t('general:rows'),\n min: minRows,\n value: value.length,\n })\n }\n\n if (maxRows && value.length > maxRows) {\n return t('validation:greaterThanMax', {\n label: t('general:rows'),\n max: maxRows,\n value: value.length,\n })\n }\n }\n\n if (typeof value !== 'undefined' && value !== null) {\n const values = Array.isArray(value) ? value : [value]\n\n const invalidRelationships = values.filter((val) => {\n let collectionSlug: string\n let requestedID: number | string | undefined | ValueWithRelation\n\n if (typeof relationTo === 'string') {\n collectionSlug = relationTo\n\n // custom id\n if (val || typeof val === 'number') {\n requestedID = val\n }\n }\n\n if (Array.isArray(relationTo) && typeof val === 'object' && val?.relationTo) {\n collectionSlug = val.relationTo\n requestedID = val.value\n }\n\n if (requestedID === null) {\n return false\n }\n\n const idType =\n payload.collections[collectionSlug!]?.customIDType || payload?.db?.defaultIDType || 'text'\n\n return !isValidID(requestedID as number | string, idType)\n })\n\n if (invalidRelationships.length > 0) {\n return `This relationship field has the following invalid relationships: ${invalidRelationships\n .map((err, invalid) => {\n return `${err} ${JSON.stringify(invalid)}`\n })\n .join(', ')}`\n }\n }\n\n if (event === 'onChange') {\n return true\n }\n\n return validateFilterOptions(value, options)\n}\n\nexport type SelectFieldValidation = Validate<string | string[], unknown, unknown, SelectField>\n\nexport type SelectFieldManyValidation = Validate<string[], unknown, unknown, SelectField>\n\nexport type SelectFieldSingleValidation = Validate<string, unknown, unknown, SelectField>\n\nexport const select: SelectFieldValidation = async (\n value,\n { data, filterOptions, hasMany, options, req, req: { t }, required, siblingData },\n) => {\n const filteredOptions =\n typeof filterOptions === 'function'\n ? await filterOptions({\n data,\n options,\n req,\n siblingData,\n })\n : options\n\n if (\n Array.isArray(value) &&\n value.some(\n (input) =>\n !filteredOptions.some(\n (option) => option === input || (typeof option !== 'string' && option?.value === input),\n ),\n )\n ) {\n return t('validation:invalidSelection')\n }\n\n // Check for duplicate values when hasMany is true\n if (hasMany && Array.isArray(value) && value.length > 1) {\n const counts = new Map<unknown, number>()\n\n for (const item of value) {\n counts.set(item, (counts.get(item) || 0) + 1)\n }\n\n const duplicates: unknown[] = []\n for (const [item, count] of counts.entries()) {\n if (count > 1) {\n // Add the item 'count' times to show all occurrences\n for (let i = 0; i < count; i++) {\n duplicates.push(item)\n }\n }\n }\n\n if (duplicates.length > 0) {\n return duplicates.reduce((err, duplicate, i) => {\n return `${err} ${JSON.stringify(duplicate)}${i < duplicates.length - 1 ? ',' : ''}`\n }, t('validation:invalidSelections')) as string\n }\n }\n\n if (\n typeof value === 'string' &&\n !filteredOptions.some(\n (option) => option === value || (typeof option !== 'string' && option.value === value),\n )\n ) {\n return t('validation:invalidSelection')\n }\n\n if (\n required &&\n (typeof value === 'undefined' ||\n value === null ||\n (hasMany && Array.isArray(value) && (value as [])?.length === 0))\n ) {\n return t('validation:required')\n }\n\n return true\n}\n\nexport type RadioFieldValidation = Validate<unknown, unknown, unknown, RadioField>\n\nexport const radio: RadioFieldValidation = (value, { options, req: { t }, required }) => {\n if (value) {\n const valueMatchesOption = options.some(\n (option) => option === value || (typeof option !== 'string' && option.value === value),\n )\n return valueMatchesOption || t('validation:invalidSelection')\n }\n\n return required ? t('validation:required') : true\n}\n\nexport type PointFieldValidation = Validate<\n [number | string, number | string],\n unknown,\n unknown,\n PointField\n>\n\nexport const point: PointFieldValidation = (value = ['', ''], { req: { t }, required }) => {\n if (value === null) {\n if (required) {\n return t('validation:required')\n }\n\n return true\n }\n\n const lng = parseFloat(String(value[0]))\n const lat = parseFloat(String(value[1]))\n if (\n required &&\n ((value[0] && value[1] && typeof lng !== 'number' && typeof lat !== 'number') ||\n Number.isNaN(lng) ||\n Number.isNaN(lat) ||\n (Array.isArray(value) && value.length !== 2))\n ) {\n return t('validation:requiresTwoNumbers')\n }\n\n if ((value[1] && Number.isNaN(lng)) || (value[0] && Number.isNaN(lat))) {\n return t('validation:invalidInput')\n }\n\n // Validate longitude bounds (-180 to 180)\n if (value[0] && !Number.isNaN(lng) && (lng < -180 || lng > 180)) {\n return t('validation:longitudeOutOfBounds')\n }\n\n // Validate latitude bounds (-90 to 90)\n if (value[1] && !Number.isNaN(lat) && (lat < -90 || lat > 90)) {\n return t('validation:latitudeOutOfBounds')\n }\n\n return true\n}\n\n/**\n * Built-in field validations used by Payload\n *\n * These can be re-used in custom validations\n */\nexport const validations = {\n slug,\n array,\n blocks,\n checkbox,\n code,\n confirmPassword,\n date,\n email,\n json,\n number,\n password,\n point,\n radio,\n relationship,\n richText,\n select,\n text,\n textarea,\n upload,\n}\n"],"names":["validateJSONSchema","ObjectIdImport","ObjectId","default","isNumber","isValidID","text","value","hasMany","maxLength","fieldMaxLength","maxRows","minLength","minRows","req","payload","config","t","required","undefined","lengthValidationResult","validateArrayLength","defaultMaxTextLength","stringsToValidate","Array","isArray","stringValue","length","label","slug","password","confirmPassword","siblingData","email","collectionSlug","collections","collection","find","auth","loginWithUsername","requireUsername","requireEmail","username","emailRegex","test","textarea","code","json","jsonError","jsonSchema","isNotEmpty","Object","keys","checkbox","date","name","timezone","validDate","isNaN","Date","parse","toString","hasRequiredTimezone","selectedTimezone","validTimezone","Boolean","richText","options","editor","Error","validate","arrayLength","count","number","max","min","numbersToValidate","numberValue","parseFloat","array","validateBlocksFilterOptions","id","data","filterOptions","allBlockSlugs","map","b","blockType","filter","s","allowedBlockSlugs","result","user","invalidBlockSlugs","blockSlug","includes","push","blocks","join","validateFilterOptions","blockData","overrideAccess","relationTo","falseCollections","values","optionFilter","valueIDs","forEach","val","isValid","toHexString","findWhere","and","in","payloadDataLoader","depth","disableErrors","limit","pagination","where","docs","doc","err","logger","error","msg","invalidRelationships","requestedID","indexOf","reduce","invalid","i","JSON","stringify","upload","event","idType","customIDType","db","defaultIDType","relationship","select","filteredOptions","some","input","option","counts","Map","item","set","get","duplicates","entries","duplicate","radio","valueMatchesOption","point","lng","String","lat","Number","validations"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/globals/operations/local/findOne.ts"],"sourcesContent":["import type { FindOptions } from '../../../collections/operations/local/find.js'\nimport type {\n GlobalSlug,\n Payload,\n RequestContext,\n TypedFallbackLocale,\n TypedLocale,\n User,\n} from '../../../index.js'\nimport type {\n PayloadRequest,\n PopulateType,\n SelectType,\n TransformGlobalWithSelect,\n} from '../../../types/index.js'\nimport type { SharedLocalAPIOptions } from '../../../types/operations.js'\nimport type { CreatePayloadRequestArgs } from '../../../utilities/createPayloadRequest.js'\nimport type { DraftFlagFromGlobalSlug, SelectFromGlobalSlug } from '../../config/types.js'\n\nimport { APIError } from '../../../errors/index.js'\nimport { createPayloadRequest } from '../../../utilities/createPayloadRequest.js'\nimport { findOneOperation, type GlobalFindOneArgs } from '../findOne.js'\n\ntype BaseFindOneOptions<TSlug extends GlobalSlug, TSelect extends SelectType> = {\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 * 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 /**\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 * Whether the document should be queried from the versions table/collection or not. [More](https://payloadcms.com/docs/versions/drafts#draft-api)\n */\n draft?: boolean\n /**\n * Specify a [fallback locale](https://payloadcms.com/docs/configuration/localization) to use for any returned documents.\n */\n fallbackLocale?: TypedFallbackLocale\n /**\n * Include info about the lock status to the result with fields: `_isLocked` and `_userEditing`\n */\n includeLockStatus?: boolean\n /**\n * Specify [locale](https://payloadcms.com/docs/configuration/localization) for any returned documents.\n */\n locale?: 'all' | TypedLocale\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 * the Global slug to operate against.\n */\n slug: TSlug\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} & Pick<FindOptions<string, SelectType>, 'select'> &\n Pick<GlobalFindOneArgs, 'flattenLocales'> &\n Pick<SharedLocalAPIOptions, 'overrideAccess'>\n\nexport type Options<TSlug extends GlobalSlug, TSelect extends SelectType> = BaseFindOneOptions<\n TSlug,\n TSelect\n> &\n DraftFlagFromGlobalSlug<TSlug>\n\nexport async function findOneGlobalLocal<\n TSlug extends GlobalSlug,\n TSelect extends SelectFromGlobalSlug<TSlug>,\n>(\n payload: Payload,\n options: Options<TSlug, TSelect>,\n): Promise<TransformGlobalWithSelect<TSlug, TSelect>> {\n const {\n slug: globalSlug,\n data,\n depth,\n disableErrors,\n draft = false,\n flattenLocales,\n includeLockStatus,\n overrideAccess = false,\n populate,\n select,\n showHiddenFields,\n } = options\n\n const globalConfig = payload.globals.config.find((config) => config.slug === globalSlug)\n\n if (!globalConfig) {\n throw new APIError(`The global with slug ${String(globalSlug)} can't be found.`)\n }\n\n return findOneOperation({\n slug: globalSlug
|
|
1
|
+
{"version":3,"sources":["../../../../src/globals/operations/local/findOne.ts"],"sourcesContent":["import type { FindOptions } from '../../../collections/operations/local/find.js'\nimport type {\n GlobalSlug,\n Payload,\n RequestContext,\n TypedFallbackLocale,\n TypedLocale,\n User,\n} from '../../../index.js'\nimport type {\n PayloadRequest,\n PopulateType,\n SelectType,\n TransformGlobalWithSelect,\n} from '../../../types/index.js'\nimport type { SharedLocalAPIOptions } from '../../../types/operations.js'\nimport type { CreatePayloadRequestArgs } from '../../../utilities/createPayloadRequest.js'\nimport type { DraftFlagFromGlobalSlug, SelectFromGlobalSlug } from '../../config/types.js'\n\nimport { APIError } from '../../../errors/index.js'\nimport { createPayloadRequest } from '../../../utilities/createPayloadRequest.js'\nimport { findOneOperation, type GlobalFindOneArgs } from '../findOne.js'\n\ntype BaseFindOneOptions<TSlug extends GlobalSlug, TSelect extends SelectType> = {\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 * 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 /**\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 * Whether the document should be queried from the versions table/collection or not. [More](https://payloadcms.com/docs/versions/drafts#draft-api)\n */\n draft?: boolean\n /**\n * Specify a [fallback locale](https://payloadcms.com/docs/configuration/localization) to use for any returned documents.\n */\n fallbackLocale?: TypedFallbackLocale\n /**\n * Include info about the lock status to the result with fields: `_isLocked` and `_userEditing`\n */\n includeLockStatus?: boolean\n /**\n * Specify [locale](https://payloadcms.com/docs/configuration/localization) for any returned documents.\n */\n locale?: 'all' | TypedLocale\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 * the Global slug to operate against.\n */\n slug: TSlug\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} & Pick<FindOptions<string, SelectType>, 'select'> &\n Pick<GlobalFindOneArgs, 'flattenLocales'> &\n Pick<SharedLocalAPIOptions, 'overrideAccess'>\n\nexport type Options<TSlug extends GlobalSlug, TSelect extends SelectType> = BaseFindOneOptions<\n TSlug,\n TSelect\n> &\n DraftFlagFromGlobalSlug<TSlug>\n\nexport async function findOneGlobalLocal<\n TSlug extends GlobalSlug,\n TSelect extends SelectFromGlobalSlug<TSlug>,\n>(\n payload: Payload,\n options: Options<TSlug, TSelect>,\n): Promise<TransformGlobalWithSelect<TSlug, TSelect>> {\n const {\n slug: globalSlug,\n data,\n depth,\n disableErrors,\n draft = false,\n flattenLocales,\n includeLockStatus,\n overrideAccess = false,\n populate,\n select,\n showHiddenFields,\n } = options\n\n const globalConfig = payload.globals.config.find((config) => config.slug === globalSlug)\n\n if (!globalConfig) {\n throw new APIError(`The global with slug ${String(globalSlug)} can't be found.`)\n }\n\n return findOneOperation({\n slug: globalSlug,\n data,\n depth,\n disableErrors,\n draft,\n flattenLocales,\n globalConfig,\n includeLockStatus,\n overrideAccess,\n populate,\n req: await createPayloadRequest({\n ...(options as Omit<CreatePayloadRequestArgs, 'payload'>),\n payload,\n }),\n select,\n showHiddenFields,\n })\n}\n"],"names":["APIError","createPayloadRequest","findOneOperation","findOneGlobalLocal","payload","options","slug","globalSlug","data","depth","disableErrors","draft","flattenLocales","includeLockStatus","overrideAccess","populate","select","showHiddenFields","globalConfig","globals","config","find","String","req"],"mappings":"AAmBA,SAASA,QAAQ,QAAQ,2BAA0B;AACnD,SAASC,oBAAoB,QAAQ,6CAA4C;AACjF,SAASC,gBAAgB,QAAgC,gBAAe;AAuExE,OAAO,eAAeC,mBAIpBC,OAAgB,EAChBC,OAAgC;IAEhC,MAAM,EACJC,MAAMC,UAAU,EAChBC,IAAI,EACJC,KAAK,EACLC,aAAa,EACbC,QAAQ,KAAK,EACbC,cAAc,EACdC,iBAAiB,EACjBC,iBAAiB,KAAK,EACtBC,QAAQ,EACRC,MAAM,EACNC,gBAAgB,EACjB,GAAGZ;IAEJ,MAAMa,eAAed,QAAQe,OAAO,CAACC,MAAM,CAACC,IAAI,CAAC,CAACD,SAAWA,OAAOd,IAAI,KAAKC;IAE7E,IAAI,CAACW,cAAc;QACjB,MAAM,IAAIlB,SAAS,CAAC,qBAAqB,EAAEsB,OAAOf,YAAY,gBAAgB,CAAC;IACjF;IAEA,OAAOL,iBAAiB;QACtBI,MAAMC;QACNC;QACAC;QACAC;QACAC;QACAC;QACAM;QACAL;QACAC;QACAC;QACAQ,KAAK,MAAMtB,qBAAqB;YAC9B,GAAII,OAAO;YACXD;QACF;QACAY;QACAC;IACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/globals/operations/local/update.ts"],"sourcesContent":["import type { DeepPartial } from 'ts-essentials'\n\nimport type {\n PayloadRequest,\n PopulateType,\n SelectType,\n TransformGlobalWithSelect,\n} from '../../../types/index.js'\nimport type { SharedLocalAPIOptions } from '../../../types/operations.js'\nimport type { CreatePayloadRequestArgs } from '../../../utilities/createPayloadRequest.js'\nimport type {\n DataFromGlobalSlug,\n DraftFlagFromGlobalSlug,\n SelectFromGlobalSlug,\n} from '../../config/types.js'\n\nimport { APIError } from '../../../errors/index.js'\nimport {\n deepCopyObjectSimple,\n type FindOptions,\n type GlobalSlug,\n type Payload,\n type RequestContext,\n type TypedLocale,\n type User,\n} from '../../../index.js'\nimport { createPayloadRequest } from '../../../utilities/createPayloadRequest.js'\nimport { updateOperation } from '../update.js'\n\ntype BaseOptions<TSlug extends GlobalSlug, TSelect extends SelectType> = {\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 * The global data to update.\n */\n data: DeepPartial<Omit<DataFromGlobalSlug<TSlug>, 'id'>>\n /**\n * [Control auto-population](https://payloadcms.com/docs/queries/depth) of nested relationship and upload fields.\n */\n depth?: number\n /**\n * Specify a [fallback locale](https://payloadcms.com/docs/configuration/localization) to use for any returned documents.\n */\n fallbackLocale?: false | TypedLocale\n /**\n * Specify [locale](https://payloadcms.com/docs/configuration/localization) for any returned documents.\n */\n locale?: 'all' | TypedLocale\n /**\n * If you are uploading a file and would like to replace\n * the existing file instead of generating a new filename,\n * you can set the following property to `true`\n */\n overrideLock?: boolean\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 * Publish the document / documents in all locales. Only applies when localization is enabled\n * and the global has localized fields.\n *\n * @default undefined\n */\n publishAllLocales?: boolean\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 * the Global slug to operate against.\n */\n slug: TSlug\n /**\n * Unpublish the document / documents in all locales. Only applies when localization is enabled\n * and the global has localized fields.\n */\n unpublishAllLocales?: 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} & Pick<FindOptions<string, SelectType>, 'select'> &\n Pick<SharedLocalAPIOptions, 'overrideAccess'>\n\nexport type Options<TSlug extends GlobalSlug, TSelect extends SelectType> = BaseOptions<\n TSlug,\n TSelect\n> &\n DraftFlagFromGlobalSlug<TSlug>\n\nexport async function updateGlobalLocal<\n TSlug extends GlobalSlug,\n TSelect extends SelectFromGlobalSlug<TSlug>,\n>(\n payload: Payload,\n options: Options<TSlug, TSelect>,\n): Promise<TransformGlobalWithSelect<TSlug, TSelect>> {\n const {\n slug: globalSlug,\n data,\n depth,\n draft,\n overrideAccess = false,\n overrideLock,\n populate,\n publishAllLocales,\n select,\n showHiddenFields,\n unpublishAllLocales,\n } = options\n\n const globalConfig = payload.globals.config.find((config) => config.slug === globalSlug)\n\n if (!globalConfig) {\n throw new APIError(`The global with slug ${String(globalSlug)} can't be found.`)\n }\n\n return updateOperation<TSlug, TSelect>({\n slug: globalSlug
|
|
1
|
+
{"version":3,"sources":["../../../../src/globals/operations/local/update.ts"],"sourcesContent":["import type { DeepPartial } from 'ts-essentials'\n\nimport type {\n PayloadRequest,\n PopulateType,\n SelectType,\n TransformGlobalWithSelect,\n} from '../../../types/index.js'\nimport type { SharedLocalAPIOptions } from '../../../types/operations.js'\nimport type { CreatePayloadRequestArgs } from '../../../utilities/createPayloadRequest.js'\nimport type {\n DataFromGlobalSlug,\n DraftFlagFromGlobalSlug,\n SelectFromGlobalSlug,\n} from '../../config/types.js'\n\nimport { APIError } from '../../../errors/index.js'\nimport {\n deepCopyObjectSimple,\n type FindOptions,\n type GlobalSlug,\n type Payload,\n type RequestContext,\n type TypedLocale,\n type User,\n} from '../../../index.js'\nimport { createPayloadRequest } from '../../../utilities/createPayloadRequest.js'\nimport { updateOperation } from '../update.js'\n\ntype BaseOptions<TSlug extends GlobalSlug, TSelect extends SelectType> = {\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 * The global data to update.\n */\n data: DeepPartial<Omit<DataFromGlobalSlug<TSlug>, 'id'>>\n /**\n * [Control auto-population](https://payloadcms.com/docs/queries/depth) of nested relationship and upload fields.\n */\n depth?: number\n /**\n * Specify a [fallback locale](https://payloadcms.com/docs/configuration/localization) to use for any returned documents.\n */\n fallbackLocale?: false | TypedLocale\n /**\n * Specify [locale](https://payloadcms.com/docs/configuration/localization) for any returned documents.\n */\n locale?: 'all' | TypedLocale\n /**\n * If you are uploading a file and would like to replace\n * the existing file instead of generating a new filename,\n * you can set the following property to `true`\n */\n overrideLock?: boolean\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 * Publish the document / documents in all locales. Only applies when localization is enabled\n * and the global has localized fields.\n *\n * @default undefined\n */\n publishAllLocales?: boolean\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 * the Global slug to operate against.\n */\n slug: TSlug\n /**\n * Unpublish the document / documents in all locales. Only applies when localization is enabled\n * and the global has localized fields.\n */\n unpublishAllLocales?: 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} & Pick<FindOptions<string, SelectType>, 'select'> &\n Pick<SharedLocalAPIOptions, 'overrideAccess'>\n\nexport type Options<TSlug extends GlobalSlug, TSelect extends SelectType> = BaseOptions<\n TSlug,\n TSelect\n> &\n DraftFlagFromGlobalSlug<TSlug>\n\nexport async function updateGlobalLocal<\n TSlug extends GlobalSlug,\n TSelect extends SelectFromGlobalSlug<TSlug>,\n>(\n payload: Payload,\n options: Options<TSlug, TSelect>,\n): Promise<TransformGlobalWithSelect<TSlug, TSelect>> {\n const {\n slug: globalSlug,\n data,\n depth,\n draft,\n overrideAccess = false,\n overrideLock,\n populate,\n publishAllLocales,\n select,\n showHiddenFields,\n unpublishAllLocales,\n } = options\n\n const globalConfig = payload.globals.config.find((config) => config.slug === globalSlug)\n\n if (!globalConfig) {\n throw new APIError(`The global with slug ${String(globalSlug)} can't be found.`)\n }\n\n return updateOperation<TSlug, TSelect>({\n slug: globalSlug,\n data: deepCopyObjectSimple(data), // Ensure mutation of data in create operation hooks doesn't affect the original data\n depth,\n draft,\n globalConfig,\n overrideAccess,\n overrideLock,\n populate,\n publishAllLocales,\n req: await createPayloadRequest({\n ...(options as Omit<CreatePayloadRequestArgs, 'payload'>),\n payload,\n }),\n select,\n showHiddenFields,\n unpublishAllLocales,\n })\n}\n"],"names":["APIError","deepCopyObjectSimple","createPayloadRequest","updateOperation","updateGlobalLocal","payload","options","slug","globalSlug","data","depth","draft","overrideAccess","overrideLock","populate","publishAllLocales","select","showHiddenFields","unpublishAllLocales","globalConfig","globals","config","find","String","req"],"mappings":"AAgBA,SAASA,QAAQ,QAAQ,2BAA0B;AACnD,SACEC,oBAAoB,QAOf,oBAAmB;AAC1B,SAASC,oBAAoB,QAAQ,6CAA4C;AACjF,SAASC,eAAe,QAAQ,eAAc;AA2E9C,OAAO,eAAeC,kBAIpBC,OAAgB,EAChBC,OAAgC;IAEhC,MAAM,EACJC,MAAMC,UAAU,EAChBC,IAAI,EACJC,KAAK,EACLC,KAAK,EACLC,iBAAiB,KAAK,EACtBC,YAAY,EACZC,QAAQ,EACRC,iBAAiB,EACjBC,MAAM,EACNC,gBAAgB,EAChBC,mBAAmB,EACpB,GAAGZ;IAEJ,MAAMa,eAAed,QAAQe,OAAO,CAACC,MAAM,CAACC,IAAI,CAAC,CAACD,SAAWA,OAAOd,IAAI,KAAKC;IAE7E,IAAI,CAACW,cAAc;QACjB,MAAM,IAAInB,SAAS,CAAC,qBAAqB,EAAEuB,OAAOf,YAAY,gBAAgB,CAAC;IACjF;IAEA,OAAOL,gBAAgC;QACrCI,MAAMC;QACNC,MAAMR,qBAAqBQ;QAC3BC;QACAC;QACAQ;QACAP;QACAC;QACAC;QACAC;QACAS,KAAK,MAAMtB,qBAAqB;YAC9B,GAAII,OAAO;YACXD;QACF;QACAW;QACAC;QACAC;IACF;AACF"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import type { PayloadRequest, PopulateType } from '../../types/index.js';
|
|
2
|
-
import type { TypeWithVersion } from '../../versions/types.js';
|
|
1
|
+
import type { JsonObject, PayloadRequest, PopulateType } from '../../types/index.js';
|
|
3
2
|
import type { SanitizedGlobalConfig } from '../config/types.js';
|
|
4
3
|
export type Arguments = {
|
|
5
4
|
depth?: number;
|
|
@@ -11,5 +10,5 @@ export type Arguments = {
|
|
|
11
10
|
req?: PayloadRequest;
|
|
12
11
|
showHiddenFields?: boolean;
|
|
13
12
|
};
|
|
14
|
-
export declare const restoreVersionOperation: <T extends
|
|
13
|
+
export declare const restoreVersionOperation: <T extends JsonObject = any>(args: Arguments) => Promise<T>;
|
|
15
14
|
//# sourceMappingURL=restoreVersion.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"restoreVersion.d.ts","sourceRoot":"","sources":["../../../src/globals/operations/restoreVersion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAS,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"restoreVersion.d.ts","sourceRoot":"","sources":["../../../src/globals/operations/restoreVersion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAS,MAAM,sBAAsB,CAAA;AAC3F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAiB/D,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,YAAY,EAAE,qBAAqB,CAAA;IACnC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,GAAG,CAAC,EAAE,cAAc,CAAA;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B,CAAA;AAED,eAAO,MAAM,uBAAuB,GAAU,CAAC,SAAS,UAAU,GAAG,GAAG,QAChE,SAAS,KACd,OAAO,CAAC,CAAC,CAoPX,CAAA"}
|
|
@@ -11,6 +11,7 @@ import { initTransaction } from '../../utilities/initTransaction.js';
|
|
|
11
11
|
import { killTransaction } from '../../utilities/killTransaction.js';
|
|
12
12
|
import { buildVersionGlobalFields } from '../../versions/buildGlobalFields.js';
|
|
13
13
|
import { getRestoredStatusesToAuthorize } from '../../versions/getRestoredStatusesToAuthorize.js';
|
|
14
|
+
import { saveVersion } from '../../versions/saveVersion.js';
|
|
14
15
|
export const restoreVersionOperation = async (args)=>{
|
|
15
16
|
assertNoValidationWrite(args.req);
|
|
16
17
|
const { id, depth, draft, globalConfig, overrideAccess, populate, showHiddenFields } = args;
|
|
@@ -122,23 +123,16 @@ export const restoreVersionOperation = async (args)=>{
|
|
|
122
123
|
req
|
|
123
124
|
});
|
|
124
125
|
let result = rawVersion.version;
|
|
125
|
-
if (global) {
|
|
126
|
+
if (global || draft) {
|
|
126
127
|
// Ensure updatedAt date is always updated
|
|
127
128
|
result.updatedAt = new Date().toISOString();
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
autosave: false,
|
|
136
|
-
createdAt: result.createdAt ? new Date(result.createdAt).toISOString() : now,
|
|
137
|
-
globalSlug: globalConfig.slug,
|
|
138
|
-
req,
|
|
139
|
-
updatedAt: draft ? now : new Date(result.updatedAt).toISOString(),
|
|
140
|
-
versionData: result
|
|
141
|
-
});
|
|
129
|
+
if (!draft) {
|
|
130
|
+
result = await payload.db.updateGlobal({
|
|
131
|
+
slug: globalConfig.slug,
|
|
132
|
+
data: result,
|
|
133
|
+
req
|
|
134
|
+
});
|
|
135
|
+
}
|
|
142
136
|
} else {
|
|
143
137
|
result = await payload.db.createGlobal({
|
|
144
138
|
slug: globalConfig.slug,
|
|
@@ -146,6 +140,19 @@ export const restoreVersionOperation = async (args)=>{
|
|
|
146
140
|
req
|
|
147
141
|
});
|
|
148
142
|
}
|
|
143
|
+
result = await saveVersion({
|
|
144
|
+
autosave: false,
|
|
145
|
+
docWithLocales: result,
|
|
146
|
+
draft,
|
|
147
|
+
global: globalConfig,
|
|
148
|
+
operation: 'restoreVersion',
|
|
149
|
+
payload,
|
|
150
|
+
req
|
|
151
|
+
});
|
|
152
|
+
result = {
|
|
153
|
+
...result,
|
|
154
|
+
globalType: globalConfig.slug
|
|
155
|
+
};
|
|
149
156
|
// /////////////////////////////////////
|
|
150
157
|
// afterRead - Fields
|
|
151
158
|
// /////////////////////////////////////
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/globals/operations/restoreVersion.ts"],"sourcesContent":["import type { PayloadRequest, PopulateType, Where } from '../../types/index.js'\nimport type { TypeWithVersion } from '../../versions/types.js'\nimport type { SanitizedGlobalConfig } from '../config/types.js'\n\nimport { executeAccess } from '../../auth/executeAccess.js'\nimport { hasWhereAccessResult } from '../../auth/types.js'\nimport { combineQueries } from '../../database/combineQueries.js'\nimport { sanitizeWhereQuery } from '../../database/sanitizeWhereQuery.js'\nimport { Forbidden, NotFound } from '../../errors/index.js'\nimport { afterChange } from '../../fields/hooks/afterChange/index.js'\nimport { afterRead } from '../../fields/hooks/afterRead/index.js'\nimport { assertNoValidationWrite } from '../../utilities/assertNoValidationWrite.js'\nimport { commitTransaction } from '../../utilities/commitTransaction.js'\nimport { initTransaction } from '../../utilities/initTransaction.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport { buildVersionGlobalFields } from '../../versions/buildGlobalFields.js'\nimport { getRestoredStatusesToAuthorize } from '../../versions/getRestoredStatusesToAuthorize.js'\n\nexport type Arguments = {\n depth?: number\n draft?: boolean\n globalConfig: SanitizedGlobalConfig\n id: number | string\n overrideAccess?: boolean\n populate?: PopulateType\n req?: PayloadRequest\n showHiddenFields?: boolean\n}\n\nexport const restoreVersionOperation = async <T extends TypeWithVersion<T> = any>(\n args: Arguments,\n): Promise<T> => {\n assertNoValidationWrite(args.req)\n\n const { id, depth, draft, globalConfig, overrideAccess, populate, showHiddenFields } = args\n const req = args.req!\n const { fallbackLocale, locale, payload } = req\n\n try {\n const shouldCommit = await initTransaction(req)\n\n // /////////////////////////////////////\n // beforeOperation - Global\n // /////////////////////////////////////\n\n if (globalConfig.hooks?.beforeOperation?.length) {\n for (const hook of globalConfig.hooks.beforeOperation) {\n args =\n (await hook({\n args,\n context: req.context,\n global: globalConfig,\n operation: 'restoreVersion',\n overrideAccess,\n req,\n })) || args\n }\n }\n\n // /////////////////////////////////////\n // Retrieve original raw version\n // /////////////////////////////////////\n\n // The selected version must satisfy read-version access.\n const readVersionsAccessResult = overrideAccess\n ? true\n : await executeAccess({ slug: globalConfig.slug, req }, globalConfig.access.readVersions)\n\n const versionFields = buildVersionGlobalFields(payload.config, globalConfig, true)\n const where = combineQueries({ id: { equals: id } }, readVersionsAccessResult)\n\n sanitizeWhereQuery({ fields: versionFields, payload, where })\n\n const { docs: versionDocs } = await payload.db.findGlobalVersions<any>({\n global: globalConfig.slug,\n limit: 1,\n req,\n where,\n })\n\n if (!versionDocs || versionDocs.length === 0) {\n if (hasWhereAccessResult(readVersionsAccessResult)) {\n throw new Forbidden(req.t)\n }\n throw new NotFound(req.t)\n }\n\n const rawVersion = versionDocs[0]!\n\n // Patch globalType onto version doc\n rawVersion.version.globalType = globalConfig.slug\n\n // Overwrite draft status if draft is true\n if (draft) {\n rawVersion.version._status = 'draft'\n }\n\n // A localized `_status` can publish and unpublish locales in one restore, so authorize every\n // status it writes. executeAccess throws Forbidden on the first denial.\n const restoredStatuses = getRestoredStatusesToAuthorize(rawVersion.version._status)\n\n const updateAccessResults: Array<boolean | Where> = []\n\n if (overrideAccess) {\n updateAccessResults.push(true)\n } else {\n const statusesToAuthorize = restoredStatuses.length > 0 ? restoredStatuses : [undefined]\n\n for (const status of statusesToAuthorize) {\n updateAccessResults.push(\n await executeAccess(\n {\n slug: globalConfig.slug,\n data: { _status: status },\n req,\n },\n globalConfig.access.update,\n ),\n )\n }\n }\n\n // /////////////////////////////////////\n // fetch previousDoc\n // /////////////////////////////////////\n\n const previousDoc = await payload.findGlobal({\n slug: globalConfig.slug,\n depth,\n overrideAccess: true,\n req,\n })\n\n req.context.isRestoringVersion = true\n\n // /////////////////////////////////////\n // Update global\n // /////////////////////////////////////\n\n for (const updateAccessResult of updateAccessResults) {\n if (!hasWhereAccessResult(updateAccessResult)) {\n continue\n }\n\n const constrainedGlobal = await payload.db.findGlobal({\n slug: globalConfig.slug,\n req,\n where: updateAccessResult,\n })\n\n if (!constrainedGlobal || Object.keys(constrainedGlobal).length === 0) {\n throw new Forbidden(req.t)\n }\n }\n\n const global = await payload.db.findGlobal({\n slug: globalConfig.slug,\n req,\n })\n\n let result = rawVersion.version\n\n if (global) {\n // Ensure updatedAt date is always updated\n result.updatedAt = new Date().toISOString()\n result = await payload.db.updateGlobal({\n slug: globalConfig.slug,\n data: result,\n req,\n })\n\n const now = new Date().toISOString()\n\n result = await payload.db.createGlobalVersion({\n autosave: false,\n createdAt: result.createdAt ? new Date(result.createdAt).toISOString() : now,\n globalSlug: globalConfig.slug,\n req,\n updatedAt: draft ? now : new Date(result.updatedAt).toISOString(),\n versionData: result,\n })\n } else {\n result = await payload.db.createGlobal({\n slug: globalConfig.slug,\n data: result,\n req,\n })\n }\n\n // /////////////////////////////////////\n // afterRead - Fields\n // /////////////////////////////////////\n\n result = await afterRead({\n collection: null,\n context: req.context,\n depth: depth!,\n doc: result,\n draft: undefined!,\n fallbackLocale: fallbackLocale!,\n global: globalConfig,\n locale: locale!,\n overrideAccess: overrideAccess!,\n populate,\n req,\n showHiddenFields: showHiddenFields!,\n })\n\n // /////////////////////////////////////\n // afterRead - Global\n // /////////////////////////////////////\n\n if (globalConfig.hooks?.afterRead?.length) {\n for (const hook of globalConfig.hooks.afterRead) {\n result =\n (await hook({\n context: req.context,\n doc: result,\n global: globalConfig,\n overrideAccess,\n req,\n })) || result\n }\n }\n\n // /////////////////////////////////////\n // afterChange - Fields\n // /////////////////////////////////////\n\n result = await afterChange({\n collection: null,\n context: req.context,\n data: result,\n doc: result,\n global: globalConfig,\n operation: 'update',\n previousDoc,\n req,\n })\n\n // /////////////////////////////////////\n // afterChange - Global\n // /////////////////////////////////////\n\n if (globalConfig.hooks?.afterChange?.length) {\n for (const hook of globalConfig.hooks.afterChange) {\n result =\n (await hook({\n context: req.context,\n data: result,\n doc: result,\n global: globalConfig,\n operation: 'update',\n overrideAccess,\n previousDoc,\n req,\n })) || result\n }\n }\n\n if (shouldCommit) {\n await commitTransaction(req)\n }\n\n return result\n } catch (error: unknown) {\n await killTransaction(req)\n throw error\n }\n}\n"],"names":["executeAccess","hasWhereAccessResult","combineQueries","sanitizeWhereQuery","Forbidden","NotFound","afterChange","afterRead","assertNoValidationWrite","commitTransaction","initTransaction","killTransaction","buildVersionGlobalFields","getRestoredStatusesToAuthorize","restoreVersionOperation","args","req","id","depth","draft","globalConfig","overrideAccess","populate","showHiddenFields","fallbackLocale","locale","payload","shouldCommit","hooks","beforeOperation","length","hook","context","global","operation","readVersionsAccessResult","slug","access","readVersions","versionFields","config","where","equals","fields","docs","versionDocs","db","findGlobalVersions","limit","t","rawVersion","version","globalType","_status","restoredStatuses","updateAccessResults","push","statusesToAuthorize","undefined","status","data","update","previousDoc","findGlobal","isRestoringVersion","updateAccessResult","constrainedGlobal","Object","keys","result","updatedAt","Date","toISOString","updateGlobal","now","createGlobalVersion","autosave","createdAt","globalSlug","versionData","createGlobal","collection","doc","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/globals/operations/restoreVersion.ts"],"sourcesContent":["import type { JsonObject, PayloadRequest, PopulateType, Where } from '../../types/index.js'\nimport type { SanitizedGlobalConfig } from '../config/types.js'\n\nimport { executeAccess } from '../../auth/executeAccess.js'\nimport { hasWhereAccessResult } from '../../auth/types.js'\nimport { combineQueries } from '../../database/combineQueries.js'\nimport { sanitizeWhereQuery } from '../../database/sanitizeWhereQuery.js'\nimport { Forbidden, NotFound } from '../../errors/index.js'\nimport { afterChange } from '../../fields/hooks/afterChange/index.js'\nimport { afterRead } from '../../fields/hooks/afterRead/index.js'\nimport { assertNoValidationWrite } from '../../utilities/assertNoValidationWrite.js'\nimport { commitTransaction } from '../../utilities/commitTransaction.js'\nimport { initTransaction } from '../../utilities/initTransaction.js'\nimport { killTransaction } from '../../utilities/killTransaction.js'\nimport { buildVersionGlobalFields } from '../../versions/buildGlobalFields.js'\nimport { getRestoredStatusesToAuthorize } from '../../versions/getRestoredStatusesToAuthorize.js'\nimport { saveVersion } from '../../versions/saveVersion.js'\n\nexport type Arguments = {\n depth?: number\n draft?: boolean\n globalConfig: SanitizedGlobalConfig\n id: number | string\n overrideAccess?: boolean\n populate?: PopulateType\n req?: PayloadRequest\n showHiddenFields?: boolean\n}\n\nexport const restoreVersionOperation = async <T extends JsonObject = any>(\n args: Arguments,\n): Promise<T> => {\n assertNoValidationWrite(args.req)\n\n const { id, depth, draft, globalConfig, overrideAccess, populate, showHiddenFields } = args\n const req = args.req!\n const { fallbackLocale, locale, payload } = req\n\n try {\n const shouldCommit = await initTransaction(req)\n\n // /////////////////////////////////////\n // beforeOperation - Global\n // /////////////////////////////////////\n\n if (globalConfig.hooks?.beforeOperation?.length) {\n for (const hook of globalConfig.hooks.beforeOperation) {\n args =\n (await hook({\n args,\n context: req.context,\n global: globalConfig,\n operation: 'restoreVersion',\n overrideAccess,\n req,\n })) || args\n }\n }\n\n // /////////////////////////////////////\n // Retrieve original raw version\n // /////////////////////////////////////\n\n // The selected version must satisfy read-version access.\n const readVersionsAccessResult = overrideAccess\n ? true\n : await executeAccess({ slug: globalConfig.slug, req }, globalConfig.access.readVersions)\n\n const versionFields = buildVersionGlobalFields(payload.config, globalConfig, true)\n const where = combineQueries({ id: { equals: id } }, readVersionsAccessResult)\n\n sanitizeWhereQuery({ fields: versionFields, payload, where })\n\n const { docs: versionDocs } = await payload.db.findGlobalVersions<any>({\n global: globalConfig.slug,\n limit: 1,\n req,\n where,\n })\n\n if (!versionDocs || versionDocs.length === 0) {\n if (hasWhereAccessResult(readVersionsAccessResult)) {\n throw new Forbidden(req.t)\n }\n throw new NotFound(req.t)\n }\n\n const rawVersion = versionDocs[0]!\n\n // Patch globalType onto version doc\n rawVersion.version.globalType = globalConfig.slug\n\n // Overwrite draft status if draft is true\n if (draft) {\n rawVersion.version._status = 'draft'\n }\n\n // A localized `_status` can publish and unpublish locales in one restore, so authorize every\n // status it writes. executeAccess throws Forbidden on the first denial.\n const restoredStatuses = getRestoredStatusesToAuthorize(rawVersion.version._status)\n\n const updateAccessResults: Array<boolean | Where> = []\n\n if (overrideAccess) {\n updateAccessResults.push(true)\n } else {\n const statusesToAuthorize = restoredStatuses.length > 0 ? restoredStatuses : [undefined]\n\n for (const status of statusesToAuthorize) {\n updateAccessResults.push(\n await executeAccess(\n {\n slug: globalConfig.slug,\n data: { _status: status },\n req,\n },\n globalConfig.access.update,\n ),\n )\n }\n }\n\n // /////////////////////////////////////\n // fetch previousDoc\n // /////////////////////////////////////\n\n const previousDoc = await payload.findGlobal({\n slug: globalConfig.slug,\n depth,\n overrideAccess: true,\n req,\n })\n\n req.context.isRestoringVersion = true\n\n // /////////////////////////////////////\n // Update global\n // /////////////////////////////////////\n\n for (const updateAccessResult of updateAccessResults) {\n if (!hasWhereAccessResult(updateAccessResult)) {\n continue\n }\n\n const constrainedGlobal = await payload.db.findGlobal({\n slug: globalConfig.slug,\n req,\n where: updateAccessResult,\n })\n\n if (!constrainedGlobal || Object.keys(constrainedGlobal).length === 0) {\n throw new Forbidden(req.t)\n }\n }\n\n const global = await payload.db.findGlobal({\n slug: globalConfig.slug,\n req,\n })\n\n let result = rawVersion.version\n\n if (global || draft) {\n // Ensure updatedAt date is always updated\n result.updatedAt = new Date().toISOString()\n if (!draft) {\n result = await payload.db.updateGlobal({\n slug: globalConfig.slug,\n data: result,\n req,\n })\n }\n } else {\n result = await payload.db.createGlobal({\n slug: globalConfig.slug,\n data: result,\n req,\n })\n }\n\n result = await saveVersion({\n autosave: false,\n docWithLocales: result,\n draft,\n global: globalConfig,\n operation: 'restoreVersion',\n payload,\n req,\n })\n\n result = {\n ...result,\n globalType: globalConfig.slug,\n }\n\n // /////////////////////////////////////\n // afterRead - Fields\n // /////////////////////////////////////\n\n result = await afterRead({\n collection: null,\n context: req.context,\n depth: depth!,\n doc: result,\n draft: undefined!,\n fallbackLocale: fallbackLocale!,\n global: globalConfig,\n locale: locale!,\n overrideAccess: overrideAccess!,\n populate,\n req,\n showHiddenFields: showHiddenFields!,\n })\n\n // /////////////////////////////////////\n // afterRead - Global\n // /////////////////////////////////////\n\n if (globalConfig.hooks?.afterRead?.length) {\n for (const hook of globalConfig.hooks.afterRead) {\n result =\n (await hook({\n context: req.context,\n doc: result,\n global: globalConfig,\n overrideAccess,\n req,\n })) || result\n }\n }\n\n // /////////////////////////////////////\n // afterChange - Fields\n // /////////////////////////////////////\n\n result = await afterChange({\n collection: null,\n context: req.context,\n data: result,\n doc: result,\n global: globalConfig,\n operation: 'update',\n previousDoc,\n req,\n })\n\n // /////////////////////////////////////\n // afterChange - Global\n // /////////////////////////////////////\n\n if (globalConfig.hooks?.afterChange?.length) {\n for (const hook of globalConfig.hooks.afterChange) {\n result =\n (await hook({\n context: req.context,\n data: result,\n doc: result,\n global: globalConfig,\n operation: 'update',\n overrideAccess,\n previousDoc,\n req,\n })) || result\n }\n }\n\n if (shouldCommit) {\n await commitTransaction(req)\n }\n\n return result\n } catch (error: unknown) {\n await killTransaction(req)\n throw error\n }\n}\n"],"names":["executeAccess","hasWhereAccessResult","combineQueries","sanitizeWhereQuery","Forbidden","NotFound","afterChange","afterRead","assertNoValidationWrite","commitTransaction","initTransaction","killTransaction","buildVersionGlobalFields","getRestoredStatusesToAuthorize","saveVersion","restoreVersionOperation","args","req","id","depth","draft","globalConfig","overrideAccess","populate","showHiddenFields","fallbackLocale","locale","payload","shouldCommit","hooks","beforeOperation","length","hook","context","global","operation","readVersionsAccessResult","slug","access","readVersions","versionFields","config","where","equals","fields","docs","versionDocs","db","findGlobalVersions","limit","t","rawVersion","version","globalType","_status","restoredStatuses","updateAccessResults","push","statusesToAuthorize","undefined","status","data","update","previousDoc","findGlobal","isRestoringVersion","updateAccessResult","constrainedGlobal","Object","keys","result","updatedAt","Date","toISOString","updateGlobal","createGlobal","autosave","docWithLocales","collection","doc","error"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/globals/operations/validate.ts"],"sourcesContent":["import type { DeepPartial } from 'ts-essentials'\n\nimport type { TypeWithID } from '../../collections/config/types.js'\nimport type { AccessResult } from '../../config/types.js'\nimport type { GlobalSlug, JsonObject } from '../../index.js'\nimport type { PayloadRequest } from '../../types/index.js'\nimport type { ValidationResult } from '../../types/validation.js'\nimport type { ValidationSourceData } from '../../utilities/runValidationLifecycle.js'\nimport type { DataFromGlobalSlug, SanitizedGlobalConfig } from '../config/types.js'\n\nimport { executeAccess } from '../../auth/executeAccess.js'\nimport { hasWhereAccessResult } from '../../auth/types.js'\nimport { Forbidden } from '../../errors/index.js'\nimport { afterRead } from '../../fields/hooks/afterRead/index.js'\nimport { deepCopyObjectSimple } from '../../utilities/deepCopyObject.js'\nimport { flattenDataByLocale } from '../../utilities/flattenDataByLocale.js'\nimport { runValidationLifecycle } from '../../utilities/runValidationLifecycle.js'\nimport {\n findDraftVersion,\n getDocumentFromDraftVersion,\n} from '../../versions/drafts/replaceWithDraftIfAvailable.js'\n\nexport type Arguments<TSlug extends GlobalSlug> = {\n data?: DeepPartial<Omit<DataFromGlobalSlug<TSlug>, 'id'>>\n draft: boolean\n globalConfig: SanitizedGlobalConfig\n onValidationData?: (data: JsonObject) => void\n overrideAccess: boolean\n req: PayloadRequest\n skipAccessControl?: boolean\n skipMutationHooks?: boolean\n slug: string\n sourceData?: ValidationSourceData\n validationOperation?: 'update' | 'validate'\n}\n\nexport async function validateOperation<TSlug extends GlobalSlug>(\n args: Arguments<TSlug>,\n): Promise<ValidationResult> {\n const previousOperation = args.req.operation\n args.req.operation = args.validationOperation ?? 'validate'\n\n try {\n return await validateOperationWithScopedRequest(args)\n } finally {\n args.req.operation = previousOperation\n }\n}\n\nasync function validateOperationWithScopedRequest<TSlug extends GlobalSlug>({\n slug,\n data: incomingData,\n draft,\n globalConfig,\n onValidationData,\n overrideAccess,\n req,\n skipAccessControl = false,\n skipMutationHooks = false,\n sourceData,\n validationOperation = 'validate',\n}: Arguments<TSlug>): Promise<ValidationResult> {\n const accessResult =\n !skipAccessControl && !overrideAccess\n ? await executeAccess({ slug, data: incomingData, req }, globalConfig.access.validate)\n : true\n const storedGlobal = sourceData\n ? sourceData.docWithLocales\n : await resolveValidationGlobalSource({\n slug,\n accessResult,\n draft,\n globalConfig,\n overrideAccess,\n req,\n })\n\n const docWithLocales: JsonObject = deepCopyObjectSimple(storedGlobal)\n\n if (docWithLocales._id) {\n delete docWithLocales._id\n }\n\n const originalDoc = sourceData\n ? req.locale === sourceData.originalLocale\n ? deepCopyObjectSimple(sourceData.originalDoc)\n : flattenDataByLocale({\n configBlockReferences: req.payload.config.blocks,\n docWithLocales,\n fields: globalConfig.fields,\n locale: req.locale!,\n })\n : await afterRead({\n collection: null,\n context: req.context,\n depth: 0,\n doc: deepCopyObjectSimple(docWithLocales),\n draft,\n fallbackLocale: req.fallbackLocale!,\n global: globalConfig,\n locale: req.locale!,\n overrideAccess: true,\n req,\n showHiddenFields: true,\n })\n\n return runValidationLifecycle({\n collection: null,\n docWithLocales,\n global: globalConfig,\n incomingData
|
|
1
|
+
{"version":3,"sources":["../../../src/globals/operations/validate.ts"],"sourcesContent":["import type { DeepPartial } from 'ts-essentials'\n\nimport type { TypeWithID } from '../../collections/config/types.js'\nimport type { AccessResult } from '../../config/types.js'\nimport type { GlobalSlug, JsonObject } from '../../index.js'\nimport type { PayloadRequest } from '../../types/index.js'\nimport type { ValidationResult } from '../../types/validation.js'\nimport type { ValidationSourceData } from '../../utilities/runValidationLifecycle.js'\nimport type { DataFromGlobalSlug, SanitizedGlobalConfig } from '../config/types.js'\n\nimport { executeAccess } from '../../auth/executeAccess.js'\nimport { hasWhereAccessResult } from '../../auth/types.js'\nimport { Forbidden } from '../../errors/index.js'\nimport { afterRead } from '../../fields/hooks/afterRead/index.js'\nimport { deepCopyObjectSimple } from '../../utilities/deepCopyObject.js'\nimport { flattenDataByLocale } from '../../utilities/flattenDataByLocale.js'\nimport { runValidationLifecycle } from '../../utilities/runValidationLifecycle.js'\nimport {\n findDraftVersion,\n getDocumentFromDraftVersion,\n} from '../../versions/drafts/replaceWithDraftIfAvailable.js'\n\nexport type Arguments<TSlug extends GlobalSlug> = {\n data?: DeepPartial<Omit<DataFromGlobalSlug<TSlug>, 'id'>>\n draft: boolean\n globalConfig: SanitizedGlobalConfig\n onValidationData?: (data: JsonObject) => void\n overrideAccess: boolean\n req: PayloadRequest\n skipAccessControl?: boolean\n skipMutationHooks?: boolean\n slug: string\n sourceData?: ValidationSourceData\n validationOperation?: 'update' | 'validate'\n}\n\nexport async function validateOperation<TSlug extends GlobalSlug>(\n args: Arguments<TSlug>,\n): Promise<ValidationResult> {\n const previousOperation = args.req.operation\n args.req.operation = args.validationOperation ?? 'validate'\n\n try {\n return await validateOperationWithScopedRequest(args)\n } finally {\n args.req.operation = previousOperation\n }\n}\n\nasync function validateOperationWithScopedRequest<TSlug extends GlobalSlug>({\n slug,\n data: incomingData,\n draft,\n globalConfig,\n onValidationData,\n overrideAccess,\n req,\n skipAccessControl = false,\n skipMutationHooks = false,\n sourceData,\n validationOperation = 'validate',\n}: Arguments<TSlug>): Promise<ValidationResult> {\n const accessResult =\n !skipAccessControl && !overrideAccess\n ? await executeAccess({ slug, data: incomingData, req }, globalConfig.access.validate)\n : true\n const storedGlobal = sourceData\n ? sourceData.docWithLocales\n : await resolveValidationGlobalSource({\n slug,\n accessResult,\n draft,\n globalConfig,\n overrideAccess,\n req,\n })\n\n const docWithLocales: JsonObject = deepCopyObjectSimple(storedGlobal)\n\n if (docWithLocales._id) {\n delete docWithLocales._id\n }\n\n const originalDoc = sourceData\n ? req.locale === sourceData.originalLocale\n ? deepCopyObjectSimple(sourceData.originalDoc)\n : flattenDataByLocale({\n configBlockReferences: req.payload.config.blocks,\n docWithLocales,\n fields: globalConfig.fields,\n locale: req.locale!,\n })\n : await afterRead({\n collection: null,\n context: req.context,\n depth: 0,\n doc: deepCopyObjectSimple(docWithLocales),\n draft,\n fallbackLocale: req.fallbackLocale!,\n global: globalConfig,\n locale: req.locale!,\n overrideAccess: true,\n req,\n showHiddenFields: true,\n })\n\n return runValidationLifecycle({\n collection: null,\n docWithLocales,\n global: globalConfig,\n incomingData,\n onValidationData,\n originalDoc,\n overrideAccess,\n req,\n skipMutationHooks,\n validationOperation,\n })\n}\n\n/**\n * Selects the newest stored source before it applies a `where` access policy. This prevents an\n * older accessible draft from replacing a newer restricted draft. If no draft exists, the main\n * global remains the validation source.\n */\nasync function resolveValidationGlobalSource({\n slug,\n accessResult,\n draft,\n globalConfig,\n overrideAccess,\n req,\n}: {\n accessResult: AccessResult\n draft: boolean\n globalConfig: SanitizedGlobalConfig\n overrideAccess: boolean\n req: PayloadRequest\n slug: string\n}): Promise<JsonObject> {\n const main = await req.payload.db.findGlobal({\n slug,\n locale: req.locale!,\n req,\n })\n const hasMain = hasGlobalSource(main)\n const base = (hasMain ? main : { globalType: slug }) as JsonObject & TypeWithID\n\n if (draft && globalConfig.versions?.drafts) {\n const newestDraft = await findDraftVersion({\n accessResult: true,\n doc: base,\n entity: globalConfig,\n entityType: 'global',\n overrideAccess: true,\n req,\n })\n\n if (newestDraft) {\n if (hasWhereAccessResult(accessResult)) {\n const accessibleDraft = await findDraftVersion({\n accessResult,\n doc: base,\n draftVersionID: newestDraft.id,\n entity: globalConfig,\n entityType: 'global',\n overrideAccess,\n req,\n })\n\n if (!accessibleDraft) {\n throw new Forbidden(req.t)\n }\n }\n\n return getDocumentFromDraftVersion({\n doc: base,\n draftVersion: newestDraft,\n entityType: 'global',\n })\n }\n }\n\n if (!hasMain) {\n return {}\n }\n\n if (!hasWhereAccessResult(accessResult)) {\n return main\n }\n\n const accessibleMain = await req.payload.db.findGlobal({\n slug,\n locale: req.locale!,\n req,\n where: accessResult,\n })\n\n if (!hasGlobalSource(accessibleMain)) {\n throw new Forbidden(req.t)\n }\n\n return accessibleMain\n}\n\nfunction hasGlobalSource(source: JsonObject | null | undefined): source is JsonObject {\n return Boolean(source && Object.keys(source).length > 0)\n}\n"],"names":["executeAccess","hasWhereAccessResult","Forbidden","afterRead","deepCopyObjectSimple","flattenDataByLocale","runValidationLifecycle","findDraftVersion","getDocumentFromDraftVersion","validateOperation","args","previousOperation","req","operation","validationOperation","validateOperationWithScopedRequest","slug","data","incomingData","draft","globalConfig","onValidationData","overrideAccess","skipAccessControl","skipMutationHooks","sourceData","accessResult","access","validate","storedGlobal","docWithLocales","resolveValidationGlobalSource","_id","originalDoc","locale","originalLocale","configBlockReferences","payload","config","blocks","fields","collection","context","depth","doc","fallbackLocale","global","showHiddenFields","main","db","findGlobal","hasMain","hasGlobalSource","base","globalType","versions","drafts","newestDraft","entity","entityType","accessibleDraft","draftVersionID","id","t","draftVersion","accessibleMain","where","source","Boolean","Object","keys","length"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/hierarchy/createFolderField.ts"],"sourcesContent":["import type { RelationshipField, SingleRelationshipField } from '../fields/config/types.js'\n\nimport { getHierarchyFieldName } from './constants.js'\n\n/**\n * Options for creating a folder relationship field.\n * All SingleRelationshipField properties are available except name, type, relationTo, and hasMany\n * which are managed by the folder system.\n */\nexport type CreateFolderFieldOptions = {\n /**\n * The slug of the hierarchy collection this field references (e.g., 'folders')\n */\n relationTo: string\n} & Pick<Partial<SingleRelationshipField>, 'admin' | 'label' | 'required'>\n\n/**\n * Creates a relationship field for folder-style hierarchies (single-select).\n *\n * This field:\n * - Has hasMany:false (single folder selection)\n * - Uses NullField to render nothing in the form (no DOM output)\n * - Injects a header button for folder selection via miller columns UI\n *\n * Use this in your collection's fields array to add a folder relationship.\n * The field name is automatically generated based on the hierarchy slug.\n *\n * @example\n * import { createFolderField } from 'payload'\n *\n * const Posts: CollectionConfig = {\n * slug: 'posts',\n * fields: [\n * { name: 'title', type: 'text' },\n * createFolderField({\n * relationTo: 'folders',\n * label: 'Folder',\n * }),\n * ],\n * }\n */\nexport function createFolderField(options: CreateFolderFieldOptions): RelationshipField {\n const { admin: adminOverrides, label, relationTo, ...restOptions } = options\n const { components: componentOverrides, ...restAdminOverrides } = adminOverrides || {}\n\n return {\n name: getHierarchyFieldName(relationTo),\n type: 'relationship',\n admin: {\n position: 'sidebar',\n ...restAdminOverrides,\n components: {\n // NullField renders nothing - the header button handles the UI\n Field: '@payloadcms/ui#NullField',\n ...componentOverrides,\n },\n },\n custom: {\n hierarchy: {\n injectHeaderButton: true,\n },\n },\n hasMany: false,\n index: true,\n label: label ?? 'Folder',\n relationTo,\n ...restOptions,\n }
|
|
1
|
+
{"version":3,"sources":["../../src/hierarchy/createFolderField.ts"],"sourcesContent":["import type { RelationshipField, SingleRelationshipField } from '../fields/config/types.js'\n\nimport { getHierarchyFieldName } from './constants.js'\n\n/**\n * Options for creating a folder relationship field.\n * All SingleRelationshipField properties are available except name, type, relationTo, and hasMany\n * which are managed by the folder system.\n */\nexport type CreateFolderFieldOptions = {\n /**\n * The slug of the hierarchy collection this field references (e.g., 'folders')\n */\n relationTo: string\n} & Pick<Partial<SingleRelationshipField>, 'admin' | 'label' | 'required'>\n\n/**\n * Creates a relationship field for folder-style hierarchies (single-select).\n *\n * This field:\n * - Has hasMany:false (single folder selection)\n * - Uses NullField to render nothing in the form (no DOM output)\n * - Injects a header button for folder selection via miller columns UI\n *\n * Use this in your collection's fields array to add a folder relationship.\n * The field name is automatically generated based on the hierarchy slug.\n *\n * @example\n * import { createFolderField } from 'payload'\n *\n * const Posts: CollectionConfig = {\n * slug: 'posts',\n * fields: [\n * { name: 'title', type: 'text' },\n * createFolderField({\n * relationTo: 'folders',\n * label: 'Folder',\n * }),\n * ],\n * }\n */\nexport function createFolderField(options: CreateFolderFieldOptions): RelationshipField {\n const { admin: adminOverrides, label, relationTo, ...restOptions } = options\n const { components: componentOverrides, ...restAdminOverrides } = adminOverrides || {}\n\n return {\n name: getHierarchyFieldName(relationTo),\n type: 'relationship',\n admin: {\n position: 'sidebar',\n ...restAdminOverrides,\n components: {\n // NullField renders nothing - the header button handles the UI\n Field: '@payloadcms/ui#NullField',\n ...componentOverrides,\n },\n },\n custom: {\n hierarchy: {\n injectHeaderButton: true,\n },\n },\n hasMany: false,\n index: true,\n label: label ?? 'Folder',\n relationTo,\n ...restOptions,\n }\n}\n"],"names":["getHierarchyFieldName","createFolderField","options","admin","adminOverrides","label","relationTo","restOptions","components","componentOverrides","restAdminOverrides","name","type","position","Field","custom","hierarchy","injectHeaderButton","hasMany","index"],"mappings":"AAEA,SAASA,qBAAqB,QAAQ,iBAAgB;AActD;;;;;;;;;;;;;;;;;;;;;;;;CAwBC,GACD,OAAO,SAASC,kBAAkBC,OAAiC;IACjE,MAAM,EAAEC,OAAOC,cAAc,EAAEC,KAAK,EAAEC,UAAU,EAAE,GAAGC,aAAa,GAAGL;IACrE,MAAM,EAAEM,YAAYC,kBAAkB,EAAE,GAAGC,oBAAoB,GAAGN,kBAAkB,CAAC;IAErF,OAAO;QACLO,MAAMX,sBAAsBM;QAC5BM,MAAM;QACNT,OAAO;YACLU,UAAU;YACV,GAAGH,kBAAkB;YACrBF,YAAY;gBACV,+DAA+D;gBAC/DM,OAAO;gBACP,GAAGL,kBAAkB;YACvB;QACF;QACAM,QAAQ;YACNC,WAAW;gBACTC,oBAAoB;YACtB;QACF;QACAC,SAAS;QACTC,OAAO;QACPd,OAAOA,SAAS;QAChBC;QACA,GAAGC,WAAW;IAChB;AACF"}
|
|
@@ -93,7 +93,7 @@ import { injectHierarchyButton } from './injectHierarchyButton.js';
|
|
|
93
93
|
if (hierarchyConfig.collectionSpecific) {
|
|
94
94
|
injectTypeField({
|
|
95
95
|
config,
|
|
96
|
-
hierarchyCollection
|
|
96
|
+
hierarchyCollection,
|
|
97
97
|
parentFieldName: hierarchyConfig.parentFieldName,
|
|
98
98
|
sanitizedRelatedCollections,
|
|
99
99
|
typeFieldName: hierarchyConfig.collectionSpecific.fieldName
|
|
@@ -116,7 +116,7 @@ import { injectHierarchyButton } from './injectHierarchyButton.js';
|
|
|
116
116
|
// Add afterDelete hook to clear folder references from related documents
|
|
117
117
|
if (Object.keys(sanitizedRelatedCollections).length > 0) {
|
|
118
118
|
injectAfterDeleteHook({
|
|
119
|
-
hierarchyCollection
|
|
119
|
+
hierarchyCollection,
|
|
120
120
|
sanitizedRelatedCollections
|
|
121
121
|
});
|
|
122
122
|
}
|