permix
Version:
Permix is a lightweight, framework-agnostic, type-safe permissions management library for JavaScript applications on the client and server sides.
82 lines (81 loc) • 2.1 kB
JavaScript
import { createPermix as createPermix$1, createTemplate } from "../core/index.mjs";
import { Context, Effect, Layer } from "effect";
//#region src/effect/permix.ts
let counter = 0;
/**
* Create an Effect-compatible Permix factory.
*
* Returns a Context `Tag`, Layer constructors, and Effect-returning helpers
* that you can use in any Effect program — server or client.
*
* @link https://permix.letstri.dev/docs/integrations/effect
*/
function createPermix(options = {}) {
const id = options.id ?? `permix/effect#${counter++}`;
const Tag = Context.GenericTag(id);
function layer(rules) {
return Layer.sync(Tag, () => createPermix$1(rules));
}
function layerSetup(rules) {
return Layer.effect(Tag, Effect.map(rules, (r) => createPermix$1(r)));
}
function setup(rules) {
return Effect.map(Tag, (instance) => instance.setup(rules));
}
function check(...args) {
return Effect.flatMap(Tag, (instance) => Effect.try({
try: () => instance.check(...args),
catch: (e) => e
}));
}
function dehydrate() {
return Effect.flatMap(Tag, (instance) => Effect.try({
try: () => instance.dehydrate(),
catch: (e) => e
}));
}
function hydrate(state) {
return Effect.flatMap(Tag, (instance) => Effect.try({
try: () => instance.hydrate(state),
catch: (e) => e
}));
}
function isReady() {
return Effect.map(Tag, (instance) => instance.isReady());
}
function isReadyAsync() {
return Effect.flatMap(Tag, (instance) => Effect.promise(() => instance.isReadyAsync()));
}
function getRules() {
return Effect.map(Tag, (instance) => instance.getRules());
}
function hook(name, fn) {
return Effect.map(Tag, (instance) => instance.hook(name, fn));
}
function hookOnce(name, fn) {
return Effect.map(Tag, (instance) => instance.hookOnce(name, fn));
}
function template(rules) {
return createTemplate(rules);
}
return {
Tag,
layer,
layerSetup,
setup,
check,
dehydrate,
hydrate,
isReady,
isReadyAsync,
getRules,
hook,
hookOnce,
template,
id,
$inferDefinition: void 0,
$inferPath: void 0
};
}
//#endregion
export { createPermix };