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 🙏

© 2025 – Pkg Stats / Ryan Hefner

@shield-acl/core

v1.0.0

Published

Sistema ACL (Access Control List) inteligente e granular com algoritmos de permissões

Readme

@shield-acl/core

Características

  • 🎯 Granular: Controle fino de permissões com ações, recursos e condições
  • 🔐 Seguro: Deny by default, com negação explícita
  • 🚀 Performático: Cache inteligente e otimizações de avaliação
  • 🧩 Extensível: Sistema de plugins e condições customizadas
  • 🌳 Hierárquico: Herança de roles e composição de permissões
  • TypeScript: Totalmente tipado com IntelliSense completo
  • 🎪 Sem dependências: Algoritmos puros sem dependências externas

Instalação

npm install @shield-acl/core
# ou
yarn add @shield-acl/core
# ou
pnpm add @shield-acl/core

Uso Básico

import { ACL } from '@shield-acl/core'

// 1. Criar instância do ACL
const acl = new ACL()

// 2. Definir roles
acl.defineRole({
  name: 'admin',
  permissions: [
    { action: '*', resource: '*' } // Admin pode tudo
  ]
})

acl.defineRole({
  name: 'user',
  permissions: [
    { action: 'read', resource: 'posts' },
    { 
      action: ['update', 'delete'], 
      resource: 'posts',
      conditions: [(ctx) => ctx.resource?.authorId === ctx.user.id]
    }
  ]
})

// 3. Criar usuário
const user = {
  id: 1,
  roles: ['user'],
  permissions: [
    { action: 'create', resource: 'comments' } // Permissão direta
  ]
}

// 4. Verificar permissões
const canRead = acl.can(user, 'read', 'posts') // true
const canDelete = acl.can(user, 'delete', 'posts', {
  resource: { authorId: 1 }
}) // true (é o autor)

const canDeleteOthers = acl.can(user, 'delete', 'posts', {
  resource: { authorId: 2 }
}) // false (não é o autor)

Algoritmos e Conceitos

1. Avaliação de Permissões

O algoritmo de avaliação segue esta ordem de prioridade:

  1. Negações explícitas (deny) têm prioridade máxima
  2. Permissões diretas do usuário sobrescrevem roles
  3. Permissões das roles (com suporte a herança)
  4. Default deny se nenhuma regra permitir

2. Pattern Matching

Suporte completo a wildcards e patterns:

// Wildcards simples
{ action: 'posts.*' } // Qualquer ação em posts
{ action: '*.read' } // Leitura em qualquer recurso
{ action: '*', resource: 'admin/*' } // Qualquer ação em recursos admin

// Arrays de permissões
{ action: ['create', 'read', 'update'], resource: 'posts' }

// Negação explícita
{ action: 'delete', resource: 'users', deny: true }

3. Condições Dinâmicas

Avaliação condicional baseada em contexto:

const ownerCondition = (ctx) => ctx.resource?.ownerId === ctx.user.id
const publishedCondition = (ctx) => ctx.resource?.status === 'published'

acl.defineRole({
  name: 'author',
  permissions: [{
    action: 'edit',
    resource: 'posts',
    conditions: [ownerCondition] // Só pode editar próprios posts
  }]
})

4. Herança de Roles

Sistema hierárquico com herança múltipla:

acl.defineRole({
  name: 'moderator',
  inherits: ['user'], // Herda permissões de user
  permissions: [
    { action: 'moderate', resource: 'comments' },
    { action: 'ban', resource: 'users' }
  ]
})

acl.defineRole({
  name: 'admin',
  inherits: ['moderator'], // Herda de moderator (e user)
  permissions: [
    { action: '*', resource: '*' }
  ]
})

API Completa

ACL Class

const acl = new ACL(config?: ACLConfig)

Configurações disponíveis:

interface ACLConfig {
  wildcardPattern?: string    // Default: "*"
  caseSensitive?: boolean     // Default: false
  cache?: boolean            // Default: true
  cacheMaxSize?: number      // Default: 1000
  cacheTTL?: number          // Default: 300000 (5 min)
  defaultDeny?: boolean      // Default: true
  debug?: boolean            // Default: false
}

Métodos Principais

defineRole(role: Role): void

Define uma nova role no sistema.

can(user: User, action: string, resource?: string, context?: any): boolean

Verifica se o usuário tem permissão para executar a ação.

evaluate(user: User, action: string, resource?: string, context?: any): EvaluationResult

Retorna resultado detalhado da avaliação com motivo.

getUserPermissions(user: User): PermissionRule[]

Obtém todas as permissões efetivas do usuário.

getRoleHierarchy(roleName: string): string[]

Retorna a hierarquia completa de uma role.

clearCache(): void

Limpa o cache de avaliações.

Helpers e Utilities

Permission Builder

API fluente para criar permissões:

import { permission } from '@shield-acl/core'

const perm = permission()
  .action('posts.write')
  .resource('posts')
  .when((ctx) => ctx.user.verified)
  .build()

Presets

Conjuntos de permissões pré-definidos:

import { presets } from '@shield-acl/core'

// CRUD completo
const crudPosts = presets.crud('posts')
// Gera: create, read, update, delete para posts

// Somente leitura
const readOnly = presets.readonly(['posts', 'comments'])
// Gera: read para posts e comments

// Moderação
const modPerms = presets.moderation(['comments', 'posts'])
// Gera: approve, reject, flag para os recursos

Performance

Cache Inteligente

O sistema implementa cache LRU com TTL configurável:

  • Avaliações idênticas são cacheadas
  • Cache key baseado em: user.id + action + resource + context hash
  • Invalidação automática ao modificar roles
  • Limite configurável de entradas

Otimizações

  1. Early termination: Para ao encontrar deny explícito
  2. Pattern compilation: Regex compilados e cacheados
  3. Hierarchy memoization: Hierarquia de roles calculada uma vez
  4. Batch evaluation: Suporte para verificar múltiplas permissões

Testes

# Rodar testes
pnpm test

# Coverage
pnpm test:coverage

# Watch mode
pnpm test:watch

Documentação Adicional

Licença

MIT © Anderson D. Rosa