forked from rjsf-team/react-jsonschema-form
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix: Implement precompiled validator support in @rjsf/validator-ajv8
Fixes rjsf-team#3543 by implementing support for precompiled validators - In `@rjsf/validator-ajv8` added support for precompiled validators as follows: - Added a new `compileSchemaValidators()` API function used to generate the precompiled validators for a schema to an output file - Updated the documentation for the `customizeValidator()` API function - Added a new `AJV8PrecompiledValidator` implementation of the `ValidatorType` interface - Refactored a large piece of the raw validation error processing from the `AJV8Validator` into a new `processRawValidationErrors()` function also used by the `AJV8PrecompiledValidator` - Added a new `usePrecompiledValidator()` API function that is similar to `customizeValidator()` but returning a precompiled validator-based `ValidatorType` interface implementation - Added some new types to the `types.ts` file in support of precompiled validators - Updated the main `index.ts` file to export the new types and API functions - Added 100% unit test coverage of the new feature - This included implementing a node function to precompile the `superSchema.json` file found in the `test/harness` directory - Added `ignorePatterns` to the `.eslintrc` file to ignore the precompiled schema files - Updated the `validation.md` documentation for the new precompiled validator functionality - Added a new `validator-ajv8.md` documentation file to the `api-reference` directory and the `sidebar.js` - Updated the `CHANGELOG.md` file accordingly
- Loading branch information
1 parent
1c045cc
commit eb7a423
Showing
27 changed files
with
2,694 additions
and
172 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
# @rjsf/validator-ajv8 APIs | ||
|
||
In RJSF version 5, the original, embedded AJV 6 validator implementation from earlier versions was extracted into its own package, `@rjsf/validator-ajv6`, which was immediately deprecated since AJV 6 is no longer getting maintenance updates. | ||
A new `@rjsf/validator-ajv8` package was added that uses the AJV 8 package, including adding support for using precompiled validators. | ||
Below are the exported API functions that are provided by this package. | ||
See the [Validation documentation](../usage/validation.md) for examples of using these APIs. | ||
|
||
## Types | ||
|
||
There are a few Typescript types that are exported by `@rjsf/validator-ajv8` in support of the APIs. | ||
|
||
These types can be found on GitHub [here](https://github.com/rjsf-team/react-jsonschema-form/blob/main/packages/validator-ajv8/src/types.ts). | ||
|
||
## APIs | ||
|
||
### customizeValidator<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>() | ||
|
||
Creates and returns a customized implementation of the `ValidatorType` with the given customization `options` if provided. | ||
If a `localizer` is provided, it is used to translate the messages generated by the underlying AJV validation. | ||
|
||
#### Parameters | ||
|
||
- [options={}]: CustomValidatorOptionsType - The optional map of `CustomValidatorOptionsType` options that are used to create the `ValidatorType` instance | ||
- [localizer]: Localizer | undefined - If provided, is used to localize a list of Ajv `ErrorObject`s after running the form validation using AJV | ||
|
||
#### Returns | ||
|
||
- ValidatorType<T, S, F>: The custom validator implementation resulting from the set of parameters provided | ||
|
||
### compileSchemaValidators<S extends StrictRJSFSchema = RJSFSchema>() | ||
|
||
The function used to compile a schema into an output file in the form that allows it to be used as a precompiled validator. | ||
The main reasons for using a precompiled validator is reducing code size, improving validation speed and, most importantly, avoiding dynamic code compilation when prohibited by a browser's Content Security Policy. | ||
For more information about AJV code compilation see: https://ajv.js.org/standalone.html | ||
|
||
#### Parameters | ||
|
||
- schema: S - The schema to be compiled into a set of precompiled validators functions | ||
- output: string - The name of the file into which the precompiled validator functions will be generated | ||
- [options={}]: CustomValidatorOptionsType - The set of `CustomValidatorOptionsType` information used to alter the AJV validator used for compiling the schema. They are the same options that are passed to the `customizeValidator()` function in order to modify the behavior of the regular AJV-based validator. | ||
|
||
### usePrecompiledValidator<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>() | ||
|
||
Creates and returns a `ValidatorType` interface that is implemented with a precompiled validator. | ||
If a `localizer` is provided, it is used to translate the messages generated by the underlying AJV validation. | ||
|
||
> NOTE: The `validateFns` parameter is an object obtained by importing from a precompiled validation file created via the `compileSchemaValidators()` function. | ||
#### Parameters | ||
|
||
- validateFns: ValidatorFunctions<T> - The map of the validation functions that are created by the `compileSchemaValidators()` function | ||
- rootSchema: S - The root schema that was used with the `compileSchemaValidators()` function | ||
- [localizer]: Localizer | undefined - If provided, is used to localize a list of Ajv `ErrorObject`s after running the form validation using AJV | ||
|
||
#### Returns | ||
|
||
- ValidatorType<T, S, F>: The precompiled validator implementation resulting from the set of parameters provided |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
import fs from 'fs'; | ||
import standaloneCode from 'ajv/dist/standalone'; | ||
import { RJSFSchema, StrictRJSFSchema, schemaParser } from '@rjsf/utils'; | ||
|
||
import createAjvInstance from './createAjvInstance'; | ||
import { CustomValidatorOptionsType } from './types'; | ||
|
||
/** The function used to compile a schema into an output file in the form that allows it to be used as a precompiled | ||
* validator. The main reasons for using a precompiled validator is reducing code size, improving validation speed and, | ||
* most importantly, avoiding dynamic code compilation when prohibited by a browser's Content Security Policy. For more | ||
* information about AJV code compilation see: https://ajv.js.org/standalone.html | ||
* | ||
* @param schema - The schema to be compiled into a set of precompiled validators functions | ||
* @param output - The name of the file into which the precompiled validator functions will be generated | ||
* @param [options={}] - The set of `CustomValidatorOptionsType` information used to alter the AJV validator used for | ||
* compiling the schema. They are the same options that are passed to the `customizeValidator()` function in | ||
* order to modify the behavior of the regular AJV-based validator. | ||
*/ | ||
export default function compileSchemaValidators<S extends StrictRJSFSchema = RJSFSchema>( | ||
schema: S, | ||
output: string, | ||
options: CustomValidatorOptionsType = {} | ||
) { | ||
console.log('parsing the schema'); | ||
const schemaMaps = schemaParser(schema); | ||
const schemas = Object.values(schemaMaps); | ||
|
||
const { additionalMetaSchemas, customFormats, ajvOptionsOverrides = {}, ajvFormatOptions, AjvClass } = options; | ||
const compileOptions = { ...ajvOptionsOverrides, code: { source: true, lines: true }, schemas }; | ||
const ajv = createAjvInstance(additionalMetaSchemas, customFormats, compileOptions, ajvFormatOptions, AjvClass); | ||
|
||
const moduleCode = standaloneCode(ajv); | ||
console.log(`writing ${output}`); | ||
fs.writeFileSync(output, moduleCode); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,8 @@ | ||
import customizeValidator from './customizeValidator'; | ||
import compileSchemaValidators from './compileSchemaValidators'; | ||
import usePrecompiledValidator from './usePrecompiledValidator'; | ||
|
||
export { customizeValidator }; | ||
export { customizeValidator, compileSchemaValidators, usePrecompiledValidator }; | ||
export * from './types'; | ||
|
||
export default customizeValidator(); |
Oops, something went wrong.