README

# schema-utils

Package for validate options in loaders and plugins.

## Getting Started

To begin, you'll need to install `schema-utils`:

npm install schema-utils

## API

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);

### <tt>schema</tt>

Type: `String`

JSON schema.

Simple example of schema:

{
"type": "object",
"properties": {
"name": {
"description": "This is description of option.",
"type": "string"
}
},
"additionalProperties": false
}

### <tt>options</tt>

Type: `Object`

Object with options.

validate(
schema,
{
name: 123,
},
{ name: 'MyPlugin' }
);

### <tt>configuration</tt>

Allow to configure validator.

There is an alternative method to configure the `name` and`baseDataPath` 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`.

#### <tt>name</tt>

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.

#### <tt>baseDataPath</tt>

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.

#### <tt>postFormatter</tt>

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.

## Examples

schema.json

{
"type": "object",
"properties": {
"name": {
"type": "string"
},
"test": {
"anyOf": [
{ "type": "array" },
{ "type": "string" },
{ "instanceof": "RegExp" }
]
},
"transform": {
"instanceof": "Function"
},
"sourceMap": {
"type": "boolean"
}
},
"additionalProperties": false
}

### <tt>Loader</tt>

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;

### <tt>Plugin</tt>

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;

## Contributing

Please take a moment to read our contributing guidelines if you haven't yet done so.

./.github/CONTRIBUTING.md "CONTRIBUTING"

## License

MIT