UNPKG

ts-cast

Version:
50 lines (49 loc) 1.81 kB
"use strict"; 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;