UNPKG

@arnosaine/is

Version:

Feature Flags, Roles and Permissions-based rendering, A/B Testing, Experimental Features, and more in React.

64 lines 2.33 kB
import { curry } from "lodash-es"; import { useMatches, useRouteLoaderData } from "react-router"; export * from "./utils.js"; export function __create(useValues, defaultConditions, options = {}) { const { method = "some" } = options; // Curried comparison function const is = curry((values, conditions) => Object.entries({ ...defaultConditions, ...conditions, }) .filter(([, condition]) => typeof condition !== "undefined") .every(([name, condition]) => { const value = values[name]; if (Array.isArray(value)) { if (Array.isArray(condition)) { return condition[method]((cond) => value.includes(cond)); } return value.includes(condition); } if (Array.isArray(condition)) { return condition.includes(value); } if (typeof value === "boolean") { return value === Boolean(condition); } else { return value === condition; } })); // Hook const useIs = (conditions) => is(useValues(), conditions); // Component const Is = ({ children = null, fallback = null, ...conditions }) => useIs(conditions) ? children : fallback; return { Is, useIs, is }; } export function create(useValues, defaultConditions, options = {}) { const { Is, useIs } = __create(useValues, defaultConditions, options); return [Is, useIs]; } export function createFromLoader(loadValues, defaultConditions, options = {}) { const { prop = "__is_values" } = options; // The hook and the component get values from the root loader const useValues = () => { const root = useMatches()[0]; const { routeId = root?.id ?? "root" } = options; const routeLoaderData = useRouteLoaderData(routeId); return ( // Deprecated routeLoaderData?.__is ?? // routeLoaderData?.[prop] ?? {}); }; const { Is, useIs, is } = __create(useValues, defaultConditions, options); async function loadIs(args) { const values = await loadValues(args); return Object.assign(is(values), { __values: values, // Deprecated [prop]: values, }); } return [Is, useIs, loadIs]; } //# sourceMappingURL=main.js.map