@rjsf/validator-ajv8 6.4.2 → 6.5.1
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/index.cjs +60 -25
- package/dist/index.cjs.map +2 -2
- package/dist/validator-ajv8.esm.js +60 -25
- package/dist/validator-ajv8.esm.js.map +2 -2
- package/dist/validator-ajv8.umd.js +60 -25
- package/lib/createPrecompiledValidator.d.ts +3 -2
- package/lib/createPrecompiledValidator.js +3 -2
- package/lib/createPrecompiledValidator.js.map +1 -1
- package/lib/precompiledValidator.d.ts +8 -2
- package/lib/precompiledValidator.js +4 -2
- package/lib/precompiledValidator.js.map +1 -1
- package/lib/processRawValidationErrors.d.ts +15 -2
- package/lib/processRawValidationErrors.js +42 -26
- package/lib/processRawValidationErrors.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/types.d.ts +9 -0
- package/lib/validator.d.ts +6 -1
- package/lib/validator.js +3 -2
- package/lib/validator.js.map +1 -1
- package/package.json +6 -6
- package/src/createPrecompiledValidator.ts +9 -3
- package/src/precompiledValidator.ts +25 -3
- package/src/processRawValidationErrors.ts +51 -24
- package/src/types.ts +10 -0
- package/src/validator.ts +27 -4
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/validator.ts", "../src/createAjvInstance.ts", "../src/processRawValidationErrors.ts", "../src/customizeValidator.ts", "../src/precompiledValidator.ts", "../src/createPrecompiledValidator.ts", "../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["import Ajv, { ErrorObject, ValidateFunction } from 'ajv';\nimport {\n CustomValidator,\n deepEquals,\n ErrorTransformer,\n FormContextType,\n ID_KEY,\n RJSFSchema,\n ROOT_SCHEMA_PREFIX,\n StrictRJSFSchema,\n UiSchema,\n ValidationData,\n ValidatorType,\n withIdRefPrefix,\n hashForSchema,\n} from '@rjsf/utils';\n\nimport { CustomValidatorOptionsType, Localizer } from './types';\nimport createAjvInstance from './createAjvInstance';\nimport processRawValidationErrors, { RawValidationErrorsType } from './processRawValidationErrors';\n\n/** `ValidatorType` implementation that uses the AJV 8 validation mechanism.\n */\nexport default class AJV8Validator<\n T = any,\n S extends StrictRJSFSchema = RJSFSchema,\n F extends FormContextType = any,\n> implements ValidatorType<T, S, F> {\n /** The AJV instance to use for all validations\n *\n * @private\n */\n ajv: Ajv;\n\n /** The Localizer function to use for localizing Ajv errors\n *\n * @private\n */\n readonly localizer?: Localizer;\n\n /** Constructs an `AJV8Validator` instance using the `options`\n *\n * @param options - The `CustomValidatorOptionsType` options that are used to create the AJV instance\n * @param [localizer] - If provided, is used to localize a list of Ajv `ErrorObject`s\n */\n constructor(options: CustomValidatorOptionsType, localizer?: Localizer) {\n const { additionalMetaSchemas, customFormats, ajvOptionsOverrides, ajvFormatOptions, AjvClass, extenderFn } =\n options;\n this.ajv = createAjvInstance(\n additionalMetaSchemas,\n customFormats,\n ajvOptionsOverrides,\n ajvFormatOptions,\n AjvClass,\n extenderFn,\n );\n this.localizer = localizer;\n }\n\n /** Resets the internal AJV validator to clear schemas from it. Can be helpful for resetting the validator for tests.\n */\n reset() {\n this.ajv.removeSchema();\n }\n\n /** Runs the pure validation of the `schema` and `formData` without any of the RJSF functionality. Provided for use\n * by the playground. Returns the `errors` from the validation\n *\n * @param schema - The schema against which to validate the form data * @param schema\n * @param formData - The form data to validate\n */\n rawValidation<Result = any>(schema: S, formData?: T): RawValidationErrorsType<Result> {\n let compilationError: Error | undefined = undefined;\n let compiledValidator: ValidateFunction | undefined;\n try {\n if (schema[ID_KEY]) {\n compiledValidator = this.ajv.getSchema(schema[ID_KEY]);\n }\n if (compiledValidator === undefined) {\n compiledValidator = this.ajv.compile(schema);\n }\n compiledValidator(formData);\n } catch (err) {\n compilationError = err as Error;\n }\n\n let errors;\n if (compiledValidator) {\n if (typeof this.localizer === 'function') {\n // Properties need to be enclosed with quotes so that\n // `AJV8Validator#transformRJSFValidationErrors` replaces property names\n // with `title` or `ui:title`. See #4348, #4349, #4387, and #4402.\n (compiledValidator.errors ?? []).forEach((error) => {\n ['missingProperty', 'property'].forEach((key) => {\n if (error.params?.[key]) {\n error.params[key] = `'${error.params[key]}'`;\n }\n });\n if (error.params?.deps) {\n // As `error.params.deps` is the comma+space separated list of missing dependencies, enclose each dependency separately.\n // For example, `A, B` is converted into `'A', 'B'`.\n error.params.deps = error.params.deps\n .split(', ')\n .map((v: string) => `'${v}'`)\n .join(', ');\n }\n });\n this.localizer(compiledValidator.errors);\n // Revert to originals\n (compiledValidator.errors ?? []).forEach((error) => {\n ['missingProperty', 'property'].forEach((key) => {\n if (error.params?.[key]) {\n error.params[key] = error.params[key].slice(1, -1);\n }\n });\n if (error.params?.deps) {\n // Remove surrounding quotes from each missing dependency. For example, `'A', 'B'` is reverted to `A, B`.\n error.params.deps = error.params.deps\n .split(', ')\n .map((v: string) => v.slice(1, -1))\n .join(', ');\n }\n });\n }\n errors = compiledValidator.errors || undefined;\n\n // Clear errors to prevent persistent errors, see #1104\n compiledValidator.errors = null;\n }\n\n return {\n errors: errors as unknown as Result[],\n validationError: compilationError,\n };\n }\n\n /** This function processes the `formData` with an optional user contributed `customValidate` function, which receives\n * the form data and a `errorHandler` function that will be used to add custom validation errors for each field. Also\n * supports a `transformErrors` function that will take the raw AJV validation errors, prior to custom validation and\n * transform them in what ever way it chooses.\n *\n * @param formData - The form data to validate\n * @param schema - The schema against which to validate the form data\n * @param [customValidate] - An optional function that is used to perform custom validation\n * @param [transformErrors] - An optional function that is used to transform errors after AJV validation\n * @param [uiSchema] - An optional uiSchema that is passed to `transformErrors` and `customValidate`\n */\n validateFormData(\n formData: T | undefined,\n schema: S,\n customValidate?: CustomValidator<T, S, F>,\n transformErrors?: ErrorTransformer<T, S, F>,\n uiSchema?: UiSchema<T, S, F>,\n ): ValidationData<T> {\n const rawErrors = this.rawValidation<ErrorObject>(schema, formData);\n return processRawValidationErrors(this, rawErrors, formData, schema, customValidate, transformErrors, uiSchema);\n }\n\n /**\n * This function checks if a schema needs to be added and if the root schemas don't match it removes the old root schema from the ajv instance and adds the new one.\n * @param rootSchema - The root schema used to provide $ref resolutions\n */\n handleSchemaUpdate(rootSchema: S): void {\n const rootSchemaId = rootSchema[ID_KEY] ?? ROOT_SCHEMA_PREFIX;\n // add the rootSchema ROOT_SCHEMA_PREFIX as id.\n // if schema validator instance doesn't exist, add it.\n // else if the root schemas don't match, we should remove and add the root schema so we don't have to remove and recompile the schema every run.\n if (this.ajv.getSchema(rootSchemaId) === undefined) {\n this.ajv.addSchema(rootSchema, rootSchemaId);\n } else if (!deepEquals(rootSchema, this.ajv.getSchema(rootSchemaId)?.schema)) {\n this.ajv.removeSchema(rootSchemaId);\n this.ajv.addSchema(rootSchema, rootSchemaId);\n }\n }\n\n /** Validates data against a schema, returning true if the data is valid, or\n * false otherwise. If the schema is invalid, then this function will return\n * false.\n *\n * @param schema - The schema against which to validate the form data\n * @param formData - The form data to validate\n * @param rootSchema - The root schema used to provide $ref resolutions\n */\n isValid(schema: S, formData: T | undefined, rootSchema: S) {\n try {\n this.handleSchemaUpdate(rootSchema);\n // then rewrite the schema ref's to point to the rootSchema\n // this accounts for the case where schema have references to models\n // that lives in the rootSchema but not in the schema in question.\n const schemaWithIdRefPrefix = withIdRefPrefix<S>(schema) as S;\n const schemaId = schemaWithIdRefPrefix[ID_KEY] ?? hashForSchema(schemaWithIdRefPrefix);\n let compiledValidator: ValidateFunction | undefined;\n compiledValidator = this.ajv.getSchema(schemaId);\n if (compiledValidator === undefined) {\n // Add schema by an explicit ID so it can be fetched later\n // Fall back to using compile if necessary\n // https://ajv.js.org/guide/managing-schemas.html#pre-adding-all-schemas-vs-adding-on-demand\n compiledValidator =\n this.ajv.addSchema(schemaWithIdRefPrefix, schemaId).getSchema(schemaId) ||\n this.ajv.compile(schemaWithIdRefPrefix);\n }\n const result = compiledValidator(formData);\n return result as boolean;\n } catch (e) {\n console.warn('Error encountered compiling schema:', e);\n return false;\n }\n }\n}\n", "import Ajv, { Options } from 'ajv';\nimport addFormats, { FormatsPluginOptions } from 'ajv-formats';\nimport isObject from 'lodash/isObject';\nimport { ADDITIONAL_PROPERTY_FLAG, RJSF_ADDITIONAL_PROPERTIES_FLAG } from '@rjsf/utils';\n\nimport { CustomValidatorOptionsType } from './types';\n\nexport const AJV_CONFIG: Options = {\n allErrors: true,\n multipleOfPrecision: 8,\n strict: false,\n verbose: true,\n discriminator: false, // TODO enable this in V6\n} as const;\nexport const COLOR_FORMAT_REGEX =\n /^(#?([0-9A-Fa-f]{3}){1,2}\\b|aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow|(rgb\\(\\s*\\b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\b\\s*,\\s*\\b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\b\\s*,\\s*\\b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\b\\s*\\))|(rgb\\(\\s*(\\d?\\d%|100%)+\\s*,\\s*(\\d?\\d%|100%)+\\s*,\\s*(\\d?\\d%|100%)+\\s*\\)))$/;\nexport const DATA_URL_FORMAT_REGEX = /^data:([a-z]+\\/[a-z0-9-+.]+)?;(?:name=(.*);)?base64,(.*)$/;\n\n/** Creates an Ajv version 8 implementation object with standard support for the 'color` and `data-url` custom formats.\n * If `additionalMetaSchemas` are provided then the Ajv instance is modified to add each of the meta schemas in the\n * list. If `customFormats` are provided then those additional formats are added to the list of supported formats. If\n * `ajvOptionsOverrides` are provided then they are spread on top of the default `AJV_CONFIG` options when constructing\n * the `Ajv` instance. With Ajv v8, the JSON Schema formats are not provided by default, but can be plugged in. By\n * default, all formats from the `ajv-formats` library are added. To disable this capability, set the `ajvFormatOptions`\n * parameter to `false`. Additionally, you can configure the `ajv-formats` by providing a custom set of\n * [format options](https://github.com/ajv-validator/ajv-formats) to the `ajvFormatOptions` parameter.\n *\n * @param [additionalMetaSchemas] - The list of additional meta schemas that the validator can access\n * @param [customFormats] - The set of additional custom formats that the validator will support\n * @param [ajvOptionsOverrides={}] - The set of validator config override options\n * @param [ajvFormatOptions] - The `ajv-format` options to use when adding formats to `ajv`; pass `false` to disable it\n * @param [AjvClass] - The `Ajv` class to use when creating the validator instance\n * @param [extenderFn] - A function to call to extend AJV, such as `ajvErrors()`\n */\nexport default function createAjvInstance(\n additionalMetaSchemas?: CustomValidatorOptionsType['additionalMetaSchemas'],\n customFormats?: CustomValidatorOptionsType['customFormats'],\n ajvOptionsOverrides: CustomValidatorOptionsType['ajvOptionsOverrides'] = {},\n ajvFormatOptions?: FormatsPluginOptions | false,\n AjvClass: typeof Ajv = Ajv,\n extenderFn?: CustomValidatorOptionsType['extenderFn'],\n) {\n let ajv = new AjvClass({ ...AJV_CONFIG, ...ajvOptionsOverrides });\n if (ajvFormatOptions) {\n addFormats(ajv, ajvFormatOptions);\n } else if (ajvFormatOptions !== false) {\n addFormats(ajv);\n }\n\n // add custom formats\n ajv.addFormat('data-url', DATA_URL_FORMAT_REGEX);\n ajv.addFormat('color', COLOR_FORMAT_REGEX);\n\n // Add RJSF-specific additional properties keywords so Ajv doesn't report errors if strict is enabled.\n ajv.addKeyword(ADDITIONAL_PROPERTY_FLAG);\n ajv.addKeyword(RJSF_ADDITIONAL_PROPERTIES_FLAG);\n\n // add more schemas to validate against\n if (Array.isArray(additionalMetaSchemas)) {\n ajv.addMetaSchema(additionalMetaSchemas);\n }\n\n // add more custom formats to validate against\n if (isObject(customFormats)) {\n Object.keys(customFormats).forEach((formatName) => {\n ajv.addFormat(formatName, customFormats[formatName]);\n });\n }\n if (extenderFn) {\n ajv = extenderFn(ajv);\n }\n\n return ajv;\n}\n", "import { ErrorObject } from 'ajv';\nimport get from 'lodash/get';\nimport {\n ANY_OF_KEY,\n createErrorHandler,\n CustomValidator,\n ErrorTransformer,\n FormContextType,\n getDefaultFormState,\n getUiOptions,\n ONE_OF_KEY,\n PROPERTIES_KEY,\n RJSFSchema,\n RJSFValidationError,\n StrictRJSFSchema,\n toErrorSchema,\n UiSchema,\n unwrapErrorHandler,\n validationDataMerge,\n ValidatorType,\n} from '@rjsf/utils';\n\nexport type RawValidationErrorsType<Result = any> = {\n errors?: Result[];\n validationError?: Error;\n};\n\n/** Transforming the error output from ajv to format used by @rjsf/utils.\n * At some point, components should be updated to support ajv.\n *\n * @param errors - The list of AJV errors to convert to `RJSFValidationErrors`\n * @param [uiSchema] - An optional uiSchema that is passed to `transformErrors` and `customValidate`\n */\nexport function transformRJSFValidationErrors<\n T = any,\n S extends StrictRJSFSchema = RJSFSchema,\n F extends FormContextType = any,\n>(errors: ErrorObject[] = [], uiSchema?: UiSchema<T, S, F>): RJSFValidationError[] {\n const errorList = errors.map((e: ErrorObject) => {\n const { instancePath, keyword, params, schemaPath, parentSchema, ...rest } = e;\n let { message = '' } = rest;\n let property = instancePath.replace(/\\//g, '.');\n let stack = `${property} ${message}`.trim();\n let uiTitle = '';\n const rawPropertyNames: string[] = [\n ...(params.deps?.split(', ') || []),\n params.missingProperty,\n params.property,\n ].filter((item) => item);\n\n if (rawPropertyNames.length > 0) {\n rawPropertyNames.forEach((currentProperty) => {\n const path = property ? `${property}.${currentProperty}` : currentProperty;\n let uiSchemaTitle = getUiOptions(get(uiSchema, `${path.replace(/^\\./, '')}`)).title;\n if (uiSchemaTitle === undefined) {\n // To retrieve a title from UI schema, construct a path to UI schema from `schemaPath` and `currentProperty`.\n // For example, when `#/properties/A/properties/B/required` and `C` are given, they are converted into `['A', 'B', 'C']`.\n const uiSchemaPath = schemaPath\n .replace(/\\/properties\\//g, '/')\n .split('/')\n .slice(1, -1)\n .concat([currentProperty]);\n uiSchemaTitle = getUiOptions(get(uiSchema, uiSchemaPath)).title;\n }\n if (uiSchemaTitle) {\n message = message.replace(`'${currentProperty}'`, `'${uiSchemaTitle}'`);\n uiTitle = uiSchemaTitle;\n } else {\n const parentSchemaTitle = get(parentSchema, [PROPERTIES_KEY, currentProperty, 'title']);\n if (parentSchemaTitle) {\n message = message.replace(`'${currentProperty}'`, `'${parentSchemaTitle}'`);\n uiTitle = parentSchemaTitle;\n }\n }\n });\n\n stack = message;\n } else {\n const uiSchemaTitle = getUiOptions<T, S, F>(get(uiSchema, `${property.replace(/^\\./, '')}`)).title;\n\n if (uiSchemaTitle) {\n stack = `'${uiSchemaTitle}' ${message}`.trim();\n uiTitle = uiSchemaTitle;\n } else {\n const parentSchemaTitle = parentSchema?.title;\n\n if (parentSchemaTitle) {\n stack = `'${parentSchemaTitle}' ${message}`.trim();\n uiTitle = parentSchemaTitle;\n }\n }\n }\n\n // If params.missingProperty is undefined, it is removed from rawPropertyNames by filter((item) => item).\n if ('missingProperty' in params) {\n property = property ? `${property}.${params.missingProperty}` : params.missingProperty;\n }\n\n // put data in expected format\n return {\n name: keyword,\n property,\n message,\n params, // specific to ajv\n stack,\n schemaPath,\n title: uiTitle,\n };\n });\n // Filter out duplicates around anyOf/oneOf messages\n return errorList.reduce((acc: RJSFValidationError[], err: RJSFValidationError) => {\n const { message, schemaPath } = err;\n const anyOfIndex = schemaPath?.indexOf(`/${ANY_OF_KEY}/`);\n const oneOfIndex = schemaPath?.indexOf(`/${ONE_OF_KEY}/`);\n let schemaPrefix: string | undefined;\n // Look specifically for `/anyOr/` or `/oneOf/` within the schemaPath information\n if (anyOfIndex && anyOfIndex >= 0) {\n schemaPrefix = schemaPath?.substring(0, anyOfIndex);\n } else if (oneOfIndex && oneOfIndex >= 0) {\n schemaPrefix = schemaPath?.substring(0, oneOfIndex);\n }\n // If there is a schemaPrefix, then search for a duplicate message with the same prefix, otherwise undefined\n const dup = schemaPrefix\n ? acc.find((e: RJSFValidationError) => e.message === message && e.schemaPath?.startsWith(schemaPrefix))\n : undefined;\n if (!dup) {\n // Only push an error that is not a duplicate\n acc.push(err);\n }\n return acc;\n }, [] as RJSFValidationError[]);\n}\n\n/** This function processes the `formData` with an optional user contributed `customValidate` function, which receives\n * the form data and a `errorHandler` function that will be used to add custom validation errors for each field. Also\n * supports a `transformErrors` function that will take the raw AJV validation errors, prior to custom validation and\n * transform them in what ever way it chooses.\n *\n * @param validator - The `ValidatorType` implementation used for the `getDefaultFormState()` call\n * @param rawErrors - The list of raw `ErrorObject`s to process\n * @param formData - The form data to validate\n * @param schema - The schema against which to validate the form data\n * @param [customValidate] - An optional function that is used to perform custom validation\n * @param [transformErrors] - An optional function that is used to transform errors after AJV validation\n * @param [uiSchema] - An optional uiSchema that is passed to `transformErrors` and `customValidate`\n */\nexport default function processRawValidationErrors<\n T = any,\n S extends StrictRJSFSchema = RJSFSchema,\n F extends FormContextType = any,\n>(\n validator: ValidatorType<T, S, F>,\n rawErrors: RawValidationErrorsType<ErrorObject>,\n formData: T | undefined,\n schema: S,\n customValidate?: CustomValidator<T, S, F>,\n transformErrors?: ErrorTransformer<T, S, F>,\n uiSchema?: UiSchema<T, S, F>,\n) {\n const { validationError: invalidSchemaError } = rawErrors;\n let errors = transformRJSFValidationErrors<T, S, F>(rawErrors.errors, uiSchema);\n\n if (invalidSchemaError) {\n errors = [...errors, { stack: invalidSchemaError!.message }];\n }\n if (typeof transformErrors === 'function') {\n errors = transformErrors(errors, uiSchema);\n }\n\n let errorSchema = toErrorSchema<T>(errors);\n\n if (invalidSchemaError) {\n errorSchema = {\n ...errorSchema,\n $schema: {\n __errors: [invalidSchemaError!.message],\n },\n };\n }\n\n if (typeof customValidate !== 'function') {\n return { errors, errorSchema };\n }\n\n // Include form data with undefined values, which is required for custom validation.\n const newFormData = getDefaultFormState<T, S, F>(validator, schema, formData, schema, true) as T;\n\n const errorHandler = customValidate(newFormData, createErrorHandler<T>(newFormData), uiSchema, errorSchema);\n const userErrorSchema = unwrapErrorHandler<T>(errorHandler);\n return validationDataMerge<T>({ errors, errorSchema }, userErrorSchema);\n}\n", "import { FormContextType, RJSFSchema, StrictRJSFSchema } from '@rjsf/utils';\n\nimport { CustomValidatorOptionsType, Localizer } from './types';\nimport AJV8Validator from './validator';\n\n/** Creates and returns a customized implementation of the `ValidatorType` with the given customization `options` if\n * provided. If a `localizer` is provided, it is used to translate the messages generated by the underlying AJV\n * validation.\n *\n * @param [options={}] - The `CustomValidatorOptionsType` options that are used to create the `ValidatorType` instance\n * @param [localizer] - If provided, is used to localize a list of Ajv `ErrorObject`s\n * @returns - The custom validator implementation resulting from the set of parameters provided\n */\nexport default function customizeValidator<\n T = any,\n S extends StrictRJSFSchema = RJSFSchema,\n F extends FormContextType = any,\n>(options: CustomValidatorOptionsType = {}, localizer?: Localizer) {\n return new AJV8Validator<T, S, F>(options, localizer);\n}\n", "import { ErrorObject } from 'ajv';\nimport get from 'lodash/get';\nimport {\n CustomValidator,\n deepEquals,\n ErrorTransformer,\n FormContextType,\n hashForSchema,\n ID_KEY,\n JUNK_OPTION_ID,\n retrieveSchema,\n RJSFSchema,\n StrictRJSFSchema,\n UiSchema,\n ValidationData,\n ValidatorType,\n} from '@rjsf/utils';\n\nimport { CompiledValidateFunction, Localizer, ValidatorFunctions } from './types';\nimport processRawValidationErrors, { RawValidationErrorsType } from './processRawValidationErrors';\n\n/** `ValidatorType` implementation that uses an AJV 8 precompiled validator as created by the\n * `compileSchemaValidators()` function provided by the `@rjsf/validator-ajv8` library.\n */\nexport default class AJV8PrecompiledValidator<\n T = any,\n S extends StrictRJSFSchema = RJSFSchema,\n F extends FormContextType = any,\n> implements ValidatorType<T, S, F> {\n /** The root schema object used to construct this validator\n *\n * @private\n */\n readonly rootSchema: S;\n\n /** The `ValidatorFunctions` map used to construct this validator\n *\n * @private\n */\n readonly validateFns: ValidatorFunctions;\n\n /** The main validator function associated with the base schema in the `precompiledValidator`\n *\n * @private\n */\n readonly mainValidator: CompiledValidateFunction;\n\n /** The Localizer function to use for localizing Ajv errors\n *\n * @private\n */\n readonly localizer?: Localizer;\n\n /** Constructs an `AJV8PrecompiledValidator` instance using the `validateFns` and `rootSchema`\n *\n * @param validateFns - The map of the validation functions that are generated by the `schemaCompile()` function\n * @param rootSchema - The root schema that was used with the `compileSchema()` function\n * @param [localizer] - If provided, is used to localize a list of Ajv `ErrorObject`s\n * @throws - Error when the base schema of the precompiled validator does not have a matching validator function\n */\n constructor(validateFns: ValidatorFunctions, rootSchema: S, localizer?: Localizer) {\n this.rootSchema = rootSchema;\n this.validateFns = validateFns;\n this.localizer = localizer;\n this.mainValidator = this.getValidator(rootSchema);\n }\n\n /** Returns the precompiled validator associated with the given `schema` from the map of precompiled validator\n * functions.\n *\n * @param schema - The schema for which a precompiled validator function is desired\n * @returns - The precompiled validator function associated with this schema\n */\n getValidator(schema: S) {\n const key = get(schema, ID_KEY) || hashForSchema(schema);\n const validator = this.validateFns[key];\n if (!validator) {\n throw new Error(`No precompiled validator function was found for the given schema for \"${key}\"`);\n }\n return validator;\n }\n\n /** Ensures that the validator is using the same schema as the root schema used to construct the precompiled\n * validator. It first compares the given `schema` against the root schema and if they aren't the same, then it\n * checks against the resolved root schema, on the chance that a resolved version of the root schema was passed in\n * instead of the raw root schema.\n *\n * @param schema - The schema against which to validate the form data\n * @param [formData] - The form data to validate if any\n */\n ensureSameRootSchema(schema: S, formData?: T) {\n if (!deepEquals(schema, this.rootSchema)) {\n // Resolve the root schema with the passed in form data since that may affect the resolution\n const resolvedRootSchema = retrieveSchema(this, this.rootSchema, this.rootSchema, formData);\n if (!deepEquals(schema, resolvedRootSchema)) {\n throw new Error(\n 'The schema associated with the precompiled validator differs from the rootSchema provided for validation',\n );\n }\n }\n return true;\n }\n\n /** Runs the pure validation of the `schema` and `formData` without any of the RJSF functionality. Provided for use\n * by the playground. Returns the `errors` from the validation\n *\n * @param schema - The schema against which to validate the form data\n * @param [formData] - The form data to validate, if any\n * @throws - Error when the schema provided does not match the base schema of the precompiled validator\n */\n rawValidation<Result = any>(schema: S, formData?: T): RawValidationErrorsType<Result> {\n this.ensureSameRootSchema(schema, formData);\n this.mainValidator(formData);\n\n if (typeof this.localizer === 'function') {\n this.localizer(this.mainValidator.errors);\n }\n const errors = this.mainValidator.errors || undefined;\n\n // Clear errors to prevent persistent errors, see #1104\n this.mainValidator.errors = null;\n\n return { errors: errors as unknown as Result[] };\n }\n\n /** This function processes the `formData` with an optional user contributed `customValidate` function, which receives\n * the form data and a `errorHandler` function that will be used to add custom validation errors for each field. Also\n * supports a `transformErrors` function that will take the raw AJV validation errors, prior to custom validation and\n * transform them in what ever way it chooses.\n *\n * @param formData - The form data to validate\n * @param schema - The schema against which to validate the form data\n * @param [customValidate] - An optional function that is used to perform custom validation\n * @param [transformErrors] - An optional function that is used to transform errors after AJV validation\n * @param [uiSchema] - An optional uiSchema that is passed to `transformErrors` and `customValidate`\n */\n validateFormData(\n formData: T | undefined,\n schema: S,\n customValidate?: CustomValidator<T, S, F>,\n transformErrors?: ErrorTransformer<T, S, F>,\n uiSchema?: UiSchema<T, S, F>,\n ): ValidationData<T> {\n const rawErrors = this.rawValidation<ErrorObject>(schema, formData);\n return processRawValidationErrors(this, rawErrors, formData, schema, customValidate, transformErrors, uiSchema);\n }\n\n /** Validates data against a schema, returning true if the data is valid, or false otherwise. If the schema is\n * invalid, then this function will return false.\n *\n * @param schema - The schema against which to validate the form data\n * @param formData - The form data to validate\n * @param rootSchema - The root schema used to provide $ref resolutions\n * @returns - true if the formData validates against the schema, false otherwise\n * @throws - Error when the schema provided does not match the base schema of the precompiled validator OR if there\n * isn't a precompiled validator function associated with the schema\n */\n isValid(schema: S, formData: T | undefined, rootSchema: S) {\n this.ensureSameRootSchema(rootSchema, formData);\n if (get(schema, ID_KEY) === JUNK_OPTION_ID) {\n return false;\n }\n const validator = this.getValidator(schema);\n return validator(formData);\n }\n}\n", "import { FormContextType, RJSFSchema, StrictRJSFSchema, ValidatorType } from '@rjsf/utils';\n\nimport { Localizer, ValidatorFunctions } from './types';\nimport AJV8PrecompiledValidator from './precompiledValidator';\n\n/** Creates and returns a `ValidatorType` interface that is implemented with a precompiled validator. If a `localizer`\n * is provided, it is used to translate the messages generated by the underlying AJV validation.\n *\n * NOTE: The `validateFns` parameter is an object obtained by importing from a precompiled validation file created via\n * the `compileSchemaValidators()` function.\n *\n * @param validateFns - The map of the validation functions that are created by the `compileSchemaValidators()` function\n * @param rootSchema - The root schema that was used with the `compileSchemaValidators()` function\n * @param [localizer] - If provided, is used to localize a list of Ajv `ErrorObject`s\n * @returns - The precompiled validator implementation resulting from the set of parameters provided\n */\nexport default function createPrecompiledValidator<\n T = any,\n S extends StrictRJSFSchema = RJSFSchema,\n F extends FormContextType = any,\n>(validateFns: ValidatorFunctions, rootSchema: S, localizer?: Localizer): ValidatorType<T, S, F> {\n return new AJV8PrecompiledValidator<T, S, F>(validateFns, rootSchema, localizer);\n}\n", "import customizeValidator from './customizeValidator';\nimport createPrecompiledValidator from './createPrecompiledValidator';\n\nexport { customizeValidator, createPrecompiledValidator };\nexport * from './types';\n\nexport default customizeValidator();\n"],
|
|
5
|
-
"mappings": ";AACA;AAAA,EAEE;AAAA,EAGA;AAAA,EAEA;AAAA,EAKA;AAAA,EACA;AAAA,OACK;;;ACfP,OAAO,SAAsB;AAC7B,OAAO,gBAA0C;AACjD,OAAO,cAAc;AACrB,SAAS,0BAA0B,uCAAuC;AAInE,IAAM,aAAsB;AAAA,EACjC,WAAW;AAAA,EACX,qBAAqB;AAAA,EACrB,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,eAAe;AAAA;AACjB;AACO,IAAM,qBACX;AACK,IAAM,wBAAwB;AAkBtB,SAAR,kBACL,uBACA,eACA,sBAAyE,CAAC,GAC1E,kBACA,WAAuB,KACvB,YACA;AACA,MAAI,MAAM,IAAI,SAAS,EAAE,GAAG,YAAY,GAAG,oBAAoB,CAAC;AAChE,MAAI,kBAAkB;AACpB,eAAW,KAAK,gBAAgB;AAAA,EAClC,WAAW,qBAAqB,OAAO;AACrC,eAAW,GAAG;AAAA,EAChB;AAGA,MAAI,UAAU,YAAY,qBAAqB;AAC/C,MAAI,UAAU,SAAS,kBAAkB;AAGzC,MAAI,WAAW,wBAAwB;AACvC,MAAI,WAAW,+BAA+B;AAG9C,MAAI,MAAM,QAAQ,qBAAqB,GAAG;AACxC,QAAI,cAAc,qBAAqB;AAAA,EACzC;AAGA,MAAI,SAAS,aAAa,GAAG;AAC3B,WAAO,KAAK,aAAa,EAAE,QAAQ,CAAC,eAAe;AACjD,UAAI,UAAU,YAAY,cAAc,UAAU,CAAC;AAAA,IACrD,CAAC;AAAA,EACH;AACA,MAAI,YAAY;AACd,UAAM,WAAW,GAAG;AAAA,EACtB;AAEA,SAAO;AACT;;;ACxEA,OAAO,SAAS;AAChB;AAAA,EACE;AAAA,EACA;AAAA,EAIA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAIA;AAAA,EAEA;AAAA,EACA;AAAA,OAEK;
|
|
4
|
+
"sourcesContent": ["import Ajv, { ErrorObject, ValidateFunction } from 'ajv';\nimport {\n CustomValidator,\n deepEquals,\n ErrorTransformer,\n FormContextType,\n ID_KEY,\n RJSFSchema,\n ROOT_SCHEMA_PREFIX,\n StrictRJSFSchema,\n UiSchema,\n ValidationData,\n ValidatorType,\n withIdRefPrefix,\n hashForSchema,\n} from '@rjsf/utils';\n\nimport { CustomValidatorOptionsType, Localizer, SuppressDuplicateFilteringType } from './types';\nimport createAjvInstance from './createAjvInstance';\nimport processRawValidationErrors, { RawValidationErrorsType } from './processRawValidationErrors';\n\n/** `ValidatorType` implementation that uses the AJV 8 validation mechanism.\n */\nexport default class AJV8Validator<\n T = any,\n S extends StrictRJSFSchema = RJSFSchema,\n F extends FormContextType = any,\n> implements ValidatorType<T, S, F> {\n /** The AJV instance to use for all validations\n *\n * @private\n */\n ajv: Ajv;\n\n /** The Localizer function to use for localizing Ajv errors\n *\n * @private\n */\n readonly localizer?: Localizer;\n\n /** Controls which duplicate error filtering is suppressed; see `filterDuplicateErrors`\n *\n * @private\n */\n readonly suppressDuplicateFiltering?: SuppressDuplicateFilteringType;\n\n /** Constructs an `AJV8Validator` instance using the `options`\n *\n * @param options - The `CustomValidatorOptionsType` options that are used to create the AJV instance\n * @param [localizer] - If provided, is used to localize a list of Ajv `ErrorObject`s\n */\n constructor(options: CustomValidatorOptionsType, localizer?: Localizer) {\n const {\n additionalMetaSchemas,\n customFormats,\n ajvOptionsOverrides,\n ajvFormatOptions,\n AjvClass,\n extenderFn,\n suppressDuplicateFiltering,\n } = options;\n this.ajv = createAjvInstance(\n additionalMetaSchemas,\n customFormats,\n ajvOptionsOverrides,\n ajvFormatOptions,\n AjvClass,\n extenderFn,\n );\n this.localizer = localizer;\n this.suppressDuplicateFiltering = suppressDuplicateFiltering;\n }\n\n /** Resets the internal AJV validator to clear schemas from it. Can be helpful for resetting the validator for tests.\n */\n reset() {\n this.ajv.removeSchema();\n }\n\n /** Runs the pure validation of the `schema` and `formData` without any of the RJSF functionality. Provided for use\n * by the playground. Returns the `errors` from the validation\n *\n * @param schema - The schema against which to validate the form data * @param schema\n * @param formData - The form data to validate\n */\n rawValidation<Result = any>(schema: S, formData?: T): RawValidationErrorsType<Result> {\n let compilationError: Error | undefined = undefined;\n let compiledValidator: ValidateFunction | undefined;\n try {\n if (schema[ID_KEY]) {\n compiledValidator = this.ajv.getSchema(schema[ID_KEY]);\n }\n if (compiledValidator === undefined) {\n compiledValidator = this.ajv.compile(schema);\n }\n compiledValidator(formData);\n } catch (err) {\n compilationError = err as Error;\n }\n\n let errors;\n if (compiledValidator) {\n if (typeof this.localizer === 'function') {\n // Properties need to be enclosed with quotes so that\n // `AJV8Validator#transformRJSFValidationErrors` replaces property names\n // with `title` or `ui:title`. See #4348, #4349, #4387, and #4402.\n (compiledValidator.errors ?? []).forEach((error) => {\n ['missingProperty', 'property'].forEach((key) => {\n if (error.params?.[key]) {\n error.params[key] = `'${error.params[key]}'`;\n }\n });\n if (error.params?.deps) {\n // As `error.params.deps` is the comma+space separated list of missing dependencies, enclose each dependency separately.\n // For example, `A, B` is converted into `'A', 'B'`.\n error.params.deps = error.params.deps\n .split(', ')\n .map((v: string) => `'${v}'`)\n .join(', ');\n }\n });\n this.localizer(compiledValidator.errors);\n // Revert to originals\n (compiledValidator.errors ?? []).forEach((error) => {\n ['missingProperty', 'property'].forEach((key) => {\n if (error.params?.[key]) {\n error.params[key] = error.params[key].slice(1, -1);\n }\n });\n if (error.params?.deps) {\n // Remove surrounding quotes from each missing dependency. For example, `'A', 'B'` is reverted to `A, B`.\n error.params.deps = error.params.deps\n .split(', ')\n .map((v: string) => v.slice(1, -1))\n .join(', ');\n }\n });\n }\n errors = compiledValidator.errors || undefined;\n\n // Clear errors to prevent persistent errors, see #1104\n compiledValidator.errors = null;\n }\n\n return {\n errors: errors as unknown as Result[],\n validationError: compilationError,\n };\n }\n\n /** This function processes the `formData` with an optional user contributed `customValidate` function, which receives\n * the form data and a `errorHandler` function that will be used to add custom validation errors for each field. Also\n * supports a `transformErrors` function that will take the raw AJV validation errors, prior to custom validation and\n * transform them in what ever way it chooses.\n *\n * @param formData - The form data to validate\n * @param schema - The schema against which to validate the form data\n * @param [customValidate] - An optional function that is used to perform custom validation\n * @param [transformErrors] - An optional function that is used to transform errors after AJV validation\n * @param [uiSchema] - An optional uiSchema that is passed to `transformErrors` and `customValidate`\n */\n validateFormData(\n formData: T | undefined,\n schema: S,\n customValidate?: CustomValidator<T, S, F>,\n transformErrors?: ErrorTransformer<T, S, F>,\n uiSchema?: UiSchema<T, S, F>,\n ): ValidationData<T> {\n const rawErrors = this.rawValidation<ErrorObject>(schema, formData);\n return processRawValidationErrors(\n this,\n rawErrors,\n formData,\n schema,\n customValidate,\n transformErrors,\n uiSchema,\n this.suppressDuplicateFiltering,\n );\n }\n\n /**\n * This function checks if a schema needs to be added and if the root schemas don't match it removes the old root schema from the ajv instance and adds the new one.\n * @param rootSchema - The root schema used to provide $ref resolutions\n */\n handleSchemaUpdate(rootSchema: S): void {\n const rootSchemaId = rootSchema[ID_KEY] ?? ROOT_SCHEMA_PREFIX;\n // add the rootSchema ROOT_SCHEMA_PREFIX as id.\n // if schema validator instance doesn't exist, add it.\n // else if the root schemas don't match, we should remove and add the root schema so we don't have to remove and recompile the schema every run.\n if (this.ajv.getSchema(rootSchemaId) === undefined) {\n this.ajv.addSchema(rootSchema, rootSchemaId);\n } else if (!deepEquals(rootSchema, this.ajv.getSchema(rootSchemaId)?.schema)) {\n this.ajv.removeSchema(rootSchemaId);\n this.ajv.addSchema(rootSchema, rootSchemaId);\n }\n }\n\n /** Validates data against a schema, returning true if the data is valid, or\n * false otherwise. If the schema is invalid, then this function will return\n * false.\n *\n * @param schema - The schema against which to validate the form data\n * @param formData - The form data to validate\n * @param rootSchema - The root schema used to provide $ref resolutions\n */\n isValid(schema: S, formData: T | undefined, rootSchema: S) {\n try {\n this.handleSchemaUpdate(rootSchema);\n // then rewrite the schema ref's to point to the rootSchema\n // this accounts for the case where schema have references to models\n // that lives in the rootSchema but not in the schema in question.\n const schemaWithIdRefPrefix = withIdRefPrefix<S>(schema) as S;\n const schemaId = schemaWithIdRefPrefix[ID_KEY] ?? hashForSchema(schemaWithIdRefPrefix);\n let compiledValidator: ValidateFunction | undefined;\n compiledValidator = this.ajv.getSchema(schemaId);\n if (compiledValidator === undefined) {\n // Add schema by an explicit ID so it can be fetched later\n // Fall back to using compile if necessary\n // https://ajv.js.org/guide/managing-schemas.html#pre-adding-all-schemas-vs-adding-on-demand\n compiledValidator =\n this.ajv.addSchema(schemaWithIdRefPrefix, schemaId).getSchema(schemaId) ||\n this.ajv.compile(schemaWithIdRefPrefix);\n }\n const result = compiledValidator(formData);\n return result as boolean;\n } catch (e) {\n console.warn('Error encountered compiling schema:', e);\n return false;\n }\n }\n}\n", "import Ajv, { Options } from 'ajv';\nimport addFormats, { FormatsPluginOptions } from 'ajv-formats';\nimport isObject from 'lodash/isObject';\nimport { ADDITIONAL_PROPERTY_FLAG, RJSF_ADDITIONAL_PROPERTIES_FLAG } from '@rjsf/utils';\n\nimport { CustomValidatorOptionsType } from './types';\n\nexport const AJV_CONFIG: Options = {\n allErrors: true,\n multipleOfPrecision: 8,\n strict: false,\n verbose: true,\n discriminator: false, // TODO enable this in V6\n} as const;\nexport const COLOR_FORMAT_REGEX =\n /^(#?([0-9A-Fa-f]{3}){1,2}\\b|aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow|(rgb\\(\\s*\\b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\b\\s*,\\s*\\b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\b\\s*,\\s*\\b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\b\\s*\\))|(rgb\\(\\s*(\\d?\\d%|100%)+\\s*,\\s*(\\d?\\d%|100%)+\\s*,\\s*(\\d?\\d%|100%)+\\s*\\)))$/;\nexport const DATA_URL_FORMAT_REGEX = /^data:([a-z]+\\/[a-z0-9-+.]+)?;(?:name=(.*);)?base64,(.*)$/;\n\n/** Creates an Ajv version 8 implementation object with standard support for the 'color` and `data-url` custom formats.\n * If `additionalMetaSchemas` are provided then the Ajv instance is modified to add each of the meta schemas in the\n * list. If `customFormats` are provided then those additional formats are added to the list of supported formats. If\n * `ajvOptionsOverrides` are provided then they are spread on top of the default `AJV_CONFIG` options when constructing\n * the `Ajv` instance. With Ajv v8, the JSON Schema formats are not provided by default, but can be plugged in. By\n * default, all formats from the `ajv-formats` library are added. To disable this capability, set the `ajvFormatOptions`\n * parameter to `false`. Additionally, you can configure the `ajv-formats` by providing a custom set of\n * [format options](https://github.com/ajv-validator/ajv-formats) to the `ajvFormatOptions` parameter.\n *\n * @param [additionalMetaSchemas] - The list of additional meta schemas that the validator can access\n * @param [customFormats] - The set of additional custom formats that the validator will support\n * @param [ajvOptionsOverrides={}] - The set of validator config override options\n * @param [ajvFormatOptions] - The `ajv-format` options to use when adding formats to `ajv`; pass `false` to disable it\n * @param [AjvClass] - The `Ajv` class to use when creating the validator instance\n * @param [extenderFn] - A function to call to extend AJV, such as `ajvErrors()`\n */\nexport default function createAjvInstance(\n additionalMetaSchemas?: CustomValidatorOptionsType['additionalMetaSchemas'],\n customFormats?: CustomValidatorOptionsType['customFormats'],\n ajvOptionsOverrides: CustomValidatorOptionsType['ajvOptionsOverrides'] = {},\n ajvFormatOptions?: FormatsPluginOptions | false,\n AjvClass: typeof Ajv = Ajv,\n extenderFn?: CustomValidatorOptionsType['extenderFn'],\n) {\n let ajv = new AjvClass({ ...AJV_CONFIG, ...ajvOptionsOverrides });\n if (ajvFormatOptions) {\n addFormats(ajv, ajvFormatOptions);\n } else if (ajvFormatOptions !== false) {\n addFormats(ajv);\n }\n\n // add custom formats\n ajv.addFormat('data-url', DATA_URL_FORMAT_REGEX);\n ajv.addFormat('color', COLOR_FORMAT_REGEX);\n\n // Add RJSF-specific additional properties keywords so Ajv doesn't report errors if strict is enabled.\n ajv.addKeyword(ADDITIONAL_PROPERTY_FLAG);\n ajv.addKeyword(RJSF_ADDITIONAL_PROPERTIES_FLAG);\n\n // add more schemas to validate against\n if (Array.isArray(additionalMetaSchemas)) {\n ajv.addMetaSchema(additionalMetaSchemas);\n }\n\n // add more custom formats to validate against\n if (isObject(customFormats)) {\n Object.keys(customFormats).forEach((formatName) => {\n ajv.addFormat(formatName, customFormats[formatName]);\n });\n }\n if (extenderFn) {\n ajv = extenderFn(ajv);\n }\n\n return ajv;\n}\n", "import { ErrorObject } from 'ajv';\nimport get from 'lodash/get';\nimport {\n ANY_OF_KEY,\n createErrorHandler,\n CustomValidator,\n ErrorTransformer,\n FormContextType,\n getDefaultFormState,\n getUiOptions,\n ONE_OF_KEY,\n PROPERTIES_KEY,\n RJSFSchema,\n RJSFValidationError,\n StrictRJSFSchema,\n toErrorSchema,\n UiSchema,\n unwrapErrorHandler,\n validationDataMerge,\n ValidatorType,\n} from '@rjsf/utils';\n\nimport { SuppressDuplicateFilteringType } from './types';\n\nexport type RawValidationErrorsType<Result = any> = {\n errors?: Result[];\n validationError?: Error;\n};\n\n/** Filters duplicate errors from `anyOf`/`oneOf` schema paths according to the `suppressDuplicateFiltering` flag.\n *\n * @param errorList - The list of `RJSFValidationError`s to filter\n * @param [suppressDuplicateFiltering='none'] - Controls which duplicate filtering is suppressed:\n * - `'none'` (default): filters duplicates for both `anyOf` and `oneOf`\n * - `'all'`: returns `errorList` unmodified\n * - `'anyOf'`: suppresses filtering for `anyOf` errors; `oneOf` duplicates are still filtered\n * - `'oneOf'`: suppresses filtering for `oneOf` errors; `anyOf` duplicates are still filtered\n */\nexport function filterDuplicateErrors(\n errorList: RJSFValidationError[],\n suppressDuplicateFiltering: SuppressDuplicateFilteringType = 'none',\n): RJSFValidationError[] {\n if (suppressDuplicateFiltering === 'all') {\n return errorList;\n }\n return errorList.reduce((acc: RJSFValidationError[], err: RJSFValidationError) => {\n const { message, schemaPath } = err;\n // Compute the index only when filtering for that keyword is not suppressed.\n // 'all' is already handled above; within the reduce, only 'none', 'anyOf', and 'oneOf' are possible.\n const anyOfIndex = suppressDuplicateFiltering !== 'anyOf' ? schemaPath?.indexOf(`/${ANY_OF_KEY}/`) : undefined;\n const oneOfIndex = suppressDuplicateFiltering !== 'oneOf' ? schemaPath?.indexOf(`/${ONE_OF_KEY}/`) : undefined;\n let schemaPrefix: string | undefined;\n if (anyOfIndex && anyOfIndex >= 0) {\n schemaPrefix = schemaPath?.substring(0, anyOfIndex);\n } else if (oneOfIndex && oneOfIndex >= 0) {\n schemaPrefix = schemaPath?.substring(0, oneOfIndex);\n }\n // If there is a schemaPrefix, then search for a duplicate message with the same prefix, otherwise undefined\n const dup = schemaPrefix\n ? acc.find((e: RJSFValidationError) => e.message === message && e.schemaPath?.startsWith(schemaPrefix))\n : undefined;\n if (!dup) {\n acc.push(err);\n }\n return acc;\n }, [] as RJSFValidationError[]);\n}\n\n/** Transforming the error output from ajv to format used by @rjsf/utils.\n * At some point, components should be updated to support ajv.\n *\n * @param errors - The list of AJV errors to convert to `RJSFValidationErrors`\n * @param [uiSchema] - An optional uiSchema that is passed to `transformErrors` and `customValidate`\n * @param [suppressDuplicateFiltering] - Controls which duplicate filtering is suppressed; see `filterDuplicateErrors`\n */\nexport function transformRJSFValidationErrors<\n T = any,\n S extends StrictRJSFSchema = RJSFSchema,\n F extends FormContextType = any,\n>(\n errors: ErrorObject[] = [],\n uiSchema?: UiSchema<T, S, F>,\n suppressDuplicateFiltering?: SuppressDuplicateFilteringType,\n): RJSFValidationError[] {\n const errorList = errors.map((e: ErrorObject) => {\n const { instancePath, keyword, params, schemaPath, parentSchema, ...rest } = e;\n let { message = '' } = rest;\n let property = instancePath.replace(/\\//g, '.');\n let stack = `${property} ${message}`.trim();\n let uiTitle = '';\n const rawPropertyNames: string[] = [\n ...(params.deps?.split(', ') || []),\n params.missingProperty,\n params.property,\n ].filter((item) => item);\n\n if (rawPropertyNames.length > 0) {\n rawPropertyNames.forEach((currentProperty) => {\n const path = property ? `${property}.${currentProperty}` : currentProperty;\n let uiSchemaTitle = getUiOptions(get(uiSchema, `${path.replace(/^\\./, '')}`)).title;\n if (uiSchemaTitle === undefined) {\n // To retrieve a title from UI schema, construct a path to UI schema from `schemaPath` and `currentProperty`.\n // For example, when `#/properties/A/properties/B/required` and `C` are given, they are converted into `['A', 'B', 'C']`.\n const uiSchemaPath = schemaPath\n .replace(/\\/properties\\//g, '/')\n .split('/')\n .slice(1, -1)\n .concat([currentProperty]);\n uiSchemaTitle = getUiOptions(get(uiSchema, uiSchemaPath)).title;\n }\n if (uiSchemaTitle) {\n message = message.replace(`'${currentProperty}'`, `'${uiSchemaTitle}'`);\n uiTitle = uiSchemaTitle;\n } else {\n const parentSchemaTitle = get(parentSchema, [PROPERTIES_KEY, currentProperty, 'title']);\n if (parentSchemaTitle) {\n message = message.replace(`'${currentProperty}'`, `'${parentSchemaTitle}'`);\n uiTitle = parentSchemaTitle;\n }\n }\n });\n\n stack = message;\n } else {\n const uiSchemaTitle = getUiOptions<T, S, F>(get(uiSchema, `${property.replace(/^\\./, '')}`)).title;\n\n if (uiSchemaTitle) {\n stack = `'${uiSchemaTitle}' ${message}`.trim();\n uiTitle = uiSchemaTitle;\n } else {\n const parentSchemaTitle = parentSchema?.title;\n\n if (parentSchemaTitle) {\n stack = `'${parentSchemaTitle}' ${message}`.trim();\n uiTitle = parentSchemaTitle;\n }\n }\n }\n\n // If params.missingProperty is undefined, it is removed from rawPropertyNames by filter((item) => item).\n if ('missingProperty' in params) {\n property = property ? `${property}.${params.missingProperty}` : params.missingProperty;\n }\n\n // put data in expected format\n return {\n name: keyword,\n property,\n message,\n params, // specific to ajv\n stack,\n schemaPath,\n title: uiTitle,\n };\n });\n return filterDuplicateErrors(errorList, suppressDuplicateFiltering);\n}\n\n/** This function processes the `formData` with an optional user contributed `customValidate` function, which receives\n * the form data and a `errorHandler` function that will be used to add custom validation errors for each field. Also\n * supports a `transformErrors` function that will take the raw AJV validation errors, prior to custom validation and\n * transform them in what ever way it chooses.\n *\n * @param validator - The `ValidatorType` implementation used for the `getDefaultFormState()` call\n * @param rawErrors - The list of raw `ErrorObject`s to process\n * @param formData - The form data to validate\n * @param schema - The schema against which to validate the form data\n * @param [customValidate] - An optional function that is used to perform custom validation\n * @param [transformErrors] - An optional function that is used to transform errors after AJV validation\n * @param [uiSchema] - An optional uiSchema that is passed to `transformErrors` and `customValidate`\n * @param [suppressDuplicateFiltering] - Controls which duplicate filtering is suppressed; see `filterDuplicateErrors`\n */\nexport default function processRawValidationErrors<\n T = any,\n S extends StrictRJSFSchema = RJSFSchema,\n F extends FormContextType = any,\n>(\n validator: ValidatorType<T, S, F>,\n rawErrors: RawValidationErrorsType<ErrorObject>,\n formData: T | undefined,\n schema: S,\n customValidate?: CustomValidator<T, S, F>,\n transformErrors?: ErrorTransformer<T, S, F>,\n uiSchema?: UiSchema<T, S, F>,\n suppressDuplicateFiltering?: SuppressDuplicateFilteringType,\n) {\n const { validationError: invalidSchemaError } = rawErrors;\n let errors = transformRJSFValidationErrors<T, S, F>(rawErrors.errors, uiSchema, suppressDuplicateFiltering);\n\n if (invalidSchemaError) {\n errors = [...errors, { stack: invalidSchemaError!.message }];\n }\n if (typeof transformErrors === 'function') {\n errors = transformErrors(errors, uiSchema);\n }\n\n let errorSchema = toErrorSchema<T>(errors);\n\n if (invalidSchemaError) {\n errorSchema = {\n ...errorSchema,\n $schema: {\n __errors: [invalidSchemaError!.message],\n },\n };\n }\n\n if (typeof customValidate !== 'function') {\n return { errors, errorSchema };\n }\n\n // Include form data with undefined values, which is required for custom validation.\n const newFormData = getDefaultFormState<T, S, F>(validator, schema, formData, schema, true) as T;\n\n const errorHandler = customValidate(newFormData, createErrorHandler<T>(newFormData), uiSchema, errorSchema);\n const userErrorSchema = unwrapErrorHandler<T>(errorHandler);\n return validationDataMerge<T>({ errors, errorSchema }, userErrorSchema);\n}\n", "import { FormContextType, RJSFSchema, StrictRJSFSchema } from '@rjsf/utils';\n\nimport { CustomValidatorOptionsType, Localizer } from './types';\nimport AJV8Validator from './validator';\n\n/** Creates and returns a customized implementation of the `ValidatorType` with the given customization `options` if\n * provided. If a `localizer` is provided, it is used to translate the messages generated by the underlying AJV\n * validation.\n *\n * @param [options={}] - The `CustomValidatorOptionsType` options that are used to create the `ValidatorType` instance\n * @param [localizer] - If provided, is used to localize a list of Ajv `ErrorObject`s\n * @returns - The custom validator implementation resulting from the set of parameters provided\n */\nexport default function customizeValidator<\n T = any,\n S extends StrictRJSFSchema = RJSFSchema,\n F extends FormContextType = any,\n>(options: CustomValidatorOptionsType = {}, localizer?: Localizer) {\n return new AJV8Validator<T, S, F>(options, localizer);\n}\n", "import { ErrorObject } from 'ajv';\nimport get from 'lodash/get';\nimport {\n CustomValidator,\n deepEquals,\n ErrorTransformer,\n FormContextType,\n hashForSchema,\n ID_KEY,\n JUNK_OPTION_ID,\n retrieveSchema,\n RJSFSchema,\n StrictRJSFSchema,\n UiSchema,\n ValidationData,\n ValidatorType,\n} from '@rjsf/utils';\n\nimport { CompiledValidateFunction, Localizer, SuppressDuplicateFilteringType, ValidatorFunctions } from './types';\nimport processRawValidationErrors, { RawValidationErrorsType } from './processRawValidationErrors';\n\n/** `ValidatorType` implementation that uses an AJV 8 precompiled validator as created by the\n * `compileSchemaValidators()` function provided by the `@rjsf/validator-ajv8` library.\n */\nexport default class AJV8PrecompiledValidator<\n T = any,\n S extends StrictRJSFSchema = RJSFSchema,\n F extends FormContextType = any,\n> implements ValidatorType<T, S, F> {\n /** The root schema object used to construct this validator\n *\n * @private\n */\n readonly rootSchema: S;\n\n /** The `ValidatorFunctions` map used to construct this validator\n *\n * @private\n */\n readonly validateFns: ValidatorFunctions;\n\n /** The main validator function associated with the base schema in the `precompiledValidator`\n *\n * @private\n */\n readonly mainValidator: CompiledValidateFunction;\n\n /** The Localizer function to use for localizing Ajv errors\n *\n * @private\n */\n readonly localizer?: Localizer;\n\n /** Controls which duplicate error filtering is suppressed; see `filterDuplicateErrors`\n *\n * @private\n */\n readonly suppressDuplicateFiltering?: SuppressDuplicateFilteringType;\n\n /** Constructs an `AJV8PrecompiledValidator` instance using the `validateFns` and `rootSchema`\n *\n * @param validateFns - The map of the validation functions that are generated by the `schemaCompile()` function\n * @param rootSchema - The root schema that was used with the `compileSchema()` function\n * @param [localizer] - If provided, is used to localize a list of Ajv `ErrorObject`s\n * @param [suppressDuplicateFiltering] - Controls which duplicate filtering is suppressed; see `filterDuplicateErrors`\n * @throws - Error when the base schema of the precompiled validator does not have a matching validator function\n */\n constructor(\n validateFns: ValidatorFunctions,\n rootSchema: S,\n localizer?: Localizer,\n suppressDuplicateFiltering?: SuppressDuplicateFilteringType,\n ) {\n this.rootSchema = rootSchema;\n this.validateFns = validateFns;\n this.localizer = localizer;\n this.suppressDuplicateFiltering = suppressDuplicateFiltering;\n this.mainValidator = this.getValidator(rootSchema);\n }\n\n /** Returns the precompiled validator associated with the given `schema` from the map of precompiled validator\n * functions.\n *\n * @param schema - The schema for which a precompiled validator function is desired\n * @returns - The precompiled validator function associated with this schema\n */\n getValidator(schema: S) {\n const key = get(schema, ID_KEY) || hashForSchema(schema);\n const validator = this.validateFns[key];\n if (!validator) {\n throw new Error(`No precompiled validator function was found for the given schema for \"${key}\"`);\n }\n return validator;\n }\n\n /** Ensures that the validator is using the same schema as the root schema used to construct the precompiled\n * validator. It first compares the given `schema` against the root schema and if they aren't the same, then it\n * checks against the resolved root schema, on the chance that a resolved version of the root schema was passed in\n * instead of the raw root schema.\n *\n * @param schema - The schema against which to validate the form data\n * @param [formData] - The form data to validate if any\n */\n ensureSameRootSchema(schema: S, formData?: T) {\n if (!deepEquals(schema, this.rootSchema)) {\n // Resolve the root schema with the passed in form data since that may affect the resolution\n const resolvedRootSchema = retrieveSchema(this, this.rootSchema, this.rootSchema, formData);\n if (!deepEquals(schema, resolvedRootSchema)) {\n throw new Error(\n 'The schema associated with the precompiled validator differs from the rootSchema provided for validation',\n );\n }\n }\n return true;\n }\n\n /** Runs the pure validation of the `schema` and `formData` without any of the RJSF functionality. Provided for use\n * by the playground. Returns the `errors` from the validation\n *\n * @param schema - The schema against which to validate the form data\n * @param [formData] - The form data to validate, if any\n * @throws - Error when the schema provided does not match the base schema of the precompiled validator\n */\n rawValidation<Result = any>(schema: S, formData?: T): RawValidationErrorsType<Result> {\n this.ensureSameRootSchema(schema, formData);\n this.mainValidator(formData);\n\n if (typeof this.localizer === 'function') {\n this.localizer(this.mainValidator.errors);\n }\n const errors = this.mainValidator.errors || undefined;\n\n // Clear errors to prevent persistent errors, see #1104\n this.mainValidator.errors = null;\n\n return { errors: errors as unknown as Result[] };\n }\n\n /** This function processes the `formData` with an optional user contributed `customValidate` function, which receives\n * the form data and a `errorHandler` function that will be used to add custom validation errors for each field. Also\n * supports a `transformErrors` function that will take the raw AJV validation errors, prior to custom validation and\n * transform them in what ever way it chooses.\n *\n * @param formData - The form data to validate\n * @param schema - The schema against which to validate the form data\n * @param [customValidate] - An optional function that is used to perform custom validation\n * @param [transformErrors] - An optional function that is used to transform errors after AJV validation\n * @param [uiSchema] - An optional uiSchema that is passed to `transformErrors` and `customValidate`\n */\n validateFormData(\n formData: T | undefined,\n schema: S,\n customValidate?: CustomValidator<T, S, F>,\n transformErrors?: ErrorTransformer<T, S, F>,\n uiSchema?: UiSchema<T, S, F>,\n ): ValidationData<T> {\n const rawErrors = this.rawValidation<ErrorObject>(schema, formData);\n return processRawValidationErrors(\n this,\n rawErrors,\n formData,\n schema,\n customValidate,\n transformErrors,\n uiSchema,\n this.suppressDuplicateFiltering,\n );\n }\n\n /** Validates data against a schema, returning true if the data is valid, or false otherwise. If the schema is\n * invalid, then this function will return false.\n *\n * @param schema - The schema against which to validate the form data\n * @param formData - The form data to validate\n * @param rootSchema - The root schema used to provide $ref resolutions\n * @returns - true if the formData validates against the schema, false otherwise\n * @throws - Error when the schema provided does not match the base schema of the precompiled validator OR if there\n * isn't a precompiled validator function associated with the schema\n */\n isValid(schema: S, formData: T | undefined, rootSchema: S) {\n this.ensureSameRootSchema(rootSchema, formData);\n if (get(schema, ID_KEY) === JUNK_OPTION_ID) {\n return false;\n }\n const validator = this.getValidator(schema);\n return validator(formData);\n }\n}\n", "import { FormContextType, RJSFSchema, StrictRJSFSchema, ValidatorType } from '@rjsf/utils';\n\nimport { Localizer, SuppressDuplicateFilteringType, ValidatorFunctions } from './types';\nimport AJV8PrecompiledValidator from './precompiledValidator';\n\n/** Creates and returns a `ValidatorType` interface that is implemented with a precompiled validator. If a `localizer`\n * is provided, it is used to translate the messages generated by the underlying AJV validation.\n *\n * NOTE: The `validateFns` parameter is an object obtained by importing from a precompiled validation file created via\n * the `compileSchemaValidators()` function.\n *\n * @param validateFns - The map of the validation functions that are created by the `compileSchemaValidators()` function\n * @param rootSchema - The root schema that was used with the `compileSchemaValidators()` function\n * @param [localizer] - If provided, is used to localize a list of Ajv `ErrorObject`s\n * @param [suppressDuplicateFiltering] - Controls which duplicate filtering is suppressed; see `filterDuplicateErrors`\n * @returns - The precompiled validator implementation resulting from the set of parameters provided\n */\nexport default function createPrecompiledValidator<\n T = any,\n S extends StrictRJSFSchema = RJSFSchema,\n F extends FormContextType = any,\n>(\n validateFns: ValidatorFunctions,\n rootSchema: S,\n localizer?: Localizer,\n suppressDuplicateFiltering?: SuppressDuplicateFilteringType,\n): ValidatorType<T, S, F> {\n return new AJV8PrecompiledValidator<T, S, F>(validateFns, rootSchema, localizer, suppressDuplicateFiltering);\n}\n", "import customizeValidator from './customizeValidator';\nimport createPrecompiledValidator from './createPrecompiledValidator';\n\nexport { customizeValidator, createPrecompiledValidator };\nexport * from './types';\n\nexport default customizeValidator();\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["get", "deepEquals", "hashForSchema", "ID_KEY", "get", "ID_KEY", "hashForSchema", "deepEquals"]
|
|
7
7
|
}
|
|
@@ -39,7 +39,28 @@
|
|
|
39
39
|
}
|
|
40
40
|
return ajv;
|
|
41
41
|
}
|
|
42
|
-
function
|
|
42
|
+
function filterDuplicateErrors(errorList, suppressDuplicateFiltering = "none") {
|
|
43
|
+
if (suppressDuplicateFiltering === "all") {
|
|
44
|
+
return errorList;
|
|
45
|
+
}
|
|
46
|
+
return errorList.reduce((acc, err) => {
|
|
47
|
+
const { message, schemaPath } = err;
|
|
48
|
+
const anyOfIndex = suppressDuplicateFiltering !== "anyOf" ? schemaPath?.indexOf(`/${utils.ANY_OF_KEY}/`) : void 0;
|
|
49
|
+
const oneOfIndex = suppressDuplicateFiltering !== "oneOf" ? schemaPath?.indexOf(`/${utils.ONE_OF_KEY}/`) : void 0;
|
|
50
|
+
let schemaPrefix;
|
|
51
|
+
if (anyOfIndex && anyOfIndex >= 0) {
|
|
52
|
+
schemaPrefix = schemaPath?.substring(0, anyOfIndex);
|
|
53
|
+
} else if (oneOfIndex && oneOfIndex >= 0) {
|
|
54
|
+
schemaPrefix = schemaPath?.substring(0, oneOfIndex);
|
|
55
|
+
}
|
|
56
|
+
const dup = schemaPrefix ? acc.find((e) => e.message === message && e.schemaPath?.startsWith(schemaPrefix)) : void 0;
|
|
57
|
+
if (!dup) {
|
|
58
|
+
acc.push(err);
|
|
59
|
+
}
|
|
60
|
+
return acc;
|
|
61
|
+
}, []);
|
|
62
|
+
}
|
|
63
|
+
function transformRJSFValidationErrors(errors = [], uiSchema, suppressDuplicateFiltering) {
|
|
43
64
|
const errorList = errors.map((e) => {
|
|
44
65
|
const { instancePath, keyword, params, schemaPath, parentSchema, ...rest } = e;
|
|
45
66
|
let { message = "" } = rest;
|
|
@@ -98,26 +119,11 @@
|
|
|
98
119
|
title: uiTitle
|
|
99
120
|
};
|
|
100
121
|
});
|
|
101
|
-
return errorList
|
|
102
|
-
const { message, schemaPath } = err;
|
|
103
|
-
const anyOfIndex = schemaPath?.indexOf(`/${utils.ANY_OF_KEY}/`);
|
|
104
|
-
const oneOfIndex = schemaPath?.indexOf(`/${utils.ONE_OF_KEY}/`);
|
|
105
|
-
let schemaPrefix;
|
|
106
|
-
if (anyOfIndex && anyOfIndex >= 0) {
|
|
107
|
-
schemaPrefix = schemaPath?.substring(0, anyOfIndex);
|
|
108
|
-
} else if (oneOfIndex && oneOfIndex >= 0) {
|
|
109
|
-
schemaPrefix = schemaPath?.substring(0, oneOfIndex);
|
|
110
|
-
}
|
|
111
|
-
const dup = schemaPrefix ? acc.find((e) => e.message === message && e.schemaPath?.startsWith(schemaPrefix)) : void 0;
|
|
112
|
-
if (!dup) {
|
|
113
|
-
acc.push(err);
|
|
114
|
-
}
|
|
115
|
-
return acc;
|
|
116
|
-
}, []);
|
|
122
|
+
return filterDuplicateErrors(errorList, suppressDuplicateFiltering);
|
|
117
123
|
}
|
|
118
|
-
function processRawValidationErrors(validator, rawErrors, formData, schema, customValidate, transformErrors, uiSchema) {
|
|
124
|
+
function processRawValidationErrors(validator, rawErrors, formData, schema, customValidate, transformErrors, uiSchema, suppressDuplicateFiltering) {
|
|
119
125
|
const { validationError: invalidSchemaError } = rawErrors;
|
|
120
|
-
let errors = transformRJSFValidationErrors(rawErrors.errors, uiSchema);
|
|
126
|
+
let errors = transformRJSFValidationErrors(rawErrors.errors, uiSchema, suppressDuplicateFiltering);
|
|
121
127
|
if (invalidSchemaError) {
|
|
122
128
|
errors = [...errors, { stack: invalidSchemaError.message }];
|
|
123
129
|
}
|
|
@@ -150,7 +156,15 @@
|
|
|
150
156
|
* @param [localizer] - If provided, is used to localize a list of Ajv `ErrorObject`s
|
|
151
157
|
*/
|
|
152
158
|
constructor(options, localizer) {
|
|
153
|
-
const {
|
|
159
|
+
const {
|
|
160
|
+
additionalMetaSchemas,
|
|
161
|
+
customFormats,
|
|
162
|
+
ajvOptionsOverrides,
|
|
163
|
+
ajvFormatOptions,
|
|
164
|
+
AjvClass,
|
|
165
|
+
extenderFn,
|
|
166
|
+
suppressDuplicateFiltering
|
|
167
|
+
} = options;
|
|
154
168
|
this.ajv = createAjvInstance(
|
|
155
169
|
additionalMetaSchemas,
|
|
156
170
|
customFormats,
|
|
@@ -160,6 +174,7 @@
|
|
|
160
174
|
extenderFn
|
|
161
175
|
);
|
|
162
176
|
this.localizer = localizer;
|
|
177
|
+
this.suppressDuplicateFiltering = suppressDuplicateFiltering;
|
|
163
178
|
}
|
|
164
179
|
/** Resets the internal AJV validator to clear schemas from it. Can be helpful for resetting the validator for tests.
|
|
165
180
|
*/
|
|
@@ -232,7 +247,16 @@
|
|
|
232
247
|
*/
|
|
233
248
|
validateFormData(formData, schema, customValidate, transformErrors, uiSchema) {
|
|
234
249
|
const rawErrors = this.rawValidation(schema, formData);
|
|
235
|
-
return processRawValidationErrors(
|
|
250
|
+
return processRawValidationErrors(
|
|
251
|
+
this,
|
|
252
|
+
rawErrors,
|
|
253
|
+
formData,
|
|
254
|
+
schema,
|
|
255
|
+
customValidate,
|
|
256
|
+
transformErrors,
|
|
257
|
+
uiSchema,
|
|
258
|
+
this.suppressDuplicateFiltering
|
|
259
|
+
);
|
|
236
260
|
}
|
|
237
261
|
/**
|
|
238
262
|
* This function checks if a schema needs to be added and if the root schemas don't match it removes the old root schema from the ajv instance and adds the new one.
|
|
@@ -284,12 +308,14 @@
|
|
|
284
308
|
* @param validateFns - The map of the validation functions that are generated by the `schemaCompile()` function
|
|
285
309
|
* @param rootSchema - The root schema that was used with the `compileSchema()` function
|
|
286
310
|
* @param [localizer] - If provided, is used to localize a list of Ajv `ErrorObject`s
|
|
311
|
+
* @param [suppressDuplicateFiltering] - Controls which duplicate filtering is suppressed; see `filterDuplicateErrors`
|
|
287
312
|
* @throws - Error when the base schema of the precompiled validator does not have a matching validator function
|
|
288
313
|
*/
|
|
289
|
-
constructor(validateFns, rootSchema, localizer) {
|
|
314
|
+
constructor(validateFns, rootSchema, localizer, suppressDuplicateFiltering) {
|
|
290
315
|
this.rootSchema = rootSchema;
|
|
291
316
|
this.validateFns = validateFns;
|
|
292
317
|
this.localizer = localizer;
|
|
318
|
+
this.suppressDuplicateFiltering = suppressDuplicateFiltering;
|
|
293
319
|
this.mainValidator = this.getValidator(rootSchema);
|
|
294
320
|
}
|
|
295
321
|
/** Returns the precompiled validator associated with the given `schema` from the map of precompiled validator
|
|
@@ -355,7 +381,16 @@
|
|
|
355
381
|
*/
|
|
356
382
|
validateFormData(formData, schema, customValidate, transformErrors, uiSchema) {
|
|
357
383
|
const rawErrors = this.rawValidation(schema, formData);
|
|
358
|
-
return processRawValidationErrors(
|
|
384
|
+
return processRawValidationErrors(
|
|
385
|
+
this,
|
|
386
|
+
rawErrors,
|
|
387
|
+
formData,
|
|
388
|
+
schema,
|
|
389
|
+
customValidate,
|
|
390
|
+
transformErrors,
|
|
391
|
+
uiSchema,
|
|
392
|
+
this.suppressDuplicateFiltering
|
|
393
|
+
);
|
|
359
394
|
}
|
|
360
395
|
/** Validates data against a schema, returning true if the data is valid, or false otherwise. If the schema is
|
|
361
396
|
* invalid, then this function will return false.
|
|
@@ -378,8 +413,8 @@
|
|
|
378
413
|
};
|
|
379
414
|
|
|
380
415
|
// src/createPrecompiledValidator.ts
|
|
381
|
-
function createPrecompiledValidator(validateFns, rootSchema, localizer) {
|
|
382
|
-
return new AJV8PrecompiledValidator(validateFns, rootSchema, localizer);
|
|
416
|
+
function createPrecompiledValidator(validateFns, rootSchema, localizer, suppressDuplicateFiltering) {
|
|
417
|
+
return new AJV8PrecompiledValidator(validateFns, rootSchema, localizer, suppressDuplicateFiltering);
|
|
383
418
|
}
|
|
384
419
|
|
|
385
420
|
// src/index.ts
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { FormContextType, RJSFSchema, StrictRJSFSchema, ValidatorType } from '@rjsf/utils';
|
|
2
|
-
import { Localizer, ValidatorFunctions } from './types.js';
|
|
2
|
+
import { Localizer, SuppressDuplicateFilteringType, ValidatorFunctions } from './types.js';
|
|
3
3
|
/** Creates and returns a `ValidatorType` interface that is implemented with a precompiled validator. If a `localizer`
|
|
4
4
|
* is provided, it is used to translate the messages generated by the underlying AJV validation.
|
|
5
5
|
*
|
|
@@ -9,6 +9,7 @@ import { Localizer, ValidatorFunctions } from './types.js';
|
|
|
9
9
|
* @param validateFns - The map of the validation functions that are created by the `compileSchemaValidators()` function
|
|
10
10
|
* @param rootSchema - The root schema that was used with the `compileSchemaValidators()` function
|
|
11
11
|
* @param [localizer] - If provided, is used to localize a list of Ajv `ErrorObject`s
|
|
12
|
+
* @param [suppressDuplicateFiltering] - Controls which duplicate filtering is suppressed; see `filterDuplicateErrors`
|
|
12
13
|
* @returns - The precompiled validator implementation resulting from the set of parameters provided
|
|
13
14
|
*/
|
|
14
|
-
export default function createPrecompiledValidator<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>(validateFns: ValidatorFunctions, rootSchema: S, localizer?: Localizer): ValidatorType<T, S, F>;
|
|
15
|
+
export default function createPrecompiledValidator<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>(validateFns: ValidatorFunctions, rootSchema: S, localizer?: Localizer, suppressDuplicateFiltering?: SuppressDuplicateFilteringType): ValidatorType<T, S, F>;
|
|
@@ -8,9 +8,10 @@ import AJV8PrecompiledValidator from './precompiledValidator.js';
|
|
|
8
8
|
* @param validateFns - The map of the validation functions that are created by the `compileSchemaValidators()` function
|
|
9
9
|
* @param rootSchema - The root schema that was used with the `compileSchemaValidators()` function
|
|
10
10
|
* @param [localizer] - If provided, is used to localize a list of Ajv `ErrorObject`s
|
|
11
|
+
* @param [suppressDuplicateFiltering] - Controls which duplicate filtering is suppressed; see `filterDuplicateErrors`
|
|
11
12
|
* @returns - The precompiled validator implementation resulting from the set of parameters provided
|
|
12
13
|
*/
|
|
13
|
-
export default function createPrecompiledValidator(validateFns, rootSchema, localizer) {
|
|
14
|
-
return new AJV8PrecompiledValidator(validateFns, rootSchema, localizer);
|
|
14
|
+
export default function createPrecompiledValidator(validateFns, rootSchema, localizer, suppressDuplicateFiltering) {
|
|
15
|
+
return new AJV8PrecompiledValidator(validateFns, rootSchema, localizer, suppressDuplicateFiltering);
|
|
15
16
|
}
|
|
16
17
|
//# sourceMappingURL=createPrecompiledValidator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createPrecompiledValidator.js","sourceRoot":"","sources":["../src/createPrecompiledValidator.ts"],"names":[],"mappings":"AAGA,OAAO,wBAAwB,MAAM,wBAAwB,CAAC;AAE9D
|
|
1
|
+
{"version":3,"file":"createPrecompiledValidator.js","sourceRoot":"","sources":["../src/createPrecompiledValidator.ts"],"names":[],"mappings":"AAGA,OAAO,wBAAwB,MAAM,wBAAwB,CAAC;AAE9D;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,OAAO,UAAU,0BAA0B,CAKhD,WAA+B,EAC/B,UAAa,EACb,SAAqB,EACrB,0BAA2D;IAE3D,OAAO,IAAI,wBAAwB,CAAU,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,0BAA0B,CAAC,CAAC;AAC/G,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CustomValidator, ErrorTransformer, FormContextType, RJSFSchema, StrictRJSFSchema, UiSchema, ValidationData, ValidatorType } from '@rjsf/utils';
|
|
2
|
-
import { CompiledValidateFunction, Localizer, ValidatorFunctions } from './types.js';
|
|
2
|
+
import { CompiledValidateFunction, Localizer, SuppressDuplicateFilteringType, ValidatorFunctions } from './types.js';
|
|
3
3
|
import { RawValidationErrorsType } from './processRawValidationErrors.js';
|
|
4
4
|
/** `ValidatorType` implementation that uses an AJV 8 precompiled validator as created by the
|
|
5
5
|
* `compileSchemaValidators()` function provided by the `@rjsf/validator-ajv8` library.
|
|
@@ -25,14 +25,20 @@ export default class AJV8PrecompiledValidator<T = any, S extends StrictRJSFSchem
|
|
|
25
25
|
* @private
|
|
26
26
|
*/
|
|
27
27
|
readonly localizer?: Localizer;
|
|
28
|
+
/** Controls which duplicate error filtering is suppressed; see `filterDuplicateErrors`
|
|
29
|
+
*
|
|
30
|
+
* @private
|
|
31
|
+
*/
|
|
32
|
+
readonly suppressDuplicateFiltering?: SuppressDuplicateFilteringType;
|
|
28
33
|
/** Constructs an `AJV8PrecompiledValidator` instance using the `validateFns` and `rootSchema`
|
|
29
34
|
*
|
|
30
35
|
* @param validateFns - The map of the validation functions that are generated by the `schemaCompile()` function
|
|
31
36
|
* @param rootSchema - The root schema that was used with the `compileSchema()` function
|
|
32
37
|
* @param [localizer] - If provided, is used to localize a list of Ajv `ErrorObject`s
|
|
38
|
+
* @param [suppressDuplicateFiltering] - Controls which duplicate filtering is suppressed; see `filterDuplicateErrors`
|
|
33
39
|
* @throws - Error when the base schema of the precompiled validator does not have a matching validator function
|
|
34
40
|
*/
|
|
35
|
-
constructor(validateFns: ValidatorFunctions, rootSchema: S, localizer?: Localizer);
|
|
41
|
+
constructor(validateFns: ValidatorFunctions, rootSchema: S, localizer?: Localizer, suppressDuplicateFiltering?: SuppressDuplicateFilteringType);
|
|
36
42
|
/** Returns the precompiled validator associated with the given `schema` from the map of precompiled validator
|
|
37
43
|
* functions.
|
|
38
44
|
*
|
|
@@ -10,12 +10,14 @@ export default class AJV8PrecompiledValidator {
|
|
|
10
10
|
* @param validateFns - The map of the validation functions that are generated by the `schemaCompile()` function
|
|
11
11
|
* @param rootSchema - The root schema that was used with the `compileSchema()` function
|
|
12
12
|
* @param [localizer] - If provided, is used to localize a list of Ajv `ErrorObject`s
|
|
13
|
+
* @param [suppressDuplicateFiltering] - Controls which duplicate filtering is suppressed; see `filterDuplicateErrors`
|
|
13
14
|
* @throws - Error when the base schema of the precompiled validator does not have a matching validator function
|
|
14
15
|
*/
|
|
15
|
-
constructor(validateFns, rootSchema, localizer) {
|
|
16
|
+
constructor(validateFns, rootSchema, localizer, suppressDuplicateFiltering) {
|
|
16
17
|
this.rootSchema = rootSchema;
|
|
17
18
|
this.validateFns = validateFns;
|
|
18
19
|
this.localizer = localizer;
|
|
20
|
+
this.suppressDuplicateFiltering = suppressDuplicateFiltering;
|
|
19
21
|
this.mainValidator = this.getValidator(rootSchema);
|
|
20
22
|
}
|
|
21
23
|
/** Returns the precompiled validator associated with the given `schema` from the map of precompiled validator
|
|
@@ -81,7 +83,7 @@ export default class AJV8PrecompiledValidator {
|
|
|
81
83
|
*/
|
|
82
84
|
validateFormData(formData, schema, customValidate, transformErrors, uiSchema) {
|
|
83
85
|
const rawErrors = this.rawValidation(schema, formData);
|
|
84
|
-
return processRawValidationErrors(this, rawErrors, formData, schema, customValidate, transformErrors, uiSchema);
|
|
86
|
+
return processRawValidationErrors(this, rawErrors, formData, schema, customValidate, transformErrors, uiSchema, this.suppressDuplicateFiltering);
|
|
85
87
|
}
|
|
86
88
|
/** Validates data against a schema, returning true if the data is valid, or false otherwise. If the schema is
|
|
87
89
|
* invalid, then this function will return false.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"precompiledValidator.js","sourceRoot":"","sources":["../src/precompiledValidator.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,YAAY,CAAC;AAC7B,OAAO,EAEL,UAAU,EAGV,aAAa,EACb,MAAM,EACN,cAAc,EACd,cAAc,GAMf,MAAM,aAAa,CAAC;AAGrB,OAAO,0BAAuD,MAAM,8BAA8B,CAAC;AAEnG;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,wBAAwB;
|
|
1
|
+
{"version":3,"file":"precompiledValidator.js","sourceRoot":"","sources":["../src/precompiledValidator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,28 @@
|
|
|
1
1
|
import { ErrorObject } from 'ajv';
|
|
2
2
|
import { CustomValidator, ErrorTransformer, FormContextType, RJSFSchema, RJSFValidationError, StrictRJSFSchema, UiSchema, ValidatorType } from '@rjsf/utils';
|
|
3
|
+
import { SuppressDuplicateFilteringType } from './types.js';
|
|
3
4
|
export type RawValidationErrorsType<Result = any> = {
|
|
4
5
|
errors?: Result[];
|
|
5
6
|
validationError?: Error;
|
|
6
7
|
};
|
|
8
|
+
/** Filters duplicate errors from `anyOf`/`oneOf` schema paths according to the `suppressDuplicateFiltering` flag.
|
|
9
|
+
*
|
|
10
|
+
* @param errorList - The list of `RJSFValidationError`s to filter
|
|
11
|
+
* @param [suppressDuplicateFiltering='none'] - Controls which duplicate filtering is suppressed:
|
|
12
|
+
* - `'none'` (default): filters duplicates for both `anyOf` and `oneOf`
|
|
13
|
+
* - `'all'`: returns `errorList` unmodified
|
|
14
|
+
* - `'anyOf'`: suppresses filtering for `anyOf` errors; `oneOf` duplicates are still filtered
|
|
15
|
+
* - `'oneOf'`: suppresses filtering for `oneOf` errors; `anyOf` duplicates are still filtered
|
|
16
|
+
*/
|
|
17
|
+
export declare function filterDuplicateErrors(errorList: RJSFValidationError[], suppressDuplicateFiltering?: SuppressDuplicateFilteringType): RJSFValidationError[];
|
|
7
18
|
/** Transforming the error output from ajv to format used by @rjsf/utils.
|
|
8
19
|
* At some point, components should be updated to support ajv.
|
|
9
20
|
*
|
|
10
21
|
* @param errors - The list of AJV errors to convert to `RJSFValidationErrors`
|
|
11
22
|
* @param [uiSchema] - An optional uiSchema that is passed to `transformErrors` and `customValidate`
|
|
23
|
+
* @param [suppressDuplicateFiltering] - Controls which duplicate filtering is suppressed; see `filterDuplicateErrors`
|
|
12
24
|
*/
|
|
13
|
-
export declare function transformRJSFValidationErrors<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>(errors?: ErrorObject[], uiSchema?: UiSchema<T, S, F
|
|
25
|
+
export declare function transformRJSFValidationErrors<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>(errors?: ErrorObject[], uiSchema?: UiSchema<T, S, F>, suppressDuplicateFiltering?: SuppressDuplicateFilteringType): RJSFValidationError[];
|
|
14
26
|
/** This function processes the `formData` with an optional user contributed `customValidate` function, which receives
|
|
15
27
|
* the form data and a `errorHandler` function that will be used to add custom validation errors for each field. Also
|
|
16
28
|
* supports a `transformErrors` function that will take the raw AJV validation errors, prior to custom validation and
|
|
@@ -23,8 +35,9 @@ export declare function transformRJSFValidationErrors<T = any, S extends StrictR
|
|
|
23
35
|
* @param [customValidate] - An optional function that is used to perform custom validation
|
|
24
36
|
* @param [transformErrors] - An optional function that is used to transform errors after AJV validation
|
|
25
37
|
* @param [uiSchema] - An optional uiSchema that is passed to `transformErrors` and `customValidate`
|
|
38
|
+
* @param [suppressDuplicateFiltering] - Controls which duplicate filtering is suppressed; see `filterDuplicateErrors`
|
|
26
39
|
*/
|
|
27
|
-
export default function processRawValidationErrors<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>(validator: ValidatorType<T, S, F>, rawErrors: RawValidationErrorsType<ErrorObject>, formData: T | undefined, schema: S, customValidate?: CustomValidator<T, S, F>, transformErrors?: ErrorTransformer<T, S, F>, uiSchema?: UiSchema<T, S, F
|
|
40
|
+
export default function processRawValidationErrors<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>(validator: ValidatorType<T, S, F>, rawErrors: RawValidationErrorsType<ErrorObject>, formData: T | undefined, schema: S, customValidate?: CustomValidator<T, S, F>, transformErrors?: ErrorTransformer<T, S, F>, uiSchema?: UiSchema<T, S, F>, suppressDuplicateFiltering?: SuppressDuplicateFilteringType): {
|
|
28
41
|
errors: RJSFValidationError[];
|
|
29
42
|
errorSchema: import("@rjsf/utils").ErrorSchema<T>;
|
|
30
43
|
};
|
|
@@ -1,12 +1,49 @@
|
|
|
1
1
|
import get from 'lodash-es/get.js';
|
|
2
2
|
import { ANY_OF_KEY, createErrorHandler, getDefaultFormState, getUiOptions, ONE_OF_KEY, PROPERTIES_KEY, toErrorSchema, unwrapErrorHandler, validationDataMerge, } from '@rjsf/utils';
|
|
3
|
+
/** Filters duplicate errors from `anyOf`/`oneOf` schema paths according to the `suppressDuplicateFiltering` flag.
|
|
4
|
+
*
|
|
5
|
+
* @param errorList - The list of `RJSFValidationError`s to filter
|
|
6
|
+
* @param [suppressDuplicateFiltering='none'] - Controls which duplicate filtering is suppressed:
|
|
7
|
+
* - `'none'` (default): filters duplicates for both `anyOf` and `oneOf`
|
|
8
|
+
* - `'all'`: returns `errorList` unmodified
|
|
9
|
+
* - `'anyOf'`: suppresses filtering for `anyOf` errors; `oneOf` duplicates are still filtered
|
|
10
|
+
* - `'oneOf'`: suppresses filtering for `oneOf` errors; `anyOf` duplicates are still filtered
|
|
11
|
+
*/
|
|
12
|
+
export function filterDuplicateErrors(errorList, suppressDuplicateFiltering = 'none') {
|
|
13
|
+
if (suppressDuplicateFiltering === 'all') {
|
|
14
|
+
return errorList;
|
|
15
|
+
}
|
|
16
|
+
return errorList.reduce((acc, err) => {
|
|
17
|
+
const { message, schemaPath } = err;
|
|
18
|
+
// Compute the index only when filtering for that keyword is not suppressed.
|
|
19
|
+
// 'all' is already handled above; within the reduce, only 'none', 'anyOf', and 'oneOf' are possible.
|
|
20
|
+
const anyOfIndex = suppressDuplicateFiltering !== 'anyOf' ? schemaPath === null || schemaPath === void 0 ? void 0 : schemaPath.indexOf(`/${ANY_OF_KEY}/`) : undefined;
|
|
21
|
+
const oneOfIndex = suppressDuplicateFiltering !== 'oneOf' ? schemaPath === null || schemaPath === void 0 ? void 0 : schemaPath.indexOf(`/${ONE_OF_KEY}/`) : undefined;
|
|
22
|
+
let schemaPrefix;
|
|
23
|
+
if (anyOfIndex && anyOfIndex >= 0) {
|
|
24
|
+
schemaPrefix = schemaPath === null || schemaPath === void 0 ? void 0 : schemaPath.substring(0, anyOfIndex);
|
|
25
|
+
}
|
|
26
|
+
else if (oneOfIndex && oneOfIndex >= 0) {
|
|
27
|
+
schemaPrefix = schemaPath === null || schemaPath === void 0 ? void 0 : schemaPath.substring(0, oneOfIndex);
|
|
28
|
+
}
|
|
29
|
+
// If there is a schemaPrefix, then search for a duplicate message with the same prefix, otherwise undefined
|
|
30
|
+
const dup = schemaPrefix
|
|
31
|
+
? acc.find((e) => { var _a; return e.message === message && ((_a = e.schemaPath) === null || _a === void 0 ? void 0 : _a.startsWith(schemaPrefix)); })
|
|
32
|
+
: undefined;
|
|
33
|
+
if (!dup) {
|
|
34
|
+
acc.push(err);
|
|
35
|
+
}
|
|
36
|
+
return acc;
|
|
37
|
+
}, []);
|
|
38
|
+
}
|
|
3
39
|
/** Transforming the error output from ajv to format used by @rjsf/utils.
|
|
4
40
|
* At some point, components should be updated to support ajv.
|
|
5
41
|
*
|
|
6
42
|
* @param errors - The list of AJV errors to convert to `RJSFValidationErrors`
|
|
7
43
|
* @param [uiSchema] - An optional uiSchema that is passed to `transformErrors` and `customValidate`
|
|
44
|
+
* @param [suppressDuplicateFiltering] - Controls which duplicate filtering is suppressed; see `filterDuplicateErrors`
|
|
8
45
|
*/
|
|
9
|
-
export function transformRJSFValidationErrors(errors = [], uiSchema) {
|
|
46
|
+
export function transformRJSFValidationErrors(errors = [], uiSchema, suppressDuplicateFiltering) {
|
|
10
47
|
const errorList = errors.map((e) => {
|
|
11
48
|
var _a;
|
|
12
49
|
const { instancePath, keyword, params, schemaPath, parentSchema, ...rest } = e;
|
|
@@ -76,29 +113,7 @@ export function transformRJSFValidationErrors(errors = [], uiSchema) {
|
|
|
76
113
|
title: uiTitle,
|
|
77
114
|
};
|
|
78
115
|
});
|
|
79
|
-
|
|
80
|
-
return errorList.reduce((acc, err) => {
|
|
81
|
-
const { message, schemaPath } = err;
|
|
82
|
-
const anyOfIndex = schemaPath === null || schemaPath === void 0 ? void 0 : schemaPath.indexOf(`/${ANY_OF_KEY}/`);
|
|
83
|
-
const oneOfIndex = schemaPath === null || schemaPath === void 0 ? void 0 : schemaPath.indexOf(`/${ONE_OF_KEY}/`);
|
|
84
|
-
let schemaPrefix;
|
|
85
|
-
// Look specifically for `/anyOr/` or `/oneOf/` within the schemaPath information
|
|
86
|
-
if (anyOfIndex && anyOfIndex >= 0) {
|
|
87
|
-
schemaPrefix = schemaPath === null || schemaPath === void 0 ? void 0 : schemaPath.substring(0, anyOfIndex);
|
|
88
|
-
}
|
|
89
|
-
else if (oneOfIndex && oneOfIndex >= 0) {
|
|
90
|
-
schemaPrefix = schemaPath === null || schemaPath === void 0 ? void 0 : schemaPath.substring(0, oneOfIndex);
|
|
91
|
-
}
|
|
92
|
-
// If there is a schemaPrefix, then search for a duplicate message with the same prefix, otherwise undefined
|
|
93
|
-
const dup = schemaPrefix
|
|
94
|
-
? acc.find((e) => { var _a; return e.message === message && ((_a = e.schemaPath) === null || _a === void 0 ? void 0 : _a.startsWith(schemaPrefix)); })
|
|
95
|
-
: undefined;
|
|
96
|
-
if (!dup) {
|
|
97
|
-
// Only push an error that is not a duplicate
|
|
98
|
-
acc.push(err);
|
|
99
|
-
}
|
|
100
|
-
return acc;
|
|
101
|
-
}, []);
|
|
116
|
+
return filterDuplicateErrors(errorList, suppressDuplicateFiltering);
|
|
102
117
|
}
|
|
103
118
|
/** This function processes the `formData` with an optional user contributed `customValidate` function, which receives
|
|
104
119
|
* the form data and a `errorHandler` function that will be used to add custom validation errors for each field. Also
|
|
@@ -112,10 +127,11 @@ export function transformRJSFValidationErrors(errors = [], uiSchema) {
|
|
|
112
127
|
* @param [customValidate] - An optional function that is used to perform custom validation
|
|
113
128
|
* @param [transformErrors] - An optional function that is used to transform errors after AJV validation
|
|
114
129
|
* @param [uiSchema] - An optional uiSchema that is passed to `transformErrors` and `customValidate`
|
|
130
|
+
* @param [suppressDuplicateFiltering] - Controls which duplicate filtering is suppressed; see `filterDuplicateErrors`
|
|
115
131
|
*/
|
|
116
|
-
export default function processRawValidationErrors(validator, rawErrors, formData, schema, customValidate, transformErrors, uiSchema) {
|
|
132
|
+
export default function processRawValidationErrors(validator, rawErrors, formData, schema, customValidate, transformErrors, uiSchema, suppressDuplicateFiltering) {
|
|
117
133
|
const { validationError: invalidSchemaError } = rawErrors;
|
|
118
|
-
let errors = transformRJSFValidationErrors(rawErrors.errors, uiSchema);
|
|
134
|
+
let errors = transformRJSFValidationErrors(rawErrors.errors, uiSchema, suppressDuplicateFiltering);
|
|
119
135
|
if (invalidSchemaError) {
|
|
120
136
|
errors = [...errors, { stack: invalidSchemaError.message }];
|
|
121
137
|
}
|