UNPKG

permix

Version:

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

68 lines (67 loc) 2.24 kB
import { createCheck } from "../core/index.mjs"; import { createContext, createEffect, createMemo, createRenderEffect, onCleanup, useContext } from "solid-js"; import { createStore } from "solid-js/store"; import { Fragment, jsx } from "solid-js/jsx-runtime"; //#region src/solid/hooks.ts 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; } /** * Access Permix check and readiness state inside a Solid component. * * @link https://permix.letstri.dev/docs/integrations/solid */ function usePermix(permix) { const context = usePermixContext(); const check = (...args) => createCheck(() => context.rules ?? permix.getRules())(...args); return { check, isReady: () => context.isReady }; } //#endregion //#region src/solid/components.tsx /** * Provides Permix context to the Solid component tree. * * @link https://permix.letstri.dev/docs/integrations/solid */ function PermixProvider(props) { const [context, setContext] = createStore({ permix: props.permix, isReady: props.permix.isReady(), rules: props.permix.getRules() }); createEffect(() => { const setup = props.permix.hook("setup", () => setContext("rules", props.permix.getRules())); const ready = props.permix.hook("ready", () => setContext("isReady", props.permix.isReady())); onCleanup(() => { setup(); ready(); }); }); return /* @__PURE__ */ jsx(Context.Provider, { value: context, children: props.children }); } function PermixHydrate(props) { const context = usePermixContext(); createRenderEffect(() => { context.permix.hydrate(props.state); }); return props.children; } function createComponents(permix) { function Check(props) { const context = usePermix(permix); const hasPermission = createMemo(() => context.check(...[props.path, props.data])); return /* @__PURE__ */ jsx(Fragment, { children: props.reverse ? hasPermission() ? props.otherwise || null : props.children : hasPermission() ? props.children : props.otherwise || null }); } return { Check }; } //#endregion export { PermixHydrate, PermixProvider, createComponents, usePermix };