"use strict"; // ------------------------------------------------------------- // WARNING: this file is used by both the client and the server. // Do not use any browser or node-specific API! // ------------------------------------------------------------- var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const errors_1 = require("../shared/errors"); const string_ends_with_1 = __importDefault(require("./string-ends-with")); const arrayIndexOf = Array.prototype.indexOf; const arrayMap = Array.prototype.map; const arraySort = Array.prototype.sort; const arrayFilter = Array.prototype.filter; const arrayConcat = Array.prototype.concat; const COMMAND_NAME_SUFFIX = 'Command'; function validateObjectProps(obj, dest) { const objectName = dest.constructor.name; const validKeys = arrayMap.call(dest.getAllAssignableProperties(), p => p.name); const reportedProperties = arraySort.call(dest.getReportedProperties()); for (const key in obj) { if (!(arrayIndexOf.call(validKeys, key) > -1 || key in dest)) throw new errors_1.ActionInvalidObjectPropertyError(objectName, key, reportedProperties); } } function getDisplayTypeName(constructorName, propName) { if (string_ends_with_1.default.call(constructorName, COMMAND_NAME_SUFFIX)) return propName; return `${constructorName}.${propName}`; } class Assignable { getAssignableProperties() { return []; } getAllAssignableProperties() { let parent = Object.getPrototypeOf(this); let result = []; while (parent && parent.getAssignableProperties) { result = arrayConcat.call(result, parent.getAssignableProperties()); parent = Object.getPrototypeOf(parent); } return result; } getNonReportedProperties() { return []; } getReportedProperties() { const props = arrayMap.call(this.getAllAssignableProperties(), prop => prop.name); const nonReportedProps = this.getNonReportedProperties(); return arrayFilter.call(props, name => !(arrayIndexOf.call(nonReportedProps, name) > -1)); } _assignFrom(obj, validate, initOptions = {}) { if (!obj) return; if (validate) validateObjectProps(obj, this); const props = this.getAllAssignableProperties(); for (let i = 0; i < props.length; i++) { const { name, type, required, init, defaultValue } = props[i]; if (defaultValue !== void 0) this[name] = defaultValue; const srcVal = obj[name]; if (srcVal === void 0 && !required) continue; if (validate && type) { const typeName = getDisplayTypeName(this.constructor.name, name); type(typeName, srcVal); } this[name] = init ? init(name, srcVal, initOptions, validate) : srcVal; } } } exports.default = Assignable; module.exports = exports.default; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzaWduYWJsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9hc3NpZ25hYmxlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxnRUFBZ0U7QUFDaEUsZ0VBQWdFO0FBQ2hFLCtDQUErQztBQUMvQyxnRUFBZ0U7Ozs7O0FBRWhFLDZDQUFvRTtBQUNwRSwwRUFBZ0Q7QUFFaEQsTUFBTSxZQUFZLEdBQUssS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7QUFDL0MsTUFBTSxRQUFRLEdBQVMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7QUFDM0MsTUFBTSxTQUFTLEdBQVEsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7QUFDNUMsTUFBTSxXQUFXLEdBQU0sS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7QUFDOUMsTUFBTSxXQUFXLEdBQU0sS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7QUFFOUMsTUFBTSxtQkFBbUIsR0FBRyxTQUFTLENBQUM7QUFHdEMsU0FBUyxtQkFBbUIsQ0FBRSxHQUFHLEVBQUUsSUFBSTtJQUNuQyxNQUFNLFVBQVUsR0FBVyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztJQUNqRCxNQUFNLFNBQVMsR0FBWSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pGLE1BQU0sa0JBQWtCLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO0lBRXhFLEtBQUssTUFBTSxHQUFHLElBQUksR0FBRyxFQUFFO1FBQ25CLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENB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LE1BQU0sQ0FBQztTQUMxRTtJQUNMLENBQUM7Q0FDSjtBQXpERCw2QkF5REMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBXQVJOSU5HOiB0aGlzIGZpbGUgaXMgdXNlZCBieSBib3RoIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuXG4vLyBEbyBub3QgdXNlIGFueSBicm93c2VyIG9yIG5vZGUtc3BlY2lmaWMgQVBJIVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5pbXBvcnQgeyBBY3Rpb25JbnZhbGlkT2JqZWN0UHJvcGVydHlFcnJvciB9IGZyb20gJy4uL3NoYXJlZC9lcnJvcnMnO1xuaW1wb3J0IHN0cmluZ0VuZHNXaXRoIGZyb20gJy4vc3RyaW5nLWVuZHMtd2l0aCc7XG5cbmNvbnN0IGFycmF5SW5kZXhPZiAgID0gQXJyYXkucHJvdG90eXBlLmluZGV4T2Y7XG5jb25zdCBhcnJheU1hcCAgICAgICA9IEFycmF5LnByb3RvdHlwZS5tYXA7XG5jb25zdCBhcnJheVNvcnQgICAgICA9IEFycmF5LnByb3RvdHlwZS5zb3J0O1xuY29uc3QgYXJyYXlGaWx0ZXIgICAgPSBBcnJheS5wcm90b3R5cGUuZmlsdGVyO1xuY29uc3QgYXJyYXlDb25jYXQgICAgPSBBcnJheS5wcm90b3R5cGUuY29uY2F0O1xuXG5jb25zdCBDT01NQU5EX05BTUVfU1VGRklYID0gJ0NvbW1hbmQnO1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlT2JqZWN0UHJvcHMgKG9iaiwgZGVzdCkge1xuICAgIGNvbnN0IG9iamVjdE5hbWUgICAgICAgICA9IGRlc3QuY29uc3RydWN0b3IubmFtZTtcbiAgICBjb25zdCB2YWxpZEtleXMgICAgICAgICAgPSBhcnJheU1hcC5jYWxsKGRlc3QuZ2V0QWxsQXNzaWduYWJsZVByb3BlcnRpZXMoKSwgcCA9PiBwLm5hbWUpO1xuICAgIGNvbnN0IHJlcG9ydGVkUHJvcGVydGllcyA9IGFycmF5U29ydC5jYWxsKGRlc3QuZ2V0UmVwb3J0ZWRQcm9wZXJ0aWVzKCkpO1xuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGlmICghKGFycmF5SW5kZXhPZi5jYWxsKHZhbGlkS2V5cywga2V5KSA+IC0xIHx8IGtleSBpbiBkZXN0KSlcbiAgICAgICAgICAgIHRocm93IG5ldyBBY3Rpb25JbnZhbGlkT2JqZWN0UHJvcGVydHlFcnJvcihvYmplY3ROYW1lLCBrZXksIHJlcG9ydGVkUHJvcGVydGllcyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXREaXNwbGF5VHlwZU5hbWUgKGNvbnN0cnVjdG9yTmFtZSwgcHJvcE5hbWUpIHtcbiAgICBpZiAoc3RyaW5nRW5kc1dpdGguY2FsbChjb25zdHJ1Y3Rvck5hbWUsIENPTU1BTkRfTkFNRV9TVUZGSVgpKVxuICAgICAgICByZXR1cm4gcHJvcE5hbWU7XG5cbiAgICByZXR1cm4gYCR7IGNvbnN0cnVjdG9yTmFtZSB9LiR7IHByb3BOYW1lIH1gO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBc3NpZ25hYmxlIHtcbiAgICBnZXRBc3NpZ25hYmxlUHJvcGVydGllcyAoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBnZXRBbGxBc3NpZ25hYmxlUHJvcGVydGllcyAoKSB7XG4gICAgICAgIGxldCBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyk7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcblxuICAgICAgICB3aGlsZSAocGFyZW50ICYmIHBhcmVudC5nZXRBc3NpZ25hYmxlUHJvcGVydGllcykge1xuICAgICAgICAgICAgcmVzdWx0ID0gYXJyYXlDb25jYXQuY2FsbChyZXN1bHQsIHBhcmVudC5nZXRBc3NpZ25hYmxlUHJvcGVydGllcygpKTtcbiAgICAgICAgICAgIHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwYXJlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBnZXROb25SZXBvcnRlZFByb3BlcnRpZXMgKCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgZ2V0UmVwb3J0ZWRQcm9wZXJ0aWVzICgpIHtcbiAgICAgICAgY29uc3QgcHJvcHMgICAgICAgICAgICA9IGFycmF5TWFwLmNhbGwodGhpcy5nZXRBbGxBc3NpZ25hYmxlUHJvcGVydGllcygpLCBwcm9wID0+IHByb3AubmFtZSk7XG4gICAgICAgIGNvbnN0IG5vblJlcG9ydGVkUHJvcHMgPSB0aGlzLmdldE5vblJlcG9ydGVkUHJvcGVydGllcygpO1xuXG4gICAgICAgIHJldHVybiBhcnJheUZpbHRlci5jYWxsKHByb3BzLCBuYW1lID0+ICEoYXJyYXlJbmRleE9mLmNhbGwobm9uUmVwb3J0ZWRQcm9wcywgbmFtZSkgPiAtMSkpO1xuICAgIH1cblxuICAgIF9hc3NpZ25Gcm9tIChvYmosIHZhbGlkYXRlLCBpbml0T3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICghb2JqKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGlmICh2YWxpZGF0ZSlcbiAgICAgICAgICAgIHZhbGlkYXRlT2JqZWN0UHJvcHMob2JqLCB0aGlzKTtcblxuICAgICAgICBjb25zdCBwcm9wcyA9IHRoaXMuZ2V0QWxsQXNzaWduYWJsZVByb3BlcnRpZXMoKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB7IG5hbWUsIHR5cGUsIHJlcXVpcmVkLCBpbml0LCBkZWZhdWx0VmFsdWUgfSA9IHByb3BzW2ldO1xuXG4gICAgICAgICAgICBpZiAoZGVmYXVsdFZhbHVlICE9PSB2b2lkIDApXG4gICAgICAgICAgICAgICAgdGhpc1tuYW1lXSA9IGRlZmF1bHRWYWx1ZTtcblxuICAgICAgICAgICAgY29uc3Qgc3JjVmFsID0gb2JqW25hbWVdO1xuXG4gICAgICAgICAgICBpZiAoc3JjVmFsID09PSB2b2lkIDAgJiYgIXJlcXVpcmVkKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBpZiAodmFsaWRhdGUgJiYgdHlwZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVOYW1lID0gZ2V0RGlzcGxheVR5cGVOYW1lKHRoaXMuY29uc3RydWN0b3IubmFtZSwgbmFtZSk7XG5cbiAgICAgICAgICAgICAgICB0eXBlKHR5cGVOYW1lLCBzcmNWYWwpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzW25hbWVdID0gaW5pdCA/IGluaXQobmFtZSwgc3JjVmFsLCBpbml0T3B0aW9ucywgdmFsaWRhdGUpIDogc3JjVmFsO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19