payload 4.0.0-beta.2 → 4.0.0-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/adapters/router.d.ts +1 -1
- package/dist/admin/adapters/router.d.ts.map +1 -1
- package/dist/admin/adapters/router.js.map +1 -1
- package/dist/admin/initAdminContext.js.map +1 -1
- package/dist/auth/getFieldsToSign.js.map +1 -1
- package/dist/auth/loginWithCookie.js.map +1 -1
- package/dist/auth/serverFunctions/cookies.js.map +1 -1
- package/dist/auth/serverFunctions/login.js.map +1 -1
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/auth/types.js.map +1 -1
- package/dist/cli/commands/data/utilities.d.ts +1 -1
- package/dist/cli/commands/data/utilities.d.ts.map +1 -1
- package/dist/cli/commands/data/utilities.js.map +1 -1
- package/dist/cli/defineCLICommand.js +1 -1
- package/dist/cli/defineCLICommand.js.map +1 -1
- package/dist/collections/config/client.js.map +1 -1
- package/dist/collections/config/types.d.ts.map +1 -1
- package/dist/collections/config/types.js.map +1 -1
- package/dist/collections/operations/findByID.js.map +1 -1
- package/dist/collections/operations/findVersionByID.js.map +1 -1
- package/dist/collections/operations/findVersions.js.map +1 -1
- package/dist/collections/operations/local/findDistinct.js.map +1 -1
- package/dist/collections/operations/renameFile.js +1 -1
- package/dist/collections/operations/renameFile.js.map +1 -1
- package/dist/collections/operations/utilities/update.js +1 -1
- package/dist/collections/operations/utilities/update.js.map +1 -1
- package/dist/collections/operations/validate.js +4 -4
- package/dist/collections/operations/validate.js.map +1 -1
- package/dist/config/definePlugin.js.map +1 -1
- package/dist/config/sanitize.js +2 -2
- package/dist/config/sanitize.js.map +1 -1
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js.map +1 -1
- package/dist/database/types.d.ts +4 -0
- package/dist/database/types.d.ts.map +1 -1
- package/dist/database/types.js.map +1 -1
- package/dist/exports/build-config.d.ts +9 -0
- package/dist/exports/build-config.d.ts.map +1 -0
- package/dist/exports/build-config.js +38 -0
- package/dist/exports/build-config.js.map +1 -0
- package/dist/fields/config/client.js.map +1 -1
- package/dist/fields/config/reservedFieldNames.d.ts.map +1 -1
- package/dist/fields/config/reservedFieldNames.js.map +1 -1
- package/dist/fields/config/types.d.ts.map +1 -1
- package/dist/fields/config/types.js.map +1 -1
- package/dist/fields/hooks/afterChange/promise.js.map +1 -1
- package/dist/fields/hooks/afterRead/promise.js.map +1 -1
- package/dist/fields/hooks/beforeChange/flattenValidationData.d.ts +14 -0
- package/dist/fields/hooks/beforeChange/flattenValidationData.d.ts.map +1 -0
- package/dist/fields/hooks/beforeChange/flattenValidationData.js +36 -0
- package/dist/fields/hooks/beforeChange/flattenValidationData.js.map +1 -0
- package/dist/fields/hooks/beforeChange/promise.d.ts +2 -1
- package/dist/fields/hooks/beforeChange/promise.d.ts.map +1 -1
- package/dist/fields/hooks/beforeChange/promise.js +96 -22
- package/dist/fields/hooks/beforeChange/promise.js.map +1 -1
- package/dist/fields/hooks/beforeChange/traverseFields.d.ts +2 -1
- package/dist/fields/hooks/beforeChange/traverseFields.d.ts.map +1 -1
- package/dist/fields/hooks/beforeChange/traverseFields.js +2 -1
- package/dist/fields/hooks/beforeChange/traverseFields.js.map +1 -1
- package/dist/fields/validations.d.ts.map +1 -1
- package/dist/fields/validations.js +4 -1
- package/dist/fields/validations.js.map +1 -1
- package/dist/globals/config/types.d.ts.map +1 -1
- package/dist/globals/config/types.js.map +1 -1
- package/dist/globals/operations/local/findOne.js.map +1 -1
- package/dist/globals/operations/local/update.js.map +1 -1
- package/dist/globals/operations/restoreVersion.d.ts +2 -3
- package/dist/globals/operations/restoreVersion.d.ts.map +1 -1
- package/dist/globals/operations/restoreVersion.js +22 -15
- package/dist/globals/operations/restoreVersion.js.map +1 -1
- package/dist/globals/operations/validate.js +1 -1
- package/dist/globals/operations/validate.js.map +1 -1
- package/dist/hierarchy/createFolderField.js.map +1 -1
- package/dist/hierarchy/resolveHierarchyCollections.js +2 -2
- package/dist/hierarchy/resolveHierarchyCollections.js.map +1 -1
- package/dist/hierarchy/utils/computePaths.d.ts.map +1 -1
- package/dist/hierarchy/utils/computePaths.js.map +1 -1
- package/dist/index.bundled.d.ts +18 -4
- package/dist/queues/operations/runJobs/runJob/getRunTaskFunction.js +1 -1
- package/dist/queues/operations/runJobs/runJob/getRunTaskFunction.js.map +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/uploads/fileVersioning/archive.js.map +1 -1
- package/dist/uploads/fileVersioning/cloudStorage.js.map +1 -1
- package/dist/uploads/fileVersioning/resolveHistoricalFile.js.map +1 -1
- package/dist/uploads/generateFileData.d.ts.map +1 -1
- package/dist/uploads/generateFileData.js.map +1 -1
- package/dist/uploads/getFileContentRequirement.js.map +1 -1
- package/dist/uploads/getFileFromUploadInstructions.js.map +1 -1
- package/dist/uploads/safeFetch.js.map +1 -1
- package/dist/uploads/stagedUpload.js.map +1 -1
- package/dist/uploads/transformers/handleDynamicFileRequest.js +11 -2
- package/dist/uploads/transformers/handleDynamicFileRequest.js.map +1 -1
- package/dist/utilities/addSelectGenericsToGeneretedTypes.d.ts.map +1 -1
- package/dist/utilities/addSelectGenericsToGeneretedTypes.js +0 -1
- package/dist/utilities/addSelectGenericsToGeneretedTypes.js.map +1 -1
- package/dist/utilities/appendDateTimezoneSelectFields.js.map +1 -1
- package/dist/utilities/cloneValidationRequest.js.map +1 -1
- package/dist/utilities/createPayloadRequest.js.map +1 -1
- package/dist/utilities/deepCopyObject.js.map +1 -1
- package/dist/utilities/documentMatchingWhereExists.js +1 -1
- package/dist/utilities/documentMatchingWhereExists.js.map +1 -1
- package/dist/utilities/entityInputSchema/validateEntityData.d.ts.map +1 -1
- package/dist/utilities/entityInputSchema/validateEntityData.js.map +1 -1
- package/dist/utilities/filterDataToSelectedLocales.js.map +1 -1
- package/dist/utilities/getEntityPermissions/getEntityPermissions.d.ts.map +1 -1
- package/dist/utilities/getEntityPermissions/getEntityPermissions.js +1 -0
- package/dist/utilities/getEntityPermissions/getEntityPermissions.js.map +1 -1
- package/dist/utilities/getEntityPermissions/populateFieldPermissions.js.map +1 -1
- package/dist/utilities/getVersionsConfig.js.map +1 -1
- package/dist/utilities/parseParams/index.js.map +1 -1
- package/dist/utilities/parseValidationLocale.js.map +1 -1
- package/dist/utilities/sanitizePopulateParam.js.map +1 -1
- package/dist/utilities/telemetry/conf/index.d.ts +4 -1
- package/dist/utilities/telemetry/conf/index.d.ts.map +1 -1
- package/dist/utilities/telemetry/conf/index.js.map +1 -1
- package/dist/utilities/telemetry/featureInfo/getFeatureInfo.js.map +1 -1
- package/dist/versions/allLocalesPublicationStatus.js.map +1 -1
- package/dist/versions/isInheritedReadVersionsAccess.js.map +1 -1
- package/package.json +29 -27
- package/skills/payload/reference/ENDPOINTS.md +3 -9
- package/skills/payload/reference/PLUGIN-DEVELOPMENT.md +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/fields/hooks/beforeChange/promise.ts"],"sourcesContent":["import type { RichTextAdapter } from '../../../admin/RichText.js'\nimport type { SanitizedCollectionConfig } from '../../../collections/config/types.js'\nimport type { ValidationFieldError } from '../../../errors/index.js'\nimport type { SanitizedGlobalConfig } from '../../../globals/config/types.js'\nimport type { FieldOperation, JsonObject, PayloadRequest } from '../../../types/index.js'\nimport type { Block, Field, TabAsField, Validate } from '../../config/types.js'\n\nimport { MissingEditorProp } from '../../../errors/index.js'\nimport { type RequestContext, validateBlocksFilterOptions } from '../../../index.js'\nimport { deepMergeWithSourceArrays } from '../../../utilities/deepMerge.js'\nimport { getTranslatedLabel } from '../../../utilities/getTranslatedLabel.js'\nimport { fieldAffectsData, fieldShouldBeLocalized, tabHasName } from '../../config/types.js'\nimport { getFieldPaths } from '../../getFieldPaths.js'\nimport { getExistingRowDoc } from './getExistingRowDoc.js'\nimport { traverseFields } from './traverseFields.js'\n\nfunction buildFieldLabel(parentLabel: string, label: string | undefined): string {\n if (!label) {\n return parentLabel\n }\n const capitalizedLabel = label.charAt(0).toUpperCase() + label.slice(1)\n return parentLabel && capitalizedLabel\n ? `${parentLabel} > ${capitalizedLabel}`\n : capitalizedLabel || parentLabel\n}\n\ntype Args = {\n /**\n * Data of the nearest parent block. If no parent block exists, this will be the `undefined`\n */\n blockData?: JsonObject\n collection: null | SanitizedCollectionConfig\n context: RequestContext\n data: JsonObject\n doc: JsonObject\n docWithLocales: JsonObject\n errors: ValidationFieldError[]\n field: Field | TabAsField\n fieldIndex: number\n /**\n * Built up labels of parent fields\n *\n * @example \"Group Field > Tab Field > Text Field\"\n */\n fieldLabelPath: string\n global: null | SanitizedGlobalConfig\n id?: number | string\n isValidationOperation: boolean\n mergeLocaleActions: (() => Promise<void> | void)[]\n operation: FieldOperation\n overrideAccess: boolean\n parentIndexPath: string\n parentIsLocalized: boolean\n parentPath: string\n parentSchemaPath: string\n req: PayloadRequest\n siblingData: JsonObject\n siblingDoc: JsonObject\n siblingDocWithLocales?: JsonObject\n siblingFields?: (Field | TabAsField)[]\n skipHooks: boolean\n skipValidation: boolean\n submittedTopLevelFieldNames?: ReadonlySet<string>\n}\n\n// This function is responsible for the following actions, in order:\n// - Run condition\n// - Execute field hooks\n// - Validate data\n// - Transform data for storage\n// - beforeDuplicate hooks (if duplicate)\n// - Unflatten locales\n\nexport const promise = async ({\n id,\n blockData,\n collection,\n context,\n data,\n doc,\n docWithLocales,\n errors,\n field,\n fieldIndex,\n fieldLabelPath,\n global,\n isValidationOperation,\n mergeLocaleActions,\n operation,\n overrideAccess,\n parentIndexPath,\n parentIsLocalized,\n parentPath,\n parentSchemaPath,\n req,\n siblingData,\n siblingDoc,\n siblingDocWithLocales,\n siblingFields,\n skipHooks,\n skipValidation,\n submittedTopLevelFieldNames,\n}: Args): Promise<void> => {\n const { indexPath, path, schemaPath } = getFieldPaths({\n field,\n index: fieldIndex,\n parentIndexPath,\n parentPath,\n parentSchemaPath,\n })\n\n const { localization } = req.payload.config\n const defaultLocale = localization ? localization?.defaultLocale : 'en'\n const operationLocale = req.locale || defaultLocale\n\n const pathSegments = path ? path.split('.') : []\n const schemaPathSegments = schemaPath ? schemaPath.split('.') : []\n const indexPathSegments = indexPath ? indexPath.split('-').filter(Boolean)?.map(Number) : []\n\n const passesCondition = field.admin?.condition\n ? Boolean(\n field.admin.condition(data, siblingData, {\n blockData: blockData!,\n operation,\n path: pathSegments,\n user: req.user,\n }),\n )\n : true\n const isOutsideSubmittedFieldScope =\n submittedTopLevelFieldNames !== undefined &&\n fieldAffectsData(field) &&\n !submittedTopLevelFieldNames.has(pathSegments[0]!)\n let skipValidationFromHere = skipValidation || isOutsideSubmittedFieldScope || !passesCondition\n\n if (fieldAffectsData(field)) {\n const shouldSkipValidationForLocalizedFallback =\n !isValidationOperation &&\n operation !== 'validate' &&\n fieldShouldBeLocalized({ field, parentIsLocalized }) &&\n operationLocale !== defaultLocale &&\n ['array', 'blocks'].includes(field.type) &&\n siblingData[field.name!] === null\n\n if (shouldSkipValidationForLocalizedFallback) {\n skipValidationFromHere = true\n }\n\n // Execute hooks\n if (!skipHooks && 'hooks' in field && field.hooks?.beforeChange) {\n for (const hook of field.hooks.beforeChange) {\n const hookedValue = await hook({\n blockData,\n collection,\n context,\n data,\n field,\n global,\n indexPath: indexPathSegments,\n operation,\n originalDoc: doc,\n overrideAccess,\n path: pathSegments,\n previousSiblingDoc: siblingDoc,\n previousValue: siblingDoc[field.name],\n req,\n schemaPath: schemaPathSegments,\n siblingData,\n siblingDocWithLocales,\n siblingFields: siblingFields!,\n value: siblingData[field.name],\n })\n\n if (hookedValue !== undefined) {\n siblingData[field.name] = hookedValue\n }\n }\n }\n\n if (hasInvalidFieldValueShape({ field, value: siblingData[field.name!] })) {\n errors.push({\n label: buildFieldLabel(\n fieldLabelPath,\n getTranslatedLabel(field?.label || field?.name, req.i18n),\n ),\n message: req.t('validation:invalidInput'),\n path,\n })\n return\n }\n\n // Validate\n if (!skipValidationFromHere && 'validate' in field && field.validate) {\n const valueToValidate = siblingData[field.name]\n let jsonError: object\n\n if (field.type === 'json' && typeof siblingData[field.name] === 'string') {\n try {\n JSON.parse(siblingData[field.name] as string)\n } catch (e) {\n jsonError = e as object\n }\n }\n\n const validateFn: Validate<object, object, object, object> = field.validate as Validate<\n object,\n object,\n object,\n object\n >\n\n const validationResult = await validateFn(valueToValidate as never, {\n ...field,\n id,\n blockData: blockData!,\n collectionSlug: collection?.slug,\n data: deepMergeWithSourceArrays(doc, data),\n event: 'submit',\n // @ts-expect-error\n jsonError,\n operation,\n overrideAccess,\n path: pathSegments,\n preferences: { fields: {} },\n previousValue: siblingDoc[field.name],\n req,\n siblingData: deepMergeWithSourceArrays(siblingDoc, siblingData),\n })\n\n if (typeof validationResult === 'string') {\n let filterOptionsError = false\n\n if (field.type === 'blocks' && field.filterOptions) {\n // Re-run filteroptions. If the validation error is due to filteroptions, we need to add error paths to all the blocks\n // that are no longer valid\n const validationResult = await validateBlocksFilterOptions({\n id,\n data,\n filterOptions: field.filterOptions,\n req,\n siblingData,\n value: siblingData[field.name],\n })\n if (validationResult?.invalidBlockSlugs?.length) {\n filterOptionsError = true\n let rowIndex = -1\n for (const block of siblingData[field.name] as JsonObject[]) {\n rowIndex++\n if (validationResult.invalidBlockSlugs.includes(block.blockType as string)) {\n const blockConfigOrSlug = field.blocks.find((blockFromField) =>\n typeof blockFromField === 'string'\n ? blockFromField === block.blockType\n : blockFromField.slug === block.blockType,\n )\n const blockConfig =\n typeof blockConfigOrSlug === 'string'\n ? req.payload.blocks[blockConfigOrSlug]\n : blockConfigOrSlug\n\n const blockLabelPath =\n field?.label === false\n ? fieldLabelPath\n : buildFieldLabel(\n fieldLabelPath,\n `${getTranslatedLabel(field?.label || field?.name, req.i18n)} > ${req.t('fields:block')} ${rowIndex + 1} (${getTranslatedLabel(blockConfig?.labels?.singular || block.blockType, req.i18n)})`,\n )\n\n errors.push({\n label: blockLabelPath,\n message: req.t('validation:invalidBlock', { block: block.blockType }),\n path: `${path}.${rowIndex}.id`,\n })\n }\n }\n }\n }\n\n if (!filterOptionsError) {\n // If the error is due to block filterOptions, we want to push the errors for each individual block, not the blocks\n // field itself => only push the error if the field is not a block field with validation failure due to filterOptions\n const fieldLabel = buildFieldLabel(\n fieldLabelPath,\n getTranslatedLabel(field?.label || field?.name, req.i18n),\n )\n\n errors.push({\n label: fieldLabel,\n message: validationResult,\n path,\n })\n }\n }\n }\n\n // Push merge locale action if applicable\n if (localization && fieldShouldBeLocalized({ field, parentIsLocalized })) {\n mergeLocaleActions.push(() => {\n const localeData: Record<string, unknown> = {}\n\n for (const locale of localization.localeCodes) {\n const fieldValue =\n locale === req.locale\n ? siblingData[field.name!]\n : siblingDocWithLocales?.[field.name!]?.[locale]\n\n // update locale value if it's not undefined\n if (typeof fieldValue !== 'undefined') {\n localeData[locale] = fieldValue\n }\n }\n\n // If there are locales with data, set the data\n if (Object.keys(localeData).length > 0) {\n siblingData[field.name!] = localeData\n }\n })\n }\n }\n\n switch (field.type) {\n case 'array': {\n const rows = siblingData[field.name]\n\n if (Array.isArray(rows)) {\n const promises: Promise<void>[] = []\n\n rows.forEach((row, rowIndex) => {\n promises.push(\n traverseFields({\n id,\n blockData,\n collection,\n context,\n data,\n doc,\n docWithLocales,\n errors,\n fieldLabelPath:\n field?.label === false\n ? fieldLabelPath\n : buildFieldLabel(\n fieldLabelPath,\n `${getTranslatedLabel(field?.label || field?.name, req.i18n)} ${rowIndex + 1}`,\n ),\n fields: field.fields,\n global,\n isValidationOperation,\n mergeLocaleActions,\n operation,\n overrideAccess,\n parentIndexPath: '',\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: path + '.' + rowIndex,\n parentSchemaPath: schemaPath,\n req,\n siblingData: row as JsonObject,\n siblingDoc: getExistingRowDoc(row as JsonObject, siblingDoc[field.name]),\n siblingDocWithLocales: getExistingRowDoc(\n row as JsonObject,\n siblingDocWithLocales?.[field.name],\n ),\n skipHooks,\n skipValidation: skipValidationFromHere,\n submittedTopLevelFieldNames,\n }),\n )\n })\n\n await Promise.all(promises)\n }\n\n break\n }\n\n case 'blocks': {\n const rows = siblingData[field.name]\n if (Array.isArray(rows)) {\n const promises: Promise<void>[] = []\n\n rows.forEach((row, rowIndex) => {\n const rowSiblingDoc = getExistingRowDoc(row as JsonObject, siblingDoc[field.name])\n\n const rowSiblingDocWithLocales = getExistingRowDoc(\n row as JsonObject,\n siblingDocWithLocales ? siblingDocWithLocales[field.name] : {},\n )\n\n const blockTypeToMatch = (row as JsonObject).blockType || rowSiblingDoc.blockType\n\n const block: Block | undefined =\n req.payload.blocks[blockTypeToMatch] ??\n (field.blocks.find(\n (curBlock) => typeof curBlock !== 'string' && curBlock.slug === blockTypeToMatch,\n ) as Block | undefined)\n\n const blockLabelPath =\n field?.label === false\n ? fieldLabelPath\n : buildFieldLabel(\n fieldLabelPath,\n `${getTranslatedLabel(field?.label || field?.name, req.i18n)} > ${req.t('fields:block')} ${rowIndex + 1} (${getTranslatedLabel(block?.labels?.singular || blockTypeToMatch, req.i18n)})`,\n )\n\n if (block) {\n promises.push(\n traverseFields({\n id,\n blockData: row,\n collection,\n context,\n data,\n doc,\n docWithLocales,\n errors,\n fieldLabelPath: blockLabelPath,\n\n fields: block.fields,\n global,\n isValidationOperation,\n mergeLocaleActions,\n operation,\n overrideAccess,\n parentIndexPath: '',\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: path + '.' + rowIndex,\n parentSchemaPath: schemaPath + '.' + block.slug,\n req,\n siblingData: row as JsonObject,\n siblingDoc: rowSiblingDoc,\n siblingDocWithLocales: rowSiblingDocWithLocales,\n skipHooks,\n skipValidation: skipValidationFromHere,\n submittedTopLevelFieldNames,\n }),\n )\n }\n })\n\n await Promise.all(promises)\n }\n\n break\n }\n\n case 'collapsible':\n case 'row': {\n await traverseFields({\n id,\n blockData,\n collection,\n context,\n data,\n doc,\n docWithLocales,\n errors,\n fieldLabelPath:\n field.type === 'row' || field?.label === false\n ? fieldLabelPath\n : buildFieldLabel(\n fieldLabelPath,\n getTranslatedLabel(field?.label || field?.type, req.i18n),\n ),\n fields: field.fields,\n global,\n isValidationOperation,\n mergeLocaleActions,\n operation,\n overrideAccess,\n parentIndexPath: indexPath,\n parentIsLocalized,\n parentPath,\n parentSchemaPath: schemaPath,\n req,\n siblingData,\n siblingDoc,\n siblingDocWithLocales: siblingDocWithLocales!,\n skipHooks,\n skipValidation: skipValidationFromHere,\n submittedTopLevelFieldNames,\n })\n\n break\n }\n\n case 'group': {\n let groupSiblingData = siblingData\n let groupSiblingDoc = siblingDoc\n let groupSiblingDocWithLocales = siblingDocWithLocales\n\n const isNamedGroup = fieldAffectsData(field)\n\n if (isNamedGroup) {\n if (typeof siblingData[field.name] !== 'object') {\n siblingData[field.name] = {}\n }\n\n if (typeof siblingDoc[field.name] !== 'object') {\n siblingDoc[field.name] = {}\n }\n\n if (typeof siblingDocWithLocales![field.name] !== 'object') {\n siblingDocWithLocales![field.name] = {}\n }\n if (typeof siblingData[field.name] !== 'object') {\n siblingData[field.name] = {}\n }\n\n if (typeof siblingDoc[field.name] !== 'object') {\n siblingDoc[field.name] = {}\n }\n\n if (typeof siblingDocWithLocales![field.name] !== 'object') {\n siblingDocWithLocales![field.name] = {}\n }\n\n groupSiblingData = siblingData[field.name] as JsonObject\n groupSiblingDoc = siblingDoc[field.name] as JsonObject\n groupSiblingDocWithLocales = siblingDocWithLocales![field.name] as JsonObject\n }\n\n const fallbackLabel = field?.label || (isNamedGroup ? field.name : field?.type)\n\n await traverseFields({\n id,\n blockData,\n collection,\n context,\n data,\n doc,\n docWithLocales,\n errors,\n fieldLabelPath:\n field?.label === false\n ? fieldLabelPath\n : buildFieldLabel(fieldLabelPath, getTranslatedLabel(fallbackLabel, req.i18n)),\n fields: field.fields,\n global,\n isValidationOperation,\n mergeLocaleActions,\n operation,\n overrideAccess,\n parentIndexPath: isNamedGroup ? '' : indexPath,\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: isNamedGroup ? path : parentPath,\n parentSchemaPath: schemaPath,\n req,\n siblingData: groupSiblingData,\n siblingDoc: groupSiblingDoc,\n siblingDocWithLocales: groupSiblingDocWithLocales!,\n skipHooks,\n skipValidation: skipValidationFromHere,\n submittedTopLevelFieldNames,\n })\n\n break\n }\n\n case 'point': {\n // Transform point data for storage\n if (\n Array.isArray(siblingData[field.name]) &&\n siblingData[field.name][0] !== null &&\n siblingData[field.name][1] !== null\n ) {\n siblingData[field.name] = {\n type: 'Point',\n coordinates: [\n parseFloat(siblingData[field.name][0]),\n parseFloat(siblingData[field.name][1]),\n ],\n }\n }\n\n break\n }\n\n case 'richText': {\n if (!field?.editor) {\n throw new MissingEditorProp(field) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor\n }\n\n if (typeof field?.editor === 'function') {\n throw new Error('Attempted to access unsanitized rich text editor.')\n }\n\n const editor: RichTextAdapter = field?.editor\n\n if (!skipHooks && editor?.hooks?.beforeChange?.length) {\n for (const hook of editor.hooks.beforeChange) {\n const hookedValue = await hook({\n collection,\n context,\n data,\n docWithLocales,\n errors,\n field,\n fieldLabelPath:\n field?.label === false\n ? fieldLabelPath\n : buildFieldLabel(\n fieldLabelPath,\n getTranslatedLabel(field?.label || field?.name, req.i18n),\n ),\n global,\n indexPath: indexPathSegments,\n mergeLocaleActions,\n operation,\n originalDoc: doc,\n overrideAccess,\n parentIsLocalized,\n path: pathSegments,\n previousSiblingDoc: siblingDoc,\n previousValue: siblingDoc[field.name],\n req,\n schemaPath: schemaPathSegments,\n siblingData,\n siblingDocWithLocales,\n skipValidation: skipValidationFromHere,\n value: siblingData[field.name],\n })\n\n if (hookedValue !== undefined) {\n siblingData[field.name] = hookedValue\n }\n }\n }\n\n break\n }\n\n case 'tab': {\n let tabSiblingData = siblingData\n let tabSiblingDoc = siblingDoc\n let tabSiblingDocWithLocales = siblingDocWithLocales\n\n const isNamedTab = tabHasName(field)\n\n if (isNamedTab) {\n if (typeof siblingData[field.name] !== 'object') {\n siblingData[field.name] = {}\n }\n\n if (typeof siblingDoc[field.name] !== 'object') {\n siblingDoc[field.name] = {}\n }\n\n if (typeof siblingDocWithLocales![field.name] !== 'object') {\n siblingDocWithLocales![field.name] = {}\n }\n\n tabSiblingData = siblingData[field.name] as JsonObject\n tabSiblingDoc = siblingDoc[field.name] as JsonObject\n tabSiblingDocWithLocales = siblingDocWithLocales![field.name] as JsonObject\n }\n\n await traverseFields({\n id,\n blockData,\n collection,\n context,\n data,\n doc,\n docWithLocales,\n errors,\n fieldLabelPath:\n field?.label === false\n ? fieldLabelPath\n : buildFieldLabel(\n fieldLabelPath,\n getTranslatedLabel(field?.label || field.name, req.i18n),\n ),\n fields: field.fields,\n global,\n isValidationOperation,\n mergeLocaleActions,\n operation,\n overrideAccess,\n parentIndexPath: isNamedTab ? '' : indexPath,\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: isNamedTab ? path : parentPath,\n parentSchemaPath: schemaPath,\n req,\n siblingData: tabSiblingData,\n siblingDoc: tabSiblingDoc,\n siblingDocWithLocales: tabSiblingDocWithLocales!,\n skipHooks,\n skipValidation: skipValidationFromHere,\n submittedTopLevelFieldNames,\n })\n\n break\n }\n\n case 'tabs': {\n await traverseFields({\n id,\n blockData,\n collection,\n context,\n data,\n doc,\n docWithLocales,\n errors,\n fieldLabelPath:\n field?.label === false\n ? fieldLabelPath\n : buildFieldLabel(fieldLabelPath, getTranslatedLabel(field?.label || '', req.i18n)),\n fields: field.tabs.map((tab) => ({ ...tab, type: 'tab' })),\n global,\n isValidationOperation,\n mergeLocaleActions,\n operation,\n overrideAccess,\n parentIndexPath: indexPath,\n parentIsLocalized,\n parentPath: path,\n parentSchemaPath: schemaPath,\n req,\n siblingData,\n siblingDoc,\n siblingDocWithLocales: siblingDocWithLocales!,\n skipHooks,\n skipValidation: skipValidationFromHere,\n submittedTopLevelFieldNames,\n })\n\n break\n }\n\n default: {\n break\n }\n }\n}\n\nfunction hasInvalidFieldValueShape({\n field,\n value,\n}: {\n field: Field | TabAsField\n value: unknown\n}): boolean {\n if (value === null || typeof value === 'undefined' || !fieldAffectsData(field)) {\n return false\n }\n\n if (field.type === 'array' || field.type === 'blocks') {\n // Form state may use a numeric row count, while submitted values use arrays.\n return !(Array.isArray(value) || typeof value === 'number')\n }\n\n if (field.type === 'number') {\n // Only hasMany number fields may receive arrays.\n return typeof value === 'object' && !(field.hasMany && Array.isArray(value))\n }\n\n if ((field.type === 'relationship' || field.type === 'upload') && field.hasMany) {\n // HasMany relationships/uploads may receive arrays or one valid polymorphic value.\n if (typeof value !== 'object' || Array.isArray(value)) {\n return false\n }\n\n const relationshipValue = value as Record<PropertyKey, unknown>\n const valuePrototype = Object.getPrototypeOf(value)\n const isSinglePolymorphicRelationshipValue =\n Array.isArray(field.relationTo) &&\n (valuePrototype === null || valuePrototype === Object.prototype) &&\n Object.hasOwn(relationshipValue, 'relationTo') &&\n Object.hasOwn(relationshipValue, 'value') &&\n Reflect.ownKeys(relationshipValue).length === 2 &&\n typeof relationshipValue.relationTo === 'string' &&\n field.relationTo.includes(relationshipValue.relationTo) &&\n (typeof relationshipValue.value === 'string' || typeof relationshipValue.value === 'number')\n\n return !isSinglePolymorphicRelationshipValue\n }\n\n return false\n}\n"],"names":["MissingEditorProp","validateBlocksFilterOptions","deepMergeWithSourceArrays","getTranslatedLabel","fieldAffectsData","fieldShouldBeLocalized","tabHasName","getFieldPaths","getExistingRowDoc","traverseFields","buildFieldLabel","parentLabel","label","capitalizedLabel","charAt","toUpperCase","slice","promise","id","blockData","collection","context","data","doc","docWithLocales","errors","field","fieldIndex","fieldLabelPath","global","isValidationOperation","mergeLocaleActions","operation","overrideAccess","parentIndexPath","parentIsLocalized","parentPath","parentSchemaPath","req","siblingData","siblingDoc","siblingDocWithLocales","siblingFields","skipHooks","skipValidation","submittedTopLevelFieldNames","indexPath","path","schemaPath","index","localization","payload","config","defaultLocale","operationLocale","locale","pathSegments","split","schemaPathSegments","indexPathSegments","filter","Boolean","map","Number","passesCondition","admin","condition","user","isOutsideSubmittedFieldScope","undefined","has","skipValidationFromHere","shouldSkipValidationForLocalizedFallback","includes","type","name","hooks","beforeChange","hook","hookedValue","originalDoc","previousSiblingDoc","previousValue","value","hasInvalidFieldValueShape","push","i18n","message","t","validate","valueToValidate","jsonError","JSON","parse","e","validateFn","validationResult","collectionSlug","slug","event","preferences","fields","filterOptionsError","filterOptions","invalidBlockSlugs","length","rowIndex","block","blockType","blockConfigOrSlug","blocks","find","blockFromField","blockConfig","blockLabelPath","labels","singular","fieldLabel","localeData","localeCodes","fieldValue","Object","keys","rows","Array","isArray","promises","forEach","row","localized","Promise","all","rowSiblingDoc","rowSiblingDocWithLocales","blockTypeToMatch","curBlock","groupSiblingData","groupSiblingDoc","groupSiblingDocWithLocales","isNamedGroup","fallbackLabel","coordinates","parseFloat","editor","Error","tabSiblingData","tabSiblingDoc","tabSiblingDocWithLocales","isNamedTab","tabs","tab","hasMany","relationshipValue","valuePrototype","getPrototypeOf","isSinglePolymorphicRelationshipValue","relationTo","prototype","hasOwn","Reflect","ownKeys"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/fields/hooks/beforeChange/promise.ts"],"sourcesContent":["import type { RichTextAdapter } from '../../../admin/RichText.js'\nimport type { SanitizedCollectionConfig } from '../../../collections/config/types.js'\nimport type { ValidationFieldError } from '../../../errors/index.js'\nimport type { SanitizedGlobalConfig } from '../../../globals/config/types.js'\nimport type { FieldOperation, JsonObject, PayloadRequest } from '../../../types/index.js'\nimport type { Block, Field, TabAsField, Validate } from '../../config/types.js'\n\nimport { MissingEditorProp } from '../../../errors/index.js'\nimport { type RequestContext, validateBlocksFilterOptions } from '../../../index.js'\nimport { deepMergeWithSourceArrays } from '../../../utilities/deepMerge.js'\nimport { getTranslatedLabel } from '../../../utilities/getTranslatedLabel.js'\nimport { isolateObjectProperty } from '../../../utilities/isolateObjectProperty.js'\nimport { fieldAffectsData, fieldShouldBeLocalized, tabHasName } from '../../config/types.js'\nimport { getFieldPaths } from '../../getFieldPaths.js'\nimport { flattenValidationData } from './flattenValidationData.js'\nimport { getExistingRowDoc } from './getExistingRowDoc.js'\nimport { traverseFields } from './traverseFields.js'\n\nfunction buildFieldLabel(parentLabel: string, label: string | undefined): string {\n if (!label) {\n return parentLabel\n }\n const capitalizedLabel = label.charAt(0).toUpperCase() + label.slice(1)\n return parentLabel && capitalizedLabel\n ? `${parentLabel} > ${capitalizedLabel}`\n : capitalizedLabel || parentLabel\n}\n\ntype Args = {\n /**\n * Data of the nearest parent block. If no parent block exists, this will be the `undefined`\n */\n blockData?: JsonObject\n blockFields?: Field[]\n collection: null | SanitizedCollectionConfig\n context: RequestContext\n data: JsonObject\n doc: JsonObject\n docWithLocales: JsonObject\n errors: ValidationFieldError[]\n field: Field | TabAsField\n fieldIndex: number\n /**\n * Built up labels of parent fields\n *\n * @example \"Group Field > Tab Field > Text Field\"\n */\n fieldLabelPath: string\n global: null | SanitizedGlobalConfig\n id?: number | string\n isValidationOperation: boolean\n mergeLocaleActions: (() => Promise<void> | void)[]\n operation: FieldOperation\n overrideAccess: boolean\n parentIndexPath: string\n parentIsLocalized: boolean\n parentPath: string\n parentSchemaPath: string\n req: PayloadRequest\n siblingData: JsonObject\n siblingDoc: JsonObject\n siblingDocWithLocales?: JsonObject\n siblingFields?: (Field | TabAsField)[]\n skipHooks: boolean\n skipValidation: boolean\n submittedTopLevelFieldNames?: ReadonlySet<string>\n}\n\n// This function is responsible for the following actions, in order:\n// - Run condition\n// - Execute field hooks\n// - Validate data\n// - Transform data for storage\n// - beforeDuplicate hooks (if duplicate)\n// - Unflatten locales\n\nexport const promise = async ({\n id,\n blockData,\n blockFields,\n collection,\n context,\n data,\n doc,\n docWithLocales,\n errors,\n field,\n fieldIndex,\n fieldLabelPath,\n global,\n isValidationOperation,\n mergeLocaleActions,\n operation,\n overrideAccess,\n parentIndexPath,\n parentIsLocalized,\n parentPath,\n parentSchemaPath,\n req,\n siblingData,\n siblingDoc,\n siblingDocWithLocales,\n siblingFields,\n skipHooks,\n skipValidation,\n submittedTopLevelFieldNames,\n}: Args): Promise<void> => {\n const { indexPath, path, schemaPath } = getFieldPaths({\n field,\n index: fieldIndex,\n parentIndexPath,\n parentPath,\n parentSchemaPath,\n })\n\n const { localization } = req.payload.config\n const defaultLocale = localization ? localization?.defaultLocale : 'en'\n const operationLocale = req.locale || defaultLocale\n\n const pathSegments = path ? path.split('.') : []\n const schemaPathSegments = schemaPath ? schemaPath.split('.') : []\n const indexPathSegments = indexPath ? indexPath.split('-').filter(Boolean)?.map(Number) : []\n\n const passesCondition = field.admin?.condition\n ? Boolean(\n field.admin.condition(data, siblingData, {\n blockData: blockData!,\n operation,\n path: pathSegments,\n user: req.user,\n }),\n )\n : true\n const isOutsideSubmittedFieldScope =\n submittedTopLevelFieldNames !== undefined &&\n fieldAffectsData(field) &&\n !submittedTopLevelFieldNames.has(pathSegments[0]!)\n let skipValidationFromHere = skipValidation || isOutsideSubmittedFieldScope || !passesCondition\n\n if (fieldAffectsData(field)) {\n const shouldSkipValidationForLocalizedFallback =\n !isValidationOperation &&\n operation !== 'validate' &&\n fieldShouldBeLocalized({ field, parentIsLocalized }) &&\n operationLocale !== defaultLocale &&\n ['array', 'blocks'].includes(field.type) &&\n siblingData[field.name!] === null\n\n if (shouldSkipValidationForLocalizedFallback) {\n skipValidationFromHere = true\n }\n\n // Execute hooks\n if (!skipHooks && 'hooks' in field && field.hooks?.beforeChange) {\n for (const hook of field.hooks.beforeChange) {\n const hookedValue = await hook({\n blockData,\n collection,\n context,\n data,\n field,\n global,\n indexPath: indexPathSegments,\n operation,\n originalDoc: doc,\n overrideAccess,\n path: pathSegments,\n previousSiblingDoc: siblingDoc,\n previousValue: siblingDoc[field.name],\n req,\n schemaPath: schemaPathSegments,\n siblingData,\n siblingDocWithLocales,\n siblingFields: siblingFields!,\n value: siblingData[field.name],\n })\n\n if (hookedValue !== undefined) {\n siblingData[field.name] = hookedValue\n }\n }\n }\n\n if (hasInvalidFieldValueShape({ field, value: siblingData[field.name!] })) {\n errors.push({\n label: buildFieldLabel(\n fieldLabelPath,\n getTranslatedLabel(field?.label || field?.name, req.i18n),\n ),\n message: req.t('validation:invalidInput'),\n path,\n })\n return\n }\n\n // Validate\n if (!skipValidationFromHere && 'validate' in field && field.validate) {\n const valueToValidate = siblingData[field.name]\n\n // With `locale: 'all'` a localized scalar is a locale-keyed object; validate each locale, not the\n // wrapper. Containers (`group`/`array`/`blocks`) are excluded - per-locale child validation is a follow-up.\n const isLocaleKeyedValue =\n operationLocale === 'all' &&\n localization &&\n fieldShouldBeLocalized({ field, parentIsLocalized }) &&\n field.type !== 'group' &&\n valueToValidate !== null &&\n typeof valueToValidate === 'object' &&\n !Array.isArray(valueToValidate)\n\n const localizedValuesToValidate: { locale?: string; value: unknown }[] = isLocaleKeyedValue\n ? localization.localeCodes\n .filter((locale) => locale in (valueToValidate as JsonObject))\n .map((locale) => ({ locale, value: (valueToValidate as JsonObject)[locale] }))\n : [{ value: valueToValidate }]\n\n // No recognized locales (e.g. `{}`): validate `undefined` once so required/optional still apply.\n if (localizedValuesToValidate.length === 0) {\n localizedValuesToValidate.push({ value: undefined })\n }\n\n let jsonError: object\n\n if (field.type === 'json' && typeof siblingData[field.name] === 'string') {\n try {\n JSON.parse(siblingData[field.name] as string)\n } catch (e) {\n jsonError = e as object\n }\n }\n\n const validateFn: Validate<object, object, object, object> = field.validate as Validate<\n object,\n object,\n object,\n object\n >\n\n let validationResult: string | true = true\n let failedLocale: string | undefined\n\n const validationData = deepMergeWithSourceArrays<JsonObject>(doc, data)\n const validationSiblingData = deepMergeWithSourceArrays<JsonObject>(siblingDoc, siblingData)\n\n for (const { locale, value } of localizedValuesToValidate) {\n // Scope `req.locale` to the locale being validated without mutating the shared request.\n const validationReq = locale ? isolateObjectProperty(req, 'locale') : req\n if (locale) {\n validationReq.locale = locale\n }\n\n const localeContext = locale\n ? {\n blockData:\n blockData && blockFields\n ? flattenValidationData({\n config: req.payload.config,\n data: blockData,\n fields: blockFields,\n locale,\n parentIsLocalized,\n })\n : blockData,\n data: flattenValidationData({\n config: req.payload.config,\n data: validationData,\n fields: (collection?.fields || global?.fields)!,\n locale,\n }),\n siblingData: flattenValidationData({\n config: req.payload.config,\n data: validationSiblingData,\n fields: siblingFields!,\n locale,\n parentIsLocalized,\n }),\n }\n : { blockData, data: validationData, siblingData: validationSiblingData }\n\n validationResult = await validateFn(value as never, {\n ...field,\n id,\n blockData: localeContext.blockData!,\n collectionSlug: collection?.slug,\n data: localeContext.data,\n event: 'submit',\n // @ts-expect-error generic validation options cannot infer JSON fields\n jsonError,\n operation,\n overrideAccess,\n path: pathSegments,\n preferences: { fields: {} },\n previousValue: locale\n ? (siblingDoc[field.name] as JsonObject)?.[locale]\n : siblingDoc[field.name],\n req: validationReq,\n siblingData: localeContext.siblingData,\n })\n\n if (typeof validationResult === 'string') {\n failedLocale = locale\n break\n }\n }\n\n if (typeof validationResult === 'string') {\n let filterOptionsError = false\n\n if (field.type === 'blocks' && field.filterOptions) {\n // Re-run filteroptions. If the validation error is due to filteroptions, we need to add error paths to all the blocks\n // that are no longer valid\n const validationResult = await validateBlocksFilterOptions({\n id,\n data,\n filterOptions: field.filterOptions,\n req,\n siblingData,\n value: siblingData[field.name],\n })\n if (validationResult?.invalidBlockSlugs?.length) {\n filterOptionsError = true\n let rowIndex = -1\n for (const block of siblingData[field.name] as JsonObject[]) {\n rowIndex++\n if (validationResult.invalidBlockSlugs.includes(block.blockType as string)) {\n const blockConfigOrSlug = field.blocks.find((blockFromField) =>\n typeof blockFromField === 'string'\n ? blockFromField === block.blockType\n : blockFromField.slug === block.blockType,\n )\n const blockConfig =\n typeof blockConfigOrSlug === 'string'\n ? req.payload.blocks[blockConfigOrSlug]\n : blockConfigOrSlug\n\n const blockLabelPath =\n field?.label === false\n ? fieldLabelPath\n : buildFieldLabel(\n fieldLabelPath,\n `${getTranslatedLabel(field?.label || field?.name, req.i18n)} > ${req.t('fields:block')} ${rowIndex + 1} (${getTranslatedLabel(blockConfig?.labels?.singular || block.blockType, req.i18n)})`,\n )\n\n errors.push({\n label: blockLabelPath,\n message: req.t('validation:invalidBlock', { block: block.blockType }),\n path: `${path}.${rowIndex}.id`,\n })\n }\n }\n }\n }\n\n if (!filterOptionsError) {\n // If the error is due to block filterOptions, we want to push the errors for each individual block, not the blocks\n // field itself => only push the error if the field is not a block field with validation failure due to filterOptions\n const fieldLabel = buildFieldLabel(\n fieldLabelPath,\n getTranslatedLabel(field?.label || field?.name, req.i18n),\n )\n\n errors.push({\n label: failedLocale ? `${fieldLabel} (${failedLocale})` : fieldLabel,\n message: validationResult,\n path,\n })\n }\n }\n }\n\n // Push merge locale action if applicable\n if (localization && fieldShouldBeLocalized({ field, parentIsLocalized })) {\n mergeLocaleActions.push(() => {\n const localeData: Record<string, unknown> = {}\n\n // With `locale: 'all'`, siblingData holds a locale-keyed object (`{ en, es }`) rather than a single\n // locale's value - take each submitted locale, falling back to the existing doc for ones not sent.\n const submittedValue = siblingData[field.name!]\n const isAllLocales =\n req.locale === 'all' &&\n submittedValue !== null &&\n typeof submittedValue === 'object' &&\n !Array.isArray(submittedValue)\n\n for (const locale of localization.localeCodes) {\n const existingValue = siblingDocWithLocales?.[field.name!]?.[locale]\n\n const fieldValue = isAllLocales\n ? locale in (submittedValue as Record<string, unknown>)\n ? (submittedValue as Record<string, unknown>)[locale]\n : existingValue\n : locale === req.locale\n ? submittedValue\n : existingValue\n\n // update locale value if it's not undefined\n if (typeof fieldValue !== 'undefined') {\n localeData[locale] = fieldValue\n }\n }\n\n // If there are locales with data, set the data\n if (Object.keys(localeData).length > 0) {\n siblingData[field.name!] = localeData\n }\n })\n }\n }\n\n switch (field.type) {\n case 'array': {\n const rows = siblingData[field.name]\n\n if (Array.isArray(rows)) {\n const promises: Promise<void>[] = []\n\n rows.forEach((row, rowIndex) => {\n promises.push(\n traverseFields({\n id,\n blockData,\n blockFields,\n collection,\n context,\n data,\n doc,\n docWithLocales,\n errors,\n fieldLabelPath:\n field?.label === false\n ? fieldLabelPath\n : buildFieldLabel(\n fieldLabelPath,\n `${getTranslatedLabel(field?.label || field?.name, req.i18n)} ${rowIndex + 1}`,\n ),\n fields: field.fields,\n global,\n isValidationOperation,\n mergeLocaleActions,\n operation,\n overrideAccess,\n parentIndexPath: '',\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: path + '.' + rowIndex,\n parentSchemaPath: schemaPath,\n req,\n siblingData: row as JsonObject,\n siblingDoc: getExistingRowDoc(row as JsonObject, siblingDoc[field.name]),\n siblingDocWithLocales: getExistingRowDoc(\n row as JsonObject,\n siblingDocWithLocales?.[field.name],\n ),\n skipHooks,\n skipValidation: skipValidationFromHere,\n submittedTopLevelFieldNames,\n }),\n )\n })\n\n await Promise.all(promises)\n }\n\n break\n }\n\n case 'blocks': {\n const rows = siblingData[field.name]\n if (Array.isArray(rows)) {\n const promises: Promise<void>[] = []\n\n rows.forEach((row, rowIndex) => {\n const rowSiblingDoc = getExistingRowDoc(row as JsonObject, siblingDoc[field.name])\n\n const rowSiblingDocWithLocales = getExistingRowDoc(\n row as JsonObject,\n siblingDocWithLocales ? siblingDocWithLocales[field.name] : {},\n )\n\n const blockTypeToMatch = (row as JsonObject).blockType || rowSiblingDoc.blockType\n\n const block: Block | undefined =\n req.payload.blocks[blockTypeToMatch] ??\n (field.blocks.find(\n (curBlock) => typeof curBlock !== 'string' && curBlock.slug === blockTypeToMatch,\n ) as Block | undefined)\n\n const blockLabelPath =\n field?.label === false\n ? fieldLabelPath\n : buildFieldLabel(\n fieldLabelPath,\n `${getTranslatedLabel(field?.label || field?.name, req.i18n)} > ${req.t('fields:block')} ${rowIndex + 1} (${getTranslatedLabel(block?.labels?.singular || blockTypeToMatch, req.i18n)})`,\n )\n\n if (block) {\n promises.push(\n traverseFields({\n id,\n blockData: row,\n blockFields: block.fields,\n collection,\n context,\n data,\n doc,\n docWithLocales,\n errors,\n fieldLabelPath: blockLabelPath,\n\n fields: block.fields,\n global,\n isValidationOperation,\n mergeLocaleActions,\n operation,\n overrideAccess,\n parentIndexPath: '',\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: path + '.' + rowIndex,\n parentSchemaPath: schemaPath + '.' + block.slug,\n req,\n siblingData: row as JsonObject,\n siblingDoc: rowSiblingDoc,\n siblingDocWithLocales: rowSiblingDocWithLocales,\n skipHooks,\n skipValidation: skipValidationFromHere,\n submittedTopLevelFieldNames,\n }),\n )\n }\n })\n\n await Promise.all(promises)\n }\n\n break\n }\n\n case 'collapsible':\n case 'row': {\n await traverseFields({\n id,\n blockData,\n blockFields,\n collection,\n context,\n data,\n doc,\n docWithLocales,\n errors,\n fieldLabelPath:\n field.type === 'row' || field?.label === false\n ? fieldLabelPath\n : buildFieldLabel(\n fieldLabelPath,\n getTranslatedLabel(field?.label || field?.type, req.i18n),\n ),\n fields: field.fields,\n global,\n isValidationOperation,\n mergeLocaleActions,\n operation,\n overrideAccess,\n parentIndexPath: indexPath,\n parentIsLocalized,\n parentPath,\n parentSchemaPath: schemaPath,\n req,\n siblingData,\n siblingDoc,\n siblingDocWithLocales: siblingDocWithLocales!,\n skipHooks,\n skipValidation: skipValidationFromHere,\n submittedTopLevelFieldNames,\n })\n\n break\n }\n\n case 'group': {\n let groupSiblingData = siblingData\n let groupSiblingDoc = siblingDoc\n let groupSiblingDocWithLocales = siblingDocWithLocales\n\n const isNamedGroup = fieldAffectsData(field)\n\n if (isNamedGroup) {\n if (typeof siblingData[field.name] !== 'object') {\n siblingData[field.name] = {}\n }\n\n if (typeof siblingDoc[field.name] !== 'object') {\n siblingDoc[field.name] = {}\n }\n\n if (typeof siblingDocWithLocales![field.name] !== 'object') {\n siblingDocWithLocales![field.name] = {}\n }\n if (typeof siblingData[field.name] !== 'object') {\n siblingData[field.name] = {}\n }\n\n if (typeof siblingDoc[field.name] !== 'object') {\n siblingDoc[field.name] = {}\n }\n\n if (typeof siblingDocWithLocales![field.name] !== 'object') {\n siblingDocWithLocales![field.name] = {}\n }\n\n groupSiblingData = siblingData[field.name] as JsonObject\n groupSiblingDoc = siblingDoc[field.name] as JsonObject\n groupSiblingDocWithLocales = siblingDocWithLocales![field.name] as JsonObject\n }\n\n const fallbackLabel = field?.label || (isNamedGroup ? field.name : field?.type)\n\n await traverseFields({\n id,\n blockData,\n blockFields,\n collection,\n context,\n data,\n doc,\n docWithLocales,\n errors,\n fieldLabelPath:\n field?.label === false\n ? fieldLabelPath\n : buildFieldLabel(fieldLabelPath, getTranslatedLabel(fallbackLabel, req.i18n)),\n fields: field.fields,\n global,\n isValidationOperation,\n mergeLocaleActions,\n operation,\n overrideAccess,\n parentIndexPath: isNamedGroup ? '' : indexPath,\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: isNamedGroup ? path : parentPath,\n parentSchemaPath: schemaPath,\n req,\n siblingData: groupSiblingData,\n siblingDoc: groupSiblingDoc,\n siblingDocWithLocales: groupSiblingDocWithLocales!,\n skipHooks,\n skipValidation: skipValidationFromHere,\n submittedTopLevelFieldNames,\n })\n\n break\n }\n\n case 'point': {\n // Transform point data for storage\n if (\n Array.isArray(siblingData[field.name]) &&\n siblingData[field.name][0] !== null &&\n siblingData[field.name][1] !== null\n ) {\n siblingData[field.name] = {\n type: 'Point',\n coordinates: [\n parseFloat(siblingData[field.name][0]),\n parseFloat(siblingData[field.name][1]),\n ],\n }\n }\n\n break\n }\n\n case 'richText': {\n if (!field?.editor) {\n throw new MissingEditorProp(field) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor\n }\n\n if (typeof field?.editor === 'function') {\n throw new Error('Attempted to access unsanitized rich text editor.')\n }\n\n const editor: RichTextAdapter = field?.editor\n\n if (!skipHooks && editor?.hooks?.beforeChange?.length) {\n for (const hook of editor.hooks.beforeChange) {\n const hookedValue = await hook({\n collection,\n context,\n data,\n docWithLocales,\n errors,\n field,\n fieldLabelPath:\n field?.label === false\n ? fieldLabelPath\n : buildFieldLabel(\n fieldLabelPath,\n getTranslatedLabel(field?.label || field?.name, req.i18n),\n ),\n global,\n indexPath: indexPathSegments,\n mergeLocaleActions,\n operation,\n originalDoc: doc,\n overrideAccess,\n parentIsLocalized,\n path: pathSegments,\n previousSiblingDoc: siblingDoc,\n previousValue: siblingDoc[field.name],\n req,\n schemaPath: schemaPathSegments,\n siblingData,\n siblingDocWithLocales,\n skipValidation: skipValidationFromHere,\n value: siblingData[field.name],\n })\n\n if (hookedValue !== undefined) {\n siblingData[field.name] = hookedValue\n }\n }\n }\n\n break\n }\n\n case 'tab': {\n let tabSiblingData = siblingData\n let tabSiblingDoc = siblingDoc\n let tabSiblingDocWithLocales = siblingDocWithLocales\n\n const isNamedTab = tabHasName(field)\n\n if (isNamedTab) {\n if (typeof siblingData[field.name] !== 'object') {\n siblingData[field.name] = {}\n }\n\n if (typeof siblingDoc[field.name] !== 'object') {\n siblingDoc[field.name] = {}\n }\n\n if (typeof siblingDocWithLocales![field.name] !== 'object') {\n siblingDocWithLocales![field.name] = {}\n }\n\n tabSiblingData = siblingData[field.name] as JsonObject\n tabSiblingDoc = siblingDoc[field.name] as JsonObject\n tabSiblingDocWithLocales = siblingDocWithLocales![field.name] as JsonObject\n }\n\n await traverseFields({\n id,\n blockData,\n blockFields,\n collection,\n context,\n data,\n doc,\n docWithLocales,\n errors,\n fieldLabelPath:\n field?.label === false\n ? fieldLabelPath\n : buildFieldLabel(\n fieldLabelPath,\n getTranslatedLabel(field?.label || field.name, req.i18n),\n ),\n fields: field.fields,\n global,\n isValidationOperation,\n mergeLocaleActions,\n operation,\n overrideAccess,\n parentIndexPath: isNamedTab ? '' : indexPath,\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: isNamedTab ? path : parentPath,\n parentSchemaPath: schemaPath,\n req,\n siblingData: tabSiblingData,\n siblingDoc: tabSiblingDoc,\n siblingDocWithLocales: tabSiblingDocWithLocales!,\n skipHooks,\n skipValidation: skipValidationFromHere,\n submittedTopLevelFieldNames,\n })\n\n break\n }\n\n case 'tabs': {\n await traverseFields({\n id,\n blockData,\n blockFields,\n collection,\n context,\n data,\n doc,\n docWithLocales,\n errors,\n fieldLabelPath:\n field?.label === false\n ? fieldLabelPath\n : buildFieldLabel(fieldLabelPath, getTranslatedLabel(field?.label || '', req.i18n)),\n fields: field.tabs.map((tab) => ({ ...tab, type: 'tab' })),\n global,\n isValidationOperation,\n mergeLocaleActions,\n operation,\n overrideAccess,\n parentIndexPath: indexPath,\n parentIsLocalized,\n parentPath: path,\n parentSchemaPath: schemaPath,\n req,\n siblingData,\n siblingDoc,\n siblingDocWithLocales: siblingDocWithLocales!,\n skipHooks,\n skipValidation: skipValidationFromHere,\n submittedTopLevelFieldNames,\n })\n\n break\n }\n\n default: {\n break\n }\n }\n}\n\nfunction hasInvalidFieldValueShape({\n field,\n value,\n}: {\n field: Field | TabAsField\n value: unknown\n}): boolean {\n if (value === null || typeof value === 'undefined' || !fieldAffectsData(field)) {\n return false\n }\n\n if (field.type === 'array' || field.type === 'blocks') {\n // Form state may use a numeric row count, while submitted values use arrays.\n return !(Array.isArray(value) || typeof value === 'number')\n }\n\n if (field.type === 'number') {\n // Only hasMany number fields may receive arrays.\n return typeof value === 'object' && !(field.hasMany && Array.isArray(value))\n }\n\n if ((field.type === 'relationship' || field.type === 'upload') && field.hasMany) {\n // HasMany relationships/uploads may receive arrays or one valid polymorphic value.\n if (typeof value !== 'object' || Array.isArray(value)) {\n return false\n }\n\n const relationshipValue = value as Record<PropertyKey, unknown>\n const valuePrototype = Object.getPrototypeOf(value)\n const isSinglePolymorphicRelationshipValue =\n Array.isArray(field.relationTo) &&\n (valuePrototype === null || valuePrototype === Object.prototype) &&\n Object.hasOwn(relationshipValue, 'relationTo') &&\n Object.hasOwn(relationshipValue, 'value') &&\n Reflect.ownKeys(relationshipValue).length === 2 &&\n typeof relationshipValue.relationTo === 'string' &&\n field.relationTo.includes(relationshipValue.relationTo) &&\n (typeof relationshipValue.value === 'string' || typeof relationshipValue.value === 'number')\n\n return !isSinglePolymorphicRelationshipValue\n }\n\n return false\n}\n"],"names":["MissingEditorProp","validateBlocksFilterOptions","deepMergeWithSourceArrays","getTranslatedLabel","isolateObjectProperty","fieldAffectsData","fieldShouldBeLocalized","tabHasName","getFieldPaths","flattenValidationData","getExistingRowDoc","traverseFields","buildFieldLabel","parentLabel","label","capitalizedLabel","charAt","toUpperCase","slice","promise","id","blockData","blockFields","collection","context","data","doc","docWithLocales","errors","field","fieldIndex","fieldLabelPath","global","isValidationOperation","mergeLocaleActions","operation","overrideAccess","parentIndexPath","parentIsLocalized","parentPath","parentSchemaPath","req","siblingData","siblingDoc","siblingDocWithLocales","siblingFields","skipHooks","skipValidation","submittedTopLevelFieldNames","indexPath","path","schemaPath","index","localization","payload","config","defaultLocale","operationLocale","locale","pathSegments","split","schemaPathSegments","indexPathSegments","filter","Boolean","map","Number","passesCondition","admin","condition","user","isOutsideSubmittedFieldScope","undefined","has","skipValidationFromHere","shouldSkipValidationForLocalizedFallback","includes","type","name","hooks","beforeChange","hook","hookedValue","originalDoc","previousSiblingDoc","previousValue","value","hasInvalidFieldValueShape","push","i18n","message","t","validate","valueToValidate","isLocaleKeyedValue","Array","isArray","localizedValuesToValidate","localeCodes","length","jsonError","JSON","parse","e","validateFn","validationResult","failedLocale","validationData","validationSiblingData","validationReq","localeContext","fields","collectionSlug","slug","event","preferences","filterOptionsError","filterOptions","invalidBlockSlugs","rowIndex","block","blockType","blockConfigOrSlug","blocks","find","blockFromField","blockConfig","blockLabelPath","labels","singular","fieldLabel","localeData","submittedValue","isAllLocales","existingValue","fieldValue","Object","keys","rows","promises","forEach","row","localized","Promise","all","rowSiblingDoc","rowSiblingDocWithLocales","blockTypeToMatch","curBlock","groupSiblingData","groupSiblingDoc","groupSiblingDocWithLocales","isNamedGroup","fallbackLabel","coordinates","parseFloat","editor","Error","tabSiblingData","tabSiblingDoc","tabSiblingDocWithLocales","isNamedTab","tabs","tab","hasMany","relationshipValue","valuePrototype","getPrototypeOf","isSinglePolymorphicRelationshipValue","relationTo","prototype","hasOwn","Reflect","ownKeys"],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ type Args = {
|
|
|
9
9
|
* Data of the nearest parent block. If no parent block exists, this will be the `undefined`
|
|
10
10
|
*/
|
|
11
11
|
blockData?: JsonObject;
|
|
12
|
+
blockFields?: Field[];
|
|
12
13
|
collection: null | SanitizedCollectionConfig;
|
|
13
14
|
context: RequestContext;
|
|
14
15
|
data: JsonObject;
|
|
@@ -63,6 +64,6 @@ type Args = {
|
|
|
63
64
|
* - Transform data for storage
|
|
64
65
|
* - Unflatten locales. The input `data` is the normal document for one locale. The output result will become the document with locales.
|
|
65
66
|
*/
|
|
66
|
-
export declare const traverseFields: ({ id, blockData, collection, context, data, doc, docWithLocales, errors, fieldLabelPath, fields, global, isValidationOperation, mergeLocaleActions, operation, overrideAccess, parentIndexPath, parentIsLocalized, parentPath, parentSchemaPath, req, siblingData, siblingDoc, siblingDocWithLocales, skipHooks, skipValidation, submittedTopLevelFieldNames, }: Args) => Promise<void>;
|
|
67
|
+
export declare const traverseFields: ({ id, blockData, blockFields, collection, context, data, doc, docWithLocales, errors, fieldLabelPath, fields, global, isValidationOperation, mergeLocaleActions, operation, overrideAccess, parentIndexPath, parentIsLocalized, parentPath, parentSchemaPath, req, siblingData, siblingDoc, siblingDocWithLocales, skipHooks, skipValidation, submittedTopLevelFieldNames, }: Args) => Promise<void>;
|
|
67
68
|
export {};
|
|
68
69
|
//# sourceMappingURL=traverseFields.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../../../../src/fields/hooks/beforeChange/traverseFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAA;AACrF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AACpE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAA;AAC7E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACzF,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAI9D,KAAK,IAAI,GAAG;IACV;;OAEG;IACH,SAAS,CAAC,EAAE,UAAU,CAAA;IACtB,UAAU,EAAE,IAAI,GAAG,yBAAyB,CAAA;IAC5C,OAAO,EAAE,cAAc,CAAA;IACvB,IAAI,EAAE,UAAU,CAAA;IAChB;;OAEG;IACH,GAAG,EAAE,UAAU,CAAA;IACf;;OAEG;IACH,cAAc,EAAE,UAAU,CAAA;IAC1B,MAAM,EAAE,oBAAoB,EAAE,CAAA;IAC9B;;;;OAIG;IACH,cAAc,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE,CAAC,KAAK,GAAG,UAAU,CAAC,EAAE,CAAA;IAC9B,MAAM,EAAE,IAAI,GAAG,qBAAqB,CAAA;IACpC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACpB,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B,kBAAkB,EAAE,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAA;IAClD,SAAS,EAAE,cAAc,CAAA;IACzB,cAAc,EAAE,OAAO,CAAA;IACvB,eAAe,EAAE,MAAM,CAAA;IACvB;;OAEG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,UAAU,EAAE,MAAM,CAAA;IAClB,gBAAgB,EAAE,MAAM,CAAA;IACxB,GAAG,EAAE,cAAc,CAAA;IACnB,WAAW,EAAE,UAAU,CAAA;IACvB;;OAEG;IACH,UAAU,EAAE,UAAU,CAAA;IACtB;;OAEG;IACH,qBAAqB,EAAE,UAAU,CAAA;IACjC,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,2BAA2B,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAClD,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,
|
|
1
|
+
{"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../../../../src/fields/hooks/beforeChange/traverseFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAA;AACrF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AACpE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAA;AAC7E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACzF,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAI9D,KAAK,IAAI,GAAG;IACV;;OAEG;IACH,SAAS,CAAC,EAAE,UAAU,CAAA;IACtB,WAAW,CAAC,EAAE,KAAK,EAAE,CAAA;IACrB,UAAU,EAAE,IAAI,GAAG,yBAAyB,CAAA;IAC5C,OAAO,EAAE,cAAc,CAAA;IACvB,IAAI,EAAE,UAAU,CAAA;IAChB;;OAEG;IACH,GAAG,EAAE,UAAU,CAAA;IACf;;OAEG;IACH,cAAc,EAAE,UAAU,CAAA;IAC1B,MAAM,EAAE,oBAAoB,EAAE,CAAA;IAC9B;;;;OAIG;IACH,cAAc,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE,CAAC,KAAK,GAAG,UAAU,CAAC,EAAE,CAAA;IAC9B,MAAM,EAAE,IAAI,GAAG,qBAAqB,CAAA;IACpC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACpB,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B,kBAAkB,EAAE,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAA;IAClD,SAAS,EAAE,cAAc,CAAA;IACzB,cAAc,EAAE,OAAO,CAAA;IACvB,eAAe,EAAE,MAAM,CAAA;IACvB;;OAEG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,UAAU,EAAE,MAAM,CAAA;IAClB,gBAAgB,EAAE,MAAM,CAAA;IACxB,GAAG,EAAE,cAAc,CAAA;IACnB,WAAW,EAAE,UAAU,CAAA;IACvB;;OAEG;IACH,UAAU,EAAE,UAAU,CAAA;IACtB;;OAEG;IACH,qBAAqB,EAAE,UAAU,CAAA;IACjC,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,2BAA2B,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAClD,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,iXA4BxB,IAAI,KAAG,OAAO,CAAC,IAAI,CAwCrB,CAAA"}
|
|
@@ -6,12 +6,13 @@ import { promise } from './promise.js';
|
|
|
6
6
|
* - Validate data
|
|
7
7
|
* - Transform data for storage
|
|
8
8
|
* - Unflatten locales. The input `data` is the normal document for one locale. The output result will become the document with locales.
|
|
9
|
-
*/ export const traverseFields = async ({ id, blockData, collection, context, data, doc, docWithLocales, errors, fieldLabelPath, fields, global, isValidationOperation, mergeLocaleActions, operation, overrideAccess, parentIndexPath, parentIsLocalized, parentPath, parentSchemaPath, req, siblingData, siblingDoc, siblingDocWithLocales, skipHooks, skipValidation, submittedTopLevelFieldNames })=>{
|
|
9
|
+
*/ export const traverseFields = async ({ id, blockData, blockFields, collection, context, data, doc, docWithLocales, errors, fieldLabelPath, fields, global, isValidationOperation, mergeLocaleActions, operation, overrideAccess, parentIndexPath, parentIsLocalized, parentPath, parentSchemaPath, req, siblingData, siblingDoc, siblingDocWithLocales, skipHooks, skipValidation, submittedTopLevelFieldNames })=>{
|
|
10
10
|
const promises = [];
|
|
11
11
|
fields.forEach((field, fieldIndex)=>{
|
|
12
12
|
promises.push(promise({
|
|
13
13
|
id,
|
|
14
14
|
blockData,
|
|
15
|
+
blockFields,
|
|
15
16
|
collection,
|
|
16
17
|
context,
|
|
17
18
|
data,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/fields/hooks/beforeChange/traverseFields.ts"],"sourcesContent":["import type { SanitizedCollectionConfig } from '../../../collections/config/types.js'\nimport type { ValidationFieldError } from '../../../errors/index.js'\nimport type { SanitizedGlobalConfig } from '../../../globals/config/types.js'\nimport type { RequestContext } from '../../../index.js'\nimport type { FieldOperation, JsonObject, PayloadRequest } from '../../../types/index.js'\nimport type { Field, TabAsField } from '../../config/types.js'\n\nimport { promise } from './promise.js'\n\ntype Args = {\n /**\n * Data of the nearest parent block. If no parent block exists, this will be the `undefined`\n */\n blockData?: JsonObject\n collection: null | SanitizedCollectionConfig\n context: RequestContext\n data: JsonObject\n /**\n * The original data (not modified by any hooks)\n */\n doc: JsonObject\n /**\n * The original data with locales (not modified by any hooks)\n */\n docWithLocales: JsonObject\n errors: ValidationFieldError[]\n /**\n * Built up labels of parent fields\n *\n * @example \"Group Field > Tab Field > Text Field\"\n */\n fieldLabelPath: string\n fields: (Field | TabAsField)[]\n global: null | SanitizedGlobalConfig\n id?: number | string\n isValidationOperation?: boolean\n mergeLocaleActions: (() => Promise<void> | void)[]\n operation: FieldOperation\n overrideAccess: boolean\n parentIndexPath: string\n /**\n * @todo make required in v4.0\n */\n parentIsLocalized?: boolean\n parentPath: string\n parentSchemaPath: string\n req: PayloadRequest\n siblingData: JsonObject\n /**\n * The original siblingData (not modified by any hooks)\n */\n siblingDoc: JsonObject\n /**\n * The original siblingData with locales (not modified by any hooks)\n */\n siblingDocWithLocales: JsonObject\n skipHooks?: boolean\n skipValidation?: boolean\n submittedTopLevelFieldNames?: ReadonlySet<string>\n}\n\n/**\n * This function is responsible for the following actions, in order:\n * - Run condition\n * - Execute field hooks\n * - Validate data\n * - Transform data for storage\n * - Unflatten locales. The input `data` is the normal document for one locale. The output result will become the document with locales.\n */\nexport const traverseFields = async ({\n id,\n blockData,\n collection,\n context,\n data,\n doc,\n docWithLocales,\n errors,\n fieldLabelPath,\n fields,\n global,\n isValidationOperation,\n mergeLocaleActions,\n operation,\n overrideAccess,\n parentIndexPath,\n parentIsLocalized,\n parentPath,\n parentSchemaPath,\n req,\n siblingData,\n siblingDoc,\n siblingDocWithLocales,\n skipHooks,\n skipValidation,\n submittedTopLevelFieldNames,\n}: Args): Promise<void> => {\n const promises: Promise<void>[] = []\n\n fields.forEach((field, fieldIndex) => {\n promises.push(\n promise({\n id,\n blockData,\n collection,\n context,\n data,\n doc,\n docWithLocales,\n errors,\n field,\n fieldIndex,\n fieldLabelPath,\n global,\n isValidationOperation: isValidationOperation!,\n mergeLocaleActions,\n operation,\n overrideAccess,\n parentIndexPath,\n parentIsLocalized: parentIsLocalized!,\n parentPath,\n parentSchemaPath,\n req,\n siblingData,\n siblingDoc,\n siblingDocWithLocales,\n siblingFields: fields,\n skipHooks: skipHooks!,\n skipValidation: skipValidation!,\n submittedTopLevelFieldNames,\n }),\n )\n })\n\n await Promise.all(promises)\n}\n"],"names":["promise","traverseFields","id","blockData","collection","context","data","doc","docWithLocales","errors","fieldLabelPath","fields","global","isValidationOperation","mergeLocaleActions","operation","overrideAccess","parentIndexPath","parentIsLocalized","parentPath","parentSchemaPath","req","siblingData","siblingDoc","siblingDocWithLocales","skipHooks","skipValidation","submittedTopLevelFieldNames","promises","forEach","field","fieldIndex","push","siblingFields","Promise","all"],"mappings":"AAOA,SAASA,OAAO,QAAQ,eAAc;
|
|
1
|
+
{"version":3,"sources":["../../../../src/fields/hooks/beforeChange/traverseFields.ts"],"sourcesContent":["import type { SanitizedCollectionConfig } from '../../../collections/config/types.js'\nimport type { ValidationFieldError } from '../../../errors/index.js'\nimport type { SanitizedGlobalConfig } from '../../../globals/config/types.js'\nimport type { RequestContext } from '../../../index.js'\nimport type { FieldOperation, JsonObject, PayloadRequest } from '../../../types/index.js'\nimport type { Field, TabAsField } from '../../config/types.js'\n\nimport { promise } from './promise.js'\n\ntype Args = {\n /**\n * Data of the nearest parent block. If no parent block exists, this will be the `undefined`\n */\n blockData?: JsonObject\n blockFields?: Field[]\n collection: null | SanitizedCollectionConfig\n context: RequestContext\n data: JsonObject\n /**\n * The original data (not modified by any hooks)\n */\n doc: JsonObject\n /**\n * The original data with locales (not modified by any hooks)\n */\n docWithLocales: JsonObject\n errors: ValidationFieldError[]\n /**\n * Built up labels of parent fields\n *\n * @example \"Group Field > Tab Field > Text Field\"\n */\n fieldLabelPath: string\n fields: (Field | TabAsField)[]\n global: null | SanitizedGlobalConfig\n id?: number | string\n isValidationOperation?: boolean\n mergeLocaleActions: (() => Promise<void> | void)[]\n operation: FieldOperation\n overrideAccess: boolean\n parentIndexPath: string\n /**\n * @todo make required in v4.0\n */\n parentIsLocalized?: boolean\n parentPath: string\n parentSchemaPath: string\n req: PayloadRequest\n siblingData: JsonObject\n /**\n * The original siblingData (not modified by any hooks)\n */\n siblingDoc: JsonObject\n /**\n * The original siblingData with locales (not modified by any hooks)\n */\n siblingDocWithLocales: JsonObject\n skipHooks?: boolean\n skipValidation?: boolean\n submittedTopLevelFieldNames?: ReadonlySet<string>\n}\n\n/**\n * This function is responsible for the following actions, in order:\n * - Run condition\n * - Execute field hooks\n * - Validate data\n * - Transform data for storage\n * - Unflatten locales. The input `data` is the normal document for one locale. The output result will become the document with locales.\n */\nexport const traverseFields = async ({\n id,\n blockData,\n blockFields,\n collection,\n context,\n data,\n doc,\n docWithLocales,\n errors,\n fieldLabelPath,\n fields,\n global,\n isValidationOperation,\n mergeLocaleActions,\n operation,\n overrideAccess,\n parentIndexPath,\n parentIsLocalized,\n parentPath,\n parentSchemaPath,\n req,\n siblingData,\n siblingDoc,\n siblingDocWithLocales,\n skipHooks,\n skipValidation,\n submittedTopLevelFieldNames,\n}: Args): Promise<void> => {\n const promises: Promise<void>[] = []\n\n fields.forEach((field, fieldIndex) => {\n promises.push(\n promise({\n id,\n blockData,\n blockFields,\n collection,\n context,\n data,\n doc,\n docWithLocales,\n errors,\n field,\n fieldIndex,\n fieldLabelPath,\n global,\n isValidationOperation: isValidationOperation!,\n mergeLocaleActions,\n operation,\n overrideAccess,\n parentIndexPath,\n parentIsLocalized: parentIsLocalized!,\n parentPath,\n parentSchemaPath,\n req,\n siblingData,\n siblingDoc,\n siblingDocWithLocales,\n siblingFields: fields,\n skipHooks: skipHooks!,\n skipValidation: skipValidation!,\n submittedTopLevelFieldNames,\n }),\n )\n })\n\n await Promise.all(promises)\n}\n"],"names":["promise","traverseFields","id","blockData","blockFields","collection","context","data","doc","docWithLocales","errors","fieldLabelPath","fields","global","isValidationOperation","mergeLocaleActions","operation","overrideAccess","parentIndexPath","parentIsLocalized","parentPath","parentSchemaPath","req","siblingData","siblingDoc","siblingDocWithLocales","skipHooks","skipValidation","submittedTopLevelFieldNames","promises","forEach","field","fieldIndex","push","siblingFields","Promise","all"],"mappings":"AAOA,SAASA,OAAO,QAAQ,eAAc;AAuDtC;;;;;;;CAOC,GACD,OAAO,MAAMC,iBAAiB,OAAO,EACnCC,EAAE,EACFC,SAAS,EACTC,WAAW,EACXC,UAAU,EACVC,OAAO,EACPC,IAAI,EACJC,GAAG,EACHC,cAAc,EACdC,MAAM,EACNC,cAAc,EACdC,MAAM,EACNC,MAAM,EACNC,qBAAqB,EACrBC,kBAAkB,EAClBC,SAAS,EACTC,cAAc,EACdC,eAAe,EACfC,iBAAiB,EACjBC,UAAU,EACVC,gBAAgB,EAChBC,GAAG,EACHC,WAAW,EACXC,UAAU,EACVC,qBAAqB,EACrBC,SAAS,EACTC,cAAc,EACdC,2BAA2B,EACtB;IACL,MAAMC,WAA4B,EAAE;IAEpCjB,OAAOkB,OAAO,CAAC,CAACC,OAAOC;QACrBH,SAASI,IAAI,CACXjC,QAAQ;YACNE;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAqB;YACAC;YACArB;YACAE;YACAC,uBAAuBA;YACvBC;YACAC;YACAC;YACAC;YACAC,mBAAmBA;YACnBC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAS,eAAetB;YACfc,WAAWA;YACXC,gBAAgBA;YAChBC;QACF;IAEJ;IAEA,MAAMO,QAAQC,GAAG,CAACP;AACpB,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validations.d.ts","sourceRoot":"","sources":["../../src/fields/validations.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EACX,aAAa,EACb,SAAS,EACT,SAAS,EACT,UAAU,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,aAAa,EACb,WAAW,EACX,SAAS,EACT,aAAa,EACb,SAAS,EACT,WAAW,EACX,QAAQ,EAET,MAAM,mBAAmB,CAAA;AAK1B,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;AAE/E,MAAM,MAAM,uBAAuB,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;AAErF,MAAM,MAAM,yBAAyB,GAAG,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;AAErF,eAAO,MAAM,IAAI,EAAE,mBA0DlB,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;AAM/E,eAAO,MAAM,IAAI,EAAE,mBAAgC,CAAA;AAEnD,MAAM,MAAM,uBAAuB,GAAG,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;AAEnF,eAAO,MAAM,QAAQ,EAAE,uBAkCtB,CAAA;AAED,MAAM,MAAM,8BAA8B,GAAG,QAAQ,CACnD,MAAM,EACN,OAAO,EACP;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,EACpB,SAAS,CACV,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,8BAa7B,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,UAAU,CAAC,CAAA;AAE/F,eAAO,MAAM,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"validations.d.ts","sourceRoot":"","sources":["../../src/fields/validations.ts"],"names":[],"mappings":"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"}
|
|
@@ -110,7 +110,10 @@ export const email = (value, { collectionSlug, req: { payload: { collections, co
|
|
|
110
110
|
* Allows domains with consecutive hyphens as long as they are not leading/trailing (e.g., user@ex--ample.com)
|
|
111
111
|
* Supports multiple subdomains (e.g., user@sub.domain.example.com)
|
|
112
112
|
*/ const emailRegex = /^(?!.*\.\.)[\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;
|
|
113
|
-
if (
|
|
113
|
+
if (!value && required) {
|
|
114
|
+
return t('validation:required');
|
|
115
|
+
}
|
|
116
|
+
if (value && !emailRegex.test(value)) {
|
|
114
117
|
return t('validation:emailAddress');
|
|
115
118
|
}
|
|
116
119
|
return true;
|
|
@@ -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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"}
|