docs: update portal for WRNexusJS 0.8.72

- Bump every @wrnexus/* dependency to its latest release (ui 0.8.88,
  styles 0.8.26, cli 0.8.72, core 0.8.16, i18n 0.8.12, ...) and refresh
  bun.lock and package-lock.json. graphql/native 0.8.8 were republished,
  so their stale lockfile integrity entries were re-resolved.
- wrnexus.config.ts: drop `functions` and `compatibility`, both removed
  from the framework.
- Regenerate package, portal and discovery docs from the installed
  packages, including the new 0.8.72 release page.
- Package pages now install each package's own released version
  (ui 0.8.88, core 0.8.16) instead of stamping the CLI version on all.
- llms.txt / llms-full.txt: the generator kept every earlier run's CLI
  reference and appended another; it now replaces it, so the guide holds
  one current reference and no longer advertises the removed
  `wrnexus compatibility` command.
- docs.test.ts: compileWireFile was renamed compileWrnFile; tests follow
  the per-package install versions and the removed command.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ClintchizandClaude Opus 5.5 committed 2026-09-30 16:46:32 +05:30
1 parent 5c591ab7de
commit b536b57447
105 files changed
+24822 -12503

No files matched your search

+78 -8
View File
@@ -10,7 +10,7 @@ page wrnexusauthz {
<header class="topbar">
<a class="brand" href="/"><span>W</span> WRNexusJS</a>
<nav aria-label="Primary"><a href="/getting-started">Get started</a><a href="/packages">Packages</a><a href="https://component.wrnexusjs.dev/">Components</a><a href="/language">Language</a><a href="/architecture">Architecture</a></nav>
<div class="topbar-actions"><a class="preview-pill" href="/access">Private preview · v0.8.8</a><button data-wire-theme-toggle class="theme-button" aria-label="Toggle color theme" title="Toggle color theme">◐</button></div>
<div class="topbar-actions"><a class="preview-pill" href="/access">Private preview · v0.8.72</a><button data-wire-theme-toggle class="theme-button" aria-label="Toggle color theme" title="Toggle color theme">◐</button></div>
</header>
<div class="mobile-doc-nav"><details><summary>Browse documentation</summary><nav><a href="/getting-started">Get started</a><a href="/packages">Packages</a><a href="https://component.wrnexusjs.dev/">Components</a><a href="/language">Language</a><a href="/architecture">Architecture</a><a href="/tutorial">Tutorial</a><a href="/guides/project-structure">Guides</a><a href="/examples">Examples</a><a href="/search">Search</a></nav></details></div>
<main id="main" class="portal-main docs-layout docs-layout--navigation"><aside class="docs-section-menu" aria-label="Documentation sections"><nav>
@@ -20,7 +20,7 @@ page wrnexusauthz {
<section><strong>Reference</strong><a href="/packages">Packages overview</a><a href="/packages/cli">CLI</a><a href="/language">.wrn language</a><a href="https://component.wrnexusjs.dev/">Components</a><a href="/examples">Examples</a></section>
<section class="package-menu"><strong>Packages</strong><a href="/packages/ai">@wrnexus/ai</a><a href="/packages/auth">@wrnexus/auth</a><a href="/packages/authz">@wrnexus/authz</a><a href="/packages/benchmark">@wrnexus/benchmark</a><a href="/packages/cache">@wrnexus/cache</a><a href="/packages/captcha">@wrnexus/captcha</a><a href="/packages/cli">@wrnexus/cli</a><a href="/packages/compiler">@wrnexus/compiler</a><a href="/packages/content">@wrnexus/content</a><a href="/packages/core">@wrnexus/core</a><a href="/packages/csr">@wrnexus/csr</a><a href="/packages/db">@wrnexus/db</a><a href="/packages/dev-server">@wrnexus/dev-server</a><a href="/packages/dev-toolbar">@wrnexus/dev-toolbar</a><a href="/packages/encryption">@wrnexus/encryption</a><a href="/packages/graphql">@wrnexus/graphql</a><a href="/packages/helpers">@wrnexus/helpers</a><a href="/packages/i18n">@wrnexus/i18n</a><a href="/packages/identity">@wrnexus/identity</a><a href="/packages/image">@wrnexus/image</a><a href="/packages/jwt">@wrnexus/jwt</a><a href="/packages/language-server">@wrnexus/language-server</a><a href="/packages/mcp">@wrnexus/mcp</a><a href="/packages/mobile">@wrnexus/mobile</a><a href="/packages/native">@wrnexus/native</a><a href="/packages/oauth">@wrnexus/oauth</a><a href="/packages/observability">@wrnexus/observability</a><a href="/packages/playground">@wrnexus/playground</a><a href="/packages/plugin">@wrnexus/plugin</a><a href="/packages/pubsub">@wrnexus/pubsub</a><a href="/packages/pwa">@wrnexus/pwa</a><a href="/packages/queue">@wrnexus/queue</a><a href="/packages/reactive">@wrnexus/reactive</a><a href="/packages/realtime">@wrnexus/realtime</a><a href="/packages/router">@wrnexus/router</a><a href="/packages/security">@wrnexus/security</a><a href="/packages/ssr">@wrnexus/ssr</a><a href="/packages/store">@wrnexus/store</a><a href="/packages/styles">@wrnexus/styles</a><a href="/packages/syntax">@wrnexus/syntax</a><a href="/packages/test">@wrnexus/test</a><a href="/packages/tracking">@wrnexus/tracking</a><a href="/packages/typecheck">@wrnexus/typecheck</a><a href="/packages/ui">@wrnexus/ui</a><a href="/packages/uploader">@wrnexus/uploader</a><a href="/packages/validation">@wrnexus/validation</a></section>
</nav></aside><div class="docs-reading-column">
<article class="documentation prose standalone package-document"><nav class="breadcrumbs" aria-label="Breadcrumb"><a href="/">Home</a><span>/</span><a href="/packages">Packages</a><span>/</span><span aria-current="page">@wrnexus/authz</span></nav><section class="doc-intro"><span class="eyebrow">Security · Package reference</span><h1>@wrnexus/authz</h1><p>Role, permission, policy, and authorization guards.</p><div class="doc-meta"><span>v0.8.8</span><span>Private registry</span><span>Security</span></div><section id="access" class="access-callout"><h2>Install the package</h2><p>After WorkRoot approves private registry access, install the release-aligned package:</p><pre><code>bun add @wrnexus/authz@0.8.8</code><button type="button" class="copy-button" aria-label="Copy installation command">Copy</button></pre><p><a href="/access">Request preview access</a>. Never put registry tokens in source control.</p></section></section><section id="guide"><blockquote>Composable authorization for WRNexusJS — role-based (RBAC), policy-based (PBAC), and attribute-based (ABAC) access control that reduces to a boolean check plus an <code>authorize()</code> guard.</blockquote>
<article class="documentation prose standalone package-document"><nav class="breadcrumbs" aria-label="Breadcrumb"><a href="/">Home</a><span>/</span><a href="/packages">Packages</a><span>/</span><span aria-current="page">@wrnexus/authz</span></nav><section class="doc-intro"><span class="eyebrow">Security · Package reference</span><h1>@wrnexus/authz</h1><p>Role, permission, policy, and authorization guards.</p><div class="doc-meta"><span>v0.8.15</span><span>Private registry</span><span>Security</span></div><section id="access" class="access-callout"><h2>Install the package</h2><p>After WorkRoot approves private registry access, install the package:</p><pre><code>bun add @wrnexus/authz@0.8.15</code><button type="button" class="copy-button" aria-label="Copy installation command">Copy</button></pre><p><a href="/access">Request preview access</a>. Never put registry tokens in source control.</p></section></section><section id="guide"><blockquote>Composable authorization for WRNexusJS — role-based (RBAC), policy-based (PBAC), and attribute-based (ABAC) access control that reduces to a boolean check plus an <code>authorize()</code> guard.</blockquote>
<p>Part of the <strong>WRNexusJS</strong> framework — an SSR-first, Bun-native full-stack web framework.</p>
<h3 id="overview">Overview</h3>
<p><code>@wrnexus/authz</code> is a small, server-side authorization toolkit. It gives you three interchangeable models — RBAC (roles → permissions), PBAC (policy predicates), and ABAC (attribute matchers) — that all collapse to a <code>boolean | Promise&lt;boolean&gt;</code> decision. Wrap any decision in a <code>Middleware</code> guard (<code>authorize</code>, <code>requireRole</code>, <code>requirePermission</code>) to protect WRNexusJS routes. Reach for it whenever a route or action needs to be gated on who the user is, what roles they hold, or attributes of the user and the resource. It plugs into <code>@wrnexus/core</code> by reading <code>ctx.user</code> as the authorization subject.</p>
@@ -209,12 +209,12 @@ function guard(permission: Permission) &#123;
* Validate and freeze one authorization declaration. Called from
* `app/authz/&lt;name&gt;.ts` as the module's default export.
*/
declare function defineAuthz(module: AuthzModule): AuthzModule;
declare function defineAuthz&lt;Subject = any, Resource = any&gt;(module: AuthzModule&lt;Subject, Resource&gt;): DefinedAuthzModule&lt;Subject, Resource&gt;;
interface CatalogSource &#123;
/** File or package that declared this module, used in conflict messages. */
source: string;
module: AuthzModule;
module: AuthzModule&lt;never, never&gt;;
&#125;
declare function emptyCatalog(): AuthzCatalog;
declare function mergeCatalogs(sources: CatalogSource[]): AuthzCatalog;
@@ -338,8 +338,29 @@ declare function createAuthzResolver(options: AuthzResolverOptions): AuthzResolv
* @wrnexus/authz. The per-request resolver lives here instead.
*/
declare const AUTHZ_LOCALS_KEY = &quot;_authz&quot;;
interface AuthorizationResponses &#123;
forbidden(decision?: AuthorizationDecision, options?: &#123;
exposeReason?: boolean;
&#125;): Response;
notFoundOrForbidden(options?: &#123;
mayDiscover?: boolean;
decision?: AuthorizationDecision;
exposeReason?: boolean;
&#125;): Response;
&#125;
interface RequestAuthorization extends AuthorizationResponses &#123;
can(permission: string, resource?: unknown): Promise&lt;boolean&gt;;
decide(permission: string, resource?: unknown): Promise&lt;AuthorizationDecision&gt;;
&#125;
declare module &quot;@wrnexus/core&quot; &#123;
interface Context &#123;
/** Installed by authzMiddleware for handlers that prefer context-local authorization. */
authz?: RequestAuthorization;
&#125;
&#125;
/** Install the per-request resolver. Register early, after sessionAuth. */
declare function authzMiddleware(options: AuthzResolverOptions): Middleware;
declare function getRequestAuthorization(ctx: Context): RequestAuthorization;
/**
* Object resources are memoised by identity (`byRef`), never by serialising
* their contents — serialisation is what let unrelated resources collide
@@ -372,6 +393,47 @@ declare function guardPermission(permission: string, options?: GuardOptions): Mi
/** Keep only the items the current subject may act on. */
declare function filterCan&lt;T&gt;(ctx: Context, permission: string, items: readonly T[]): Promise&lt;T[]&gt;;
interface AuthorizedHandlerOptions&lt;Resource, Result extends Response = Response&gt; &#123;
permission: string;
resource?: (ctx: Context) =&gt; Resource | null | undefined | Promise&lt;Resource | null | undefined&gt;;
exposeReason?: boolean;
mayDiscover?: (ctx: Context) =&gt; boolean | Promise&lt;boolean&gt;;
handle(ctx: Context &amp; &#123;
resource: Resource;
&#125;): Result | Promise&lt;Result&gt;;
&#125;
/** Define an API handler whose resource loading and permission check cannot be skipped. */
declare function defineAuthorizedHandler&lt;Resource = undefined, Result extends Response = Response&gt;(options: AuthorizedHandlerOptions&lt;Resource, Result&gt;): (ctx: Context) =&gt; Promise&lt;Response&gt;;
interface OwnedResourceDefinition&lt;Resource&gt; &#123;
name: string;
owner(resource: Resource): string | null | undefined;
permissions: &#123;
read?: string;
create?: string;
update?: string;
delete?: string;
readAny?: string;
writeAny?: string;
&#125;;
&#125;
/** Shared ownership and override vocabulary for application resource modules. */
declare function defineOwnedResource&lt;Resource&gt;(definition: OwnedResourceDefinition&lt;Resource&gt;): Readonly&lt;&#123;
attributes(resource: Resource): &#123;
ownerId: string | null | undefined;
&#125;;
isOwner(subjectId: string, resource: Resource): boolean;
name: string;
owner(resource: Resource): string | null | undefined;
permissions: &#123;
read?: string;
create?: string;
update?: string;
delete?: string;
readAny?: string;
writeAny?: string;
&#125;;
&#125;&gt;;
/**
* Emit `Permission`/`Role` string-literal unions from the registered catalog.
*
@@ -465,14 +527,22 @@ interface AttributeMeta &#123;
description?: string;
&#125;
/** One `app/authz/&lt;name&gt;.ts` declaration. */
interface AuthzModule &#123;
interface AuthzModule&lt;Subject = any, Resource = any&gt; &#123;
permissions?: Record&lt;string, PermissionMeta&gt;;
roles?: Record&lt;string, string[]&gt;;
policies?: Record&lt;string, DecisionPolicy&lt;never, never&gt;&gt;;
policies?: Record&lt;string, DecisionPolicy&lt;Subject, Resource&gt;&gt;;
attributes?: Record&lt;string, AttributeMeta&gt;;
/** permission id -&gt; policy names that must pass for it. */
bindings?: Record&lt;string, string[]&gt;;
&#125;
/** A declaration after defineAuthz() has supplied all optional collections. */
type DefinedAuthzModule&lt;Subject = any, Resource = any&gt; = &#123;
permissions: Record&lt;string, PermissionMeta&gt;;
roles: Record&lt;string, string[]&gt;;
policies: Record&lt;string, DecisionPolicy&lt;Subject, Resource&gt;&gt;;
attributes: Record&lt;string, AttributeMeta&gt;;
bindings: Record&lt;string, string[]&gt;;
&#125;;
/** The merged, frozen view of every declaration in the app. */
interface AuthzCatalog &#123;
permissions: ReadonlyMap&lt;string, PermissionMeta&gt;;
@@ -527,7 +597,7 @@ interface CacheOptions &#123;
*/
declare function cachedPermissionStore(inner: PermissionStore, options?: CacheOptions): CachedPermissionStore;
export &#123; AUTHZ_LOCALS_KEY, type AttributeMeta, type AuthorizationDecision, type AuthorizeDecisionOptions, type AuthzAuditEvent, type AuthzAuditSink, type AuthzCatalog, type AuthzModule, type AuthzResolver, type AuthzResolverOptions, type AuthzScope, type CacheOptions, type CachedPermissionStore, type CatalogSource, type DecideInput, type DecisionPolicy, type GrantEffect, type GuardOptions, type MemoryAuditSink, type PermissionMeta, type PermissionStore, type Policy, type Rbac, type Subject, type SubjectAssignments, all, allDecisions, allow, any, anyDecision, attr, authorize, authorizeDecision, authzMiddleware, cachedPermissionStore, can, consoleAuditSink, createAuthzResolver, decideFor, decision, defineAuthz, defineRbac, deniedBy, deny, emptyCatalog, expandRoles, filterAuthorized, filterCan, generatePermissionTypes, getAuthzCatalog, guardPermission, hasAuthzCatalog, hasRole, memoryAuditSink, memoryPermissionStore, mergeCatalogs, owner, permissionMatches, requirePermission, requireRole, safeRecord, scopeKey, setAuthzCatalog &#125;;
export &#123; AUTHZ_LOCALS_KEY, type AttributeMeta, type AuthorizationDecision, type AuthorizationResponses, type AuthorizeDecisionOptions, type AuthorizedHandlerOptions, type AuthzAuditEvent, type AuthzAuditSink, type AuthzCatalog, type AuthzModule, type AuthzResolver, type AuthzResolverOptions, type AuthzScope, type CacheOptions, type CachedPermissionStore, type CatalogSource, type DecideInput, type DecisionPolicy, type GrantEffect, type GuardOptions, type MemoryAuditSink, type OwnedResourceDefinition, type PermissionMeta, type PermissionStore, type Policy, type Rbac, type RequestAuthorization, type Subject, type SubjectAssignments, all, allDecisions, allow, any, anyDecision, attr, authorize, authorizeDecision, authzMiddleware, cachedPermissionStore, can, consoleAuditSink, createAuthzResolver, decideFor, decision, defineAuthorizedHandler, defineAuthz, defineOwnedResource, defineRbac, deniedBy, deny, emptyCatalog, expandRoles, filterAuthorized, filterCan, generatePermissionTypes, getAuthzCatalog, getRequestAuthorization, guardPermission, hasAuthzCatalog, hasRole, memoryAuditSink, memoryPermissionStore, mergeCatalogs, owner, permissionMatches, requirePermission, requireRole, safeRecord, scopeKey, setAuthzCatalog &#125;;
</code></pre></section><section id="examples" class="examples"><h2>Examples</h2><p>Copy-ready examples from the installed package documentation.</p><div class="example-grid"><article class="example-card"><h3>RBAC</h3><pre data-language="ts"><code>import &#123; defineRbac, hasRole &#125; from &quot;@wrnexus/authz&quot;;
const rbac = defineRbac(&#123;
@@ -586,7 +656,7 @@ app.put(
);</code></pre></article></div></section></article></div>
<aside class="on-this-page"><h2>On this page</h2><nav><a class="toc-level-2" href="#guide">Guide</a><a class="toc-level-3" href="#overview">Overview</a><a class="toc-level-3" href="#api">API</a><a class="toc-level-4" href="#types">Types</a><a class="toc-level-4" href="#rbac">RBAC</a><a class="toc-level-4" href="#definerbac-roles-record-string-string-rbac">defineRbac(roles: Record&lt;string, string[]&gt;): Rbac</a><a class="toc-level-4" href="#hasrole-subject-subject-undefined-required-string-boolean">hasRole(subject: Subject | undefined, ...required: string[]): boolean</a><a class="toc-level-4" href="#pbac-abac-combinators">PBAC / ABAC combinators</a><a class="toc-level-4" href="#guards-middleware">Guards (middleware)</a><a class="toc-level-3" href="#usage">Usage</a><a class="toc-level-4" href="#rbac-2">RBAC</a><a class="toc-level-4" href="#guarding-routes">Guarding routes</a><a class="toc-level-4" href="#pbac-abac-policies">PBAC / ABAC policies</a><a class="toc-level-3" href="#requirements-notes">Requirements / Notes</a><a class="toc-level-3" href="#declaring-permissions">Declaring permissions</a><a class="toc-level-3" href="#checking-permissions">Checking permissions</a><a class="toc-level-3" href="#precedence">Precedence</a><a class="toc-level-3" href="#cli">CLI</a><a class="toc-level-2" href="#api">Complete API</a><a class="toc-level-2" href="#examples">Examples</a></nav></aside>
</main>
<footer><div class="footer-brand"><span class="footer-mark" aria-hidden="true">W</span><p><strong>WRNexusJS 0.8.8</strong><span>Complete API documentation generated from installed package declarations.</span></p></div><nav aria-label="Footer"><a href="/packages">All packages</a><a href="/getting-started">Get started</a><a href="/security">Security</a><a href="/support">Support</a><a href="/llms.txt">AI guide</a></nav><p class="footer-meta">Private Developer Preview · Bun-native</p></footer>
<footer><div class="footer-brand"><span class="footer-mark" aria-hidden="true">W</span><p><strong>WRNexusJS 0.8.72</strong><span>Complete API documentation generated from installed package declarations.</span></p></div><nav aria-label="Footer"><a href="/packages">All packages</a><a href="/getting-started">Get started</a><a href="/security">Security</a><a href="/support">Support</a><a href="/llms.txt">AI guide</a></nav><p class="footer-meta">Private Developer Preview · Bun-native</p></footer>
</div>
}
}