UNPKG

@opra/common

Version:
65 lines (64 loc) 2.18 kB
import { merge } from '@jsopen/objects'; import { OpraSchema } from '../../schema/index.js'; import { MQ_CONTROLLER_METADATA } from '../constants.js'; const CLASS_NAME_PATTERN = /^(.*)(Controller)$/; const augmentationRegistry = []; export function MQControllerDecoratorFactory(options) { const decoratorChain = []; /** * */ const decorator = function (target) { let name = options?.name; if (!name) name = CLASS_NAME_PATTERN.exec(target.name)?.[1] || target.name; const metadata = {}; const baseMetadata = Reflect.getOwnMetadata(MQ_CONTROLLER_METADATA, Object.getPrototypeOf(target)); if (baseMetadata) merge(metadata, baseMetadata, { deep: true }); const oldMetadata = Reflect.getOwnMetadata(MQ_CONTROLLER_METADATA, target); if (oldMetadata) merge(metadata, oldMetadata, { deep: true }); merge(metadata, { ...options, kind: OpraSchema.MQController.Kind, name, path: name, }, { deep: true }); Reflect.defineMetadata(MQ_CONTROLLER_METADATA, metadata, target); for (const fn of decoratorChain) fn(metadata, target); Reflect.defineMetadata(MQ_CONTROLLER_METADATA, metadata, target); }; /** * */ decorator.Header = (name, arg1) => { decoratorChain.push((meta) => { const paramMeta = typeof arg1 === 'string' || typeof arg1 === 'function' ? { name, type: arg1, } : { ...arg1, name }; meta.headers = meta.headers || []; meta.headers.push(paramMeta); }); return decorator; }; /** * */ decorator.UseType = (...type) => { decoratorChain.push((meta) => { meta.types = meta.types || []; meta.types.push(...type); }); return decorator; }; augmentationRegistry.forEach(fn => fn(decorator, decoratorChain, options)); return decorator; } MQControllerDecoratorFactory.augment = function (fn) { augmentationRegistry.push(fn); };