@opra/common
Version:
Opra common package
65 lines (64 loc) • 2.18 kB
JavaScript
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);
};