UNPKG

@sigi/core

Version:
45 lines 1.75 kB
import { DEFINE_ACTION_DECORATOR_SYMBOL, REDUCER_DECORATOR_SYMBOL, IMMER_REDUCER_DECORATOR_SYMBOL, EFFECT_DECORATOR_SYMBOL, SSR_ACTION_META_SYMBOL, ACTION_TO_SKIP_SYMBOL, } from './symbols'; const actionEnum = { DefineAction: DEFINE_ACTION_DECORATOR_SYMBOL, Reducer: REDUCER_DECORATOR_SYMBOL, ImmerReducer: IMMER_REDUCER_DECORATOR_SYMBOL, Effect: EFFECT_DECORATOR_SYMBOL, }; const metadataFactory = (key) => { const get = (prototype, defaultValue) => { const meta = Reflect.getMetadata(key, prototype); if (!meta || !Array.isArray(meta)) { return defaultValue; } return meta; }; return { get, add: (prototype, meta) => { const stored = get(prototype); if (!stored) { Reflect.defineMetadata(key, [meta], prototype); } else { stored.push(meta); } }, }; }; export function getDecoratedActions(prototype, type, defaultValue) { const { get } = metadataFactory(actionEnum[type]); return get(prototype, defaultValue); } export function createActionDecorator(type) { return () => (prototype, propertyKey, descriptor) => { if (typeof prototype === 'function' || !propertyKey) { throw new Error(`${type} can only be used to decorate properties.`); } const { add } = metadataFactory(actionEnum[type]); add(prototype, propertyKey); return descriptor; }; } export const { get: getSSREffectMeta, add: addSSREffectMeta } = metadataFactory(SSR_ACTION_META_SYMBOL); export const { get: getActionsToSkip, add: addActionToSkip } = metadataFactory(ACTION_TO_SKIP_SYMBOL); //# sourceMappingURL=metadata.js.map