@opra/common
Version:
Opra common package
48 lines (47 loc) • 1.66 kB
JavaScript
import { omitUndefined } from '@jsopen/objects';
import { OpraSchema } from '../../schema/index.js';
import { DATATYPE_METADATA } from '../constants.js';
export function ApiFieldDecoratorFactory(options) {
const decoratorChain = [];
/**
*
*/
const decorator = function (target, propertyKey) {
if (typeof propertyKey !== 'string')
throw new TypeError(`Symbol properties can't be used as a field`);
const metadata = Reflect.getOwnMetadata(DATATYPE_METADATA, target.constructor) ||
{};
metadata.kind = OpraSchema.ComplexType.Kind;
metadata.fields = metadata.fields || {};
const designType = Reflect.getMetadata('design:type', target, propertyKey);
const elemMeta = (metadata.fields[propertyKey] = {
...options,
designType,
});
if (designType === Array) {
elemMeta.isArray = true;
}
else
elemMeta.type = elemMeta.type || designType;
Reflect.defineMetadata(DATATYPE_METADATA, metadata, target.constructor);
for (const fn of decoratorChain)
fn(elemMeta);
};
/**
*
*/
decorator.Override = (scopes, opts) => {
decoratorChain.push((meta) => {
meta.override = meta.override || [];
meta.override.push(omitUndefined({
...opts,
scopePattern: Array.isArray(scopes) ? scopes : [scopes],
type: undefined,
isArray: undefined,
isNestedEntity: undefined,
}));
});
return decorator;
};
return decorator;
}