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

@creezio/access-control

v0.26.1

Published

Contrôle d'accès natif — rôles marque déclaratifs, overrides allow/deny en DB, matrice admin UI, résolution dynamique des permissions

Readme

@creezio/access-control

Module natif de contrôle d'accès des apps Creezio : visibilité des modules et des entrées de sidebar par rôle, administrable depuis une UI native (« Rôles & accès »), sans redéploiement.

Concepts

  • Rôles déclaratifs — la marque déclare ses rôles et leurs permissions par défaut dans la config (configureAccessControl). C'est la seule part « code » ; tout le reste vit en base.
  • Overrides en DB — table access_role_overrides (dans core.db) : (role, permission, effect allow|deny). Un deny l'emporte sur le défaut, un allow ajoute une permission hors défaut.
  • Rôle par compte — table access_user_roles (dans core.db) par défaut, ou adaptateurs getUserRole/setUserRole si la marque a sa propre source de vérité métier (ex. user_roles de winhub).
  • Overrides PAR COMPTE — table access_user_overrides (dans core.db) : (user_id, permission, effect allow|deny). Ajuste un compte précis par-dessus son rôle — priorité sur les overrides de rôle. C'est le mécanisme des permissions par module des apps admin (un comptable voit billing mais pas la flotte).
  • Résolution dynamique — resolvePermissions(userId, kitRole) = défauts du rôle + overrides de rôle + overrides du compte. Cache mémoire 30 s, invalidé à chaque PUT.
  • Audit — table access_audit_log : qui a changé quoi, quand.

Configuration (marque)

import { configureAccessControl } from "@creezio/access-control";

configureAccessControl({
  roles: [
    { id: "manager", label: "Manager", defaultPermissions: [...] },
    { id: "backoffice", label: "Backoffice", defaultPermissions: [...] },
  ],
  defaultRole: "backoffice",
  permissionGroups: [
    { id: "ventes", label: "Ventes", permissions: [
      { id: "nav.crm", label: "CRM" },
      { id: "nav.panier", label: "Panier" },
    ]},
  ],
  // Optionnel — source de vérité métier pour les rôles :
  // getUserRole: (userId) => ...,
  // setUserRole: (userId, role) => ...,
});

Le montage (routes + store) est fait par @creezio/app-runtime dès lors que configureAccessControl a été appelé au boot.

API

Montée sous /api/v1/access/ — gardée par la permission platform.access.manage (le propriétaire l'a toujours).

| Route | Description | | --- | --- | | GET /matrix | Rôles × permissions groupées, défauts + effectifs + overrides | | PUT /matrix | Sauvegarde { changes: [{ role, permission, effect: allow|deny|inherit }] } | | GET /users | Comptes avec rôle, permissions effectives, baseline du rôle et overrides | | PUT /users/:id/role | Change le rôle d'un compte ({ role }, null = défaut) | | PUT /users/:id/permissions | Overrides par compte { changes: [{ permission, effect: allow|deny|inherit }] } | | GET /audit?limit= | Journal d'audit, plus récent d'abord |

UI

AccessAdminClient (export @creezio/access-control/ui) — enregistré comme page admin native par app-runtime : OS → Admin → Rôles & accès.

Trois onglets : matrice des rôles (toggles allow/deny, retour au défaut par cellule), comptes (changement de rôle + permissions par compte — éditeur tri-état hérite/autorisé/refusé par permission), journal d'audit.

Apps admin (permissions par module)

Les apps admin générées par la factory appellent configureAccessControl(adminAccessControlPreset()) (@creezio/admin) dans brand-platform-bindings.ts : rôle unique collaborator avec tous les modules par défaut (politique de migration sans lockout) — l'owner restreint ensuite compte par compte (onglet Comptes) ou pour tout le rôle (matrice). Bootstrap sans UI :

creezio server-docker access main --brand-root <admin> \
  --user [email protected] --reset --grant nav.billing,nav.clients

Tests

npm run build --workspace @creezio/access-control
npm test --workspace @creezio/access-control