UNPKG

groq-builder

Version:

A **schema-aware**, strongly-typed GROQ query builder. It enables you to build GROQ queries using **auto-completion**, **type-checking**, and **runtime validation**.

124 lines 3.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.inspect = inspect; exports.simpleArrayParser = simpleArrayParser; exports.simpleObjectParser = simpleObjectParser; exports.combineObjectParsers = combineObjectParsers; exports.maybeArrayParser = maybeArrayParser; const validation_errors_1 = require("./validation-errors"); const validate_utils_1 = require("../commands/validate-utils"); /** * Pretty-prints the value */ function inspect(value) { if (value) { if (Array.isArray(value)) return "an array"; if (typeof value === "object") return "an object"; } return JSON.stringify(value); } /** * Validates (and maps) each item in an array. */ function simpleArrayParser(itemParser) { if (!itemParser) { return (input) => { if (!Array.isArray(input)) { throw new TypeError(`Expected an array, received ${inspect(input)}`); } return input; }; } return (input) => { if (!Array.isArray(input)) { throw new TypeError(`Expected an array, received ${inspect(input)}`); } const validationErrors = new validation_errors_1.ValidationErrors(); const results = input.map((value, i) => { try { return itemParser(value); } catch (err) { validationErrors.add(i, value, err); return null; } }); if (validationErrors.length) throw validationErrors; return results; }; } /** * Validates (and maps) each key in an object. */ function simpleObjectParser(objectMapper) { if (!objectMapper) { return (input) => { if (input === null || typeof input !== "object") { throw new TypeError(`Expected an object, received ${inspect(input)}`); } return input; }; } const keys = Object.keys(objectMapper); const entries = keys.map((key) => [ key, (0, validate_utils_1.normalizeValidationFunction)(objectMapper[key]), ]); return (input) => { if (input === null || typeof input !== "object") { throw new TypeError(`Expected an object, received ${inspect(input)}`); } const validationErrors = new validation_errors_1.ValidationErrors(); const result = {}; for (const [key, parser] of entries) { const value = input[key]; try { result[key] = parser ? parser(value) : value; } catch (err) { validationErrors.add(key, value, err); } } if (validationErrors.length) throw validationErrors; return result; }; } /** * Combines multiple object parsers into a single parser */ function combineObjectParsers(...objectParsers) { if (objectParsers.length === 1) return objectParsers[0]; return function combinedObjectParser(input) { const validationErrors = new validation_errors_1.ValidationErrors(); const result = {}; for (const p of objectParsers) { try { const parsed = p(input); Object.assign(result, parsed); } catch (err) { validationErrors.add(null, input, err); } } if (validationErrors.length) throw validationErrors; return result; }; } /** * Returns a parser that works against an array or a single item. */ function maybeArrayParser(parser) { if (!parser) return null; const arrayParser = simpleArrayParser(parser); return function maybeArrayParser(input) { return Array.isArray(input) ? arrayParser(input) : parser(input); }; } //# sourceMappingURL=simple-validation.js.map