.6-浅析webpack源码之validateSchema模块
validateSchema模块
首先来看错误检测:
const webpackOptionsValidationErrors = validateSchema(webpackOptionsSchema, options); if(webpackOptionsValidationErrors.length) { throw new WebpackOptionsValidationError(webpackOptionsValidationErrors); }
可以注意到,这里传了两个参数,其实第一个参数来源于一个JSON文件:
const webpackOptionsSchema = require("../schemas/webpackOptionsSchema.json");
这个JSON文件非常大,可以观察一下部分内容:
{
"plugins": {
"description": "Add additional plugins to the compiler.",
"type": "array"
},
"resolve": {
"description": "Options for the resolver",
"anyOf": [
{
"$ref": "#/definitions/resolve"
}
]
},
"required": [
"entry"
],
"type": "object"
}
从描述可以猜测,这里的key对应options中的key,value就是检测方式。
比如说entry放到required代表是必须的,plugins的type为array代表这个键必须是一个数组,而$ref代表一个路径映射,即#/definnitions/resolve。
在JSON文件的开头有一个definitions,其中resolve对应的内容如下:
{
"definitions": {
"resolve": {
"additionalProperties": false,
"properties": {
"alias": {
// ...
}
// ...
},
"type": "object"
}
}
}
简单明了,就不多解释了。
下面进入validateSchema模块,流程如图:
内部代码简化如下:
const Ajv = require("ajv"); const ajv = new Ajv({ errorDataPath: "configuration", allErrors: true, verbose: true }); require("ajv-keywords")(ajv, ["instanceof"]); require("../schemas/ajv.absolutePath")(ajv); function validateSchema(schema, options) { // 仍然是多配置与单配置 if(Array.isArray(options)) { /*...*/ } else { return validateObject(schema, options); } } function validateObject(schema, options) { // 转换JSON文件 const validate = ajv.compile(schema); // 检测配置对象 const valid = validate(options); // 返回错误对象 return valid ? [] : filterErrors(validate.errors); } function filterErrors(errors) { /*...*/ } module.exports = validateSchema;
这里引入的ajv模块是一个工具,就像之前的JSON5一样,作用是将一个JSON配置文件转换成一个对象,用于检测对象的合法性。
在github上,该工具的Getting started如图所示:
简直跟源码中的使用过程一模一样,所以有兴趣的可以自己去看看教程学一下。
由于JSON十分巨大,所以编译后的对象也十分巨大,这里根据vue脚手架中的配置,只看常规的参数是如何进行检测的,比如说devServer、devtool、entry、module、output、plugins、resolve,测试代码如下:
var Ajv = require('ajv'); const ajv = new Ajv({ errorDataPath: "configuration", allErrors: true, verbose: true }); // 简化后的JSON文件 const json = require('./tmp.json'); const validate = ajv.compile(json);
打包后尝试获取生成的validate函数,整理后源码如下:
(function(self, RULES, formats, root, refVal, defaults, customRules, co, equal, ucs2length, ValidationError) { var refVal0 = refVal[0]; // ... var refVal13 = refVal[13]; var validate = (function(data, dataPath, parentData, parentDataProperty, rootData) { 'use strict'; // 负责收集错误信息 var vErrors = null; // 负责对错误进行计数 var errors = 0; if (rootData === undefined) rootData = data; // 这是根级对象 if ((data && typeof data === "object" && !Array.isArray(data))) { var errs__0 = errors; var valid1 = true; for (var key0 in data) { /*...*/ } // 在这里进行检测 // 每出现一个错误errors+1并记录vErrors中 var data1 = data.devServer; if (data1 !== undefined) { /*...*/ } var data1 = data.devtool; if (data1 !== undefined) { /*...*/ } var data1 = data.entry; if (data1 === undefined) { /*...*/ } else { /*...*/ } var data1 = data.module; if (data1 !== undefined) { /*...*/ } var data1 = data.output; if (data1 !== undefined) { /*...*/ } var data1 = data.plugins; if (data1 !== undefined) { /*...*/ } var data1 = data.resolve; if (data1 !== undefined) { /*...*/ } } else { /*...*/ } validate.errors = vErrors; // 判断是否产生错误 return errors === 0; }); return validate; })
调用validate(options),options在函数中就相当于那个data,validate会依次从data中取出需要校验的key,按照JSON文件中的规则进行判断。
这里有一个比较麻烦的点,就是顶部的refVal,由于这是一个内部的IIFE,所以从这里看不出refVal数组如何定义的。凭借我的聪明才智,还是从源码中获取到了对应的定义:
打开后,其实是一堆validate函数,所以就不展开看了。
其实validate并不只有这么多,其中还可以分为特殊校验器和公共校验器,其中公共校验器不会针对特殊的键来进行校验,在这里可以先列出来。(友情警告:千万不要点开!!!)
refVal1
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
if ((data && typeof data === "object" && !Array.isArray(data))) { if (Object.keys(data).length < 1) { var err = { keyword: 'minProperties', dataPath: (dataPath || '') + "", schemaPath: '#/oneOf/0/minProperties', params: { limit: 1 }, message: 'should NOT have less than 1 properties', schema: 1, parentSchema: validate.schema.oneOf[0], data: data }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var errs__1 = errors; var valid2 = true; for (var key1 in data) { var data1 = data[key1]; var errs_2 = errors; var errs__2 = errors; var prevValid2 = false; var valid2 = false; var errs_3 = errors; if (typeof data1 === "string") { if (ucs2length(data1) < 1) { var err = { keyword: 'minLength', dataPath: (dataPath || '') + '[\'' + key1 + '\']', schemaPath: '#/oneOf/0/additionalProperties/oneOf/0/minLength', params: { limit: 1 }, message: 'should NOT be shorter than 1 characters', schema: 1, parentSchema: validate.schema.oneOf[0].additionalProperties.oneOf[0], data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '[\'' + key1 + '\']', schemaPath: '#/oneOf/0/additionalProperties/oneOf/0/type', params: { type: 'string' }, message: 'should be string', schema: validate.schema.oneOf[0].additionalProperties.oneOf[0].type, parentSchema: validate.schema.oneOf[0].additionalProperties.oneOf[0], data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid3 = errors === errs_3; if (valid3) valid2 = prevValid2 = true; var errs_3 = errors; var errs__3 = errors; var valid3 = false; var errs_4 = errors; var errs_5 = errors; if (Array.isArray(data1)) { if (data1.length < 1) { var err = { keyword: 'minItems', dataPath: (dataPath || '') + '[\'' + key1 + '\']', schemaPath: '#/definitions/common.nonEmptyArrayOfUniqueStringValues/minItems', params: { limit: 1 }, message: 'should NOT have less than 1 items', schema: 1, parentSchema: refVal2, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid5 = true; if (data1.length > 1) { var i = data1.length, j; outer: for (; i--;) { for (j = i; j--;) { if (equal(data1[i], data1[j])) { valid5 = false; break outer; } } } } if (!valid5) { var err = { keyword: 'uniqueItems', dataPath: (dataPath || '') + '[\'' + key1 + '\']', schemaPath: '#/definitions/common.nonEmptyArrayOfUniqueStringValues/uniqueItems', params: { i: i, j: j }, message: 'should NOT have duplicate items (items ## ' + j + ' and ' + i + ' are identical)', schema: true, parentSchema: refVal2, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var errs__5 = errors; var valid5; for (var i5 = 0; i5 < data1.length; i5++) { var data2 = data1[i5]; var errs_6 = errors; if (typeof data2 === "string") { if (ucs2length(data2) < 1) { var err = { keyword: 'minLength', dataPath: (dataPath || '') + '[\'' + key1 + '\'][' + i5 + ']', schemaPath: '#/definitions/common.nonEmptyArrayOfUniqueStringValues/items/minLength', params: { limit: 1 }, message: 'should NOT be shorter than 1 characters', schema: 1, parentSchema: refVal2.items, data: data2 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '[\'' + key1 + '\'][' + i5 + ']', schemaPath: '#/definitions/common.nonEmptyArrayOfUniqueStringValues/items/type', params: { type: 'string' }, message: 'should be string', schema: refVal2.items.type, parentSchema: refVal2.items, data: data2 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid6 = errors === errs_6; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '[\'' + key1 + '\']', schemaPath: '#/definitions/common.nonEmptyArrayOfUniqueStringValues/type', params: { type: 'array' }, message: 'should be array', schema: refVal2.type, parentSchema: refVal2, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid5 = errors === errs_5; var valid4 = errors === errs_4; valid3 = valid3 || valid4; if (!valid3) { var err = { keyword: 'anyOf', dataPath: (dataPath || '') + '[\'' + key1 + '\']', schemaPath: '#/oneOf/0/additionalProperties/oneOf/1/anyOf', params: {}, message: 'should match some schema in anyOf', schema: validate.schema.oneOf[0].additionalProperties.oneOf[1].anyOf, parentSchema: validate.schema.oneOf[0].additionalProperties.oneOf[1], data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else { errors = errs__3; if (vErrors !== null) { if (errs__3) vErrors.length = errs__3; else vErrors = null; } } var valid3 = errors === errs_3; if (valid3 && prevValid2) valid2 = false; else { if (valid3) valid2 = prevValid2 = true; } if (!valid2) { var err = { keyword: 'oneOf', dataPath: (dataPath || '') + '[\'' + key1 + '\']', schemaPath: '#/oneOf/0/additionalProperties/oneOf', params: {}, message: 'should match exactly one schema in oneOf', schema: validate.schema.oneOf[0].additionalProperties.oneOf, parentSchema: validate.schema.oneOf[0].additionalProperties, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else { errors = errs__2; if (vErrors !== null) { if (errs__2) vErrors.length = errs__2; else vErrors = null; } } var valid2 = errors === errs_2; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + "", schemaPath: '#/oneOf/0/type', params: { type: 'object' }, message: 'should be object', schema: validate.schema.oneOf[0].type, parentSchema: validate.schema.oneOf[0], data: data }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; if (valid1) valid0 = prevValid0 = true; var errs_1 = errors; if (typeof data === "string") { if (ucs2length(data) < 1) { var err = { keyword: 'minLength', dataPath: (dataPath || '') + "", schemaPath: '#/oneOf/1/minLength', params: { limit: 1 }, message: 'should NOT be shorter than 1 characters', schema: 1, parentSchema: validate.schema.oneOf[1], data: data }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + "", schemaPath: '#/oneOf/1/type', params: { type: 'string' }, message: 'should be string', schema: validate.schema.oneOf[1].type, parentSchema: validate.schema.oneOf[1], data: data }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; if (valid1 && prevValid0) valid0 = false; else { if (valid1) valid0 = prevValid0 = true; var errs_1 = errors; var errs__1 = errors; var valid1 = false; var errs_2 = errors; var errs_3 = errors; if (Array.isArray(data)) { if (data.length < 1) { var err = { keyword: 'minItems', dataPath: (dataPath || '') + "", schemaPath: '#/definitions/common.nonEmptyArrayOfUniqueStringValues/minItems', params: { limit: 1 }, message: 'should NOT have less than 1 items', schema: 1, parentSchema: refVal[2], data: data }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid3 = true; if (data.length > 1) { var i = data.length, j; outer: for (; i--;) { for (j = i; j--;) { if (equal(data[i], data[j])) { valid3 = false; break outer; } } } } if (!valid3) { var err = { keyword: 'uniqueItems', dataPath: (dataPath || '') + "", schemaPath: '#/definitions/common.nonEmptyArrayOfUniqueStringValues/uniqueItems', params: { i: i, j: j }, message: 'should NOT have duplicate items (items ## ' + j + ' and ' + i + ' are identical)', schema: true, parentSchema: refVal[2], data: data }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var errs__3 = errors; var valid3; for (var i3 = 0; i3 < data.length; i3++) { var data1 = data[i3]; var errs_4 = errors; if (typeof data1 === "string") { if (ucs2length(data1) < 1) { var err = { keyword: 'minLength', dataPath: (dataPath || '') + '[' + i3 + ']', schemaPath: '#/definitions/common.nonEmptyArrayOfUniqueStringValues/items/minLength', params: { limit: 1 }, message: 'should NOT be shorter than 1 characters', schema: 1, parentSchema: refVal[2].items, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '[' + i3 + ']', schemaPath: '#/definitions/common.nonEmptyArrayOfUniqueStringValues/items/type', params: { type: 'string' }, message: 'should be string', schema: refVal[2].items.type, parentSchema: refVal[2].items, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid4 = errors === errs_4; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + "", schemaPath: '#/definitions/common.nonEmptyArrayOfUniqueStringValues/type', params: { type: 'array' }, message: 'should be array', schema: refVal[2].type, parentSchema: refVal[2], data: data }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid3 = errors === errs_3; var valid2 = errors === errs_2; valid1 = valid1 || valid2; if (!valid1) { var err = { keyword: 'anyOf', dataPath: (dataPath || '') + "", schemaPath: '#/oneOf/2/anyOf', params: {}, message: 'should match some schema in anyOf', schema: validate.schema.oneOf[2].anyOf, parentSchema: validate.schema.oneOf[2], data: data }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else { errors = errs__1; if (vErrors !== null) { if (errs__1) vErrors.length = errs__1; else vErrors = null; } } var valid1 = errors === errs_1; if (valid1 && prevValid0) valid0 = false; else { if (valid1) valid0 = prevValid0 = true; var valid1 = true; if (valid1 && prevValid0) valid0 = false; else { if (valid1) valid0 = prevValid0 = true; } } } if (!valid0) { var err = { keyword: 'oneOf', dataPath: (dataPath || '') + "", schemaPath: '#/oneOf', params: {}, message: 'should match exactly one schema in oneOf', schema: validate.schema.oneOf, parentSchema: validate.schema, data: data }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else { errors = errs__0; if (vErrors !== null) { if (errs__0) vErrors.length = errs__0; else vErrors = null; } }
规则:
1.数据可以为字符串、对象、数组
2.字符串必须为非空字符串
3.数组必须是非空数组,元素必须是非空字符串且不能重复
4.如果是对象则至少要有2个键,键的规则满足2、3
refVal3
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
if ((data && typeof data === "object" && !Array.isArray(data))) { var errs__0 = errors; var valid1 = true; for (var key0 in data) { var isAdditional0 = !(false || validate.schema.properties[key0]); if (isAdditional0) { valid1 = false; var err = { keyword: 'additionalProperties', dataPath: (dataPath || '') + "", schemaPath: '#/additionalProperties', params: { additionalProperty: '' + key0 + '' }, message: 'should NOT have additional properties', schema: false, parentSchema: validate.schema, data: data }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } var data1 = data.exprContextCritical; if (data1 !== undefined) { var errs_1 = errors; if (typeof data1 !== "boolean") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.exprContextCritical', schemaPath: '#/properties/exprContextCritical/type', params: { type: 'boolean' }, message: 'should be boolean', schema: validate.schema.properties.exprContextCritical.type, parentSchema: validate.schema.properties.exprContextCritical, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } var data1 = data.exprContextRecursive; if (data1 !== undefined) { var errs_1 = errors; if (typeof data1 !== "boolean") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.exprContextRecursive', schemaPath: '#/properties/exprContextRecursive/type', params: { type: 'boolean' }, message: 'should be boolean', schema: validate.schema.properties.exprContextRecursive.type, parentSchema: validate.schema.properties.exprContextRecursive, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } if (data.exprContextRegExp !== undefined) { var errs_1 = errors; var valid1 = errors === errs_1; } var data1 = data.exprContextRequest; if (data1 !== undefined) { var errs_1 = errors; if (typeof data1 !== "string") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.exprContextRequest', schemaPath: '#/properties/exprContextRequest/type', params: { type: 'string' }, message: 'should be string', schema: validate.schema.properties.exprContextRequest.type, parentSchema: validate.schema.properties.exprContextRequest, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } var data1 = data.loaders; if (data1 !== undefined) { var errs_1 = errors; var errs__1 = errors; var valid1 = false; var errs_2 = errors; if (!refVal4(data1, (dataPath || '') + '.loaders', data, 'loaders', rootData)) { if (vErrors === null) vErrors = refVal4.errors; else vErrors = vErrors.concat(refVal4.errors); errors = vErrors.length; } var valid2 = errors === errs_2; valid1 = valid1 || valid2; if (!valid1) { var err = { keyword: 'anyOf', dataPath: (dataPath || '') + '.loaders', schemaPath: '#/properties/loaders/anyOf', params: {}, message: 'should match some schema in anyOf', schema: validate.schema.properties.loaders.anyOf, parentSchema: validate.schema.properties.loaders, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else { errors = errs__1; if (vErrors !== null) { if (errs__1) vErrors.length = errs__1; else vErrors = null; } } var valid1 = errors === errs_1; } if (data.noParse !== undefined) { var errs_1 = errors; var valid1 = errors === errs_1; } if (data.rules !== undefined) { var errs_1 = errors; var errs_2 = errors; if (!refVal[4](data.rules, (dataPath || '') + '.rules', data, 'rules', rootData)) { if (vErrors === null) vErrors = refVal[4].errors; else vErrors = vErrors.concat(refVal[4].errors); errors = vErrors.length; } var valid2 = errors === errs_2; var valid1 = errors === errs_1; } var data1 = data.unknownContextCritical; if (data1 !== undefined) { var errs_1 = errors; if (typeof data1 !== "boolean") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.unknownContextCritical', schemaPath: '#/properties/unknownContextCritical/type', params: { type: 'boolean' }, message: 'should be boolean', schema: validate.schema.properties.unknownContextCritical.type, parentSchema: validate.schema.properties.unknownContextCritical, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } var data1 = data.unknownContextRecursive; if (data1 !== undefined) { var errs_1 = errors; if (typeof data1 !== "boolean") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.unknownContextRecursive', schemaPath: '#/properties/unknownContextRecursive/type', params: { type: 'boolean' }, message: 'should be boolean', schema: validate.schema.properties.unknownContextRecursive.type, parentSchema: validate.schema.properties.unknownContextRecursive, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } if (data.unknownContextRegExp !== undefined) { var errs_1 = errors; var valid1 = errors === errs_1; } var data1 = data.unknownContextRequest; if (data1 !== undefined) { var errs_1 = errors; if (typeof data1 !== "string") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.unknownContextRequest', schemaPath: '#/properties/unknownContextRequest/type', params: { type: 'string' }, message: 'should be string', schema: validate.schema.properties.unknownContextRequest.type, parentSchema: validate.schema.properties.unknownContextRequest, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } if (data.unsafeCache !== undefined) { var errs_1 = errors; var valid1 = errors === errs_1; } var data1 = data.wrappedContextCritical; if (data1 !== undefined) { var errs_1 = errors; if (typeof data1 !== "boolean") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.wrappedContextCritical', schemaPath: '#/properties/wrappedContextCritical/type', params: { type: 'boolean' }, message: 'should be boolean', schema: validate.schema.properties.wrappedContextCritical.type, parentSchema: validate.schema.properties.wrappedContextCritical, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } var data1 = data.wrappedContextRecursive; if (data1 !== undefined) { var errs_1 = errors; if (typeof data1 !== "boolean") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.wrappedContextRecursive', schemaPath: '#/properties/wrappedContextRecursive/type', params: { type: 'boolean' }, message: 'should be boolean', schema: validate.schema.properties.wrappedContextRecursive.type, parentSchema: validate.schema.properties.wrappedContextRecursive, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } var data1 = data.strictExportPresence; if (data1 !== undefined) { var errs_1 = errors; if (typeof data1 !== "boolean") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.strictExportPresence', schemaPath: '#/properties/strictExportPresence/type', params: { type: 'boolean' }, message: 'should be boolean', schema: validate.schema.properties.strictExportPresence.type, parentSchema: validate.schema.properties.strictExportPresence, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } var data1 = data.strictThisContextOnImports; if (data1 !== undefined) { var errs_1 = errors; if (typeof data1 !== "boolean") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.strictThisContextOnImports', schemaPath: '#/properties/strictThisContextOnImports/type', params: { type: 'boolean' }, message: 'should be boolean', schema: validate.schema.properties.strictThisContextOnImports.type, parentSchema: validate.schema.properties.strictThisContextOnImports, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + "", schemaPath: '#/type', params: { type: 'object' }, message: 'should be object', schema: validate.schema.type, parentSchema: validate.schema, data: data }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; }
规则:
1.检测了大量不知道的属性
2.loaders,rules属性调用refVal4校验
refVal4
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
if (Array.isArray(data)) { var errs__0 = errors; var valid0; for (var i0 = 0; i0 < data.length; i0++) { var data1 = data[i0]; var errs_1 = errors; var errs__1 = errors; var valid1 = false; var errs_2 = errors; if (!refVal5(data1, (dataPath || '') + '[' + i0 + ']', data, i0, rootData)) { if (vErrors === null) vErrors = refVal5.errors; else vErrors = vErrors.concat(refVal5.errors); errors = vErrors.length; } var valid2 = errors === errs_2; valid1 = valid1 || valid2; if (!valid1) { var err = { keyword: 'anyOf', dataPath: (dataPath || '') + '[' + i0 + ']', schemaPath: '#/items/anyOf', params: {}, message: 'should match some schema in anyOf', schema: validate.schema.items.anyOf, parentSchema: validate.schema.items, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else { errors = errs__1; if (vErrors !== null) { if (errs__1) vErrors.length = errs__1; else vErrors = null; } } var valid1 = errors === errs_1; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + "", schemaPath: '#/type', params: { type: 'array' }, message: 'should be array', schema: validate.schema.type, parentSchema: validate.schema, data: data }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; }
规则:
1.必须为数组
2.数组元素调用refVal5校验
refVal5
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
if ((data && typeof data === "object" && !Array.isArray(data))) { var errs__0 = errors; var valid1 = true; for (var key0 in data) { var isAdditional0 = !(false || validate.schema.properties[key0]); if (isAdditional0) { valid1 = false; var err = { keyword: 'additionalProperties', dataPath: (dataPath || '') + "", schemaPath: '#/additionalProperties', params: { additionalProperty: '' + key0 + '' }, message: 'should NOT have additional properties', schema: false, parentSchema: validate.schema, data: data }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } var data1 = data.enforce; if (data1 !== undefined) { var errs_1 = errors; var schema1 = validate.schema.properties.enforce.enum; var valid1; valid1 = false; for (var i1 = 0; i1 < schema1.length; i1++) if (equal(data1, schema1[i1])) { valid1 = true; break; } if (!valid1) { var err = { keyword: 'enum', dataPath: (dataPath || '') + '.enforce', schemaPath: '#/properties/enforce/enum', params: { allowedValues: schema1 }, message: 'should be equal to one of the allowed values', schema: validate.schema.properties.enforce.enum, parentSchema: validate.schema.properties.enforce, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } if (data.exclude !== undefined) { var errs_1 = errors; var errs_2 = errors; if (!refVal6(data.exclude, (dataPath || '') + '.exclude', data, 'exclude', rootData)) { if (vErrors === null) vErrors = refVal6.errors; else vErrors = vErrors.concat(refVal6.errors); errors = vErrors.length; } var valid2 = errors === errs_2; var valid1 = errors === errs_1; } if (data.include !== undefined) { var errs_1 = errors; var errs_2 = errors; if (!refVal[6](data.include, (dataPath || '') + '.include', data, 'include', rootData)) { if (vErrors === null) vErrors = refVal[6].errors; else vErrors = vErrors.concat(refVal[6].errors); errors = vErrors.length; } var valid2 = errors === errs_2; var valid1 = errors === errs_1; } if (data.issuer !== undefined) { var errs_1 = errors; var errs_2 = errors; if (!refVal[6](data.issuer, (dataPath || '') + '.issuer', data, 'issuer', rootData)) { if (vErrors === null) vErrors = refVal[6].errors; else vErrors = vErrors.concat(refVal[6].errors); errors = vErrors.length; } var valid2 = errors === errs_2; var valid1 = errors === errs_1; } var data1 = data.loader; if (data1 !== undefined) { var errs_1 = errors; var errs__1 = errors; var valid1 = false; var errs_2 = errors; var errs_3 = errors; if (typeof data1 === "string") { if (ucs2length(data1) < 1) { var err = { keyword: 'minLength', dataPath: (dataPath || '') + '.loader', schemaPath: '#/definitions/ruleSet-loader/minLength', params: { limit: 1 }, message: 'should NOT be shorter than 1 characters', schema: 1, parentSchema: refVal7, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '.loader', schemaPath: '#/definitions/ruleSet-loader/type', params: { type: 'string' }, message: 'should be string', schema: refVal7.type, parentSchema: refVal7, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid3 = errors === errs_3; var valid2 = errors === errs_2; valid1 = valid1 || valid2; if (!valid1) { var errs_2 = errors; if (!refVal8(data1, (dataPath || '') + '.loader', data, 'loader', rootData)) { if (vErrors === null) vErrors = refVal8.errors; else vErrors = vErrors.concat(refVal8.errors); errors = vErrors.length; } var valid2 = errors === errs_2; valid1 = valid1 || valid2; } if (!valid1) { var err = { keyword: 'anyOf', dataPath: (dataPath || '') + '.loader', schemaPath: '#/properties/loader/anyOf', params: {}, message: 'should match some schema in anyOf', schema: validate.schema.properties.loader.anyOf, parentSchema: validate.schema.properties.loader, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else { errors = errs__1; if (vErrors !== null) { if (errs__1) vErrors.length = errs__1; else vErrors = null; } } var valid1 = errors === errs_1; } var data1 = data.loaders; if (data1 !== undefined) { var errs_1 = errors; var errs__1 = errors; var valid1 = false; var errs_2 = errors; if (!refVal[8](data1, (dataPath || '') + '.loaders', data, 'loaders', rootData)) { if (vErrors === null) vErrors = refVal[8].errors; else vErrors = vErrors.concat(refVal[8].errors); errors = vErrors.length; } var valid2 = errors === errs_2; valid1 = valid1 || valid2; if (!valid1) { var err = { keyword: 'anyOf', dataPath: (dataPath || '') + '.loaders', schemaPath: '#/properties/loaders/anyOf', params: {}, message: 'should match some schema in anyOf', schema: validate.schema.properties.loaders.anyOf, parentSchema: validate.schema.properties.loaders, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else { errors = errs__1; if (vErrors !== null) { if (errs__1) vErrors.length = errs__1; else vErrors = null; } } var valid1 = errors === errs_1; } var data1 = data.oneOf; if (data1 !== undefined) { var errs_1 = errors; var errs__1 = errors; var valid1 = false; var errs_2 = errors; if (!refVal[4](data1, (dataPath || '') + '.oneOf', data, 'oneOf', rootData)) { if (vErrors === null) vErrors = refVal[4].errors; else vErrors = vErrors.concat(refVal[4].errors); errors = vErrors.length; } var valid2 = errors === errs_2; valid1 = valid1 || valid2; if (!valid1) { var err = { keyword: 'anyOf', dataPath: (dataPath || '') + '.oneOf', schemaPath: '#/properties/oneOf/anyOf', params: {}, message: 'should match some schema in anyOf', schema: validate.schema.properties.oneOf.anyOf, parentSchema: validate.schema.properties.oneOf, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else { errors = errs__1; if (vErrors !== null) { if (errs__1) vErrors.length = errs__1; else vErrors = null; } } var valid1 = errors === errs_1; } var data1 = data.options; if (data1 !== undefined) { var errs_1 = errors; var errs__1 = errors; var valid1 = false; var errs_2 = errors; var errs_3 = errors; var errs__3 = errors; var valid3 = false; var errs_4 = errors; if ((!data1 || typeof data1 !== "object" || Array.isArray(data1))) { var err = { keyword: 'type', dataPath: (dataPath || '') + '.options', schemaPath: '#/definitions/ruleSet-query/anyOf/0/type', params: { type: 'object' }, message: 'should be object', schema: refVal9.anyOf[0].type, parentSchema: refVal9.anyOf[0], data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid4 = errors === errs_4; valid3 = valid3 || valid4; if (!valid3) { var errs_4 = errors; if (typeof data1 !== "string") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.options', schemaPath: '#/definitions/ruleSet-query/anyOf/1/type', params: { type: 'string' }, message: 'should be string', schema: refVal9.anyOf[1].type, parentSchema: refVal9.anyOf[1], data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid4 = errors === errs_4; valid3 = valid3 || valid4; } if (!valid3) { var err = { keyword: 'anyOf', dataPath: (dataPath || '') + '.options', schemaPath: '#/definitions/ruleSet-query/anyOf', params: {}, message: 'should match some schema in anyOf', schema: refVal9.anyOf, parentSchema: refVal9, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else { errors = errs__3; if (vErrors !== null) { if (errs__3) vErrors.length = errs__3; else vErrors = null; } } var valid3 = errors === errs_3; var valid2 = errors === errs_2; valid1 = valid1 || valid2; if (!valid1) { var err = { keyword: 'anyOf', dataPath: (dataPath || '') + '.options', schemaPath: '#/properties/options/anyOf', params: {}, message: 'should match some schema in anyOf', schema: validate.schema.properties.options.anyOf, parentSchema: validate.schema.properties.options, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else { errors = errs__1; if (vErrors !== null) { if (errs__1) vErrors.length = errs__1; else vErrors = null; } } var valid1 = errors === errs_1; } var data1 = data.parser; if (data1 !== undefined) { var errs_1 = errors; if ((data1 && typeof data1 === "object" && !Array.isArray(data1))) { var errs__1 = errors; var valid2 = true; } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '.parser', schemaPath: '#/properties/parser/type', params: { type: 'object' }, message: 'should be object', schema: validate.schema.properties.parser.type, parentSchema: validate.schema.properties.parser, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } var data1 = data.query; if (data1 !== undefined) { var errs_1 = errors; var errs__1 = errors; var valid1 = false; var errs_2 = errors; var errs_3 = errors; var errs__3 = errors; var valid3 = false; var errs_4 = errors; if ((!data1 || typeof data1 !== "object" || Array.isArray(data1))) { var err = { keyword: 'type', dataPath: (dataPath || '') + '.query', schemaPath: '#/definitions/ruleSet-query/anyOf/0/type', params: { type: 'object' }, message: 'should be object', schema: refVal[9].anyOf[0].type, parentSchema: refVal[9].anyOf[0], data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid4 = errors === errs_4; valid3 = valid3 || valid4; if (!valid3) { var errs_4 = errors; if (typeof data1 !== "string") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.query', schemaPath: '#/definitions/ruleSet-query/anyOf/1/type', params: { type: 'string' }, message: 'should be string', schema: refVal[9].anyOf[1].type, parentSchema: refVal[9].anyOf[1], data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid4 = errors === errs_4; valid3 = valid3 || valid4; } if (!valid3) { var err = { keyword: 'anyOf', dataPath: (dataPath || '') + '.query', schemaPath: '#/definitions/ruleSet-query/anyOf', params: {}, message: 'should match some schema in anyOf', schema: refVal[9].anyOf, parentSchema: refVal[9], data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else { errors = errs__3; if (vErrors !== null) { if (errs__3) vErrors.length = errs__3; else vErrors = null; } } var valid3 = errors === errs_3; var valid2 = errors === errs_2; valid1 = valid1 || valid2; if (!valid1) { var err = { keyword: 'anyOf', dataPath: (dataPath || '') + '.query', schemaPath: '#/properties/query/anyOf', params: {}, message: 'should match some schema in anyOf', schema: validate.schema.properties.query.anyOf, parentSchema: validate.schema.properties.query, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else { errors = errs__1; if (vErrors !== null) { if (errs__1) vErrors.length = errs__1; else vErrors = null; } } var valid1 = errors === errs_1; } if (data.resource !== undefined) { var errs_1 = errors; var errs_2 = errors; if (!refVal[6](data.resource, (dataPath || '') + '.resource', data, 'resource', rootData)) { if (vErrors === null) vErrors = refVal[6].errors; else vErrors = vErrors.concat(refVal[6].errors); errors = vErrors.length; } var valid2 = errors === errs_2; var valid1 = errors === errs_1; } var data1 = data.resourceQuery; if (data1 !== undefined) { var errs_1 = errors; var errs__1 = errors; var valid1 = false; var errs_2 = errors; if (!refVal[6](data1, (dataPath || '') + '.resourceQuery', data, 'resourceQuery', rootData)) { if (vErrors === null) vErrors = refVal[6].errors; else vErrors = vErrors.concat(refVal[6].errors); errors = vErrors.length; } var valid2 = errors === errs_2; valid1 = valid1 || valid2; if (!valid1) { var err = { keyword: 'anyOf', dataPath: (dataPath || '') + '.resourceQuery', schemaPath: '#/properties/resourceQuery/anyOf', params: {}, message: 'should match some schema in anyOf', schema: validate.schema.properties.resourceQuery.anyOf, parentSchema: validate.schema.properties.resourceQuery, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else { errors = errs__1; if (vErrors !== null) { if (errs__1) vErrors.length = errs__1; else vErrors = null; } } var valid1 = errors === errs_1; } var data1 = data.compiler; if (data1 !== undefined) { var errs_1 = errors; var errs__1 = errors; var valid1 = false; var errs_2 = errors; if (!refVal[6](data1, (dataPath || '') + '.compiler', data, 'compiler', rootData)) { if (vErrors === null) vErrors = refVal[6].errors; else vErrors = vErrors.concat(refVal[6].errors); errors = vErrors.length; } var valid2 = errors === errs_2; valid1 = valid1 || valid2; if (!valid1) { var err = { keyword: 'anyOf', dataPath: (dataPath || '') + '.compiler', schemaPath: '#/properties/compiler/anyOf', params: {}, message: 'should match some schema in anyOf', schema: validate.schema.properties.compiler.anyOf, parentSchema: validate.schema.properties.compiler, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else { errors = errs__1; if (vErrors !== null) { if (errs__1) vErrors.length = errs__1; else vErrors = null; } } var valid1 = errors === errs_1; } var data1 = data.rules; if (data1 !== undefined) { var errs_1 = errors; var errs__1 = errors; var valid1 = false; var errs_2 = errors; if (!refVal[4](data1, (dataPath || '') + '.rules', data, 'rules', rootData)) { if (vErrors === null) vErrors = refVal[4].errors; else vErrors = vErrors.concat(refVal[4].errors); errors = vErrors.length; } var valid2 = errors === errs_2; valid1 = valid1 || valid2; if (!valid1) { var err = { keyword: 'anyOf', dataPath: (dataPath || '') + '.rules', schemaPath: '#/properties/rules/anyOf', params: {}, message: 'should match some schema in anyOf', schema: validate.schema.properties.rules.anyOf, parentSchema: validate.schema.properties.rules, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else { errors = errs__1; if (vErrors !== null) { if (errs__1) vErrors.length = errs__1; else vErrors = null; } } var valid1 = errors === errs_1; } if (data.test !== undefined) { var errs_1 = errors; var errs_2 = errors; if (!refVal[6](data.test, (dataPath || '') + '.test', data, 'test', rootData)) { if (vErrors === null) vErrors = refVal[6].errors; else vErrors = vErrors.concat(refVal[6].errors); errors = vErrors.length; } var valid2 = errors === errs_2; var valid1 = errors === errs_1; } var data1 = data.use; if (data1 !== undefined) { var errs_1 = errors; var errs__1 = errors; var valid1 = false; var errs_2 = errors; if (!refVal[8](data1, (dataPath || '') + '.use', data, 'use', rootData)) { if (vErrors === null) vErrors = refVal[8].errors; else vErrors = vErrors.concat(refVal[8].errors); errors = vErrors.length; } var valid2 = errors === errs_2; valid1 = valid1 || valid2; if (!valid1) { var err = { keyword: 'anyOf', dataPath: (dataPath || '') + '.use', schemaPath: '#/properties/use/anyOf', params: {}, message: 'should match some schema in anyOf', schema: validate.schema.properties.use.anyOf, parentSchema: validate.schema.properties.use, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else { errors = errs__1; if (vErrors !== null) { if (errs__1) vErrors.length = errs__1; else vErrors = null; } } var valid1 = errors === errs_1; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + "", schemaPath: '#/type', params: { type: 'object' }, message: 'should be object', schema: validate.schema.type, parentSchema: validate.schema, data: data }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; }
规则:
1.必须为对象
2.exclude、include、test调用refVal6
3.loader为非空字符串
4.loaders调用refVal8
5.options必须为对象
6.rules调用refVal4
refVal6
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
var validate = (function(data, dataPath, parentData, parentDataProperty, rootData) { 'use strict'; validate.errors = null; return true; });
规则:
无
refVal8
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
var validate = (function(data, dataPath, parentData, parentDataProperty, rootData) { 'use strict'; validate.errors = null; return true; });
规则:
无
refVal10
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
if ((data && typeof data === "object" && !Array.isArray(data))) { var errs__0 = errors; var valid1 = true; for (var key0 in data) { var isAdditional0 = !(false || validate.schema.properties[key0]); if (isAdditional0) { valid1 = false; var err = { keyword: 'additionalProperties', dataPath: (dataPath || '') + "", schemaPath: '#/additionalProperties', params: { additionalProperty: '' + key0 + '' }, message: 'should NOT have additional properties', schema: false, parentSchema: validate.schema, data: data }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } var data1 = data.auxiliaryComment; if (data1 !== undefined) { var errs_1 = errors; var errs__1 = errors; var valid1 = false; var errs_2 = errors; if (typeof data1 !== "string") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.auxiliaryComment', schemaPath: '#/properties/auxiliaryComment/anyOf/0/type', params: { type: 'string' }, message: 'should be string', schema: validate.schema.properties.auxiliaryComment.anyOf[0].type, parentSchema: validate.schema.properties.auxiliaryComment.anyOf[0], data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid2 = errors === errs_2; valid1 = valid1 || valid2; if (!valid1) { var errs_2 = errors; if ((data1 && typeof data1 === "object" && !Array.isArray(data1))) { var errs__2 = errors; var valid3 = true; for (var key2 in data1) { var isAdditional2 = !(false || key2 == 'amd' || key2 == 'commonjs' || key2 == 'commonjs2' || key2 == 'root'); if (isAdditional2) { valid3 = false; var err = { keyword: 'additionalProperties', dataPath: (dataPath || '') + '.auxiliaryComment', schemaPath: '#/properties/auxiliaryComment/anyOf/1/additionalProperties', params: { additionalProperty: '' + key2 + '' }, message: 'should NOT have additional properties', schema: false, parentSchema: validate.schema.properties.auxiliaryComment.anyOf[1], data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } var data2 = data1.amd; if (data2 !== undefined) { var errs_3 = errors; if (typeof data2 !== "string") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.auxiliaryComment.amd', schemaPath: '#/properties/auxiliaryComment/anyOf/1/properties/amd/type', params: { type: 'string' }, message: 'should be string', schema: validate.schema.properties.auxiliaryComment.anyOf[1].properties.amd.type, parentSchema: validate.schema.properties.auxiliaryComment.anyOf[1].properties.amd, data: data2 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid3 = errors === errs_3; } var data2 = data1.commonjs; if (data2 !== undefined) { var errs_3 = errors; if (typeof data2 !== "string") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.auxiliaryComment.commonjs', schemaPath: '#/properties/auxiliaryComment/anyOf/1/properties/commonjs/type', params: { type: 'string' }, message: 'should be string', schema: validate.schema.properties.auxiliaryComment.anyOf[1].properties.commonjs.type, parentSchema: validate.schema.properties.auxiliaryComment.anyOf[1].properties.commonjs, data: data2 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid3 = errors === errs_3; } var data2 = data1.commonjs2; if (data2 !== undefined) { var errs_3 = errors; if (typeof data2 !== "string") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.auxiliaryComment.commonjs2', schemaPath: '#/properties/auxiliaryComment/anyOf/1/properties/commonjs2/type', params: { type: 'string' }, message: 'should be string', schema: validate.schema.properties.auxiliaryComment.anyOf[1].properties.commonjs2.type, parentSchema: validate.schema.properties.auxiliaryComment.anyOf[1].properties.commonjs2, data: data2 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid3 = errors === errs_3; } var data2 = data1.root; if (data2 !== undefined) { var errs_3 = errors; if (typeof data2 !== "string") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.auxiliaryComment.root', schemaPath: '#/properties/auxiliaryComment/anyOf/1/properties/root/type', params: { type: 'string' }, message: 'should be string', schema: validate.schema.properties.auxiliaryComment.anyOf[1].properties.root.type, parentSchema: validate.schema.properties.auxiliaryComment.anyOf[1].properties.root, data: data2 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid3 = errors === errs_3; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '.auxiliaryComment', schemaPath: '#/properties/auxiliaryComment/anyOf/1/type', params: { type: 'object' }, message: 'should be object', schema: validate.schema.properties.auxiliaryComment.anyOf[1].type, parentSchema: validate.schema.properties.auxiliaryComment.anyOf[1], data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid2 = errors === errs_2; valid1 = valid1 || valid2; } if (!valid1) { var err = { keyword: 'anyOf', dataPath: (dataPath || '') + '.auxiliaryComment', schemaPath: '#/properties/auxiliaryComment/anyOf', params: {}, message: 'should match some schema in anyOf', schema: validate.schema.properties.auxiliaryComment.anyOf, parentSchema: validate.schema.properties.auxiliaryComment, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else { errors = errs__1; if (vErrors !== null) { if (errs__1) vErrors.length = errs__1; else vErrors = null; } } var valid1 = errors === errs_1; } var data1 = data.chunkFilename; if (data1 !== undefined) { var errs_1 = errors; if (typeof data1 !== "string") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.chunkFilename', schemaPath: '#/properties/chunkFilename/type', params: { type: 'string' }, message: 'should be string', schema: validate.schema.properties.chunkFilename.type, parentSchema: validate.schema.properties.chunkFilename, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } var data1 = data.crossOriginLoading; if (data1 !== undefined) { var errs_1 = errors; var schema1 = validate.schema.properties.crossOriginLoading.enum; var valid1; valid1 = false; for (var i1 = 0; i1 < schema1.length; i1++) if (equal(data1, schema1[i1])) { valid1 = true; break; } if (!valid1) { var err = { keyword: 'enum', dataPath: (dataPath || '') + '.crossOriginLoading', schemaPath: '#/properties/crossOriginLoading/enum', params: { allowedValues: schema1 }, message: 'should be equal to one of the allowed values', schema: validate.schema.properties.crossOriginLoading.enum, parentSchema: validate.schema.properties.crossOriginLoading, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } var data1 = data.chunkLoadTimeout; if (data1 !== undefined) { var errs_1 = errors; if (typeof data1 !== "number") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.chunkLoadTimeout', schemaPath: '#/properties/chunkLoadTimeout/type', params: { type: 'number' }, message: 'should be number', schema: validate.schema.properties.chunkLoadTimeout.type, parentSchema: validate.schema.properties.chunkLoadTimeout, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } if (data.devtoolFallbackModuleFilenameTemplate !== undefined) { var errs_1 = errors; var valid1 = errors === errs_1; } var data1 = data.devtoolLineToLine; if (data1 !== undefined) { var errs_1 = errors; var errs__1 = errors; var valid1 = false; var errs_2 = errors; if (typeof data1 !== "boolean") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.devtoolLineToLine', schemaPath: '#/properties/devtoolLineToLine/anyOf/0/type', params: { type: 'boolean' }, message: 'should be boolean', schema: validate.schema.properties.devtoolLineToLine.anyOf[0].type, parentSchema: validate.schema.properties.devtoolLineToLine.anyOf[0], data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid2 = errors === errs_2; valid1 = valid1 || valid2; if (!valid1) { var errs_2 = errors; if ((!data1 || typeof data1 !== "object" || Array.isArray(data1))) { var err = { keyword: 'type', dataPath: (dataPath || '') + '.devtoolLineToLine', schemaPath: '#/properties/devtoolLineToLine/anyOf/1/type', params: { type: 'object' }, message: 'should be object', schema: validate.schema.properties.devtoolLineToLine.anyOf[1].type, parentSchema: validate.schema.properties.devtoolLineToLine.anyOf[1], data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid2 = errors === errs_2; valid1 = valid1 || valid2; } if (!valid1) { var err = { keyword: 'anyOf', dataPath: (dataPath || '') + '.devtoolLineToLine', schemaPath: '#/properties/devtoolLineToLine/anyOf', params: {}, message: 'should match some schema in anyOf', schema: validate.schema.properties.devtoolLineToLine.anyOf, parentSchema: validate.schema.properties.devtoolLineToLine, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else { errors = errs__1; if (vErrors !== null) { if (errs__1) vErrors.length = errs__1; else vErrors = null; } } var valid1 = errors === errs_1; } if (data.devtoolModuleFilenameTemplate !== undefined) { var errs_1 = errors; var valid1 = errors === errs_1; } var data1 = data.filename; if (data1 !== undefined) { var errs_1 = errors; if (typeof data1 !== "string") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.filename', schemaPath: '#/properties/filename/type', params: { type: 'string' }, message: 'should be string', schema: validate.schema.properties.filename.type, parentSchema: validate.schema.properties.filename, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } var data1 = data.hashDigest; if (data1 !== undefined) { var errs_1 = errors; var schema1 = validate.schema.properties.hashDigest.enum; var valid1; valid1 = false; for (var i1 = 0; i1 < schema1.length; i1++) if (equal(data1, schema1[i1])) { valid1 = true; break; } if (!valid1) { var err = { keyword: 'enum', dataPath: (dataPath || '') + '.hashDigest', schemaPath: '#/properties/hashDigest/enum', params: { allowedValues: schema1 }, message: 'should be equal to one of the allowed values', schema: validate.schema.properties.hashDigest.enum, parentSchema: validate.schema.properties.hashDigest, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } var data1 = data.hashDigestLength; if (data1 !== undefined) { var errs_1 = errors; if (typeof data1 === "number") { if (data1 < 1 || data1 !== data1) { var err = { keyword: 'minimum', dataPath: (dataPath || '') + '.hashDigestLength', schemaPath: '#/properties/hashDigestLength/minimum', params: { comparison: '>=', limit: 1, exclusive: false }, message: 'should be >= 1', schema: 1, parentSchema: validate.schema.properties.hashDigestLength, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '.hashDigestLength', schemaPath: '#/properties/hashDigestLength/type', params: { type: 'number' }, message: 'should be number', schema: validate.schema.properties.hashDigestLength.type, parentSchema: validate.schema.properties.hashDigestLength, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } var data1 = data.hashFunction; if (data1 !== undefined) { var errs_1 = errors; if (typeof data1 === "string") { if (ucs2length(data1) < 1) { var err = { keyword: 'minLength', dataPath: (dataPath || '') + '.hashFunction', schemaPath: '#/properties/hashFunction/minLength', params: { limit: 1 }, message: 'should NOT be shorter than 1 characters', schema: 1, parentSchema: validate.schema.properties.hashFunction, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '.hashFunction', schemaPath: '#/properties/hashFunction/type', params: { type: 'string' }, message: 'should be string', schema: validate.schema.properties.hashFunction.type, parentSchema: validate.schema.properties.hashFunction, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } var data1 = data.hashSalt; if (data1 !== undefined) { var errs_1 = errors; if (typeof data1 === "string") { if (ucs2length(data1) < 1) { var err = { keyword: 'minLength', dataPath: (dataPath || '') + '.hashSalt', schemaPath: '#/properties/hashSalt/minLength', params: { limit: 1 }, message: 'should NOT be shorter than 1 characters', schema: 1, parentSchema: validate.schema.properties.hashSalt, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '.hashSalt', schemaPath: '#/properties/hashSalt/type', params: { type: 'string' }, message: 'should be string', schema: validate.schema.properties.hashSalt.type, parentSchema: validate.schema.properties.hashSalt, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } var data1 = data.hotUpdateChunkFilename; if (data1 !== undefined) { var errs_1 = errors; if (typeof data1 !== "string") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.hotUpdateChunkFilename', schemaPath: '#/properties/hotUpdateChunkFilename/type', params: { type: 'string' }, message: 'should be string', schema: validate.schema.properties.hotUpdateChunkFilename.type, parentSchema: validate.schema.properties.hotUpdateChunkFilename, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } var data1 = data.hotUpdateFunction; if (data1 !== undefined) { var errs_1 = errors; if (typeof data1 !== "string") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.hotUpdateFunction', schemaPath: '#/properties/hotUpdateFunction/type', params: { type: 'string' }, message: 'should be string', schema: validate.schema.properties.hotUpdateFunction.type, parentSchema: validate.schema.properties.hotUpdateFunction, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } var data1 = data.hotUpdateMainFilename; if (data1 !== undefined) { var errs_1 = errors; if (typeof data1 !== "string") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.hotUpdateMainFilename', schemaPath: '#/properties/hotUpdateMainFilename/type', params: { type: 'string' }, message: 'should be string', schema: validate.schema.properties.hotUpdateMainFilename.type, parentSchema: validate.schema.properties.hotUpdateMainFilename, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } var data1 = data.jsonpFunction; if (data1 !== undefined) { var errs_1 = errors; if (typeof data1 !== "string") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.jsonpFunction', schemaPath: '#/properties/jsonpFunction/type', params: { type: 'string' }, message: 'should be string', schema: validate.schema.properties.jsonpFunction.type, parentSchema: validate.schema.properties.jsonpFunction, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } var data1 = data.library; if (data1 !== undefined) { var errs_1 = errors; var errs__1 = errors; var valid1 = false; var errs_2 = errors; if (typeof data1 !== "string") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.library', schemaPath: '#/properties/library/anyOf/0/type', params: { type: 'string' }, message: 'should be string', schema: validate.schema.properties.library.anyOf[0].type, parentSchema: validate.schema.properties.library.anyOf[0], data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid2 = errors === errs_2; valid1 = valid1 || valid2; if (!valid1) { var errs_2 = errors; if (Array.isArray(data1)) { var errs__2 = errors; var valid2; for (var i2 = 0; i2 < data1.length; i2++) { var data2 = data1[i2]; var errs_3 = errors; if (typeof data2 !== "string") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.library[' + i2 + ']', schemaPath: '#/properties/library/anyOf/1/items/type', params: { type: 'string' }, message: 'should be string', schema: validate.schema.properties.library.anyOf[1].items.type, parentSchema: validate.schema.properties.library.anyOf[1].items, data: data2 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid3 = errors === errs_3; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '.library', schemaPath: '#/properties/library/anyOf/1/type', params: { type: 'array' }, message: 'should be array', schema: validate.schema.properties.library.anyOf[1].type, parentSchema: validate.schema.properties.library.anyOf[1], data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid2 = errors === errs_2; valid1 = valid1 || valid2; if (!valid1) { var errs_2 = errors; if ((data1 && typeof data1 === "object" && !Array.isArray(data1))) { var errs__2 = errors; var valid3 = true; for (var key2 in data1) { var isAdditional2 = !(false || key2 == 'root' || key2 == 'amd' || key2 == 'commonjs'); if (isAdditional2) { valid3 = false; var err = { keyword: 'additionalProperties', dataPath: (dataPath || '') + '.library', schemaPath: '#/properties/library/anyOf/2/additionalProperties', params: { additionalProperty: '' + key2 + '' }, message: 'should NOT have additional properties', schema: false, parentSchema: validate.schema.properties.library.anyOf[2], data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } var data2 = data1.root; if (data2 !== undefined) { var errs_3 = errors; if (typeof data2 !== "string") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.library.root', schemaPath: '#/properties/library/anyOf/2/properties/root/type', params: { type: 'string' }, message: 'should be string', schema: validate.schema.properties.library.anyOf[2].properties.root.type, parentSchema: validate.schema.properties.library.anyOf[2].properties.root, data: data2 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid3 = errors === errs_3; } var data2 = data1.amd; if (data2 !== undefined) { var errs_3 = errors; if (typeof data2 !== "string") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.library.amd', schemaPath: '#/properties/library/anyOf/2/properties/amd/type', params: { type: 'string' }, message: 'should be string', schema: validate.schema.properties.library.anyOf[2].properties.amd.type, parentSchema: validate.schema.properties.library.anyOf[2].properties.amd, data: data2 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid3 = errors === errs_3; } var data2 = data1.commonjs; if (data2 !== undefined) { var errs_3 = errors; if (typeof data2 !== "string") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.library.commonjs', schemaPath: '#/properties/library/anyOf/2/properties/commonjs/type', params: { type: 'string' }, message: 'should be string', schema: validate.schema.properties.library.anyOf[2].properties.commonjs.type, parentSchema: validate.schema.properties.library.anyOf[2].properties.commonjs, data: data2 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid3 = errors === errs_3; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '.library', schemaPath: '#/properties/library/anyOf/2/type', params: { type: 'object' }, message: 'should be object', schema: validate.schema.properties.library.anyOf[2].type, parentSchema: validate.schema.properties.library.anyOf[2], data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid2 = errors === errs_2; valid1 = valid1 || valid2; } } if (!valid1) { var err = { keyword: 'anyOf', dataPath: (dataPath || '') + '.library', schemaPath: '#/properties/library/anyOf', params: {}, message: 'should match some schema in anyOf', schema: validate.schema.properties.library.anyOf, parentSchema: validate.schema.properties.library, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else { errors = errs__1; if (vErrors !== null) { if (errs__1) vErrors.length = errs__1; else vErrors = null; } } var valid1 = errors === errs_1; } var data1 = data.libraryTarget; if (data1 !== undefined) { var errs_1 = errors; var schema1 = validate.schema.properties.libraryTarget.enum; var valid1; valid1 = false; for (var i1 = 0; i1 < schema1.length; i1++) if (equal(data1, schema1[i1])) { valid1 = true; break; } if (!valid1) { var err = { keyword: 'enum', dataPath: (dataPath || '') + '.libraryTarget', schemaPath: '#/properties/libraryTarget/enum', params: { allowedValues: schema1 }, message: 'should be equal to one of the allowed values', schema: validate.schema.properties.libraryTarget.enum, parentSchema: validate.schema.properties.libraryTarget, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } var data1 = data.libraryExport; if (data1 !== undefined) { var errs_1 = errors; var errs__1 = errors; var valid1 = false; var errs_2 = errors; if (typeof data1 !== "string") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.libraryExport', schemaPath: '#/properties/libraryExport/anyOf/0/type', params: { type: 'string' }, message: 'should be string', schema: validate.schema.properties.libraryExport.anyOf[0].type, parentSchema: validate.schema.properties.libraryExport.anyOf[0], data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid2 = errors === errs_2; valid1 = valid1 || valid2; if (!valid1) { var errs_2 = errors; var errs_3 = errors; if (Array.isArray(data1)) { var errs__3 = errors; var valid3; for (var i3 = 0; i3 < data1.length; i3++) { var data2 = data1[i3]; var errs_4 = errors; if (typeof data2 === "string") { if (ucs2length(data2) < 1) { var err = { keyword: 'minLength', dataPath: (dataPath || '') + '.libraryExport[' + i3 + ']', schemaPath: '#/definitions/common.arrayOfStringValues/items/minLength', params: { limit: 1 }, message: 'should NOT be shorter than 1 characters', schema: 1, parentSchema: refVal11.items, data: data2 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '.libraryExport[' + i3 + ']', schemaPath: '#/definitions/common.arrayOfStringValues/items/type', params: { type: 'string' }, message: 'should be string', schema: refVal11.items.type, parentSchema: refVal11.items, data: data2 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid4 = errors === errs_4; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '.libraryExport', schemaPath: '#/definitions/common.arrayOfStringValues/type', params: { type: 'array' }, message: 'should be array', schema: refVal11.type, parentSchema: refVal11, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid3 = errors === errs_3; var valid2 = errors === errs_2; valid1 = valid1 || valid2; } if (!valid1) { var err = { keyword: 'anyOf', dataPath: (dataPath || '') + '.libraryExport', schemaPath: '#/properties/libraryExport/anyOf', params: {}, message: 'should match some schema in anyOf', schema: validate.schema.properties.libraryExport.anyOf, parentSchema: validate.schema.properties.libraryExport, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else { errors = errs__1; if (vErrors !== null) { if (errs__1) vErrors.length = errs__1; else vErrors = null; } } var valid1 = errors === errs_1; } var data1 = data.path; if (data1 !== undefined) { var errs_1 = errors; if (typeof data1 !== "string") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.path', schemaPath: '#/properties/path/type', params: { type: 'string' }, message: 'should be string', schema: validate.schema.properties.path.type, parentSchema: validate.schema.properties.path, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } var data1 = data.pathinfo; if (data1 !== undefined) { var errs_1 = errors; if (typeof data1 !== "boolean") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.pathinfo', schemaPath: '#/properties/pathinfo/type', params: { type: 'boolean' }, message: 'should be boolean', schema: validate.schema.properties.pathinfo.type, parentSchema: validate.schema.properties.pathinfo, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } var data1 = data.publicPath; if (data1 !== undefined) { var errs_1 = errors; if (typeof data1 !== "string") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.publicPath', schemaPath: '#/properties/publicPath/type', params: { type: 'string' }, message: 'should be string', schema: validate.schema.properties.publicPath.type, parentSchema: validate.schema.properties.publicPath, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } var data1 = data.sourceMapFilename; if (data1 !== undefined) { var errs_1 = errors; if (typeof data1 !== "string") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.sourceMapFilename', schemaPath: '#/properties/sourceMapFilename/type', params: { type: 'string' }, message: 'should be string', schema: validate.schema.properties.sourceMapFilename.type, parentSchema: validate.schema.properties.sourceMapFilename, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } var data1 = data.sourcePrefix; if (data1 !== undefined) { var errs_1 = errors; if (typeof data1 !== "string") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.sourcePrefix', schemaPath: '#/properties/sourcePrefix/type', params: { type: 'string' }, message: 'should be string', schema: validate.schema.properties.sourcePrefix.type, parentSchema: validate.schema.properties.sourcePrefix, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } var data1 = data.strictModuleExceptionHandling; if (data1 !== undefined) { var errs_1 = errors; if (typeof data1 !== "boolean") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.strictModuleExceptionHandling', schemaPath: '#/properties/strictModuleExceptionHandling/type', params: { type: 'boolean' }, message: 'should be boolean', schema: validate.schema.properties.strictModuleExceptionHandling.type, parentSchema: validate.schema.properties.strictModuleExceptionHandling, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } var data1 = data.umdNamedDefine; if (data1 !== undefined) { var errs_1 = errors; if (typeof data1 !== "boolean") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.umdNamedDefine', schemaPath: '#/properties/umdNamedDefine/type', params: { type: 'boolean' }, message: 'should be boolean', schema: validate.schema.properties.umdNamedDefine.type, parentSchema: validate.schema.properties.umdNamedDefine, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + "", schemaPath: '#/type', params: { type: 'object' }, message: 'should be object', schema: validate.schema.type, parentSchema: validate.schema, data: data }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; }
规则:
1.额外键检测
2.chunkFilename、filename、path、publicPath必须为字符串
3.crossOriginLoading必须是false、"anonymous"、"use-credentials"之一
4.chunkLoadTimeout必须是数字
refVal12
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
if ((data && typeof data === "object" && !Array.isArray(data))) { var errs__0 = errors; var valid1 = true; for (var key0 in data) { var isAdditional0 = !(false || validate.schema.properties[key0]); if (isAdditional0) { valid1 = false; var err = { keyword: 'additionalProperties', dataPath: (dataPath || '') + "", schemaPath: '#/additionalProperties', params: { additionalProperty: '' + key0 + '' }, message: 'should NOT have additional properties', schema: false, parentSchema: validate.schema, data: data }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } var data1 = data.alias; if (data1 !== undefined) { var errs_1 = errors; var errs__1 = errors; var valid1 = false; var errs_2 = errors; if ((data1 && typeof data1 === "object" && !Array.isArray(data1))) { var errs__2 = errors; var valid3 = true; for (var key2 in data1) { var data2 = data1[key2]; var errs_3 = errors; if (typeof data2 !== "string") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.alias[\'' + key2 + '\']', schemaPath: '#/properties/alias/anyOf/0/additionalProperties/type', params: { type: 'string' }, message: 'should be string', schema: validate.schema.properties.alias.anyOf[0].additionalProperties.type, parentSchema: validate.schema.properties.alias.anyOf[0].additionalProperties, data: data2 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid3 = errors === errs_3; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '.alias', schemaPath: '#/properties/alias/anyOf/0/type', params: { type: 'object' }, message: 'should be object', schema: validate.schema.properties.alias.anyOf[0].type, parentSchema: validate.schema.properties.alias.anyOf[0], data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid2 = errors === errs_2; valid1 = valid1 || valid2; if (!valid1) { var errs_2 = errors; if (Array.isArray(data1)) { var errs__2 = errors; var valid2; for (var i2 = 0; i2 < data1.length; i2++) { var data2 = data1[i2]; var errs_3 = errors; if ((data2 && typeof data2 === "object" && !Array.isArray(data2))) { var errs__3 = errors; var valid4 = true; for (var key3 in data2) { var isAdditional3 = !(false || key3 == 'alias' || key3 == 'name' || key3 == 'onlyModule'); if (isAdditional3) { valid4 = false; var err = { keyword: 'additionalProperties', dataPath: (dataPath || '') + '.alias[' + i2 + ']', schemaPath: '#/properties/alias/anyOf/1/items/additionalProperties', params: { additionalProperty: '' + key3 + '' }, message: 'should NOT have additional properties', schema: false, parentSchema: validate.schema.properties.alias.anyOf[1].items, data: data2 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } var data3 = data2.alias; if (data3 !== undefined) { var errs_4 = errors; if (typeof data3 !== "string") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.alias[' + i2 + '].alias', schemaPath: '#/properties/alias/anyOf/1/items/properties/alias/type', params: { type: 'string' }, message: 'should be string', schema: validate.schema.properties.alias.anyOf[1].items.properties.alias.type, parentSchema: validate.schema.properties.alias.anyOf[1].items.properties.alias, data: data3 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid4 = errors === errs_4; } var data3 = data2.name; if (data3 !== undefined) { var errs_4 = errors; if (typeof data3 !== "string") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.alias[' + i2 + '].name', schemaPath: '#/properties/alias/anyOf/1/items/properties/name/type', params: { type: 'string' }, message: 'should be string', schema: validate.schema.properties.alias.anyOf[1].items.properties.name.type, parentSchema: validate.schema.properties.alias.anyOf[1].items.properties.name, data: data3 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid4 = errors === errs_4; } var data3 = data2.onlyModule; if (data3 !== undefined) { var errs_4 = errors; if (typeof data3 !== "boolean") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.alias[' + i2 + '].onlyModule', schemaPath: '#/properties/alias/anyOf/1/items/properties/onlyModule/type', params: { type: 'boolean' }, message: 'should be boolean', schema: validate.schema.properties.alias.anyOf[1].items.properties.onlyModule.type, parentSchema: validate.schema.properties.alias.anyOf[1].items.properties.onlyModule, data: data3 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid4 = errors === errs_4; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '.alias[' + i2 + ']', schemaPath: '#/properties/alias/anyOf/1/items/type', params: { type: 'object' }, message: 'should be object', schema: validate.schema.properties.alias.anyOf[1].items.type, parentSchema: validate.schema.properties.alias.anyOf[1].items, data: data2 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid3 = errors === errs_3; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '.alias', schemaPath: '#/properties/alias/anyOf/1/type', params: { type: 'array' }, message: 'should be array', schema: validate.schema.properties.alias.anyOf[1].type, parentSchema: validate.schema.properties.alias.anyOf[1], data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid2 = errors === errs_2; valid1 = valid1 || valid2; } if (!valid1) { var err = { keyword: 'anyOf', dataPath: (dataPath || '') + '.alias', schemaPath: '#/properties/alias/anyOf', params: {}, message: 'should match some schema in anyOf', schema: validate.schema.properties.alias.anyOf, parentSchema: validate.schema.properties.alias, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else { errors = errs__1; if (vErrors !== null) { if (errs__1) vErrors.length = errs__1; else vErrors = null; } } var valid1 = errors === errs_1; } var data1 = data.aliasFields; if (data1 !== undefined) { var errs_1 = errors; var errs__1 = errors; var valid1 = false; var errs_2 = errors; var errs_3 = errors; if (Array.isArray(data1)) { var errs__3 = errors; var valid3; for (var i3 = 0; i3 < data1.length; i3++) { var data2 = data1[i3]; var errs_4 = errors; var errs__4 = errors; var valid4 = false; var errs_5 = errors; if (typeof data2 === "string") { if (ucs2length(data2) < 1) { var err = { keyword: 'minLength', dataPath: (dataPath || '') + '.aliasFields[' + i3 + ']', schemaPath: '#/definitions/common.arrayOfStringOrStringArrayValues/items/anyOf/0/minLength', params: { limit: 1 }, message: 'should NOT be shorter than 1 characters', schema: 1, parentSchema: refVal13.items.anyOf[0], data: data2 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '.aliasFields[' + i3 + ']', schemaPath: '#/definitions/common.arrayOfStringOrStringArrayValues/items/anyOf/0/type', params: { type: 'string' }, message: 'should be string', schema: refVal13.items.anyOf[0].type, parentSchema: refVal13.items.anyOf[0], data: data2 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid5 = errors === errs_5; valid4 = valid4 || valid5; if (!valid4) { var errs_5 = errors; if (Array.isArray(data2)) { var errs__5 = errors; var valid5; for (var i5 = 0; i5 < data2.length; i5++) { var data3 = data2[i5]; var errs_6 = errors; if (typeof data3 === "string") { if (ucs2length(data3) < 1) { var err = { keyword: 'minLength', dataPath: (dataPath || '') + '.aliasFields[' + i3 + '][' + i5 + ']', schemaPath: '#/definitions/common.arrayOfStringOrStringArrayValues/items/anyOf/1/items/minLength', params: { limit: 1 }, message: 'should NOT be shorter than 1 characters', schema: 1, parentSchema: refVal13.items.anyOf[1].items, data: data3 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '.aliasFields[' + i3 + '][' + i5 + ']', schemaPath: '#/definitions/common.arrayOfStringOrStringArrayValues/items/anyOf/1/items/type', params: { type: 'string' }, message: 'should be string', schema: refVal13.items.anyOf[1].items.type, parentSchema: refVal13.items.anyOf[1].items, data: data3 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid6 = errors === errs_6; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '.aliasFields[' + i3 + ']', schemaPath: '#/definitions/common.arrayOfStringOrStringArrayValues/items/anyOf/1/type', params: { type: 'array' }, message: 'should be array', schema: refVal13.items.anyOf[1].type, parentSchema: refVal13.items.anyOf[1], data: data2 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid5 = errors === errs_5; valid4 = valid4 || valid5; } if (!valid4) { var err = { keyword: 'anyOf', dataPath: (dataPath || '') + '.aliasFields[' + i3 + ']', schemaPath: '#/definitions/common.arrayOfStringOrStringArrayValues/items/anyOf', params: {}, message: 'should match some schema in anyOf', schema: refVal13.items.anyOf, parentSchema: refVal13.items, data: data2 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else { errors = errs__4; if (vErrors !== null) { if (errs__4) vErrors.length = errs__4; else vErrors = null; } } var valid4 = errors === errs_4; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '.aliasFields', schemaPath: '#/definitions/common.arrayOfStringOrStringArrayValues/type', params: { type: 'array' }, message: 'should be array', schema: refVal13.type, parentSchema: refVal13, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid3 = errors === errs_3; var valid2 = errors === errs_2; valid1 = valid1 || valid2; if (!valid1) { var err = { keyword: 'anyOf', dataPath: (dataPath || '') + '.aliasFields', schemaPath: '#/properties/aliasFields/anyOf', params: {}, message: 'should match some schema in anyOf', schema: validate.schema.properties.aliasFields.anyOf, parentSchema: validate.schema.properties.aliasFields, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else { errors = errs__1; if (vErrors !== null) { if (errs__1) vErrors.length = errs__1; else vErrors = null; } } var valid1 = errors === errs_1; } var data1 = data.cacheWithContext; if (data1 !== undefined) { var errs_1 = errors; if (typeof data1 !== "boolean") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.cacheWithContext', schemaPath: '#/properties/cacheWithContext/type', params: { type: 'boolean' }, message: 'should be boolean', schema: validate.schema.properties.cacheWithContext.type, parentSchema: validate.schema.properties.cacheWithContext, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } var data1 = data.descriptionFiles; if (data1 !== undefined) { var errs_1 = errors; var errs__1 = errors; var valid1 = false; var errs_2 = errors; var errs_3 = errors; if (Array.isArray(data1)) { var errs__3 = errors; var valid3; for (var i3 = 0; i3 < data1.length; i3++) { var data2 = data1[i3]; var errs_4 = errors; if (typeof data2 === "string") { if (ucs2length(data2) < 1) { var err = { keyword: 'minLength', dataPath: (dataPath || '') + '.descriptionFiles[' + i3 + ']', schemaPath: '#/definitions/common.arrayOfStringValues/items/minLength', params: { limit: 1 }, message: 'should NOT be shorter than 1 characters', schema: 1, parentSchema: refVal[11].items, data: data2 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '.descriptionFiles[' + i3 + ']', schemaPath: '#/definitions/common.arrayOfStringValues/items/type', params: { type: 'string' }, message: 'should be string', schema: refVal[11].items.type, parentSchema: refVal[11].items, data: data2 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid4 = errors === errs_4; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '.descriptionFiles', schemaPath: '#/definitions/common.arrayOfStringValues/type', params: { type: 'array' }, message: 'should be array', schema: refVal[11].type, parentSchema: refVal[11], data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid3 = errors === errs_3; var valid2 = errors === errs_2; valid1 = valid1 || valid2; if (!valid1) { var err = { keyword: 'anyOf', dataPath: (dataPath || '') + '.descriptionFiles', schemaPath: '#/properties/descriptionFiles/anyOf', params: {}, message: 'should match some schema in anyOf', schema: validate.schema.properties.descriptionFiles.anyOf, parentSchema: validate.schema.properties.descriptionFiles, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else { errors = errs__1; if (vErrors !== null) { if (errs__1) vErrors.length = errs__1; else vErrors = null; } } var valid1 = errors === errs_1; } var data1 = data.enforceExtension; if (data1 !== undefined) { var errs_1 = errors; if (typeof data1 !== "boolean") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.enforceExtension', schemaPath: '#/properties/enforceExtension/type', params: { type: 'boolean' }, message: 'should be boolean', schema: validate.schema.properties.enforceExtension.type, parentSchema: validate.schema.properties.enforceExtension, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } var data1 = data.enforceModuleExtension; if (data1 !== undefined) { var errs_1 = errors; if (typeof data1 !== "boolean") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.enforceModuleExtension', schemaPath: '#/properties/enforceModuleExtension/type', params: { type: 'boolean' }, message: 'should be boolean', schema: validate.schema.properties.enforceModuleExtension.type, parentSchema: validate.schema.properties.enforceModuleExtension, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } var data1 = data.extensions; if (data1 !== undefined) { var errs_1 = errors; var errs__1 = errors; var valid1 = false; var errs_2 = errors; var errs_3 = errors; if (Array.isArray(data1)) { var errs__3 = errors; var valid3; for (var i3 = 0; i3 < data1.length; i3++) { var data2 = data1[i3]; var errs_4 = errors; if (typeof data2 === "string") { if (ucs2length(data2) < 1) { var err = { keyword: 'minLength', dataPath: (dataPath || '') + '.extensions[' + i3 + ']', schemaPath: '#/definitions/common.arrayOfStringValues/items/minLength', params: { limit: 1 }, message: 'should NOT be shorter than 1 characters', schema: 1, parentSchema: refVal[11].items, data: data2 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '.extensions[' + i3 + ']', schemaPath: '#/definitions/common.arrayOfStringValues/items/type', params: { type: 'string' }, message: 'should be string', schema: refVal[11].items.type, parentSchema: refVal[11].items, data: data2 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid4 = errors === errs_4; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '.extensions', schemaPath: '#/definitions/common.arrayOfStringValues/type', params: { type: 'array' }, message: 'should be array', schema: refVal[11].type, parentSchema: refVal[11], data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid3 = errors === errs_3; var valid2 = errors === errs_2; valid1 = valid1 || valid2; if (!valid1) { var err = { keyword: 'anyOf', dataPath: (dataPath || '') + '.extensions', schemaPath: '#/properties/extensions/anyOf', params: {}, message: 'should match some schema in anyOf', schema: validate.schema.properties.extensions.anyOf, parentSchema: validate.schema.properties.extensions, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else { errors = errs__1; if (vErrors !== null) { if (errs__1) vErrors.length = errs__1; else vErrors = null; } } var valid1 = errors === errs_1; } var data1 = data.mainFields; if (data1 !== undefined) { var errs_1 = errors; var errs__1 = errors; var valid1 = false; var errs_2 = errors; var errs_3 = errors; if (Array.isArray(data1)) { var errs__3 = errors; var valid3; for (var i3 = 0; i3 < data1.length; i3++) { var data2 = data1[i3]; var errs_4 = errors; var errs__4 = errors; var valid4 = false; var errs_5 = errors; if (typeof data2 === "string") { if (ucs2length(data2) < 1) { var err = { keyword: 'minLength', dataPath: (dataPath || '') + '.mainFields[' + i3 + ']', schemaPath: '#/definitions/common.arrayOfStringOrStringArrayValues/items/anyOf/0/minLength', params: { limit: 1 }, message: 'should NOT be shorter than 1 characters', schema: 1, parentSchema: refVal[13].items.anyOf[0], data: data2 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '.mainFields[' + i3 + ']', schemaPath: '#/definitions/common.arrayOfStringOrStringArrayValues/items/anyOf/0/type', params: { type: 'string' }, message: 'should be string', schema: refVal[13].items.anyOf[0].type, parentSchema: refVal[13].items.anyOf[0], data: data2 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid5 = errors === errs_5; valid4 = valid4 || valid5; if (!valid4) { var errs_5 = errors; if (Array.isArray(data2)) { var errs__5 = errors; var valid5; for (var i5 = 0; i5 < data2.length; i5++) { var data3 = data2[i5]; var errs_6 = errors; if (typeof data3 === "string") { if (ucs2length(data3) < 1) { var err = { keyword: 'minLength', dataPath: (dataPath || '') + '.mainFields[' + i3 + '][' + i5 + ']', schemaPath: '#/definitions/common.arrayOfStringOrStringArrayValues/items/anyOf/1/items/minLength', params: { limit: 1 }, message: 'should NOT be shorter than 1 characters', schema: 1, parentSchema: refVal[13].items.anyOf[1].items, data: data3 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '.mainFields[' + i3 + '][' + i5 + ']', schemaPath: '#/definitions/common.arrayOfStringOrStringArrayValues/items/anyOf/1/items/type', params: { type: 'string' }, message: 'should be string', schema: refVal[13].items.anyOf[1].items.type, parentSchema: refVal[13].items.anyOf[1].items, data: data3 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid6 = errors === errs_6; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '.mainFields[' + i3 + ']', schemaPath: '#/definitions/common.arrayOfStringOrStringArrayValues/items/anyOf/1/type', params: { type: 'array' }, message: 'should be array', schema: refVal[13].items.anyOf[1].type, parentSchema: refVal[13].items.anyOf[1], data: data2 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid5 = errors === errs_5; valid4 = valid4 || valid5; } if (!valid4) { var err = { keyword: 'anyOf', dataPath: (dataPath || '') + '.mainFields[' + i3 + ']', schemaPath: '#/definitions/common.arrayOfStringOrStringArrayValues/items/anyOf', params: {}, message: 'should match some schema in anyOf', schema: refVal[13].items.anyOf, parentSchema: refVal[13].items, data: data2 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else { errors = errs__4; if (vErrors !== null) { if (errs__4) vErrors.length = errs__4; else vErrors = null; } } var valid4 = errors === errs_4; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '.mainFields', schemaPath: '#/definitions/common.arrayOfStringOrStringArrayValues/type', params: { type: 'array' }, message: 'should be array', schema: refVal[13].type, parentSchema: refVal[13], data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid3 = errors === errs_3; var valid2 = errors === errs_2; valid1 = valid1 || valid2; if (!valid1) { var err = { keyword: 'anyOf', dataPath: (dataPath || '') + '.mainFields', schemaPath: '#/properties/mainFields/anyOf', params: {}, message: 'should match some schema in anyOf', schema: validate.schema.properties.mainFields.anyOf, parentSchema: validate.schema.properties.mainFields, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else { errors = errs__1; if (vErrors !== null) { if (errs__1) vErrors.length = errs__1; else vErrors = null; } } var valid1 = errors === errs_1; } var data1 = data.mainFiles; if (data1 !== undefined) { var errs_1 = errors; var errs__1 = errors; var valid1 = false; var errs_2 = errors; var errs_3 = errors; if (Array.isArray(data1)) { var errs__3 = errors; var valid3; for (var i3 = 0; i3 < data1.length; i3++) { var data2 = data1[i3]; var errs_4 = errors; if (typeof data2 === "string") { if (ucs2length(data2) < 1) { var err = { keyword: 'minLength', dataPath: (dataPath || '') + '.mainFiles[' + i3 + ']', schemaPath: '#/definitions/common.arrayOfStringValues/items/minLength', params: { limit: 1 }, message: 'should NOT be shorter than 1 characters', schema: 1, parentSchema: refVal[11].items, data: data2 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '.mainFiles[' + i3 + ']', schemaPath: '#/definitions/common.arrayOfStringValues/items/type', params: { type: 'string' }, message: 'should be string', schema: refVal[11].items.type, parentSchema: refVal[11].items, data: data2 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid4 = errors === errs_4; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '.mainFiles', schemaPath: '#/definitions/common.arrayOfStringValues/type', params: { type: 'array' }, message: 'should be array', schema: refVal[11].type, parentSchema: refVal[11], data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid3 = errors === errs_3; var valid2 = errors === errs_2; valid1 = valid1 || valid2; if (!valid1) { var err = { keyword: 'anyOf', dataPath: (dataPath || '') + '.mainFiles', schemaPath: '#/properties/mainFiles/anyOf', params: {}, message: 'should match some schema in anyOf', schema: validate.schema.properties.mainFiles.anyOf, parentSchema: validate.schema.properties.mainFiles, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else { errors = errs__1; if (vErrors !== null) { if (errs__1) vErrors.length = errs__1; else vErrors = null; } } var valid1 = errors === errs_1; } var data1 = data.moduleExtensions; if (data1 !== undefined) { var errs_1 = errors; var errs__1 = errors; var valid1 = false; var errs_2 = errors; var errs_3 = errors; if (Array.isArray(data1)) { var errs__3 = errors; var valid3; for (var i3 = 0; i3 < data1.length; i3++) { var data2 = data1[i3]; var errs_4 = errors; if (typeof data2 === "string") { if (ucs2length(data2) < 1) { var err = { keyword: 'minLength', dataPath: (dataPath || '') + '.moduleExtensions[' + i3 + ']', schemaPath: '#/definitions/common.arrayOfStringValues/items/minLength', params: { limit: 1 }, message: 'should NOT be shorter than 1 characters', schema: 1, parentSchema: refVal[11].items, data: data2 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '.moduleExtensions[' + i3 + ']', schemaPath: '#/definitions/common.arrayOfStringValues/items/type', params: { type: 'string' }, message: 'should be string', schema: refVal[11].items.type, parentSchema: refVal[11].items, data: data2 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid4 = errors === errs_4; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '.moduleExtensions', schemaPath: '#/definitions/common.arrayOfStringValues/type', params: { type: 'array' }, message: 'should be array', schema: refVal[11].type, parentSchema: refVal[11], data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid3 = errors === errs_3; var valid2 = errors === errs_2; valid1 = valid1 || valid2; if (!valid1) { var err = { keyword: 'anyOf', dataPath: (dataPath || '') + '.moduleExtensions', schemaPath: '#/properties/moduleExtensions/anyOf', params: {}, message: 'should match some schema in anyOf', schema: validate.schema.properties.moduleExtensions.anyOf, parentSchema: validate.schema.properties.moduleExtensions, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else { errors = errs__1; if (vErrors !== null) { if (errs__1) vErrors.length = errs__1; else vErrors = null; } } var valid1 = errors === errs_1; } var data1 = data.modules; if (data1 !== undefined) { var errs_1 = errors; var errs__1 = errors; var valid1 = false; var errs_2 = errors; var errs_3 = errors; if (Array.isArray(data1)) { var errs__3 = errors; var valid3; for (var i3 = 0; i3 < data1.length; i3++) { var data2 = data1[i3]; var errs_4 = errors; if (typeof data2 === "string") { if (ucs2length(data2) < 1) { var err = { keyword: 'minLength', dataPath: (dataPath || '') + '.modules[' + i3 + ']', schemaPath: '#/definitions/common.arrayOfStringValues/items/minLength', params: { limit: 1 }, message: 'should NOT be shorter than 1 characters', schema: 1, parentSchema: refVal[11].items, data: data2 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '.modules[' + i3 + ']', schemaPath: '#/definitions/common.arrayOfStringValues/items/type', params: { type: 'string' }, message: 'should be string', schema: refVal[11].items.type, parentSchema: refVal[11].items, data: data2 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid4 = errors === errs_4; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '.modules', schemaPath: '#/definitions/common.arrayOfStringValues/type', params: { type: 'array' }, message: 'should be array', schema: refVal[11].type, parentSchema: refVal[11], data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid3 = errors === errs_3; var valid2 = errors === errs_2; valid1 = valid1 || valid2; if (!valid1) { var err = { keyword: 'anyOf', dataPath: (dataPath || '') + '.modules', schemaPath: '#/properties/modules/anyOf', params: {}, message: 'should match some schema in anyOf', schema: validate.schema.properties.modules.anyOf, parentSchema: validate.schema.properties.modules, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else { errors = errs__1; if (vErrors !== null) { if (errs__1) vErrors.length = errs__1; else vErrors = null; } } var valid1 = errors === errs_1; } var data1 = data.plugins; if (data1 !== undefined) { var errs_1 = errors; if (!Array.isArray(data1)) { var err = { keyword: 'type', dataPath: (dataPath || '') + '.plugins', schemaPath: '#/properties/plugins/type', params: { type: 'array' }, message: 'should be array', schema: validate.schema.properties.plugins.type, parentSchema: validate.schema.properties.plugins, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } var data1 = data.symlinks; if (data1 !== undefined) { var errs_1 = errors; if (typeof data1 !== "boolean") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.symlinks', schemaPath: '#/properties/symlinks/type', params: { type: 'boolean' }, message: 'should be boolean', schema: validate.schema.properties.symlinks.type, parentSchema: validate.schema.properties.symlinks, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } var data1 = data.unsafeCache; if (data1 !== undefined) { var errs_1 = errors; var errs__1 = errors; var valid1 = false; var errs_2 = errors; if (typeof data1 !== "boolean") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.unsafeCache', schemaPath: '#/properties/unsafeCache/anyOf/0/type', params: { type: 'boolean' }, message: 'should be boolean', schema: validate.schema.properties.unsafeCache.anyOf[0].type, parentSchema: validate.schema.properties.unsafeCache.anyOf[0], data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid2 = errors === errs_2; valid1 = valid1 || valid2; if (!valid1) { var errs_2 = errors; if ((data1 && typeof data1 === "object" && !Array.isArray(data1))) { var errs__2 = errors; var valid3 = true; } else { var err = { keyword: 'type', dataPath: (dataPath || '') + '.unsafeCache', schemaPath: '#/properties/unsafeCache/anyOf/1/type', params: { type: 'object' }, message: 'should be object', schema: validate.schema.properties.unsafeCache.anyOf[1].type, parentSchema: validate.schema.properties.unsafeCache.anyOf[1], data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid2 = errors === errs_2; valid1 = valid1 || valid2; } if (!valid1) { var err = { keyword: 'anyOf', dataPath: (dataPath || '') + '.unsafeCache', schemaPath: '#/properties/unsafeCache/anyOf', params: {}, message: 'should match some schema in anyOf', schema: validate.schema.properties.unsafeCache.anyOf, parentSchema: validate.schema.properties.unsafeCache, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else { errors = errs__1; if (vErrors !== null) { if (errs__1) vErrors.length = errs__1; else vErrors = null; } } var valid1 = errors === errs_1; } var data1 = data.useSyncFileSystemCalls; if (data1 !== undefined) { var errs_1 = errors; if (typeof data1 !== "boolean") { var err = { keyword: 'type', dataPath: (dataPath || '') + '.useSyncFileSystemCalls', schemaPath: '#/properties/useSyncFileSystemCalls/type', params: { type: 'boolean' }, message: 'should be boolean', schema: validate.schema.properties.useSyncFileSystemCalls.type, parentSchema: validate.schema.properties.useSyncFileSystemCalls, data: data1 }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } var valid1 = errors === errs_1; } } else { var err = { keyword: 'type', dataPath: (dataPath || '') + "", schemaPath: '#/type', params: { type: 'object' }, message: 'should be object', schema: validate.schema.type, parentSchema: validate.schema, data: data }; if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; }
规则:
1.必须是对象
2.额外键检测
3.alias可以是对象、数组
4.alias为数组时,数组元素必须是对象,且键必须为alias、name、onlyModule之一
5.键为alias、name的值必须是字符串,键为onlyModule的值必须为布尔值
6.extensions必须是数组,数组元素必须是非空字符串
由于可选参数过于庞大,所以的代码只展示常用的属性校验,剔除大量陌生属性,不然实在是太长了!!!!!!!!
1、rootObject
首先是根对象的检测:
// 对象判断 if ((data && typeof data === "object" && !Array.isArray(data))) { var errs__0 = errors; var valid1 = true; // 遍历key for (var key0 in data) { // 这里检测属性中是否有检测范围外的键 var isAdditional0 = !(false || validate.schema.properties[key0]); if (isAdditional0) { valid1 = false; // 生成报错信息 var err = { keyword: 'additionalProperties', dataPath: (dataPath || '') + "", schemaPath: '#/additionalProperties', params: { additionalProperty: '' + key0 + '' }, message: 'should NOT have additional properties', schema: false, parentSchema: validate.schema, data: data }; // 第一次产生错误时初始化vErrors为数组 if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } } else{ /*添加错误*/ }
这里还有一个validate.schema.properties对象,通过翻源码找到了定义:
一句话概括就是,在根对象中会检测是否有多余的键,可以测试一下:
const validate = ajv.compile(json); const valid = validate({ "unexpectedKey":0, }); console.log(validate.errors);
输出内容如下:
2、devServer
var data1 = data.devServer; // 存在键就继续检测 // 由于是非必须项 所以没有也不报错 if (data1 !== undefined) { var errs_1 = errors; // 检测是是对象 if ((!data1 || typeof data1 !== "object" || Array.isArray(data1))) { // 生成报错信息 } // 如果检测后总错误数量不变 说明通过 var valid1 = errors === errs_1; }
一句话概括:如果存在该键则必须为对象。
3、devtool
var data1 = data.devtool; if (data1 !== undefined) { var valid1 = false; // 标记初始值 var errs_1 = errors; // 用于记录错误 var errs__1 = errors; var errs_2 = errors; // 判断字符串 if (typeof data1 !== "string") { /*添加错误*/ } var valid2 = errors === errs_2; valid1 = valid1 || valid2; // 如果上面报错进入这里 if (!valid1) { var errs_2 = errors; // 获取枚举数组 var schema2 = validate.schema.properties.devtool.anyOf[1].enum; var valid2; valid2 = false; // 遍历判断是否匹配元素 for (var i2 = 0; i2 < schema2.length; i2++) if (equal(data1, schema2[i2])) { valid2 = true; break; } if (!valid2) { /*添加错误*/ } var valid2 = errors === errs_2; valid1 = valid1 || valid2; } // 即非字符串也不是枚举数组元素 if (!valid1) { /*添加错误*/ } // 如果有一个符合就回滚错误数量 验证通过 else { errors = errs__1; if (vErrors !== null) { if (errs__1) vErrors.length = errs__1; else vErrors = null; } } var valid1 = errors === errs_1; }
其中枚举数组如图:
一句话概括:devtool可以为字符串或者false。
4、entry
var data1 = data.entry; // 检测键是否存在 if (data1 === undefined) { /*添加错误*/ } else { var errs_1 = errors; var errs__1 = errors; var valid1 = false; var errs_2 = errors; // refVal1 if (!refVal1(data1, (dataPath || '') + '.entry', data, 'entry', rootData)) { /*添加错误*/ } var valid2 = errors === errs_2; valid1 = valid1 || valid2; if (!valid1) { /*添加错误*/ } // 通过 else { errors = errs__1; if (vErrors !== null) { if (errs__1) vErrors.length = errs__1; else vErrors = null; } } var valid1 = errors === errs_1; }
调用了refVal1校验器,不愿意看上面的代码可以直接看规则。
5、module => refVal3
6、output => refVal10
7、plugins
var data1 = data.plugins; if (data1 !== undefined) { var errs_1 = errors; // 必须是数组 if (!Array.isArray(data1)) { /**/ } var valid1 = errors === errs_1; }
8、resolve => refVal12
真是又臭又长,再返回validate校验函数后,会进行校验 :
const valid = validate(options); return valid ? [] : filterErrors(validate.errors);
根据是否有错误返回true或false,由于在检测的时候已经对错误进行了收集,所以可以直接从 validate.errors 获取,这里的过滤就不看了,恶心的不行。
然后会返回到webpack主函数:
const webpackOptionsValidationErrors = validateSchema(webpackOptionsSchema, options); if (webpackOptionsValidationErrors.length) { throw new WebpackOptionsValidationError(webpackOptionsValidationErrors); }
根据 webpackOptionsValidationErrors 的长度来判断是否有错误,有错则抛出并中止编译。
完事!