{"version":3,"file":"validation.mjs","sources":["../../../admin/src/utils/validation.ts"],"sourcesContent":["import { translatedErrors } from '@strapi/admin/strapi-admin';\nimport pipe from 'lodash/fp/pipe';\nimport * as yup from 'yup';\n\nimport { DOCUMENT_META_FIELDS } from '../constants/attributes';\n\nimport type { ComponentsDictionary, Schema } from '../hooks/useDocument';\nimport type { Schema as SchemaUtils } from '@strapi/types';\nimport type { ObjectShape } from 'yup/lib/object';\n\ntype AnySchema =\n  | yup.StringSchema\n  | yup.NumberSchema\n  | yup.BooleanSchema\n  | yup.DateSchema\n  | yup.ArraySchema<yup.AnySchema>\n  | yup.ObjectSchema<ObjectShape>;\n\n/* -------------------------------------------------------------------------------------------------\n * createYupSchema\n * -----------------------------------------------------------------------------------------------*/\n\ninterface ValidationOptions {\n  status: 'draft' | 'published' | null;\n  removedAttributes?: string[];\n}\n\nconst arrayValidator = (attribute: Schema['attributes'][string], options: ValidationOptions) => ({\n  message: translatedErrors.required,\n  test(value: unknown) {\n    if (options.status === 'draft') {\n      return true;\n    }\n\n    if (!attribute.required) {\n      return true;\n    }\n\n    if (!value) {\n      return false;\n    }\n\n    if (Array.isArray(value) && value.length === 0) {\n      return false;\n    }\n\n    return true;\n  },\n});\nconst escapeRegex = (str: string) => str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n/**\n * TODO: should we create a Map to store these based on the hash of the schema?\n */\nconst createYupSchema = (\n  attributes: Schema['attributes'] = {},\n  components: ComponentsDictionary = {},\n  options: ValidationOptions = { status: null }\n): yup.ObjectSchema<ObjectShape> => {\n  const createModelSchema = (\n    attributes: Schema['attributes'],\n    removedAttributes: string[] = []\n  ): yup.ObjectSchema<ObjectShape> =>\n    yup\n      .object()\n      .shape(\n        Object.entries(attributes).reduce<ObjectShape>((acc, [name, attribute]) => {\n          const getNestedPathsForAttribute = (removed: string[], attrName: string): string[] => {\n            const prefix = `${attrName}.`;\n            // Match both numeric indices [0] and __temp_key__ values [some_key]\n            const bracketRegex = new RegExp(`^${escapeRegex(attrName)}\\\\[[^\\\\]]+\\\\]\\\\.`);\n\n            return removed\n              .filter((p) => p.startsWith(prefix) || bracketRegex.test(p))\n              .map((p) =>\n                p.startsWith(prefix) ? p.slice(prefix.length) : p.replace(bracketRegex, '')\n              );\n          };\n\n          if (DOCUMENT_META_FIELDS.includes(name)) {\n            return acc;\n          }\n\n          if (removedAttributes?.includes(name)) {\n            // If the attribute is not visible, we don't want to validate it\n            return acc;\n          }\n\n          const nestedRemoved = getNestedPathsForAttribute(removedAttributes, name);\n\n          /**\n           * These validations won't apply to every attribute\n           * and that's okay, in that case we just return the\n           * schema as it was passed.\n           */\n          const validations = [\n            addNullableValidation,\n            addRequiredValidation,\n            addMinLengthValidation,\n            addMaxLengthValidation,\n            addMinValidation,\n            addMaxValidation,\n            addRegexValidation,\n          ].map((fn) => fn(attribute, options));\n\n          const transformSchema = pipe(...validations);\n\n          switch (attribute.type) {\n            case 'component': {\n              const { attributes } = components[attribute.component];\n\n              if (attribute.repeatable) {\n                return {\n                  ...acc,\n                  [name]: transformSchema(\n                    yup.array().of(createModelSchema(attributes, nestedRemoved).nullable(false))\n                  ).test(arrayValidator(attribute, options)),\n                };\n              } else {\n                return {\n                  ...acc,\n                  [name]: transformSchema(createModelSchema(attributes, nestedRemoved).nullable()),\n                };\n              }\n            }\n            case 'dynamiczone':\n              return {\n                ...acc,\n                [name]: transformSchema(\n                  yup.array().of(\n                    yup.lazy(\n                      (\n                        data: SchemaUtils.Attribute.Value<SchemaUtils.Attribute.DynamicZone>[number]\n                      ) => {\n                        const attributes = components?.[data?.__component]?.attributes;\n\n                        const validation = yup\n                          .object()\n                          .shape({\n                            __component: yup.string().required().oneOf(Object.keys(components)),\n                          })\n                          .nullable(false);\n                        if (!attributes) {\n                          return validation;\n                        }\n\n                        return validation.concat(createModelSchema(attributes, nestedRemoved));\n                      }\n                    ) as unknown as yup.ObjectSchema<ObjectShape>\n                  )\n                ).test(arrayValidator(attribute, options)),\n              };\n            case 'relation':\n              return {\n                ...acc,\n                [name]: transformSchema(\n                  yup.lazy((value) => {\n                    if (!value) {\n                      return yup.mixed().nullable(true);\n                    } else if (Array.isArray(value)) {\n                      // If a relation value is an array, we expect\n                      // an array of objects with {id} properties, representing the related entities.\n                      return yup.array().of(\n                        yup.object().shape({\n                          id: yup.number().required(),\n                        })\n                      );\n                    } else if (typeof value === 'object') {\n                      // A realtion value can also be an object. Some API\n                      // repsonses return the number of entities in the relation\n                      // as { count: x }\n                      return yup.object();\n                    } else {\n                      return yup\n                        .mixed()\n                        .test(\n                          'type-error',\n                          'Relation values must be either null, an array of objects with {id} or an object.',\n                          () => false\n                        );\n                    }\n                  })\n                ),\n              };\n            default:\n              return {\n                ...acc,\n                [name]: transformSchema(createAttributeSchema(attribute)),\n              };\n          }\n        }, {})\n      )\n      /**\n       * TODO: investigate why an undefined object fails a check of `nullable`.\n       */\n      .default(null);\n\n  return createModelSchema(attributes, options.removedAttributes);\n};\n\nconst createAttributeSchema = (\n  attribute: Exclude<\n    SchemaUtils.Attribute.AnyAttribute,\n    { type: 'dynamiczone' } | { type: 'component' } | { type: 'relation' }\n  >\n) => {\n  switch (attribute.type) {\n    case 'biginteger':\n      return yup.string().matches(/^-?\\d*$/);\n    case 'boolean':\n      return yup.boolean().nullable();\n    case 'blocks':\n      return yup.mixed().test('isBlocks', translatedErrors.json, (value) => {\n        if (!value || Array.isArray(value)) {\n          return true;\n        } else {\n          return false;\n        }\n      });\n    case 'decimal':\n    case 'float':\n    case 'integer':\n      return yup.number();\n    case 'email':\n      return yup.string().email(translatedErrors.email);\n    case 'enumeration':\n      return yup.string().oneOf([...attribute.enum, null]);\n    case 'json':\n      return yup.mixed().test('isJSON', translatedErrors.json, (value) => {\n        /**\n         * We don't want to validate the JSON field if it's empty.\n         */\n        if (!value || (typeof value === 'string' && value.length === 0)) {\n          return true;\n        }\n\n        // If the value was created via content API and wasn't changed, then it's still an object\n        if (typeof value === 'object') {\n          try {\n            JSON.stringify(value);\n            return true;\n          } catch (err) {\n            return false;\n          }\n        }\n\n        try {\n          JSON.parse(value);\n\n          return true;\n        } catch (err) {\n          return false;\n        }\n      });\n    case 'password':\n      return yup.string().nullable();\n    case 'richtext':\n    case 'string':\n    case 'text':\n      return yup.string();\n    case 'uid':\n      return yup\n        .string()\n        .matches(attribute.regex ? new RegExp(attribute.regex) : /^[A-Za-z0-9-_.~]*$/);\n    default:\n      /**\n       * This allows any value.\n       */\n      return yup.mixed();\n  }\n};\n\n// Helper function to return schema.nullable() if it exists, otherwise return schema\nconst nullableSchema = <TSchema extends AnySchema>(schema: TSchema) => {\n  return schema?.nullable\n    ? schema.nullable()\n    : // In some cases '.nullable' will not be available on the schema.\n      // e.g. when the schema has been built using yup.lazy (e.g. for relations).\n      // In these cases we should just return the schema as it is.\n      schema;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Validators\n * -----------------------------------------------------------------------------------------------*/\n/**\n * Our validator functions can be preped with the\n * attribute and then have the schema piped through them.\n */\ntype ValidationFn = (\n  attribute: Schema['attributes'][string],\n  options: ValidationOptions\n) => <TSchema extends AnySchema>(schema: TSchema) => TSchema;\n\nconst addNullableValidation: ValidationFn = () => (schema) => {\n  return nullableSchema(schema);\n};\n\nconst addRequiredValidation: ValidationFn = (attribute, options) => (schema) => {\n  if (options.status === 'draft' || !attribute.required || attribute.type === 'password') {\n    return schema;\n  }\n\n  if (attribute.required && 'required' in schema) {\n    return schema.required(translatedErrors.required);\n  }\n\n  return schema;\n};\n\nconst addMinLengthValidation: ValidationFn =\n  (attribute, options) =>\n  <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n    // Skip minLength validation for draft\n    if (options.status === 'draft') {\n      return schema;\n    }\n\n    if (\n      'minLength' in attribute &&\n      attribute.minLength &&\n      Number.isInteger(attribute.minLength) &&\n      'min' in schema\n    ) {\n      return schema.min(attribute.minLength, {\n        ...translatedErrors.minLength,\n        values: {\n          min: attribute.minLength,\n        },\n      }) as TSchema;\n    }\n\n    return schema;\n  };\n\nconst addMaxLengthValidation: ValidationFn =\n  (attribute) =>\n  <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n    if (\n      'maxLength' in attribute &&\n      attribute.maxLength &&\n      Number.isInteger(attribute.maxLength) &&\n      'max' in schema\n    ) {\n      return schema.max(attribute.maxLength, {\n        ...translatedErrors.maxLength,\n        values: {\n          max: attribute.maxLength,\n        },\n      }) as TSchema;\n    }\n\n    return schema;\n  };\n\nconst addMinValidation: ValidationFn =\n  (attribute, options) =>\n  <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n    if (options.status === 'draft') {\n      return schema;\n    }\n\n    if ('min' in attribute && 'min' in schema) {\n      const min = toInteger(attribute.min);\n\n      if (min !== undefined) {\n        return schema.min(min, {\n          ...translatedErrors.min,\n          values: {\n            min,\n          },\n        }) as TSchema;\n      }\n    }\n\n    return schema;\n  };\n\nconst addMaxValidation: ValidationFn =\n  (attribute) =>\n  <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n    if ('max' in attribute) {\n      const max = toInteger(attribute.max);\n\n      if ('max' in schema && max !== undefined) {\n        return schema.max(max, {\n          ...translatedErrors.max,\n          values: {\n            max,\n          },\n        }) as TSchema;\n      }\n    }\n\n    return schema;\n  };\n\nconst toInteger = (val?: string | number): number | undefined => {\n  if (typeof val === 'number' || val === undefined) {\n    return val;\n  } else {\n    const num = Number(val);\n    return isNaN(num) ? undefined : num;\n  }\n};\n\nconst addRegexValidation: ValidationFn =\n  (attribute) =>\n  <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n    if ('regex' in attribute && attribute.regex && 'matches' in schema) {\n      return schema.matches(new RegExp(attribute.regex), {\n        message: {\n          id: translatedErrors.regex.id,\n          defaultMessage: 'The value does not match the defined pattern.',\n        },\n\n        excludeEmptyString: !attribute.required,\n      }) as TSchema;\n    }\n\n    return schema;\n  };\n\nexport { createYupSchema };\n"],"names":["arrayValidator","attribute","options","message","translatedErrors","required","test","value","status","Array","isArray","length","escapeRegex","str","replace","createYupSchema","attributes","components","createModelSchema","removedAttributes","yup","object","shape","Object","entries","reduce","acc","name","getNestedPathsForAttribute","removed","attrName","prefix","bracketRegex","RegExp","filter","p","startsWith","map","slice","DOCUMENT_META_FIELDS","includes","nestedRemoved","validations","addNullableValidation","addRequiredValidation","addMinLengthValidation","addMaxLengthValidation","addMinValidation","addMaxValidation","addRegexValidation","fn","transformSchema","pipe","type","component","repeatable","array","of","nullable","lazy","data","__component","validation","string","oneOf","keys","concat","mixed","id","number","createAttributeSchema","default","matches","boolean","json","email","enum","JSON","stringify","err","parse","regex","nullableSchema","schema","minLength","Number","isInteger","min","values","maxLength","max","toInteger","undefined","val","num","isNaN","defaultMessage","excludeEmptyString"],"mappings":"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"}