decode-it
Version:
a simple zero-dependency type safe json decoder for typescript
75 lines • 2.91 kB
JavaScript
;
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