58 lines
2.1 KiB
JavaScript
58 lines
2.1 KiB
JavaScript
"use strict";
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.validateNormalized = validateNormalized;
|
|
exports.assertNormalized = assertNormalized;
|
|
const fs_1 = __importDefault(require("fs"));
|
|
const path_1 = __importDefault(require("path"));
|
|
const _2020_1 = __importDefault(require("ajv/dist/2020"));
|
|
const config_1 = require("../config");
|
|
const validators = new Map();
|
|
function schemaPath(version) {
|
|
if (version === "v1") {
|
|
return path_1.default.resolve(config_1.SCHEMAS_DIR, "normalized_query_v1.json");
|
|
}
|
|
if (version === "v2_0_1") {
|
|
return path_1.default.resolve(config_1.SCHEMAS_DIR, "normalized_query_v2_0_1.json");
|
|
}
|
|
if (version === "v2_0_2") {
|
|
return path_1.default.resolve(config_1.SCHEMAS_DIR, "normalized_query_v2_0_2.json");
|
|
}
|
|
return path_1.default.resolve(config_1.SCHEMAS_DIR, "normalized_query_v2.json");
|
|
}
|
|
function loadValidator(version) {
|
|
const cached = validators.get(version);
|
|
if (cached) {
|
|
return cached;
|
|
}
|
|
const raw = fs_1.default.readFileSync(schemaPath(version), "utf-8");
|
|
const schema = JSON.parse(raw);
|
|
const ajv = new _2020_1.default({ allErrors: true, strict: false });
|
|
const compiled = ajv.compile(schema);
|
|
validators.set(version, compiled);
|
|
return compiled;
|
|
}
|
|
function normalizeAjvErrors(errors) {
|
|
if (!errors || errors.length === 0) {
|
|
return [];
|
|
}
|
|
return errors.map((item) => `${item.instancePath || "/"} ${item.message ?? "validation error"}`.trim());
|
|
}
|
|
function validateNormalized(payload, schemaVersion = "v1") {
|
|
const check = loadValidator(schemaVersion);
|
|
const passed = check(payload);
|
|
return {
|
|
passed: Boolean(passed),
|
|
errors: passed ? [] : normalizeAjvErrors(check.errors)
|
|
};
|
|
}
|
|
function assertNormalized(payload, schemaVersion = "v1") {
|
|
const validation = validateNormalized(payload, schemaVersion);
|
|
if (!validation.passed) {
|
|
throw new Error(`Invalid normalized JSON: ${validation.errors.join("; ")}`);
|
|
}
|
|
return payload;
|
|
}
|