diff options
| author | littleblack111 <littleblack11111@gmail.com> | 2023-11-05 17:16:09 +0800 |
|---|---|---|
| committer | littleblack111 <littleblack11111@gmail.com> | 2023-11-05 17:16:09 +0800 |
| commit | d1d9f00b1bd660842addf5e6b1d1b64c852a9eea (patch) | |
| tree | 60fb37ae73a1109d95301de5ec9b61b5726a4b61 /node_modules/schema-utils/dist/validate.js | |
| parent | 7c85166c4cbdd862fc4252007d2df5befcbc2a58 (diff) | |
added hover prefixer
Diffstat (limited to 'node_modules/schema-utils/dist/validate.js')
| -rw-r--r-- | node_modules/schema-utils/dist/validate.js | 258 |
1 files changed, 258 insertions, 0 deletions
diff --git a/node_modules/schema-utils/dist/validate.js b/node_modules/schema-utils/dist/validate.js new file mode 100644 index 00000000..cb091450 --- /dev/null +++ b/node_modules/schema-utils/dist/validate.js @@ -0,0 +1,258 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.validate = validate; +exports.enableValidation = enableValidation; +exports.disableValidation = disableValidation; +exports.needValidate = needValidate; +Object.defineProperty(exports, "ValidationError", { + enumerable: true, + get: function () { + return _ValidationError.default; + } +}); + +var _absolutePath = _interopRequireDefault(require("./keywords/absolutePath")); + +var _undefinedAsNull = _interopRequireDefault(require("./keywords/undefinedAsNull")); + +var _ValidationError = _interopRequireDefault(require("./ValidationError")); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * @template T + * @param fn {(function(): any) | undefined} + * @returns {function(): T} + */ +const memoize = fn => { + let cache = false; + /** @type {T} */ + + let result; + return () => { + if (cache) { + return result; + } + + result = + /** @type {function(): any} */ + fn(); + cache = true; // Allow to clean up memory for fn + // and all dependent resources + // eslint-disable-next-line no-undefined, no-param-reassign + + fn = undefined; + return result; + }; +}; + +const getAjv = memoize(() => { + // Use CommonJS require for ajv libs so TypeScript consumers aren't locked into esModuleInterop (see #110). + // eslint-disable-next-line global-require + const Ajv = require("ajv"); // eslint-disable-next-line global-require + + + const ajvKeywords = require("ajv-keywords"); + + const ajv = new Ajv({ + allErrors: true, + verbose: true, + $data: true + }); + ajvKeywords(ajv, ["instanceof", "formatMinimum", "formatMaximum", "patternRequired"]); // Custom keywords + + (0, _absolutePath.default)(ajv); + (0, _undefinedAsNull.default)(ajv); + return ajv; +}); +/** @typedef {import("json-schema").JSONSchema4} JSONSchema4 */ + +/** @typedef {import("json-schema").JSONSchema6} JSONSchema6 */ + +/** @typedef {import("json-schema").JSONSchema7} JSONSchema7 */ + +/** @typedef {import("ajv").ErrorObject} ErrorObject */ + +/** @typedef {import("ajv").ValidateFunction} ValidateFunction */ + +/** + * @typedef {Object} Extend + * @property {number=} formatMinimum + * @property {number=} formatMaximum + * @property {boolean=} formatExclusiveMinimum + * @property {boolean=} formatExclusiveMaximum + * @property {string=} link + * @property {boolean=} undefinedAsNull + */ + +/** @typedef {(JSONSchema4 | JSONSchema6 | JSONSchema7) & Extend} Schema */ + +/** @typedef {ErrorObject & { children?: Array<ErrorObject>}} SchemaUtilErrorObject */ + +/** + * @callback PostFormatter + * @param {string} formattedError + * @param {SchemaUtilErrorObject} error + * @returns {string} + */ + +/** + * @typedef {Object} ValidationErrorConfiguration + * @property {string=} name + * @property {string=} baseDataPath + * @property {PostFormatter=} postFormatter + */ + +/** + * @param {SchemaUtilErrorObject} error + * @param {number} idx + * @returns {SchemaUtilErrorObject} + */ + +function applyPrefix(error, idx) { + // eslint-disable-next-line no-param-reassign + error.dataPath = `[${idx}]${error.dataPath}`; + + if (error.children) { + error.children.forEach(err => applyPrefix(err, idx)); + } + + return error; +} + +let skipValidation = false; // We use `process.env.SKIP_VALIDATION` because you can have multiple `schema-utils` with different version, +// so we want to disable it globally, `process.env` doesn't supported by browsers, so we have the local `skipValidation` variables +// Enable validation + +function enableValidation() { + skipValidation = false; // Disable validation for any versions + + if (process && process.env) { + process.env.SKIP_VALIDATION = "n"; + } +} // Disable validation + + +function disableValidation() { + skipValidation = true; + + if (process && process.env) { + process.env.SKIP_VALIDATION = "y"; + } +} // Check if we need to confirm + + +function needValidate() { + if (skipValidation) { + return false; + } + + if (process && process.env && process.env.SKIP_VALIDATION) { + const value = process.env.SKIP_VALIDATION.trim(); + + if (/^(?:y|yes|true|1|on)$/i.test(value)) { + return false; + } + + if (/^(?:n|no|false|0|off)$/i.test(value)) { + return true; + } + } + + return true; +} +/** + * @param {Schema} schema + * @param {Array<object> | object} options + * @param {ValidationErrorConfiguration=} configuration + * @returns {void} + */ + + +function validate(schema, options, configuration) { + if (!needValidate()) { + return; + } + + let errors = []; + + if (Array.isArray(options)) { + for (let i = 0; i <= options.length - 1; i++) { + errors.push(...validateObject(schema, options[i]).map(err => applyPrefix(err, i))); + } + } else { + errors = validateObject(schema, options); + } + + if (errors.length > 0) { + throw new _ValidationError.default(errors, schema, configuration); + } +} +/** @typedef {WeakMap<Schema, ValidateFunction>} */ + + +const schemaCache = new WeakMap(); +/** + * @param {Schema} schema + * @param {Array<object> | object} options + * @returns {Array<SchemaUtilErrorObject>} + */ + +function validateObject(schema, options) { + let compiledSchema = schemaCache.get(schema); + + if (!compiledSchema) { + compiledSchema = getAjv().compile(schema); + schemaCache.set(schema, compiledSchema); + } + + const valid = compiledSchema(options); + if (valid) return []; + return compiledSchema.errors ? filterErrors(compiledSchema.errors) : []; +} +/** + * @param {Array<ErrorObject>} errors + * @returns {Array<SchemaUtilErrorObject>} + */ + + +function filterErrors(errors) { + /** @type {Array<SchemaUtilErrorObject>} */ + let newErrors = []; + + for (const error of + /** @type {Array<SchemaUtilErrorObject>} */ + errors) { + const { + dataPath + } = error; + /** @type {Array<SchemaUtilErrorObject>} */ + + let children = []; + newErrors = newErrors.filter(oldError => { + if (oldError.dataPath.includes(dataPath)) { + if (oldError.children) { + children = children.concat(oldError.children.slice(0)); + } // eslint-disable-next-line no-undefined, no-param-reassign + + + oldError.children = undefined; + children.push(oldError); + return false; + } + + return true; + }); + + if (children.length) { + error.children = children; + } + + newErrors.push(error); + } + + return newErrors; +}
\ No newline at end of file |
