npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@molecule/api-permissions

v1.0.1

Published

Permissions core interface for molecule.dev — RBAC/ABAC access control

Readme

@molecule/api-permissions

Auto-generated, AI-first package reference for the molecule.dev ecosystem. It is written to be read by coding agents as much as by people, and is generated from this package's source — edit src/index.ts JSDoc, not this file.

Provider-agnostic permissions interface for molecule.dev.

Defines the PermissionsProvider interface for role-based and attribute-based access control (RBAC/ABAC). Bond packages (Casbin, custom, etc.) implement this interface. Application code uses the convenience functions (can, assign, revoke, getRoles) which delegate to the bonded provider.

Quick Start

import { setProvider, can, assign } from '@molecule/api-permissions'
import { provider as casbin } from '@molecule/api-permissions-casbin'

setProvider(casbin)

await assign('user:123', 'editor')
const allowed = await can('user:123', 'write', 'project')

Type

core

Installation

npm install @molecule/api-permissions @molecule/api-bond @molecule/api-i18n

API

Interfaces

CreateRole

Input for creating a new role.

interface CreateRole {
  /** Human-readable name of the role. */
  name: string

  /** Optional description of the role's purpose. */
  description?: string

  /** Permissions to assign to the role. */
  permissions: Permission[]
}

Permission

A permission granting an action on a resource, optionally with conditions.

interface Permission {
  /** Unique identifier for this permission. */
  id: string

  /** The action this permission grants (e.g. `read`, `write`, `delete`). */
  action: string

  /** The resource this permission applies to (e.g. `project`, `user`, `*`). */
  resource: string

  /** Optional ABAC conditions that must be met for this permission to apply. */
  conditions?: Record<string, unknown>
}

PermissionsProvider

Permissions provider interface.

All permissions providers must implement this interface to provide authorization checking, role management, and permission assignment.

interface PermissionsProvider {
  /**
   * Checks whether a subject is allowed to perform an action on a resource.
   *
   * @param subject - The entity requesting access (e.g. user ID).
   * @param action - The action being requested (e.g. `read`, `write`).
   * @param resource - The resource being accessed (e.g. `project`).
   * @param context - Optional ABAC context attributes for condition evaluation.
   * @returns `true` if the subject is authorized.
   */
  can(
    subject: string,
    action: string,
    resource: string,
    context?: Record<string, unknown>,
  ): Promise<boolean>

  /**
   * Assigns a role to a subject, optionally within a scope.
   *
   * @param subject - The entity to assign the role to.
   * @param role - The role name to assign.
   * @param scope - Optional scope for the assignment (e.g. `org:123`).
   */
  assign(subject: string, role: string, scope?: string): Promise<void>

  /**
   * Revokes a role from a subject, optionally within a scope.
   *
   * @param subject - The entity to revoke the role from.
   * @param role - The role name to revoke.
   * @param scope - Optional scope for the revocation.
   */
  revoke(subject: string, role: string, scope?: string): Promise<void>

  /**
   * Retrieves all roles assigned to a subject.
   *
   * @param subject - The entity to look up roles for.
   * @returns The roles assigned to the subject.
   */
  getRoles(subject: string): Promise<Role[]>

  /**
   * Creates a new role definition.
   *
   * @param role - The role definition to create.
   * @returns The created role with an assigned `id`.
   */
  createRole(role: CreateRole): Promise<Role>

  /**
   * Deletes a role definition by ID.
   *
   * @param roleId - The ID of the role to delete.
   */
  deleteRole(roleId: string): Promise<void>

  /**
   * Retrieves all permissions granted by a role.
   *
   * @param role - The role name to look up permissions for.
   * @returns The permissions granted by the role.
   */
  getPermissions(role: string): Promise<Permission[]>

  /**
   * Adds a permission to an existing role.
   *
   * @param role - The role name to add the permission to.
   * @param permission - The permission to add.
   */
  addPermission(role: string, permission: Permission): Promise<void>

  /**
   * Removes a permission from a role.
   *
   * @param role - The role name to remove the permission from.
   * @param permissionId - The ID of the permission to remove.
   */
  removePermission(role: string, permissionId: string): Promise<void>
}

Role

A role grouping one or more permissions, optionally scoped.

interface Role {
  /** Unique identifier for this role. */
  id: string

  /** Human-readable name of the role (e.g. `admin`, `editor`). */
  name: string

