Package for validate options in loaders and plugins.
To begin, you'll need to install schema-utils
:
npm install schema-utils
schema.json
{ "type": "object", "properties": { "option": { "type": "boolean" } }, "additionalProperties": false }
import schema from './path/to/schema.json'; import validate from 'schema-utils'; const options = { option: true }; const configuration = { name: 'Loader Name/Plugin Name/Name' }; validate(schema, options, configuration);
schema
Type: String
JSON schema.
Simple example of schema:
{ "type": "object", "properties": { "name": { "description": "This is description of option.", "type": "string" } }, "additionalProperties": false }
options
Type: Object
Object with options.
validate( schema, { name: 123, }, { name: 'MyPlugin' } );
configuration
Allow to configure validator.
There is an alternative method to configure the name
andbaseDataPath
options via the title
property in the schema. For example:
{ "title": "My Loader options", "type": "object", "properties": { "name": { "description": "This is description of option.", "type": "string" } }, "additionalProperties": false }
The last word used for the baseDataPath
option, other words used for the name
option. Based on the example above the name
option equals My Loader
, the baseDataPath
option equals options
.
name
Type: Object
Default: "Object"
Allow to setup name in validation errors.
validate(schema, options, { name: 'MyPlugin' });
Invalid configuration object. MyPlugin has been initialised using a configuration object that does not match the API schema. - configuration.optionName should be a integer.
baseDataPath
Type: String
Default: "configuration"
Allow to setup base data path in validation errors.
validate(schema, options, { name: 'MyPlugin', baseDataPath: 'options' });
Invalid options object. MyPlugin has been initialised using an options object that does not match the API schema. - options.optionName should be a integer.
postFormatter
Type: Function
Default: undefined
Allow to reformat errors.
validate(schema, options, { name: 'MyPlugin', postFormatter: (formattedError, error) => { if (error.keyword === 'type') { return `${formattedError}\nAdditional Information.`; } return formattedError; }, });
Invalid options object. MyPlugin has been initialized using an options object that does not match the API schema. - options.optionName should be a integer. Additional Information.
schema.json
{ "type": "object", "properties": { "name": { "type": "string" }, "test": { "anyOf": [ { "type": "array" }, { "type": "string" }, { "instanceof": "RegExp" } ] }, "transform": { "instanceof": "Function" }, "sourceMap": { "type": "boolean" } }, "additionalProperties": false }
Loader
import { getOptions } from 'loader-utils'; import validateOptions from 'schema-utils'; import schema from 'path/to/schema.json'; function loader(src, map) { const options = getOptions(this) || {}; validateOptions(schema, options, { name: 'Loader Name', baseDataPath: 'options', }); // Code... } export default loader;
Plugin
import validateOptions from 'schema-utils'; import schema from 'path/to/schema.json'; class Plugin { constructor(options) { validateOptions(schema, options, { name: 'Plugin Name', baseDataPath: 'options', }); this.options = options; } apply(compiler) { // Code... } } export default Plugin;
Please take a moment to read our contributing guidelines if you haven't yet done so.