@dolittle/sdk.common
Version:
Dolittle is a decentralized, distributed, event-driven microservice platform built to harness the power of events.
65 lines • 7.13 kB
JavaScript
;
// Copyright (c) Dolittle. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
Object.defineProperty(exports, "__esModule", { value: true });
exports.createMetadataDecorator = void 0;
const DecoratorAppliedMultipleTimes_1 = require("./DecoratorAppliedMultipleTimes");
const getAppliedDecorators_1 = require("./getAppliedDecorators");
const getDecoratedTarget_1 = require("./getDecoratedTarget");
const getDecoratorMetadata_1 = require("./getDecoratorMetadata");
const InvalidDecoratorTarget_1 = require("./InvalidDecoratorTarget");
const RequiredDecoratorNotApplied_1 = require("./RequiredDecoratorNotApplied");
const setDecoratorMetadata_1 = require("./setDecoratorMetadata");
function hasAlreadyAppliedDecorator(appliedDecorators, name, target, propertyKey, descriptorOrIndex) {
for (const decorator of appliedDecorators) {
if (decorator.name === name && decorator.target === target && decorator.propertyKey === propertyKey && decorator.descriptorOrIndex === descriptorOrIndex) {
return true;
}
}
return false;
}
/**
* Creates a metadata decorator that is valid for use on the specified targets.
* @param {string} name - The name of the decorator metadata.
* @param {string} displayName - The name of the decorator.
* @param {DecoratorTarget} validTargets - The valid decorator targets.
* @param {boolean} [allowMultipleDecorations] - An optional bool that defines whether the decorator can be applied multiple times, defaults to false.
* @returns {[Decorator<DecoratorCallback>, GetMetadataValue<TData>]} The decorator function, and the function to use to get the stored metadata value returned from the callback.
* @template TData Type of the metadata value.
*/
function createMetadataDecorator(name, displayName, validTargets, allowMultipleDecorations = false) {
return [
function (callback) {
return function (target, propertyKey, descriptorOrIndex) {
const decoratedTarget = (0, getDecoratedTarget_1.getDecoratedTarget)(target, propertyKey, descriptorOrIndex);
if ((decoratedTarget & validTargets) === 0) {
throw new InvalidDecoratorTarget_1.InvalidDecoratorTarget(displayName, decoratedTarget, validTargets);
}
const constructor = (typeof target === 'function' ? target : target.constructor);
const appliedDecorators = (0, getAppliedDecorators_1.getAppliedDecorators)(constructor);
const alreadyApplied = hasAlreadyAppliedDecorator(appliedDecorators, name, target, propertyKey, descriptorOrIndex);
if (alreadyApplied && !allowMultipleDecorations) {
throw new DecoratorAppliedMultipleTimes_1.DecoratorAppliedMultipleTimes(displayName, decoratedTarget, constructor, target, propertyKey, descriptorOrIndex);
}
const value = (0, getDecoratorMetadata_1.getDecoratorMetadata)(name, constructor, true);
const newValue = callback(decoratedTarget, constructor, propertyKey, descriptorOrIndex, value);
(0, setDecoratorMetadata_1.setDecoratorMetadata)(name, constructor, newValue);
if (!alreadyApplied) {
appliedDecorators.push({ name, displayName, target, propertyKey, descriptorOrIndex });
}
};
},
function (type, required, maybeRasonOrCreateMetadata, maybeCreateMetadata) {
const createMetadata = typeof maybeCreateMetadata === 'boolean' ? maybeCreateMetadata :
typeof maybeRasonOrCreateMetadata === 'boolean' ? maybeRasonOrCreateMetadata :
true;
const value = (0, getDecoratorMetadata_1.getDecoratorMetadata)(name, type, createMetadata);
if (value === undefined && required === true) {
throw new RequiredDecoratorNotApplied_1.RequiredDecoratorNotApplied(displayName, validTargets, type, maybeRasonOrCreateMetadata);
}
return value;
},
];
}
exports.createMetadataDecorator = createMetadataDecorator;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlTWV0YWRhdGFEZWNvcmF0b3IuanMiLCJzb3VyY2VSb290IjoiLi4vIiwic291cmNlcyI6WyJEZWNvcmF0b3JzL2NyZWF0ZU1ldGFkYXRhRGVjb3JhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwrQ0FBK0M7QUFDL0MscUdBQXFHOzs7QUFJckcsbUZBQWdGO0FBRWhGLGlFQUFnRjtBQUNoRiw2REFBMEQ7QUFDMUQsaUVBQThEO0FBQzlELHFFQUFrRTtBQUNsRSwrRUFBNEU7QUFDNUUsaUVBQThEO0FBVTlELFNBQVMsMEJBQTBCLENBQUMsaUJBQXFDLEVBQUUsSUFBWSxFQUFFLE1BQXlCLEVBQUUsV0FBNkIsRUFBRSxpQkFBK0M7SUFDOUwsS0FBSyxNQUFNLFNBQVMsSUFBSSxpQkFBaUIsRUFBRTtRQUN2QyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssTUFBTSxJQUFJLFNBQVMsQ0FBQyxXQUFXLEtBQUssV0FBVyxJQUFJLFNBQVMsQ0FBQyxpQkFBaUIsS0FBSyxpQkFBaUIsRUFBRTtZQUN0SixPQUFPLElBQUksQ0FBQztTQUNmO0tBQ0o7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFnQix1QkFBdUIsQ0FBUSxJQUFZLEVBQUUsV0FBbUIsRUFBRSxZQUE2QixFQUFFLDJCQUFvQyxLQUFLO0lBQ3RKLE9BQU87UUFDSCxVQUFVLFFBQWtDO1lBQ3hDLE9BQU8sVUFBVSxNQUF5QixFQUFFLFdBQTZCLEVBQUUsaUJBQStDO2dCQUN0SCxNQUFNLGVBQWUsR0FBRyxJQUFBLHVDQUFrQixFQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztnQkFDbkYsSUFBSSxDQUFDLGVBQWUsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ3hDLE1BQU0sSUFBSSwrQ0FBc0IsQ0FBQyxXQUFXLEVBQUUsZUFBZSxFQUFFLFlBQVksQ0FBQyxDQUFDO2lCQUNoRjtnQkFFRCxNQUFNLFdBQVcsR0FBRyxDQUFDLE9BQU8sTUFBTSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFxQixDQUFDO2dCQUVyRyxNQUFNLGlCQUFpQixHQUFHLElBQUEsMkNBQW9CLEVBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQzVELE1BQU0sY0FBYyxHQUFHLDBCQUEwQixDQUFDLGlCQUFpQixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixDQUFDLENBQUM7Z0JBQ25ILElBQUksY0FBYyxJQUFJLENBQUMsd0JBQXdCLEVBQUU7b0JBQzdDLE1BQU0sSUFBSSw2REFBNkIsQ0FBQyxXQUFXLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixDQUFDLENBQUM7aUJBQzlIO2dCQUVELE1BQU0sS0FBSyxHQUFHLElBQUEsMkNBQW9CLEVBQVEsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDbkUsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLGVBQWUsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUMvRixJQUFBLDJDQUFvQixFQUFRLElBQUksRUFBRSxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBRXpELElBQUksQ0FBQyxjQUFjLEVBQUU7b0JBQ2pCLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUM7aUJBQ3pGO1lBQ0wsQ0FBQyxDQUFDO1FBQ04sQ0FBQztRQUNELFVBQVUsSUFBc0IsRUFBRSxRQUFrQixFQUFFLDBCQUE2QyxFQUFFLG1CQUE2QjtZQUM5SCxNQUFNLGNBQWMsR0FDaEIsT0FBTyxtQkFBbUIsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUM7Z0JBQ2hFLE9BQU8sMEJBQTBCLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO29CQUM5RSxJQUFJLENBQUM7WUFFVCxNQUFNLEtBQUssR0FBRyxJQUFBLDJDQUFvQixFQUFRLElBQUksRUFBRSxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFFdEUsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLFFBQVEsS0FBSyxJQUFJLEVBQUU7Z0JBQzFDLE1BQU0sSUFBSSx5REFBMkIsQ0FBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSwwQkFBb0MsQ0FBQyxDQUFDO2FBQ2hIO1lBRUQsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBNEI7S0FDL0IsQ0FBQztBQUNOLENBQUM7QUF6Q0QsMERBeUNDIn0=