1 | const parser = require('jsonlint').parser;
|
2 | const jjv = require('jjv');
|
3 | const schemaError = require('./schema-error');
|
4 | const pkg = require('../package');
|
5 |
|
6 | function parse(source) {
|
7 | try {
|
8 | return parser.parse(source);
|
9 | } catch (error) {
|
10 | error.type = pkg.name;
|
11 | error.step = 'parse';
|
12 | throw error;
|
13 | }
|
14 | }
|
15 |
|
16 | function validate(data, settings, schema) {
|
17 | if (!schema) {
|
18 | return data;
|
19 | }
|
20 |
|
21 | const environment = jjv(settings.env);
|
22 | environment.addSchema('default', schema);
|
23 | const errors = environment.validate('default', data);
|
24 |
|
25 | if (errors) {
|
26 | const message = schemaError(errors, schema)
|
27 | .filter(Boolean).join('\n');
|
28 | const error = new Error(message);
|
29 | error.type = pkg.name;
|
30 | error.step = 'validation';
|
31 | throw error;
|
32 | }
|
33 |
|
34 | return data;
|
35 | }
|
36 |
|
37 | module.exports = (source, settings, schema) => {
|
38 | try {
|
39 | const json = source.toString();
|
40 | const parsed = parse(json, settings);
|
41 | return validate(parsed, settings, schema);
|
42 | } catch (error) {
|
43 | const intro = `${source.path} ${error.step}`;
|
44 | error.file = error.file || source.path;
|
45 | error.message = `${intro}:\n${error.message}`;
|
46 | throw error;
|
47 | }
|
48 | };
|