UNPKG

@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
"use strict"; // 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=