All files / lib/model aggregate.js

100% Statements 11/11
100% Branches 2/2
100% Functions 5/5
100% Lines 11/11

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44      8x     26x         4x                   3x   139x       3x 3x       3x     3x     1x       1x  
"use strict";
 
function copyNonSpecialProperties(target, source) {
  Object.getOwnPropertyNames(source)
    .concat(Object.getOwnPropertySymbols(source))
    .forEach((prop) => {
      if (
        !prop.match(
          /^(?:constructor|prototype|arguments|caller|name|bind|call|apply|toString|length)$/
        )
      ) {
        Object.defineProperty(
          target,
          prop,
          Object.getOwnPropertyDescriptor(source, prop)
        );
      }
    });
}
 
function aggregate(BaseClass, ...additionalClasses) {
  let aggregatedClass = class _Combined extends BaseClass {
    constructor(...args) {
      super(...args);
    }
  };
 
  additionalClasses.forEach((classToAggregate) => {
    copyNonSpecialProperties(
      aggregatedClass.prototype,
      classToAggregate.prototype
    );
    copyNonSpecialProperties(aggregatedClass, classToAggregate);
  });
 
  return aggregatedClass;
}
 
aggregate._ = {
  copyNonSpecialProperties: copyNonSpecialProperties,
};
 
module.exports = aggregate;