This commit is contained in:
Lukian 2023-06-20 15:28:07 +02:00
parent 68f4b60012
commit 41ae7ff4bd
1010 changed files with 38622 additions and 17071 deletions

View file

@ -5,10 +5,10 @@ const util_1 = require("./util");
const mixin_tracking_1 = require("./mixin-tracking");
const mergeObjectsOfDecorators = (o1, o2) => {
var _a, _b;
const allKeys = util_1.unique([...Object.getOwnPropertyNames(o1), ...Object.getOwnPropertyNames(o2)]);
const allKeys = (0, util_1.unique)([...Object.getOwnPropertyNames(o1), ...Object.getOwnPropertyNames(o2)]);
const mergedObject = {};
for (let key of allKeys)
mergedObject[key] = util_1.unique([...((_a = o1 === null || o1 === void 0 ? void 0 : o1[key]) !== null && _a !== void 0 ? _a : []), ...((_b = o2 === null || o2 === void 0 ? void 0 : o2[key]) !== null && _b !== void 0 ? _b : [])]);
mergedObject[key] = (0, util_1.unique)([...((_a = o1 === null || o1 === void 0 ? void 0 : o1[key]) !== null && _a !== void 0 ? _a : []), ...((_b = o2 === null || o2 === void 0 ? void 0 : o2[key]) !== null && _b !== void 0 ? _b : [])]);
return mergedObject;
};
const mergePropertyAndMethodDecorators = (d1, d2) => {
@ -21,7 +21,7 @@ const mergePropertyAndMethodDecorators = (d1, d2) => {
const mergeDecorators = (d1, d2) => {
var _a, _b, _c, _d, _e, _f;
return ({
class: util_1.unique([...(_a = d1 === null || d1 === void 0 ? void 0 : d1.class) !== null && _a !== void 0 ? _a : [], ...(_b = d2 === null || d2 === void 0 ? void 0 : d2.class) !== null && _b !== void 0 ? _b : []]),
class: (0, util_1.unique)([...(_a = d1 === null || d1 === void 0 ? void 0 : d1.class) !== null && _a !== void 0 ? _a : [], ...(_b = d2 === null || d2 === void 0 ? void 0 : d2.class) !== null && _b !== void 0 ? _b : []]),
static: mergePropertyAndMethodDecorators((_c = d1 === null || d1 === void 0 ? void 0 : d1.static) !== null && _c !== void 0 ? _c : {}, (_d = d2 === null || d2 === void 0 ? void 0 : d2.static) !== null && _d !== void 0 ? _d : {}),
instance: mergePropertyAndMethodDecorators((_e = d1 === null || d1 === void 0 ? void 0 : d1.instance) !== null && _e !== void 0 ? _e : {}, (_f = d2 === null || d2 === void 0 ? void 0 : d2.instance) !== null && _f !== void 0 ? _f : {}),
});
@ -33,8 +33,8 @@ const findAllConstituentClasses = (...classes) => {
const frontier = new Set([...classes]);
while (frontier.size > 0) {
for (let clazz of frontier) {
const protoChainClasses = util_1.protoChain(clazz.prototype).map(proto => proto.constructor);
const mixinClasses = (_a = mixin_tracking_1.getMixinsForClass(clazz)) !== null && _a !== void 0 ? _a : [];
const protoChainClasses = (0, util_1.protoChain)(clazz.prototype).map(proto => proto.constructor);
const mixinClasses = (_a = (0, mixin_tracking_1.getMixinsForClass)(clazz)) !== null && _a !== void 0 ? _a : [];
const potentiallyNewClasses = [...protoChainClasses, ...mixinClasses];
const newClasses = potentiallyNewClasses.filter(c => !allClasses.has(c));
for (let newClass of newClasses)
@ -57,7 +57,7 @@ const deepDecoratorSearch = (...classes) => {
};
exports.deepDecoratorSearch = deepDecoratorSearch;
const directDecoratorSearch = (...classes) => {
const classDecorators = classes.map(clazz => exports.getDecoratorsForClass(clazz));
const classDecorators = classes.map(clazz => (0, exports.getDecoratorsForClass)(clazz));
if (classDecorators.length === 0)
return {};
if (classDecorators.length === 1)
@ -75,7 +75,7 @@ const getDecoratorsForClass = (clazz) => {
};
exports.getDecoratorsForClass = getDecoratorsForClass;
const decorateClass = (decorator) => ((clazz) => {
const decoratorsForClass = exports.getDecoratorsForClass(clazz);
const decoratorsForClass = (0, exports.getDecoratorsForClass)(clazz);
let classDecorators = decoratorsForClass.class;
if (!classDecorators) {
classDecorators = [];
@ -85,25 +85,18 @@ const decorateClass = (decorator) => ((clazz) => {
return decorator(clazz);
});
const decorateMember = (decorator) => ((object, key, ...otherArgs) => {
var _a, _b, _c;
const decoratorTargetType = typeof object === 'function' ? 'static' : 'instance';
const decoratorType = typeof object[key] === 'function' ? 'method' : 'property';
const clazz = decoratorTargetType === 'static' ? object : object.constructor;
const decoratorsForClass = exports.getDecoratorsForClass(clazz);
let decoratorsForTargetType = decoratorsForClass === null || decoratorsForClass === void 0 ? void 0 : decoratorsForClass[decoratorTargetType];
if (!decoratorsForTargetType) {
decoratorsForTargetType = {};
decoratorsForClass[decoratorTargetType] = decoratorsForTargetType;
}
let decoratorsForType = decoratorsForTargetType === null || decoratorsForTargetType === void 0 ? void 0 : decoratorsForTargetType[decoratorType];
if (!decoratorsForType) {
decoratorsForType = {};
decoratorsForTargetType[decoratorType] = decoratorsForType;
}
let decoratorsForKey = decoratorsForType === null || decoratorsForType === void 0 ? void 0 : decoratorsForType[key];
if (!decoratorsForKey) {
decoratorsForKey = [];
decoratorsForType[key] = decoratorsForKey;
}
const decoratorsForClass = (0, exports.getDecoratorsForClass)(clazz);
const decoratorsForTargetType = (_a = decoratorsForClass === null || decoratorsForClass === void 0 ? void 0 : decoratorsForClass[decoratorTargetType]) !== null && _a !== void 0 ? _a : {};
decoratorsForClass[decoratorTargetType] = decoratorsForTargetType;
let decoratorsForType = (_b = decoratorsForTargetType === null || decoratorsForTargetType === void 0 ? void 0 : decoratorsForTargetType[decoratorType]) !== null && _b !== void 0 ? _b : {};
decoratorsForTargetType[decoratorType] = decoratorsForType;
let decoratorsForKey = (_c = decoratorsForType === null || decoratorsForType === void 0 ? void 0 : decoratorsForType[key]) !== null && _c !== void 0 ? _c : [];
decoratorsForType[key] = decoratorsForKey;
// @ts-ignore: array is type `A[] | B[]` and item is type `A | B`, so technically a type error, but it's fine
decoratorsForKey.push(decorator);
// @ts-ignore
return decorator(object, key, ...otherArgs);

View file

@ -24,7 +24,7 @@ const hasMixin = (instance, mixin) => {
const newFrontier = new Set();
frontier.forEach(item => {
var _a;
const itemConstituents = (_a = mixins.get(item)) !== null && _a !== void 0 ? _a : util_1.protoChain(item.prototype).map(proto => proto.constructor).filter(item => item !== null);
const itemConstituents = (_a = mixins.get(item)) !== null && _a !== void 0 ? _a : (0, util_1.protoChain)(item.prototype).map(proto => proto.constructor).filter(item => item !== null);
if (itemConstituents)
itemConstituents.forEach(constituent => {
if (!visited.has(constituent) && !frontier.has(constituent))

View file

@ -27,21 +27,21 @@ function Mixin(...constructors) {
function MixedClass(...args) {
for (const constructor of constructors)
// @ts-ignore: potentially abstract class
util_1.copyProps(this, new constructor(...args));
(0, util_1.copyProps)(this, new constructor(...args));
if (initFunctionName !== null && typeof this[initFunctionName] === 'function')
this[initFunctionName].apply(this, args);
}
MixedClass.prototype = settings_1.settings.prototypeStrategy === 'copy'
? util_1.hardMixProtos(prototypes, MixedClass)
: proxy_1.softMixProtos(prototypes, MixedClass);
? (0, util_1.hardMixProtos)(prototypes, MixedClass)
: (0, proxy_1.softMixProtos)(prototypes, MixedClass);
Object.setPrototypeOf(MixedClass, settings_1.settings.staticsStrategy === 'copy'
? util_1.hardMixProtos(constructors, null, ['prototype'])
: proxy_1.proxyMix(constructors, Function.prototype));
? (0, util_1.hardMixProtos)(constructors, null, ['prototype'])
: (0, proxy_1.proxyMix)(constructors, Function.prototype));
let DecoratedMixedClass = MixedClass;
if (settings_1.settings.decoratorInheritance !== 'none') {
const classDecorators = settings_1.settings.decoratorInheritance === 'deep'
? decorator_1.deepDecoratorSearch(...constructors)
: decorator_1.directDecoratorSearch(...constructors);
? (0, decorator_1.deepDecoratorSearch)(...constructors)
: (0, decorator_1.directDecoratorSearch)(...constructors);
for (let decorator of (_a = classDecorators === null || classDecorators === void 0 ? void 0 : classDecorators.class) !== null && _a !== void 0 ? _a : []) {
const result = decorator(DecoratedMixedClass);
if (result) {
@ -51,7 +51,7 @@ function Mixin(...constructors) {
applyPropAndMethodDecorators((_b = classDecorators === null || classDecorators === void 0 ? void 0 : classDecorators.static) !== null && _b !== void 0 ? _b : {}, DecoratedMixedClass);
applyPropAndMethodDecorators((_c = classDecorators === null || classDecorators === void 0 ? void 0 : classDecorators.instance) !== null && _c !== void 0 ? _c : {}, DecoratedMixedClass.prototype);
}
mixin_tracking_1.registerMixins(DecoratedMixedClass, constructors);
(0, mixin_tracking_1.registerMixins)(DecoratedMixedClass, constructors);
return DecoratedMixedClass;
}
exports.Mixin = Mixin;

View file

@ -7,7 +7,7 @@ const util_1 = require("./util");
* prototypes is required.
*/
const getIngredientWithProp = (prop, ingredients) => {
const protoChains = ingredients.map(ingredient => util_1.protoChain(ingredient));
const protoChains = ingredients.map(ingredient => (0, util_1.protoChain)(ingredient));
// since we search breadth-first, we need to keep track of our depth in the prototype chains
let protoDepth = 0;
// not all prototype chains are the same depth, so this remains true as long as at least one of the ingredients'
@ -45,19 +45,19 @@ const proxyMix = (ingredients, prototype = Object.prototype) => new Proxy({}, {
throw Error('Cannot set prototype of Proxies created by ts-mixer');
},
getOwnPropertyDescriptor(_, prop) {
return Object.getOwnPropertyDescriptor(exports.getIngredientWithProp(prop, ingredients) || {}, prop);
return Object.getOwnPropertyDescriptor((0, exports.getIngredientWithProp)(prop, ingredients) || {}, prop);
},
defineProperty() {
throw new Error('Cannot define new properties on Proxies created by ts-mixer');
},
has(_, prop) {
return exports.getIngredientWithProp(prop, ingredients) !== undefined || prototype[prop] !== undefined;
return (0, exports.getIngredientWithProp)(prop, ingredients) !== undefined || prototype[prop] !== undefined;
},
get(_, prop) {
return (exports.getIngredientWithProp(prop, ingredients) || prototype)[prop];
return ((0, exports.getIngredientWithProp)(prop, ingredients) || prototype)[prop];
},
set(_, prop, val) {
const ingredientWithProp = exports.getIngredientWithProp(prop, ingredients);
const ingredientWithProp = (0, exports.getIngredientWithProp)(prop, ingredients);
if (ingredientWithProp === undefined)
throw new Error('Cannot set new properties on Proxies created by ts-mixer');
ingredientWithProp[prop] = val;
@ -78,5 +78,5 @@ exports.proxyMix = proxyMix;
* proxying all property access to the ingredients. This is not ES5 compatible and less performant. However, any
* changes made to the source prototypes will be reflected in the proxy-prototype, which may be desirable.
*/
const softMixProtos = (ingredients, constructor) => exports.proxyMix([...ingredients, { constructor }]);
const softMixProtos = (ingredients, constructor) => (0, exports.proxyMix)([...ingredients, { constructor }]);
exports.softMixProtos = softMixProtos;

View file

@ -20,7 +20,7 @@ const protoChain = (obj, currentChain = [obj]) => {
const proto = Object.getPrototypeOf(obj);
if (proto === null)
return currentChain;
return exports.protoChain(proto, [...currentChain, proto]);
return (0, exports.protoChain)(proto, [...currentChain, proto]);
};
exports.protoChain = protoChain;
/**
@ -31,7 +31,7 @@ const nearestCommonProto = (...objs) => {
if (objs.length === 0)
return undefined;
let commonProto = undefined;
const protoChains = objs.map(obj => exports.protoChain(obj));
const protoChains = objs.map(obj => (0, exports.protoChain)(obj));
while (protoChains.every(protoChain => protoChain.length > 0)) {
const protos = protoChains.map(protoChain => protoChain.pop());
const potentialCommonProto = protos[0];
@ -54,19 +54,19 @@ exports.nearestCommonProto = nearestCommonProto;
*/
const hardMixProtos = (ingredients, constructor, exclude = []) => {
var _a;
const base = (_a = exports.nearestCommonProto(...ingredients)) !== null && _a !== void 0 ? _a : Object.prototype;
const base = (_a = (0, exports.nearestCommonProto)(...ingredients)) !== null && _a !== void 0 ? _a : Object.prototype;
const mixedProto = Object.create(base);
// Keeps track of prototypes we've already visited to avoid copying the same properties multiple times. We init the
// list with the proto chain below the nearest common ancestor because we don't want any of those methods mixed in
// when they will already be accessible via prototype access.
const visitedProtos = exports.protoChain(base);
const visitedProtos = (0, exports.protoChain)(base);
for (let prototype of ingredients) {
let protos = exports.protoChain(prototype);
let protos = (0, exports.protoChain)(prototype);
// Apply the prototype chain in reverse order so that old methods don't override newer ones.
for (let i = protos.length - 1; i >= 0; i--) {
let newProto = protos[i];
if (visitedProtos.indexOf(newProto) === -1) {
exports.copyProps(mixedProto, newProto, ['constructor', ...exclude]);
(0, exports.copyProps)(mixedProto, newProto, ['constructor', ...exclude]);
visitedProtos.push(newProto);
}
}