UNPKG

permix

Version:

Permix is a lightweight, framework-agnostic, type-safe permissions management library for JavaScript applications on the client and server sides.

80 lines (74 loc) 2.48 kB
import { createComponent, memo } from 'solid-js/web'; import { createContext, useContext, createMemo, createEffect, onCleanup } from 'solid-js'; import { createStore } from 'solid-js/store'; import { v as validatePermix, b as checkWithRules, g as getRules } from '../shared/permix.Q-O041RP.mjs'; import { hydrate } from '../core/index.mjs'; const Context = createContext(null); function usePermixContext() { const context = useContext(Context); if (!context) { throw new Error('[Permix]: Looks like you forgot to wrap your app with <PermixProvider>'); } return context; } /** * Hook that provides the Permix reactive methods to your Solid components. * * @link https://permix.letstri.dev/docs/integrations/solid */ function usePermix(permix) { validatePermix(permix); const context = usePermixContext(); validatePermix(context.permix); const check = (...args) => { return checkWithRules(context.rules ?? getRules(context.permix), ...args); }; return { check, isReady: () => context.isReady }; } /** * Provider that provides the Permix context to your Solid components. * * @link https://permix.letstri.dev/docs/integrations/solid */ function PermixProvider(props) { validatePermix(props.permix); const [context, setContext] = createStore({ permix: props.permix, isReady: props.permix.isReady(), rules: getRules(props.permix) }); createEffect(() => { const setup = props.permix.hook('setup', () => setContext('rules', getRules(props.permix))); const ready = props.permix.hook('ready', () => setContext('isReady', props.permix.isReady())); onCleanup(() => { setup(); ready(); }); }); return createComponent(Context.Provider, { value: context, get children() { return props.children; } }); } function PermixHydrate(props) { const context = usePermixContext(); validatePermix(context.permix); createMemo(() => hydrate(context.permix, props.state)); return props.children; } function createComponents(permix) { function Check(props) { const context = usePermix(permix); const hasPermission = createMemo(() => context.check(props.entity, props.action, props.data)); return memo(() => memo(() => !!props.reverse)() ? hasPermission() ? props.otherwise || null : props.children : hasPermission() ? props.children : props.otherwise || null); } return { Check }; } export { PermixHydrate, PermixProvider, createComponents, usePermix };