satanTime/ngrx-entity-relationship

View on GitHub
libs/ngrx-entity-relationship/src/lib/rootEntitySelector.ts

Summary

Maintainability
A
3 hrs
Test Coverage
A
100%
import {rootEntity} from './rootEntity';
import {
    FEATURE_SELECTOR,
    HANDLER_RELATED_ENTITY,
    HANDLER_ROOT_ENTITY,
    ID_TYPES,
    isSelectorMeta,
    TRANSFORMER,
} from './types';
import {argsToArray} from './utils';

export function rootEntitySelector<STORE, ENTITY, TRANSFORMED>(
    featureSelector: FEATURE_SELECTOR<STORE, ENTITY>,
    transformer: TRANSFORMER<ENTITY, TRANSFORMED>,
    meta: SELECTOR_META,
): (
    metaOrRelationship?: SELECTOR_META | HANDLER_RELATED_ENTITY<STORE, ENTITY>,
    ...relationships: Array<HANDLER_RELATED_ENTITY<STORE, ENTITY>>
) => HANDLER_ROOT_ENTITY<STORE, ENTITY, TRANSFORMED, ID_TYPES>;

export function rootEntitySelector<STORE, ENTITY, TRANSFORMED>(
    featureSelector: FEATURE_SELECTOR<STORE, ENTITY>,
    transformer: TRANSFORMER<ENTITY, TRANSFORMED>,
): (
    metaOrRelationship?: SELECTOR_META | HANDLER_RELATED_ENTITY<STORE, ENTITY>,
    ...relationships: Array<HANDLER_RELATED_ENTITY<STORE, ENTITY>>
) => HANDLER_ROOT_ENTITY<STORE, ENTITY, TRANSFORMED, ID_TYPES>;

export function rootEntitySelector<STORE, ENTITY>(
    featureSelector: FEATURE_SELECTOR<STORE, ENTITY>,
    meta: SELECTOR_META,
): (
    metaOrRelationship?: SELECTOR_META | HANDLER_RELATED_ENTITY<STORE, ENTITY>,
    ...relationships: Array<HANDLER_RELATED_ENTITY<STORE, ENTITY>>
) => HANDLER_ROOT_ENTITY<STORE, ENTITY, ENTITY, ID_TYPES>;

export function rootEntitySelector<STORE, ENTITY>(
    featureSelector: FEATURE_SELECTOR<STORE, ENTITY>,
): (
    metaOrRelationship?: SELECTOR_META | HANDLER_RELATED_ENTITY<STORE, ENTITY>,
    ...relationships: Array<HANDLER_RELATED_ENTITY<STORE, ENTITY>>
) => HANDLER_ROOT_ENTITY<STORE, ENTITY, ENTITY, ID_TYPES>;

export function rootEntitySelector<STORE, ENTITY, TRANSFORMED>(
    featureSelector: FEATURE_SELECTOR<STORE, ENTITY>,
    guess1?: SELECTOR_META | TRANSFORMER<ENTITY, TRANSFORMED>,
    guess2?: SELECTOR_META,
): (
    meta?: SELECTOR_META,
    ...relationships: Array<HANDLER_RELATED_ENTITY<STORE, ENTITY>>
) => HANDLER_ROOT_ENTITY<STORE, ENTITY, ENTITY | TRANSFORMED, ID_TYPES> {
    function callback(
        metaOverride?: SELECTOR_META,
    ): HANDLER_ROOT_ENTITY<STORE, ENTITY, ENTITY | TRANSFORMED, ID_TYPES> {
        let relationships: Array<HANDLER_RELATED_ENTITY<STORE, ENTITY>> = argsToArray(arguments);
        const transformer = isSelectorMeta(guess1) ? undefined : guess1;
        let currentMeta = isSelectorMeta(guess1) ? guess1 : guess2;
        if (isSelectorMeta(metaOverride)) {
            currentMeta = metaOverride;
            relationships = relationships.slice(1);
        }
        return transformer && currentMeta
            ? rootEntity(featureSelector, transformer, currentMeta, ...relationships)
            : transformer
            ? rootEntity(featureSelector, transformer, ...relationships)
            : currentMeta
            ? rootEntity(featureSelector, currentMeta, ...relationships)
            : rootEntity(featureSelector, ...relationships);
    }
    callback.ngrxEntityRelationship = 'rootEntitySelector';

    return callback;
}