What is jest-validate?
The jest-validate package is a utility for validating and ensuring that configurations passed to Jest, the JavaScript testing framework, are correct. It checks if the provided configuration object adheres to Jest's expected configurations and provides warnings or errors for any invalid or unknown options. This helps developers to quickly identify issues with their Jest setup.
What are jest-validate's main functionalities?
Validation of configuration objects
This feature allows developers to validate their Jest configuration objects against a schema. It ensures that the configuration provided matches the expected format and values that Jest can work with.
{"validateConfig": require('jest-validate').validateConfig, "config": { "verbose": true }, "exampleConfig": { "verbose": false }}
Customization of validation messages
Developers can provide custom messages for unknown or deprecated options. This helps in guiding the user to correct their configuration with helpful feedback.
{"validateConfig": require('jest-validate').validateConfig, "config": { "unknownOption": true }, "exampleConfig": { "verbose": false }, "options": { "comment": "A custom message for unknownOption" }}
Deprecation warnings
jest-validate can warn users about deprecated configuration options. It provides a mechanism to inform users about the new options they should use instead.
{"validateConfig": require('jest-validate').validateConfig, "config": { "scriptPreprocessor": "<rootDir>/preprocessor.js" }, "exampleConfig": { "transform": {"^.+\\.js$": "<rootDir>/preprocessor.js"} }, "deprecatedConfig": { "scriptPreprocessor": "Please use `transform` instead" }}
Other packages similar to jest-validate
convict
Convict is a configuration management library for Node.js that includes schema validation. It is similar to jest-validate in that it validates configuration objects, but it is more general-purpose and not tied to a specific framework like Jest.
joi
Joi is a powerful schema description language and data validator for JavaScript. Unlike jest-validate, which is tailored for Jest configurations, Joi can be used for validating any kind of data structures and is often used for validating API input.
yup
Yup is a JavaScript schema builder for value parsing and validation. Similar to Joi, it defines a schema to validate objects against. It is less verbose and more expressive in some cases compared to Joi and is not specific to Jest configurations.
jest-validate
Generic configuration validation tool that helps you with warnings, errors and deprecation messages as well as showing users examples of correct configuration.
npm install --save jest-validate
Usage
import {validate} from 'jest-validate';
validate(config, validationOptions);
Where ValidationOptions
are:
type ValidationOptions = {
comment?: string;
condition?: (option: unknown, validOption: unknown) => boolean;
deprecate?: (
config: Record<string, unknown>,
option: string,
deprecatedOptions: DeprecatedOptions,
options: ValidationOptions,
) => boolean;
deprecatedConfig?: DeprecatedOptions;
error?: (
option: string,
received: unknown,
defaultValue: unknown,
options: ValidationOptions,
path?: Array<string>,
) => void;
exampleConfig: Record<string, unknown>;
recursive?: boolean;
recursiveBlacklist?: Array<string>;
recursiveDenylist?: Array<string>;
title?: Title;
unknown?: (
config: Record<string, unknown>,
exampleConfig: Record<string, unknown>,
option: string,
options: ValidationOptions,
path?: Array<string>,
) => void;
};
type Title = {
deprecation?: string;
error?: string;
warning?: string;
};
exampleConfig
is the only option required.
API
By default jest-validate
will print generic warning and error messages. You can however customize this behavior by providing options: ValidationOptions
object as a second argument:
Almost anything can be overwritten to suite your needs.
Options
recursiveDenylist
– optional array of string keyPaths that should be excluded from deep (recursive) validation.comment
– optional string to be rendered below error/warning message.condition
– an optional function with validation condition.deprecate
, error
, unknown
– optional functions responsible for displaying warning and error messages.deprecatedConfig
– optional object with deprecated config keys.exampleConfig
– the only required option with configuration against which you'd like to test.recursive
- optional boolean determining whether recursively compare exampleConfig
to config
(default: true
).title
– optional object of titles for errors and messages.
You will find examples of condition
, deprecate
, error
, unknown
, and deprecatedConfig
inside source of this repository, named respectively.
exampleConfig syntax
exampleConfig
should be an object with key/value pairs that contain an example of a valid value for each key. A configuration value is considered valid when:
- it matches the JavaScript type of the example value, e.g.
string
, number
, array
, boolean
, function
, or object
- it is
null
or undefined
- it matches the Javascript type of any of arguments passed to
MultipleValidOptions(...)
The last condition is a special syntax that allows validating where more than one type is permissible; see example below. It's acceptable to have multiple values of the same type in the example, so you can also use this syntax to provide more than one example. When a validation failure occurs, the error message will show all other values in the array as examples.
Examples
Minimal example:
validate(config, {exampleConfig});
Example with slight modifications:
validate(config, {
comment: ' Documentation: http://custom-docs.com',
deprecatedConfig,
exampleConfig,
title: {
deprecation: 'Custom Deprecation',
},
});
This will output:
Warning:
● Validation Warning:
Unknown option transformx with value "<rootDir>/node_modules/babel-jest" was found.
This is either a typing error or a user mistake. Fixing it will remove this message.
Documentation: http://custom-docs.com
Error:
● Validation Error:
Option transform must be of type:
object
but instead received:
string
Example:
{
"transform": {
"\\.js$": "<rootDir>/preprocessor.js"
}
}
Documentation: http://custom-docs.com
Example validating multiple types
import {multipleValidOptions} from 'jest-validate';
validate(config, {
bar: multipleValidOptions('string is ok', 2),
});
Error:
● Validation Error:
Option foo must be of type:
string or number
but instead received:
array
Example:
{
"bar": "string is ok"
}
or
{
"bar": 2
}
Documentation: http://custom-docs.com
Deprecation
Based on deprecatedConfig
object with proper deprecation messages. Note custom title:
Custom Deprecation:
Option scriptPreprocessor was replaced by transform, which support multiple preprocessors.
Jest now treats your current configuration as:
{
"transform": {".*": "xxx"}
}
Please update your configuration.
Documentation: http://custom-docs.com
Example validating CLI arguments
import {validate} from 'jest-validate';
validateCLIOptions(argv, {...allowedOptions, deprecatedOptions});
If argv
contains a deprecated option that is not specified in allowedOptions
, validateCLIOptions
will throw an error with the message specified in the deprecatedOptions
config:
● collectCoverageOnlyFrom:
Option "collectCoverageOnlyFrom" was replaced by "collectCoverageFrom"
CLI Options Documentation: https://jestjs.io/docs/en/cli.html
If the deprecation option is still listed in the allowedOptions
config, then validateCLIOptions
will print the warning without throwing an error.