@sigi/core
Version:
Sigi core library
45 lines • 1.75 kB
JavaScript
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