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