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
JavaScript
;
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