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