UNPKG

@flix-tech/fp-ts-type-check

Version:
77 lines 17.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.discriminatedUnion = exports.arrayOf = exports.nullable = exports.optional = exports.type = exports.keyOf = exports.oneOf = exports.or = exports.and = exports.exact = exports.any = exports.object = exports.number = exports.boolean = exports.string = void 0; const E = require("fp-ts/lib/Either"); const O = require("fp-ts/lib/Option"); const pipeable_1 = require("fp-ts/lib/pipeable"); const parseError = (message) => ({ path: '', message }); const addKeyPrefix = (part) => (err) => ({ path: `.${part}${err.path}`, message: err.message, }); const addIndexPrefix = (index) => (err) => ({ path: `[${index}]${err.path}`, message: err.message, }); const traverseParsers = (xs, parser) => { const results = []; for (const index in xs) { const result = parser(xs[index]); if (E.isLeft(result)) { return E.mapLeft(addIndexPrefix(index))(result); } results.push(result.right); } return E.right(results); }; const typeGuard = (typeName, x) => typeof x === typeName; const typeParser = (typeName) => (x) => typeGuard(typeName, x) ? E.right(x) : E.left(parseError('expected ' + typeName + ', got ' + typeof x)); exports.string = typeParser('string'); exports.boolean = typeParser('boolean'); exports.number = typeParser('number'); exports.object = (x) => x === null ? E.left(parseError('expected object, got null')) : typeGuard('object', x) ? E.right(x) : E.left(parseError('expected object, got ' + typeof x)); exports.any = E.right; exports.exact = (expected) => x => expected === x ? E.right(expected) : E.left(parseError(`expected '${expected}', got '${x}'`)); exports.and = (parserA, parserB) => x => pipeable_1.pipe(parserA(x), E.chain(parserB)); exports.or = (parserA, parserB) => x => { const a = parserA(x); return E.isRight(a) ? a : parserB(x); }; exports.oneOf = (allowed) => x => pipeable_1.pipe(allowed.find(a => a === x), O.fromNullable, E.fromOption(() => parseError(`value ${x} is not in whitelist`))); const isKeyOf = (a, x) => a.hasOwnProperty(x); exports.keyOf = (allowed) => x => pipeable_1.pipe(exports.string(x), E.chain(xStr => isKeyOf(allowed, xStr) ? E.right(xStr) : E.left(parseError(`value ${xStr} is not in whitelist`)))); exports.type = (propertyParsers) => (x) => pipeable_1.pipe(typeParser('object')(x), E.chain((obj) => { const result = {}; for (const key in propertyParsers) { if (propertyParsers.hasOwnProperty(key)) { const parser = propertyParsers[key]; const property = isKeyOf(obj, key) ? obj[key] : undefined; const parsedProperty = parser(property); if (E.isLeft(parsedProperty)) { return E.mapLeft(addKeyPrefix(key.toString()))(parsedProperty); } result[key] = parsedProperty.right; } } return E.right(Object.assign(Object.assign({}, obj), result)); })); exports.optional = (parseBody) => x => x === undefined ? E.right(undefined) : parseBody(x); exports.nullable = (parseBody) => x => x === null ? E.right(null) : parseBody(x); exports.arrayOf = (parseBody) => x => Array.isArray(x) ? traverseParsers(x, parseBody) : E.left(parseError('expected array, got' + typeof x)); exports.discriminatedUnion = (parsers) => x => pipeable_1.pipe(exports.type({ type: exports.keyOf(parsers) })(x), E.chain(xObj => { const parser = parsers[xObj.type]; return parser(xObj); })); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsc0NBQXNDO0FBQ3RDLHNDQUFzQztBQUN0QyxpREFBMEM7QUFXMUMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxPQUFlLEVBQWMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDNUUsTUFBTSxZQUFZLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBZSxFQUFjLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZFLElBQUksRUFBRSxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFO0lBQzNCLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTztDQUNyQixDQUFDLENBQUM7QUFDSCxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQXNCLEVBQUUsRUFBRSxDQUFDLENBQ2pELEdBQWUsRUFDSCxFQUFFLENBQUMsQ0FBQztJQUNoQixJQUFJLEVBQUUsSUFBSSxLQUFLLElBQUksR0FBRyxDQUFDLElBQUksRUFBRTtJQUM3QixPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU87Q0FDckIsQ0FBQyxDQUFDO0FBUUgsTUFBTSxlQUFlLEdBQUcsQ0FDdEIsRUFBYSxFQUNiLE1BQWlCLEVBQ0MsRUFBRTtJQUNwQixNQUFNLE9BQU8sR0FBUSxFQUFFLENBQUM7SUFDeEIsS0FBSyxNQUFNLEtBQUssSUFBSSxFQUFFLEVBQUU7UUFDdEIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNwQixPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDakQ7UUFFRCxP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QUksQ0FBQyxFQUFFLElBQUksRUFBRSxhQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNqQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO0lBQ2IsTUFBTSxNQUFNLEdBQW1DLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdEIsQ0FBQyxDQUFDLENBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIEUgZnJvbSAnZnAtdHMvbGliL0VpdGhlcic7XG5pbXBvcnQgKiBhcyBPIGZyb20gJ2ZwLXRzL2xpYi9PcHRpb24nO1xuaW1wb3J0IHsgcGlwZSB9IGZyb20gJ2ZwLXRzL2xpYi9waXBlYWJsZSc7XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9ucyB0byBjb21wb3NlIFwidHlwZSBndWFyZFwiLWxpa2UgZnVuY3Rpb25zIHdpdGggc3RyaWN0IHR5cGUgY2hlY2tzLlxuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VFcnJvciB7XG4gIHBhdGg6IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xufVxuXG5jb25zdCBwYXJzZUVycm9yID0gKG1lc3NhZ2U6IHN0cmluZyk6IFBhcnNlRXJyb3IgPT4gKHsgcGF0aDogJycsIG1lc3NhZ2UgfSk7XG5jb25zdCBhZGRLZXlQcmVmaXggPSAocGFydDogc3RyaW5nKSA9PiAoZXJyOiBQYXJzZUVycm9yKTogUGFyc2VFcnJvciA9PiAoe1xuICBwYXRoOiBgLiR7cGFydH0ke2Vyci5wYXRofWAsXG4gIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxufSk7XG5jb25zdCBhZGRJbmRleFByZWZpeCA9IChpbmRleDogc3RyaW5nIHwgbnVtYmVyKSA9PiAoXG4gIGVycjogUGFyc2VFcnJvclxuKTogUGFyc2VFcnJvciA9PiAoe1xuICBwYXRoOiBgWyR7aW5kZXh9XSR7ZXJyLnBhdGh9YCxcbiAgbWVzc2FnZTogZXJyLm1lc3NhZ2UsXG59KTtcblxuZXhwb3J0IHR5cGUgUGFyc2VSZXN1bHQ8QT4gPSBFLkVpdGhlcjxQYXJzZUVycm9yLCBBPjtcbmV4cG9ydCB0eXBlIFBhcnNlcjxPVVQsIElOID0gdW5rbm93bj4gPSB7XG4gICh4OiBJTik6IFBhcnNlUmVzdWx0PE9VVCAmIElOPjtcbiAgcmlnaHQ/OiAoeDogT1VUKSA9PiB2b2lkOyAvLyBBIGZha2UgZnVuY3Rpb24gdG8gZGlzYWxsb3cgYXNzaWduaW5nIG9mIFBhcnNlcjxBPiB0byBQYXJzZXI8QXxCPi4gU2hvdWxkIGJlIHVuZGVmaW5lZC5cbn07XG5cbmNvbnN0IHRyYXZlcnNlUGFyc2VycyA9IDxBPihcbiAgeHM6IHVua25vd25bXSxcbiAgcGFyc2VyOiBQYXJzZXI8QT5cbik6IFBhcnNlUmVzdWx0PEFbXT4gPT4ge1xuICBjb25zdCByZXN1bHRzOiBBW10gPSBbXTtcbiAgZm9yIChjb25zdCBpbmRleCBpbiB4cykge1xuICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlcih4c1tpbmRleF0pO1xuICAgIGlmIChFLmlzTGVmdChyZXN1bHQpKSB7XG4gICAgICByZXR1cm4gRS5tYXBMZWZ0KGFkZEluZGV4UHJlZml4KGluZGV4KSkocmVzdWx0KTtcbiAgICB9XG5cbiAgICByZXN1bHRzLnB1c2gocmVzdWx0LnJpZ2h0KTtcbiAgfVxuXG4gIHJldHVybiBFLnJpZ2h0KHJlc3VsdHMpO1xufTtcblxudHlwZSBUeXBlTmFtZTxUPiA9IFQgZXh0ZW5kcyBzdHJpbmdcbiAgPyAnc3RyaW5nJ1xuICA6IFQgZXh0ZW5kcyBudW1iZXJcbiAgPyAnbnVtYmVyJ1xuICA6IFQgZXh0ZW5kcyBib29sZWFuXG4gID8gJ2Jvb2xlYW4nXG4gIDogVCBleHRlbmRzIHVuZGVmaW5lZFxuICA/ICd1bmRlZmluZWQnXG4gIDogVCBleHRlbmRzICguLi5wOiBhbnlbXSkgPT4gYW55XG4gID8gJ2Z1bmN0aW9uJ1xuICA6IFQgZXh0ZW5kcyBvYmplY3RcbiAgPyAnb2JqZWN0J1xuICA6ICd1bmtub3duJztcblxuY29uc3QgdHlwZUd1YXJkID0gPEE+KHR5cGVOYW1lOiBUeXBlTmFtZTxBPiwgeDogdW5rbm93bik6IHggaXMgQSA9PlxuICB0eXBlb2YgeCA9PT0gdHlwZU5hbWU7XG5jb25zdCB0eXBlUGFyc2VyID0gPEEsIElOID0gdW5rbm93bj4oXG4gIHR5cGVOYW1lOiBUeXBlTmFtZTxBPlxuKTogUGFyc2VyPEEgJiBJTiwgSU4+ID0+ICh4OiBJTikgPT5cbiAgdHlwZUd1YXJkPEE+KHR5cGVOYW1lLCB4KVxuICAgID8gRS5yaWdodCh4KVxuICAgIDogRS5sZWZ0KHBhcnNlRXJyb3IoJ2V4cGVjdGVkICcgKyB0eXBlTmFtZSArICcsIGdvdCAnICsgdHlwZW9mIHgpKTtcblxuZXhwb3J0IGNvbnN0IHN0cmluZyA9IHR5cGVQYXJzZXI8c3RyaW5nPignc3RyaW5nJyk7XG5leHBvcnQgY29uc3QgYm9vbGVhbiA9IHR5cGVQYXJzZXI8Ym9vbGVhbj4oJ2Jvb2xlYW4nKTtcbmV4cG9ydCBjb25zdCBudW1iZXIgPSB0eXBlUGFyc2VyPG51bWJlcj4oJ251bWJlcicpO1xuZXhwb3J0IGNvbnN0IG9iamVjdCA9ICh4OiB1bmtub3duKSA9PlxuICB4ID09PSBudWxsXG4gICAgPyBFLmxlZnQocGFyc2VFcnJvcignZXhwZWN0ZWQgb2JqZWN0LCBnb3QgbnVsbCcpKVxuICAgIDogdHlwZUd1YXJkPFJlY29yZDxzdHJpbmcsIHVua25vd24+Pignb2JqZWN0JywgeClcbiAgICA/IEUucmlnaHQoeClcbiAgICA6IEUubGVmdChwYXJzZUVycm9yKCdleHBlY3RlZCBvYmplY3QsIGdvdCAnICsgdHlwZW9mIHgpKTtcblxuZXhwb3J0IGNvbnN0IGFueTogUGFyc2VyPGFueT4gPSBFLnJpZ2h0O1xuXG4vLyBWYWxpZGF0ZXMgdGhhdCB4IG1hdGNoZXMgZXhhY3RseSBvbmUgdmFsdWVcbmV4cG9ydCBjb25zdCBleGFjdCA9IDxBPihleHBlY3RlZDogQSk6IFBhcnNlcjxBPiA9PiB4ID0+XG4gIGV4cGVjdGVkID09PSB4XG4gICAgPyBFLnJpZ2h0KGV4cGVjdGVkKVxuICAgIDogRS5sZWZ0KHBhcnNlRXJyb3IoYGV4cGVjdGVkICcke2V4cGVjdGVkfScsIGdvdCAnJHt4fSdgKSk7XG5cbmV4cG9ydCBjb25zdCBhbmQgPSA8T1VULCBNSURETEUsIElOID0gdW5kZWZpbmVkPihcbiAgcGFyc2VyQTogUGFyc2VyPE1JRERMRSwgSU4+LFxuICBwYXJzZXJCOiBQYXJzZXI8T1VULCBNSURETEUgJiBJTj5cbik6IFBhcnNlcjxNSURETEUgJiBPVVQsIElOPiA9PiB4ID0+IHBpcGUocGFyc2VyQSh4KSwgRS5jaGFpbihwYXJzZXJCKSk7XG5cbmV4cG9ydCBjb25zdCBvciA9IDxBLCBCLCBJTiA9IHVuZGVmaW5lZD4oXG4gIHBhcnNlckE6IFBhcnNlcjxBLCBJTj4sXG4gIHBhcnNlckI6IFBhcnNlcjxCLCBJTj5cbik6IFBhcnNlcjxBIHwgQiwgSU4+ID0+IHggPT4ge1xuICBjb25zdCBhOiBQYXJzZVJlc3VsdDwoQSB8IEIpICYgSU4+ID0gcGFyc2VyQSh4KTtcbiAgcmV0dXJuIEUuaXNSaWdodChhKSA/IGEgOiBwYXJzZXJCKHgpO1xufTtcblxuLy8gVmFsaWRhdGVzIHRoYXQgeCBpcyBvbmUgb2Ygd2hpdGVsaXN0ZWQgdmFsdWVzXG5leHBvcnQgY29uc3Qgb25lT2YgPSA8QT4oYWxsb3dlZDogQVtdKTogUGFyc2VyPEE+ID0+IHggPT5cbiAgcGlwZShcbiAgICBhbGxvd2VkLmZpbmQoYSA9PiBhID09PSB4KSxcbiAgICBPLmZyb21OdWxsYWJsZSxcbiAgICBFLmZyb21PcHRpb24oKCkgPT4gcGFyc2VFcnJvcihgdmFsdWUgJHt4fSBpcyBub3QgaW4gd2hpdGVsaXN0YCkpXG4gICk7XG5cbmNvbnN0IGlzS2V5T2YgPSA8QSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgYTogQSxcbiAgeDogc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sXG4pOiB4IGlzIGtleW9mIEEgPT4gYS5oYXNPd25Qcm9wZXJ0eSh4KTtcbmV4cG9ydCBjb25zdCBrZXlPZiA9IDxBIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICBhbGxvd2VkOiBBXG4pOiBQYXJzZXI8a2V5b2YgQT4gPT4geCA9PlxuICBwaXBlKFxuICAgIHN0cmluZyh4KSxcbiAgICBFLmNoYWluKHhTdHIgPT5cbiAgICAgIGlzS2V5T2YoYWxsb3dlZCwgeFN0cilcbiAgICAgICAgPyBFLnJpZ2h0KHhTdHIpXG4gICAgICAgIDogRS5sZWZ0KHBhcnNlRXJyb3IoYHZhbHVlICR7eFN0cn0gaXMgbm90IGluIHdoaXRlbGlzdGApKVxuICAgIClcbiAgKTtcblxuLy8gVmFsaWRhdGVzIHRoYXQgeCBpcyBhbiBvYmplY3Qgd2l0aCB2YWxpZCBmaWVsZHNcbmV4cG9ydCBjb25zdCB0eXBlID0gPEEsIElOID0gdW5rbm93bj4oXG4gIHByb3BlcnR5UGFyc2VyczogeyBbSyBpbiBrZXlvZiBBXTogUGFyc2VyPEFbS10+IH1cbik6IFBhcnNlcjxBICYgSU4sIElOPiA9PiAoeDogSU4pID0+XG4gIHBpcGUoXG4gICAgdHlwZVBhcnNlcjxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgSU4+KCdvYmplY3QnKSh4KSxcbiAgICBFLmNoYWluKChvYmo6IElOICYgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIEE7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wZXJ0eVBhcnNlcnMpIHtcbiAgICAgICAgaWYgKHByb3BlcnR5UGFyc2Vycy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgY29uc3QgcGFyc2VyID0gcHJvcGVydHlQYXJzZXJzW2tleV07XG4gICAgICAgICAgY29uc3QgcHJvcGVydHkgPSBpc0tleU9mKG9iaiwga2V5KSA/IG9ialtrZXldIDogdW5kZWZpbmVkO1xuICAgICAgICAgIGNvbnN0IHBhcnNlZFByb3BlcnR5ID0gcGFyc2VyKHByb3BlcnR5KTtcbiAgICAgICAgICBpZiAoRS5pc0xlZnQocGFyc2VkUHJvcGVydHkpKSB7XG4gICAgICAgICAgICByZXR1cm4gRS5tYXBMZWZ0KGFkZEtleVByZWZpeChrZXkudG9TdHJpbmcoKSkpKHBhcnNlZFByb3BlcnR5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSBwYXJzZWRQcm9wZXJ0eS5yaWdodDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIEUucmlnaHQoeyAuLi5vYmosIC4uLnJlc3VsdCB9IGFzIEEgJiBJTik7XG4gICAgfSlcbiAgKTtcblxuLy8gVmFsaWRhdG9yIGZvciBvcHRpb25hbCB2YWx1ZXNcbmV4cG9ydCBjb25zdCBvcHRpb25hbCA9IDxBPihwYXJzZUJvZHk6IFBhcnNlcjxBPik6IFBhcnNlcjxBIHwgdW5kZWZpbmVkPiA9PiB4ID0+XG4gIHggPT09IHVuZGVmaW5lZCA/IEUucmlnaHQodW5kZWZpbmVkKSA6IHBhcnNlQm9keSh4KTtcblxuZXhwb3J0IGNvbnN0IG51bGxhYmxlID0gPEE+KHBhcnNlQm9keTogUGFyc2VyPEE+KTogUGFyc2VyPEEgfCBudWxsPiA9PiB4ID0+XG4gIHggPT09IG51bGwgPyBFLnJpZ2h0KG51bGwpIDogcGFyc2VCb2R5KHgpO1xuXG4vLyBWYWxpZGF0ZXMgdGhhdCB4IGlzIGFycmF5IG9mIHR5cGUgQVxuZXhwb3J0IGNvbnN0IGFycmF5T2YgPSA8QT4ocGFyc2VCb2R5OiBQYXJzZXI8QT4pOiBQYXJzZXI8QVtdPiA9PiB4ID0+XG4gIEFycmF5LmlzQXJyYXkoeClcbiAgICA/IHRyYXZlcnNlUGFyc2Vycyh4LCBwYXJzZUJvZHkpXG4gICAgOiBFLmxlZnQocGFyc2VFcnJvcignZXhwZWN0ZWQgYXJyYXksIGdvdCcgKyB0eXBlb2YgeCkpO1xuXG5pbnRlcmZhY2UgSGFzVHlwZUZpZWxkIHtcbiAgdHlwZTogc3RyaW5nO1xufVxudHlwZSBEaXNjcmltaW5hdGVkVW5pb25QYXJzZXJzPFQgZXh0ZW5kcyBIYXNUeXBlRmllbGQ+ID0ge1xuICBbSyBpbiBUWyd0eXBlJ11dOiBUIGV4dGVuZHMgeyB0eXBlOiBLIH1cbiAgICA/IFBhcnNlcjxULCB7IHR5cGU6IFRbJ3R5cGUnXSB9PlxuICAgIDogbmV2ZXI7XG59O1xuLy8gV2UgZXhwZWN0IGFuIG9iamVjdCB3aXRoIFwidHlwZVwiIHByb3BlcnR5IGFuZCB3ZSBoYXZlIGEgcGFyc2VyIGZvciBlYWNoIHBvc3NpYmxlIHR5cGVcbmV4cG9ydCBjb25zdCBkaXNjcmltaW5hdGVkVW5pb24gPSA8QSBleHRlbmRzIEhhc1R5cGVGaWVsZD4oXG4gIHBhcnNlcnM6IERpc2NyaW1pbmF0ZWRVbmlvblBhcnNlcnM8QT5cbik6IFBhcnNlcjxBPiA9PiB4ID0+XG4gIHBpcGUoXG4gICAgdHlwZSh7IHR5cGU6IGtleU9mKHBhcnNlcnMpIH0pKHgpLFxuICAgIEUuY2hhaW4oeE9iaiA9PiB7XG4gICAgICBjb25zdCBwYXJzZXI6IFBhcnNlcjxBLCB7IHR5cGU6IEFbJ3R5cGUnXSB9PiA9IHBhcnNlcnNbeE9iai50eXBlXTtcbiAgICAgIHJldHVybiBwYXJzZXIoeE9iaik7XG4gICAgfSlcbiAgKTtcbiJdfQ==