UNPKG

12.3 kBSource Map (JSON)View Raw
1{"version":3,"file":"json-schema-validate.js","sourceRoot":"","sources":["../../../../src/utils/json-schema-validate.ts"],"names":[],"mappings":"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","sourcesContent":["// ==LICENSE-BEGIN==\n// Copyright 2017 European Digital Reading Lab. All rights reserved.\n// Licensed to the Readium Foundation under one or more contributor license agreements.\n// Use of this source code is governed by a BSD-style license\n// that can be found in the LICENSE file exposed on Github (readium) in the project repository.\n// ==LICENSE-END==\n\nimport Ajv from \"ajv\";\nimport addFormats from \"ajv-formats\";\nimport * as debug_ from \"debug\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\n\nconst debug = debug_(\"r2:streamer#utils/json-schema-validate\");\n\nconst _cachedJsonSchemas: any = {}; // any[] | undefined;\n\nexport interface JsonSchemaValidationError {\n ajvSchemaPath: string;\n ajvDataPath: string;\n ajvMessage: string;\n jsonPath: string;\n}\n\nexport function jsonSchemaValidate(\n jsonSchemasRootpath: string,\n jsonSchemasNames: string[],\n jsonToValidate: any): JsonSchemaValidationError[] | undefined {\n\n try {\n // tslint:disable-next-line:max-line-length\n // \"^((?<grandfathered>(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE)|(art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))|((?<language>([A-Za-z]{2,3}(-(?<extlang>[A-Za-z]{3}(-[A-Za-z]{3}){0,2}))?)|[A-Za-z]{4}|[A-Za-z]{5,8})(-(?<script>[A-Za-z]{4}))?(-(?<region>[A-Za-z]{2}|[0-9]{3}))?(-(?<variant>[A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3}))*(-(?<extension>[0-9A-WY-Za-wy-z](-[A-Za-z0-9]{2,8})+))*(-(?<privateUse>x(-[A-Za-z0-9]{1,8})+))?)|(?<privateUse2>x(-[A-Za-z0-9]{1,8})+))$\"\n // https://github.com/sebinsua/ietf-language-tag-regex\n // tslint:disable-next-line:max-line-length\n // https://stackoverflow.com/questions/7035825/regular-expression-for-a-language-tag-as-defined-by-bcp47/7036171#7036171\n //\n // https://regex101.com\n // PCRE PHP okay, but fail with others (JAVASCRIPT, PYTHON, GO)\n // because of named capturing groups (e.g. ?<grandfathered>)\n // => simply remove for Javascript RegExp,\n // or optionally call ajv.addFormat() with https://github.com/slevithan/xregexp \"regexp\" replacement?\n //\n // const regular = \"(art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang)\";\n // tslint:disable-next-line:max-line-length\n // const irregular = \"(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE)\";\n // const grandfathered = \"(?<grandfathered>\" + irregular + \"|\" + regular + \")\";\n // const privateUse = \"(?<privateUse>x(-[A-Za-z0-9]{1,8})+)\";\n // const privateUse2 = \"(?<privateUse2>x(-[A-Za-z0-9]{1,8})+)\";\n // const singleton = \"[0-9A-WY-Za-wy-z]\";\n // const extension = \"(?<extension>\" + singleton + \"(-[A-Za-z0-9]{2,8})+)\";\n // const variant = \"(?<variant>[A-Za-z0-9]{5,8}|[0-9][A-Za-z0-9]{3})\";\n // const region = \"(?<region>[A-Za-z]{2}|[0-9]{3})\";\n // const script = \"(?<script>[A-Za-z]{4})\";\n // const extlang = \"(?<extlang>[A-Za-z]{3}(-[A-Za-z]{3}){0,2})\";\n // const language = \"(?<language>([A-Za-z]{2,3}(-\" + extlang + \")?)|[A-Za-z]{4}|[A-Za-z]{5,8})\";\n // tslint:disable-next-line:max-line-length\n // const langtag = \"(\" + language + \"(-\" + script + \")?\" + \"(-\" + region + \")?\" + \"(-\" + variant + \")*\" + \"(-\" + extension + \")*\" + \"(-\" + privateUse + \")?\" + \")\";\n // const languageTag = \"(\" + grandfathered + \"|\" + langtag + \"|\" + privateUse2 + \")\";\n // // const bcp47RegEx = languageTag + \"g\";\n // const bcp47RegEx = \"^\" + languageTag + \"$\";\n // debug(bcp47RegEx);\n\n for (const jsonSchemaName of jsonSchemasNames) {\n const jsonSchemaName_ = jsonSchemaName.replace(/\\//g, path.sep);\n const jsonSchemaPath = path.join(jsonSchemasRootpath, jsonSchemaName_ + \".schema.json\");\n\n if (_cachedJsonSchemas[jsonSchemaPath]) {\n continue;\n }\n\n if (!fs.existsSync(jsonSchemaPath)) {\n debug(\"Skipping JSON SCHEMAS (not found): \" + jsonSchemaPath);\n // _jsonSchemas = []; // to skip future attempts?\n return undefined;\n }\n let jsonSchemaStr = fs.readFileSync(jsonSchemaPath, { encoding: \"utf8\" });\n if (!jsonSchemaStr) {\n debug(\"File load fail: \" + jsonSchemaPath);\n return undefined;\n }\n // Javascript named capturing groups (syntax works in PCRE PHP regular expressions)\n jsonSchemaStr = jsonSchemaStr.replace(/\\?<grandfathered>/g, \"\");\n jsonSchemaStr = jsonSchemaStr.replace(/\\?<privateUse>/g, \"\");\n jsonSchemaStr = jsonSchemaStr.replace(/\\?<privateUse2>/g, \"\");\n jsonSchemaStr = jsonSchemaStr.replace(/\\?<extension>/g, \"\");\n jsonSchemaStr = jsonSchemaStr.replace(/\\?<variant>/g, \"\");\n jsonSchemaStr = jsonSchemaStr.replace(/\\?<script>/g, \"\");\n jsonSchemaStr = jsonSchemaStr.replace(/\\?<extlang>/g, \"\");\n jsonSchemaStr = jsonSchemaStr.replace(/\\?<language>/g, \"\");\n jsonSchemaStr = jsonSchemaStr.replace(/\\?<region>/g, \"\");\n // debug(jsonSchemaStr);\n if (jsonSchemaStr.indexOf(\"?<\") >= 0) {\n debug(\"REGEX WARNING!!\");\n // process.exit(-1);\n return undefined;\n }\n const jsonSchema = global.JSON.parse(jsonSchemaStr);\n\n // tslint:disable-next-line:no-string-literal\n debug(`JSON SCHEMA is now cached: ${jsonSchema[\"$id\"]} (${jsonSchemaPath})`);\n\n _cachedJsonSchemas[jsonSchemaPath] = jsonSchema;\n }\n\n const ajv = new Ajv({\n allErrors: true,\n allowUnionTypes: true,\n coerceTypes: false,\n strict: true,\n validateFormats: true,\n verbose: true,\n });\n addFormats(ajv);\n\n // const ajvValidate = ajv.compile({});\n // const ajvValid = ajvValidate(jsonObj);\n // if (!ajvValid) {\n // debug(ajvValidate.errors);\n // }\n\n let idRoot: string | undefined;\n for (const jsonSchemaName of jsonSchemasNames) {\n const jsonSchemaPath = path.join(jsonSchemasRootpath, jsonSchemaName + \".schema.json\");\n\n const jsonSchema = _cachedJsonSchemas[jsonSchemaPath];\n if (!jsonSchema) {\n debug(\"!jsonSchema?? \" + jsonSchemaPath);\n return undefined;\n }\n\n if (!idRoot) {\n // tslint:disable-next-line:no-string-literal\n idRoot = jsonSchema[\"$id\"];\n }\n // debug(jsonSchema);\n // tslint:disable-next-line:no-string-literal\n ajv.addSchema(jsonSchema, jsonSchema[\"$id\"]); // returns 'ajv' for chaining\n }\n\n if (!idRoot) {\n debug(\"!idRoot?? \");\n return undefined;\n }\n\n // tslint:disable-next-line:no-string-literal\n const ajvValid = ajv.validate(idRoot, jsonToValidate);\n if (!ajvValid) {\n // const errorsText = ajv.errorsText();\n // if (errorsText) {\n // debug(errorsText.split(\", \").join(\"\\n\\n\"));\n // }\n const errors = ajv.errors;\n if (errors) {\n const errs: JsonSchemaValidationError[] = [];\n\n for (const err of errors) {\n const jsonPath = err.dataPath.replace(/^\\./, \"\").replace(/\\[([0-9]+)\\]/g, \".$1\");\n errs.push({\n ajvDataPath: err.dataPath,\n ajvMessage: err.message ? err.message : \"\",\n ajvSchemaPath: err.schemaPath,\n jsonPath,\n });\n }\n\n return errs;\n }\n }\n } catch (err) {\n debug(\"JSON Schema VALIDATION PROBLEM.\");\n debug(err);\n\n const errs: JsonSchemaValidationError[] = [];\n errs.push({\n ajvDataPath: err && toString ? err.toString() : \"ajvDataPath\",\n ajvMessage: err.message ? err.message : \"ajvMessage\",\n ajvSchemaPath: \"ajvSchemaPath\",\n jsonPath: \"jsonPath\",\n });\n return errs;\n }\n\n return undefined;\n}\n"]}
\No newline at end of file