UNPKG

decode-it

Version:

a simple zero-dependency type safe json decoder for typescript

75 lines 2.91 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.array = void 0; const constructErrorPath_1 = require("../constructErrorPath"); const decode_1 = require("../decode"); require("../toNativeType"); const typeCheckers_1 = require("../typeCheckers"); const tuple_1 = require("./tuple"); const ValidationResult_1 = require("./ValidationResult"); require("./Validator"); const createNonArrayFailure = arg => ({ value: arg, type: 'unknown', state: 'failed', wrapper: 'array', }); const createEmptyArrayFailure = arg => ({ value: arg, type: 'none', state: 'failed', wrapper: 'array', }); const createNonInnerObjectArrayFailure = arg => ({ value: arg, type: 'none', state: 'failed', wrapper: 'array', }); const array = validator => { return (arg) => { if (!typeCheckers_1.isArray(arg)) return createNonArrayFailure(arg); if (validator == null) return createEmptyArrayFailure(arg); if (typeCheckers_1.isObject(validator)) { const areAllItemsObject = arg.every(item => typeCheckers_1.isObject(item)); if (!areAllItemsObject) return createNonInnerObjectArrayFailure(arg); const failedValidations = arg .map(item => decode_1.getFailedDecodes(validator, item)) .map(([failedDecode], index) => { if (failedDecode == null) return ValidationResult_1.passedValidation; const failedValidation = tuple_1.failedDecodeToFailedValidation(failedDecode); return { ...failedValidation, path: constructErrorPath_1.constructNestedErrorPath(index, failedValidation.path), }; }) .filter(ValidationResult_1.isFailedValidation); const noFailedDecodes = typeCheckers_1.isEmptyArray(failedValidations); return noFailedDecodes ? ValidationResult_1.passedValidation : failedValidations[0]; } const [failedValidation] = arg .map((item, index) => { const res = validator(item); return ValidationResult_1.isFailedValidation(res) ? { ...res, path: constructErrorPath_1.constructNestedErrorPath(index, res.path) } : ValidationResult_1.passedValidation; }) .filter(ValidationResult_1.isFailedValidation); const validationHasPassed = failedValidation == null; return validationHasPassed ? ValidationResult_1.passedValidation : { value: failedValidation.value, type: failedValidation.type, path: failedValidation.path, state: 'failed', wrapper: 'array', }; }; }; exports.array = array; //# sourceMappingURL=array.js.map