permix
Version:
Permix is a lightweight, framework-agnostic, type-safe permissions management library for JavaScript applications on the client and server sides.
58 lines (57 loc) • 1.92 kB
text/typescript
import { A as Definition, C as Rules, S as DehydratedState, _ as PermixHooks, g as Permix, l as CheckArgs, v as RulesPaths } from "../index-BYcbfVQ7.mjs";
//#region src/next/permix.d.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
*/
declare function createPermix<D extends Definition>(): {
setup: (rules: Rules<D>) => void;
check: (...args: CheckArgs<D>) => boolean;
dehydrate: () => DehydratedState<D>;
get: () => Permix<D>;
getRules: () => Rules<D> | null;
template: <T = void>(rules: Rules<D> | ((param: T) => Rules<D>)) => (param: T) => Rules<D>;
hook: <K extends keyof PermixHooks<D>>(name: K, fn: PermixHooks<D>[K]) => () => void;
hookOnce: <K extends keyof PermixHooks<D>>(name: K, fn: PermixHooks<D>[K]) => void;
$inferDefinition: D;
$inferPath: RulesPaths<D>;
};
type NextPermix<D extends Definition> = ReturnType<typeof createPermix<D>>;
//#endregion
export { NextPermix, createPermix };