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

@fotbiler/rulegate-angular

v1.0.0

Published

Angular authorization helpers for RuleGate applications.

Readme

RuleGate Angular

@fotbiler/rulegate-angular provides fail-closed Angular helpers for consuming a frontend authorization projection in RuleGate applications.

[!IMPORTANT] Browser-side guards and directives are user-experience controls, not security boundaries. Always enforce authorization on the backend with RuleGate.

Install

pnpm add @fotbiler/[email protected] @fotbiler/[email protected]

The package supports Angular 20–22. Older applications should follow the frontend compatibility guide.

Supply authorization state

Load the current user's frontend authorization projection through application code, then replace the complete SDK snapshot:

import { inject } from '@angular/core';
import { RuleGateAuthorizationClient } from '@fotbiler/rulegate-angular';

const authorization = inject(RuleGateAuthorizationClient);

authorization.replaceSnapshot({
  permissions: ['documents.read'],
  policies: ['documents-read'],
  roles: ['documents.reader'],
});

Call clear() during sign-out and before replacing identity state. Missing or malformed state denies every check.

Protect routes

Declarative route metadata keeps requirements visible in route configuration:

import { Routes } from '@angular/router';
import { ruleGateGuard, ruleGateRouteData } from '@fotbiler/rulegate-angular';

import { RuleGateIdentifiers } from './generated/rulegate';

export const routes: Routes = [
  {
    path: 'documents',
    loadComponent: () => import('./documents/documents.component'),
    canActivate: [ruleGateGuard],
    data: ruleGateRouteData({
      permission: RuleGateIdentifiers.permissions.documentsRead,
    }),
  },
];

Missing or malformed metadata denies. Configure provideRuleGateDeniedNavigation to return an Angular UrlTree or RedirectCommand for valid denied requirements. The direct permission, policy, and role guard factories remain available.

Control template visibility

Import the standalone directive and pass exactly one permission, policy, or role requirement:

import { Component } from '@angular/core';
import { RuleGateCanDirective, RuleGateDisableDirective } from '@fotbiler/rulegate-angular';

import { RuleGateIdentifiers } from './generated/rulegate';

@Component({
  selector: 'app-document-actions',
  imports: [RuleGateCanDirective, RuleGateDisableDirective],
  template: `
    <button *ruleGateCan="{ permission: permissions.documentsWrite }; else unavailable">
      Edit document
    </button>
    <ng-template #unavailable>Editing is unavailable.</ng-template>

    <button [ruleGateDisable]="{ permission: permissions.documentsDelete }">Delete document</button>
  `,
})
export class DocumentActionsComponent {
  readonly permissions = RuleGateIdentifiers.permissions;
}

The structural directive supports an else template. The disabled-state directive owns the native disabled property where available and blocks denied click activation on other hosts.

Generate TypeScript identifiers

Generate deterministic constants directly from rulegate.yaml:

pnpm exec rulegate-angular generate rulegate.yaml --output src/app/generated/rulegate.ts
pnpm exec rulegate-angular generate rulegate.yaml --output src/app/generated/rulegate.ts --check

The generator fails on malformed identifier-bearing manifest shapes and name collisions, writes atomically, and checks output byte-for-byte. Use the backend RuleGate CLI for authoritative full-manifest validation.

Backend-only requirement kinds, including attribute comparisons, time windows, date-time windows, context age, and canonical context policies, are accepted while the generator collects frontend policy, permission, role, resource-type, and action identifiers.

Security behavior

  • Uninitialized state denies every check.
  • Invalid or whitespace-padded identifiers invalidate the complete snapshot.
  • Permission, policy, and role matching is exact and case-sensitive.
  • A directive requirement containing both or neither identifier kind denies.
  • Missing or malformed declarative route metadata denies navigation.
  • Browser state can be modified by the user and never replaces backend authorization.

See the full RuleGate Angular guide and security model.

The document-approval reference application shows generated identifiers, guards, visibility and disabled-state directives, Keycloak integration, and backend enforcement in one package-consuming host.

Optional Keycloak adapter

Import @fotbiler/rulegate-angular/keycloak when the host application uses Keycloak. The secondary entrypoint converts an authenticated keycloak-js session into the generic RuleGate snapshot without owning login, refresh, logout, callbacks, or token storage. The package does not require keycloak-js.

See the Keycloak integration guide for the Angular and ASP.NET Core composition model.

License

Licensed under the MIT License.