UNPKG

@opra/common

Version:
48 lines (47 loc) 1.66 kB
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; }