@opra/common
Version:
Opra common package
49 lines (48 loc) • 1.73 kB
JavaScript
import { merge } from '@jsopen/objects';
import { OpraSchema } from '../../schema/index.js';
import { WS_CONTROLLER_METADATA } from '../constants.js';
const CLASS_NAME_PATTERN = /^(.*)(Controller)$/;
const augmentationRegistry = [];
export function WSControllerDecoratorFactory(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(WS_CONTROLLER_METADATA, Object.getPrototypeOf(target));
if (baseMetadata)
merge(metadata, baseMetadata, { deep: true });
const oldMetadata = Reflect.getOwnMetadata(WS_CONTROLLER_METADATA, target);
if (oldMetadata)
merge(metadata, oldMetadata, { deep: true });
merge(metadata, {
...options,
kind: OpraSchema.WSController.Kind,
name,
path: name,
}, { deep: true });
Reflect.defineMetadata(WS_CONTROLLER_METADATA, metadata, target);
for (const fn of decoratorChain)
fn(metadata, target);
Reflect.defineMetadata(WS_CONTROLLER_METADATA, metadata, target);
};
/**
*
*/
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;
}
WSControllerDecoratorFactory.augment = function (fn) {
augmentationRegistry.push(fn);
};