UNPKG

permix

Version:

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

83 lines (82 loc) 1.89 kB
import { createPermix as createPermix$1, createTemplate } from "../core/index.mjs"; import { cache } from "react"; //#region src/next/permix.ts /** * Create a per-request Permix instance for Next.js App Router. * * Backed by React's `cache()`, so all server components, route handlers, and * server actions within the same request share one instance while concurrent * requests stay fully isolated. * * @example * ```ts * // lib/permix.ts * import { createPermix } from 'permix/next' * * export const permix = createPermix<{ * post: ['create', 'read', 'update', 'delete'] * }>() * ``` * * ```tsx * // app/layout.tsx (server component) * import { permix } from '@/lib/permix' * import { getSession } from '@/lib/auth' * * export default async function RootLayout({ children }) { * const session = await getSession() * * permix.setup({ * post: { * create: !!session, * read: true, * update: session?.role === 'admin', * delete: session?.role === 'admin', * }, * }) * * return <Providers state={permix.dehydrate()}>{children}</Providers> * } * ``` * * @link https://permix.letstri.dev/docs/integrations/next */ function createPermix() { const getPermix = cache(() => createPermix$1()); function setup(rules) { getPermix().setup(rules); } const check = (...args) => getPermix().check(...args); function dehydrate() { return getPermix().dehydrate(); } function get() { return getPermix(); } function getRules() { return getPermix().getRules(); } function template(rules) { return createTemplate(rules); } function hook(name, fn) { return getPermix().hook(name, fn); } function hookOnce(name, fn) { return getPermix().hookOnce(name, fn); } return { setup, check, dehydrate, get, getRules, template, hook, hookOnce, $inferDefinition: void 0, $inferPath: void 0 }; } //#endregion export { createPermix };