ts-cast
Version:
Runtime typechecking
50 lines (49 loc) • 1.81 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.struct = void 0;
var engine_1 = require("../engine");
var guards_1 = require("../engine/guards");
var optional_1 = require("../engine/optional");
var transformStruct = function (schema, ref) {
var fields = Object.entries(schema);
return function (value, context, reportError) {
return fields.reduce(function (target, _a) {
var field = _a[0], caster = _a[1];
return Object.defineProperty(target, field, {
enumerable: true,
writable: true,
configurable: true,
value: caster(value[field], context ? "".concat(context, ".").concat(String(field)) : "".concat(String(field)), reportError),
});
}, Object.create(ref.caster.prototype));
};
};
var partial = function (schema) {
return Object.keys(schema).reduce(function (newSchema, field) {
newSchema[field] = (0, optional_1.default)(schema[field]);
return newSchema;
}, Object.create(null));
};
var struct = function (schema, typeName) {
if (typeName === void 0) { typeName = 'struct'; }
var ref = {};
var caster = Object.defineProperties((0, engine_1.createCaster)(typeName, guards_1.isAnObj, transformStruct(schema, ref)), {
name: {
value: typeName,
},
partial: {
enumerable: true,
get: function () { return (0, exports.struct)(partial(schema), "Partial<".concat(typeName, ">")); },
},
});
ref.caster = Object.defineProperty(caster, 'prototype', {
enumerable: false,
configurable: false,
writable: true,
value: {
constructor: caster,
},
});
return caster;
};
exports.struct = struct;