  /** Optional description of the role's purpose. */
  description?: string

  /** Permissions granted by this role. */
  permissions: Permission[]

  /** Optional scope restricting where this role applies (e.g. `org:123`). */
  scope?: string
}

Functions

addPermission(role, permission)

Adds a permission to an existing role.

function addPermission(role: string, permission: Permission): Promise<void>
  • role — The role name to add the permission to.
  • permission — The permission to add.

Returns: Resolves when the permission is attached to the role.

assign(subject, role, scope)

Assigns a role to a subject, optionally within a scope.

function assign(subject: string, role: string, scope?: string): Promise<void>
  • subject — The entity to assign the role to.
  • role — The role name to assign.
  • scope — Optional scope for the assignment (e.g. org:123).

Returns: Resolves when the bonded provider records the assignment.

can(subject, action, resource, context)

Checks whether a subject is allowed to perform an action on a resource.

function can(
  subject: string,
  action: string,
  resource: string,
  context?: Record<string, unknown>,
): Promise<boolean>
  • subject — The entity requesting access (e.g. user ID).
  • action — The action being requested (e.g. read, write).
  • resource — The resource being accessed (e.g. project).
  • context — Optional ABAC context attributes for condition evaluation.

Returns: true if the subject is authorized.

createRole(role)

Creates a new role definition.

function createRole(role: CreateRole): Promise<Role>
  • role — The role definition to create.

Returns: The created role with an assigned id.

deleteRole(roleId)

Deletes a role definition by ID.

function deleteRole(roleId: string): Promise<void>
  • roleId — The ID of the role to delete.

Returns: Resolves when the role is removed.

getPermissions(role)

Retrieves all permissions granted by a role.

function getPermissions(role: string): Promise<Permission[]>
  • role — The role name to look up permissions for.

Returns: The permissions granted by the role.

getProvider()

Retrieves the bonded permissions provider, throwing if none is configured.

function getProvider(): PermissionsProvider

Returns: The bonded permissions provider.

getRoles(subject)

Retrieves all roles assigned to a subject.

function getRoles(subject: string): Promise<Role[]>
  • subject — The entity to look up roles for.

Returns: The roles assigned to the subject.

hasProvider()

Checks whether a permissions provider is currently bonded.

function hasProvider(): boolean

Returns: true if a permissions provider is bonded.

removePermission(role, permissionId)

Removes a permission from a role.

function removePermission(role: string, permissionId: string): Promise<void>
  • role — The role name to remove the permission from.
  • permissionId — The ID of the permission to remove.

Returns: Resolves when the permission is removed from the role.

revoke(subject, role, scope)

Revokes a role from a subject, optionally within a scope.

function revoke(subject: string, role: string, scope?: string): Promise<void>
  • subject — The entity to revoke the role from.
  • role — The role name to revoke.
  • scope — Optional scope for the revocation.

Returns: Resolves when the bonded provider records the revocation.

setProvider(provider)

Registers a permissions provider as the active singleton. Called by bond packages during application startup.

function setProvider(provider: PermissionsProvider): void
  • provider — The permissions provider implementation to bond.

Available Providers

| Provider | Package | | ---------------------------- | ---------------------------------- | | Casbin (RBAC) | @molecule/api-permissions-casbin | | Custom (in-memory RBAC/ABAC) | @molecule/api-permissions-custom |

Injection Notes

Requirements

Peer dependencies:

  • @molecule/api-bond ^1.0.1
  • @molecule/api-i18n ^1.0.1

Runtime Dependencies

  • @molecule/api-bond
  • @molecule/api-i18n

E2E Tests

Integration checklist — drive the real UI (live preview, no mocks), adapt each item to this app's actual screens/flows, and check every box off one by one. A box you can't check is an integration bug to fix — not a skip:

  • [ ] A user whose role HAS a permission can perform the gated action through the UI; a user whose role lacks it cannot.
  • [ ] Denial is enforced SERVER-SIDE: attempting the gated action anyway (or reloading after the attempt) shows nothing changed — hiding the button alone is not enforcement.
  • [ ] Role-gated screens/navigation are unreachable for unauthorized roles (redirect or clear denial — never a blank page or leaked data).
  • [ ] Assigning a role through the app's admin surface grants the new abilities, and revoking it removes them.
  • [ ] The same checks hold against OWNED resources: a permitted role still cannot act on another user's private records unless the app intends it.