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
JavaScript
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 };