import * as Solid from 'solid-js';
import { invariant, replaceEqualDeep } from '@tanstack/router-core';
import { nearestMatchContext } from './matchContext';
import { useRouter } from './useRouter';
export function useMatch(opts) {
    const router = useRouter();
    const nearestMatch = opts.from
        ? undefined
        : Solid.useContext(nearestMatchContext);
    const match = () => {
        if (opts.from) {
            const ids = router.stores.matchesId.state;
            for (const id of ids) {
                const matchStore = router.stores.activeMatchStoresById.get(id);
                if (matchStore?.routeId === opts.from) {
                    return matchStore.state;
                }
            }
            return undefined;
        }
        return nearestMatch?.match();
    };
    return Solid.createMemo((prev) => {
        const selectedMatch = match();
        if (selectedMatch === undefined) {
            const hasPendingMatch = opts.from
                ? Boolean(router.stores.pendingRouteIds.state[opts.from])
                : (nearestMatch?.hasPending() ?? false);
            const isTransitioning = router.stores.isTransitioning.state;
            if (!hasPendingMatch && !isTransitioning && (opts.shouldThrow ?? true)) {
                if (process.env.NODE_ENV !== 'production') {
                    throw new Error(`Invariant failed: Could not find ${opts.from ? `an active match from "${opts.from}"` : 'a nearest match!'}`);
                }
                invariant();
            }
            return undefined;
        }
        const res = opts.select ? opts.select(selectedMatch) : selectedMatch;
        if (prev === undefined)
            return res;
        return replaceEqualDeep(prev, res);
    });
}
//# sourceMappingURL=useMatch.jsx.map