177 lines
5.7 KiB
JavaScript
177 lines
5.7 KiB
JavaScript
(function (global, factory) {
|
|
if (typeof exports === 'object' && typeof module !== 'undefined') {
|
|
var jsonlint = require('./jsonlint')
|
|
var Ajv = require('ajv')
|
|
// eslint-disable-next-line no-inner-declarations
|
|
function requireSchemaDraft (environment) {
|
|
return require('ajv/lib/refs/' + environment + '.json')
|
|
}
|
|
factory(exports, Ajv, jsonlint, requireSchemaDraft)
|
|
// eslint-disable-next-line no-undef
|
|
} else if (typeof define === 'function' && define.amd) {
|
|
// eslint-disable-next-line no-undef
|
|
define('jsonlint-validator', ['exports', 'ajv', 'jsonlint', 'jsonlint-schema-drafts'],
|
|
function (exports, jsonlint, Ajv, schemaDrafts) {
|
|
function requireSchemaDraft (environment) {
|
|
return schemaDrafts[environment]
|
|
}
|
|
factory(exports, Ajv, jsonlint, requireSchemaDraft)
|
|
})
|
|
} else {
|
|
// eslint-disable-next-line no-undef
|
|
global = global || self
|
|
var requireSchemaDraft = function (environment) {
|
|
return global.jsonlintSchemaDrafts[environment]
|
|
}
|
|
factory(global.jsonlintValidator = {}, global.Ajv, global.jsonlint, requireSchemaDraft)
|
|
}
|
|
}(this, function (exports, Ajv, jsonlint, requireSchemaDraft) {
|
|
'use strict'
|
|
|
|
function addErrorLocation (problem, input, tokens, dataPath) {
|
|
var token = tokens.find(function (token) {
|
|
return dataPath === jsonlint.pathToPointer(token.path)
|
|
})
|
|
if (token) {
|
|
var location = token.location.start
|
|
var offset = location.offset
|
|
var line = location.line
|
|
var column = location.column
|
|
var texts = jsonlint.getErrorTexts(problem.reason, input, offset, line, column)
|
|
problem.message = texts.message
|
|
problem.excerpt = texts.excerpt
|
|
if (texts.pointer) {
|
|
problem.pointer = texts.pointer
|
|
problem.location = {
|
|
start: {
|
|
column: column,
|
|
line: line,
|
|
offset: offset
|
|
}
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
}
|
|
|
|
function errorToProblem (error, input, tokens) {
|
|
var dataPath = error.dataPath
|
|
var schemaPath = error.schemaPath
|
|
var reason = (dataPath || '/') + ' ' + error.message + '; see ' + schemaPath
|
|
var problem = {
|
|
reason: reason,
|
|
dataPath: dataPath,
|
|
schemaPath: schemaPath
|
|
}
|
|
if (!addErrorLocation(problem, input, tokens, dataPath)) {
|
|
problem.message = reason
|
|
}
|
|
return problem
|
|
}
|
|
|
|
function createError (errors, data, input, options) {
|
|
if (!input) {
|
|
input = JSON.stringify(data, undefined, 2)
|
|
}
|
|
if (!options) {
|
|
options = {}
|
|
}
|
|
Object.assign(options, {
|
|
tokenLocations: true,
|
|
tokenPaths: true
|
|
})
|
|
var tokens = jsonlint.tokenize(input, options)
|
|
// var problems = errors.map(function (error) {
|
|
// return errorToProblem(error, input, tokens)
|
|
// })
|
|
// var message = problems
|
|
// .map(function (problem) {
|
|
// return problem.message
|
|
// })
|
|
// .join('\n')
|
|
var problem = errorToProblem(errors[0], input, tokens)
|
|
var error = new SyntaxError(problem.message)
|
|
Object.assign(error, problem)
|
|
return error
|
|
}
|
|
|
|
function createAjv (environment) {
|
|
var ajvOptions = { jsonPointers: true }
|
|
var ajv
|
|
if (!environment) {
|
|
ajvOptions.schemaId = 'auto'
|
|
ajv = new Ajv(ajvOptions)
|
|
ajv.addMetaSchema(requireSchemaDraft('json-schema-draft-04'))
|
|
ajv.addMetaSchema(requireSchemaDraft('json-schema-draft-06'))
|
|
} else if (environment === 'json-schema-draft-07') {
|
|
ajv = new Ajv(ajvOptions)
|
|
} else if (environment === 'json-schema-draft-06') {
|
|
ajv = new Ajv(ajvOptions)
|
|
ajv.addMetaSchema(requireSchemaDraft('json-schema-draft-06'))
|
|
} else if (environment === 'json-schema-draft-04') {
|
|
ajvOptions.schemaId = 'id'
|
|
ajv = new Ajv(ajvOptions)
|
|
ajv.addMetaSchema(requireSchemaDraft('json-schema-draft-04'))
|
|
} else {
|
|
throw new RangeError('Unsupported environment for the JSON schema validation: "' +
|
|
environment + '".')
|
|
}
|
|
return ajv
|
|
}
|
|
|
|
function compileSchema (ajv, schema, parseOptions) {
|
|
var parsed
|
|
try {
|
|
parsed = jsonlint.parse(schema, parseOptions)
|
|
} catch (error) {
|
|
error.message = 'Parsing the JSON schema failed.\n' + error.message
|
|
throw error
|
|
}
|
|
try {
|
|
return ajv.compile(parsed)
|
|
} catch (originalError) {
|
|
var errors = ajv.errors
|
|
var betterError = errors
|
|
? createError(errors, parsed, schema, parseOptions)
|
|
: originalError
|
|
betterError.message = 'Compiling the JSON schema failed.\n' + betterError.message
|
|
throw betterError
|
|
}
|
|
}
|
|
|
|
function compile (schema, environment) {
|
|
var options = {}
|
|
if (typeof environment === 'object' && !(environment instanceof String)) {
|
|
options = environment
|
|
environment = options.environment
|
|
}
|
|
var ajv = createAjv(environment)
|
|
var parseOptions = {
|
|
mode: options.mode,
|
|
ignoreComments: options.ignoreComments,
|
|
ignoreTrailingCommas: options.ignoreTrailingCommas,
|
|
allowSingleQuotedStrings: options.allowSingleQuotedStrings,
|
|
allowDuplicateObjectKeys: options.allowDuplicateObjectKeys
|
|
}
|
|
var validate = compileSchema(ajv, schema, parseOptions)
|
|
return function (data, input, options) {
|
|
if (typeof data === 'string' || data instanceof String) {
|
|
options = input
|
|
input = data
|
|
data = jsonlint.parse(input, options)
|
|
} else if (!(typeof input === 'string' || input instanceof String)) {
|
|
options = input
|
|
input = undefined
|
|
}
|
|
if (validate(data)) {
|
|
return data
|
|
}
|
|
throw createError(validate.errors, data, input, options)
|
|
}
|
|
}
|
|
|
|
exports.compile = compile
|
|
|
|
Object.defineProperty(exports, '__esModule', { value: true })
|
|
}))
|