@zero-scripts/core
Version:
Framework for creating presets, configurations and extensions
58 lines • 2.84 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Option = void 0;
require("reflect-metadata");
const graph_1 = require("../graph");
const metadata_1 = require("../metadata");
function Option(getValue, dependencies = [], postModifier) {
return (target, propertyName) => {
const values = new Map();
Object.defineProperty(target, propertyName, {
set(firstValue) {
Object.defineProperty(this, propertyName, {
get() {
return values.get(this);
},
set(value) {
values.set(this, value);
},
enumerable: true
});
this[propertyName] = firstValue;
const getOptionValue = (options, externalValue) => {
const defaultValue = this[propertyName];
if (getValue) {
return getValue({
dependencies: dependencies.length > 0
? dependencies.reduce((object, dependency) => (Object.assign(Object.assign({}, object), { [dependency]: options[dependency] || this[dependency] })), {})
: {},
defaultValue,
externalValue
});
}
return externalValue !== undefined ? externalValue : defaultValue;
};
const prevMeta = Reflect.getMetadata(metadata_1.METADATA_OPTIONS, this.constructor.prototype, propertyName);
if (prevMeta) {
Reflect.deleteMetadata(metadata_1.METADATA_OPTIONS, this.constructor.prototype, propertyName);
}
Reflect.defineMetadata(metadata_1.METADATA_OPTIONS, Object.assign(Object.assign({}, prevMeta), { getOptionValue,
postModifier }), target, propertyName);
if (!Reflect.hasMetadata(metadata_1.METADATA_ROOT_DEPENDENCY_NODE, target)) {
Reflect.defineMetadata(metadata_1.METADATA_ROOT_DEPENDENCY_NODE, {
instance: new graph_1.DependencyNode('root')
}, target);
}
const { instance: rootNode } = Reflect.getMetadata(metadata_1.METADATA_ROOT_DEPENDENCY_NODE, target);
const node = rootNode.addOrGetEdge(propertyName);
dependencies.forEach(propertyName => {
node.addOrGetEdge(propertyName);
});
},
enumerable: true,
configurable: true
});
};
}
exports.Option = Option;
//# sourceMappingURL=Option.js.map