From b536b57447cc10e094e7a3f4403c75226b7231dd Mon Sep 17 00:00:00 2001 From: Ajay Ghanwat Date: Wed, 30 Sep 2026 16:46:32 +0530 Subject: [PATCH] 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 --- app/docs.test.ts | 13 +- app/pages/404.wrn | 4 +- app/pages/access.wrn | 6 +- app/pages/architecture.wrn | 6 +- app/pages/benchmarks.wrn | 4 +- app/pages/changelog.wrn | 6 +- app/pages/examples.wrn | 6 +- app/pages/getting-started.wrn | 6 +- app/pages/guides/api-routes.wrn | 8 +- app/pages/guides/authentication.wrn | 8 +- app/pages/guides/authorization.wrn | 8 +- .../guides/configuration-and-profiles.wrn | 8 +- app/pages/guides/database.wrn | 8 +- app/pages/guides/deployment.wrn | 8 +- app/pages/guides/forms-and-validation.wrn | 8 +- app/pages/guides/full-stack-auth-demo.wrn | 10 +- app/pages/guides/i18n-and-themes.wrn | 8 +- app/pages/guides/middleware.wrn | 8 +- app/pages/guides/mobile.wrn | 8 +- app/pages/guides/observability.wrn | 8 +- app/pages/guides/pages-and-components.wrn | 8 +- app/pages/guides/project-structure.wrn | 8 +- app/pages/guides/pubsub.wrn | 8 +- app/pages/guides/queues.wrn | 8 +- app/pages/guides/realtime.wrn | 8 +- app/pages/guides/routing.wrn | 8 +- app/pages/guides/security.wrn | 8 +- app/pages/guides/server-data.wrn | 8 +- app/pages/guides/testing.wrn | 8 +- app/pages/guides/troubleshooting.wrn | 8 +- app/pages/guides/upgrading.wrn | 8 +- app/pages/guides/uploads.wrn | 8 +- app/pages/guides/workspaces-and-gateway.wrn | 8 +- app/pages/index.wrn | 10 +- app/pages/language.wrn | 6 +- app/pages/license.wrn | 4 +- app/pages/packages.wrn | 6 +- app/pages/packages/ai.wrn | 6 +- app/pages/packages/auth.wrn | 79 +- app/pages/packages/authz.wrn | 86 +- app/pages/packages/benchmark.wrn | 6 +- app/pages/packages/cache.wrn | 6 +- app/pages/packages/captcha.wrn | 8 +- app/pages/packages/cli.wrn | 13 +- app/pages/packages/compiler.wrn | 178 +- app/pages/packages/content.wrn | 6 +- app/pages/packages/core.wrn | 77 +- app/pages/packages/csr.wrn | 41 +- app/pages/packages/db.wrn | 110 +- app/pages/packages/dev-server.wrn | 82 +- app/pages/packages/dev-toolbar.wrn | 6 +- app/pages/packages/encryption.wrn | 25 +- app/pages/packages/graphql.wrn | 6 +- app/pages/packages/helpers.wrn | 62 +- app/pages/packages/i18n.wrn | 29 +- app/pages/packages/identity.wrn | 6 +- app/pages/packages/image.wrn | 6 +- app/pages/packages/jwt.wrn | 6 +- app/pages/packages/language-server.wrn | 12 +- app/pages/packages/mcp.wrn | 6 +- app/pages/packages/mobile.wrn | 6 +- app/pages/packages/native.wrn | 6 +- app/pages/packages/oauth.wrn | 6 +- app/pages/packages/observability.wrn | 6 +- app/pages/packages/playground.wrn | 6 +- app/pages/packages/plugin.wrn | 6 +- app/pages/packages/pubsub.wrn | 6 +- app/pages/packages/pwa.wrn | 6 +- app/pages/packages/queue.wrn | 362 +- app/pages/packages/reactive.wrn | 27 +- app/pages/packages/realtime.wrn | 8 +- app/pages/packages/router.wrn | 8 +- app/pages/packages/security.wrn | 6 +- app/pages/packages/ssr.wrn | 10 +- app/pages/packages/store.wrn | 6 +- app/pages/packages/styles.wrn | 209 +- app/pages/packages/syntax.wrn | 20 +- app/pages/packages/test.wrn | 50 +- app/pages/packages/tracking.wrn | 6 +- app/pages/packages/typecheck.wrn | 9 +- app/pages/packages/ui.wrn | 88 +- app/pages/packages/uploader.wrn | 12 +- app/pages/packages/validation.wrn | 20 +- app/pages/releases/0.8.72.wrn | 24 + app/pages/roadmap.wrn | 4 +- app/pages/search.wrn | 4 +- app/pages/security.wrn | 6 +- app/pages/showcase.wrn | 6 +- app/pages/support.wrn | 4 +- app/pages/tutorial.wrn | 6 +- app/routes.gen.ts | 398 +- app/types/wrnexus.generated.api-checks.ts | 7 + app/types/wrnexus.generated.d.ts | 194 +- bun.lock | 330 +- docs/release-access-status.md | 4 +- docs/site-audit.md | 4 +- package-lock.json | 618 +- package.json | 74 +- public/docs-index.json | 186 +- public/llms-full.txt | 31738 +++++++++++----- public/llms.txt | 1668 +- public/sitemap.xml | 2 +- scripts/generate-docs.ts | 7 +- scripts/generate-portal.ts | 4 +- wrnexus.config.ts | 7 - 105 files changed, 24822 insertions(+), 12503 deletions(-) create mode 100644 app/pages/releases/0.8.72.wrn create mode 100644 app/types/wrnexus.generated.api-checks.ts diff --git a/app/docs.test.ts b/app/docs.test.ts index 29a54143..59bf671f 100644 --- a/app/docs.test.ts +++ b/app/docs.test.ts @@ -3,7 +3,7 @@ import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from import { tmpdir } from "node:os"; import { join } from "node:path"; import { pathToFileURL } from "node:url"; -import { compileWireFile } from "@wrnexus/compiler"; +import { compileWrnFile } from "@wrnexus/compiler"; import { mountHtml } from "@wrnexus/test"; const root = join(import.meta.dir, ".."); @@ -70,7 +70,10 @@ test("generates one detailed page for every published package", () => { test("every package page contains installation, guide, and complete API sections", () => { for (const name of expected) { const source = readFileSync(join(packagePages, `${name}.wrn`), "utf8"); - expect(source).toContain(`bun add @wrnexus/${name}@${frameworkVersion}`); + const installed = JSON.parse( + readFileSync(join(root, "node_modules", "@wrnexus", name, "package.json"), "utf8"), + ).version; + expect(source).toContain(`bun add @wrnexus/${name}@${installed}`); expect(source).toContain('id="guide"'); expect(source).toContain('id="api"'); expect(source).toContain("Complete TypeScript API"); @@ -186,7 +189,9 @@ test("portal exposes truthful access and machine discovery", () => { expect(llms).toContain("https://component.wrnexusjs.dev/"); expect(llms).toContain("# Complete CLI command reference"); expect(llms).toContain("wrnexus production [workspace-dir]"); - expect(llms).toContain("wrnexus compatibility "); + // The compatibility command was removed from the CLI along with the + // compatibility config surface; the guide must not advertise it. + expect(llms).not.toContain("wrnexus compatibility "); expect(llms).toContain("wrnexus inspect component "); expect(llms).toContain("## CLI workflows with expected output"); expect(llms).toContain("✓ Application types are valid"); @@ -273,7 +278,7 @@ test("clicking a category hides packages from other categories", async () => { const directory = join(tmpdir(), "wrnexus-doc-tests"); mkdirSync(directory, { recursive: true }); const modulePath = join(directory, `packages-${Date.now()}.ts`); - writeFileSync(modulePath, compileWireFile(source)); + writeFileSync(modulePath, compileWrnFile(source)); const page = (await import(pathToFileURL(modulePath).href)).default as () => string; const mounted = mountHtml(page()); const dataButton = mounted diff --git a/app/pages/404.wrn b/app/pages/404.wrn index 33241300..d6cd232d 100644 --- a/app/pages/404.wrn +++ b/app/pages/404.wrn @@ -7,7 +7,7 @@ page Pagenotfound { view {
-
W WRNexusJS
+
W WRNexusJS
- +
} } \ No newline at end of file diff --git a/app/pages/access.wrn b/app/pages/access.wrn index ab5c2974..489e7815 100644 --- a/app/pages/access.wrn +++ b/app/pages/access.wrn @@ -7,7 +7,7 @@ page Access { view {
-
W WRNexusJS
+
W WRNexusJS

Request preview access

WRNexusJS 0.8.8 packages are not available from the public npm registry. Installation requires approval and private registry credentials supplied by WorkRoot. Never paste registry tokens into source control, issue reports, or support messages.

Request process

  1. Contact WorkRoot through the public contact path at workroot.in.
  2. Describe the application, team, expected deployment, and Bun environment.
  3. After approval, follow the registry instructions supplied privately.
  4. Use the canonical scaffold command below only after authentication.
bunx @wrnexus/cli@0.8.8 create my-app

Access approval, response time, licensing terms, and support level remain owner-controlled. This site does not collect access requests directly.

- +

Request preview access

WRNexusJS 0.8.72 packages are not available from the public npm registry. Installation requires approval and private registry credentials supplied by WorkRoot. Never paste registry tokens into source control, issue reports, or support messages.

Request process

  1. Contact WorkRoot through the public contact path at workroot.in.
  2. Describe the application, team, expected deployment, and Bun environment.
  3. After approval, follow the registry instructions supplied privately.
  4. Use the canonical scaffold command below only after authentication.
bunx @wrnexus/cli@0.8.72 create my-app

Access approval, response time, licensing terms, and support level remain owner-controlled. This site does not collect access requests directly.

+
} } \ No newline at end of file diff --git a/app/pages/architecture.wrn b/app/pages/architecture.wrn index 40f4f007..e2e5ebe9 100644 --- a/app/pages/architecture.wrn +++ b/app/pages/architecture.wrn @@ -7,7 +7,7 @@ page Architecture { view {
-
W WRNexusJS
+
W WRNexusJS
Framework architecture · 0.8.8

Architecture

WRNexusJS is Bun-native and SSR-first. File discovery maps pages and API handlers; middleware enriches or short-circuits a request; the compiler turns .wrn declarations into server render functions and small feature runtimes.

Request and build lifecycle

  1. DiscoverPages, APIs, middleware, components, layouts, schemas, rooms
  2. CompileParse .wrn, validate grammar, generate server code
  3. RequestLimits, security, locale, session, middleware
  4. MatchStatic and dynamic file route
  5. RenderSSR data, escaped interpolation, components, metadata
  6. EnhanceOnly required reactive/directive runtimes

Package boundaries

core owns contexts, middleware, sessions and rooms; router discovers routes; compiler parses .wrn; ssr renders documents; csr supplies browser runtimes; dev-server and cli orchestrate development and builds.

Security and data flow

Validation happens at trust boundaries. Session authentication establishes identity; authorization makes resource decisions. CSP, Trusted Types, CSRF, upload checks, WebSocket origins, request limits, and output escaping are layered controls—not substitutes for application policy.

Realtime and scale

Rooms are process-local unless connected through pub/sub. Redis-backed pub/sub distributes events. Queue durability depends on the selected driver and must be evaluated explicitly.

Workspaces and gateways

The gateway can dispatch multiple applications while preserving route, component, asset, config, and session boundaries. Validate host routing and isolation before production.

Build and deployment

wrnexus build . produces dist/server.js and hashed/static assets. Run the server with Bun, apply migrations before traffic, terminate TLS at a trusted edge, and forward only expected proxy headers.

Mobile

Mobile compatibility bridges SSR-safe Capacitor capabilities; native route generation is experimental and is not general web portability. Test each target platform.

Generated files and limits

app/routes.gen.ts, .wrnexus/, and dist/ are generated. The runtime is Bun-only. Preview packages are private. Historical compatibility and long-term support policy are not yet published.

- +
Framework architecture · 0.8.72

Architecture

WRNexusJS is Bun-native and SSR-first. File discovery maps pages and API handlers; middleware enriches or short-circuits a request; the compiler turns .wrn declarations into server render functions and small feature runtimes.

Request and build lifecycle

  1. DiscoverPages, APIs, middleware, components, layouts, schemas, rooms
  2. CompileParse .wrn, validate grammar, generate server code
  3. RequestLimits, security, locale, session, middleware
  4. MatchStatic and dynamic file route
  5. RenderSSR data, escaped interpolation, components, metadata
  6. EnhanceOnly required reactive/directive runtimes

Package boundaries

core owns contexts, middleware, sessions and rooms; router discovers routes; compiler parses .wrn; ssr renders documents; csr supplies browser runtimes; dev-server and cli orchestrate development and builds.

Security and data flow

Validation happens at trust boundaries. Session authentication establishes identity; authorization makes resource decisions. CSP, Trusted Types, CSRF, upload checks, WebSocket origins, request limits, and output escaping are layered controls—not substitutes for application policy.

Realtime and scale

Rooms are process-local unless connected through pub/sub. Redis-backed pub/sub distributes events. Queue durability depends on the selected driver and must be evaluated explicitly.

Workspaces and gateways

The gateway can dispatch multiple applications while preserving route, component, asset, config, and session boundaries. Validate host routing and isolation before production.

Build and deployment

wrnexus build . produces dist/server.js and hashed/static assets. Run the server with Bun, apply migrations before traffic, terminate TLS at a trusted edge, and forward only expected proxy headers.

Mobile

Mobile compatibility bridges SSR-safe Capacitor capabilities; native route generation is experimental and is not general web portability. Test each target platform.

Generated files and limits

app/routes.gen.ts, .wrnexus/, and dist/ are generated. The runtime is Bun-only. Preview packages are private. Historical compatibility and long-term support policy are not yet published.

+
} } \ No newline at end of file diff --git a/app/pages/benchmarks.wrn b/app/pages/benchmarks.wrn index 0678db7f..03ab1e70 100644 --- a/app/pages/benchmarks.wrn +++ b/app/pages/benchmarks.wrn @@ -7,7 +7,7 @@ page Benchmarks { view {
-
W WRNexusJS
+
W WRNexusJS

Benchmarks

No publishable benchmark dataset yet

No comparative speed claims are published. A valid baseline must record scripts, commit, Bun/framework versions, hardware, OS, warmup, samples, workload, raw results, median, percentiles, memory, HTML size, browser JavaScript size, and run date.

The roadmap starts with WRNexusJS-only measurements before any maintained equivalent-workload comparison.

- +
} } \ No newline at end of file diff --git a/app/pages/changelog.wrn b/app/pages/changelog.wrn index 403cf08a..70994439 100644 --- a/app/pages/changelog.wrn +++ b/app/pages/changelog.wrn @@ -7,7 +7,7 @@ page Changelog { view {
-
W WRNexusJS
+
W WRNexusJS

Changelog

0.8.8 2026-07-13

Documentation is aligned to all 47 installed packages. This release adds @wrnexus/helpers, original-request URL helpers, safe login redirects, working wrnexus workspace add, and forward-auth redirect propagation.

Migration notes

Run wrnexus update --latest and keep every @wrnexus/* package on 0.8.8. Existing applications must explicitly add @wrnexus/helpers before importing it; newly scaffolded applications include it automatically.

Versioning and support

The packages use semantic-looking versions, but a formal compatibility and old-release support policy has not been approved. Preview consumers should treat minor releases as potentially requiring migration review.

- +

Changelog

0.8.72 2026-07-13

Documentation is aligned to all 47 installed packages. This release adds @wrnexus/helpers, original-request URL helpers, safe login redirects, working wrnexus workspace add, and forward-auth redirect propagation.

Migration notes

Run wrnexus update --latest and keep every @wrnexus/* package on 0.8.72. Existing applications must explicitly add @wrnexus/helpers before importing it; newly scaffolded applications include it automatically.

Versioning and support

The packages use semantic-looking versions, but a formal compatibility and old-release support policy has not been approved. Preview consumers should treat minor releases as potentially requiring migration review.

+
} } \ No newline at end of file diff --git a/app/pages/examples.wrn b/app/pages/examples.wrn index 3d180709..525c466a 100644 --- a/app/pages/examples.wrn +++ b/app/pages/examples.wrn @@ -7,7 +7,7 @@ page Examples { view {
-
W WRNexusJS
+
W WRNexusJS

Examples

Examples are tied to installed 0.8.8 package documentation. The focused snippets in guides are source-verified; standalone runnable projects and CI compilation are tracked as remaining work.

Minimal .wrn page

Documented

Database CRUD

Planned fixture

Authentication and protected route

Planned fixture

Permissions

Planned fixture

Forms and validation

Documented

Realtime dashboard

Planned fixture

File upload

Planned fixture

Background queue

Planned fixture

Redis pub/sub

Planned fixture

Workspace gateway

Planned fixture

Deployment

Planned fixture

Experimental mobile mode

Planned fixture
- +

Examples

Examples are tied to installed 0.8.72 package documentation. The focused snippets in guides are source-verified; standalone runnable projects and CI compilation are tracked as remaining work.

Minimal .wrn page

Documented

Database CRUD

Planned fixture

Authentication and protected route

Planned fixture

Permissions

Planned fixture

Forms and validation

Documented

Realtime dashboard

Planned fixture

File upload

Planned fixture

Background queue

Planned fixture

Redis pub/sub

Planned fixture

Workspace gateway

Planned fixture

Deployment

Planned fixture

Experimental mobile mode

Planned fixture
+
} } \ No newline at end of file diff --git a/app/pages/getting-started.wrn b/app/pages/getting-started.wrn index e64da4a0..f700b057 100644 --- a/app/pages/getting-started.wrn +++ b/app/pages/getting-started.wrn @@ -7,7 +7,7 @@ page Gettingstarted { view {
-
W WRNexusJS
+
W WRNexusJS
Preview guide · v0.8.8

Build a contact inbox

This path creates a server-rendered page, validated API route, middleware, and realtime next step. It requires approved registry access and Bun 1.3.x; this site was verified with Bun 1.3.14.

1. Create the project

bunx @wrnexus/cli@0.8.8 create my-app
+
Preview guide · v0.8.72

Build a contact inbox

This path creates a server-rendered page, validated API route, middleware, and realtime next step. It requires approved registry access and Bun 1.3.x; this site was verified with Bun 1.3.14.

1. Create the project

bunx @wrnexus/cli@0.8.72 create my-app
 cd my-app
 bun install
 bun run dev

2. Know the structure

app/pages/       # file-based .wrn routes
@@ -47,7 +47,7 @@ export const POST = async (ctx) => {
 }

7. Test and ship

bun run test
 bun run build
 bun dist/server.js

Next: deployment, database, authentication, and workspaces.

- +
} } \ No newline at end of file diff --git a/app/pages/guides/api-routes.wrn b/app/pages/guides/api-routes.wrn index cceee511..74d5ea51 100644 --- a/app/pages/guides/api-routes.wrn +++ b/app/pages/guides/api-routes.wrn @@ -7,7 +7,7 @@ page APIroutes { view {
-
W WRNexusJS
+
W WRNexusJS
Preview guide · 0.8.8

API routes

Export GET, POST, PUT, PATCH, or DELETE from app/api files. Validate request bodies, enforce authentication and authorization, cap request sizes, and return Web Responses.

Practical example

Validate a mutation and return an explicit HTTP result.

import { v, parseBody } from "@wrnexus/validation";
+
Preview guide · 0.8.72

API routes

Export GET, POST, PUT, PATCH, or DELETE from app/api files. Validate request bodies, enforce authentication and authorization, cap request sizes, and return Web Responses.

Practical example

Validate a mutation and return an explicit HTTP result.

import { v, parseBody } from "@wrnexus/validation";
 const input = v.object({ name: v.string().trim().min(2).max(80) });
 export const POST = async (ctx) => {
   const parsed = await parseBody(input, ctx.req);
@@ -25,8 +25,8 @@ export const POST = async (ctx) => {
 };

What to verify

Run this against the selected profile, inspect the generated or returned result, and add a test for both the successful path and its most important failure path.

Configuration

Keep configuration in wrnexus.config.ts, select an explicit profile, and store secrets only in validated environment variables. Use wrnexus config . --explain to review the resolved non-secret configuration.

Implementation workflow

bunx wrnexus doctor .
 bunx wrnexus typecheck .
 bunx wrnexus inspect routes .
-bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.8 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

- +bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.72 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

+ } } \ No newline at end of file diff --git a/app/pages/guides/authentication.wrn b/app/pages/guides/authentication.wrn index 7b25f27b..4746a73c 100644 --- a/app/pages/guides/authentication.wrn +++ b/app/pages/guides/authentication.wrn @@ -7,7 +7,7 @@ page Authentication { view {
-
W WRNexusJS
+
W WRNexusJS
Preview guide · 0.8.8

Authentication

Configure session authentication, log users in through supported auth helpers, and read identity from context. Cookie flags, rotation, expiry, and secret storage remain deployment responsibilities.

Practical example

Require an authenticated session in middleware and redirect browser requests to login.

export default async function requireSession(ctx, next) {
+
Preview guide · 0.8.72

Authentication

Configure session authentication, log users in through supported auth helpers, and read identity from context. Cookie flags, rotation, expiry, and secret storage remain deployment responsibilities.

Practical example

Require an authenticated session in middleware and redirect browser requests to login.

export default async function requireSession(ctx, next) {
   const user = await readAuthenticatedUser(ctx);
   if (!user) return Response.redirect(new URL("/login", ctx.url), 303);
   ctx.state.user = user;
@@ -25,8 +25,8 @@ page Authentication {
 }

What to verify

Run this against the selected profile, inspect the generated or returned result, and add a test for both the successful path and its most important failure path.

Configuration

Keep configuration in wrnexus.config.ts, select an explicit profile, and store secrets only in validated environment variables. Use wrnexus config . --explain to review the resolved non-secret configuration.

Implementation workflow

bunx wrnexus doctor .
 bunx wrnexus typecheck .
 bunx wrnexus inspect routes .
-bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.8 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

- +bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.72 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

+ } } \ No newline at end of file diff --git a/app/pages/guides/authorization.wrn b/app/pages/guides/authorization.wrn index ed6cc73c..4b4a2d86 100644 --- a/app/pages/guides/authorization.wrn +++ b/app/pages/guides/authorization.wrn @@ -7,7 +7,7 @@ page Authorization { view {
-
W WRNexusJS
+
W WRNexusJS
Preview guide · 0.8.8

Authorization

Authentication identifies; authorization decides. Enforce permissions in server routes and policies, including object ownership. UI hiding is never an authorization boundary.

Practical example

Check the exact permission at the mutation boundary; hiding UI is only a convenience.

export const DELETE = async (ctx) => {
+
Preview guide · 0.8.72

Authorization

Authentication identifies; authorization decides. Enforce permissions in server routes and policies, including object ownership. UI hiding is never an authorization boundary.

Practical example

Check the exact permission at the mutation boundary; hiding UI is only a convenience.

export const DELETE = async (ctx) => {
   await requirePermission(ctx, "member:delete");
   await deleteMember(ctx.params.id, ctx.state.user.tenantId);
   return new Response(null, { status: 204 });
 };

What to verify

Run this against the selected profile, inspect the generated or returned result, and add a test for both the successful path and its most important failure path.

Configuration

Keep configuration in wrnexus.config.ts, select an explicit profile, and store secrets only in validated environment variables. Use wrnexus config . --explain to review the resolved non-secret configuration.

Implementation workflow

bunx wrnexus doctor .
 bunx wrnexus typecheck .
 bunx wrnexus inspect routes .
-bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.8 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

- +bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.72 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

+ } } \ No newline at end of file diff --git a/app/pages/guides/configuration-and-profiles.wrn b/app/pages/guides/configuration-and-profiles.wrn index f463cda7..1e1b58d4 100644 --- a/app/pages/guides/configuration-and-profiles.wrn +++ b/app/pages/guides/configuration-and-profiles.wrn @@ -7,7 +7,7 @@ page Configurationandprofiles { view {
-
W WRNexusJS
+
W WRNexusJS
Preview guide · 0.8.8

Configuration and profiles

wrnexus.config.ts owns styles, SEO, security, data, mobile, fonts, and profiles. Keep secrets in validated environment variables and review merged production configuration.

Practical example

Keep shared defaults at the root and make production differences explicit.

export default {
+
Preview guide · 0.8.72

Configuration and profiles

wrnexus.config.ts owns styles, SEO, security, data, mobile, fonts, and profiles. Keep secrets in validated environment variables and review merged production configuration.

Practical example

Keep shared defaults at the root and make production differences explicit.

export default {
   server: { port: 3000 },
   profiles: {
     development: { envFiles: [".env", ".env.development"] },
@@ -28,8 +28,8 @@ page Configurationandprofiles {
 bunx wrnexus config . --explain --profile=production

What to verify

Run this against the selected profile, inspect the generated or returned result, and add a test for both the successful path and its most important failure path.

Configuration

Keep configuration in wrnexus.config.ts, select an explicit profile, and store secrets only in validated environment variables. Use wrnexus config . --explain to review the resolved non-secret configuration.

Implementation workflow

bunx wrnexus doctor .
 bunx wrnexus typecheck .
 bunx wrnexus inspect routes .
-bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.8 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

- +bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.72 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

+ } } \ No newline at end of file diff --git a/app/pages/guides/database.wrn b/app/pages/guides/database.wrn index 0a2f0274..fe0f4eda 100644 --- a/app/pages/guides/database.wrn +++ b/app/pages/guides/database.wrn @@ -7,7 +7,7 @@ page Database { view {
-
W WRNexusJS
+
W WRNexusJS
Preview guide · 0.8.8

Database

Configure SQLite or the installed supported driver, keep queries in named SQL blocks, generate typed functions, and apply migrations before traffic. Back up data and test rollback independently.

Practical example

Create a migration from models, apply it, and regenerate typed database functions.

bunx wrnexus db status
+
Preview guide · 0.8.72

Database

Configure SQLite or the installed supported driver, keep queries in named SQL blocks, generate typed functions, and apply migrations before traffic. Back up data and test rollback independently.

Practical example

Create a migration from models, apply it, and regenerate typed database functions.

bunx wrnexus db status
 bunx wrnexus db new create_accounts --from-models
 bunx wrnexus db migrate
 bunx wrnexus db generate

What to verify

Run this against the selected profile, inspect the generated or returned result, and add a test for both the successful path and its most important failure path.

Configuration

Keep configuration in wrnexus.config.ts, select an explicit profile, and store secrets only in validated environment variables. Use wrnexus config . --explain to review the resolved non-secret configuration.

Implementation workflow

bunx wrnexus doctor .
 bunx wrnexus typecheck .
 bunx wrnexus inspect routes .
-bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.8 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

- +bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.72 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

+ } } \ No newline at end of file diff --git a/app/pages/guides/deployment.wrn b/app/pages/guides/deployment.wrn index 14d23f2f..bd9521f1 100644 --- a/app/pages/guides/deployment.wrn +++ b/app/pages/guides/deployment.wrn @@ -7,7 +7,7 @@ page Deployment { view {
-
W WRNexusJS
+
W WRNexusJS
Preview guide · 0.8.8

Deployment

Run bun run build, apply migrations, and start dist/server.js with Bun. Configure TLS, proxy trust, environment validation, health checks, graceful restarts, logs, backups, and restrictive security headers.

Practical example

Build once, apply migrations before traffic, and run the immutable Bun server artifact.

bun install --frozen-lockfile
+
Preview guide · 0.8.72

Deployment

Run bun run build, apply migrations, and start dist/server.js with Bun. Configure TLS, proxy trust, environment validation, health checks, graceful restarts, logs, backups, and restrictive security headers.

Practical example

Build once, apply migrations before traffic, and run the immutable Bun server artifact.

bun install --frozen-lockfile
 bunx wrnexus typecheck .
 bunx wrnexus db migrate
 bunx wrnexus build .
 bun dist/server.js

What to verify

Run this against the selected profile, inspect the generated or returned result, and add a test for both the successful path and its most important failure path.

Configuration

Keep configuration in wrnexus.config.ts, select an explicit profile, and store secrets only in validated environment variables. Use wrnexus config . --explain to review the resolved non-secret configuration.

Implementation workflow

bunx wrnexus doctor .
 bunx wrnexus typecheck .
 bunx wrnexus inspect routes .
-bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.8 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

- +bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.72 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

+ } } \ No newline at end of file diff --git a/app/pages/guides/forms-and-validation.wrn b/app/pages/guides/forms-and-validation.wrn index 1bbf657e..49cfc112 100644 --- a/app/pages/guides/forms-and-validation.wrn +++ b/app/pages/guides/forms-and-validation.wrn @@ -7,7 +7,7 @@ page Formsandvalidation { view {
-
W WRNexusJS
+
W WRNexusJS
Preview guide · 0.8.8

Forms and validation

Define a v.object schema, use data-schema on the form, show field errors with data-error, and always call parseBody on the server. refine is server-only.

Practical example

Use the same named schema in the browser form and authoritative API handler.

page Signup { view {
+
Preview guide · 0.8.72

Forms and validation

Define a v.object schema, use data-schema on the form, show field errors with data-error, and always call parseBody on the server. refine is server-only.

Practical example

Use the same named schema in the browser form and authoritative API handler.

page Signup { view {
   <form data-schema="signup" action="/api/signup" method="post">
     <input name="email" type="email" /><span data-error="email"></span>
     <button type="submit">Create account</button>
@@ -25,8 +25,8 @@ page Formsandvalidation {
 } }

What to verify

Run this against the selected profile, inspect the generated or returned result, and add a test for both the successful path and its most important failure path.

Configuration

Keep configuration in wrnexus.config.ts, select an explicit profile, and store secrets only in validated environment variables. Use wrnexus config . --explain to review the resolved non-secret configuration.

Implementation workflow

bunx wrnexus doctor .
 bunx wrnexus typecheck .
 bunx wrnexus inspect routes .
-bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.8 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

- +bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.72 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

+ } } \ No newline at end of file diff --git a/app/pages/guides/full-stack-auth-demo.wrn b/app/pages/guides/full-stack-auth-demo.wrn index 10941618..5ea40b85 100644 --- a/app/pages/guides/full-stack-auth-demo.wrn +++ b/app/pages/guides/full-stack-auth-demo.wrn @@ -7,7 +7,7 @@ page Authandpermissionsdashboarddemo { view {
-
W WRNexusJS
+
W WRNexusJS
Preview guide · 0.8.8

Auth and permissions dashboard demo

This walkthrough builds a small team portal. Public visitors can read the home and pricing pages, users can sign in, and the dashboard separates ordinary members from administrators. Every authorization decision remains on the server.

-

1. Create the application

bunx @wrnexus/cli@0.8.8 create team-portal
+
Preview guide · 0.8.72

Auth and permissions dashboard demo

This walkthrough builds a small team portal. Public visitors can read the home and pricing pages, users can sign in, and the dashboard separates ordinary members from administrators. Every authorization decision remains on the server.

+

1. Create the application

bunx @wrnexus/cli@0.8.72 create team-portal
 cd team-portal
 bun install
 bun add @wrnexus/auth @wrnexus/authz @wrnexus/db @wrnexus/validation @wrnexus/ui
@@ -150,8 +150,8 @@ bunx wrnexus preview . --port=3000

Tests should prove anonymous d

9. Demo checklist

  • Public home, pricing, privacy, and terms pages render without authentication.
  • Login creates and rotates a secure session.
  • Dashboard navigation changes by permission, while APIs enforce every permission independently.
  • Member lists and mutations are tenant-scoped on the server.
  • Development and production profiles resolve explicitly.
  • Typecheck, API tests, browser tests, security audit, contract check, build, and preview all pass.

Configuration

Keep configuration in wrnexus.config.ts, select an explicit profile, and store secrets only in validated environment variables. Use wrnexus config . --explain to review the resolved non-secret configuration.

Implementation workflow

bunx wrnexus doctor .
 bunx wrnexus typecheck .
 bunx wrnexus inspect routes .
-bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.8 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

- +bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.72 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

+ } } \ No newline at end of file diff --git a/app/pages/guides/i18n-and-themes.wrn b/app/pages/guides/i18n-and-themes.wrn index 63ebc38a..b9595cd5 100644 --- a/app/pages/guides/i18n-and-themes.wrn +++ b/app/pages/guides/i18n-and-themes.wrn @@ -7,7 +7,7 @@ page Internationalizationandthemes { view {
-
W WRNexusJS
+
W WRNexusJS
Preview guide · 0.8.8

Internationalization and themes

Store locale JSON under app/locales and use translation directives. Themes resolve CSS tokens; ensure contrast, system preference behavior, persistence, and non-color cues.

Practical example

Configure one default locale and theme, then reference translation keys in server-rendered markup.

export default {
+
Preview guide · 0.8.72

Internationalization and themes

Store locale JSON under app/locales and use translation directives. Themes resolve CSS tokens; ensure contrast, system preference behavior, persistence, and non-color cues.

Practical example

Configure one default locale and theme, then reference translation keys in server-rendered markup.

export default {
   i18n: { defaultLocale: "en", locales: ["en", "fr"] },
   theme: { default: "system", palette: "violet" },
 };
@@ -25,8 +25,8 @@ page Internationalizationandthemes {
 page Home { view { <h1>{t:home.title}</h1><button data-wire-theme-toggle>Theme</button> } }

What to verify

Run this against the selected profile, inspect the generated or returned result, and add a test for both the successful path and its most important failure path.

Configuration

Keep configuration in wrnexus.config.ts, select an explicit profile, and store secrets only in validated environment variables. Use wrnexus config . --explain to review the resolved non-secret configuration.

Implementation workflow

bunx wrnexus doctor .
 bunx wrnexus typecheck .
 bunx wrnexus inspect routes .
-bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.8 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

- +bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.72 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

+ } } \ No newline at end of file diff --git a/app/pages/guides/middleware.wrn b/app/pages/guides/middleware.wrn index 5901a3ba..4c947c81 100644 --- a/app/pages/guides/middleware.wrn +++ b/app/pages/guides/middleware.wrn @@ -7,7 +7,7 @@ page Middleware { view {
-
W WRNexusJS
+
W WRNexusJS
Preview guide · 0.8.8

Middleware

Middleware receives context and next. Return next() to continue or return a Response to stop. Put request limits and trust-boundary controls before business logic.

Practical example

Add a request identifier and reject unsupported methods before application handlers run.

export default async function requestContext(ctx, next) {
+
Preview guide · 0.8.72

Middleware

Middleware receives context and next. Return next() to continue or return a Response to stop. Put request limits and trust-boundary controls before business logic.

Practical example

Add a request identifier and reject unsupported methods before application handlers run.

export default async function requestContext(ctx, next) {
   ctx.state.requestId = crypto.randomUUID();
   if (!["GET", "HEAD", "POST"].includes(ctx.req.method))
     return new Response("Method not allowed", { status: 405 });
@@ -25,8 +25,8 @@ page Middleware {
 }

What to verify

Run this against the selected profile, inspect the generated or returned result, and add a test for both the successful path and its most important failure path.

Configuration

Keep configuration in wrnexus.config.ts, select an explicit profile, and store secrets only in validated environment variables. Use wrnexus config . --explain to review the resolved non-secret configuration.

Implementation workflow

bunx wrnexus doctor .
 bunx wrnexus typecheck .
 bunx wrnexus inspect routes .
-bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.8 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

- +bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.72 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

+ } } \ No newline at end of file diff --git a/app/pages/guides/mobile.wrn b/app/pages/guides/mobile.wrn index 98f28cb2..684685c4 100644 --- a/app/pages/guides/mobile.wrn +++ b/app/pages/guides/mobile.wrn @@ -7,7 +7,7 @@ page Mobile { view {
-
W WRNexusJS
+
W WRNexusJS
Preview guide · 0.8.8

Mobile

Mobile capabilities are experimental in this preview. Test Capacitor permissions and lifecycle on each platform; do not assume every .wrn or browser API converts to native.

Practical example

Generate the mobile surface, compile it, and inspect supported native capabilities before relying on one.

bunx wrnexus generate mobile
+
Preview guide · 0.8.72

Mobile

Mobile capabilities are experimental in this preview. Test Capacitor permissions and lifecycle on each platform; do not assume every .wrn or browser API converts to native.

Practical example

Generate the mobile surface, compile it, and inspect supported native capabilities before relying on one.

bunx wrnexus generate mobile
 bunx wrnexus mobile compile
 bunx wrnexus native list

What to verify

Run this against the selected profile, inspect the generated or returned result, and add a test for both the successful path and its most important failure path.

Configuration

Keep configuration in wrnexus.config.ts, select an explicit profile, and store secrets only in validated environment variables. Use wrnexus config . --explain to review the resolved non-secret configuration.

Implementation workflow

bunx wrnexus doctor .
 bunx wrnexus typecheck .
 bunx wrnexus inspect routes .
-bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.8 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

- +bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.72 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

+ } } \ No newline at end of file diff --git a/app/pages/guides/observability.wrn b/app/pages/guides/observability.wrn index f7c98f12..91217861 100644 --- a/app/pages/guides/observability.wrn +++ b/app/pages/guides/observability.wrn @@ -7,7 +7,7 @@ page Observability { view {
-
W WRNexusJS
+
W WRNexusJS
Preview guide · 0.8.8

Observability

Use tracking middleware and sinks with redaction, sampling, stable request identifiers, alert ownership, and retention limits. Never capture registry tokens or session secrets.

Practical example

Redact credentials at the sink boundary and attach a stable request identifier.

const tracking = createTracking({
+
Preview guide · 0.8.72

Observability

Use tracking middleware and sinks with redaction, sampling, stable request identifiers, alert ownership, and retention limits. Never capture registry tokens or session secrets.

Practical example

Redact credentials at the sink boundary and attach a stable request identifier.

const tracking = createTracking({
   redact: ["authorization", "cookie", "password", "token"],
   sampleRate: 0.1,
 });
 export default tracking.middleware();

What to verify

Run this against the selected profile, inspect the generated or returned result, and add a test for both the successful path and its most important failure path.

Configuration

Keep configuration in wrnexus.config.ts, select an explicit profile, and store secrets only in validated environment variables. Use wrnexus config . --explain to review the resolved non-secret configuration.

Implementation workflow

bunx wrnexus doctor .
 bunx wrnexus typecheck .
 bunx wrnexus inspect routes .
-bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.8 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

- +bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.72 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

+ } } \ No newline at end of file diff --git a/app/pages/guides/pages-and-components.wrn b/app/pages/guides/pages-and-components.wrn index e79855cc..be4f2b3d 100644 --- a/app/pages/guides/pages-and-components.wrn +++ b/app/pages/guides/pages-and-components.wrn @@ -7,7 +7,7 @@ page Pagesandcomponents { view {
-
W WRNexusJS
+
W WRNexusJS
Preview guide · 0.8.8

Pages and components

Pages are routable, components are reusable, and layouts provide shared slots. Mount a component with data-component and keep browser state scoped and minimal.

Practical example

Declare the reusable contract in a component, then pass data from the owning page.

component StatusCard {
+
Preview guide · 0.8.72

Pages and components

Pages are routable, components are reusable, and layouts provide shared slots. Mount a component with data-component and keep browser state scoped and minimal.

Practical example

Declare the reusable contract in a component, then pass data from the owning page.

component StatusCard {
   prop title = "Status"
   prop value = "Unknown"
   view { <article><h2>{title}</h2><p>{value}</p><slot /></article> }
@@ -26,8 +26,8 @@ page Pagesandcomponents {
 page Dashboard { view { <StatusCard title="API" value="Healthy" /> } }

What to verify

Run this against the selected profile, inspect the generated or returned result, and add a test for both the successful path and its most important failure path.

Configuration

Keep configuration in wrnexus.config.ts, select an explicit profile, and store secrets only in validated environment variables. Use wrnexus config . --explain to review the resolved non-secret configuration.

Implementation workflow

bunx wrnexus doctor .
 bunx wrnexus typecheck .
 bunx wrnexus inspect routes .
-bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.8 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

- +bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.72 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

+ } } \ No newline at end of file diff --git a/app/pages/guides/project-structure.wrn b/app/pages/guides/project-structure.wrn index 2c68b9f5..eee9d69d 100644 --- a/app/pages/guides/project-structure.wrn +++ b/app/pages/guides/project-structure.wrn @@ -7,7 +7,7 @@ page Projectstructure { view {
-
W WRNexusJS
+
W WRNexusJS
Preview guide · 0.8.8

Project structure

Pages, components, layouts, APIs, middleware, schemas, database files, locales, realtime rooms, and styles live under app. Never edit app/routes.gen.ts, .wrnexus, or dist by hand.

Practical example

Generate files through the CLI so routes and application types stay synchronized.

bunx wrnexus generate page account/settings
+
Preview guide · 0.8.72

Project structure

Pages, components, layouts, APIs, middleware, schemas, database files, locales, realtime rooms, and styles live under app. Never edit app/routes.gen.ts, .wrnexus, or dist by hand.

Practical example

Generate files through the CLI so routes and application types stay synchronized.

bunx wrnexus generate page account/settings
 bunx wrnexus generate component account-card
 bunx wrnexus generate api account/profile
 bunx wrnexus generate routes
 bunx wrnexus generate types .

What to verify

Run this against the selected profile, inspect the generated or returned result, and add a test for both the successful path and its most important failure path.

Configuration

Keep configuration in wrnexus.config.ts, select an explicit profile, and store secrets only in validated environment variables. Use wrnexus config . --explain to review the resolved non-secret configuration.

Implementation workflow

bunx wrnexus doctor .
 bunx wrnexus typecheck .
 bunx wrnexus inspect routes .
-bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.8 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

- +bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.72 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

+ } } \ No newline at end of file diff --git a/app/pages/guides/pubsub.wrn b/app/pages/guides/pubsub.wrn index f9e3f9b5..017408a0 100644 --- a/app/pages/guides/pubsub.wrn +++ b/app/pages/guides/pubsub.wrn @@ -7,7 +7,7 @@ page Pubsub { view {
-
W WRNexusJS
+
W WRNexusJS
Preview guide · 0.8.8

Pub/sub

The in-process driver cannot cross processes. Use Redis where instances must share events, define channel ownership, and design for reconnects and duplicate delivery.

Practical example

Use Redis when events must cross processes; use a namespaced channel contract.

const bus = createRedisPubSub({ url: env.REDIS_URL });
+
Preview guide · 0.8.72

Pub/sub

The in-process driver cannot cross processes. Use Redis where instances must share events, define channel ownership, and design for reconnects and duplicate delivery.

Practical example

Use Redis when events must cross processes; use a namespaced channel contract.

const bus = createRedisPubSub({ url: env.REDIS_URL });
 await bus.subscribe("team:42:events", (event) => handleTeamEvent(event));
 await bus.publish("team:42:events", JSON.stringify({ type: "member.invited" }));

What to verify

Run this against the selected profile, inspect the generated or returned result, and add a test for both the successful path and its most important failure path.

Configuration

Keep configuration in wrnexus.config.ts, select an explicit profile, and store secrets only in validated environment variables. Use wrnexus config . --explain to review the resolved non-secret configuration.

Implementation workflow

bunx wrnexus doctor .
 bunx wrnexus typecheck .
 bunx wrnexus inspect routes .
-bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.8 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

- +bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.72 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

+ } } \ No newline at end of file diff --git a/app/pages/guides/queues.wrn b/app/pages/guides/queues.wrn index f2774e60..5fe46b13 100644 --- a/app/pages/guides/queues.wrn +++ b/app/pages/guides/queues.wrn @@ -7,7 +7,7 @@ page Queues { view {
-
W WRNexusJS
+
W WRNexusJS
Preview guide · 0.8.8

Queues

Queue behavior is preview-level. Treat in-process work as non-durable, make handlers idempotent, cap retries, record failures, and choose a production persistence strategy.

Practical example

Make jobs idempotent and bound retry behavior before processing external effects.

const emails = queue("emails", { concurrency: 4, retries: 3 });
+
Preview guide · 0.8.72

Queues

Queue behavior is preview-level. Treat in-process work as non-durable, make handlers idempotent, cap retries, record failures, and choose a production persistence strategy.

Practical example

Make jobs idempotent and bound retry behavior before processing external effects.

const emails = queue("emails", { concurrency: 4, retries: 3 });
 emails.process(async (job) => sendInviteOnce(job.data.invitationId));
 await emails.add({ invitationId }, { delay: 1_000 });

What to verify

Run this against the selected profile, inspect the generated or returned result, and add a test for both the successful path and its most important failure path.

Configuration

Keep configuration in wrnexus.config.ts, select an explicit profile, and store secrets only in validated environment variables. Use wrnexus config . --explain to review the resolved non-secret configuration.

Implementation workflow

bunx wrnexus doctor .
 bunx wrnexus typecheck .
 bunx wrnexus inspect routes .
-bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.8 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

- +bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.72 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

+ } } \ No newline at end of file diff --git a/app/pages/guides/realtime.wrn b/app/pages/guides/realtime.wrn index 473370b4..16172d33 100644 --- a/app/pages/guides/realtime.wrn +++ b/app/pages/guides/realtime.wrn @@ -7,7 +7,7 @@ page Realtime { view {
-
W WRNexusJS
+
W WRNexusJS
Preview guide · 0.8.8

Realtime

defineRoom handles connection and messages. Validate message shapes, authorize subscriptions, restrict origins, bound payloads, and use pub/sub to scale across processes.

Practical example

Authorize room membership and validate every incoming message before broadcasting.

export default defineRoom("team", {
+
Preview guide · 0.8.72

Realtime

defineRoom handles connection and messages. Validate message shapes, authorize subscriptions, restrict origins, bound payloads, and use pub/sub to scale across processes.

Practical example

Authorize room membership and validate every incoming message before broadcasting.

export default defineRoom("team", {
   async connect(client, ctx) { await requireTeamMember(ctx, ctx.params.teamId); },
   async message(client, raw) {
     const message = chatMessage.parse(JSON.parse(raw));
@@ -26,8 +26,8 @@ page Realtime {
 });

What to verify

Run this against the selected profile, inspect the generated or returned result, and add a test for both the successful path and its most important failure path.

Configuration

Keep configuration in wrnexus.config.ts, select an explicit profile, and store secrets only in validated environment variables. Use wrnexus config . --explain to review the resolved non-secret configuration.

Implementation workflow

bunx wrnexus doctor .
 bunx wrnexus typecheck .
 bunx wrnexus inspect routes .
-bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.8 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

- +bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.72 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

+ } } \ No newline at end of file diff --git a/app/pages/guides/routing.wrn b/app/pages/guides/routing.wrn index a629340c..2ba9a801 100644 --- a/app/pages/guides/routing.wrn +++ b/app/pages/guides/routing.wrn @@ -7,7 +7,7 @@ page Routing { view {
-
W WRNexusJS
+
W WRNexusJS
Preview guide · 0.8.8

Routing

A page filename defines its URL; index maps to the directory root and bracket segments are dynamic parameters. API files under app/api expose HTTP method functions and receive a Context.

Practical example

This creates a dynamic, server-rendered account route and verifies that the router discovered it.

// app/pages/accounts/[id].wrn
+
Preview guide · 0.8.72

Routing

A page filename defines its URL; index maps to the directory root and bracket segments are dynamic parameters. API files under app/api expose HTTP method functions and receive a Context.

Practical example

This creates a dynamic, server-rendered account route and verifies that the router discovered it.

// app/pages/accounts/[id].wrn
 page Account { view { <main><h1>Account {params.id}</h1></main> } }
 
 bunx wrnexus inspect routes .

What to verify

Run this against the selected profile, inspect the generated or returned result, and add a test for both the successful path and its most important failure path.

Configuration

Keep configuration in wrnexus.config.ts, select an explicit profile, and store secrets only in validated environment variables. Use wrnexus config . --explain to review the resolved non-secret configuration.

Implementation workflow

bunx wrnexus doctor .
 bunx wrnexus typecheck .
 bunx wrnexus inspect routes .
-bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.8 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

- +bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.72 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

+ } } \ No newline at end of file diff --git a/app/pages/guides/security.wrn b/app/pages/guides/security.wrn index 314daa8e..20eb7855 100644 --- a/app/pages/guides/security.wrn +++ b/app/pages/guides/security.wrn @@ -7,7 +7,7 @@ page Applicationsecurity { view {
-
W WRNexusJS
+
W WRNexusJS
Preview guide · 0.8.8

Application security

Use CSP, CSRF, Trusted Types, session hardening, validation, origin checks, upload restrictions, encryption, request limits, and explicit CORS. See the security policy for reporting.

Practical example

Enable the main browser and request protections in application configuration, then audit the resolved production profile.

// wrnexus.config.ts
+
Preview guide · 0.8.72

Application security

Use CSP, CSRF, Trusted Types, session hardening, validation, origin checks, upload restrictions, encryption, request limits, and explicit CORS. See the security policy for reporting.

Practical example

Enable the main browser and request protections in application configuration, then audit the resolved production profile.

// wrnexus.config.ts
 export default {
   security: {
     contentSecurityPolicy: true,
@@ -34,8 +34,8 @@ bunx wrnexus config . --explain --profile=production
 bunx wrnexus security audit .

What to verify

Run this against the selected profile, inspect the generated or returned result, and add a test for both the successful path and its most important failure path.

Configuration

Keep configuration in wrnexus.config.ts, select an explicit profile, and store secrets only in validated environment variables. Use wrnexus config . --explain to review the resolved non-secret configuration.

Implementation workflow

bunx wrnexus doctor .
 bunx wrnexus typecheck .
 bunx wrnexus inspect routes .
-bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.8 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

- +bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.72 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

+ } } \ No newline at end of file diff --git a/app/pages/guides/server-data.wrn b/app/pages/guides/server-data.wrn index 6c372a85..26062ccd 100644 --- a/app/pages/guides/server-data.wrn +++ b/app/pages/guides/server-data.wrn @@ -7,7 +7,7 @@ page Serverdata { view {
-
W WRNexusJS
+
W WRNexusJS
Preview guide · 0.8.8

Server data

Use an ssr API binding, return the desired response field, and render it with a server #each block. Values are escaped. Avoid fetching private data through a route that lacks authorization.

Practical example

Fetch on the server and render useful HTML before browser JavaScript loads.

page Accounts {
+
Preview guide · 0.8.72

Server data

Use an ssr API binding, return the desired response field, and render it with a server #each block. Values are escaped. Avoid fetching private data through a route that lacks authorization.

Practical example

Fetch on the server and render useful HTML before browser JavaScript loads.

page Accounts {
   ssr { api result GET /api/accounts { return result.accounts } }
   view { <ul>{#each result as account}<li>{account.name}</li>{:empty}<li>No accounts</li>{/each}</ul> }
 }

What to verify

Run this against the selected profile, inspect the generated or returned result, and add a test for both the successful path and its most important failure path.

Configuration

Keep configuration in wrnexus.config.ts, select an explicit profile, and store secrets only in validated environment variables. Use wrnexus config . --explain to review the resolved non-secret configuration.

Implementation workflow

bunx wrnexus doctor .
 bunx wrnexus typecheck .
 bunx wrnexus inspect routes .
-bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.8 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

- +bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.72 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

+ } } \ No newline at end of file diff --git a/app/pages/guides/testing.wrn b/app/pages/guides/testing.wrn index 1e986d34..23e91cb3 100644 --- a/app/pages/guides/testing.wrn +++ b/app/pages/guides/testing.wrn @@ -7,7 +7,7 @@ page Testing { view {
-
W WRNexusJS
+
W WRNexusJS
Preview guide · 0.8.8

Testing

Use Bun tests and @wrnexus/test helpers. Cover server HTML, API status and validation, authorization failures, reactive behavior, and a production startup smoke test.

Practical example

Cover successful output and the denial path, then run the built server smoke check.

import { describe, expect, test } from "bun:test";
+
Preview guide · 0.8.72

Testing

Use Bun tests and @wrnexus/test helpers. Cover server HTML, API status and validation, authorization failures, reactive behavior, and a production startup smoke test.

Practical example

Cover successful output and the denial path, then run the built server smoke check.

import { describe, expect, test } from "bun:test";
 describe("members API", () => {
   test("denies anonymous requests", async () => {
     const response = await request("/api/members");
@@ -26,8 +26,8 @@ describe("members API", () => {
 });

What to verify

Run this against the selected profile, inspect the generated or returned result, and add a test for both the successful path and its most important failure path.

Configuration

Keep configuration in wrnexus.config.ts, select an explicit profile, and store secrets only in validated environment variables. Use wrnexus config . --explain to review the resolved non-secret configuration.

Implementation workflow

bunx wrnexus doctor .
 bunx wrnexus typecheck .
 bunx wrnexus inspect routes .
-bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.8 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

- +bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.72 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

+ } } \ No newline at end of file diff --git a/app/pages/guides/troubleshooting.wrn b/app/pages/guides/troubleshooting.wrn index 6712fd45..69ce6e44 100644 --- a/app/pages/guides/troubleshooting.wrn +++ b/app/pages/guides/troubleshooting.wrn @@ -7,7 +7,7 @@ page Troubleshooting { view {
-
W WRNexusJS
+
W WRNexusJS
Preview guide · 0.8.8

Troubleshooting

Confirm Bun and package versions, regenerate docs/routes through supported commands, read the first compiler diagnostic, check file naming, validate config, and reproduce under a production build.

Practical example

Collect deterministic diagnostics without exposing application secrets.

bun --version
+
Preview guide · 0.8.72

Troubleshooting

Confirm Bun and package versions, regenerate docs/routes through supported commands, read the first compiler diagnostic, check file naming, validate config, and reproduce under a production build.

Practical example

Collect deterministic diagnostics without exposing application secrets.

bun --version
 bunx wrnexus doctor .
 bunx wrnexus config . --explain
 bunx wrnexus inspect routes .
 bunx wrnexus report . --file=app/pages/index.wrn

What to verify

Run this against the selected profile, inspect the generated or returned result, and add a test for both the successful path and its most important failure path.

Configuration

Keep configuration in wrnexus.config.ts, select an explicit profile, and store secrets only in validated environment variables. Use wrnexus config . --explain to review the resolved non-secret configuration.

Implementation workflow

bunx wrnexus doctor .
 bunx wrnexus typecheck .
 bunx wrnexus inspect routes .
-bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.8 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

- +bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.72 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

+ } } \ No newline at end of file diff --git a/app/pages/guides/upgrading.wrn b/app/pages/guides/upgrading.wrn index 94b9d013..d7c2916e 100644 --- a/app/pages/guides/upgrading.wrn +++ b/app/pages/guides/upgrading.wrn @@ -7,7 +7,7 @@ page Upgrading { view {
-
W WRNexusJS
+
W WRNexusJS
Preview guide · 0.8.8

Upgrading

Back up and commit first, then use wrnexus update --latest as documented by the installed CLI. Review migrations and keep every @wrnexus package aligned. Current release: 0.8.8.

Practical example

Preview migrations first, review the report, then update the aligned package set.

git status --short
+
Preview guide · 0.8.72

Upgrading

Back up and commit first, then use wrnexus update --latest as documented by the installed CLI. Review migrations and keep every @wrnexus package aligned. Current release: 0.8.72.

Practical example

Preview migrations first, review the report, then update the aligned package set.

git status --short
 bunx wrnexus update . --latest --dry-run
 bunx wrnexus update . --latest
 bunx wrnexus typecheck .
 bunx wrnexus build .

What to verify

Run this against the selected profile, inspect the generated or returned result, and add a test for both the successful path and its most important failure path.

Configuration

Keep configuration in wrnexus.config.ts, select an explicit profile, and store secrets only in validated environment variables. Use wrnexus config . --explain to review the resolved non-secret configuration.

Implementation workflow

bunx wrnexus doctor .
 bunx wrnexus typecheck .
 bunx wrnexus inspect routes .
-bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.8 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

- +bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.72 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

+ } } \ No newline at end of file diff --git a/app/pages/guides/uploads.wrn b/app/pages/guides/uploads.wrn index ae3001ec..fbdef894 100644 --- a/app/pages/guides/uploads.wrn +++ b/app/pages/guides/uploads.wrn @@ -7,7 +7,7 @@ page Uploads { view {
-
W WRNexusJS
+
W WRNexusJS
Preview guide · 0.8.8

Uploads

Configure named stores, accepted MIME/extensions, and maxBytes. Random keys avoid path traversal. Private files require an authenticated serving route; v1 buffers each file in memory.

Practical example

Keep size and type policy server-owned and serve private objects through an authorized route.

export default {
+
Preview guide · 0.8.72

Uploads

Configure named stores, accepted MIME/extensions, and maxBytes. Random keys avoid path traversal. Private files require an authenticated serving route; v1 buffers each file in memory.

Practical example

Keep size and type policy server-owned and serve private objects through an authorized route.

export default {
   uploads: { stores: { avatars: {
     driver: "local", directory: "./data/avatars",
     maxBytes: 2_000_000, accept: ["image/png", "image/jpeg"],
@@ -25,8 +25,8 @@ page Uploads {
 };

What to verify

Run this against the selected profile, inspect the generated or returned result, and add a test for both the successful path and its most important failure path.

Configuration

Keep configuration in wrnexus.config.ts, select an explicit profile, and store secrets only in validated environment variables. Use wrnexus config . --explain to review the resolved non-secret configuration.

Implementation workflow

bunx wrnexus doctor .
 bunx wrnexus typecheck .
 bunx wrnexus inspect routes .
-bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.8 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

- +bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.72 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

+ } } \ No newline at end of file diff --git a/app/pages/guides/workspaces-and-gateway.wrn b/app/pages/guides/workspaces-and-gateway.wrn index e9b9bea5..f67930f9 100644 --- a/app/pages/guides/workspaces-and-gateway.wrn +++ b/app/pages/guides/workspaces-and-gateway.wrn @@ -7,7 +7,7 @@ page Workspacesandgateway { view {
-
W WRNexusJS
+
W WRNexusJS
Preview guide · 0.8.8

Workspaces and gateway

A workspace runs isolated applications behind one domain-routing gateway. Add an application from the workspace root; the CLI scaffolds apps/reports and registers it in wrnexus.workspace.ts:

wrnexus workspace add reports --domain=reports.localhost
+
Preview guide · 0.8.72

Workspaces and gateway

A workspace runs isolated applications behind one domain-routing gateway. Add an application from the workspace root; the CLI scaffolds apps/reports and registers it in wrnexus.workspace.ts:

wrnexus workspace add reports --domain=reports.localhost
 bun install
 bun run dev

Forward authentication

Point protected applications at a dedicated verifier endpoint. The verifier must return 2xx for an authenticated session, 401/403 to deny access, or an HTTP redirect to begin browser login.

// wrnexus.workspace.ts
 {
@@ -42,8 +42,8 @@ bunx wrnexus workspace add admin --domain=admin.localhost
 bunx wrnexus gateway --port=3000

What to verify

Run this against the selected profile, inspect the generated or returned result, and add a test for both the successful path and its most important failure path.

Configuration

Keep configuration in wrnexus.config.ts, select an explicit profile, and store secrets only in validated environment variables. Use wrnexus config . --explain to review the resolved non-secret configuration.

Implementation workflow

bunx wrnexus doctor .
 bunx wrnexus typecheck .
 bunx wrnexus inspect routes .
-bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.8 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

- +bunx wrnexus build .

Start from the exact installed package page, implement the smallest server-owned contract, and add browser behavior only where interaction requires it. Run the production build because development-only success does not prove deployability.

Verification checklist

  • Inputs are validated at the authoritative server boundary.
  • Authentication and resource authorization are tested independently.
  • Generated routes and application types are current.
  • Error, empty, loading, denied, and success states are documented.
  • The production artifact starts and serves the expected route.

Release scope

This guide describes installed 0.8.72 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · CLI reference · Troubleshooting · Support

+ } } \ No newline at end of file diff --git a/app/pages/index.wrn b/app/pages/index.wrn index 562fd06d..811cfdde 100644 --- a/app/pages/index.wrn +++ b/app/pages/index.wrn @@ -7,9 +7,9 @@ page Home { view {
-
W WRNexusJS
+
W WRNexusJS
-

WRNexusJS v0.8.8

Build from the server.
Ship only what matters.

WRNexusJS is an SSR-first, Bun-native full-stack framework. Build typed pages, APIs, validated forms, realtime rooms, secure sessions, workspaces, and optional mobile experiences with the .wrn component language.

Private developer preview. Request access to the package registry.

app/pages/dashboard.wrn
page Dashboard {
+      

WRNexusJS v0.8.72

Build from the server.
Ship only what matters.

WRNexusJS is an SSR-first, Bun-native full-stack framework. Build typed pages, APIs, validated forms, realtime rooms, secure sessions, workspaces, and optional mobile experiences with the .wrn component language.

Private developer preview. Request access to the package registry.

app/pages/dashboard.wrn
page Dashboard {
   ssr { api tasks GET /api/tasks { return tasks } }
   view {
     <main>
@@ -35,10 +35,10 @@ export const POST = async (ctx) => {
   return result.ok ? Response.json({ ok: true }, { status: 201 }) : result.response;
 };

Request lifecycle

  1. RequestSecurity headers and request limits
  2. MiddlewareAuthentication, policy, and context
  3. File routePage or API handler
  4. Compiler + SSRSafe HTML and scoped runtime
  5. ResponseHTML, JSON, stream, or realtime upgrade
-

Production proof

WorkRoot

Public creator/company site and approved WRNexusJS production showcase.

wrnexusjs.dev

This documentation application runs WRNexusJS 0.8.8.

View deployment notes and showcase status →

-

Capability status

CapabilityStatusDetails
SSR, routing, compiler, APIsPreviewInstalled in 0.8.8; public support policy pending.
Mobile/nativeExperimentalCapacitor compatibility and native generation have platform limitations.
Durable queuesExperimentalProduction durability requires an appropriate driver strategy.
+

Production proof

WorkRoot

Public creator/company site and approved WRNexusJS production showcase.

wrnexusjs.dev

This documentation application runs WRNexusJS 0.8.72.

View deployment notes and showcase status →

+

Capability status

CapabilityStatusDetails
SSR, routing, compiler, APIsPreviewInstalled in 0.8.72; public support policy pending.
Mobile/nativeExperimentalCapacitor compatibility and native generation have platform limitations.
Durable queuesExperimentalProduction durability requires an appropriate driver strategy.

Continue exploring

- +
} } \ No newline at end of file diff --git a/app/pages/language.wrn b/app/pages/language.wrn index 4f787d76..fc955760 100644 --- a/app/pages/language.wrn +++ b/app/pages/language.wrn @@ -7,7 +7,7 @@ page Thewrnlanguage { view {
-
W WRNexusJS
+
W WRNexusJS
Language reference · 0.8.8

The .wrn language

File anatomy

page Account {
+
Language reference · 0.8.72

The .wrn language

File anatomy

page Account {
   layout = "public"
   seo { title = "Account" description = "Manage your account." }
   state count = 0
   view { <button @click="count++">Count {count}</button> }
 }

Pages, components, layouts, props, and state

Pages are routes. Components declare default-valued props and may hold state. Layouts provide shared slots. Mount components with data-component; fill default or named slots with data-slot.

Interpolation, conditionals, and loops

Interpolation is HTML-escaped. Use server {#if} and {#each} for SSR data. Use data-show for reactive client visibility.

Events and directives

@click and other events execute in the reactive scope. Data attributes opt into forms, i18n, themes, realtime, uploader, browser, and mobile behavior. Consult the exact package page because availability varies.

Forms, i18n, themes, and realtime

form[data-schema] connects descriptors to client and server validation. Translation keys use {t:key}. Theme toggles use data-wire-theme-toggle. Realtime pages opt into a named room.

Escaping and security

Text interpolation is escaped by default. Do not construct trusted HTML from user input. Server-only refinements must be repeated at the authoritative mutation boundary.

Common compiler errors

  • Use balanced braces; a literal brace must be escaped.
  • Declare UI in view, not JSX or hooks.
  • Use a valid page, component, or layout declaration matching the file role.
  • Keep server loops tied to available SSR bindings.
  • Check troubleshooting and compiler API for this release.
- +
} } \ No newline at end of file diff --git a/app/pages/license.wrn b/app/pages/license.wrn index 0db882d3..5ad6d93e 100644 --- a/app/pages/license.wrn +++ b/app/pages/license.wrn @@ -7,7 +7,7 @@ page License { view {
-
W WRNexusJS
+
W WRNexusJS

License

Owner decision required

This documentation repository contains no public license file, and the packages are unavailable from the public npm registry. No open-source license or redistribution right should be inferred.

Approved preview users must follow the private/commercial terms supplied by WorkRoot. Contact WorkRoot before copying, redistributing, or using WRNexusJS in production.

- +
} } \ No newline at end of file diff --git a/app/pages/packages.wrn b/app/pages/packages.wrn index 5ca88dbe..0bbd65e2 100644 --- a/app/pages/packages.wrn +++ b/app/pages/packages.wrn @@ -12,7 +12,7 @@ page Packages {
W WRNexusJS - +
46 focused packages

Package reference

Everything in the framework, organized by responsibility and documented from the published 0.8.8 APIs.

Find a package

Showing {category} packages

All packages

+
46 focused packages

Package reference

Everything in the framework, organized by responsibility and documented from the published 0.8.72 APIs.

Find a package

Showing {category} packages

All packages

- +
} } diff --git a/app/pages/packages/ai.wrn b/app/pages/packages/ai.wrn index 26c176ae..ba2b8270 100644 --- a/app/pages/packages/ai.wrn +++ b/app/pages/packages/ai.wrn @@ -10,7 +10,7 @@ page wrnexusai {
W WRNexusJS - +
-
AI · Package reference

@wrnexus/ai

Server-side Anthropic client with generation and streaming.

v0.8.8Private registryAI

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/ai@0.8.8

Request preview access. Never put registry tokens in source control.

Provider-neutral AI orchestration for OpenAI, Anthropic, Google and local OpenAI-compatible models, with streaming, structured output, tools, embeddings, vector search/RAG, conversation persistence, templates, guardrails, usage events, fallback, rate limits and evaluation reports.

+
AI · Package reference

@wrnexus/ai

Server-side Anthropic client with generation and streaming.

v0.8.9Private registryAI

Install the package

After WorkRoot approves private registry access, install the package:

bun add @wrnexus/ai@0.8.9

Request preview access. Never put registry tokens in source control.

Provider-neutral AI orchestration for OpenAI, Anthropic, Google and local OpenAI-compatible models, with streaming, structured output, tools, embeddings, vector search/RAG, conversation persistence, templates, guardrails, usage events, fallback, rate limits and evaluation reports.

A tiny, zero-dependency Claude (Anthropic) client for WRNexusJS apps — generate and stream text with Claude from any server-side code.

Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

Overview

@@ -157,7 +157,7 @@ export const POST = async (ctx) => { };
- + } } diff --git a/app/pages/packages/auth.wrn b/app/pages/packages/auth.wrn index 1b4e6620..04f48c15 100644 --- a/app/pages/packages/auth.wrn +++ b/app/pages/packages/auth.wrn @@ -10,7 +10,7 @@ page wrnexusauth {
W WRNexusJS - +
-
Security · Package reference

@wrnexus/auth

Authentication routes, sessions, forms, guards, and account flows.

v0.8.8Private registrySecurity

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/auth@0.8.8

Request preview access. Never put registry tokens in source control.

Framework-native authentication, identity, account-security, and session management for WRNexusJS.

+
Security · Package reference

@wrnexus/auth

Authentication routes, sessions, forms, guards, and account flows.

v0.8.33Private registrySecurity

Install the package

After WorkRoot approves private registry access, install the package:

bun add @wrnexus/auth@0.8.33

Request preview access. Never put registry tokens in source control.

New-browser verification and device trust

+

Enable requireTrustedDeviceVerification: true to require a verified email or SMS challenge before an untrusted browser receives a sign-in session. The HTTP handlers use a host-only HttpOnly random cookie, ignoring posted fingerprints. Direct engine callers must supply a trusted server-side browser fingerprint. trustSignupDevice: true grants the registration browser one-time trust after required account verification, at its first successful sign-in.

+

Use trustedDeviceTtlMs: 30 * 86400_000 for 30-day trust. Ordinary logins do not renew it. The verification form offers explicit trust consent; expiry/revocation requires a new email/SMS challenge. Successful login alerts use both verified contact channels when configured. Delivery still requires an application adapter.

+

Signup business logic and verification-only sessions

+
const auth = createAuthEngine({
+  store: () => new SqlAuthStore(getDb()),
+  secret: process.env.AUTH_SECRET!,
+  requireVerifiedEmail: true,
+  onSignUp(ctx, user) {
+    // Application business logic can run here after successful registration.
+    return { verificationSession: true, redirectTo: "/verify-email" };
+  },
+  delivery: {
+    async send(message) {
+      // message.channel, template, destination, user, expiresAt
+      // Verification uses message.token and message.url; OTP flows use message.code.
+      // Render your branded content here before passing it to your provider.
+    },
+  },
+});
+

onSuccessfulSignUp remains supported; configure only one signup hook. Hooks run from the HTTP registration handler and may return an action or a custom Response. The request origin (or configured auth.baseUrl) supplies signup link URLs; a client-supplied baseUrl is never trusted. Direct engine.register callers may provide a trusted baseUrl explicitly.

+

The verification cookie is HttpOnly, SameSite=Lax, Secure on HTTPS, and host-only. Its opaque token is stored hashed in the auth token store, separate from login sessions; it cannot bypass email verification, MFA, or account policy. Use getVerificationUser(ctx, auth) to guard your verification page and clearVerificationSession(ctx, auth) after verification. Use startVerificationSession(ctx, auth, user.id) only after credential validation when an unverified user signs in again. SQL-backed sessions survive server reloads; memory stores remain development/test-only. No email or SMS provider is configured automatically.

+

Framework-native authentication, identity, account-security, and session management for WRNexusJS.

Capabilities

  • Password registration, login, recovery, reset, and authenticated password changes
  • @@ -286,15 +308,16 @@ bun run validate:auth
  • <AuthSecurityNotice />
  • complete sign-in, sign-up, MFA, passkey, recovery, account-status, session, and impersonation blocks
-

Server helpers include authRoute, authSuccess, authFailure, requireAuthUser, optionalAuthUser, currentAuthSession, and authComponentProps.

Complete TypeScript API

Generated from the exact installed package declarations.

import { A as AuthEngine } from './engine-BDu0-aZp.js';
-export { c as createAuthEngine, i as inferIdentityType, n as normalizeEmail, a as normalizeIdentity, b as normalizePhone, d as normalizeUsername, p as publicUser, s as safeAuthReturnTo } from './engine-BDu0-aZp.js';
-import { o as AuthRiskSignals, m as AuthRiskDecision, s as AuthSession, B as AuthUser } from './types-BhwPi3qr.js';
-export { A as AUTH_SECURITY_EVENT_TYPES, a as AuthAccountStatus, b as AuthClock, c as AuthDeliveryMessage, d as AuthDeliveryProvider, e as AuthEngineOptions, f as AuthIdentity, g as AuthIdentityType, h as AuthImpersonationDecision, i as AuthMfaMethod, j as AuthPublicUser, k as AuthRandom, l as AuthResult, n as AuthRiskLevel, p as AuthSecretProtector, q as AuthSecurityEvent, r as AuthSecurityEventType, t as AuthSessionVerificationHandler, u as AuthSignedInHandler, v as AuthSignedOutHandler, U as AuthStore, w as AuthSuccessfulSignUpAction, x as AuthSuccessfulSignUpHandler, y as AuthTokenPurpose, z as AuthTokenUrlInput, C as AuthenticatedContext, K as KnownAuthSecurityEventType, L as LoginAttempt, D as LoginInput, V as MemoryPasskeyChallengeStore, O as OAuthAccount, E as OneTimeToken, F as OtpChallenge, P as PasskeyAuthenticationOptions, W as PasskeyChallengeKind, X as PasskeyChallengeRecord, Y as PasskeyChallengeStore, G as PasskeyCredential, H as PasskeyProvider, I as PasskeyRegistrationOptions, J as PasskeyVerificationResult, M as PasswordBreachProvider, N as PasswordCredential, R as RecoveryCodeRecord, Q as RegisterInput, T as TotpCredential, S as TrustedDevice, Z as assertPasskeyProvider } from './types-BhwPi3qr.js';
+

Server helpers include authRoute, authSuccess, authFailure, requireAuthUser, optionalAuthUser, currentAuthSession, and authComponentProps.

Complete TypeScript API

Generated from the exact installed package declarations.

import { A as AuthEngine } from './engine-NjrTiSrg.js';
+export { c as createAuthEngine, i as inferIdentityType, n as normalizeEmail, a as normalizeIdentity, b as normalizePhone, d as normalizeUsername, p as publicUser, s as safeAuthReturnTo } from './engine-NjrTiSrg.js';
+export { VERIFICATION_SESSION_COOKIE, clearVerificationSession, getVerificationUser, startVerificationSession } from './server/index.js';
+import { m as AuthRiskSignals, n as AuthRiskDecision, d as AuthSession, b as AuthUser } from './types-CuQWJQV1.js';
+export { o as AUTH_SECURITY_EVENT_TYPES, p as AuthAccountStatus, q as AuthClock, r as AuthDeliveryMessage, s as AuthDeliveryProvider, t as AuthEngineOptions, c as AuthIdentity, u as AuthIdentityType, v as AuthImpersonationDecision, w as AuthMfaMethod, j as AuthPublicUser, x as AuthRandom, y as AuthResult, z as AuthRiskLevel, l as AuthSecretProtector, i as AuthSecurityEvent, B as AuthSecurityEventType, A as AuthSessionVerificationHandler, C as AuthSignedInHandler, D as AuthSignedOutHandler, a as AuthStore, E as AuthSuccessfulSignUpAction, F as AuthSuccessfulSignUpHandler, G as AuthTokenPurpose, H as AuthTokenUrlInput, k as AuthenticatedContext, K as KnownAuthSecurityEventType, L as LoginAttempt, I as LoginInput, M as MemoryPasskeyChallengeStore, h as OAuthAccount, O as OneTimeToken, e as OtpChallenge, J as PasskeyAuthenticationOptions, N as PasskeyChallengeKind, Q as PasskeyChallengeRecord, S as PasskeyChallengeStore, g as PasskeyCredential, U as PasskeyProvider, V as PasskeyRegistrationOptions, W as PasskeyVerificationResult, X as PasswordBreachProvider, P as PasswordCredential, R as RecoveryCodeRecord, Y as RegisterInput, f as TotpCredential, T as TrustedDevice, Z as assertPasskeyProvider } from './types-CuQWJQV1.js';
 export { MemoryAuthStore } from './stores/memory.js';
-export { SqlAuthStore } from './stores/sql.js';
-export { AUTH_SESSION_KEY, authSession, clearAuthSession, establishAuthSession, getAuthSession, getAuthUser, isAuthenticatedContext, requireAuth } from './middleware.js';
-export { A as AuthHttpOptions, a as AuthPasskeyHttpOptions, b as AuthSchemaOverrides, c as AuthSchemaSet, d as authBrowserSchemaDescriptors, e as authBrowserSchemaMap, f as authSchemas, g as authenticatorConfirmSchema, h as authenticatorDisableSchema, i as authenticatorSetupSchema, j as changePasswordSchema, k as createAuthHttpHandlers, l as emptyActionSchema, m as impersonationStartSchema, n as invitationAcceptSchema, o as loginSchema, p as magicLinkConsumeSchema, q as magicLinkRequestSchema, r as mfaOtpRequestSchema, s as mfaSchema, t as otpIssueSchema, u as otpLoginCompleteSchema, v as otpLoginRequestSchema, w as otpSchema, x as passkeyAuthenticationOptionsSchema, y as passkeyAuthenticationVerifySchema, z as passkeyRegistrationOptionsSchema, B as passkeyRegistrationVerifySchema, C as passwordResetRequestSchema, D as passwordResetSchema, E as recoveryCodesSchema, F as registerSchema, G as resolveAuthSchemas, H as sessionRevokeSchema, I as signUpSchema, J as verificationRequestSchema, K as verificationTokenSchema } from './index-B4uaD0Z3.js';
-export { AuthAuditIssue, AuthConfig, AuthPluginOptions, AuthRoutesConfig, authComponentsDir, authPlugin } from './plugin.js';
+export { SqlAuthStore, SqlAuthStoreOptions } from './stores/sql.js';
+export { AUTH_SESSION_KEY, AuthRequiredError, authSession, clearAuthSession, establishAuthSession, getAuthSession, getAuthUser, isAuthenticatedContext, requireAuth, requireAuthUser } from './middleware.js';
+export { d as AuthHttpOptions, a as AuthPasskeyHttpOptions, A as AuthSchemaOverrides, b as AuthSchemaSet, e as authBrowserSchemaDescriptors, f as authBrowserSchemaMap, g as authSchemas, h as authenticatorConfirmSchema, i as authenticatorDisableSchema, j as authenticatorSetupSchema, k as changePasswordSchema, c as createAuthHttpHandlers, l as emptyActionSchema, m as impersonationStartSchema, n as invitationAcceptSchema, o as loginSchema, p as magicLinkConsumeSchema, q as magicLinkRequestSchema, r as mfaOtpRequestSchema, s as mfaSchema, t as otpIssueSchema, u as otpLoginCompleteSchema, v as otpLoginRequestSchema, w as otpSchema, x as passkeyAuthenticationOptionsSchema, y as passkeyAuthenticationVerifySchema, z as passkeyRegistrationOptionsSchema, B as passkeyRegistrationVerifySchema, C as passwordResetRequestSchema, D as passwordResetSchema, E as recoveryCodesSchema, F as registerSchema, G as resolveAuthSchemas, H as sessionRevokeSchema, I as signUpSchema, J as verificationRequestSchema, K as verificationTokenSchema } from './index-DuuY2a1R.js';
+export { AuthAuditIssue, AuthConfig, AuthPluginOptions, AuthRoutesConfig, authComponentsDir, authPlugin, configureAuthRuntime, validateProductionAuthConfig } from './plugin.js';
 export { DefaultAuthRouteOptions, clearDefaultAuthEngine, getDefaultAuthEngine, getDefaultAuthRouteOptions, getDefaultAuthSchemas, hasDefaultAuthEngine, setDefaultAuthEngine, setDefaultAuthRouteOptions, setDefaultAuthSchemas, tryGetDefaultAuthEngine } from './runtime.js';
 export { createAuthSecretProtector } from './protector.js';
 export { decodeBase32, encodeBase32, generateTotp, generateTotpSecret, totpUri, verifyTotp } from './totp/index.js';
@@ -319,7 +342,6 @@ declare function authRoute(name: AuthRouteName, options?: {
 }): string;
 declare function authSuccess<T extends Record<string, unknown>>(data: T, init?: ResponseInit): Response;
 declare function authFailure(code: string, message: string, status?: number, details?: Record<string, unknown>): Response;
-declare function requireAuthUser(ctx: Context): AuthUser;
 declare function optionalAuthUser(ctx: Context): AuthUser | null;
 declare function currentAuthSession(engine: AuthEngine, sessionId: string | undefined): Promise<AuthSession | null>;
 declare function authComponentProps(input: Record<string, unknown>, defaults?: {
@@ -328,8 +350,23 @@ declare function authComponentProps(input: Record<string, unknown>, defaul
     class?: string;
 }): Record<string, unknown>;
 
-export { AuthEngine, AuthRiskDecision, AuthRiskSignals, type AuthRouteName, AuthSession, AuthUser, type RiskPolicy, authComponentProps, authFailure, authRoute, authSuccess, currentAuthSession, evaluateAuthRisk, optionalAuthUser, requireAuthUser };
-

Examples

Copy-ready examples from the installed package documentation.

## Install

bun add @wrnexus/auth

Create the engine

// app/lib/auth.ts
+export { AuthEngine, AuthRiskDecision, AuthRiskSignals, type AuthRouteName, AuthSession, AuthUser, type RiskPolicy, authComponentProps, authFailure, authRoute, authSuccess, currentAuthSession, evaluateAuthRisk, optionalAuthUser };
+

Examples

Copy-ready examples from the installed package documentation.

Signup business logic and verification-only sessions

const auth = createAuthEngine({
+  store: () => new SqlAuthStore(getDb()),
+  secret: process.env.AUTH_SECRET!,
+  requireVerifiedEmail: true,
+  onSignUp(ctx, user) {
+    // Application business logic can run here after successful registration.
+    return { verificationSession: true, redirectTo: "/verify-email" };
+  },
+  delivery: {
+    async send(message) {
+      // message.channel, template, destination, user, expiresAt
+      // Verification uses message.token and message.url; OTP flows use message.code.
+      // Render your branded content here before passing it to your provider.
+    },
+  },
+});

Signup business logic and verification-only sessions

bun add @wrnexus/auth

Signup business logic and verification-only sessions

// app/lib/auth.ts
 import { createAuthEngine, MemoryAuthStore } from "@wrnexus/auth";
 
 export const auth = createAuthEngine({
@@ -379,20 +416,10 @@ import { getDb } from "@wrnexus/db";
 export const auth = createAuthEngine({
   store: new SqlAuthStore(getDb()),
   secret: process.env.AUTH_SECRET!,
-});

Successful signup behavior

export default {
-  db: {
-    // Application database configuration.
-  },
-  auth: {
-    engine: auth,
-    routes: true,
-    middleware: true,
-    migrations: true,
-  },
-};
- +}); +
- + } } diff --git a/app/pages/packages/authz.wrn b/app/pages/packages/authz.wrn index a2ae017e..e733c680 100644 --- a/app/pages/packages/authz.wrn +++ b/app/pages/packages/authz.wrn @@ -10,7 +10,7 @@ page wrnexusauthz {
W WRNexusJS - +
-
Security · Package reference

@wrnexus/authz

Role, permission, policy, and authorization guards.

v0.8.8Private registrySecurity

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/authz@0.8.8

Request preview access. Never put registry tokens in source control.

Composable authorization for WRNexusJS — role-based (RBAC), policy-based (PBAC), and attribute-based (ABAC) access control that reduces to a boolean check plus an authorize() guard.
+
Security · Package reference

@wrnexus/authz

Role, permission, policy, and authorization guards.

v0.8.15Private registrySecurity

Install the package

After WorkRoot approves private registry access, install the package:

bun add @wrnexus/authz@0.8.15

Request preview access. Never put registry tokens in source control.

Composable authorization for WRNexusJS — role-based (RBAC), policy-based (PBAC), and attribute-based (ABAC) access control that reduces to a boolean check plus an authorize() guard.

Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

Overview

@wrnexus/authz 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 boolean | Promise<boolean> decision. Wrap any decision in a Middleware guard (authorize, requireRole, requirePermission) 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 @wrnexus/core by reading ctx.user as the authorization subject.

@@ -209,12 +209,12 @@ function guard(permission: Permission) { * Validate and freeze one authorization declaration. Called from * `app/authz/<name>.ts` as the module's default export. */ -declare function defineAuthz(module: AuthzModule): AuthzModule; +declare function defineAuthz<Subject = any, Resource = any>(module: AuthzModule<Subject, Resource>): DefinedAuthzModule<Subject, Resource>; interface CatalogSource { /** File or package that declared this module, used in conflict messages. */ source: string; - module: AuthzModule; + module: AuthzModule<never, never>; } 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 = "_authz"; +interface AuthorizationResponses { + forbidden(decision?: AuthorizationDecision, options?: { + exposeReason?: boolean; + }): Response; + notFoundOrForbidden(options?: { + mayDiscover?: boolean; + decision?: AuthorizationDecision; + exposeReason?: boolean; + }): Response; +} +interface RequestAuthorization extends AuthorizationResponses { + can(permission: string, resource?: unknown): Promise<boolean>; + decide(permission: string, resource?: unknown): Promise<AuthorizationDecision>; +} +declare module "@wrnexus/core" { + interface Context { + /** Installed by authzMiddleware for handlers that prefer context-local authorization. */ + authz?: RequestAuthorization; + } +} /** 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<T>(ctx: Context, permission: string, items: readonly T[]): Promise<T[]>; +interface AuthorizedHandlerOptions<Resource, Result extends Response = Response> { + permission: string; + resource?: (ctx: Context) => Resource | null | undefined | Promise<Resource | null | undefined>; + exposeReason?: boolean; + mayDiscover?: (ctx: Context) => boolean | Promise<boolean>; + handle(ctx: Context & { + resource: Resource; + }): Result | Promise<Result>; +} +/** Define an API handler whose resource loading and permission check cannot be skipped. */ +declare function defineAuthorizedHandler<Resource = undefined, Result extends Response = Response>(options: AuthorizedHandlerOptions<Resource, Result>): (ctx: Context) => Promise<Response>; +interface OwnedResourceDefinition<Resource> { + name: string; + owner(resource: Resource): string | null | undefined; + permissions: { + read?: string; + create?: string; + update?: string; + delete?: string; + readAny?: string; + writeAny?: string; + }; +} +/** Shared ownership and override vocabulary for application resource modules. */ +declare function defineOwnedResource<Resource>(definition: OwnedResourceDefinition<Resource>): Readonly<{ + attributes(resource: Resource): { + ownerId: string | null | undefined; + }; + isOwner(subjectId: string, resource: Resource): boolean; + name: string; + owner(resource: Resource): string | null | undefined; + permissions: { + read?: string; + create?: string; + update?: string; + delete?: string; + readAny?: string; + writeAny?: string; + }; +}>; + /** * Emit `Permission`/`Role` string-literal unions from the registered catalog. * @@ -465,14 +527,22 @@ interface AttributeMeta { description?: string; } /** One `app/authz/<name>.ts` declaration. */ -interface AuthzModule { +interface AuthzModule<Subject = any, Resource = any> { permissions?: Record<string, PermissionMeta>; roles?: Record<string, string[]>; - policies?: Record<string, DecisionPolicy<never, never>>; + policies?: Record<string, DecisionPolicy<Subject, Resource>>; attributes?: Record<string, AttributeMeta>; /** permission id -> policy names that must pass for it. */ bindings?: Record<string, string[]>; } +/** A declaration after defineAuthz() has supplied all optional collections. */ +type DefinedAuthzModule<Subject = any, Resource = any> = { + permissions: Record<string, PermissionMeta>; + roles: Record<string, string[]>; + policies: Record<string, DecisionPolicy<Subject, Resource>>; + attributes: Record<string, AttributeMeta>; + bindings: Record<string, string[]>; +}; /** The merged, frozen view of every declaration in the app. */ interface AuthzCatalog { permissions: ReadonlyMap<string, PermissionMeta>; @@ -527,7 +597,7 @@ interface CacheOptions { */ declare function cachedPermissionStore(inner: PermissionStore, options?: CacheOptions): CachedPermissionStore; -export { 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 }; +export { 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 };

Examples

Copy-ready examples from the installed package documentation.

RBAC

import { defineRbac, hasRole } from "@wrnexus/authz";
 
 const rbac = defineRbac({
@@ -586,7 +656,7 @@ app.put(
 );
- + } } diff --git a/app/pages/packages/benchmark.wrn b/app/pages/packages/benchmark.wrn index ef66f15c..da789b5c 100644 --- a/app/pages/packages/benchmark.wrn +++ b/app/pages/packages/benchmark.wrn @@ -10,7 +10,7 @@ page wrnexusbenchmark {
W WRNexusJS - +
-
Tooling · Package reference

@wrnexus/benchmark

Framework benchmark scenarios and repeatable performance measurements.

v0.8.8Private registryTooling

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/benchmark@0.8.8

Request preview access. Never put registry tokens in source control.

Deterministic benchmark execution, percentiles, baseline comparisons, and regression budgets for builds, SSR, hydration, stores, and application hot paths.

+
Tooling · Package reference

@wrnexus/benchmark

Framework benchmark scenarios and repeatable performance measurements.

v0.8.8Private registryTooling

Install the package

After WorkRoot approves private registry access, install the package:

bun add @wrnexus/benchmark@0.8.8

Request preview access. Never put registry tokens in source control.

Deterministic benchmark execution, percentiles, baseline comparisons, and regression budgets for builds, SSR, hydration, stores, and application hot paths.

import { runBenchmark, assertBenchmarkBudget } from "@wrnexus/benchmark";
 const result = await runBenchmark("render", render, { iterations: 100 });
 assertBenchmarkBudget(result, baseline, { p95Percent: 5 });

Complete TypeScript API

Generated from the exact installed package declarations.

interface BenchmarkOptions {
@@ -67,7 +67,7 @@ const result = await runBenchmark("render", render, { iterations:
 assertBenchmarkBudget(result, baseline, { p95Percent: 5 });

Install @wrnexus/benchmark

bun add @wrnexus/benchmark
- + } } diff --git a/app/pages/packages/cache.wrn b/app/pages/packages/cache.wrn index ac1b8847..0b71d4e1 100644 --- a/app/pages/packages/cache.wrn +++ b/app/pages/packages/cache.wrn @@ -10,7 +10,7 @@ page wrnexuscache {
W WRNexusJS - +
-
Data · Package reference

@wrnexus/cache

Memory and distributed caching with coordination and invalidation.

v0.8.8Private registryData

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/cache@0.8.8

Request preview access. Never put registry tokens in source control.

Bounded in-memory/tag caching and HTTP response caching for WRNexusJS. Supports request deduplication, tag invalidation, ETags, fresh/stale states, and optional detached stale revalidation.

+
Data · Package reference

@wrnexus/cache

Memory and distributed caching with coordination and invalidation.

v0.8.8Private registryData

Install the package

After WorkRoot approves private registry access, install the package:

bun add @wrnexus/cache@0.8.8

Request preview access. Never put registry tokens in source control.

Bounded in-memory/tag caching and HTTP response caching for WRNexusJS. Supports request deduplication, tag invalidation, ETags, fresh/stale states, and optional detached stale revalidation.

import { connectCacheInvalidation, TagCache, responseCache } from "@wrnexus/cache";
 const cache = new TagCache({ ttlMs: 60_000, staleWhileRevalidateMs: 300_000 });
 export default responseCache({ cache, tags: ["products"] });
@@ -241,7 +241,7 @@ await bus.close();

Pages }

- + } } diff --git a/app/pages/packages/captcha.wrn b/app/pages/packages/captcha.wrn index 2a2ca7a6..446406b8 100644 --- a/app/pages/packages/captcha.wrn +++ b/app/pages/packages/captcha.wrn @@ -10,7 +10,7 @@ page wrnexuscaptcha {
W WRNexusJS - +
-
Security · Package reference

@wrnexus/captcha

Managed CAPTCHA verification, middleware, and UI integration.

v0.8.8Private registrySecurity

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/captcha@0.8.8

Request preview access. Never put registry tokens in source control.

A first-class CAPTCHA and anti-automation package for WRNexusJS. It supports self-hosted challenges, a managed WRNexus service, external providers, form submission guards, page gates, accessible audio, adaptive risk checks, and a Tailwind-only .wrn component.

+
Security · Package reference

@wrnexus/captcha

Managed CAPTCHA verification, middleware, and UI integration.

v0.8.16Private registrySecurity

Install the package

After WorkRoot approves private registry access, install the package:

bun add @wrnexus/captcha@0.8.16

Request preview access. Never put registry tokens in source control.

A first-class CAPTCHA and anti-automation package for WRNexusJS. It supports self-hosted challenges, a managed WRNexus service, external providers, form submission guards, page gates, accessible audio, adaptive risk checks, and a Tailwind-only .wrn component.

Install

bun add @wrnexus/captcha

WRNexusJS automatically discovers the package plugin, component, client runtime, styles, and DevToolbar audit. Use <Captcha /> directly after installation. The browser runtime is injected once only on responses that render a CAPTCHA; no script tag, public-file copy, or manual plugin registration is required. Call captchaPlugin(options) explicitly only when an application needs to override the discovered package configuration.

@@ -78,7 +78,7 @@ export const HEAD = POST; @success='captchaToken = event.detail.responseToken' @failure='formError = event.detail.extra.message' /> -

The component uses Tailwind utilities and --wire-* theme variables. It has no companion component CSS file.

+

The component uses Tailwind utilities and --wrn-* theme variables. It has no companion component CSS file.

Main props

provider, siteKey, type, action, presentation, difficulty, disturbance, imageStyle, allowedStyles, excludedStyles, randomizeStyle, locale, size, color, class, name, endpoint, verifyEndpoint, responseField, labels/messages, autoLoad, autoVerify, showVerify, showRefresh, showAudio, showListen, showStatus, disabled, required, and the backward-compatible compact alias.

Component sizes

@@ -339,7 +339,7 @@ export const HEAD = POST;
- + } } diff --git a/app/pages/packages/cli.wrn b/app/pages/packages/cli.wrn index 1a05114b..22f63261 100644 --- a/app/pages/packages/cli.wrn +++ b/app/pages/packages/cli.wrn @@ -10,7 +10,7 @@ page wrnexuscli {
W WRNexusJS - +
-
Tooling · Package reference

@wrnexus/cli

Create, develop, build, generate, test, and maintain WRNexusJS apps.

v0.8.8Private registryTooling

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/cli@0.8.8

Request preview access. Never put registry tokens in source control.

Production parity commands:

+
Tooling · Package reference

@wrnexus/cli

Create, develop, build, generate, test, and maintain WRNexusJS apps.

v0.8.72Private registryTooling

Install the package

After WorkRoot approves private registry access, install the package:

bun add @wrnexus/cli@0.8.72

Request preview access. Never put registry tokens in source control.

Production parity commands:

wrnexus build .
 wrnexus preview . --port=3000
 wrnexus dev . --production-runtime
@@ -45,9 +45,8 @@ wrnexus dev . --production-runtime

Every command accepts an optional [app-dir] (defaults to .). Commands that read config or .env also accept --profile=<name> (see [Profiles](#profiles)).

-
CommandPurpose
wrnexus dev [app-dir] [--port=3000]Start the development server with live reload / HMR.
wrnexus build [app-dir]Build a self-contained production server bundle + assets into dist/.
wrnexus create <app-name>Scaffold a new single app from an inline template.
wrnexus workspace <name>Scaffold a monorepo (apps/* + shared packages/*).
wrnexus workspace add <name>Add and register an app in the current workspace.
wrnexus gateway [--port=3000]Serve every workspace app behind one port, routed by domain.
wrnexus production [workspace-dir]Build, migrate, and serve every workspace app in production.
wrnexus generate <type> <name>Scaffold a page \component \api \schema.
wrnexus generate routesRegenerate the typed routes file (app/routes.gen.ts).
wrnexus generate dockerScaffold Dockerfile, .dockerignore, and docker-compose.yml.
wrnexus generate mobileScaffold a Capacitor shell for iOS and Android.
wrnexus mobile add <package...>Install Capacitor plugins and sync native projects.
wrnexus eject <name...>Copy Wire UI component .wrn sources into app/components/.
wrnexus db <cmd>Database migrations and tooling (see [db](#wrnexus-db)).
wrnexus test [app-dir] [--watch]Run the app's tests via bun test (defaults to the test profile).
wrnexus profiles [app-dir]List config profiles and their .env files, marking the active one.
wrnexus compatibility checkCheck whether behavior defaults are explicitly pinned and current.
wrnexus compatibility explainExplain configured, effective, and current compatibility behavior.
wrnexus compatibility upgradeBack up config and explicitly opt into reviewed current behavior.
wrnexus helpPrint usage.
+wrnexus dev [app-dir] [--port=3000]Start the development server with live reload / HMR.wrnexus build [app-dir]Build a self-contained production server bundle + assets into dist/.wrnexus create <app-name>Scaffold a new single app from an inline template.wrnexus workspace <name>Scaffold a monorepo (apps/* + shared packages/*).wrnexus workspace add <name>Add and register an app in the current workspace.wrnexus gateway [--port=3000]Serve every workspace app behind one port, routed by domain.wrnexus production [workspace-dir]Build, migrate, and serve every workspace app in production.wrnexus generate <type> <name>Scaffold a page \component \api \schema.wrnexus generate routesRegenerate the typed routes file (app/routes.gen.ts).wrnexus generate dockerScaffold Dockerfile, .dockerignore, and docker-compose.yml.wrnexus generate mobileScaffold a Capacitor shell for iOS and Android.wrnexus mobile add <package...>Install Capacitor plugins and sync native projects.wrnexus eject <name...>Copy WRNexusJS UI component .wrn sources into app/components/.wrnexus db <cmd>Database migrations and tooling (see [db](#wrnexus-db)).wrnexus test [app-dir] [--watch]Run the app's tests via bun test (defaults to the test profile).wrnexus profiles [app-dir]List config profiles and their .env files, marking the active one.wrnexus helpPrint usage.

wrnexus g is an alias for wrnexus generate.

-

Compatibility upgrades never happen implicitly. New applications pin compatibilityDate and frameworkBehaviour; existing applications use wrnexus compatibility explain before the backed-up, idempotent upgrade command.

wrnexus dev

Supervises a child dev-server process (from @wrnexus/dev-server). The child owns file watching and HMR: CSS and client-island edits update the live page over a WebSocket with no restart; when a server module changes, the child exits with a restart code and the supervisor respawns it (the browser reconnects and morphs in the new HTML). On startup it regenerates typed DB queries and typed routes (best effort). Use --port= to change the port (default 3000).

wrnexus dev . --port=8080
@@ -88,7 +87,7 @@ wrnexus mobile assets # generate native icons from config.mobile.iconBrowser code can access installed plugins through the SSR-safe @wrnexus/mobile bridge. The command adds each plugin to both the WRNexusJS app (JavaScript proxy) and mobile/ (native synchronization).

wrnexus mobile sync also configures Android so only true network failures use the local connection-error screen. HTTP errors such as 404 and 500 keep their WRNexusJS response pages.

wrnexus eject

-

Copies a Wire UI component's .wrn source out of @wrnexus/ui into app/components/, so the app owns and can edit it (the app copy shadows the library one by name). Run with no names to list available components. It skips components that already exist in the app.

+

Copies a WRNexusJS UI component's .wrn source out of @wrnexus/ui into app/components/, so the app owns and can edit it (the app copy shadows the library one by name). Run with no names to list available components. It skips components that already exist in the app.

wrnexus eject button card modal

wrnexus db

Database migrations and tooling. Without a flag, commands target the default database (db in wrnexus.config.ts, files under app/db/). Pass --db=<name> to target a named database (databases.<name>, files under app/db/<name>/).

@@ -155,7 +154,7 @@ export default config;

Requirements / Notes

  • Bun-only. The CLI runs on Bun, spawns the Bun binary for the dev child and bun test, and the production build uses Bun.build. Node is not supported.
  • -
  • Orchestrates the rest of the framework: @wrnexus/dev-server (dev/prod server + gateway), @wrnexus/router (route + typed-routes codegen), @wrnexus/compiler (.wrn → .ts), @wrnexus/db (migrations, typed queries), @wrnexus/styles (config, profiles, .env, themes, styles), @wrnexus/ui (ejectable Wire UI components), @wrnexus/validation, @wrnexus/csr, and @wrnexus/i18n.
  • +
  • Orchestrates the rest of the framework: @wrnexus/dev-server (dev/prod server + gateway), @wrnexus/router (route + typed-routes codegen), @wrnexus/compiler (.wrn → .ts), @wrnexus/db (migrations, typed queries), @wrnexus/styles (config, profiles, .env, themes, styles), @wrnexus/ui (ejectable WRNexusJS UI components), @wrnexus/validation, @wrnexus/csr, and @wrnexus/i18n.
  • Reads wrnexus.config.ts for db / databases, theme, styles, seo, security, i18n, and profiles, and wrnexus.workspace.ts for the gateway.

Complete TypeScript API

Generated from the exact installed package declarations.

#!/usr/bin/env bun
 

Examples

Copy-ready examples from the installed package documentation.

Create and run a single application

bunx @wrnexus/cli create customer-portal
@@ -173,7 +172,7 @@ wrnexus update --latest
 wrnexus doctor
- + } } diff --git a/app/pages/packages/compiler.wrn b/app/pages/packages/compiler.wrn index 6d67f36a..c2eec059 100644 --- a/app/pages/packages/compiler.wrn +++ b/app/pages/packages/compiler.wrn @@ -10,7 +10,7 @@ page wrnexuscompiler {
W WRNexusJS - +
-
Core · Package reference

@wrnexus/compiler

Parser and code generators for the .wrn language.

v0.8.8Private registryCore

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/compiler@0.8.8

Request preview access. Never put registry tokens in source control.

Partial-static rendering

+
Core · Package reference

@wrnexus/compiler

Parser and code generators for the .wrn language.

v0.8.30Private registryCore

Install the package

After WorkRoot approves private registry access, install the package:

bun add @wrnexus/compiler@0.8.30

Request preview access. Never put registry tokens in source control.

Partial-static rendering

Pages can select render = "partial-static" and divide their view with <Static> and <Dynamic> boundaries. The compiler emits a build-only shell renderer that never evaluates dynamic-boundary children. wrnexus build expands static component mounts into dist/partial-shells.json, records byte/region evidence in build-report.json, and embeds the shell in the production route manifest. At request time the production runtime retains request-aware layouts, locale/theme metadata and security nonces while streaming dynamic regions into stable placeholders.

Compiler for the .wrn language — tokenizes, parses, and lowers .wrn page and component files to TypeScript.

Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

@@ -51,7 +51,7 @@ layout PublicLayout {
(a read token in ~/.npmrc). Requires Bun (Node is not supported).

API

All exports come from the package root (@wrnexus/compiler).

-

compileWireFile(source: string): string

+

compileWrnFile(source: string): string

Compile .wrn source to a TypeScript module string. Throws ParseError on invalid input. The output is prefixed with a // compiled from .wrn comment.

compile(source: string): CompileResult

Richer entry point that returns the generated code, the AST, and any diagnostics.

@@ -80,7 +80,7 @@ layout PublicLayout {

Errors

-
ClassThrown byMeaning
ParseErrorparse, compile, compileWireFile, generateInvalid .wrn grammar or (rewrapped) lex failure.
LexErrorLexerUnexpected character / unterminated string / unbalanced braces.
+ParseErrorparse, compile, compileWrnFile, generateInvalid .wrn grammar or (rewrapped) lex failure.LexErrorLexerUnexpected character / unterminated string / unbalanced braces.

AST types

Exported type-only symbols describing the parsed tree:

@@ -88,9 +88,9 @@ layout PublicLayout {
PageAstRoot node including top-level imports, kind, name, types, typed props, typed states, view, styles, functions, data APIs, lifecycle, and routes.
ViewNode{ type: "text"; value } or { type: "element"; tag; attrs; children }.
Attr{ name; value; event; boolean? } — event marks @event bindings.
StateDecl{ name; valueType?; expr } — a typed state x: Type = <expr> declaration.
PropDecl{ name; valueType?; required; default } — a typed prop declaration.
SeoBlockRecord<string, string> from the seo { ... } block.
ApiBlock{ method; path; body } — a top-level api METHOD /path { ... }.
DataApiBlock{ mode; name; method; path; body } — an api inside an ssr/client block.
DataMode`"ssr" \"client"`.
ModeFunctionsBlock{ mode; body } — a functions { ... } inside an ssr/client block.
RealtimeBlock{ name; handlers } — a realtime <name> { on evt(args) { ... } } block.

Usage

Compile a page:

-
import { compileWireFile } from "@wrnexus/compiler";
+
import { compileWrnFile } from "@wrnexus/compiler";
 
-const ts = compileWireFile(`
+const ts = compileWrnFile(`
 page Home {
   state count = 0
   seo { title = "Home" description = "Welcome" }
@@ -143,10 +143,9 @@ lx.next(); // { type: "lbrace", value: "{", pos: 1
 

Requirements / Notes

  • Pure TypeScript with no runtime dependencies; runs under Bun as part of the WRNexusJS toolchain (Node is not supported).
  • -
  • Generated modules target WRNexusJS runtime primitives (data-scope, data-text, data-on-*, data-for, data-component, __wrnexus*/__wire* helpers) — consume the output within a WRNexusJS app, e.g. via @wrnexus/core's dev loader.
  • -

Complete TypeScript API

Generated from the exact installed package declarations.

import { PageAst as PageAst$1, StructuredImportDecl, WrnDiagnostic } from '@wrnexus/syntax';
+
  • Generated modules target WRNexusJS runtime primitives (data-scope, data-text, data-on-*, data-for, data-component, __wrnexus*/__wrn* helpers) — consume the output within a WRNexusJS app, e.g. via @wrnexus/core's dev loader.
  • +

    Complete TypeScript API

    Generated from the exact installed package declarations.

    import { PageAst, StructuredImportDecl, WrnDiagnostic } from '@wrnexus/syntax';
     export { ActionBlock, ApiBlock, Attr, ComputedDecl, DataApiBlock, DataMode, EffectBlock, EventDecl, FormatWrnOptions, LexError, Lexer, LoadBlock, ModeFunctionsBlock, OutputDecl, PageAst, ParseError, PropDecl, RealtimeBlock, RuntimeFunctionDecl, SeoBlock, StateDecl, StateRuntime, StoreKind, StructuredImportDecl, ViewNode, WrnDiagnostic, assertValidAst, diagnose, diagnosticFromError, eraseFunctionTypes, formatDiagnostic, formatWrn, inferredRuntimeType, parse, runtimeTypeOf } from '@wrnexus/syntax';
    -import { PageAst } from '@wrnexus/syntax/parser';
     
     /**
      * Code generation: lower a `.wrn` AST to TypeScript that targets the framework's
    @@ -165,11 +164,15 @@ import { PageAst } from '@wrnexus/syntax/parser';
      *   realtime {..}      -> export const websocket = { evt(ws, ...args) { b } }
      */
     
    -declare function generate(ast: PageAst): string;
    +interface GenerateOptions {
    +    /** Local names bound to .tsx island imports in this file. */
    +    islands?: ReadonlySet<string>;
    +}
    +declare function generate(ast: PageAst, options?: GenerateOptions): string;
     
     interface ComponentContractMetadata {
         name: string;
    -    kind: PageAst$1["kind"];
    +    kind: PageAst["kind"];
         props: Array<{
             name: string;
             type: string;
    @@ -211,7 +214,7 @@ interface ComponentContractMetadata {
             namedImports: string[];
         }>;
     }
    -declare function createComponentContract(ast: PageAst$1): ComponentContractMetadata;
    +declare function createComponentContract(ast: PageAst): ComponentContractMetadata;
     
     interface RpcManifestEntry {
         id: string;
    @@ -224,8 +227,8 @@ interface RpcManifestEntry {
         }>;
         returnType: string;
     }
    -declare function rpcManifest(ast: PageAst$1): RpcManifestEntry[];
    -declare function generateServerFunctionsModule(ast: PageAst$1): string;
    +declare function rpcManifest(ast: PageAst): RpcManifestEntry[];
    +declare function generateServerFunctionsModule(ast: PageAst): string;
     
     interface CompileTargets {
         server: string;
    @@ -234,15 +237,30 @@ interface CompileTargets {
         contract: ReturnType<typeof createComponentContract>;
         rpc: ReturnType<typeof rpcManifest>;
     }
    -declare function generateTargets(ast: PageAst$1): CompileTargets;
    +declare function generateTargets(ast: PageAst): CompileTargets;
     
    -declare function generateBrowserModule(ast: PageAst$1): string;
    +declare function generateBrowserModule(ast: PageAst): string;
     
    -declare function generateDeclarations(ast: PageAst$1): string;
    +/**
    + * Strip TypeScript from a generated browser module.
    + *
    + * A client function's body is emitted verbatim, so anything TypeScript-only
    + * inside one -- an annotated local, an `as` cast, a local interface -- reaches
    + * the browser module as TypeScript source. Codegen removes the types from the
    + * function's *signature*, which is what made this easy to miss: the emitted
    + * module looked transpiled, and only bodies carried types through.
    + *
    + * The artifact is written as `.mjs` and read back as plain JavaScript, so the
    + * failure surfaced as a syntax error pointing at generated code rather than at
    + * the `.wrn` line responsible.
    + */
    +declare function stripBrowserTypes(code: string): string;
     
    -declare function generateStoreModule(ast: PageAst$1): string;
    +declare function generateDeclarations(ast: PageAst): string;
    +
    +declare function generateStoreModule(ast: PageAst): string;
     /** Standalone browser artifact for an imported `.wrn` store. */
    -declare function generateStoreBrowserModule(ast: PageAst$1): string;
    +declare function generateStoreBrowserModule(ast: PageAst): string;
     
     type ImportMode = "legacy" | "compatible" | "explicit";
     interface ImportResolverOptions {
    @@ -253,6 +271,8 @@ interface ImportResolverOptions {
     interface ResolvedImport {
         declaration: StructuredImportDecl;
         resolved?: string;
    +    /** `.tsx` imports are React islands, not `.wrn` components. */
    +    kind?: "island";
         diagnostic?: {
             code: string;
             message: string;
    @@ -281,6 +301,8 @@ interface RuntimeRequirements {
         kind: RouteExecutionKind;
         canPrerender: boolean;
         needsClientRuntime: boolean;
    +    /** True when the route mounts a React island and must ship the island runtime. */
    +    needsIslandRuntime: boolean;
         needsServerRuntime: boolean;
         hydrationStrategy: string | null;
         reasons: string[];
    @@ -302,12 +324,19 @@ interface OptimizationReport {
         serverOnlyModules: string[];
     }
     /** Safe compile-time folding for literal conditional branches. */
    -declare function optimizeAst(ast: PageAst$1): {
    -    ast: PageAst$1;
    +declare function optimizeAst(ast: PageAst): {
    +    ast: PageAst;
         eliminatedBranches: number;
     };
    -declare function analyzeOptimizations(ast: PageAst$1): OptimizationReport;
    -declare function analyzeRuntimeRequirements(ast: PageAst$1): RuntimeRequirements;
    +declare function analyzeOptimizations(ast: PageAst): OptimizationReport;
    +/**
    + * A route containing a React island ships JavaScript and can no longer be
    + * classified as zero-JS static, so island presence must reach the classifier.
    + */
    +declare function routeNeedsIslands(imports: ResolvedImport[]): boolean;
    +declare function analyzeRuntimeRequirements(ast: PageAst, options?: {
    +    hasIslands?: boolean;
    +}): RuntimeRequirements;
     
     type DeploymentRuntime = "bun" | "node" | "edge" | "worker" | "service-worker" | "browser";
     type RuntimeCapability = "filesystem" | "tcp" | "process" | "websocket" | "crypto" | "streams" | "background-tasks";
    @@ -360,6 +389,93 @@ declare class DependencyGraph {
         affected(file: string): string[];
     }
     
    +type IslandStrategy = "only" | "load" | "visible" | "idle";
    +interface IslandDiagnostic {
    +    code: "WRN-ISLAND-PROPS";
    +    message: string;
    +    severity: "error";
    +}
    +declare function parseIslandStrategy(directives: string[]): IslandStrategy;
    +/**
    + * Interprets an island attribute value with JSX semantics.
    + *
    + * `title="Revenue"` is a string, `start={3}` is a number, `flag` alone is
    + * `true`. Without this every prop arrives as a string, so `start={3}` would be
    + * `"3"` and arithmetic in the island silently concatenates.
    + *
    + * Returns `dynamic` for a `{…}` value that is not JSON: such expressions are
    + * evaluated at runtime and cannot cross the serialization boundary.
    + */
    +declare function islandPropValue(raw: string | undefined): {
    +    value: unknown;
    +} | {
    +    dynamic: string;
    +};
    +declare function serializeIslandProps(componentName: string, props: Record<string, unknown>): {
    +    json: string;
    +} | {
    +    diagnostic: IslandDiagnostic;
    +};
    +declare function renderIslandMarker(input: {
    +    name: string;
    +    strategy: IslandStrategy;
    +    propsJson: string;
    +}): string;
    +/**
    + * Local binding names introduced by island imports.
    + *
    + * Codegen sees only component tag names, so it needs the set of names that came
    + * from `.tsx` imports to tell an island apart from a `.wrn` component.
    + */
    +declare function islandNamesFrom(imports: Array<{
    +    kind?: "island";
    +    declaration: {
    +        defaultImport?: string;
    +    };
    +}>): Set<string>;
    +
    +interface IslandInput {
    +    name: string;
    +    sourcePath: string;
    +}
    +interface IslandBuildResult {
    +    assets: Array<{
    +        name: string;
    +        hash: string;
    +        path: string;
    +    }>;
    +    sharedChunks: string[];
    +}
    +/**
    + * Generates the per-island browser entry.
    + *
    + * Never imports react-dom/server — islands are client-only.
    + */
    +declare function generateIslandEntry(input: IslandInput): string;
    +declare function assertReactAvailable(appRoot: string): {
    +    code: "WRN-ISLAND-REACT-MISSING";
    +    message: string;
    +    severity: "error";
    +} | null;
    +/**
    + * Bundles island entries. `splitting: true` is required so React is emitted
    + * once as a shared chunk rather than duplicated into every island.
    + */
    +declare function buildIslands(input: {
    +    islands: IslandInput[];
    +    outDir: string;
    +    /**
    +     * App root used to resolve the island mount runtime. When given, the runtime
    +     * is emitted as `runtime.js` in the SAME build as the islands.
    +     *
    +     * This is not a convenience: building the runtime separately gives it its own
    +     * copy of React, and a component rendered by one copy while importing hooks
    +     * from another fails with "Cannot read properties of null (reading
    +     * 'useState')". One build with splitting keeps React in a single shared chunk.
    +     */
    +    appRoot?: string;
    +}): Promise<IslandBuildResult>;
    +
     /**
      * @wrnexus/compiler — the `.wrn` language compiler.
      *
    @@ -369,26 +485,26 @@ declare class DependencyGraph {
     
     interface CompileResult {
         code: string;
    -    ast: PageAst$1;
    +    ast: PageAst;
         /** Backward-compatible plain diagnostic messages. */
         diagnostics: string[];
         /** Structured diagnostics for editors, CI, and the DevToolbar. */
         richDiagnostics: WrnDiagnostic[];
     }
     /** Compile `.wrn` source into an Expo Router React Native screen. */
    -declare function compileNativeWireFile(source: string): string;
    +declare function compileNativeWrnFile(source: string): string;
     /**
      * Compile `.wrn` source into TypeScript source. Errors include a stable code,
      * source location, code frame, and actionable hint whenever available.
      */
    -declare function compileWireFile(source: string, filePath?: string): string;
    +declare function compileWrnFile(source: string, filePath?: string): string;
     /** Richer entry point returning the AST and structured diagnostics. */
     declare function compile(source: string, filePath?: string): CompileResult;
     
    -export { type CompilationCache, type CompilationCacheEntry, type CompilationCacheOptions, type CompileResult, DependencyGraph, type DeploymentRuntime, NativeCompileError, type OptimizationReport, type RouteExecutionKind, type RuntimeCapability, type RuntimeCapabilityDiagnostic, type RuntimeRequirements, analyzeOptimizations, analyzeRuntimeImports, analyzeRuntimeRequirements, compilationKey, compile, compileNativeWireFile, compileWireFile, createCompilationCache, createComponentContract, createWrnSourceMap, generate, generateBrowserModule, generateDeclarations, generateNative, generateServerFunctionsModule, generateStoreBrowserModule, generateStoreModule, generateTargets, optimizeAst, resolveWrnImport, resolveWrnImports, rpcManifest, runtimeCapabilities };
    -

    Examples

    Copy-ready examples from the installed package documentation.

    Compile a page

    import { compileWireFile } from "@wrnexus/compiler";
    +export { type CompilationCache, type CompilationCacheEntry, type CompilationCacheOptions, type CompileResult, DependencyGraph, type DeploymentRuntime, type IslandBuildResult, type IslandDiagnostic, type IslandInput, type IslandStrategy, NativeCompileError, type OptimizationReport, type RouteExecutionKind, type RuntimeCapability, type RuntimeCapabilityDiagnostic, type RuntimeRequirements, analyzeOptimizations, analyzeRuntimeImports, analyzeRuntimeRequirements, assertReactAvailable, buildIslands, compilationKey, compile, compileNativeWrnFile, compileWrnFile, createCompilationCache, createComponentContract, createWrnSourceMap, generate, generateBrowserModule, generateDeclarations, generateIslandEntry, generateNative, generateServerFunctionsModule, generateStoreBrowserModule, generateStoreModule, generateTargets, islandNamesFrom, islandPropValue, optimizeAst, parseIslandStrategy, renderIslandMarker, resolveWrnImport, resolveWrnImports, routeNeedsIslands, rpcManifest, runtimeCapabilities, serializeIslandProps, stripBrowserTypes };
    +

    Examples

    Copy-ready examples from the installed package documentation.

    Compile a page

    import { compileWrnFile } from "@wrnexus/compiler";
     
    -const ts = compileWireFile(`
    +const ts = compileWrnFile(`
     page Home {
       state count = 0
       seo { title = "Home" description = "Welcome" }
    @@ -414,9 +530,9 @@ const lx = new Lexer("page Home {");
     lx.next(); // { type: "ident", value: "page", pos: 0 }
     lx.next(); // { type: "ident", value: "Home", pos: 5 }
     lx.next(); // { type: "lbrace", value: "{", pos: 10 }
    - +
    - + } } diff --git a/app/pages/packages/content.wrn b/app/pages/packages/content.wrn index ea2e19a2..e1622d6c 100644 --- a/app/pages/packages/content.wrn +++ b/app/pages/packages/content.wrn @@ -10,7 +10,7 @@ page wrnexuscontent {
    W WRNexusJS - +
    -
    Data · Package reference

    @wrnexus/content

    Content collections, validation, querying, and publishing workflows.

    v0.8.8Private registryData

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/content@0.8.8

    Request preview access. Never put registry tokens in source control.

    Typed content collections for Markdown/MDX-like documents and remote CMS records. Collections validate frontmatter through any { parse(input) } schema, render escaped HTML, and expose draft preview, versions, references, headings, search indexes, pagination, RSS and sitemaps.

    +
    Data · Package reference

    @wrnexus/content

    Content collections, validation, querying, and publishing workflows.

    v0.8.9Private registryData

    Install the package

    After WorkRoot approves private registry access, install the package:

    bun add @wrnexus/content@0.8.9

    Request preview access. Never put registry tokens in source control.

    Typed content collections for Markdown/MDX-like documents and remote CMS records. Collections validate frontmatter through any { parse(input) } schema, render escaped HTML, and expose draft preview, versions, references, headings, search indexes, pagination, RSS and sitemaps.

    const posts = defineCollection({
       name: "posts",
       schema: PostSchema,
    @@ -176,7 +176,7 @@ const published = await posts.load();
     const preview = await posts.load({ previewToken: request.headers.get("x-preview-token") ?? "" });

    Install @wrnexus/content

    bun add @wrnexus/content
    - + } } diff --git a/app/pages/packages/core.wrn b/app/pages/packages/core.wrn index 2a0e51a2..4483b6da 100644 --- a/app/pages/packages/core.wrn +++ b/app/pages/packages/core.wrn @@ -10,7 +10,7 @@ page wrnexuscore {
    W WRNexusJS - +
    -
    Core · Package reference

    @wrnexus/core

    Contexts, middleware, security, sessions, caching, JSX, and realtime.

    v0.8.8Private registryCore

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/core@0.8.8

    Request preview access. Never put registry tokens in source control.

    The framework core: the request Context, middleware contract, and the security, session, caching, streaming, realtime, and JSX primitives every other WRNexusJS package builds on.
    +
    Core · Package reference

    @wrnexus/core

    Contexts, middleware, security, sessions, caching, JSX, and realtime.

    v0.8.16Private registryCore

    Install the package

    After WorkRoot approves private registry access, install the package:

    bun add @wrnexus/core@0.8.16

    Request preview access. Never put registry tokens in source control.

    The framework core: the request Context, middleware contract, and the security, session, caching, streaming, realtime, and JSX primitives every other WRNexusJS package builds on.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    @wrnexus/core is the shared foundation of WRNexusJS. It defines the Context object that flows through every middleware, page, and API route, plus the Middleware/Next contract they implement. On top of that it ships the building blocks a real app needs: cookie-backed sessions, password auth, CSRF protection, rate limiting, request logging, HTTP + in-memory caching, file uploads, streaming/SSE responses, WebSocket "rooms", security headers/CORS, and a server-side JSX runtime that renders to HTML strings. Everything here is server-side and Bun-native (it uses Bun.password, Bun.write, the web-standard Request/Response, and crypto). You depend on it directly and transitively through the rest of the framework.

    @@ -32,7 +32,7 @@ page wrnexuscore {

    The Context (ctx) is the single value passed to middleware and handlers.

    -
    ExportKindDescription
    ContexttypePer-request object: req, url, lang, t, params, locals, user?, ip?, cookies, session, localStorage.
    Nexttype`() => Promise<Response> \Response` — invokes the next middleware/handler.
    Middlewaretype`(ctx, next) => Promise<Response> \Response. Return next() to continue, or a Response` to short-circuit.
    createContext(req, url)fnBuild a fresh Context for an incoming request (wires up cookies, session, localStorage snapshot).
    withContextHeaders(ctx, res)fnApply accumulated headers (e.g. Set-Cookie) from the context onto a response.
    PageComponenttype`(ctx) => string \Promise<string>` — a page module's default export.
    PageMeta / SeoConfigtype<head> metadata: title, description, canonical, robots, image, twitterCard, themeColor, …
    TFunctiontype(key, params?) => string — translate a key for ctx.lang, interpolating {param} placeholders.
    +ContexttypePer-request object: req, url, lang, t, params, locals, user?, ip?, cookies, session, localStorage.Nexttype`() => Promise<Response> \Response` — invokes the next middleware/handler.Middlewaretype`(ctx, next) => Promise<Response> \Response. Return next() to continue, or a Response` to short-circuit.createContext(req, url)fnBuild a fresh Context for an incoming request (connects up cookies, session, localStorage snapshot).withContextHeaders(ctx, res)fnApply accumulated headers (e.g. Set-Cookie) from the context onto a response.PageComponenttype`(ctx) => string \Promise<string>` — a page module's default export.PageMeta / SeoConfigtype<head> metadata: title, description, canonical, robots, image, twitterCard, themeColor, …TFunctiontype(key, params?) => string — translate a key for ctx.lang, interpolating {param} placeholders.

    Key Context fields:

    • ctx.locals — per-request scratch space for passing values between middleware.
    • @@ -47,10 +47,10 @@ page wrnexuscore { hashPassword(password)(string) => Promise<string>argon2id hash to store.verifyPassword(password, hash)(string, string) => Promise<boolean>Constant-safe; returns false on bad/empty hash.logIn(ctx, user)(Context, U) => voidRegenerates the session id (fixation defense), stores the user, sets ctx.user.logOut(ctx)(Context) => voidClears the session and ctx.user.getUser(ctx)`(Context) => U \null`Current user from ctx.user, falling back to the session.sessionAuth()() => MiddlewareHydrates ctx.user from the session each request. Register early.requireAuth(options?)(RequireAuthOptions?) => MiddlewareGuard: API/fetch requests get 401 JSON, page navigations get 302 to loginPath (default /login) with ?next=.SESSION_USER_KEY"user"Session key holding the user.

      RequireAuthOptions: { loginPath?: string }.

      CSRF — @wrnexus/core

      -

      Double-submit cookie pattern: a readable wire-csrf cookie is echoed in an x-csrf-token header on unsafe requests.

      +

      Double-submit cookie pattern: a readable wrn-csrf cookie is echoed in an x-csrf-token header on unsafe requests.

      -
      ExportSignatureNotes
      csrfToken(ctx)(Context) => stringEnsures the CSRF cookie exists and returns its token.
      verifyCsrf(ctx)(Context) => booleanSafe methods (GET/HEAD/OPTIONS) pass; otherwise header/ctx.locals._csrf must match the cookie (constant-time).
      csrfProtection()() => Middleware403s unsafe requests with a missing/mismatched token.
      CSRF_COOKIE / CSRF_HEADER"wire-csrf" / "x-csrf-token"Cookie & header names.
      +csrfToken(ctx)(Context) => stringEnsures the CSRF cookie exists and returns its token.verifyCsrf(ctx)(Context) => booleanSafe methods (GET/HEAD/OPTIONS) pass; otherwise header/ctx.locals._csrf must match the cookie (constant-time).csrfProtection()() => Middleware403s unsafe requests with a missing/mismatched token.CSRF_COOKIE / CSRF_HEADER"wrn-csrf" / "x-csrf-token"Cookie & header names.

      Rate limiting — @wrnexus/core

      Fixed-window limiter that returns 429 with Retry-After and emits RateLimit-Limit/-Remaining/-Reset headers.

      @@ -111,7 +111,7 @@ const status = await resilientCall({
      ExportSignatureNotes
      withSecurityHeaders(req, res, mode, security?, nonce?)→ ResponseApplies CORS + CSP, HSTS, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy, COOP, Trusted Types, and extraHeaders.
      createCorsPreflightResponse(req, security?)→ `Response \null`Builds a 204/403 preflight response for CORS OPTIONS requests.
      isWebSocketOriginAllowed(req, security?)→ booleanGuards WS upgrades against cross-site hijacking (allows same-origin, configured CORS origins, and non-browser clients).
      -

      Config types: SecurityConfig (top-level), CorsConfig/CorsOrigin, ContentSecurityPolicyConfig/CspDirectiveValue, HstsConfig, TrustedTypesConfig, PermissionsPolicyConfig. WRNexusJS applies sensible defaults (self-only CSP, frame-ancestors 'none', restrictive Permissions-Policy, HSTS in production, Trusted Types in production); each is individually overridable or disable-able via false.

      +

      Config types: SecurityConfig (top-level), CorsConfig/CorsOrigin, ContentSecurityPolicyConfig/CspDirectiveValue, HstsConfig, TrustedTypesConfig, PermissionsPolicyConfig. WRNexusJS applies sensible defaults (self-only CSP, frame-ancestors 'self', restrictive Permissions-Policy, HSTS in production, Trusted Types in production); each is individually overridable or disable-able via false.

      Storage: cookies, sessions, localStorage — @wrnexus/core

      These back the ctx.cookies, ctx.session, and ctx.localStorage fields.

      @@ -385,6 +385,12 @@ interface CookieStore { set(name: string, value: string, options?: CookieOptions): void; delete(name: string, options?: CookieOptions): void; headers(): string[]; + transaction<T extends Record<string, unknown> = Record<string, unknown>>(name: string, options?: CookieOptions): TransactionCookie<T>; +} +interface TransactionCookie<T extends Record<string, unknown>> { + set(value: T): void; + consume(): T | undefined; + clear(): void; } interface SessionStore { id(): string; @@ -467,7 +473,15 @@ declare function loadSession(backend: AsyncSessionBackend, options?: { /** Translate a key for the active language, interpolating `{param}` placeholders. */ type TFunction = (key: string, params?: Record<string, string | number>) => string; -type Context = { +interface PaginationOptions { + defaultLimit?: number; + maxLimit?: number; +} +interface PaginationInput { + limit: number; + cursor?: string; +} +interface Context<Params extends Record<string, string> = Record<string, string>, User = unknown> { /** The raw incoming web-standard Request. */ req: Request; /** Parsed URL of the request (pathname, query, etc.). */ @@ -477,17 +491,19 @@ type Context = { /** Translate a key for the active language (identity until the runtime sets it). */ t: TFunction; /** Dynamic route params, e.g. `/users/[id]` -> `{ id: "42" }`. */ - params: Record<string, string>; + params: Params; /** * Per-request scratch space. Middleware can attach values here * (e.g. the authenticated user) and downstream handlers can read them. */ locals: Record<string, unknown>; + /** Resource resolved by a declarative route guard, when present. */ + resource?: unknown; /** * The authenticated user for this request, or null when anonymous. Populated * by the `sessionAuth` middleware (or `logIn`); read via `getUser(ctx)`. */ - user?: unknown; + user?: User | null; /** Active tenant/workspace resolved by tenant middleware. */ tenant?: Tenant; /** Request tracer installed by observability middleware. */ @@ -504,7 +520,9 @@ type Context = { session: SessionStore; /** Read-only localStorage snapshot sent by the browser for CSR data bindings. */ localStorage: LocalStorageSnapshot; -}; + /** Parse and bound the standard `limit` and `cursor` query parameters. */ + pagination(options?: PaginationOptions): PaginationInput; +} /** Calls the next middleware in the chain (or the final route handler). */ type Next = () => Promise<Response> | Response; /** @@ -538,10 +556,14 @@ type PageMeta = SeoConfig; /** A page module's default export. Returns an HTML string for the body. */ type PageComponent = (ctx: Context) => string | Promise<string>; /** Create a fresh context for an incoming request. */ -declare function createContext(req: Request, url: URL): Context; +declare function createContext<Params extends Record<string, string> = Record<string, string>>(req: Request, url: URL): Context<Params>; /** Apply headers accumulated on the context, such as Set-Cookie. */ declare function withContextHeaders(ctx: Context, res: Response): Response; +declare function runWithRequestContext<T>(ctx: Context, fn: () => T): T; +declare function getRequestContext(): Context | undefined; +declare function requireRequestContext(what: string): Context; + type ExecutionKind = "http" | "api" | "action" | "loader" | "middleware" | "realtime" | "queue" | "cron" | "webhook"; interface ResponseContext { status: number; @@ -583,6 +605,21 @@ interface ExecutionContextInput extends Partial<Omit<ExecutionContext, &qu declare function createExecutionContext(input: ExecutionContextInput): ExecutionContext; declare function executionContextFromHttp(context: Context, kind?: Extract<ExecutionKind, "http" | "api" | "action" | "loader" | "middleware" | "webhook">, input?: Omit<ExecutionContextInput, "kind" | "request" | "user" | "tenant" | "locale" | "trace">): ExecutionContext; +/** + * Assemble an API request from a block's declared input. + * + * Shared by both transports on purpose. The browser and the in-process server + * caller must send the same thing for the same call; two copies of these rules + * would drift, and the drift would be invisible because each side is tested + * separately. + */ +interface BuiltApiRequest { + url: string; + body?: string; + contentType?: string; +} +declare function buildApiRequest(path: string, method: string, input: Record<string, unknown> | undefined): BuiltApiRequest; + /** * Small, dependency-free security helpers shared across packages. */ @@ -606,7 +643,7 @@ declare function isSafeRequestPath(pathname: string): boolean; * metadata validation for unsafe requests. */ -declare const CSRF_COOKIE = "wire-csrf"; +declare const CSRF_COOKIE = "wrn-csrf"; declare const CSRF_HEADER = "x-csrf-token"; interface CsrfProtectionOptions { /** Validate Origin when present. Defaults to true. */ @@ -1048,7 +1085,7 @@ interface RealtimeEnvelope { message: unknown; } /** - * A pub/sub bridge for horizontal scaling. Wire the registry to a shared bus + * A pub/sub bridge for horizontal scaling. WRNexusJS the registry to a shared bus * (Redis pub/sub, NATS, …): local broadcasts/`toUser` sends are published to * peers, and messages received from peers are delivered via `registry.deliver`. * Connection-targeted sends (`send`, `to(id)`) stay local (ids are per-process). @@ -1198,7 +1235,7 @@ interface SecurityConfig { trustedTypes?: false | TrustedTypesConfig; /** Defaults to "same-origin". */ crossOriginOpenerPolicy?: false | "same-origin" | "same-origin-allow-popups" | "unsafe-none"; - /** Defaults to "DENY". */ + /** Defaults to "SAMEORIGIN". */ frameOptions?: false | "DENY" | "SAMEORIGIN"; /** Defaults to "strict-origin-when-cross-origin". */ referrerPolicy?: false | string; @@ -1256,6 +1293,10 @@ interface EndpointDefinition<I, O> { input?: SchemaLike<I> | OutputSchemaLike<I>; output?: SchemaLike<O> | OutputSchemaLike<O>; auth?: "optional" | "required"; + /** Permission checked through an installed @wrnexus/authz middleware. */ + permission?: string; + /** Resource supplied to bound authorization policies. */ + resource?: (ctx: Context, input: I) => unknown | Promise<unknown>; description?: string; tags?: string[]; handler(input: I, ctx: Context): O | Promise<O>; @@ -1492,7 +1533,11 @@ declare function withIdempotency<T>(store: IdempotencyStore<T>, key: replayed: boolean; }>; -export { type ActionDefinition, ApplicationLifecycle, type AsyncSessionBackend, type BackoffStrategy, type Bucket, type BudgetViolation, Bulkhead, type BulkheadOptions, CSRF_COOKIE, CSRF_HEADER, type CacheControlOptions, type CachePolicy, CircuitBreaker, type CircuitBreakerOptions, type CircuitBreakerSnapshot, type ContentSecurityPolicyConfig, type Context, type CookieOptions, type CookieStore, type CorsConfig, type CorsOrigin, type CspDirectiveValue, type CsrfProtectionOptions, type DefinedAction, type DefinedEndpoint, type DefinedLoader, type Duration, type EndpointDefinition, EndpointError, type EndpointErrorBody, type ExecutionContext, type ExecutionContextInput, type ExecutionKind, type FeatureFlags, type FeatureRule, type FeatureValue, type HealthCheck, type HealthCheckResult, HealthRegistry, type HstsConfig, type IdempotencyRecord, type IdempotencyStore, type InferEndpointSchema, type LifecycleHandler, type LifecyclePhase, type LoaderDefinition, type LocalStorageSnapshot, type Middleware, type Mode, type Next, type OutputSchemaLike, POSTGRES_TENANT_DIRECTORY_SCHEMA, type PageComponent, type PageMeta, type PerformanceBudgets, type PerformanceMeasurement, type PermissionsPolicyConfig, type ProblemDetails, type ProblemDetailsInput, type RateLimitOptions, type RateLimitStore, type RawSocket, type RealtimeBridge, type RealtimeBus, type RealtimeConnectMeta, type RealtimeEnvelope, type RealtimeHandler, type RealtimeRegistry, type RealtimeRegistryOptions, type RealtimeSecurityOptions, type RealtimeSocket, type RequestLimitsConfig, type RequestLoggerOptions, type RequestRecord, type RequireAuthOptions, ResilienceError, type ResilientCallOptions, type ResponseContext, type Room, type RoomAuthInfo, type RoomClient, type RoomDefinition, type RoomHandlers, type RpcClientOptions, SESSION_USER_KEY, type SaveUploadOptions, type SavedUpload, type SchemaLike, type SecureUploadOptions, type SecurityConfig, type SeoConfig, type ServerSentEvent, ServiceContainer, type ServiceToken, type SessionBackend, type SessionEntry, type SessionPolicy, type SessionStore, type Span, type SpanRecord, type StreamResponseInit, type TFunction, TTLCache, type Target, type Tenant, type TenantAuditEvent, type TenantDirectoryStore, type TenantMembership, type TenantMiddlewareOptions, type TenantQuota, type TenantResolver, type TenantResource, type TenantSqlClient, type Tracer, type TrustedTypesConfig, UploadError, type UploadInspectionResult, type UploadInspector, type UploadScanner, assertTenantAccess, bridgeRealtime, cacheControl, checkPerformanceBudgets, collectUploads, composeTenantResolvers, createContext, createCorsPreflightResponse, createExecutionContext, createPersistentTenantDirectory, createRealtimeRegistry, createRpcClient, createTenantDirectory, createTracer, csrfProtection, csrfToken, dedupe, defaultKey, defineAction, defineEndpoint, defineFeatureFlags, defineLoader, defineRoom, durationMs, escapeHtml, etag, executionContextFromHttp, getUser, hashPassword, isRoomDefinition, isSafeIslandName, isSafeRequestPath, isWebSocketOriginAllowed, loadSession, logIn, logOut, memoryIdempotencyStore, memoryTenantDirectoryStore, migrateTenants, notModified, peerKey, postgresTenantDirectoryStore, problem, proxyKey, randomUploadFilename, rateLimit, recommendedWebBudgets, renderDevError, renderError, renderNotFound, renderProdError, renderStatusPage, requestId, requestLogger, requireAuth, requireTenant, resilientCall, resolveRequestUrl, sanitizeFilename, saveUpload, saveUploadSecure, secureDownloadHeaders, serviceToken, sessionAuth, setSessionBackend, setSessionPolicy, sse, streamResponse, tenantFromDomain, tenantFromHeader, tenantFromPath, tenantFromSession, tenantFromSubdomain, tenantKey, tenantMiddleware, tenantScope, tracingMiddleware, verifyCsrf, verifyPassword, withCacheControl, withContextHeaders, withIdempotency, withSecurityHeaders, withSpan }; +/** Hoist nested templates out of each other for linear-size hydration data. */ +declare function encodeControlTemplate(value: unknown): string; +declare function renderControlTemplates(): string; + +export { type ActionDefinition, ApplicationLifecycle, type AsyncSessionBackend, type BackoffStrategy, type Bucket, type BudgetViolation, type BuiltApiRequest, Bulkhead, type BulkheadOptions, CSRF_COOKIE, CSRF_HEADER, type CacheControlOptions, type CachePolicy, CircuitBreaker, type CircuitBreakerOptions, type CircuitBreakerSnapshot, type ContentSecurityPolicyConfig, type Context, type CookieOptions, type CookieStore, type CorsConfig, type CorsOrigin, type CspDirectiveValue, type CsrfProtectionOptions, type DefinedAction, type DefinedEndpoint, type DefinedLoader, type Duration, type EndpointDefinition, EndpointError, type EndpointErrorBody, type ExecutionContext, type ExecutionContextInput, type ExecutionKind, type FeatureFlags, type FeatureRule, type FeatureValue, type HealthCheck, type HealthCheckResult, HealthRegistry, type HstsConfig, type IdempotencyRecord, type IdempotencyStore, type InferEndpointSchema, type LifecycleHandler, type LifecyclePhase, type LoaderDefinition, type LocalStorageSnapshot, type Middleware, type Mode, type Next, type OutputSchemaLike, POSTGRES_TENANT_DIRECTORY_SCHEMA, type PageComponent, type PageMeta, type PaginationInput, type PaginationOptions, type PerformanceBudgets, type PerformanceMeasurement, type PermissionsPolicyConfig, type ProblemDetails, type ProblemDetailsInput, type RateLimitOptions, type RateLimitStore, type RawSocket, type RealtimeBridge, type RealtimeBus, type RealtimeConnectMeta, type RealtimeEnvelope, type RealtimeHandler, type RealtimeRegistry, type RealtimeRegistryOptions, type RealtimeSecurityOptions, type RealtimeSocket, type RequestLimitsConfig, type RequestLoggerOptions, type RequestRecord, type RequireAuthOptions, ResilienceError, type ResilientCallOptions, type ResponseContext, type Room, type RoomAuthInfo, type RoomClient, type RoomDefinition, type RoomHandlers, type RpcClientOptions, SESSION_USER_KEY, type SaveUploadOptions, type SavedUpload, type SchemaLike, type SecureUploadOptions, type SecurityConfig, type SeoConfig, type ServerSentEvent, ServiceContainer, type ServiceToken, type SessionBackend, type SessionEntry, type SessionPolicy, type SessionStore, type Span, type SpanRecord, type StreamResponseInit, type TFunction, TTLCache, type Target, type Tenant, type TenantAuditEvent, type TenantDirectoryStore, type TenantMembership, type TenantMiddlewareOptions, type TenantQuota, type TenantResolver, type TenantResource, type TenantSqlClient, type Tracer, type TransactionCookie, type TrustedTypesConfig, UploadError, type UploadInspectionResult, type UploadInspector, type UploadScanner, assertTenantAccess, bridgeRealtime, buildApiRequest, cacheControl, checkPerformanceBudgets, collectUploads, composeTenantResolvers, createContext, createCorsPreflightResponse, createExecutionContext, createPersistentTenantDirectory, createRealtimeRegistry, createRpcClient, createTenantDirectory, createTracer, csrfProtection, csrfToken, dedupe, defaultKey, defineAction, defineEndpoint, defineFeatureFlags, defineLoader, defineRoom, durationMs, encodeControlTemplate, escapeHtml, etag, executionContextFromHttp, getRequestContext, getUser, hashPassword, isRoomDefinition, isSafeIslandName, isSafeRequestPath, isWebSocketOriginAllowed, loadSession, logIn, logOut, memoryIdempotencyStore, memoryTenantDirectoryStore, migrateTenants, notModified, peerKey, postgresTenantDirectoryStore, problem, proxyKey, randomUploadFilename, rateLimit, recommendedWebBudgets, renderControlTemplates, renderDevError, renderError, renderNotFound, renderProdError, renderStatusPage, requestId, requestLogger, requireAuth, requireRequestContext, requireTenant, resilientCall, resolveRequestUrl, runWithRequestContext, sanitizeFilename, saveUpload, saveUploadSecure, secureDownloadHeaders, serviceToken, sessionAuth, setSessionBackend, setSessionPolicy, sse, streamResponse, tenantFromDomain, tenantFromHeader, tenantFromPath, tenantFromSession, tenantFromSubdomain, tenantKey, tenantMiddleware, tenantScope, tracingMiddleware, verifyCsrf, verifyPassword, withCacheControl, withContextHeaders, withIdempotency, withSecurityHeaders, withSpan };

      Examples

      Copy-ready examples from the installed package documentation.

      A minimal middleware chain

      import {
         createContext,
         withContextHeaders,
      @@ -1556,7 +1601,7 @@ const registry = createRealtimeRegistry();
       bridgeRealtime(registry, createPubSub(redisDriver(process.env.REDIS_URL)));
      - + } } diff --git a/app/pages/packages/csr.wrn b/app/pages/packages/csr.wrn index 65700dae..87dbb31e 100644 --- a/app/pages/packages/csr.wrn +++ b/app/pages/packages/csr.wrn @@ -10,7 +10,7 @@ page wrnexuscsr {
      W WRNexusJS - +
      -
      Frontend · Package reference

      @wrnexus/csr

      Reactive, navigation, and realtime browser runtimes.

      v0.8.8Private registryFrontend

      Install the package

      After WorkRoot approves private registry access, install the release-aligned package:

      bun add @wrnexus/csr@0.8.8

      Request preview access. Never put registry tokens in source control.

      +
      Frontend · Package reference

      @wrnexus/csr

      Reactive, navigation, and realtime browser runtimes.

      v0.8.43Private registryFrontend

      Install the package

      After WorkRoot approves private registry access, install the package:

      bun add @wrnexus/csr@0.8.43

      Request preview access. Never put registry tokens in source control.

      Pages can opt into restoration across client navigation:

      page Users {
         navigation {
      @@ -74,9 +74,9 @@ getRealtimeRuntime(): string   // → REALTIME_RUNTIME

      Browser: realtime rooms

      Connects to /realtime/<name> over WebSocket (ws/wss chosen from location.protocol). Two usage modes.

      -

      Programmatic API via window.wire:

      -
      wire.room(name): Room          // open (or reuse) a room connection
      -wire.bindRooms(root?)          // (re)bind declarative [data-room] containers
      +

      Programmatic API via window.wrn:

      +
      wrn.room(name): Room          // open (or reuse) a room connection
      +wrn.bindRooms(root?)          // (re)bind declarative [data-room] containers
       
       interface Room {
         name: string;
      @@ -140,7 +140,7 @@ Bun.serve({
       </div>
       <script src="/__wrnexus/realtime.js"></script>

      Or drive a room from code:

      -
      const room = wire.room("lobby");
      +
      const room = wrn.room("lobby");
       room.on("chat", (msg) => console.log(msg.user, msg.text));
       room.send({ type: "chat", user: "ada", text: "hi" });

      Requirements / Notes

      @@ -200,7 +200,7 @@ declare const NAV_RUNTIME: string; * `data-room-reset` clear after send). Optional `data-room-user` identifies * the connection. * - * 2. Programmatic: `const room = wire.room("chat"); room.on("chat", fn); + * 2. Programmatic: `const room = wrn.room("chat"); room.on("chat", fn); * room.send({ type: "chat", text })`. Handles connect, JSON, reconnect. * * Rebinds on `wrnexus:navigated` (client-side nav) and closes rooms whose @@ -210,6 +210,19 @@ declare const REALTIME_RUNTIME: string; declare const ACTION_RUNTIME: string; +interface ApiRequest<Input = unknown> { + method?: string; + params?: Record<string, string | number>; + query?: Record<string, string | number | boolean | undefined>; + body?: Input; +} +interface ApiClientOptions { + baseUrl?: string; + fetch?: (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>; +} +/** Runtime used by generated API clients; throws a typed response error on non-2xx results. */ +declare function createApiClient(options?: ApiClientOptions): <Output, Input = unknown>(template: string, request?: ApiRequest<Input>) => Promise<Output>; + type OutputHandler<T = unknown> = (payload: T) => void | Promise<void>; interface OutputHost extends HTMLElement { __wrnexusOutputHandlers?: Map<string, Set<OutputHandler>>; @@ -282,6 +295,14 @@ interface WrnexusBrowserGlobals { * no per-component browser bundles: SSR stays cleanly separated from CSR. */ +/** Public client transport used by `.wrn` client functions for dynamic URLs. */ +declare function useFetch<T = unknown>(path: string, methodOrOptions?: string | { + method?: string; + query?: unknown; + params?: unknown; + body?: unknown; + data?: unknown; +}, input?: unknown): Promise<T>; /** The reactive runtime served at `/__wrnexus/reactive.js` (plain browser JS). */ declare function getReactiveRuntime(development?: boolean): string; /** Component-specific controllers, loaded only when their marker is present. */ @@ -292,7 +313,7 @@ declare function getNavRuntime(): string; declare function getRealtimeRuntime(): string; declare function getActionRuntime(): string; -export { ACTION_RUNTIME, ActionClientError, type ActionClientOptions, type ActionResult, type ClientModuleScope, type HydrationScopeApi, NAV_RUNTIME, type OutputHandler, type OutputHost, REACTIVE_RUNTIME, REALTIME_RUNTIME, type ServerCallOptions, WrnServerCallError, type WrnexusBrowserGlobals, callServerFunction, collectRefs, createActionClient, createOutputProxy, createServerProxy, getActionRuntime, getComponentControllerRuntime, getNavRuntime, getReactiveRuntime, getRealtimeRuntime, invalidateClientModule, invokeOutput, loadClientFunctions, registerOutputHandler }; +export { ACTION_RUNTIME, ActionClientError, type ActionClientOptions, type ActionResult, type ApiClientOptions, type ApiRequest, type ClientModuleScope, type HydrationScopeApi, NAV_RUNTIME, type OutputHandler, type OutputHost, REACTIVE_RUNTIME, REALTIME_RUNTIME, type ServerCallOptions, WrnServerCallError, type WrnexusBrowserGlobals, callServerFunction, collectRefs, createActionClient, createApiClient, createOutputProxy, createServerProxy, getActionRuntime, getComponentControllerRuntime, getNavRuntime, getReactiveRuntime, getRealtimeRuntime, invalidateClientModule, invokeOutput, loadClientFunctions, registerOutputHandler, useFetch };

      Examples

      Copy-ready examples from the installed package documentation.

      Server side — serve the runtime strings from your router (example with Bun.serve)

      import { getReactiveRuntime, getNavRuntime, getRealtimeRuntime } from "@wrnexus/csr";
       
       const routes: Record<string, string> = {
      @@ -333,12 +354,12 @@ Bun.serve({
           <button>Send</button>
         </form>
       </div>
      -<script src="/__wrnexus/realtime.js"></script>

      Or drive a room from code

      const room = wire.room("lobby");
      +<script src="/__wrnexus/realtime.js"></script>

      Or drive a room from code

      const room = wrn.room("lobby");
       room.on("chat", (msg) => console.log(msg.user, msg.text));
       room.send({ type: "chat", user: "ada", text: "hi" });
      - + } } diff --git a/app/pages/packages/db.wrn b/app/pages/packages/db.wrn index d53f85c8..81962bfb 100644 --- a/app/pages/packages/db.wrn +++ b/app/pages/packages/db.wrn @@ -10,7 +10,7 @@ page wrnexusdb {
      W WRNexusJS - +
      -
      Data · Package reference

      @wrnexus/db

      Database adapters, typed queries, models, migrations, and sessions.

      v0.8.8Private registryData

      Install the package

      After WorkRoot approves private registry access, install the release-aligned package:

      bun add @wrnexus/db@0.8.8

      Request preview access. Never put registry tokens in source control.

      Rollout-safe migrations

      +
      Data · Package reference

      @wrnexus/db

      Database adapters, typed queries, models, migrations, and sessions.

      v0.8.23Private registryData

      Install the package

      After WorkRoot approves private registry access, install the package:

      bun add @wrnexus/db@0.8.23

      Request preview access. Never put registry tokens in source control.

      Rollout-safe migrations

      Run wrnexus db check in CI before deployment. The analyzer reports stable diagnostics for drops, renames, type changes, new/enforced required columns, and potentially blocking index creation, with an expand/backfill/switch/contract recommendation. wrnexus db migrate blocks critical issues in pending migrations. --allow-breaking is an explicit operator override; already-applied migrations do not block later releases.

      The database layer for WRNexusJS: TS models as the single source of truth for DDL, validation, and result typing, plus a driver-based Db client, migrations, and a sqlc-style query generator.

      Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

      @@ -81,7 +81,7 @@ const events = await getDb("analytics").all("SELECT * FROM hits&q
    • @wrnexus/db/mongo — mongo(url, dbName?). A document API, not SQL: db.collection(model) returns a MongoRepo<T> with find, findOne, insert, insertMany, update, delete, count. Reads are coerced through model.parse (_id is mapped to id). The mongodb driver is imported lazily — install it to use Mongo.
    • Migrations

      -

      Migrations are .sql files (in e.g. app/db/migrations), each split into -- +up and -- +down sections. A file with no markers is treated entirely as up. Applied names are recorded in a _wire_migrations table so each runs once.

      +

      Migrations are .sql files (in e.g. app/db/migrations), each split into -- +up and -- +down sections. A file with no markers is treated entirely as up. Applied names are recorded in a _wrn_migrations table so each runs once.

      • parseMigration(name, content) → Migration ({ name, up, down }).
      • loadMigrations(dir) — parse all .sql files, sorted by filename.
      • @@ -162,7 +162,7 @@ const active = await repo.find({ active: true });
      • Bun-only. Uses bun:sqlite (SQLite adapter + session store) and Bun.SQL
      • (Postgres/MySQL). Migrations/scaffolding use node:fs/node:path.

      • Works with @wrnexus/core — sqliteSessionStore implements its
      • -

        SessionBackend; getDb/setDb are wired by the WRNexusJS runtime from wrnexus.config.ts.

        +

        SessionBackend; getDb/setDb are connected by the WRNexusJS runtime from wrnexus.config.ts.

      • The mongodb npm package is an optional, lazily-imported peer — install it
      • only if you use @wrnexus/db/mongo. The core package stays dependency-free.

      @@ -194,7 +194,14 @@ const users = await usersRepo.all({ offset: 0, });

      Repository SQL identifiers are validated and values remain parameterized. Placeholder generation is dialect-aware: PostgreSQL uses $1, $2, and SQLite/MySQL use ?. List limits are bounded.

      -

      retryTransaction() retries recognized serialization, deadlock, and database-lock errors by default. Supply shouldRetry for application-specific retryable errors; ordinary validation or business errors are not retried automatically.

      Complete TypeScript API

      Generated from the exact installed package declarations.

      import { M as Model } from './schema-tVurYsbL.js';
      +

      retryTransaction() retries recognized serialization, deadlock, and database-lock errors by default. Supply shouldRetry for application-specific retryable errors; ordinary validation or business errors are not retried automatically.

      +

      Reusable seed helpers

      +
      import { addSeedData, removeSeedData, runSeedQuery, getDb } from "@wrnexus/db";
      +
      +await addSeedData(getDb, [{ code: "free", credits: 100 }], "plans", { conflict: "ignore" });
      +await removeSeedData(getDb(), { code: "legacy" }, "plans");
      +await runSeedQuery(getDb(), "UPDATE plans SET credits = ? WHERE code = ?", [200, "free"]);
      +

      Table and column identifiers are validated, values are always parameterized, and empty bulk deletes are refused unless { all: true } is explicit.

      Complete TypeScript API

      Generated from the exact installed package declarations.

      import { M as Model } from './schema-tVurYsbL.js';
       export { B as BaseType, C as Column, a as ColumnDef, b as Columns, t as table, v } from './schema-tVurYsbL.js';
       import { a as Db, b as Dialect, R as Row, E as ExecResult } from './driver-DA53QHkO.js';
       export { D as Driver, T as TxHandle, c as createDb, d as createTableSql } from './driver-DA53QHkO.js';
      @@ -234,7 +241,7 @@ declare function closeDatabases(): Promise<void>;
       /**
        * Migration runner. Migrations are `.sql` files in `app/db/migrations`, each
        * split into `-- +up` and `-- +down` sections. Applied migrations are recorded
      - * in a `_wire_migrations` table so they run exactly once, newest-last.
      + * in a `_wrn_migrations` table so they run exactly once, newest-last.
        *
        * `scaffoldMigration(..., models)` writes an initial migration straight from the
        * TS models — the source of truth — so you don't hand-write the first schema.
      @@ -265,7 +272,18 @@ declare function appliedMigrations(db: Db): Promise<string[]>;
       declare function applyMigrations(db: Db, migrations: readonly Migration[], options?: MigrationRunOptions): Promise<string[]>;
       /** Apply all pending migrations from a directory. */
       declare function migrate(db: Db, dir: string, options?: MigrationRunOptions): Promise<string[]>;
      -/** Roll back the most recently applied migration. Returns its name, or null. */
      +/**
      + * Roll back the most recently applied migration. Returns its name, or null when
      + * nothing has been applied.
      + *
      + * Refuses a migration that changed the schema but defines no `-- +down` section.
      + * Removing its tracking row would leave the change in place and unrecorded, and
      + * the next `migrate` would replay statements such as `ALTER TABLE ... ADD COLUMN`
      + * that cannot run twice, stranding the database between the two states.
      + *
      + * A migration whose `up` is empty — a placeholder, or comments only — has
      + * nothing to undo, so it rolls back by dropping its tracking row alone.
      + */
       declare function rollback(db: Db, dir: string, options?: Omit<MigrationRunOptions, "dryRun"> & {
           dryRun?: boolean;
       }): Promise<string | null>;
      @@ -316,7 +334,15 @@ interface ModelRef {
           varName: string;
           model: Model;
       }
      -/** Parse annotated queries from one `.sql` file's contents. */
      +/**
      + * Parse annotated queries from one `.sql` file's contents.
      + *
      + * Line endings are normalised to LF first. The generator embeds each query's
      + * SQL as a string literal, so without this a CRLF checkout regenerated every
      + * query with CRLF where the committed file had LF -- a build dirtied the
      + * working tree, and that churn buried real changes in the same file. Line
      + * endings carry no meaning in SQL.
      + */
       declare function parseQueries(content: string): QueryDef[];
       /** Generate the full `queries.gen.ts` source. */
       declare function generateQueriesFile(queries: QueryDef[], models: ModelRef[], dialect: Dialect): string;
      @@ -448,6 +474,16 @@ declare function firstOrThrow<T>(db: Db, sql: string, params?: unknown[],
       declare function exists(db: Db, sql: string, params?: unknown[]): Promise<boolean>;
       declare function countRows(db: Db, table: string, where?: string, params?: unknown[]): Promise<number>;
       declare function withTransaction<T>(db: Db, callback: (tx: Db) => Promise<T>): Promise<T>;
      +/** Execute a parameterized compare-and-set update and report whether this caller won. */
      +declare function compareAndSet(db: Db, options: {
      +    table: string;
      +    idColumn?: string;
      +    id: string | number;
      +    stateColumn?: string;
      +    from: string;
      +    to: string;
      +    extra?: Record<string, unknown>;
      +}): Promise<boolean>;
       declare function retryTransaction<T>(db: Db, callback: (tx: Db, attempt: number) => Promise<T>, options?: {
           attempts?: number;
           baseDelayMs?: number;
      @@ -490,7 +526,59 @@ declare function createRepository<T extends Row>(db: Db, input: {
           };
       }): Repository<T>;
       
      -export { type CursorPage, type CursorPageOptions, Db, Dialect, ExecResult, type Migration, type MigrationRunOptions, type MigrationSafetyIssue, Model, type ModelRef, type PageOptions, type Paginated, type QueryDef, type QueryIssue, type QueryKind, type QueryPolicy, type QueryRecord, RecordNotFoundError, type RelationOptions, type Repository, Row, analyzeMigrationSafety, analyzeMigrations, appliedMigrations, applyMigrations, batch, closeDatabases, countRows, createRepository, cursorPaginate, databaseHealth, databaseNames, exists, firstOrThrow, generateQueriesFile, getDb, getDbPerformanceSnapshot, hasDb, instrumentDb, loadMigrations, loadRelated, migrate, optimisticUpdate, paginate, parseMigration, parseQueries, queryOperation, registerDb, registerLazyDb, resetDbPerformanceSnapshot, retryTransaction, rollback, scaffoldMigration, setDb, softDeleteClause, status, tenantScope, withTransaction };
      +type SeedRow = Record<string, unknown>;
      +type SeedDatabase = Db | (() => Db);
      +interface AddSeedOptions {
      +    conflict?: "error" | "ignore" | "replace";
      +}
      +interface UpsertSeedOptions {
      +    key: string | readonly string[];
      +    update?: readonly string[];
      +}
      +/** Insert one or many object rows with parameterized values. */
      +declare function addSeedData(source: SeedDatabase, data: SeedRow | readonly SeedRow[], table: string, options?: AddSeedOptions): Promise<ExecResult[]>;
      +/** Delete matching seed rows. An empty match is refused unless `all` is explicit. */
      +declare function removeSeedData(source: SeedDatabase, match: SeedRow, table: string, options?: {
      +    all?: boolean;
      +}): Promise<ExecResult>;
      +/** Execute an application-owned parameterized seed statement. */
      +declare function runSeedQuery(source: SeedDatabase, query: string, data?: readonly unknown[]): Promise<ExecResult>;
      +/** Portable object upsert for SQLite, PostgreSQL and MySQL. */
      +declare function upsertSeedData(source: SeedDatabase, data: SeedRow | readonly SeedRow[], table: string, options: UpsertSeedOptions): Promise<ExecResult[]>;
      +declare function seedIfMissing(source: SeedDatabase, table: string, match: SeedRow, data: SeedRow): Promise<boolean>;
      +type SeedStep = (db: Db) => void | Promise<void>;
      +declare function defineSeed(...steps: readonly SeedStep[]): SeedStep;
      +interface SeedUserAccount {
      +    identifier: string;
      +    password?: string;
      +    [key: string]: unknown;
      +}
      +declare function seedUsers<T extends SeedUserAccount, U extends {
      +    id: string;
      +}>(accounts: readonly T[], options: {
      +    find(identifier: string): Promise<U | null>;
      +    create(account: T): Promise<U>;
      +    configure?(user: U, account: T): void | Promise<void>;
      +}): Promise<U[]>;
      +
      +interface LedgerOptions {
      +    db: () => Db;
      +    table: string;
      +    subjectColumn?: string;
      +    amountColumn?: string;
      +    kindColumn?: string;
      +    reasonColumn?: string;
      +    referenceColumn?: string;
      +}
      +declare function defineLedger(options: LedgerOptions): {
      +    balance: (subjectId: string, db?: Db) => Promise<number>;
      +    credit(subjectId: string, value: number, entryReason: string, ref?: string): Promise<void>;
      +    debit(subjectId: string, value: number, entryReason: string, ref?: string): Promise<boolean>;
      +    refund: (subjectId: string, value: number, entryReason: string, ref?: string) => Promise<void>;
      +    entries: (subjectId: string) => Promise<Row[]>;
      +};
      +
      +export { type AddSeedOptions, type CursorPage, type CursorPageOptions, Db, Dialect, ExecResult, type LedgerOptions, type Migration, type MigrationRunOptions, type MigrationSafetyIssue, Model, type ModelRef, type PageOptions, type Paginated, type QueryDef, type QueryIssue, type QueryKind, type QueryPolicy, type QueryRecord, RecordNotFoundError, type RelationOptions, type Repository, Row, type SeedDatabase, type SeedRow, type SeedStep, type SeedUserAccount, type UpsertSeedOptions, addSeedData, analyzeMigrationSafety, analyzeMigrations, appliedMigrations, applyMigrations, batch, closeDatabases, compareAndSet, countRows, createRepository, cursorPaginate, databaseHealth, databaseNames, defineLedger, defineSeed, exists, firstOrThrow, generateQueriesFile, getDb, getDbPerformanceSnapshot, hasDb, instrumentDb, loadMigrations, loadRelated, migrate, optimisticUpdate, paginate, parseMigration, parseQueries, queryOperation, registerDb, registerLazyDb, removeSeedData, resetDbPerformanceSnapshot, retryTransaction, rollback, runSeedQuery, scaffoldMigration, seedIfMissing, seedUsers, setDb, softDeleteClause, status, tenantScope, upsertSeedData, withTransaction };
       

      Examples

      Copy-ready examples from the installed package documentation.

      Define models, connect, create tables, and query with typed results

      import { v, table, createDb } from "@wrnexus/db";
       import { sqlite } from "@wrnexus/db/sqlite";
       
      @@ -531,9 +619,9 @@ const mdb = await mongo(process.env.MONGO_URL!, "app");
       const repo = mdb.collection(users);
       await repo.insert({ email: "a@b.com" });
       const active = await repo.find({ active: true });
      - +
      - + } } diff --git a/app/pages/packages/dev-server.wrn b/app/pages/packages/dev-server.wrn index 0b19cfa3..5a4489fe 100644 --- a/app/pages/packages/dev-server.wrn +++ b/app/pages/packages/dev-server.wrn @@ -10,7 +10,7 @@ page wrnexusdevserver {
      W WRNexusJS - +
      -
      Runtime · Package reference

      @wrnexus/dev-server

      Development and production servers, HMR, assets, and gateways.

      v0.8.8Private registryRuntime

      Install the package

      After WorkRoot approves private registry access, install the release-aligned package:

      bun add @wrnexus/dev-server@0.8.8

      Request preview access. Never put registry tokens in source control.

      The WRNexusJS HTTP + WebSocket server runtime — request dispatch, SSR document assembly, live-reload (HMR), and the portable production handler.
      +
      Runtime · Package reference

      @wrnexus/dev-server

      Development and production servers, HMR, assets, and gateways.

      v0.8.66Private registryRuntime

      Install the package

      After WorkRoot approves private registry access, install the package:

      bun add @wrnexus/dev-server@0.8.66

      Request preview access. Never put registry tokens in source control.

      The WRNexusJS HTTP + WebSocket server runtime — request dispatch, SSR document assembly, live-reload (HMR), and the portable production handler.

      Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

      Overview

      -

      This package is the server runtime that powers a WRNexusJS app in both development and production. A single request runtime (createHandlers) owns HTTP/WebSocket dispatch and SSR document assembly; it knows nothing about _how_ modules and assets are produced, so the dev and prod entry points wire in different backends: dev uses dynamic module loading plus on-the-fly bundling and injects a live-reload client; prod uses a static, pre-built manifest with cache-immutable assets. The package also ships a multi-app gateway (route several apps by Host header behind one port) and a portable node:http adapter for WinterCG hosts. It is entirely server-side and Bun-native (Bun.serve, Bun.file, Bun.gzipSync).

      +

      This package is the server runtime that powers a WRNexusJS app in both development and production. A single request runtime (createHandlers) owns HTTP/WebSocket dispatch and SSR document assembly; it knows nothing about _how_ modules and assets are produced, so the dev and prod entry points wrn in different backends: dev uses dynamic module loading plus on-the-fly bundling and injects a live-reload client; prod uses a static, pre-built manifest with cache-immutable assets. The package also ships a multi-app gateway (route several apps by Host header behind one port) and a portable node:http adapter for WinterCG hosts. It is entirely server-side and Bun-native (Bun.serve, Bun.file, Bun.gzipSync).

      bun add @wrnexus/dev-server
      Private package — the machine must be authenticated to the wrnexus npm org
      (a read token in ~/.npmrc). Requires Bun (Node is not supported for the full server; the node:http adapter is for WinterCG embedding only).
      @@ -31,7 +31,7 @@ page wrnexusdevserver {

      Main entry (@wrnexus/dev-server)

      -
      ExportKindPurpose
      startServer(opts: ServeOptions)Promise<RunningServer>Start the dev server on Bun.serve: builds the router, connects/migrates databases, wires assets + HMR, and starts the file watcher.
      createHandlers(deps: RuntimeDeps)HandlersThe shared request runtime (fetch + websocket handlers). Re-exported from runtime.ts.
      createProductionServer(manifest, opts)Bun.ServerStart the production server from a precompiled manifest.
      createProductionHandlers(manifest, opts)HandlersBuild the portable prod fetch/websocket handlers with no server bound (the deployment-adapter seam).
      startGateway(opts: GatewayOptions)Promise<RunningGateway>Boot multiple apps as child processes and route by Host.
      toRequest, writeResponse, nodeListener, serveNodefunctionsnode:http ↔ WinterCG Request/Response adapter.
      RESTART_EXIT_CODEnumber (97)Exit code the dev child uses to ask the supervisor for a fresh process.
      STYLES_HREF, HMR_CLIENT_JSconstantsThe global stylesheet URL and the inline HMR client script.
      +startServer(opts: ServeOptions)Promise<RunningServer>Start the dev server on Bun.serve: builds the router, connects/migrates databases, connects assets + HMR, and starts the file watcher.createHandlers(deps: RuntimeDeps)HandlersThe shared request runtime (fetch + websocket handlers). Re-exported from runtime.ts.createProductionServer(manifest, opts)Bun.ServerStart the production server from a precompiled manifest.createProductionHandlers(manifest, opts)HandlersBuild the portable prod fetch/websocket handlers with no server bound (the deployment-adapter seam).startGateway(opts: GatewayOptions)Promise<RunningGateway>Boot multiple apps as child processes and route by Host.toRequest, writeResponse, nodeListener, serveNodefunctionsnode:http ↔ WinterCG Request/Response adapter.RESTART_EXIT_CODEnumber (97)Exit code the dev child uses to ask the supervisor for a fresh process.STYLES_HREF, HMR_CLIENT_JSconstantsThe global stylesheet URL and the inline HMR client script.

      Exported types: ServeOptions, RunningServer, RuntimeDeps, AssetServer, WsData, GatewayApp, GatewayOptions, GatewayAuth, GatewaySecurity, RunningGateway, FetchHandler.

      startServer(opts)

      interface ServeOptions {
      @@ -60,6 +60,8 @@ interface RunningServer {
         stop(): void;
       }

      In development, startServer also connects app/db/migrations (and app/db/<name>/migrations) and auto-applies migrations, then starts an in-process file watcher. CSS edits hot-swap live. Page, component, layout, API, middleware, realtime, schema, locale, and public-asset edits invalidate only their cached modules, rescan routes where necessary, and morph fresh HTML through the existing HMR WebSocket. The server process and active gateway stay running.

      +

      Custom not-found handlers

      +

      Add app/pages/404.wrn to customize unmatched frontend routes. The rendered page keeps the requested response's HTTP 404 status. Add app/api/404.ts with normal HTTP method exports to customize unmatched backend/API responses; its response body and headers are preserved and its status is normalized to 404.

      getWrnCompileMetrics() exposes cumulative content-addressed compiler cache hits, misses, successful compilations, errors, totalDurationMs, and lastDurationMs for the DevToolbar or custom diagnostics. Tests and embedded servers can call resetWrnCompileMetrics() to establish a fresh measurement window.

      createHandlers(deps)

      The core runtime shared by dev and prod. It handles CORS preflight, /healthz and /__wrnexus/health, request-body size limits (413), HMR socket upgrades (/__wrnexus/hmr), realtime WebSocket upgrades (defineRoom default export or a raw websocket export), the middleware pipeline, API routes (/api/*), framework assets (/__wrnexus/*), public assets, and full SSR page rendering (component mounts, layouts, slots, i18n markers, per-page script selection, ETag/304, gzip).

      @@ -71,7 +73,7 @@ interface RunningServer { getMiddleware(): Promise<Middleware[]>; assets: AssetServer; // serves /__wrnexus/* (islands, reactive, hmr) hasStyles?: boolean; // inject the global stylesheet link - hasUi?: boolean; // inject the Wire UI stylesheet (/__wrnexus/ui.css) + hasUi?: boolean; // inject the WRNexusJS UI stylesheet (/__wrnexus/ui.css) theme?: ResolvedTheme; // enables /__wrnexus/theme.css + <html data-theme> i18n?: ResolvedI18n; // enables ctx.t, <html lang>, {t:key} markers inlineStyles?: string; // inline small prod stylesheets into <head> @@ -236,8 +238,9 @@ await startGateway({

    </invoke>

    Complete TypeScript API

    Generated from the exact installed package declarations.

    import { Mode, Middleware, SeoConfig, SecurityConfig, HealthRegistry, RealtimeBus, RealtimeConnectMeta } from '@wrnexus/core';
     import { Router } from '@wrnexus/router';
    -import { ResolvedTheme, MobileConfig, PwaConfig, ObservabilityConfig, TenancyConfig, NavigationConfig, StylesConfig, ThemeConfig } from '@wrnexus/styles';
    +import { ResolvedTheme, MobileConfig, PwaConfig, ObservabilityConfig, TenancyConfig, NavigationConfig, StylesConfig, ThemeConfig, BrowserCookiesConfig } from '@wrnexus/styles';
     import { ResolvedI18n, I18nConfig } from '@wrnexus/i18n';
    +import { QueueStorageConfig } from '@wrnexus/queue';
     import { StorageConfig } from '@wrnexus/uploader';
     import { DevToolbarConfig, DevToolbarPlatformSnapshot, DevToolbarPanel } from '@wrnexus/dev-toolbar/types';
     import { ClientRuntimeDefinition, PluginInput } from '@wrnexus/plugin';
    @@ -287,6 +290,31 @@ interface WrnCompileMetrics {
     declare function getWrnCompileMetrics(): Readonly<WrnCompileMetrics>;
     declare function resetWrnCompileMetrics(): void;
     
    +/**
    + * Shared server-function RPC helpers used by both the dev server (index.ts)
    + * and the production server (prod.ts). Kept in their own module so prod.ts
    + * can import them without creating a circular dependency on index.ts (which
    + * itself re-exports `createProductionServer`/`createProductionHandlers` from
    + * prod.ts).
    + */
    +/**
    + * CSRF check for `/__wrnexus/rpc` (the server-function RPC endpoint the
    + * browser runtime calls for `server.fn()`). Requires a same-origin request
    + * carrying a matching CSRF cookie + header pair — the standard double-submit
    + * cookie pattern.
    + */
    +declare function validateRpcCsrf(request: Request): boolean;
    +/**
    + * Wrap the server-function RPC handler so it runs inside the request's
    + * AsyncLocalStorage context. `/__wrnexus/rpc` is intercepted BEFORE
    + * `handlers.fetch` (fetchHandler) in both dev and production, so a server
    + * function called via `server.fn()` from the browser runs entirely outside
    + * fetchHandler's own context wrap. It runs user code directly, so — like
    + * every other entry point that runs user server code — it needs the request
    + * context too.
    + */
    +declare function withServerFnRequestContext(handler: (request: Request) => Promise<Response>): (request: Request) => Promise<Response>;
    +
     /**
      * HMR hub — tracks connected browser HMR sockets and broadcasts update events.
      *
    @@ -328,8 +356,8 @@ declare class HmrHub {
      *
      * It owns the HTTP/WebSocket dispatch and the SSR document assembly, but knows
      * nothing about *how* modules or assets are produced — those come in via
    - * `RuntimeDeps`. Dev wires in dynamic module loading + on-the-fly bundling;
    - * prod wires in a static manifest + pre-built chunks on disk.
    + * `RuntimeDeps`. Dev connects in dynamic module loading + on-the-fly bundling;
    + * prod connects in a static manifest + pre-built chunks on disk.
      */
     
     /** A realtime module's `websocket` export: a bag of optional lifecycle hooks. */
    @@ -367,7 +395,7 @@ interface RuntimeDeps {
         assets: AssetServer;
         /** When true, inject the global stylesheet link into every page head. */
         hasStyles?: boolean;
    -    /** When true, inject the Wire UI stylesheet link (`/__wrnexus/ui.css`). */
    +    /** When true, inject the WRNexusJS UI stylesheet link (`/__wrnexus/ui.css`). */
         hasUi?: boolean;
         /** Production build combined theme + UI stylesheet. */
         hasFrameworkStyles?: boolean;
    @@ -427,6 +455,7 @@ interface RuntimeDeps {
     interface UpgradeServer {
         upgrade(req: Request, opts: {
             data: WsData;
    +        headers?: Headers;
         }): boolean;
         /** Bun's per-request socket peer address (used for the non-spoofable client IP). */
         requestIP?(req: Request): {
    @@ -441,6 +470,7 @@ interface Ws {
     }
     interface Handlers {
         fetch(req: Request, server: UpgradeServer): Promise<Response | undefined>;
    +    shutdown(): Promise<void>;
         websocket: {
             open(ws: Ws): void;
             message(ws: Ws, message: string | Uint8Array): void;
    @@ -461,6 +491,7 @@ declare function createHandlers(deps: RuntimeDeps): Handlers;
      * reverse proxy for both HTTP and WebSocket. Apps talk to each other at runtime
      * via @wrnexus/pubsub (use the Redis driver so messages cross processes).
      */
    +
     type GatewayForwardAuth = ({
         url: string;
         app?: never;
    @@ -588,6 +619,11 @@ interface ProdManifest {
             name: string;
             mod: RouteModule;
         }[];
    +    /** Background queue modules (from app/queues/*.ts). */
    +    queues?: {
    +        name: string;
    +        mod: RouteModule;
    +    }[];
     }
     interface ProductionPluginAsset {
         path: string;
    @@ -601,7 +637,7 @@ interface ProdOptions {
         inlineStyles?: string;
         /** `stylesPath` contains theme + UI + app CSS in cascade order. */
         stylesIncludeFramework?: boolean;
    -    /** `stylesPath` already contains the shared Wire UI stylesheet. */
    +    /** `stylesPath` already contains the shared WRNexusJS UI stylesheet. */
         stylesIncludeUi?: boolean;
         /** Absolute path to the pre-built reactive runtime. */
         reactivePath?: string;
    @@ -609,6 +645,7 @@ interface ProdOptions {
         controllersPath?: string;
         /** Absolute directory containing bundled per-WRN browser modules. */
         clientModulesDir?: string;
    +    islandsDir?: string;
         /** Absolute path to the pre-built theme stylesheet (`theme.css`). */
         themePath?: string;
         /** Pre-built active theme/accent stylesheets, loaded on demand. */
    @@ -617,11 +654,11 @@ interface ProdOptions {
         themeJsPath?: string;
         /** Resolved theme config: enables `<html data-theme>` + `theme.css` link. */
         theme?: ResolvedTheme;
    -    /** Absolute path to the pre-built Wire UI stylesheet (`ui.css`). */
    +    /** Absolute path to the pre-built WRNexusJS UI stylesheet (`ui.css`). */
         uiCssPath?: string;
    -    /** Combined production theme + Wire UI stylesheet. */
    +    /** Combined production theme + WRNexusJS UI stylesheet. */
         frameworkCssPath?: string;
    -    /** Pre-built `window.__wireSchemas = {...}` script for client validation. */
    +    /** Pre-built `window.__wrnSchemas = {...}` script for client validation. */
         schemasJs?: string;
         /**
          * Authorization declarations discovered by `wrnexus build` from
    @@ -648,6 +685,8 @@ interface ProdOptions {
             driver: string;
             url: string;
         }>;
    +    /** Queue persistence; durable SQLite is used when omitted. */
    +    queue?: QueueStorageConfig;
         /**
          * Absolute path to the default db's migrations bundled into the build
          * (`dist/migrations`). When set, they are applied on startup — like dev.
    @@ -722,13 +761,6 @@ interface AuthzManifestEntry {
      * `createProductionHandlers`, ever runs.
      */
     declare function applyAuthzManifestEarly(entries: AuthzManifestEntry[]): void;
    -/**
    - * Build the portable request handler from a precompiled manifest — a
    - * WinterCG-style `fetch(request) => Response` plus the websocket handlers, with
    - * NO server bound. This is the deployment-adapter seam: `createProductionServer`
    - * wraps it in `Bun.serve`, `serveNode` bridges it onto `node:http`, and edge or
    - * serverless targets can call `fetch` directly.
    - */
     declare function createProductionHandlers(manifest: ProdManifest, opts: ProdOptions): ReturnType<typeof createHandlers>;
     /** Start the production server on Bun from a precompiled manifest. */
     declare function createProductionServer(manifest: ProdManifest, opts: ProdOptions): Promise<Bun.Server<WsData>>;
    @@ -784,6 +816,8 @@ interface ServeOptions {
         /** Inject the live-reload client (defaults to true in development). */
         hmr?: boolean;
         appConfig?: Record<string, unknown>;
    +    /** Queue persistence; durable SQLite is used when omitted. */
    +    queue?: QueueStorageConfig;
         /** Resolved absolute path to the global CSS entry, or null. */
         styleEntry?: string | null;
         /** Custom styles config (e.g. a Tailwind/PostCSS processor). */
    @@ -796,6 +830,8 @@ interface ServeOptions {
         security?: SecurityConfig;
         /** Design-token theme config (merged over the built-in light/dark). */
         theme?: ThemeConfig;
    +    /** Shared browser-cookie defaults and preference-specific overrides. */
    +    cookies?: BrowserCookiesConfig;
         /** i18n config (default language + supported locales). */
         i18n?: I18nConfig;
         /** Default database connection (driver + url). Enables `getDb()` and dev auto-migrate. */
    @@ -832,7 +868,7 @@ interface RunningServer {
     }
     declare function startServer(opts: ServeOptions): Promise<RunningServer>;
     
    -export { type AssetServer, type AuthzManifestEntry, type FetchHandler, type GatewayApp, type GatewayAuth, type GatewayOptions, type GatewaySecurity, RESTART_EXIT_CODE, type RunningGateway, type RunningServer, type RuntimeDeps, type ServeOptions, type WrnCompileMetrics, type WsData, applyAuthzManifestEarly, createHandlers, createProductionHandlers, createProductionServer, expandStaticComponents, getWrnCompileMetrics, nodeListener, precomputePartialStaticShell, resetWrnCompileMetrics, serveNode, startGateway, startServer, toRequest, writeResponse };
    +export { type AssetServer, type AuthzManifestEntry, type FetchHandler, type GatewayApp, type GatewayAuth, type GatewayOptions, type GatewaySecurity, RESTART_EXIT_CODE, type RunningGateway, type RunningServer, type RuntimeDeps, type ServeOptions, type WrnCompileMetrics, type WsData, applyAuthzManifestEarly, createHandlers, createProductionHandlers, createProductionServer, expandStaticComponents, getWrnCompileMetrics, nodeListener, precomputePartialStaticShell, resetWrnCompileMetrics, serveNode, startGateway, startServer, toRequest, validateRpcCsrf, withServerFnRequestContext, writeResponse };
     

    Examples

    Copy-ready examples from the installed package documentation.

    Programmatic dev server

    import { startServer } from "@wrnexus/dev-server";
     
     const server = await startServer({
    @@ -871,9 +907,9 @@ await startGateway({
       ],
       security: { trustedHostsOnly: true, rateLimit: { max: 600 } },
     });
    - +
    - + } } diff --git a/app/pages/packages/dev-toolbar.wrn b/app/pages/packages/dev-toolbar.wrn index 140e9d4d..f55e5229 100644 --- a/app/pages/packages/dev-toolbar.wrn +++ b/app/pages/packages/dev-toolbar.wrn @@ -10,7 +10,7 @@ page wrnexusdevtoolbar {
    W WRNexusJS - +
    -
    Tooling · Package reference

    @wrnexus/dev-toolbar

    Development toolbar diagnostics, inspection, and runtime status.

    v0.8.8Private registryTooling

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/dev-toolbar@0.8.8

    Request preview access. Never put registry tokens in source control.

    Development-only page quality toolbar for WRNexusJS.

    +
    Tooling · Package reference

    @wrnexus/dev-toolbar

    Development toolbar diagnostics, inspection, and runtime status.

    v0.8.18Private registryTooling

    Install the package

    After WorkRoot approves private registry access, install the package:

    bun add @wrnexus/dev-toolbar@0.8.18

    Request preview access. Never put registry tokens in source control.

    Development-only page quality toolbar for WRNexusJS.

    Features

    • Runtime, resource and unhandled promise error capture
    • @@ -47,7 +47,7 @@ export { DEV_TOOLBAR_CSS, DEV_TOOLBAR_RUNTIME } from './client/index.j const issues = runDevToolbarRules(context);
    - + } } diff --git a/app/pages/packages/encryption.wrn b/app/pages/packages/encryption.wrn index fb78e484..66cdf9f5 100644 --- a/app/pages/packages/encryption.wrn +++ b/app/pages/packages/encryption.wrn @@ -10,7 +10,7 @@ page wrnexusencryption {
    W WRNexusJS - +
    -
    Security · Package reference

    @wrnexus/encryption

    Hashing, HMAC, authenticated encryption, and key derivation.

    v0.8.8Private registrySecurity

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/encryption@0.8.8

    Request preview access. Never put registry tokens in source control.

    Authenticated encryption, hashing, HMAC, key rotation, and optional encrypted HTTP exchanges for WRNexusJS.

    +
    Security · Package reference

    @wrnexus/encryption

    Hashing, HMAC, authenticated encryption, and key derivation.

    v0.8.10Private registrySecurity

    Install the package

    After WorkRoot approves private registry access, install the package:

    bun add @wrnexus/encryption@0.8.10

    Request preview access. Never put registry tokens in source control.

    Authenticated encryption, hashing, HMAC, key rotation, and optional encrypted HTTP exchanges for WRNexusJS.

    Core helpers

    • generateKey() — random 256-bit AES key encoded as base64.
    • @@ -76,6 +76,7 @@ const result = await decryptEncryptedResponse(response, request, { keyring

      Encrypted HTTP bodies do not replace TLS/HTTPS. Always use HTTPS.

      This layer is appropriate for service-to-service traffic, native/mobile applications, controlled agents, and selected fields protected with server-managed keys. It cannot conceal data from an end user when browser JavaScript receives the decryption key. Never ship a long-lived server encryption key to a browser.

      Use a shared replay store such as Redis in multi-instance deployments. The memory replay store is process-local.

    Complete TypeScript API

    Generated from the exact installed package declarations.

    import { Middleware } from '@wrnexus/core';
    +import { Db } from '@wrnexus/db';
     
     interface EncryptionKey {
         id: string;
    @@ -157,6 +158,22 @@ declare function encryptedExchange(options: EncryptedHttpOptions & {
         encryptResponses?: boolean;
     }): Middleware;
     
    +interface SecretResourceOptions<T extends Record<string, unknown>> {
    +    db: () => Db;
    +    table: string;
    +    key: string | (() => string);
    +    encrypted: readonly (keyof T & string)[];
    +    hidden?: readonly (keyof T & string)[];
    +    id?: string;
    +}
    +/** Encrypt selected database fields and guarantee hidden fields never leave `safe()`. */
    +declare function defineSecretResource<T extends Record<string, unknown>>(options: SecretResourceOptions<T>): {
    +    seal(input: T): Promise<T>;
    +    open(input: T): Promise<T>;
    +    safe(input: T): Partial<T>;
    +    find(value: string | number): Promise<T | null>;
    +};
    +
     /**
      * @wrnexus/encryption — authenticated symmetric encryption (AES-256-GCM) via
      * WebCrypto, dependency-free. Use it to encrypt secrets, tokens, or database
    @@ -186,7 +203,7 @@ declare function decrypt(payload: string, key: string): Promise<string>;
     /** Derive a base64 AES key from a password + salt (PBKDF2, 100k iterations). */
     declare function deriveKey(password: string, salt: string): Promise<string>;
     
    -export { type DecryptedHttpBody, ENCRYPTED_HTTP_CONTENT_TYPE, ENCRYPTED_HTTP_VERSION, type EncryptedHttpEnvelope, type EncryptedHttpOptions, type EncryptionKey, type EncryptionKeyring, type ReplayStore, createEncryptedRequest, createKeyring, createMemoryReplayStore, decrypt, decryptEncryptedResponse, decryptHttpBody, decryptRequest, deriveKey, encrypt, encryptHttpBody, encryptResponse, encryptedBody, encryptedExchange, encryptedFetch, generateKey, hmacSign, hmacVerify, needsRotation, open, seal, sealedKeyId, sha256 };
    +export { type DecryptedHttpBody, ENCRYPTED_HTTP_CONTENT_TYPE, ENCRYPTED_HTTP_VERSION, type EncryptedHttpEnvelope, type EncryptedHttpOptions, type EncryptionKey, type EncryptionKeyring, type ReplayStore, type SecretResourceOptions, createEncryptedRequest, createKeyring, createMemoryReplayStore, decrypt, decryptEncryptedResponse, decryptHttpBody, decryptRequest, defineSecretResource, deriveKey, encrypt, encryptHttpBody, encryptResponse, encryptedBody, encryptedExchange, encryptedFetch, generateKey, hmacSign, hmacVerify, needsRotation, open, seal, sealedKeyId, sha256 };
     

    Examples

    Copy-ready examples from the installed package documentation.

    ## Encrypted HTTP envelope

    import {
       createEncryptedRequest,
       createKeyring,
    @@ -219,7 +236,7 @@ const response = await fetch(request);
     const result = await decryptEncryptedResponse(response, request, { keyring });

    Install @wrnexus/encryption

    bun add @wrnexus/encryption
    - + } } diff --git a/app/pages/packages/graphql.wrn b/app/pages/packages/graphql.wrn index da00586c..1b90bccc 100644 --- a/app/pages/packages/graphql.wrn +++ b/app/pages/packages/graphql.wrn @@ -10,7 +10,7 @@ page wrnexusgraphql {
    W WRNexusJS - +
    -
    Data · Package reference

    @wrnexus/graphql

    GraphQL schemas, routes, and framework plugin integration.

    v0.8.8Private registryData

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/graphql@0.8.8

    Request preview access. Never put registry tokens in source control.

    Optional GraphQL endpoint plugin. Supply the executor from GraphQL.js, GraphQL Yoga, Mercurius, or another maintained engine; WRNexus owns bounded HTTP input, depth/alias limits, introspection policy, generic production errors and plugin route integration.

    Complete TypeScript API

    Generated from the exact installed package declarations.

    export { G as GraphqlExecutionResult, a as GraphqlOptions, b as GraphqlRequest, c as createGraphqlHandler, default as graphqlPlugin } from './plugin.js';
    +      
    Data · Package reference

    @wrnexus/graphql

    GraphQL schemas, routes, and framework plugin integration.

    v0.8.8Private registryData

    Install the package

    After WorkRoot approves private registry access, install the package:

    bun add @wrnexus/graphql@0.8.8

    Request preview access. Never put registry tokens in source control.

    Optional GraphQL endpoint plugin. Supply the executor from GraphQL.js, GraphQL Yoga, Mercurius, or another maintained engine; WRNexus owns bounded HTTP input, depth/alias limits, introspection policy, generic production errors and plugin route integration.

    Complete TypeScript API

    Generated from the exact installed package declarations.

    export { G as GraphqlExecutionResult, a as GraphqlOptions, b as GraphqlRequest, c as createGraphqlHandler, default as graphqlPlugin } from './plugin.js';
     import '@wrnexus/plugin';
     

    Examples

    Copy-ready examples from the installed package documentation.

    Install @wrnexus/graphql

    bun add @wrnexus/graphql

    Import @wrnexus/graphql

    import * as graphql from "@wrnexus/graphql";
    - + } } diff --git a/app/pages/packages/helpers.wrn b/app/pages/packages/helpers.wrn index 72435249..498127a5 100644 --- a/app/pages/packages/helpers.wrn +++ b/app/pages/packages/helpers.wrn @@ -10,7 +10,7 @@ page wrnexushelpers {
    W WRNexusJS - +
    -
    Tooling · Package reference

    @wrnexus/helpers

    Safe Context URL helpers and forward-auth login redirects.

    v0.8.8Private registryTooling

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/helpers@0.8.8

    Request preview access. Never put registry tokens in source control.

    Safe convenience helpers for common WRNexusJS application flows. The package uses standard Context, URL, and Response values and has no runtime dependency beyond @wrnexus/core.

    +
    Tooling · Package reference

    @wrnexus/helpers

    Safe Context URL helpers and forward-auth login redirects.

    v0.8.9Private registryTooling

    Install the package

    After WorkRoot approves private registry access, install the package:

    bun add @wrnexus/helpers@0.8.9

    Request preview access. Never put registry tokens in source control.

    Safe convenience helpers for common WRNexusJS application flows. The package uses standard Context, URL, and Response values and has no runtime dependency beyond @wrnexus/core.

    bun add @wrnexus/helpers

    The package is private, so the machine must be authenticated to the wrnexus npm organization.

    Usage

    @@ -66,6 +66,7 @@ export const GET = async (ctx: Context) => {

    encoded returnTo parameter.

    For direct requests without gateway headers, URL helpers use ctx.url.

    Complete TypeScript API

    Generated from the exact installed package declarations.

    import { Context } from '@wrnexus/core';
    +import { Db } from '@wrnexus/db';
     
     declare function appOrigin(appName: string): string;
     declare function appUrl(appName: string, path?: string): string;
    @@ -94,6 +95,59 @@ declare function safeJsonParse<T>(value: string, fallback: T): T;
     declare function clamp(value: number, min: number, max: number): number;
     declare function once<T extends (...args: any[]) => any>(fn: T): T;
     
    +declare class HttpError extends Error {
    +    readonly status: number;
    +    readonly details?: unknown | undefined;
    +    constructor(status: number, message: string, details?: unknown | undefined);
    +}
    +declare function subjectId(ctx: Pick<Context, "user">): string;
    +declare function requireUser(ctx: Pick<Context, "user">): {
    +    id: string;
    +    user: unknown;
    +};
    +declare function requireParam(ctx: Pick<Context, "params">, name: string, options?: {
    +    integer?: boolean;
    +    positive?: boolean;
    +}): string | number;
    +declare function requireJson<T = Record<string, unknown>>(ctx: Pick<Context, "req">): Promise<T>;
    +declare function requirePermission(ctx: Context, permission: string, resource?: unknown): Promise<void>;
    +declare const json: {
    +    ok: <T>(value: T) => Response;
    +    created: <T>(value: T) => Response;
    +    noContent: () => Response;
    +    error: (status: number, message: string, details?: unknown) => Response;
    +};
    +type ApiHandler = (ctx: Context) => Response | Promise<Response>;
    +/** Convert thrown HttpError values into the framework's standard JSON error shape. */
    +declare function defineApiRoute(handler: ApiHandler): ApiHandler;
    +declare function authorized(permission: string, handler: ApiHandler, resource?: (ctx: Context) => unknown | Promise<unknown>): ApiHandler;
    +
    +interface ResourceDefinition<T extends Record<string, unknown>> {
    +    name: string;
    +    db: () => Db;
    +    table: string;
    +    id?: string;
    +    owner?: string;
    +    fields: readonly (keyof T & string)[];
    +    permissions?: {
    +        read?: string;
    +        readAny?: string;
    +        write?: string;
    +        writeAny?: string;
    +    };
    +    validate?: (input: unknown, mode: "create" | "update") => T | Promise<T>;
    +    serialize?: (row: T) => unknown;
    +}
    +interface ResourceHandlers {
    +    list(ctx: Context): Response | Promise<Response>;
    +    create(ctx: Context): Response | Promise<Response>;
    +    get(ctx: Context): Response | Promise<Response>;
    +    update(ctx: Context): Response | Promise<Response>;
    +    remove(ctx: Context): Response | Promise<Response>;
    +}
    +/** Build conventional owned CRUD handlers from one checked resource declaration. */
    +declare function defineResource<T extends Record<string, unknown>>(definition: ResourceDefinition<T>): ResourceHandlers;
    +
     /**
      * @wrnexus/helpers — safe conveniences for common WRNexusJS application flows.
      *
    @@ -135,7 +189,7 @@ declare function getOriginalRequestOrigin(ctx: RequestContext, options?: Origina
      */
     declare function redirectToLogin(ctx: RequestContext, loginUrl: string | URL, options?: LoginRedirectOptions): Response;
     
    -export { type AllowedHosts, type LoginRedirectOptions, type OriginalRequestOptions, type RequestContext, type RetryOptions, appOrigin, appUrl, backoffDelay, clamp, currentAppName, currentAppOrigin, getOriginalRequestMethod, getOriginalRequestOrigin, getOriginalRequestPath, getOriginalRequestUrl, once, redirectToLogin, retry, safeJsonParse, sleep, stableStringify, withTimeout, workspaceAppOrigins, workspaceRootDomain };
    +export { type AllowedHosts, type ApiHandler, HttpError, type LoginRedirectOptions, type OriginalRequestOptions, type RequestContext, type ResourceDefinition, type ResourceHandlers, type RetryOptions, appOrigin, appUrl, authorized, backoffDelay, clamp, currentAppName, currentAppOrigin, defineApiRoute, defineResource, getOriginalRequestMethod, getOriginalRequestOrigin, getOriginalRequestPath, getOriginalRequestUrl, json, once, redirectToLogin, requireJson, requireParam, requirePermission, requireUser, retry, safeJsonParse, sleep, stableStringify, subjectId, withTimeout, workspaceAppOrigins, workspaceRootDomain };
     

    Examples

    Copy-ready examples from the installed package documentation.

    Redirect an unauthenticated forward-auth request

    import type { Context } from "@wrnexus/core";
     import { redirectToLogin } from "@wrnexus/helpers";
     
    @@ -162,7 +216,7 @@ export const GET = async (ctx: Context) => {
     };
    - + } } diff --git a/app/pages/packages/i18n.wrn b/app/pages/packages/i18n.wrn index a898327e..a4774256 100644 --- a/app/pages/packages/i18n.wrn +++ b/app/pages/packages/i18n.wrn @@ -10,7 +10,7 @@ page wrnexusi18n {
    W WRNexusJS - +
    -
    Frontend · Package reference

    @wrnexus/i18n

    Translation loading, locale resolution, and Intl formatting.

    v0.8.8Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/i18n@0.8.8

    Request preview access. Never put registry tokens in source control.

    Recursive locale loading, fallback resolution, SSR/browser translations, locale formatting, and language UI blocks for WRNexusJS.

    +
    Frontend · Package reference

    @wrnexus/i18n

    Translation loading, locale resolution, and Intl formatting.

    v0.8.12Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the package:

    bun add @wrnexus/i18n@0.8.12

    Request preview access. Never put registry tokens in source control.

    Recursive locale loading, fallback resolution, SSR/browser translations, locale formatting, and language UI blocks for WRNexusJS.

    Locale files

    Both layouts can be used together:

    app/locales/en.json
    @@ -34,7 +34,7 @@ const i18n = resolveI18n(loadLocales("app/locales", { strict: tru
       default: "en",
       locales: ["en", "mr", "hi"],
       fallbacks: { "mr-IN": ["mr", "en"] },
    -  cookie: { name: "wire-lang", sameSite: "Lax", secure: true },
    +  cookie: { name: "wrn-lang", sameSite: "Lax", secure: true },
     });
     
     const lang = resolveLang(i18n, cookieValue, request.headers.get("accept-language"));
    @@ -61,7 +61,7 @@ t("common.hello", { name: "Ajay" });
  • <LanguageSwitcher />
  • <LocaleStatus />
  • -

    LanguageSwitcher renders a native select[data-wire-lang]. The packaged runtime validates the selection against the configured locales, writes the configured language cookie, updates the document lang/dir attributes, emits wrnexus:language-change, and reloads so the next SSR request uses the same cookie. No application-owned browser script is required.

    +

    LanguageSwitcher renders a native select[data-wrn-lang]. The packaged runtime validates the selection against the configured locales, writes the configured language cookie, updates the document lang/dir attributes, emits wrnexus:language-change, and reloads so the next SSR request uses the same cookie. No application-owned browser script is required.

    Formatting

    • formatNumber
    • @@ -160,6 +160,7 @@ interface LocaleLoadOptions { interface I18nCookieConfig { name?: string; maxAge?: number; + domain?: string; path?: string; sameSite?: "Strict" | "Lax" | "None"; secure?: boolean; @@ -185,7 +186,7 @@ interface ResolvedI18n { labels: Record<string, string>; cookie: Required<I18nCookieConfig>; } -declare const LANG_COOKIE = "wire-lang"; +declare const LANG_COOKIE = "wrn-lang"; declare const I18N_JS_HREF = "/__wrnexus/i18n.js"; declare function normalizeLocale(locale: string): string; /** @@ -209,17 +210,29 @@ declare function loadRouteMessages(directory: string, locale: string, route: str declare function parseAcceptLanguage(value: string | null): string[]; declare function resolveLang(i18n: ResolvedI18n, cookieValue: string | undefined, acceptLanguage: string | null): string; declare function translateHtml(html: string, t: TFunction): string; +/** Attribute marking the JSON block that carries per-request i18n data. */ +declare const I18N_DATA_ATTRIBUTE = "data-wrn-i18n"; +/** + * The i18n payload, emitted as JSON rather than as an assignment. + * + * It ships inside a `type="application/json"` block, which the browser never + * executes, so `script-src` does not apply to it. As an inline executable + * script it was blocked whenever the surrounding document's CSP nonce came + * from a different response, leaving window.__wrnI18n undefined. + */ declare function renderI18nData(i18n: ResolvedI18n, lang: string): string; +/** The full JSON block, including its script tag. */ +declare function renderI18nDataTag(i18n: ResolvedI18n, lang: string): string; declare const I18N_RUNTIME: string; -export { type ExtractedTranslationKey, I18N_JS_HREF, I18N_RUNTIME, type I18nConfig, type I18nCookieConfig, LANG_COOKIE, type LocaleFormatter, type LocaleLoadOptions, type Messages, type ResolvedI18n, auditLocaleKeys, createLocaleFormatter, createPseudoLocale, extractTranslationKeys, extractTranslationKeysFromFiles, flattenMessageKeys, flattenMessages, formatCurrency, formatDate, formatMessage, formatNumber, formatRelativeTime, interpolate, loadLocales, loadRouteMessages, localeDirection, localeFallbacks, lookupMessage, makeT, normalizeLocale, parseAcceptLanguage, plural, pseudoLocalize, renderI18nData, resolveI18n, resolveLang, translateHtml, translationChain, translationCoverage, withTenantMessages }; +export { type ExtractedTranslationKey, I18N_DATA_ATTRIBUTE, I18N_JS_HREF, I18N_RUNTIME, type I18nConfig, type I18nCookieConfig, LANG_COOKIE, type LocaleFormatter, type LocaleLoadOptions, type Messages, type ResolvedI18n, auditLocaleKeys, createLocaleFormatter, createPseudoLocale, extractTranslationKeys, extractTranslationKeysFromFiles, flattenMessageKeys, flattenMessages, formatCurrency, formatDate, formatMessage, formatNumber, formatRelativeTime, interpolate, loadLocales, loadRouteMessages, localeDirection, localeFallbacks, lookupMessage, makeT, normalizeLocale, parseAcceptLanguage, plural, pseudoLocalize, renderI18nData, renderI18nDataTag, resolveI18n, resolveLang, translateHtml, translationChain, translationCoverage, withTenantMessages };

    Examples

    Copy-ready examples from the installed package documentation.

    Namespaced files become keys such as common.save and auth.signIn.

    import { loadLocales, makeT, resolveI18n, resolveLang } from "@wrnexus/i18n";
     
     const i18n = resolveI18n(loadLocales("app/locales", { strict: true }), {
       default: "en",
       locales: ["en", "mr", "hi"],
       fallbacks: { "mr-IN": ["mr", "en"] },
    -  cookie: { name: "wire-lang", sameSite: "Lax", secure: true },
    +  cookie: { name: "wrn-lang", sameSite: "Lax", secure: true },
     });
     
     const lang = resolveLang(i18n, cookieValue, request.headers.get("accept-language"));
    @@ -237,7 +250,7 @@ const enXA = createPseudoLocale(messages.en);
     const arXB = createPseudoLocale(messages.en, { rtl: true });
    - + } } diff --git a/app/pages/packages/identity.wrn b/app/pages/packages/identity.wrn index b1314a6e..c6fb0326 100644 --- a/app/pages/packages/identity.wrn +++ b/app/pages/packages/identity.wrn @@ -10,7 +10,7 @@ page wrnexusidentity {
    W WRNexusJS - +
    -
    Security · Package reference

    @wrnexus/identity

    Portable identity records, claims, and account linking.

    v0.8.8Private registrySecurity

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/identity@0.8.8

    Request preview access. Never put registry tokens in source control.

    Enterprise identity and governance for WRNexusJS: OIDC discovery, signed SAML adapter flows, LDAP/Active Directory synchronization adapters, SCIM provisioning, scoped API keys, service accounts, approval workflows, consent history, retention, subject export/deletion and audit.

    +
    Security · Package reference

    @wrnexus/identity

    Portable identity records, claims, and account linking.

    v0.8.8Private registrySecurity

    Install the package

    After WorkRoot approves private registry access, install the package:

    bun add @wrnexus/identity@0.8.8

    Request preview access. Never put registry tokens in source control.

    Enterprise identity and governance for WRNexusJS: OIDC discovery, signed SAML adapter flows, LDAP/Active Directory synchronization adapters, SCIM provisioning, scoped API keys, service accounts, approval workflows, consent history, retention, subject export/deletion and audit.

    The package complements @wrnexus/auth (passkeys, MFA, devices, sessions, OAuth and audited impersonation) and @wrnexus/authz (RBAC, ABAC and policy decisions). Protocol-specific SAML and directory parsing is supplied through adapters so applications can select a maintained vendor SDK without weakening framework validation, replay protection or governance auditing.

    Complete TypeScript API

    Generated from the exact installed package declarations.

    interface OidcMetadata {
         issuer: string;
         authorization_endpoint: string;
    @@ -239,7 +239,7 @@ export { type DirectoryAdapter, type EnterpriseIdentity, type GovernanceEve
     

    Examples

    Copy-ready examples from the installed package documentation.

    Install @wrnexus/identity

    bun add @wrnexus/identity

    Import @wrnexus/identity

    import * as identity from "@wrnexus/identity";
    - + } } diff --git a/app/pages/packages/image.wrn b/app/pages/packages/image.wrn index 2713250e..161343bc 100644 --- a/app/pages/packages/image.wrn +++ b/app/pages/packages/image.wrn @@ -10,7 +10,7 @@ page wrnexusimage {
    W WRNexusJS - +
    -
    Frontend · Package reference

    @wrnexus/image

    Responsive image optimization, loaders, placeholders, and components.

    v0.8.8Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/image@0.8.8

    Request preview access. Never put registry tokens in source control.

    Secure responsive-image planning, loader adapters, picture sources, preload hints, placeholders, and performance auditing for WRNexusJS.

    +
    Frontend · Package reference

    @wrnexus/image

    Responsive image optimization, loaders, placeholders, and components.

    v0.8.10Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the package:

    bun add @wrnexus/image@0.8.10

    Request preview access. Never put registry tokens in source control.

    Secure responsive-image planning, loader adapters, picture sources, preload hints, placeholders, and performance auditing for WRNexusJS.

    Build-time conversion is available through optimizeImage. It normalizes and bounds width/format variants, prevents variant explosions, writes deterministic filenames, and returns a manifest with dimensions and byte sizes:

    import { optimizeImage } from "@wrnexus/image";
     
    @@ -225,7 +225,7 @@ const picture = createPicture({
     });
    - + } } diff --git a/app/pages/packages/jwt.wrn b/app/pages/packages/jwt.wrn index 2490c1d2..f043e946 100644 --- a/app/pages/packages/jwt.wrn +++ b/app/pages/packages/jwt.wrn @@ -10,7 +10,7 @@ page wrnexusjwt {
    W WRNexusJS - +
    -
    Security · Package reference

    @wrnexus/jwt

    HS256 JWT signing, verification, and bearer authentication.

    v0.8.8Private registrySecurity

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/jwt@0.8.8

    Request preview access. Never put registry tokens in source control.

    Dependency-free JSON Web Tokens (HS256) via Web Crypto, plus a bearer-token auth middleware for WRNexusJS.
    +
    Security · Package reference

    @wrnexus/jwt

    HS256 JWT signing, verification, and bearer authentication.

    v0.8.9Private registrySecurity

    Install the package

    After WorkRoot approves private registry access, install the package:

    bun add @wrnexus/jwt@0.8.9

    Request preview access. Never put registry tokens in source control.

    Dependency-free JSON Web Tokens (HS256) via Web Crypto, plus a bearer-token auth middleware for WRNexusJS.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    @wrnexus/jwt signs and verifies stateless JSON Web Tokens using the HS256 (HMAC-SHA-256) algorithm. It has no runtime dependencies — signing and verification are implemented directly on the standard Web Crypto API (crypto.subtle), which Bun provides natively. It runs server-side and pairs with the session-based auth in @wrnexus/core, giving you a stateless option for API and mobile clients. Reach for it when you need bearer-token auth rather than cookie sessions.

    @@ -322,7 +322,7 @@ app.use(jwtAuth({ secret: process.env.JWT_SECRET! })); app.use(jwtAuth({ secret: process.env.JWT_SECRET!, required: false }));
    - + } } diff --git a/app/pages/packages/language-server.wrn b/app/pages/packages/language-server.wrn index 716f9506..ed17fd55 100644 --- a/app/pages/packages/language-server.wrn +++ b/app/pages/packages/language-server.wrn @@ -10,7 +10,7 @@ page wrnexuslanguageserver {
    W WRNexusJS - +
    -
    Tooling · Package reference

    @wrnexus/language-server

    Editor-neutral language intelligence for WRN files.

    v0.8.8Private registryTooling

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/language-server@0.8.8

    Request preview access. Never put registry tokens in source control.

    Editor-neutral Language Server Protocol support for .wrn files. It uses the canonical @wrnexus/syntax parser, diagnostics, accessibility rules, and formatter.

    +
    Tooling · Package reference

    @wrnexus/language-server

    Editor-neutral language intelligence for WRN files.

    v0.8.12Private registryTooling

    Install the package

    After WorkRoot approves private registry access, install the package:

    bun add @wrnexus/language-server@0.8.12

    Request preview access. Never put registry tokens in source control.

    Editor-neutral Language Server Protocol support for .wrn files. It uses the canonical @wrnexus/syntax parser, diagnostics, accessibility rules, and formatter.

    bunx wrnexus-language-server --stdio

    Capabilities include syntax, accessibility and TypeScript expression diagnostics, formatting, completion, hover, document symbols, go-to-definition, references, rename, and quick fixes. The custom wrnexus/virtualDocument request returns the mapped TypeScript representation of an open .wrn document for editor TypeScript plugins and safe refactoring tools. Any LSP 3.x client can launch the stdio command. Example Neovim configuration:

    vim.lsp.start({
    @@ -75,7 +75,7 @@ interface TextDocument {
         text: string;
         version?: number;
     }
    -declare const WRN_COMPLETIONS: readonly ["page", "component", "layout", "props", "outputs", "state", "computed", "effect", "watch", "lifecycle", "load", "action", "api", "realtime", "view", "style", "runtime", "hydrate"];
    +declare const WRN_KEYWORDS: readonly ["page", "component", "layout", "props", "outputs", "state", "computed", "effect", "watch", "lifecycle", "load", "action", "api", "apis", "realtime", "view", "style", "runtime", "hydrate"];
     declare function offsetAt(text: string, position: Position): number;
     declare function positionAt(text: string, requestedOffset: number): Position;
     declare function wordAt(text: string, position: Position): {
    @@ -156,7 +156,7 @@ declare function hover(document: TextDocument, position: Position): {
         range: Range;
     } | null;
     declare function completionItems(): {
    -    label: "page" | "component" | "layout" | "props" | "outputs" | "state" | "computed" | "effect" | "watch" | "lifecycle" | "load" | "action" | "api" | "realtime" | "view" | "style" | "runtime" | "hydrate";
    +    label: "page" | "component" | "layout" | "props" | "outputs" | "state" | "computed" | "effect" | "watch" | "lifecycle" | "load" | "action" | "api" | "apis" | "realtime" | "view" | "style" | "runtime" | "hydrate";
         kind: number;
         detail: string;
     }[];
    @@ -169,7 +169,7 @@ declare function semanticTokens(document: TextDocument): {
         data: number[];
     };
     
    -export { type Position, type Range, type TextDocument, WRN_COMPLETIONS, type WorkspaceCompletionItem, clearWorkspaceIndexCache, completionItems, definitionLocation, documentDiagnostics, documentSymbols, extractComponentRefactor, formatDocument, hover, htmlToWrn, offsetAt, positionAt, semanticTokens, semanticTokensLegend, symbolLocations, virtualTypeScriptDocument, wordAt, workspaceCompletionItems, workspaceSymbolLocations };
    +export { type Position, type Range, type TextDocument, WRN_KEYWORDS, type WorkspaceCompletionItem, clearWorkspaceIndexCache, completionItems, definitionLocation, documentDiagnostics, documentSymbols, extractComponentRefactor, formatDocument, hover, htmlToWrn, offsetAt, positionAt, semanticTokens, semanticTokensLegend, symbolLocations, virtualTypeScriptDocument, wordAt, workspaceCompletionItems, workspaceSymbolLocations };
     

    Examples

    Copy-ready examples from the installed package documentation.

    @wrnexus/syntax parser, diagnostics, accessibility rules, and formatter.

    bunx wrnexus-language-server --stdio

    stdio command. Example Neovim configuration

    vim.lsp.start({
       name = "wrnexus",
       cmd = { "bunx", "wrnexus-language-server", "--stdio" },
    @@ -177,7 +177,7 @@ export { type Position, type Range, type TextDocument, WRN_COMPLETIONS, typ
     })
    - + } } diff --git a/app/pages/packages/mcp.wrn b/app/pages/packages/mcp.wrn index eec9ba10..67a54ab3 100644 --- a/app/pages/packages/mcp.wrn +++ b/app/pages/packages/mcp.wrn @@ -10,7 +10,7 @@ page wrnexusmcp {
    W WRNexusJS - +
    -
    Tooling · Package reference

    @wrnexus/mcp

    Model Context Protocol tools for WRNexus projects.

    v0.8.8Private registryTooling

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/mcp@0.8.8

    Request preview access. Never put registry tokens in source control.

    Editor-neutral Model Context Protocol server for AI development tools.

    +
    Tooling · Package reference

    @wrnexus/mcp

    Model Context Protocol tools for WRNexus projects.

    v0.8.8Private registryTooling

    Install the package

    After WorkRoot approves private registry access, install the package:

    bun add @wrnexus/mcp@0.8.8

    Request preview access. Never put registry tokens in source control.

    Editor-neutral Model Context Protocol server for AI development tools.

    bunx wrnexus-mcp --root=.

    It exposes current routes, components with props/events, database schema files, compiler diagnostics, runtime errors, dev-server health, framework documentation and installed packages. Files are resolved inside the configured application root and returned as bounded structured JSON.

    Complete TypeScript API

    Generated from the exact installed package declarations.

    interface McpTool {
         name: string;
    @@ -49,7 +49,7 @@ export { type McpServer, type McpServerOptions, type McpTool, createFramewo
     

    Examples

    Copy-ready examples from the installed package documentation.

    Editor-neutral Model Context Protocol server for AI development tools.

    bunx wrnexus-mcp --root=.

    Install @wrnexus/mcp

    bun add @wrnexus/mcp
    - + } } diff --git a/app/pages/packages/mobile.wrn b/app/pages/packages/mobile.wrn index 7cd42316..8cbc3036 100644 --- a/app/pages/packages/mobile.wrn +++ b/app/pages/packages/mobile.wrn @@ -10,7 +10,7 @@ page wrnexusmobile {
    W WRNexusJS - +
    -
    Native · Package reference

    @wrnexus/mobile

    SSR-safe compatibility access to Capacitor plugins.

    v0.8.8Private registryNative

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/mobile@0.8.8

    Request preview access. Never put registry tokens in source control.

    SSR-safe access to Capacitor plugins from WRNexusJS browser code.
    +
    Native · Package reference

    @wrnexus/mobile

    SSR-safe compatibility access to Capacitor plugins.

    v0.8.8Private registryNative

    Install the package

    After WorkRoot approves private registry access, install the package:

    bun add @wrnexus/mobile@0.8.8

    Request preview access. Never put registry tokens in source control.

    SSR-safe access to Capacitor plugins from WRNexusJS browser code.

    Overview

    @wrnexus/mobile keeps optional native imports out of server rendering while giving browser-owned modules one consistent registry for Capacitor plugins. During SSR, mobile.isNative() is false and mobile.platform() is "web".

    Install a plugin through the WRNexusJS CLI so the web and native projects stay aligned:

    @@ -219,7 +219,7 @@ const network = mobile.plugin<NetworkPlugin>("Network"); const status = network ? await network.getStatus() : { connected: true, connectionType: "unknown" };
    - + } } diff --git a/app/pages/packages/native.wrn b/app/pages/packages/native.wrn index dacf11ca..79451c1d 100644 --- a/app/pages/packages/native.wrn +++ b/app/pages/packages/native.wrn @@ -10,7 +10,7 @@ page wrnexusnative {
    W WRNexusJS - +
    -
    Native · Package reference

    @wrnexus/native

    Cross-platform browser and Capacitor capability registry.

    v0.8.8Private registryNative

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/native@0.8.8

    Request preview access. Never put registry tokens in source control.

    Cross-platform capabilities for browsers, Capacitor WebViews, and compiled native apps.
    +
    Native · Package reference

    @wrnexus/native

    Cross-platform browser and Capacitor capability registry.

    v0.8.8Private registryNative

    Install the package

    After WorkRoot approves private registry access, install the package:

    bun add @wrnexus/native@0.8.8

    Request preview access. Never put registry tokens in source control.

    Cross-platform capabilities for browsers, Capacitor WebViews, and compiled native apps.

    Overview

    @wrnexus/native exposes capabilities by name so application code can ask what the current platform supports before presenting an action. Browser capabilities use Web APIs; mobile capabilities use installed Capacitor plugins. platform() returns "server" during SSR, "browser" on the web, and the Capacitor platform in a native WebView.

    bun add @wrnexus/native
    @@ -160,7 +160,7 @@ const position = await native.run( );
    - + } } diff --git a/app/pages/packages/oauth.wrn b/app/pages/packages/oauth.wrn index e1b4a8f1..f51d83b2 100644 --- a/app/pages/packages/oauth.wrn +++ b/app/pages/packages/oauth.wrn @@ -10,7 +10,7 @@ page wrnexusoauth {
    W WRNexusJS - +
    -
    Security · Package reference

    @wrnexus/oauth

    OAuth 2.0, PKCE, provider presets, and profile mapping.

    v0.8.8Private registrySecurity

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/oauth@0.8.8

    Request preview access. Never put registry tokens in source control.

    Dependency-free OAuth 2.0 sign-in for any provider, with PKCE and presets for Google, GitHub, and Discord.
    +
    Security · Package reference

    @wrnexus/oauth

    OAuth 2.0, PKCE, provider presets, and profile mapping.

    v0.8.8Private registrySecurity

    Install the package

    After WorkRoot approves private registry access, install the package:

    bun add @wrnexus/oauth@0.8.8

    Request preview access. Never put registry tokens in source control.

    Dependency-free OAuth 2.0 sign-in for any provider, with PKCE and presets for Google, GitHub, and Discord.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    @wrnexus/oauth implements the OAuth 2.0 Authorization Code flow (with PKCE) for server-side sign-in. It ships ready-made provider presets and a defineProvider helper for custom providers, then gives you two flow functions — startAuth (build the redirect) and completeAuth (exchange the code and fetch the user's profile). It has no runtime dependencies: it uses the platform fetch and WebCrypto only. Pairs naturally with @wrnexus/core's logIn to establish a session once you have a normalized profile.

    @@ -356,7 +356,7 @@ const gitlab = defineProvider({ });
    - + } } diff --git a/app/pages/packages/observability.wrn b/app/pages/packages/observability.wrn index 02801de5..00ad86e9 100644 --- a/app/pages/packages/observability.wrn +++ b/app/pages/packages/observability.wrn @@ -10,7 +10,7 @@ page wrnexusobservability {
    W WRNexusJS - +
    -
    Runtime · Package reference

    @wrnexus/observability

    Structured logging, tracing, health, and integration adapters.

    v0.8.8Private registryRuntime

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/observability@0.8.8

    Request preview access. Never put registry tokens in source control.

    Open-standard traces, metrics, logs, health checks, Web Vitals, error reporting and profiling.

    +
    Runtime · Package reference

    @wrnexus/observability

    Structured logging, tracing, health, and integration adapters.

    v0.8.8Private registryRuntime

    Install the package

    After WorkRoot approves private registry access, install the package:

    bun add @wrnexus/observability@0.8.8

    Request preview access. Never put registry tokens in source control.

    Open-standard traces, metrics, logs, health checks, Web Vitals, error reporting and profiling.

    Use createOperationTracer() for database, cache, queue, realtime, server-action or custom application spans. Export through OTLP, Prometheus, Zipkin/Jaeger, or the Sentry-compatible error reporter; Grafana can consume the Prometheus or OTLP signals.

    Privacy-conscious counters, gauges, histograms, HTTP middleware, Web Vitals ingestion, browser collection, and exporter adapters. Request bodies and user identifiers are not collected by default.

    export default {
    @@ -132,7 +132,7 @@ export const live = createLivenessHandler();
     export const ready = createReadinessHandler(health);
    - + } } diff --git a/app/pages/packages/playground.wrn b/app/pages/packages/playground.wrn index 96138f74..8d35389b 100644 --- a/app/pages/packages/playground.wrn +++ b/app/pages/packages/playground.wrn @@ -10,7 +10,7 @@ page wrnexusplayground {
    W WRNexusJS - +
    -
    Tooling · Package reference

    @wrnexus/playground

    Interactive framework examples and executable playground utilities.

    v0.8.8Private registryTooling

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/playground@0.8.8

    Request preview access. Never put registry tokens in source control.

    A deployable, shareable .wrn playground with diagnostics, generated JavaScript, safe SSR-shaped HTML, sandboxed preview, reactive/UI examples, and version adapters.

    +
    Tooling · Package reference

    @wrnexus/playground

    Interactive framework examples and executable playground utilities.

    v0.8.8Private registryTooling

    Install the package

    After WorkRoot approves private registry access, install the package:

    bun add @wrnexus/playground@0.8.8

    Request preview access. Never put registry tokens in source control.

    A deployable, shareable .wrn playground with diagnostics, generated JavaScript, safe SSR-shaped HTML, sandboxed preview, reactive/UI examples, and version adapters.

    Run wrnexus playground, or deploy createPlaygroundHandler().

    Complete TypeScript API

    Generated from the exact installed package declarations.

    interface PlaygroundCompilation {
         source: string;
         generated: string;
    @@ -65,7 +65,7 @@ export { type PlaygroundCompilation, type PlaygroundVersionAdapter, compare
     

    Examples

    Copy-ready examples from the installed package documentation.

    Install @wrnexus/playground

    bun add @wrnexus/playground

    Import @wrnexus/playground

    import * as playground from "@wrnexus/playground";
    - + } } diff --git a/app/pages/packages/plugin.wrn b/app/pages/packages/plugin.wrn index 5ed236ee..441a3fb0 100644 --- a/app/pages/packages/plugin.wrn +++ b/app/pages/packages/plugin.wrn @@ -10,7 +10,7 @@ page wrnexusplugin {
    W WRNexusJS - +
    -
    Core · Package reference

    @wrnexus/plugin

    Plugin contracts, lifecycle hooks, composition, and framework integration.

    v0.8.8Private registryCore

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/plugin@0.8.8

    Request preview access. Never put registry tokens in source control.

    Least-privilege package permissions

    +
    Core · Package reference

    @wrnexus/plugin

    Plugin contracts, lifecycle hooks, composition, and framework integration.

    v0.8.9Private registryCore

    Install the package

    After WorkRoot approves private registry access, install the package:

    bun add @wrnexus/plugin@0.8.9

    Request preview access. Never put registry tokens in source control.

    Least-privilege package permissions

    Package manifests declare every framework capability they register:

    {
       "wrnexus": {
    @@ -85,7 +85,7 @@ export { type PluginCompatibilityResult, type PluginCompatibilityTarget, Pl
     };
    - + } } diff --git a/app/pages/packages/pubsub.wrn b/app/pages/packages/pubsub.wrn index 6b6fb84f..438727db 100644 --- a/app/pages/packages/pubsub.wrn +++ b/app/pages/packages/pubsub.wrn @@ -10,7 +10,7 @@ page wrnexuspubsub {
    W WRNexusJS - +
    -
    Realtime · Package reference

    @wrnexus/pubsub

    In-process and Redis-backed publish/subscribe.

    v0.8.8Private registryRealtime

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/pubsub@0.8.8

    Request preview access. Never put registry tokens in source control.

    Topic-based publish/subscribe with a pluggable driver — in-process by default, Redis for cross-process messaging.
    +
    Realtime · Package reference

    @wrnexus/pubsub

    In-process and Redis-backed publish/subscribe.

    v0.8.9Private registryRealtime

    Install the package

    After WorkRoot approves private registry access, install the package:

    bun add @wrnexus/pubsub@0.8.9

    Request preview access. Never put registry tokens in source control.

    Topic-based publish/subscribe with a pluggable driver — in-process by default, Redis for cross-process messaging.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    @wrnexus/pubsub is a small server-side pub/sub bus. You publish messages to a topic and subscribe with topic patterns; handlers fire for matching topics. The default driver keeps everything in-process, and you can swap in the Redis driver (@wrnexus/pubsub/redis) to fan messages out across processes or hosts. It also backs @wrnexus/core's realtime bridge for horizontal scaling.

    @@ -216,7 +216,7 @@ await bus.publish("order:created", { id: 7 }); await bus.close();
    - + } } diff --git a/app/pages/packages/pwa.wrn b/app/pages/packages/pwa.wrn index 4ff1ae40..3a616820 100644 --- a/app/pages/packages/pwa.wrn +++ b/app/pages/packages/pwa.wrn @@ -10,7 +10,7 @@ page wrnexuspwa {
    W WRNexusJS - +
    -
    Frontend · Package reference

    @wrnexus/pwa

    Progressive Web App manifests, service workers, and offline strategies.

    v0.8.8Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/pwa@0.8.8

    Request preview access. Never put registry tokens in source control.

    Official PWA primitives for manifests, service workers, offline pages and precaching, runtime caching, background synchronization, push notifications, install/update events, offline mutation stores, and conflict resolution. createOfflineQueue() accepts a durable IndexedDB-style store and retries requests with stable idempotency headers.

    Complete TypeScript API

    Generated from the exact installed package declarations.

    interface IndexedDbMigration {
    +      
    Frontend · Package reference

    @wrnexus/pwa

    Progressive Web App manifests, service workers, and offline strategies.

    v0.8.12Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the package:

    bun add @wrnexus/pwa@0.8.12

    Request preview access. Never put registry tokens in source control.

    Official PWA primitives for manifests, service workers, offline pages and precaching, runtime caching, background synchronization, push notifications, install/update events, offline mutation stores, and conflict resolution. createOfflineQueue() accepts a durable IndexedDB-style store and retries requests with stable idempotency headers.

    Complete TypeScript API

    Generated from the exact installed package declarations.

    interface IndexedDbMigration {
         version: number;
         migrate(db: IDBDatabase, transaction: IDBTransaction): void;
     }
    @@ -182,7 +182,7 @@ export { type ConflictResolution, type IndexedDbMigration, type OfflineMuta
     

    Examples

    Copy-ready examples from the installed package documentation.

    Install @wrnexus/pwa

    bun add @wrnexus/pwa

    Import @wrnexus/pwa

    import * as pwa from "@wrnexus/pwa";
    - + } } diff --git a/app/pages/packages/queue.wrn b/app/pages/packages/queue.wrn index b3a4bc55..1295f1bc 100644 --- a/app/pages/packages/queue.wrn +++ b/app/pages/packages/queue.wrn @@ -10,7 +10,7 @@ page wrnexusqueue {
    W WRNexusJS - +
    -
    Data · Package reference

    @wrnexus/queue

    Background jobs with delay, concurrency, retry, and repetition.

    v0.8.8Private registryData

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/queue@0.8.8

    Request preview access. Never put registry tokens in source control.

    A background job queue with delays, retries + exponential backoff, recurring jobs, and concurrent workers.
    +
    Data · Package reference

    @wrnexus/queue

    Background jobs with delay, concurrency, retry, and repetition.

    v0.8.14Private registryData

    Install the package

    After WorkRoot approves private registry access, install the package:

    bun add @wrnexus/queue@0.8.14

    Request preview access. Never put registry tokens in source control.

    A background job queue with delays, retries + exponential backoff, recurring jobs, and concurrent workers.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    -

    @wrnexus/queue is a server-side in-process job queue. You register named workers, enqueue jobs (optionally delayed or recurring), and let the queue poll and run them on a timer — with per-job retry limits and doubling backoff between attempts. The default store lives in memory; the design allows a pluggable driver to back it with Redis/SQL for durability across restarts. Reach for it when you need to defer work (emails, webhooks, cleanup) off the request path without a heavyweight external broker. Tests can drive it deterministically via drain().

    +

    @wrnexus/queue is a server-side durable job queue. You register named workers, enqueue jobs (optionally delayed or recurring), and let the queue poll and run them on a timer — with per-job retry limits and doubling backoff between attempts. defineQueue persists to .wrnexus/queue.sqlite by default, while low-level createQueue remains an intentionally in-memory primitive. Reach for it when you need to defer work (emails, webhooks, cleanup) off the request path without a heavyweight external broker. Tests can drive it deterministically via drain().

    bun add @wrnexus/queue
    Private package — the machine must be authenticated to the wrnexus npm org
    (a read token in ~/.npmrc). Requires Bun (Node is not supported).
    @@ -35,7 +35,7 @@ page wrnexusqueue {

    QueueOptions

    -
    OptionTypeDefaultDescription
    maxAttemptsnumber3Default max attempts per job before it is dead-lettered.
    backoffMsnumber1000Base retry backoff in ms; doubles per attempt.
    pollMsnumber250Poll interval used once start() is called (ms).
    onFailed(job: Job, error: unknown) => void—Called when a job exhausts its attempts.
    concurrencynumberunlimitedMaximum jobs claimed by one drain() call.
    capacitynumberunlimitedMaximum queued plus active jobs before adds reject.
    now() => numberDate.nowClock injection for deterministic tests.
    +maxAttemptsnumber3Default max attempts per job before it is dead-lettered.backoffMsnumber1000Base retry backoff in ms; doubles per attempt.pollMsnumber250Poll interval used once start() is called (ms).onFailed(job: Job, error: unknown) => void—Called when a job exhausts its attempts.concurrencynumberunlimitedMaximum jobs claimed by one drain() call.capacitynumberunlimitedOptional maximum queued jobs; omitted queues never scan merely to enforce a hidden cap.now() => numberDate.nowClock injection for deterministic tests.

    Queue

    The object returned by createQueue.

    @@ -61,6 +61,12 @@ page wrnexusqueue { repeat?: number; // if set, re-enqueue this many ms after each success }

    Usage

    +

    Application queues belong in app/queues/*.ts and default-export defineQueue(...). Configure persistence once in wrnexus.config.ts:

    +
    export default {
    +  queue: { storage: "database", databaseName: "default" },
    +  // Or omit queue entirely for .wrnexus/queue.sqlite.
    +};
    +

    Use storage: "memory" only for disposable work. A selected database must exist; WRNexusJS fails startup/first use with a clear error instead of silently falling back. Each job may declare success(data, job) and failed(data, error, job) lifecycle hooks.

    Register workers, enqueue jobs, then start the poller:

    import { createQueue } from "@wrnexus/queue";
     
    @@ -75,6 +81,28 @@ queue.process<{ to: string }>("email", async (job) =&g
     await queue.add("email", { to: "a@b.com" }, { delayMs: 5000, maxAttempts: 3 });
     
     queue.start(); // begin polling; queue.stop() to halt
    +

    Application queues with defineQueue

    +

    WRNexusJS applications can place typed queue modules in app/queues. The dev and production servers discover them, start them after runtime initialization, and shut them down gracefully:

    +
    import { defineQueue } from "@wrnexus/queue";
    +
    +export default defineQueue({
    +  name: "email",
    +  jobs: {
    +    send: {
    +      maxAttempts: 3,
    +      idempotency: ({ messageId }: { messageId: number }) => `message:${messageId}`,
    +      run: async ({ messageId }) => sendMessage(messageId),
    +    },
    +  },
    +});
    +

    Callers get a typed producer and inspection helpers:

    +
    const job = await email.send.add({ messageId: 42 });
    +await email.send.status(job.id);
    +await email.send.cancel(job.id);
    +await email.send.retry(job.id);
    +

    createDurableQueue also exposes start(), stop(), isRunning(), health() and get() so applications do not need to build their own polling middleware.

    +

    SQLite

    +

    Use sqliteQueueStore(db) from @wrnexus/queue/sqlite with a WRNexusJS-compatible SQLite client. installSqliteQueueSchema(db) installs the queue table and its due-job and idempotency indexes.

    Use context.signal in network/database calls so forced shutdown and active cancellation finish promptly. For process termination, prefer await queue.shutdown(); use { force: true } only after your grace period.

    Durable queue

    createDurableQueue({ store }) retains jobs until their handler succeeds and supports atomic leases when a driver implements QueueStore.claim. It exposes the same cancellation/shutdown behavior plus list, failed, and retry. The included memoryQueueStore() is useful for tests; production Redis/SQL drivers should make claim() atomic to prevent two workers executing one job.

    @@ -131,283 +159,14 @@ await engine.approve(workflow, run.id, "approve", currentUser.id);The default store is in-process, so queued jobs do not survive a restart; a

    pluggable driver is intended for backing it with Redis/SQL for durability.

  • Works alongside @wrnexus/core for offloading work from the request path.
  • -

    Complete TypeScript API

    Generated from the exact installed package declarations.

    import { ExecutionContext, Context } from '@wrnexus/core';
    -import { SubjectContext } from '@wrnexus/rpc';
    -
    -/**
    - * Persistence contract for the durable queue.
    - *
    - * Distributed drivers should implement `claim()` atomically and exclude leased
    - * jobs from `due()` until their lease expires. Calling `put()` must replace the
    - * stored record and release any previous lease for that job.
    - */
    -interface QueueStore {
    -    put(job: Job): Promise<void>;
    -    get(id: string): Promise<Job | null>;
    -    remove(id: string): Promise<void>;
    -    due(now: number, limit: number): Promise<Job[]>;
    -    list(name?: string): Promise<Job[]>;
    -    claim?(id: string, worker: string, leaseUntil: number): Promise<boolean>;
    -}
    -declare function memoryQueueStore(): QueueStore;
    -interface DurableQueueOptions {
    -    store?: QueueStore;
    -    workerId?: string;
    -    maxAttempts?: number;
    -    concurrency?: number;
    -    capacity?: number;
    -    leaseMs?: number;
    -    backoff?: (attempt: number) => number;
    -    now?: () => number;
    -    onDeadLetter?: (job: Job, error: unknown) => void | Promise<void>;
    -    context?: (job: Job, signal: AbortSignal) => ExecutionContext;
    -}
    -interface DurableQueue {
    -    add<T>(name: string, data: T, options?: AddOptions): Promise<Job<T>>;
    -    process<T>(name: string, handler: JobHandler<T>): void;
    -    drain(): Promise<number>;
    -    cancel(id: string): Promise<boolean>;
    -    shutdown(options?: {
    -        force?: boolean;
    -    }): Promise<void>;
    -    list(name?: string): Promise<Job[]>;
    -    failed(): Job[];
    -    retry(id: string): Promise<boolean>;
    -}
    -declare function createDurableQueue(options?: DurableQueueOptions): DurableQueue;
    -
    -interface RedisQueueClient {
    -    get(key: string): Promise<string | null>;
    -    set(key: string, value: string, options?: {
    -        NX?: boolean;
    -        PX?: number;
    -    }): Promise<unknown>;
    -    del(...keys: string[]): Promise<unknown>;
    -    zadd(key: string, score: number, member: string): Promise<unknown>;
    -    zrem(key: string, member: string): Promise<unknown>;
    -    zrangebyscore(key: string, min: number, max: number, options?: {
    -        limit: [number, number];
    -    }): Promise<string[]>;
    -    smembers(key: string): Promise<string[]>;
    -    sadd(key: string, member: string): Promise<unknown>;
    -    srem(key: string, member: string): Promise<unknown>;
    -}
    -/** Redis-backed queue store using only the common client command surface. */
    -declare function redisQueueStore(client: RedisQueueClient, prefix?: string): QueueStore;
    -interface SqlQueueClient {
    -    query<T = Record<string, unknown>>(sql: string, parameters?: unknown[]): Promise<{
    -        rows: T[];
    -    }>;
    -}
    -/** PostgreSQL store with atomic SKIP LOCKED leasing and JSON payloads. */
    -declare function postgresQueueStore(db: SqlQueueClient, table?: string): QueueStore;
    -declare const POSTGRES_QUEUE_SCHEMA = "CREATE TABLE IF NOT EXISTS wrnexus_jobs (\n  id text PRIMARY KEY, name text NOT NULL, payload jsonb NOT NULL, run_at bigint NOT NULL,\n  priority integer NOT NULL DEFAULT 0, lease_owner text, lease_until bigint\n); CREATE INDEX IF NOT EXISTS wrnexus_jobs_due ON wrnexus_jobs (run_at, priority DESC);";
    -
    -interface ScheduledJob<T = unknown> {
    -    name: string;
    -    data: T;
    -    everyMs: number;
    -    options?: AddOptions;
    -}
    -interface QueueScheduler {
    -    start(): void;
    -    stop(): void;
    -    tick(now?: number): Promise<number>;
    -    snapshot(): {
    -        running: boolean;
    -        schedules: number;
    -        nextRuns: Record<string, number>;
    -    };
    -}
    -/** Restart-safe scheduler when used with a durable queue and stable idempotency buckets. */
    -declare function createQueueScheduler(queue: DurableQueue, schedules: ScheduledJob[], options?: {
    -    pollMs?: number;
    -    now?: () => number;
    -}): QueueScheduler;
    -declare function addBatch<T>(queue: DurableQueue, name: string, values: T[], options?: AddOptions): Promise<Job<T>[]>;
    -interface QueueDashboardSnapshot {
    -    generatedAt: number;
    -    pending: number;
    -    failed: number;
    -    byName: Record<string, number>;
    -    oldestRunAt?: number;
    -}
    -declare function queueDashboardSnapshot(queue: DurableQueue): Promise<QueueDashboardSnapshot>;
    -declare function renderQueueDashboard(snapshot: QueueDashboardSnapshot): string;
    -/** Long-running scheduler/worker loop suitable for a dedicated process or container. */
    -declare function runQueueDaemon(queue: DurableQueue, scheduler: QueueScheduler, options?: {
    -    signal?: AbortSignal;
    -    pollMs?: number;
    -    onError?: (error: unknown) => void;
    -}): Promise<void>;
    -
    -type WorkflowStatus = "pending" | "running" | "waiting-approval" | "completed" | "failed" | "cancelled";
    -interface WorkflowStep$1<I = unknown, O = unknown> {
    -    name: string;
    -    dependsOn?: string[];
    -    approval?: boolean;
    -    run(input: I, context: WorkflowRunContext): O | Promise<O>;
    -}
    -interface WorkflowRunContext {
    -    workflowId: string;
    -    step: string;
    -    results: Readonly<Record<string, unknown>>;
    -    signal: AbortSignal;
    -    progress(value: number, message?: string): void;
    -}
    -interface WorkflowSnapshot {
    -    id: string;
    -    name: string;
    -    status: WorkflowStatus;
    -    input: unknown;
    -    results: Record<string, unknown>;
    -    completed: string[];
    -    waitingFor?: string;
    -    progress: number;
    -    message?: string;
    -    error?: string;
    -    updatedAt: number;
    -}
    -interface WorkflowStore {
    -    get(id: string): Promise<WorkflowSnapshot | null>;
    -    put(snapshot: WorkflowSnapshot): Promise<void>;
    -    list(): Promise<WorkflowSnapshot[]>;
    -}
    -declare function memoryWorkflowStore(): WorkflowStore;
    -interface WorkflowDefinition<I = unknown> {
    -    name: string;
    -    steps: WorkflowStep$1<any, any>[];
    -    /** Compile-time input marker; definitions do not store runtime input values. */
    -    readonly __input?: I;
    -}
    -interface WorkflowEngine {
    -    start<I>(definition: WorkflowDefinition<I>, input: I, id?: string): Promise<WorkflowSnapshot>;
    -    resume<I>(definition: WorkflowDefinition<I>, id: string): Promise<WorkflowSnapshot>;
    -    approve<I>(definition: WorkflowDefinition<I>, id: string, step: string, actor: string): Promise<WorkflowSnapshot>;
    -    cancel(id: string): Promise<boolean>;
    -    get(id: string): Promise<WorkflowSnapshot | null>;
    -    list(): Promise<WorkflowSnapshot[]>;
    -}
    -declare function createWorkflowEngine(store?: WorkflowStore): WorkflowEngine;
    -declare function defineDurableWorkflow<I>(definition: WorkflowDefinition<I>): WorkflowDefinition<I>;
    -
    -interface SubjectEnvelope<T> {
    -    payload: T;
    -    identity?: string;
    -}
    -interface SubjectJob<T> extends Omit<Job<SubjectEnvelope<T>>, "data"> {
    -    data: T;
    -    subject?: SubjectContext;
    -}
    -interface SubjectQueue {
    -    add<T>(ctx: Context, name: string, data: T, options?: AddOptions): Promise<Job<SubjectEnvelope<T>>>;
    -    process<T>(name: string, handler: (job: SubjectJob<T>, context: {
    -        signal: AbortSignal;
    -    }) => void | Promise<void>): void;
    -}
    -/** Queue adapter that persists a signed end-user context alongside job data. */
    -/** Works with both the in-memory Queue and createDurableQueue(). */
    -declare function subjectQueue(queue: Queue | DurableQueue): SubjectQueue;
    -
    -/**
    - * @wrnexus/queue — a background job queue with delays, retries + backoff, and
    - * concurrent workers. The default store is in-process; a pluggable driver lets
    - * you back it with Redis/SQL for durability across restarts.
    - *
    - *   const queue = createQueue();
    - *   queue.process("email", async (job) => { await send(job.data); });
    - *   await queue.add("email", { to: "a@b.com" }, { delayMs: 5000, maxAttempts: 3 });
    - *   queue.start();                 // begin polling; queue.stop() to halt
    - *
    - * Tests can drive it deterministically with `await queue.drain(now)`.
    - */
    -interface Job<T = unknown> {
    -    id: string;
    -    name: string;
    -    data: T;
    -    attempts: number;
    -    maxAttempts: number;
    -    runAt: number;
    -    /** If set, re-enqueue this job this many ms after each successful run. */
    -    repeat?: number;
    -    priority: number;
    -    idempotencyKey?: string;
    -    createdAt: number;
    -}
    -interface JobContext {
    -    /** Aborted when an active job is cancelled or the queue is force-stopped. */
    -    signal: AbortSignal;
    -    /** The same trusted context shape used by HTTP, actions, realtime and webhooks. */
    -    execution: ExecutionContext;
    -}
    -type JobHandler<T = unknown> = (job: Job<T>, context: JobContext) => void | Promise<void>;
    -interface AddOptions {
    -    /** Delay before the job becomes runnable (ms). */
    -    delayMs?: number;
    -    /** Max attempts before it's dead-lettered. Default from queue options. */
    -    maxAttempts?: number;
    -    /** Re-enqueue this job this many ms after each successful run (recurring). */
    -    repeat?: number;
    -    /** Higher-priority jobs run first when multiple jobs are due. */
    -    priority?: number;
    -    /** Prevent duplicate queued work with the same stable key. */
    -    idempotencyKey?: string;
    -}
    -interface QueueOptions {
    -    /** Default max attempts per job. Default 3. */
    -    maxAttempts?: number;
    -    /** Base retry backoff (ms); doubles per attempt. Default 1000. */
    -    backoffMs?: number;
    -    /** Poll interval when started (ms). Default 250. */
    -    pollMs?: number;
    -    /** Called when a job exhausts its attempts. */
    -    onFailed?: (job: Job, error: unknown) => void;
    -    /** Maximum jobs executed in one drain. Default: unlimited. */
    -    concurrency?: number;
    -    /** Maximum queued + active jobs. Adds reject once this limit is reached. */
    -    capacity?: number;
    -    /** Clock injection (tests). Default Date.now. */
    -    now?: () => number;
    -    context?: (job: Job, signal: AbortSignal) => ExecutionContext;
    -}
    -interface Queue {
    -    add<T>(name: string, data: T, options?: AddOptions): Promise<Job<T>>;
    -    process<T>(name: string, handler: JobHandler<T>): void;
    -    /** Run every job whose runAt ≤ now, once. Returns how many ran. */
    -    drain(now?: number): Promise<number>;
    -    start(): void;
    -    stop(): void;
    -    /** Stop accepting work and wait for active handlers (or abort them). */
    -    shutdown(options?: {
    -        force?: boolean;
    -    }): Promise<void>;
    -    size(): number;
    -    get(id: string): Job | undefined;
    -    list(name?: string): Job[];
    -    cancel(id: string): boolean;
    -    failed(): Job[];
    -    retry(id: string): Promise<boolean>;
    -}
    -interface JobDefinition<I> {
    -    name: string;
    -    options?: Omit<AddOptions, "idempotencyKey">;
    -    run: JobHandler<I>;
    -}
    -declare function defineJob<I>(definition: JobDefinition<I>): JobDefinition<I>;
    -interface WorkflowStep<I, O> {
    -    name: string;
    -    run(input: I): O | Promise<O>;
    -}
    -declare function defineWorkflow<T>(name: string, steps: Array<WorkflowStep<any, any>>): {
    -    name: string;
    -    steps: WorkflowStep<any, any>[];
    -    run(input: T): Promise<unknown>;
    -};
    -declare function cronToInterval(cron: string): number;
    -declare function createQueue(options?: QueueOptions): Queue;
    -
    -export { type AddOptions, type DurableQueue, type DurableQueueOptions, type Job, type JobContext, type JobDefinition, type JobHandler, POSTGRES_QUEUE_SCHEMA, type Queue, type QueueDashboardSnapshot, type QueueOptions, type QueueScheduler, type QueueStore, type RedisQueueClient, type ScheduledJob, type SqlQueueClient, type SubjectJob, type SubjectQueue, type WorkflowDefinition, type WorkflowEngine, type WorkflowRunContext, type WorkflowSnapshot, type WorkflowStatus, type WorkflowStep, type WorkflowStore, addBatch, createDurableQueue, createQueue, createQueueScheduler, createWorkflowEngine, cronToInterval, defineDurableWorkflow, defineJob, defineWorkflow, memoryQueueStore, memoryWorkflowStore, postgresQueueStore, queueDashboardSnapshot, redisQueueStore, renderQueueDashboard, runQueueDaemon, subjectQueue };
    -

    Examples

    Copy-ready examples from the installed package documentation.

    Register workers, enqueue jobs, then start the poller

    import { createQueue } from "@wrnexus/queue";
    +

    Complete TypeScript API

    Generated from the exact installed package declarations.

    export { A as AddOptions, D as DefineQueueOptions, a as DefinedJob, b as DefinedJobOptions, c as DefinedJobs, d as DefinedQueue, e as DurableQueue, f as DurableQueueOptions, J as Job, g as JobContext, h as JobDefinition, i as JobHandler, j as JobStateMachineOptions, k as JobStatus, O as OutboxEntry, l as OutboxWriter, P as POSTGRES_QUEUE_SCHEMA, Q as Queue, m as QueueAdminOptions, n as QueueDashboardSnapshot, o as QueueEvent, p as QueueEventType, q as QueueHealth, r as QueueJobDefinitions, s as QueueJobRecord, t as QueueJobState, u as QueueOptions, v as QueueScheduler, w as QueueStorage, x as QueueStorageConfig, y as QueueStore, R as RedisQueueClient, S as SagaStep, z as ScheduledJob, B as SqlQueueClient, SqliteQueueClient, C as SubjectJob, E as SubjectQueue, W as WorkerDefinition, F as WorkflowDefinition, G as WorkflowEngine, H as WorkflowRunContext, I as WorkflowSnapshot, K as WorkflowStatus, L as WorkflowStep, M as WorkflowStore, N as addBatch, T as configureQueueStorage, U as configuredQueueStore, V as createDurableQueue, X as createQueue, Y as createQueueAdminHandler, Z as createQueueScheduler, _ as createWorkflowEngine, $ as cronToInterval, a0 as databaseQueueStore, a1 as defineDurableWorkflow, a2 as defineJob, a3 as defineJobStateMachine, a4 as defineQueue, a5 as defineSaga, a6 as defineWorker, a7 as defineWorkflow, a8 as drainOutbox, a9 as installDatabaseQueueSchema, aa as installOutboxSchema, installSqliteQueueSchema, ab as memoryQueueStore, ac as memoryWorkflowStore, ad as postgresQueueStore, ae as queueDashboardSnapshot, af as queueStorageConfig, ag as redisQueueStore, ah as renderQueueDashboard, ai as runQueueDaemon, aj as runWorker, sqliteQueueSchema, sqliteQueueStore, ak as subjectQueue, al as testQueue, am as withOutbox } from './sqlite.js';
    +import '@wrnexus/core';
    +import '@wrnexus/db';
    +import '@wrnexus/rpc';
    +

    Examples

    Copy-ready examples from the installed package documentation.

    Configure persistence once in wrnexus.config.ts

    export default {
    +  queue: { storage: "database", databaseName: "default" },
    +  // Or omit queue entirely for .wrnexus/queue.sqlite.
    +};

    Register workers, enqueue jobs, then start the poller

    import { createQueue } from "@wrnexus/queue";
     
     const queue = createQueue({ maxAttempts: 3, backoffMs: 1000 });
     
    @@ -419,34 +178,29 @@ queue.process<{ to: string }>("email", async (job) =&g
     // Enqueue a delayed job with up to 3 attempts.
     await queue.add("email", { to: "a@b.com" }, { delayMs: 5000, maxAttempts: 3 });
     
    -queue.start(); // begin polling; queue.stop() to halt

    Recurring jobs

    queue.process("heartbeat", async () => ping());
    +queue.start(); // begin polling; queue.stop() to halt

    Application queues with defineQueue

    import { defineQueue } from "@wrnexus/queue";
    +
    +export default defineQueue({
    +  name: "email",
    +  jobs: {
    +    send: {
    +      maxAttempts: 3,
    +      idempotency: ({ messageId }: { messageId: number }) => `message:${messageId}`,
    +      run: async ({ messageId }) => sendMessage(messageId),
    +    },
    +  },
    +});

    Application queues with defineQueue

    const job = await email.send.add({ messageId: 42 });
    +await email.send.status(job.id);
    +await email.send.cancel(job.id);
    +await email.send.retry(job.id);

    Recurring jobs

    queue.process("heartbeat", async () => ping());
     await queue.add("heartbeat", {}, { repeat: 60_000 }); // runs ~every minute

    Handling permanent failures

    const queue = createQueue({
       onFailed: (job, error) => {
         console.error(`job ${job.id} (${job.name}) gave up`, error);
       },
    -});

    Deterministic testing

    let clock = 0;
    -const queue = createQueue({ now: () => clock });
    -
    -queue.process("task", async () => {
    -  /* ... */
    -});
    -await queue.add("task", {}, { delayMs: 5000 });
    -
    -clock = 5000;
    -const ran = await queue.drain(); // => 1

    Durable workflows and approvals

    const workflow = defineDurableWorkflow({
    -  name: "publish-report",
    -  steps: [
    -    { name: "build", run: buildReport },
    -    { name: "approve", dependsOn: ["build"], approval: true, run: (report) => report },
    -    { name: "publish", dependsOn: ["approve"], run: publishReport },
    -  ],
    -});
    -
    -const run = await engine.start(workflow, input);
    -await engine.approve(workflow, run.id, "approve", currentUser.id);
    - +}); + - + } } diff --git a/app/pages/packages/reactive.wrn b/app/pages/packages/reactive.wrn index 1ea8464e..58f72f35 100644 --- a/app/pages/packages/reactive.wrn +++ b/app/pages/packages/reactive.wrn @@ -10,7 +10,7 @@ page wrnexusreactive {
    W WRNexusJS - +
    -
    Frontend · Package reference

    @wrnexus/reactive

    Small type-safe reactive signal primitives.

    v0.8.8Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/reactive@0.8.8

    Request preview access. Never put registry tokens in source control.

    Tiny, type-safe reactive primitives (signals) with zero dependencies.
    +
    Frontend · Package reference

    @wrnexus/reactive

    Small type-safe reactive signal primitives.

    v0.8.9Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the package:

    bun add @wrnexus/reactive@0.8.9

    Request preview access. Never put registry tokens in source control.

    Tiny, type-safe reactive primitives (signals) with zero dependencies.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    @wrnexus/reactive is the seed of WRNexusJS's reactivity layer: a minimal signal primitive that holds a value, notifies subscribers when it changes, and hands back an unsubscribe function. It is deliberately small and framework-agnostic — it powers nothing on its own, but is shaped so client islands (and later the .wrn compiler's state blocks) can build reactive bindings on top of it. Reach for it when you need observable state without pulling in a full reactivity library.

    @@ -189,7 +189,26 @@ declare function createTimeline(steps: TimelineStep[], options?: { frame?: (callback: () => void) => unknown; }): AnimationTimeline; -export { type AnimationTimeline, type Cleanup, type HistorySignal, type ReactiveContext, type ReactiveScope, type ReadonlySignal, type Resource, type ResourceOptions, type ResourceStatus, type Signal, type Subscriber, type TimelineStep, type Unsubscribe, type UrlStateOptions, type WatchOptions, batch, computed, createContextProvider, createScope, createTimeline, effect, historySignal, mountPortal, resource, signal, transition, untrack, urlSignal, watch }; +interface FormState<T extends Record<string, unknown>> { + values: Signal<T>; + errors: Signal<Partial<Record<keyof T, string>>>; + submitting: Signal<boolean>; + dirty: ReadonlySignal<boolean>; + field<K extends keyof T>(name: K): { + value: T[K]; + onInput(payload: { + value?: unknown; + checked?: boolean; + }): void; + }; + set<K extends keyof T>(name: K, value: T[K]): void; + reset(next?: T): void; + validate(): Promise<boolean>; + submit<R>(operation: (values: T) => R | Promise<R>): Promise<R>; +} +declare function useForm<T extends Record<string, unknown>>(initial: T, validator?: (values: T) => Partial<Record<keyof T, string>> | Promise<Partial<Record<keyof T, string>>>): FormState<T>; + +export { type AnimationTimeline, type Cleanup, type FormState, type HistorySignal, type ReactiveContext, type ReactiveScope, type ReadonlySignal, type Resource, type ResourceOptions, type ResourceStatus, type Signal, type Subscriber, type TimelineStep, type Unsubscribe, type UrlStateOptions, type WatchOptions, batch, computed, createContextProvider, createScope, createTimeline, effect, historySignal, mountPortal, resource, signal, transition, untrack, urlSignal, useForm, watch };

    Examples

    Copy-ready examples from the installed package documentation.

    Typical usage

    import { signal } from "@wrnexus/reactive";
     
     const count = signal(0);
    @@ -212,7 +231,7 @@ const user: Signal<{ name: string } | null> = signal(null);
     user.set({ name: "Ada" });
    - + } } diff --git a/app/pages/packages/realtime.wrn b/app/pages/packages/realtime.wrn index 0e273cce..0d2e4669 100644 --- a/app/pages/packages/realtime.wrn +++ b/app/pages/packages/realtime.wrn @@ -10,7 +10,7 @@ page wrnexusrealtime {
    W WRNexusJS - +
    -
    Realtime · Package reference

    @wrnexus/realtime

    Rooms, presence, messaging, history, streams, and UI components.

    v0.8.8Private registryRealtime

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/realtime@0.8.8

    Request preview access. Never put registry tokens in source control.

    Typed rooms, secure message envelopes, browser room helpers, presence utilities, and complete realtime UI blocks for WRNexusJS.

    +
    Realtime · Package reference

    @wrnexus/realtime

    Rooms, presence, messaging, history, streams, and UI components.

    v0.8.10Private registryRealtime

    Install the package

    After WorkRoot approves private registry access, install the package:

    bun add @wrnexus/realtime@0.8.10

    Request preview access. Never put registry tokens in source control.

    Typed rooms, secure message envelopes, browser room helpers, presence utilities, and complete realtime UI blocks for WRNexusJS.

    Server rooms

    import { defineRoom } from "@wrnexus/realtime";
     
    @@ -159,7 +159,7 @@ interface BrowserRoomConnection {
         close(): void;
     }
     interface WrnexusRealtimeWindow extends Window {
    -    wire?: {
    +    wrn?: {
             room?: (name: string, query?: string) => BrowserRoomConnection;
         };
     }
    @@ -273,7 +273,7 @@ history.acknowledge("support", clientId, entry.sequence);
     const missed = history.resume("support", clientId);
    - + } } diff --git a/app/pages/packages/router.wrn b/app/pages/packages/router.wrn index 21eb63e9..5d805df8 100644 --- a/app/pages/packages/router.wrn +++ b/app/pages/packages/router.wrn @@ -10,7 +10,7 @@ page wrnexusrouter {
    W WRNexusJS - +
    -
    Core · Package reference

    @wrnexus/router

    Filesystem discovery, route matching, and typed route generation.

    v0.8.8Private registryCore

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/router@0.8.8

    Request preview access. Never put registry tokens in source control.

    File-based router that maps an app/ directory onto route tables and matches request paths against them.
    +
    Core · Package reference

    @wrnexus/router

    Filesystem discovery, route matching, and typed route generation.

    v0.8.10Private registryCore

    Install the package

    After WorkRoot approves private registry access, install the package:

    bun add @wrnexus/router@0.8.10

    Request preview access. Never put registry tokens in source control.

    File-based router that maps an app/ directory onto route tables and matches request paths against them.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    @wrnexus/router scans an application's app/ directory once at startup and builds route tables for pages, API endpoints, realtime channels, middleware, server-rendered .wrn components, layouts, and validation schemas. It also compiles URL patterns (/users/[id]) into RegExps and matches request paths against them. Request input is never turned into a file path, which makes the router immune to path traversal. This is a server-side package used by the WRNexusJS runtime to resolve incoming requests, plus a codegen helper for compile-time typed links.

    @@ -250,6 +250,8 @@ interface Router { authz: ComponentRef[]; /** Service implementations (`app/services/<name>.ts`) mounted for inter-app calls. */ services: ComponentRef[]; + /** Background queues (`app/queues/<name>.ts`) loaded and started with the server. */ + queues?: ComponentRef[]; matchPage(pathname: string): RouteMatch | null; matchApi(pathname: string): RouteMatch | null; matchRealtime(pathname: string): RouteMatch | null; @@ -312,7 +314,7 @@ const routes = sortRoutes([{ raw: "/posts/[slug]", file: " const m = matchRoute(routes, "/posts/hello"); // { route, params: { slug: "hello" } }
    - + } } diff --git a/app/pages/packages/security.wrn b/app/pages/packages/security.wrn index 941411ae..bbff9d30 100644 --- a/app/pages/packages/security.wrn +++ b/app/pages/packages/security.wrn @@ -10,7 +10,7 @@ page wrnexussecurity {
    W WRNexusJS - +
    -
    Security · Package reference

    @wrnexus/security

    Security headers, CSRF protection, rate limits, and safe rendering.

    v0.8.8Private registrySecurity

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/security@0.8.8

    Request preview access. Never put registry tokens in source control.

    Secure-by-default utilities for WRNexusJS: bounded HTML-safe serialization, prototype-pollution rejection, URL policy, secure cookies, request hardening, security presets, and SSRF-safe remote fetches.

    +
    Security · Package reference

    @wrnexus/security

    Security headers, CSRF protection, rate limits, and safe rendering.

    v0.8.9Private registrySecurity

    Install the package

    After WorkRoot approves private registry access, install the package:

    bun add @wrnexus/security@0.8.9

    Request preview access. Never put registry tokens in source control.

    Secure-by-default utilities for WRNexusJS: bounded HTML-safe serialization, prototype-pollution rejection, URL policy, secure cookies, request hardening, security presets, and SSRF-safe remote fetches.

    import { safeFetch, securityPreset, setSecureCookie } from "@wrnexus/security";
     
     export default { security: securityPreset("strict") };
    @@ -65,7 +65,7 @@ const response = await safeFetch(remoteUrl, { allowedHosts: ["api.exam
     setSecureCookie(ctx, "__Host-session", sessionId);

    Install @wrnexus/security

    bun add @wrnexus/security
    - + } } diff --git a/app/pages/packages/ssr.wrn b/app/pages/packages/ssr.wrn index 806de103..085eef1a 100644 --- a/app/pages/packages/ssr.wrn +++ b/app/pages/packages/ssr.wrn @@ -10,7 +10,7 @@ page wrnexusssr {
    W WRNexusJS - +
    -
    Runtime · Package reference

    @wrnexus/ssr

    Secure HTML document rendering and SEO metadata.

    v0.8.8Private registryRuntime

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/ssr@0.8.8

    Request preview access. Never put registry tokens in source control.

    Server-side rendering: wraps a page's HTML body in a complete HTML document with a metadata-driven <head>.
    +
    Runtime · Package reference

    @wrnexus/ssr

    Secure HTML document rendering and SEO metadata.

    v0.8.12Private registryRuntime

    Install the package

    After WorkRoot approves private registry access, install the package:

    bun add @wrnexus/ssr@0.8.12

    Request preview access. Never put registry tokens in source control.

    Server-side rendering: wraps a page's HTML body in a complete HTML document with a metadata-driven <head>.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    Pages in WRNexusJS return an HTML string for the body. @wrnexus/ssr takes that body and produces a full HTML document — building the <head> from page metadata and global SEO defaults, resolving canonical/Open Graph/Twitter tags, and injecting module preloads and <script type="module"> tags. It is deliberately server-only: nothing in this package touches the DOM or ships to the browser, keeping server code genuinely server-only. Reach for it on the server when turning a rendered page body into a response document.

    @@ -77,7 +77,7 @@ const html = renderDocument({ }, url: new URL("https://acme.example/about"), body: "<h1>About Us</h1>", - scripts: ["/_wire/runtime.js", "/_wire/islands/about.js"], + scripts: ["/_wrn/runtime.js", "/_wrn/islands/about.js"], htmlAttrs: ' data-theme="dark"', }); @@ -213,7 +213,7 @@ const html = renderDocument({ }, url: new URL("https://acme.example/about"), body: "<h1>About Us</h1>", - scripts: ["/_wire/runtime.js", "/_wire/islands/about.js"], + scripts: ["/_wrn/runtime.js", "/_wrn/islands/about.js"], htmlAttrs: ' data-theme="dark"', }); @@ -230,7 +230,7 @@ return new Response(html, { return new Response(html, { headers: { "content-type": "text/html; charset=utf-8" } });
    - + } } diff --git a/app/pages/packages/store.wrn b/app/pages/packages/store.wrn index 4ebb3257..b2448479 100644 --- a/app/pages/packages/store.wrn +++ b/app/pages/packages/store.wrn @@ -10,7 +10,7 @@ page wrnexusstore {
    W WRNexusJS - +
    -
    Data · Package reference

    @wrnexus/store

    Application state stores shared across server and browser runtimes.

    v0.8.8Private registryData

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/store@0.8.8

    Request preview access. Never put registry tokens in source control.

    Typed global and page-scoped WRNexusJS stores with runtime-specific state, computed values, actions, lifecycle hooks, persistence, SSR isolation, and HMR support.

    +
    Data · Package reference

    @wrnexus/store

    Application state stores shared across server and browser runtimes.

    v0.8.12Private registryData

    Install the package

    After WorkRoot approves private registry access, install the package:

    bun add @wrnexus/store@0.8.12

    Request preview access. Never put registry tokens in source control.

    Typed global and page-scoped WRNexusJS stores with runtime-specific state, computed values, actions, lifecycle hooks, persistence, SSR isolation, and HMR support.

    Use defineStore() to declare a store and createStoreContainer() to create an isolated request or browser container. Store definitions are framework helpers and do not require UI components.

    Complete TypeScript API

    Generated from the exact installed package declarations.

    import { StoreMutation, StoreFunction, StoreDefinition, StoreInstance, StoreCombinedState } from './types.js';
     export { PersistenceStorage, StoreActionContext, StoreActionDefinition, StoreInstanceCore, StoreKind, StoreLifecycleContext, StorePersistenceConfig, StoreRuntime } from './types.js';
     
    @@ -68,7 +68,7 @@ export { StoreCombinedState, StoreContainer, type StoreContainerOptions, St
     

    Examples

    Copy-ready examples from the installed package documentation.

    Install @wrnexus/store

    bun add @wrnexus/store

    Import @wrnexus/store

    import * as store from "@wrnexus/store";
    - + } } diff --git a/app/pages/packages/styles.wrn b/app/pages/packages/styles.wrn index 08a2fbeb..e240d967 100644 --- a/app/pages/packages/styles.wrn +++ b/app/pages/packages/styles.wrn @@ -10,7 +10,7 @@ page wrnexusstyles {
    W WRNexusJS - +
    -
    Frontend · Package reference

    @wrnexus/styles

    CSS pipeline, themes, fonts, profiles, and application config.

    v0.8.8Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/styles@0.8.8

    Request preview access. Never put registry tokens in source control.

    Reusable layers and presets

    +
    Frontend · Package reference

    @wrnexus/styles

    CSS pipeline, themes, fonts, profiles, and application config.

    v0.8.26Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the package:

    bun add @wrnexus/styles@0.8.26

    Request preview access. Never put registry tokens in source control.

    Reusable layers and presets

    Compose local or package foundations in order; later layers override earlier ones and the application has final base-config precedence:

    export default defineConfig({
       extends: ["@workroot/wrnexus-enterprise", "./layers/company"],
       profiles: { production: { port: 8080 } },
     });

    A directory layer exports wrnexus.layer.ts (JavaScript/MJS are supported). A package can provide that conventional file or declare wrnexus.layer in its package.json. Layers may extend other layers and carry the complete app configuration, including plugins that contribute layouts, components, routes, middleware, and migrations. plugins and head compose; other arrays intentionally replace earlier values. Cycles and missing/invalid entries fail with stable WRN-CONFIG-LAYER-* diagnostics. wrnexus config --explain lists every resolved layer source.

    -
    Global CSS bundling, the --wire-* design-token theme system, and the wrnexus.config.ts app-config loader for WRNexusJS apps.
    +
    Global CSS bundling, the --wrn-* design-token theme system, and the wrnexus.config.ts app-config loader for WRNexusJS apps.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    +

    Production CSS inlining

    +

    styles.inlineMaxBytes controls the maximum uncompressed size of the combined production stylesheet to embed in the document. The default is 4096 bytes; 0 disables inlining. A measured first-visit optimization can use, for example, styles: { inlineMaxBytes: 128 * 1024 }. Larger limits remove a blocking stylesheet request but repeat the CSS in each HTML response. Stylesheets containing relative asset URLs stay external so their URL base does not change. Theme switching and the separately served stylesheet remain available.

    This package owns three server-side concerns that shape every page a WRNexusJS app renders:

    -

    1. Global stylesheet pipeline — finds app/styles/global.css (or aggregates app/styles/*.css), bundles it with Bun's CSS bundler (which resolves @import, including from node_modules), and produces one stylesheet that is <link>ed into every page's <head>. Because it is a plain global sheet, it styles server-rendered markup and hydrated client islands identically. A custom process hook lets you swap in Tailwind / PostCSS / Sass. 2. Theme system — design tokens exposed as CSS custom properties (--wire-<key>), with built-in light/dark sets, deep-merged user overrides, an SSR <html data-theme> render (no flash), and a tiny client runtime to toggle/persist the choice. 3. App config — loads wrnexus.config.ts (the AppConfig type), applies named profile overrides, and loads the .env cascade.

    +

    1. Global stylesheet pipeline — finds app/styles/global.css (or aggregates app/styles/*.css), bundles it with Bun's CSS bundler (which resolves @import, including from node_modules), and produces one stylesheet that is <link>ed into every page's <head>. Because it is a plain global sheet, it styles server-rendered markup and hydrated client islands identically. A custom process hook lets you swap in Tailwind / PostCSS / Sass. 2. Theme system — design tokens exposed as CSS custom properties (--wrn-<key>), with built-in light/dark sets, deep-merged user overrides, an SSR <html data-theme> render (no flash), and a tiny client runtime to toggle/persist the choice. 3. App config — loads wrnexus.config.ts (the AppConfig type), applies named profile overrides, and loads the .env cascade.

    It runs server-side / at build time. Reach for it when configuring an app, defining themes, or customising how global CSS is produced.

    bun add @wrnexus/styles
    Private package — the machine must be authenticated to the wrnexus npm org
    @@ -70,8 +72,8 @@ interface StyleProcessContext {

    Theme system

    -
    ExportType / SignaturePurpose
    DEFAULT_THEMESRecord<string, ThemeTokens>Built-in light and dark token maps.
    THEME_COOKIE"wire-theme"Cookie the resolved theme is read from / persisted to.
    THEME_CSS_HREF"/__wrnexus/theme.css"URL the generated theme stylesheet is served at.
    THEME_JS_HREF"/__wrnexus/theme.js"URL the client theme runtime is served at.
    resolveThemeConfig(config?: ThemeConfig) => ResolvedThemeDeep-merge the user's theme config over the defaults; pick the default theme (config's default if valid, else dark, else the first).
    resolveThemeName`(cookieValue: string \undefined, theme: ResolvedTheme) => string`Pick a valid theme name from a cookie, falling back to theme.default.
    renderThemeCss(theme: ResolvedTheme) => stringGenerate the theme stylesheet: a :root{…} default plus one [data-theme="<name>"]{…} block per theme.
    renderThemeRuntime(theme: ResolvedTheme) => stringGenerate the client runtime (see below).
    -

    Tokens are emitted as --wire-<key> custom properties, except the reserved key color-scheme, which is emitted as the native color-scheme CSS property so form controls and scrollbars match the theme.

    +DEFAULT_THEMESRecord<string, ThemeTokens>Built-in light and dark token maps.THEME_COOKIE"wrn-theme"Cookie the resolved theme is read from / persisted to.THEME_CSS_HREF"/__wrnexus/theme.css"URL the generated theme stylesheet is served at.THEME_JS_HREF"/__wrnexus/theme.js"URL the client theme runtime is served at.resolveThemeConfig(config?: ThemeConfig) => ResolvedThemeDeep-merge the user's theme config over the defaults; pick the default theme (config's default if valid, else dark, else the first).resolveThemeName`(cookieValue: string \undefined, theme: ResolvedTheme) => string`Pick a valid theme name from a cookie, falling back to theme.default.renderThemeCss(theme: ResolvedTheme) => stringGenerate the theme stylesheet: a :root{…} default plus one [data-theme="<name>"]{…} block per theme.renderThemeRuntime(theme: ResolvedTheme) => stringGenerate the client runtime (see below). +

    Tokens are emitted as --wrn-<key> custom properties, except the reserved key color-scheme, which is emitted as the native color-scheme CSS property so form controls and scrollbars match the theme.

    ThemeConfig / ThemeTokens / ResolvedTheme:

    type ThemeTokens = Record<string, string>;
     
    @@ -102,7 +104,26 @@ interface ResolvedTheme {
         danger: "#dc2626",
       },
     }
    -

    The client runtime (renderThemeRuntime) exposes window.wireTheme with { get, set, toggle, bind, themes }, wires up any [data-wire-theme-toggle] and [data-wire-theme-set] elements on load, and persists the choice to the wire-theme cookie (max-age 1 year, samesite=lax). toggle() cycles through the configured theme names in order.

    +

    The client runtime (renderThemeRuntime) exposes window.wrnTheme with { get, set, toggle, bind, themes }, connects up any [data-wrn-theme-toggle] and [data-wrn-theme-set] elements on load, and persists the choice to the wrn-theme cookie (max-age 1 year, samesite=lax). toggle() cycles through the configured theme names in order.

    +

    Shared browser cookies

    +

    Set one cookie policy for theme, accent, language, and application cookies:

    +
    export default {
    +  cookies: {
    +    defaults: {
    +      domain: "example.com",
    +      path: "/",
    +      maxAge: 31_536_000,
    +      sameSite: "Lax",
    +      secure: true,
    +    },
    +    language: { maxAge: 2_592_000 },
    +  },
    +} satisfies AppConfig;
    +

    The theme, accent, and language switchers use this policy automatically. Client functions can use the same resolved policy for other values:

    +
    window.wrnCookies.set("dashboard-view", "compact");
    +window.wrnCookies.set("locale-preview", "hi", "language");
    +const value = window.wrnCookies.get("dashboard-view");
    +window.wrnCookies.remove("dashboard-view");

    Usage

    wrnexus.config.ts

    import type { AppConfig } from "@wrnexus/styles";
    @@ -174,20 +195,20 @@ const themeCss = renderThemeCss(theme); // served at THEME_CSS_HREF
     const themeJs = renderThemeRuntime(theme); // served at THEME_JS_HREF

    In templates, consume tokens via the custom properties:

    .card {
    -  background: var(--wire-color-surface);
    -  color: var(--wire-color-text);
    -  border: 1px solid var(--wire-color-border);
    -  border-radius: var(--wire-radius);
    -  box-shadow: var(--wire-shadow-1);
    +  background: var(--wrn-color-surface);
    +  color: var(--wrn-color-text);
    +  border: 1px solid var(--wrn-color-border);
    +  border-radius: var(--wrn-radius);
    +  box-shadow: var(--wrn-shadow-1);
     }
    -
    <button data-wire-theme-toggle>Toggle theme</button>
    -<button data-wire-theme-set="brand">Brand theme</button>
    +
    <button data-wrn-theme-toggle>Toggle theme</button>
    +<button data-wrn-theme-set="brand">Brand theme</button>

    Requirements / Notes

    • Bun-only. bundleCss uses Bun.build's CSS bundler for @import resolution, nesting, and minification. Node is not supported.
    • Config and env loading use node:fs / node:path / node:url and read from process.env.
    • Peer package: @wrnexus/core supplies the SeoConfig and SecurityConfig types referenced by AppConfig.
    • -
    • The bundled global stylesheet, the theme stylesheet (THEME_CSS_HREF), and the theme runtime (THEME_JS_HREF) are wired into pages by the framework's server; this package only produces their contents.
    • +
    • The bundled global stylesheet, the theme stylesheet (THEME_CSS_HREF), and the theme runtime (THEME_JS_HREF) are connected into pages by the framework's server; this package only produces their contents.

    Complete TypeScript API

    Generated from the exact installed package declarations.

    import { PerformanceBudgets, SeoConfig, SecurityConfig } from '@wrnexus/core';
     import { PluginInput, PluginPermission } from '@wrnexus/plugin';
     import { StorageConfig } from '@wrnexus/uploader';
    @@ -195,7 +216,7 @@ import { StorageConfig } from '@wrnexus/uploader';
     /**
      * Theme system - design tokens that work SSR and client-side.
      *
    - * Tokens are plain CSS custom properties (`--wire-<key>`) so they cascade and
    + * Tokens are plain CSS custom properties (`--wrn-<key>`) so they cascade and
      * can be overridden by user CSS. Each theme is a flat token map; the framework
      * ships default `light`/`dark` sets and the user's config deep-merges over them.
      *
    @@ -205,7 +226,7 @@ import { StorageConfig } from '@wrnexus/uploader';
      * emitted as the native CSS property instead of a custom property.
      */
     type ThemeSemanticColor = "primary" | "secondary" | "info" | "success" | "warning" | "danger" | "error";
    -type ThemeToken = "color-scheme" | "color-bg" | "color-background" | "color-foreground" | "color-surface" | "color-surface-2" | "color-surface-raised" | "color-surface-muted" | "color-surface-soft" | "color-text" | "color-text-muted" | "color-text-subtle" | "color-muted" | "color-border" | "color-border-strong" | "color-code-background" | "color-code-surface" | "color-code-text" | "color-code-muted" | "color-code-border" | `color-${ThemeSemanticColor}` | `color-${ThemeSemanticColor}-${"hover" | "active" | "contrast" | "soft" | "muted" | "text"}` | `color-on-${"primary" | "secondary"}` | "radius" | "radius-sm" | "shadow-1" | "shadow-sm" | "shadow-md" | "shadow-lg" | "space-section" | "space-section-sm" | "container-max" | "font-sans";
    +type ThemeToken = "color-scheme" | "color-bg" | "color-background" | "color-foreground" | "color-surface" | "color-surface-2" | "color-surface-raised" | "color-surface-muted" | "color-surface-soft" | "color-text" | "color-text-muted" | "color-text-subtle" | "color-muted" | "color-border" | "color-border-strong" | "color-code-background" | "color-code-surface" | "color-code-text" | "color-code-muted" | "color-code-border" | `color-${ThemeSemanticColor}` | `color-${ThemeSemanticColor}-${"hover" | "active" | "contrast" | "soft" | "muted" | "text"}` | `color-on-${"primary" | "secondary"}` | "radius" | "radius-sm" | "radius-md" | "radius-lg" | "control-height-sm" | "control-height" | "control-height-lg" | "space-panel" | "font-size-ui" | "shadow-1" | "shadow-2" | "shadow-3" | "shadow-sm" | "shadow-md" | "shadow-lg" | "space-section" | "space-section-sm" | "container-max" | "font-sans";
     /** Known tokens get autocomplete while applications may add namespaced custom tokens. */
     type ThemeTokens = Partial<Record<ThemeToken, string>> & Record<string, string>;
     declare function defineThemeTokens<T extends ThemeTokens>(tokens: T): T;
    @@ -227,7 +248,7 @@ interface CustomThemePalette {
     }
     interface ThemeAccentConfig {
         /**
    -     * Accent used when no `wire-accent` cookie is present.
    +     * Accent used when no `wrn-accent` cookie is present.
          *
          * - Omitted: use the named `palette`, or `blue` when no palette is configured.
          * - `false`: keep the configured base palette until the user explicitly picks an accent.
    @@ -235,13 +256,49 @@ interface ThemeAccentConfig {
         default?: ThemePaletteName | false;
         /** Runtime-selectable accent names. Defaults to every built-in THEME_PALETTE. */
         options?: ThemePaletteName[];
    +    /** Cookie scope used to persist the selected accent across related applications. */
    +    cookie?: ThemeCookieConfig;
     }
    +interface ThemeCookieConfig {
    +    /** Parent domain shared by related applications, for example `localhost` or `.example.com`. */
    +    domain?: string;
    +    /** Cookie path. Defaults to `/`. */
    +    path?: string;
    +    /** SameSite policy. Defaults to `Lax`. */
    +    sameSite?: "Strict" | "Lax" | "None";
    +    /** Force or disable Secure. When omitted it follows the current protocol. */
    +    secure?: boolean;
    +    /** Cookie lifetime in seconds. Defaults to one year. */
    +    maxAge?: number;
    +}
    +type BrowserCookieOptions = ThemeCookieConfig;
    +/** Shared browser-cookie policy with optional per-preference overrides. */
    +interface BrowserCookiesConfig {
    +    defaults?: BrowserCookieOptions;
    +    theme?: BrowserCookieOptions;
    +    accent?: BrowserCookieOptions;
    +    language?: BrowserCookieOptions;
    +}
    +type BrowserCookiePreference = "theme" | "accent" | "language";
    +interface BrowserCookieApi {
    +    readonly config: BrowserCookiesConfig;
    +    get(name: string): string | null;
    +    options(preference?: BrowserCookiePreference | BrowserCookieOptions, override?: BrowserCookieOptions): BrowserCookieOptions;
    +    set(name: string, value: string, preference?: BrowserCookiePreference | BrowserCookieOptions, override?: BrowserCookieOptions): void;
    +    remove(name: string, preference?: BrowserCookiePreference | BrowserCookieOptions, override?: BrowserCookieOptions): void;
    +}
    +declare global {
    +    interface Window {
    +        wrnCookies: BrowserCookieApi;
    +    }
    +}
    +declare function resolveBrowserCookieOptions(config: BrowserCookiesConfig | undefined, preference: BrowserCookiePreference, override?: BrowserCookieOptions): BrowserCookieOptions;
     interface ThemeConfig {
         /** Built-in palette name, or a complete custom semantic color palette. */
         palette?: ThemePaletteName | CustomThemePalette;
         /** Runtime accent/palette switcher configuration. */
         accent?: ThemeAccentConfig;
    -    /** Name of the theme used when no `wire-theme` cookie is present. */
    +    /** Name of the theme used when no `wrn-theme` cookie is present. */
         default?: string;
         /** Named token maps. Deep-merged over the framework's built-in light/dark. */
         themes?: Record<string, ThemeTokens>;
    @@ -252,10 +309,13 @@ interface ResolvedTheme {
         themes: Record<string, ThemeTokens>;
         defaultAccent?: ThemePaletteName;
         accentNames: ThemePaletteName[];
    +    accentCookie?: ThemeCookieConfig;
    +    themeCookie?: ThemeCookieConfig;
    +    cookies?: BrowserCookiesConfig;
     }
     /** Cookies used by the SSR renderer and client runtime. */
    -declare const THEME_COOKIE = "wire-theme";
    -declare const ACCENT_COOKIE = "wire-accent";
    +declare const THEME_COOKIE = "wrn-theme";
    +declare const ACCENT_COOKIE = "wrn-accent";
     declare const THEME_CSS_HREF = "/__wrnexus/theme.css";
     declare const THEME_CSS_PREFIX = "/__wrnexus/theme/";
     declare const THEME_JS_HREF = "/__wrnexus/theme.js";
    @@ -267,7 +327,7 @@ declare const THEME_PALETTES: Record<ThemePaletteName, CustomThemePalette>
     /** Built-in themes so components have tokens out of the box. */
     declare const DEFAULT_THEMES: Record<string, ThemeTokens>;
     /** Merge the user's theme config over the built-in defaults. */
    -declare function resolveThemeConfig(config?: ThemeConfig): ResolvedTheme;
    +declare function resolveThemeConfig(config?: ThemeConfig, cookies?: BrowserCookiesConfig): ResolvedTheme;
     /** Pick a valid theme name from a cookie value, falling back to the default. */
     declare function resolveThemeName(cookieValue: string | undefined, theme: ResolvedTheme): string;
     /** Pick a valid accent name from a cookie value, falling back to the configured default. */
    @@ -285,8 +345,8 @@ declare function renderActiveThemeCss(theme: ResolvedTheme, themeName: string, a
      */
     declare function renderThemeCss(theme: ResolvedTheme): string;
     /**
    - * Generate the client theme runtime. It exposes `window.wireTheme` and
    - * `window.wireAccent`, and binds theme/accent controls.
    + * Generate the client theme runtime. It exposes `window.wrnTheme` and
    + * `window.wrnAccent`, and binds theme/accent controls.
      *
      * The runtime changes only data attributes and cookies. It never writes inline
      * CSS variables and never uses localStorage, so CSS and SSR remain the single
    @@ -368,26 +428,6 @@ declare function fontCspSources(fonts?: FontConfig): {
         font: string[];
     };
     
    -declare const CURRENT_COMPATIBILITY_DATE = "2026-08-02";
    -declare const CURRENT_FRAMEWORK_BEHAVIOUR = 1;
    -interface CompatibilityPolicy {
    -    compatibilityDate?: string;
    -    frameworkBehaviour?: number;
    -}
    -interface CompatibilityReport {
    -    configuredDate?: string;
    -    effectiveDate: string;
    -    currentDate: string;
    -    configuredBehaviour?: number;
    -    effectiveBehaviour: number;
    -    currentBehaviour: number;
    -    needsUpgrade: boolean;
    -    future: boolean;
    -    messages: string[];
    -}
    -declare function isCompatibilityDate(value: string): boolean;
    -declare function resolveCompatibility(policy: CompatibilityPolicy): CompatibilityReport;
    -
     /**
      * App configuration loader (`wrnexus.config.ts`).
      *
    @@ -416,6 +456,8 @@ interface StylesConfig {
         entry?: string;
         /** Include the complete @wrnexus/ui component catalog stylesheet. Default true. */
         includeUi?: boolean;
    +    /** Maximum uncompressed production CSS bytes to inline in the document. Default 4096; 0 disables inlining. Larger limits trade repeat HTML bytes for one fewer blocking request. */
    +    inlineMaxBytes?: number;
         /**
          * Optional custom processor. Return the final CSS string. Use this to run
          * Tailwind, PostCSS, Sass, etc. When omitted, the built-in Bun CSS bundler is
    @@ -589,20 +631,11 @@ interface TypesConfig {
         generateDeclarations?: boolean;
         globalTypes?: string;
     }
    -interface FunctionsConfig {
    -    legacyDefaultRuntime?: "current" | "client" | "server" | "shared";
    -}
     interface StoresConfig {
         strictMutations?: boolean;
         persistence?: boolean;
     }
    -interface CompatibilityConfig {
    -    legacyEmit?: boolean;
    -    legacyEventProps?: boolean;
    -    legacyComponentDiscovery?: boolean;
    -    stringLayouts?: boolean;
    -}
    -interface AppConfig extends CompatibilityPolicy {
    +interface AppConfig {
         /** Ordered reusable configuration layers; the application always has final precedence. */
         extends?: string | string[];
         /** Compiler/dev/build plugins, resolved in deterministic pre/normal/post order. */
    @@ -616,12 +649,8 @@ interface AppConfig extends CompatibilityPolicy {
         imports?: ImportsConfig;
         /** TypeScript-backed .wrn type checking and declaration generation. */
         types?: TypesConfig;
    -    /** Legacy function runtime behavior for existing applications. */
    -    functions?: FunctionsConfig;
         /** Typed global/page store behavior. */
         stores?: StoresConfig;
    -    /** Temporary v0.5 syntax compatibility switches. */
    -    compatibility?: CompatibilityConfig;
         /** Opt-in APIs that are not yet covered by stable compatibility guarantees. */
         experimental?: ExperimentalConfig;
         /** Route and asset budgets plus build analyzer behavior. */
    @@ -655,6 +684,8 @@ interface AppConfig extends CompatibilityPolicy {
         fonts?: FontConfig;
         /** Design-token themes (deep-merged over the built-in light/dark). */
         theme?: ThemeConfig;
    +    /** Shared client cookie policy used by theme, accent, language, and window.wrnCookies. */
    +    cookies?: BrowserCookiesConfig;
         /** i18n: default language + supported locales (strings live in app/locales/*.json). */
         i18n?: {
             default?: string;
    @@ -665,6 +696,7 @@ interface AppConfig extends CompatibilityPolicy {
             cookie?: {
                 name?: string;
                 maxAge?: number;
    +            domain?: string;
                 path?: string;
                 sameSite?: "Strict" | "Lax" | "None";
                 secure?: boolean;
    @@ -676,6 +708,34 @@ interface AppConfig extends CompatibilityPolicy {
             driver: "sqlite" | "postgres" | "mysql" | "mongo";
             url: string;
         };
    +    /** Background-job persistence. Defaults to durable `.wrnexus/queue.sqlite`. */
    +    queue?: {
    +        storage?: "sqlite" | "database" | "memory";
    +        databaseName?: string;
    +        table?: string;
    +        dashboard?: {
    +            enabled?: boolean;
    +            path?: string;
    +            permission?: string;
    +        };
    +    };
    +    /** Driver-neutral mail defaults consumed by @wrnexus/mail/application drivers. */
    +    mail?: {
    +        from?: string;
    +        queue?: string | boolean;
    +        sandbox?: {
    +            enabled?: boolean;
    +            allowlist?: string[];
    +        };
    +    };
    +    /** Payment gateway configuration consumed by @wrnexus/payment. */
    +    payment?: {
    +        default: string;
    +        currency?: string;
    +        sandbox?: boolean;
    +        databaseName?: string;
    +        gateways?: Record<string, Record<string, unknown>>;
    +    };
         /**
          * File-upload storage. Declare named stores (local dir or S3-compatible),
          * upload with `handleUpload`/`upload` from `@wrnexus/uploader`, and serve
    @@ -711,6 +771,13 @@ interface AppConfig extends CompatibilityPolicy {
          */
         profiles?: Record<string, Partial<Omit<AppConfig, "profiles">>>;
     }
    +/** User-authored configuration; retained as an explicit name for API clarity. */
    +type AppConfigInput = AppConfig;
    +/** Configuration after profile/layer resolution. Required input fields stay required. */
    +type ResolvedAppConfig<T extends AppConfig = AppConfig> = Omit<AppConfig, "extends" | "profiles"> & Omit<T, "extends" | "profiles"> & {
    +    readonly extends?: undefined;
    +    readonly profiles?: undefined;
    +};
     /**
      * Resolve the active profile name: explicit argument > `WRNEXUS_PROFILE` env var
      * > a mode-based default ("production" in prod, else "development").
    @@ -727,7 +794,7 @@ declare function resolveConfigLayers(appRoot: string, application: AppConfig): P
     /** Load the raw `wrnexus.config.*` (with the `profiles` map intact), or `{}`. */
     declare function loadRawConfig(appRoot: string): Promise<AppConfig>;
     /** Load `wrnexus.config.*`, applying the active profile's overrides. */
    -declare function loadAppConfig(appRoot: string, profile?: string): Promise<AppConfig>;
    +declare function loadAppConfig(appRoot: string, profile?: string): Promise<ResolvedAppConfig>;
     /**
      * Load the `.env` cascade for a profile into `process.env`, WITHOUT clobbering
      * variables already set in the real environment (which always win). Order, low
    @@ -740,7 +807,7 @@ interface ConfigIssue {
         severity: "error" | "warning";
         message: string;
     }
    -declare function defineConfig(config: AppConfig): AppConfig;
    +declare function defineConfig<const T extends AppConfig>(config: T): T;
     declare function validateAppConfig(config: AppConfig): ConfigIssue[];
     interface ExplainedConfig {
         profile: string;
    @@ -783,7 +850,7 @@ interface CssTokenAudit {
         unused: string[];
     }
     /** Audit framework design-token declarations and var() references. */
    -declare function auditWireTokens(css: string): CssTokenAudit;
    +declare function auditWrnTokens(css: string): CssTokenAudit;
     interface StyleSource {
         path: string;
         reason?: string;
    @@ -823,7 +890,7 @@ declare function auditCssPerformance(source: string): CssPerformanceAuditIssue[]
      */
     declare function renderStyles(ctx: StyleProcessContext, styles?: StylesConfig): Promise<string>;
     
    -export { ACCENT_COOKIE, type AppConfig, type BuildConfig, CURRENT_COMPATIBILITY_DATE, CURRENT_FRAMEWORK_BEHAVIOUR, type CompatibilityPolicy, type CompatibilityReport, type ConfigIssue, type ContrastResult, type CssPerformanceAuditIssue, type CssTokenAudit, type CustomThemePalette, DEFAULT_THEMES, type DevToolbarConfig, type ExperimentalConfig, type ExplainedConfig, type FontConfig, type FontDisplay, type GoogleFont, type LocalFontFace, type MobileConfig, type Mode, type NavigationConfig, type ObservabilityConfig, type PerformanceConfig, type PwaConfig, type ResolvedConfigLayers, type ResolvedTheme, type StyleProcessContext, type StyleSource, type StylesConfig, type Mode as StylesMode, THEME_COOKIE, THEME_CSS_HREF, THEME_CSS_PREFIX, THEME_JS_HREF, THEME_PALETTES, THEME_PALETTE_NAMES, type TenancyConfig, type ThemeAccentConfig, type ThemeConfig, type ThemePaletteName, type ThemeSemanticColor, type ThemeToken, type ThemeTokens, activeThemeCssHref, auditCssPerformance, auditWireTokens, bundleCss, contrast, defineConfig, defineThemeTokens, explainAppConfig, findStyleEntry, fontCspSources, headToString, isCompatibilityDate, loadAppConfig, loadEnv, loadRawConfig, normalizeStyleSources, renderActiveThemeCss, renderFontHead, renderProductionFontHead, renderStyles, renderThemeCss, renderThemeRuntime, resolveAccentName, resolveCompatibility, resolveConfigLayers, resolveProfile, resolveThemeConfig, resolveThemeName, tailwindSourceDirectives, themeVar, validateAppConfig };
    +export { ACCENT_COOKIE, type AppConfig, type AppConfigInput, type BrowserCookieApi, type BrowserCookieOptions, type BrowserCookiePreference, type BrowserCookiesConfig, type BuildConfig, type ConfigIssue, type ContrastResult, type CssPerformanceAuditIssue, type CssTokenAudit, type CustomThemePalette, DEFAULT_THEMES, type DevToolbarConfig, type ExperimentalConfig, type ExplainedConfig, type FontConfig, type FontDisplay, type GoogleFont, type LocalFontFace, type MobileConfig, type Mode, type NavigationConfig, type ObservabilityConfig, type PerformanceConfig, type PwaConfig, type ResolvedAppConfig, type ResolvedConfigLayers, type ResolvedTheme, type StyleProcessContext, type StyleSource, type StylesConfig, type Mode as StylesMode, THEME_COOKIE, THEME_CSS_HREF, THEME_CSS_PREFIX, THEME_JS_HREF, THEME_PALETTES, THEME_PALETTE_NAMES, type TenancyConfig, type ThemeAccentConfig, type ThemeConfig, type ThemeCookieConfig, type ThemePaletteName, type ThemeSemanticColor, type ThemeToken, type ThemeTokens, activeThemeCssHref, auditCssPerformance, auditWrnTokens, bundleCss, contrast, defineConfig, defineThemeTokens, explainAppConfig, findStyleEntry, fontCspSources, headToString, loadAppConfig, loadEnv, loadRawConfig, normalizeStyleSources, renderActiveThemeCss, renderFontHead, renderProductionFontHead, renderStyles, renderThemeCss, renderThemeRuntime, resolveAccentName, resolveBrowserCookieOptions, resolveConfigLayers, resolveProfile, resolveThemeConfig, resolveThemeName, tailwindSourceDirectives, themeVar, validateAppConfig };
     

    Examples

    Copy-ready examples from the installed package documentation.

    wrnexus.config.ts

    import type { AppConfig } from "@wrnexus/styles";
     
     export default {
    @@ -887,16 +954,16 @@ const active = resolveThemeName(cookies[THEME_COOKIE], theme);
     
     const themeCss = renderThemeCss(theme); // served at THEME_CSS_HREF
     const themeJs = renderThemeRuntime(theme); // served at THEME_JS_HREF

    Rendering the theme

    .card {
    -  background: var(--wire-color-surface);
    -  color: var(--wire-color-text);
    -  border: 1px solid var(--wire-color-border);
    -  border-radius: var(--wire-radius);
    -  box-shadow: var(--wire-shadow-1);
    -}

    Rendering the theme

    <button data-wire-theme-toggle>Toggle theme</button>
    -<button data-wire-theme-set="brand">Brand theme</button>
    - + background: var(--wrn-color-surface); + color: var(--wrn-color-text); + border: 1px solid var(--wrn-color-border); + border-radius: var(--wrn-radius); + box-shadow: var(--wrn-shadow-1); +}

    Rendering the theme

    <button data-wrn-theme-toggle>Toggle theme</button>
    +<button data-wrn-theme-set="brand">Brand theme</button>
    +
    - + } } diff --git a/app/pages/packages/syntax.wrn b/app/pages/packages/syntax.wrn index f830ad4b..40bb7ae6 100644 --- a/app/pages/packages/syntax.wrn +++ b/app/pages/packages/syntax.wrn @@ -10,7 +10,7 @@ page wrnexussyntax {
    W WRNexusJS - +
    -
    Frontend · Package reference

    @wrnexus/syntax

    Editor syntax definitions and language tooling for .wrn files.

    v0.8.8Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/syntax@0.8.8

    Request preview access. Never put registry tokens in source control.

    Canonical WRN lexer, parser, AST, language metadata, source positions, and stable diagnostics. Framework tooling should import this package instead of implementing a separate .wrn parser.

    -

    See docs/WRN-LANGUAGE-SPEC-1.0.md in the WRNexusJS repository.

    Complete TypeScript API

    Generated from the exact installed package declarations.

    export { LexError, Lexer } from './tokenizer.js';
    +      
    Frontend · Package reference

    @wrnexus/syntax

    Editor syntax definitions and language tooling for .wrn files.

    v0.8.19Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the package:

    bun add @wrnexus/syntax@0.8.19

    Request preview access. Never put registry tokens in source control.

    Canonical WRN lexer, parser, AST, language metadata, source positions, and stable diagnostics. Framework tooling should import this package instead of implementing a separate .wrn parser.

    +

    See docs/WRN-LANGUAGE-SPEC-1.0.md in the WRNexusJS repository.

    Complete TypeScript API

    Generated from the exact installed package declarations.

    export { LexError, Lexer, skipLiteralOrComment } from './tokenizer.js';
     export { FormatWrnOptions, formatWrn } from './formatter.js';
    -export { A as ActionBlock, a as ApiBlock, b as Attr, C as ComputedDecl, D as DataApiBlock, c as DataMode, E as EffectBlock, d as EventDecl, F as FunctionParameterDecl, e as FunctionRuntime, L as LifecycleBlock, f as LoadBlock, M as ModeFunctionsBlock, O as OutputDecl, P as PageAst, g as ParseError, h as PersistDecl, i as PropDecl, R as RealtimeBlock, j as RealtimeHandler, k as RuntimeFunctionDecl, S as SeoBlock, l as StateDecl, m as StateRuntime, n as StoreKind, o as StoreLifecycleDecl, p as StructuredImportDecl, V as VOID_ELEMENTS, q as ViewNode, W as WatchBlock, r as parse, s as parseComputedDeclarations, t as parseHtmlView, u as parseOutputs, v as parsePersist, w as parseRuntimeFunctions, x as parseStateDeclarations, y as parseStoreLifecycle, z as parseStructuredImports, B as stripRuntimeFunctionModifiers } from './parser-CTLO4mcT.js';
    +export { A as ActionBlock, a as ApiBlock, b as Attr, C as ComputedDecl, D as DataApiBlock, c as DataMode, E as EffectBlock, d as EventDecl, F as FunctionParameterDecl, e as FunctionRuntime, L as LifecycleBlock, f as LoadBlock, M as ModeFunctionsBlock, O as OutputDecl, P as PageAst, g as ParseError, h as PersistDecl, i as PropDecl, R as RealtimeBlock, j as RealtimeHandler, k as RuntimeFunctionDecl, S as SeoBlock, l as StateDecl, m as StateRuntime, n as StoreKind, o as StoreLifecycleDecl, p as StructuredImportDecl, V as VOID_ELEMENTS, q as ViewNode, W as WatchBlock, r as parse, s as parseComputedDeclarations, t as parseHtmlView, u as parseOutputs, v as parsePersist, w as parseRuntimeFunctions, x as parseStateDeclarations, y as parseStoreLifecycle, z as parseStructuredImports, B as stripRuntimeFunctionModifiers } from './parser-DI-7cM1V.js';
     export { RuntimeType, eraseFunctionTypes, inferredRuntimeType, runtimeTypeOf, validateTypedInitializer } from './types.js';
     import { WrnDiagnostic } from './diagnostics.js';
     export { DiagnoseOptions, WrnDiagnosticSeverity, WrnSourcePosition, assertValidAst, classifyParseError, containsReadonlyPropMutation, diagnose, diagnosticFromError, formatDiagnostic, isHydrationStrategy, isRuntimeTarget, positionAt } from './diagnostics.js';
     export { WRN_DIAGNOSTIC_CODES, WRN_HYDRATION_STRATEGIES, WRN_LANGUAGE_VERSION, WRN_ROOT_KINDS, WRN_ROOT_MEMBERS, WRN_RUNTIME_TARGETS, WrnHydrationStrategy, WrnRootKind, WrnRootMember, WrnRuntimeTarget } from './spec.js';
     
    +interface InterpolationSegment {
    +    expression: string;
    +    start: number;
    +    end: number;
    +}
    +/** Extract top-level `{...}` expressions while preserving nested object/array literals. */
    +declare function extractInterpolations(value: string): InterpolationSegment[];
    +
     /** Current stable syntax contract. Bump only when parsers/codegen need migration. */
     declare const WRN_SYNTAX_VERSION: "0.4";
     type WrnSyntaxFeature = "typed-declarations" | "layouts" | "server-client-blocks" | "effects" | "watch" | "lifecycle" | "embedded-api" | "realtime" | "runtime-markers";
    @@ -47,7 +55,7 @@ declare function diagnosticSummary(diagnostics: readonly WrnDiagnostic[]): {
     };
     declare function supportsSyntaxFeature(feature: string): feature is WrnSyntaxFeature;
     
    -export { type SourceRange, WRN_SYNTAX_FEATURES, WRN_SYNTAX_VERSION, WrnDiagnostic, type WrnSyntaxFeature, createSourceRange, diagnosticSummary, sliceSource, supportsSyntaxFeature };
    +export { type InterpolationSegment, type SourceRange, WRN_SYNTAX_FEATURES, WRN_SYNTAX_VERSION, WrnDiagnostic, type WrnSyntaxFeature, createSourceRange, diagnosticSummary, extractInterpolations, sliceSource, supportsSyntaxFeature };
     

    Examples

    Copy-ready examples from the installed package documentation.

    Parse a WRNexusJS document

    import { parse } from "@wrnexus/syntax";
     
     const ast = parse('component Greeting { view { <p>Hello</p> } }');

    Summarize syntax diagnostics

    import { diagnose, diagnosticSummary } from "@wrnexus/syntax";
    @@ -55,7 +63,7 @@ const ast = parse('component Greeting { view { <p>Hello</p>
     const summary = diagnosticSummary(diagnose(source));
    - + } } diff --git a/app/pages/packages/test.wrn b/app/pages/packages/test.wrn index e49bf16f..794849a0 100644 --- a/app/pages/packages/test.wrn +++ b/app/pages/packages/test.wrn @@ -10,7 +10,7 @@ page wrnexustest {
    W WRNexusJS - +
    -
    Tooling · Package reference

    @wrnexus/test

    WRNexusJS-aware component, route, and browser testing utilities.

    v0.8.8Private registryTooling

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/test@0.8.8

    Request preview access. Never put registry tokens in source control.

    Testing utilities for WRNexusJS apps — component rendering, reactive-DOM mounting, route handler calls, and a full in-process app harness, plus a one-import re-export of bun:test.
    +
    Tooling · Package reference

    @wrnexus/test

    WRNexusJS-aware component, route, and browser testing utilities.

    v0.8.16Private registryTooling

    Install the package

    After WorkRoot approves private registry access, install the package:

    bun add @wrnexus/test@0.8.16

    Request preview access. Never put registry tokens in source control.

    Testing utilities for WRNexusJS apps — component rendering, reactive-DOM mounting, route handler calls, and a full in-process app harness, plus a one-import re-export of bun:test.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    @wrnexus/test is the server-side test toolkit you reach for when writing tests for a WRNexusJS app. It runs under bun test (invoked via wrnexus test) and gives you a single import surface: the bun:test primitives (test, expect, mock, …) re-exported alongside WRNexusJS-aware helpers that compile .wrn components, hydrate server HTML in a DOM, invoke API route handlers, and boot the real app on an ephemeral port for integration tests.

    @@ -114,18 +114,33 @@ test("health endpoint", async () => {

    lazily; it's a dev dependency, not a runtime dependency of this package).

  • Works with the rest of the WRNexusJS toolchain:
  • [@wrnexus/compiler](../compiler) (compiles .wrn sources), [@wrnexus/core](../core) (Context / createContext), [@wrnexus/csr](../csr) (reactive runtime for mountHtml), [@wrnexus/dev-server](../dev-server) (startServer behind createHarness), and [@wrnexus/styles](../styles) (config/env/profile loading for the harness).

    -

    Complete TypeScript API

    Generated from the exact installed package declarations.

    import { ProblemDetails, Context } from '@wrnexus/core';
    +

    Complete TypeScript API

    Generated from the exact installed package declarations.

    import { Context, ProblemDetails } from '@wrnexus/core';
     export { createContext } from '@wrnexus/core';
     export { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, mock, spyOn, test } from 'bun:test';
     
     interface TestRequestOptions extends Omit<RequestInit, "body"> {
         body?: BodyInit | Record<string, unknown> | URLSearchParams | FormData | null;
         baseUrl?: string;
    +    params?: Record<string, string>;
    +    user?: unknown;
    +    locals?: Record<string, unknown>;
     }
     /** Build a web-standard Request with convenient JSON/FormData handling. */
     declare function testRequest(path?: string, options?: TestRequestOptions): Request;
     /** Create a complete Context suitable for middleware and route unit tests. */
     declare function testContext(path?: string, options?: TestRequestOptions): Context;
    +/** Preferred descriptive alias for testContext(). */
    +declare const createTestContext: typeof testContext;
    +/** Fluent, Bun-compatible fetch mock (including Bun.fetch.preconnect). */
    +type FetchMock = typeof fetch & {
    +    readonly calls: ReadonlyArray<{
    +        input: string | URL | Request;
    +        init?: RequestInit;
    +    }>;
    +    respondOnce(response: Response | (() => Response | Promise<Response>)): FetchMock;
    +    reset(): void;
    +};
    +declare function createFetchMock(): FetchMock;
     interface JsonResponse<T> {
         response: Response;
         body: T;
    @@ -185,6 +200,29 @@ declare function captureBrowserArtifacts(page: BrowserArtifactPage, testName: st
         trace?: string;
     }>;
     
    +interface MutationCase<T> {
    +    name: string;
    +    value: T;
    +}
    +interface MutationReport<O> {
    +    baseline: O;
    +    killed: string[];
    +    survived: string[];
    +}
    +interface DetectMutationsOptions<T, O> {
    +    baseline: T;
    +    mutations: Array<MutationCase<T>>;
    +    exercise(value: T): O | Promise<O>;
    +    equivalent?(left: O, right: O): boolean;
    +}
    +/**
    + * Run the same behavioural probe against a baseline and explicit mutations.
    + * A mutation survives when the observable result is unchanged. The helper
    + * throws with every survivor by default, making it suitable for an ordinary
    + * Bun test and CI without a second runner or source-rewriting process.
    + */
    +declare function detectMutations<T, O>(options: DetectMutationsOptions<T, O>): Promise<MutationReport<O>>;
    +
     /**
      * @wrnexus/test — testing utilities for WRNexusJS apps. Runs on `bun test` (via
      * `wrnexus test`). Import everything from one place:
    @@ -239,8 +277,10 @@ interface HarnessOptions {
      * up your test database/env. Remember to `await app.close()`.
      */
     declare function createHarness(projectRoot: string, options?: HarnessOptions): Promise<Harness>;
    +/** Preferred full-stack name; retained alongside createHarness for compatibility. */
    +declare const createTestApp: typeof createHarness;
     
    -export { type BrowserArtifactPage, type Deferred, type Harness, type HarnessOptions, type JsonResponse, MemoryCookieJar, type TestRequestOptions, type TransactionalDatabase, type WaitForOptions, callRoute, captureBrowserArtifacts, createFactory, createHarness, deferred, expectProblem, mountHtml, readJsonResponse, renderComponent, testContext, testRequest, waitFor, withDatabaseRollback };
    +export { type BrowserArtifactPage, type Deferred, type DetectMutationsOptions, type FetchMock, type Harness, type HarnessOptions, type JsonResponse, MemoryCookieJar, type MutationCase, type MutationReport, type TestRequestOptions, type TransactionalDatabase, type WaitForOptions, callRoute, captureBrowserArtifacts, createFactory, createFetchMock, createHarness, createTestApp, createTestContext, deferred, detectMutations, expectProblem, mountHtml, readJsonResponse, renderComponent, testContext, testRequest, waitFor, withDatabaseRollback };
     

    Examples

    Copy-ready examples from the installed package documentation.

    The CLI supports focused suites by file or directory convention

    wrnexus test unit                 # *.unit.test.ts or test/unit/**
     wrnexus test component            # *.component.test.ts or test/component/**
     wrnexus test api                  # *.api.test.ts or test/api/**
    @@ -273,7 +313,7 @@ test("health endpoint", async () => {
     });
    - + } } diff --git a/app/pages/packages/tracking.wrn b/app/pages/packages/tracking.wrn index 3dbaf045..e7377bd2 100644 --- a/app/pages/packages/tracking.wrn +++ b/app/pages/packages/tracking.wrn @@ -10,7 +10,7 @@ page wrnexustracking {
    W WRNexusJS - +
    -
    Runtime · Package reference

    @wrnexus/tracking

    Error/event capture, middleware, filtering, and sinks.

    v0.8.8Private registryRuntime

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/tracking@0.8.8

    Request preview access. Never put registry tokens in source control.

    Error tracking for WRNexusJS apps: capture exceptions manually or via middleware and fan them out to pluggable sinks.
    +
    Runtime · Package reference

    @wrnexus/tracking

    Error/event capture, middleware, filtering, and sinks.

    v0.8.8Private registryRuntime

    Install the package

    After WorkRoot approves private registry access, install the package:

    bun add @wrnexus/tracking@0.8.8

    Request preview access. Never put registry tokens in source control.

    Error tracking for WRNexusJS apps: capture exceptions manually or via middleware and fan them out to pluggable sinks.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    @wrnexus/tracking is a small, server-side error-capture layer. You create a tracker with one or more sinks, then feed it errors — either manually with tracker.capture(err, context) or automatically by mounting tracker.middleware() in your request pipeline. A consoleSink is included; forwarding to Sentry, Datadog, or any other backend is just a matter of writing a tiny sink. Reach for it when you want a single, sink-agnostic place to route application errors. Sinks run best-effort — a throwing sink never breaks the request.

    @@ -205,7 +205,7 @@ const tracker = createTracker({ tracker.addSink(anotherSink); // add more sinks later
    - + } } diff --git a/app/pages/packages/typecheck.wrn b/app/pages/packages/typecheck.wrn index 8c194c9a..d32d5386 100644 --- a/app/pages/packages/typecheck.wrn +++ b/app/pages/packages/typecheck.wrn @@ -10,7 +10,7 @@ page wrnexustypecheck {
    W WRNexusJS - +
    -
    Tooling · Package reference

    @wrnexus/typecheck

    WRN-aware TypeScript diagnostics and virtual documents.

    v0.8.8Private registryTooling

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/typecheck@0.8.8

    Request preview access. Never put registry tokens in source control.

    Static type checking for .wrn declarations, props, state, outputs, functions, stores, and generated virtual TypeScript files.

    -

    The package is compiler tooling rather than a browser UI package, so its public kit consists of programmatic typecheck helpers and diagnostics.

    Complete TypeScript API

    Generated from the exact installed package declarations.

    import { PageAst } from '@wrnexus/syntax';
    +      
    Tooling · Package reference

    @wrnexus/typecheck

    WRN-aware TypeScript diagnostics and virtual documents.

    v0.8.17Private registryTooling

    Install the package

    After WorkRoot approves private registry access, install the package:

    bun add @wrnexus/typecheck@0.8.17

    Request preview access. Never put registry tokens in source control.

    Static type checking for .wrn declarations, props, state, outputs, functions, stores, and generated virtual TypeScript files.

    +

    The package is compiler tooling rather than a browser UI package, so its public kit consists of programmatic typecheck helpers and diagnostics.

    +

    View attribute {t:key} segments are translation markers, not TypeScript expressions. Ordinary expressions in the same attribute remain typechecked. Inline event bindings accept statement lists, with event.currentTarget typed as the bound HTML/SVG element. Nullable DOM queries still require normal guards.

    Complete TypeScript API

    Generated from the exact installed package declarations.

    import { PageAst } from '@wrnexus/syntax';
     export { componentContract, storeContract } from './contracts.js';
     export { findAppRoot, loadApplicationTypes } from './project.js';
     
    @@ -71,7 +72,7 @@ export { type TypecheckOptions, type VirtualTypeScriptModule, type WrnTypeD
     

    Examples

    Copy-ready examples from the installed package documentation.

    Install @wrnexus/typecheck

    bun add @wrnexus/typecheck

    Import @wrnexus/typecheck

    import * as typecheck from "@wrnexus/typecheck";
    - + } } diff --git a/app/pages/packages/ui.wrn b/app/pages/packages/ui.wrn index ceefa9c7..744362cb 100644 --- a/app/pages/packages/ui.wrn +++ b/app/pages/packages/ui.wrn @@ -10,7 +10,7 @@ page wrnexusui {
    W WRNexusJS - +
    -
    Frontend · Package reference

    @wrnexus/ui

    Themeable server-rendered UI components and CSS.

    v0.8.8Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/ui@0.8.8

    Request preview access. Never put registry tokens in source control.

    First-party Wire UI component library — a set of themeable .wrn components plus a single tokenized stylesheet.
    +
    Frontend · Package reference

    @wrnexus/ui

    Themeable server-rendered UI components and CSS.

    v0.8.88Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the package:

    bun add @wrnexus/ui@0.8.88

    Request preview access. Never put registry tokens in source control.

    First-party WRNexusJS UI component library — a set of themeable .wrn components plus a single tokenized stylesheet.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    -

    @wrnexus/ui ships a library of server-rendered .wrn components (layout, form controls, and feedback UI) together with one themeable stylesheet, ui.css. The components are auto-discovered by the framework router — you don't import them in code. Once the package's component directory is on the router's scan path, you mount any component in a page with data-component="<name>". Every visual is driven by var(--wire-*) theme tokens, so components restyle instantly when the theme changes. The tiny JS surface (src/index.ts) exists only so the toolchain (CLI build + dev server) can locate the component directory and stylesheet.

    -

    The complete PDF-aligned catalog currently contains 85 components. The generated COMPONENTS.md and component-reference.json files document every mount name, prop, inferred type, default/required status, slot, event, category, and source file directly from the packaged .wrn source.

    +

    @wrnexus/ui ships a library of server-rendered .wrn components (layout, form controls, and feedback UI) together with one themeable stylesheet, ui.css. The components are auto-discovered by the framework router — you don't import them in code. Once the package's component directory is on the router's scan path, you mount any component in a page with data-component="<name>". Every visual is driven by var(--wrn-*) theme tokens, so components restyle instantly when the theme changes. The tiny JS surface (src/index.ts) exists only so the toolchain (CLI build + dev server) can locate the component directory and stylesheet.

    +

    The complete catalog currently contains 102 components. The generated COMPONENTS.md and component-reference.json files document every mount name, prop, inferred type, default/required status, slot, event, category, and source file directly from the packaged .wrn source.

    bun add @wrnexus/ui
    Private package — the machine must be authenticated to the wrnexus npm org
    (a read token in ~/.npmrc). Requires Bun (Node is not supported).
    -

    In practice you rarely install this directly: @wrnexus/cli and @wrnexus/dev-server already depend on it and wire it into the router for you (see [Auto-discovery](#auto-discovery)).

    +

    In practice you rarely install this directly: @wrnexus/cli and @wrnexus/dev-server already depend on it and wrn it into the router for you (see [Auto-discovery](#auto-discovery)).

    Components

    Components live as .wrn files under packages/ui/components/. The canonical mount name comes from the component declaration (for example, component Button mounts as data-component="Button"). Component lookup is case-insensitive, so existing lowercase mounts continue to work. Each component accepts a class prop (appended to its root element), and most render their body from either a named prop or the default slot.

    Layout

    @@ -38,18 +38,65 @@ page wrnexusui {

    Core / feedback

    -
    NamePurposeKey props
    buttonButtonlabel, variant (default\primary\danger\ghost), size (sm\md\lg), type
    inputText inputsee source
    textareaMulti-line inputsee source
    checkboxCheckboxsee source
    badgeSmall status badgelabel, variant
    alertCallout boxvariant (info\success\danger\warning), title, message
    cardPadded, bordered surfaceclass
    avatarUser avatarsee source
    spinnerLoading indicatorsee source
    disclosureExpandable details/summarysee source
    theme-toggleTheme switch button (binds data-wire-theme-toggle)label
    +buttonButtonlabel, variant (default\primary\danger\ghost), size (sm\md\lg), typeinputText inputsee sourcetextareaMulti-line inputsee sourcecheckboxCheckboxsee sourcebadgeSmall status badgelabel, variantalertCallout boxvariant (info\success\danger\warning), title, messagecardPadded, bordered surfaceclassavatarUser avatarsee sourcespinnerLoading indicatorsee sourcedisclosureExpandable details/summarysee sourcetheme-toggleTheme switch button (binds data-wrn-theme-toggle)label

    Additional controls & data display

    Also shipped: select, radio, switch, progress, tag, skeleton, tooltip, table, FAQAccordion, AnnouncementBar, and BackToTop.

    The PDF-defined minimum release and essential build-first set also includes typed typography, form primitives, loading actions, combobox and multi-select, time/date-time and recurring schedule controls, confirmation dialogs, data tables, filters, desktop/mobile navigation, mega menus, marketing/product/legal page shells, product and metric cards, FAQ composition, pricing comparison, SDK tabs, legal navigation, and cookie preferences.

    Seo and StructuredData remain framework/page concerns rather than body components: use the native page seo { ... } block and document-head APIs so metadata is emitted in <head> instead of invalid component markup.

    The authoritative, always-current list is uiComponentNames() (below), which reads the component directory at runtime.

    For the full catalog, see [COMPONENTS.md](./COMPONENTS.md). The machine-readable equivalent is exported as @wrnexus/ui/component-reference.json.

    +

    Typed Navbar items

    +

    Keep navigation data in a shared TypeScript module and validate it with the package contract. NavbarItem is a discriminated union of link, dropdown, and mega; a mega item accepts every MegaMenu layout option.

    +
    import type { NavbarItem } from "@wrnexus/ui";
    +
    +export const navigation = [
    +  { type: "link", label: "Pricing", href: "/pricing" },
    +  {
    +    type: "dropdown",
    +    label: "Company",
    +    items: [
    +      { label: "About", href: "/about" },
    +      { label: "Contact", href: "/contact" },
    +    ],
    +  },
    +  {
    +    type: "mega",
    +    label: "Products",
    +    mega: {
    +      variant: "icon-grid",
    +      panelWidth: "2xl",
    +      columnCount: 3,
    +      rail: [{ label: "All products", href: "/products" }],
    +      columns: [
    +        {
    +          heading: "Work",
    +          items: [
    +            {
    +              label: "Projects",
    +              href: "/products/projects",
    +              icon: "icon-[lucide--folders]",
    +              description: "Plan and deliver work",
    +              badge: "New",
    +            },
    +          ],
    +        },
    +      ],
    +      featured: {
    +        title: "What's new",
    +        actionLabel: "Explore",
    +        actionHref: "/new",
    +      },
    +      actionLabel: "View all products",
    +      actionHref: "/products",
    +    },
    +  },
    +] satisfies NavbarItem[];
    +

    Importing from @wrnexus/ui/navigation is also supported. Existing untyped Navbar data using children remains accepted at runtime for migration.

    API

    The JS module (@wrnexus/ui) exposes five helpers used by the build tooling to locate the component assets. There is no component code to import — the components are .wrn files rendered server-side.

    -
    ExportSignatureReturns
    uiComponentsDir() => stringAbsolute path to the .wrn component directory (feed to buildRouter's componentDirs).
    uiCssPath() => stringAbsolute path to ui.css.
    uiCss() => stringThe ui.css file contents (all .wire-* classes, themed via tokens).
    uiComponentNames() => string[]Sorted list of declared built-in component names.
    uiComponentPath(name: string) => stringAbsolute source path for a declared component name or case-insensitive alias.
    +uiComponentsDir() => stringAbsolute path to the .wrn component directory (feed to buildRouter's componentDirs).uiCssPath() => stringAbsolute path to ui.css.uiCss() => stringThe ui.css file contents (all .wrn-* classes, themed via tokens).uiComponentNames() => string[]Sorted list of declared built-in component names.uiComponentPath(name: string) => stringAbsolute source path for a declared component name or case-insensitive alias.

    ./ui.css asset export

    package.json also exposes the raw stylesheet as a subpath asset:

    "exports": {
    @@ -59,24 +106,24 @@ page wrnexusui {
     

    The framework serves this stylesheet once at /__wrnexus/ui.css, so pages get all component styles from a single request.

    Component styles and motion

    Components own their BEM styles in local style {} blocks and do not require a Tailwind scan. ui.css supplies only global tokens, resets, and shared primitives. Applications can still use Tailwind independently in their own source files.

    -

    The shared stylesheet gives all component boundaries consistent, GPU-friendly entry and interaction motion. Override --wire-motion-fast, --wire-motion-base, --wire-motion-slow, --wire-ease-standard, or --wire-ease-emphasized to tune it. Hover lift is limited to precise pointing devices and prefers-reduced-motion is honored automatically.

    +

    The shared stylesheet gives all component boundaries consistent, GPU-friendly entry and interaction motion. Override --wrn-motion-fast, --wrn-motion-base, --wrn-motion-slow, --wrn-ease-standard, or --wrn-ease-emphasized to tune it. Hover lift is limited to precise pointing devices and prefers-reduced-motion is honored automatically.

    Using the selected theme in application UI

    The active theme and palette are not limited to @wrnexus/ui components. The framework exposes the resolved values as semantic CSS custom properties, so pages and custom .wrn components can use the same contract:

    .account-card {
    -  background: var(--wire-color-surface);
    -  color: var(--wire-color-text);
    -  border: 1px solid var(--wire-color-border);
    +  background: var(--wrn-color-surface);
    +  color: var(--wrn-color-text);
    +  border: 1px solid var(--wrn-color-border);
     }
     
     .account-card__action {
    -  background: var(--wire-color-primary);
    -  color: var(--wire-color-primary-contrast);
    +  background: var(--wrn-color-primary);
    +  color: var(--wrn-color-primary-contrast);
     }
    -

    Stable no-spacing helper classes are also available: wire-bg-page, wire-bg-surface, wire-bg-surface-2, wire-bg-primary, wire-bg-secondary, wire-text, wire-text-muted, wire-text-primary, wire-text-success, wire-text-warning, wire-text-danger, and wire-border.

    +

    Stable no-spacing helper classes are also available: wrn-bg-page, wrn-bg-surface, wrn-bg-surface-2, wrn-bg-primary, wrn-bg-secondary, wrn-text, wrn-text-muted, wrn-text-primary, wrn-text-success, wrn-text-warning, wrn-text-danger, and wrn-border.

    Tailwind-authored custom markup can continue using the palette families already used by packaged components. indigo-* and violet-* resolve to primary, blue-* to info, emerald-*/green-* to success, amber-* to warning, and red-*/rose-* to danger. These aliases live at :root, so they work outside a [data-component] boundary too.

    Usage

    Auto-discovery

    -

    The router scans extra componentDirs (in addition to the app's own app/components) and keys components by name. Library dirs are scanned first and app/components last, so an app component of the same name shadows the library's. The CLI build (@wrnexus/cli) and dev server (@wrnexus/dev-server) both wire the UI directory in for you:

    +

    The router scans extra componentDirs (in addition to the app's own app/components) and keys components by name. Library dirs are scanned first and app/components last, so an app component of the same name shadows the library's. The CLI build (@wrnexus/cli) and dev server (@wrnexus/dev-server) both wrn the UI directory in for you:

    import { buildRouter } from "@wrnexus/router";
     import { uiComponentsDir } from "@wrnexus/ui";
     
    @@ -90,7 +137,7 @@ const router = buildRouter(appDir, { componentDirs: [uiComponentsDir()] 
     </div>

    Overrides

    Ways to customize the components, in increasing order of power:

    -

    1. Theme tokens — override CSS custom properties such as --wire-color-primary, --wire-color-surface, --wire-radius-sm, etc. Every component style resolves through var(--wire-*), so changing a token restyles everything instantly (including across theme switches). 2. App CSS — redefine a .wire-* class in your own stylesheet, which is loaded after ui.css and therefore wins. 3. class prop — pass a class prop to a component; it is appended to the component's root element, letting you add per-instance classes without touching the base styles. 4. wrnexus eject <name> — copy the component's .wrn source into your app/components, where (because app components shadow library ones) you fully own and can edit it. Use uiComponentNames() for the list of ejectable names.

    +

    1. Theme tokens — override CSS custom properties such as --wrn-color-primary, --wrn-color-surface, --wrn-radius-sm, etc. Every component style resolves through var(--wrn-*), so changing a token restyles everything instantly (including across theme switches). 2. App CSS — redefine a .wrn-* class in your own stylesheet, which is loaded after ui.css and therefore wins. 3. class prop — pass a class prop to a component; it is appended to the component's root element, letting you add per-instance classes without touching the base styles. 4. wrnexus eject <name> — copy the component's .wrn source into your app/components, where (because app components shadow library ones) you fully own and can edit it. Use uiComponentNames() for the list of ejectable names.

    Requirements / Notes

    • Bun-only — the package uses standard fs/path/url APIs but is published and
    • @@ -99,9 +146,8 @@ const router = buildRouter(appDir, { componentDirs: [uiComponentsDir()] 

      [@wrnexus/router](../router) (via componentDirs) and served by [@wrnexus/dev-server](../dev-server) / built by [@wrnexus/cli](../cli).

    • Depends on [@wrnexus/core](../core) (dependencies).
    • theme-toggle relies on the framework's theme runtime, which binds the
    • -

      data-wire-theme-toggle attribute — no per-component JS is required.

      -

    Complete TypeScript API

    Generated from the exact installed package declarations.

    
    -export {  }
    +

    data-wrn-theme-toggle attribute — no per-component JS is required.

    +

    Complete TypeScript API

    Generated from the exact installed package declarations.

    export { MegaMenuColumn, MegaMenuDensity, MegaMenuFeatured, MegaMenuPanelAlign, MegaMenuPanelWidth, MegaMenuRailItem, MegaMenuVariant, NavbarAction, NavbarBrand, NavbarDropdownGroup, NavbarDropdownItem, NavbarItem, NavbarItemType, NavbarLinkItem, NavbarMegaMenuData, NavbarMegaMenuItem, NavigationLink } from './navigation.js';
     

    Examples

    Copy-ready examples from the installed package documentation.

    Auto-discovery

    import { buildRouter } from "@wrnexus/router";
     import { uiComponentsDir } from "@wrnexus/ui";
     
    @@ -110,9 +156,9 @@ const router = buildRouter(appDir, { componentDirs: [uiComponentsDir()] 
       <button data-component="button" label="Save" variant="primary" size="lg"></button>
       <div data-component="alert" variant="success" title="Done" message="Saved."></div>
     </div>

    Explore the component library

    Browse interactive examples and complete component usage in the dedicated WRNexusJS component showcase.

    Browse all 102 components →

    - +
    - + } } diff --git a/app/pages/packages/uploader.wrn b/app/pages/packages/uploader.wrn index 8e4cf31f..59ea0d53 100644 --- a/app/pages/packages/uploader.wrn +++ b/app/pages/packages/uploader.wrn @@ -10,7 +10,7 @@ page wrnexusuploader {
    W WRNexusJS - +
    -
    Data · Package reference

    @wrnexus/uploader

    Validated local/S3 uploads and secure file serving.

    v0.8.8Private registryData

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/uploader@0.8.8

    Request preview access. Never put registry tokens in source control.

    Config-driven file uploads + serving for WRNexusJS. Declare named storage stores (local disk or any S3-compatible backend) in wrnexus.config.ts, upload with one function call, drop a drag-and-drop widget on a page, and serve files back — public or private. Zero external dependencies (S3 is signed with a built-in AWS SigV4 implementation, like the rest of the framework).

    +
    Data · Package reference

    @wrnexus/uploader

    Validated local/S3 uploads and secure file serving.

    v0.8.13Private registryData

    Install the package

    After WorkRoot approves private registry access, install the package:

    bun add @wrnexus/uploader@0.8.13

    Request preview access. Never put registry tokens in source control.

    Config-driven file uploads + serving for WRNexusJS. Declare named storage stores (local disk or any S3-compatible backend) in wrnexus.config.ts, upload with one function call, drop a drag-and-drop widget on a page, and serve files back — public or private. Zero external dependencies (S3 is signed with a built-in AWS SigV4 implementation, like the rest of the framework).

    Usage

    Configure local and S3 stores

    // wrnexus.config.ts
    @@ -316,7 +316,7 @@ declare function serveFromStore(storeName?: string, opts?: {
     /**
      * Framework asset hook: serve PUBLIC local objects at
      * `/__wrnexus/uploads/<store>/<key>`. Returns `null` for anything it doesn't
    - * own (unknown/private/S3-backed store) so the caller falls through. Wired into
    + * own (unknown/private/S3-backed store) so the caller falls through. Connected to
      * the dev + prod asset servers.
      */
     declare function serveStoredFile(pathname: string): Promise<Response | null>;
    @@ -326,7 +326,7 @@ declare function serveStoredFile(pathname: string): Promise<Response | null&g
      * input, per-file progress bars, and success/failed states. Injected by
      * `collectScripts` only on pages that contain `data-uploader` (same mechanism as
      * `validate.js`). Self-contained: it injects its own themed stylesheet (using
    - * `--wire-*` tokens) and posts each file via XHR so upload progress is live.
    + * `--wrn-*` tokens) and posts each file via XHR so upload progress is live.
      *
      * Markup it enhances (also a valid no-JS `<form>` fallback if you wrap it):
      *   <div data-uploader="public" data-endpoint="/api/upload"
    @@ -340,7 +340,7 @@ declare function serveStoredFile(pathname: string): Promise<Response | null&g
      * backticks and no ${...}, so it embeds safely in the exported template string.
      */
     declare const UPLOAD_JS_HREF = "/__wrnexus/uploader.js";
    -declare const UPLOAD_RUNTIME = "\n(function () {\n  if (typeof document === \"undefined\") return;\n  var CSRF_COOKIE = \"wire-csrf\";\n\n  var CSS =\n    \".wire-uploader{display:block}\" +\n    \".wire-uploader-zone{display:flex;align-items:center;justify-content:center;text-align:center;\" +\n      \"min-height:8rem;padding:1.25rem;border:2px dashed var(--wire-border,#cbd5e1);border-radius:12px;\" +\n      \"background:var(--wire-surface,transparent);color:var(--wire-muted,#64748b);cursor:pointer;\" +\n      \"transition:border-color .15s ease,background-color .15s ease;position:relative}\" +\n    \".wire-uploader-zone:hover,.wire-uploader-zone:focus-visible{border-color:var(--wire-brand,#3f7dff);outline:none}\" +\n    \".wire-uploader-zone.is-drag{border-color:var(--wire-brand,#3f7dff);background:color-mix(in oklab,var(--wire-brand,#3f7dff) 8%,transparent)}\" +\n    \".wire-uploader-prompt{font-size:.9rem;pointer-events:none}\" +\n    \".wire-uploader-input{position:absolute;inset:0;width:100%;height:100%;opacity:0;cursor:pointer}\" +\n    \".wire-uploader-list{list-style:none;margin:.75rem 0 0;padding:0;display:flex;flex-direction:column;gap:.5rem}\" +\n    \".wire-uploader-item{display:grid;grid-template-columns:1fr auto;gap:.15rem .75rem;align-items:center;\" +\n      \"font-size:.82rem;padding:.5rem .7rem;border:1px solid var(--wire-border,#e2e8f0);border-radius:8px}\" +\n    \".wire-uploader-name{font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--wire-text,#0f172a)}\" +\n    \".wire-uploader-meta{color:var(--wire-muted,#94a3b8);font-variant-numeric:tabular-nums}\" +\n    \".wire-uploader-bar{grid-column:1/-1;height:5px;border-radius:999px;background:var(--wire-border,#e2e8f0);overflow:hidden}\" +\n    \".wire-uploader-fill{height:100%;width:0;border-radius:999px;background:var(--wire-brand,#3f7dff);transition:width .15s ease}\" +\n    \".wire-uploader-status{grid-column:1/-1;font-size:.75rem;color:var(--wire-muted,#94a3b8);font-variant-numeric:tabular-nums}\" +\n    \".wire-uploader-item.is-done .wire-uploader-fill{background:var(--wire-success,#16a34a)}\" +\n    \".wire-uploader-item.is-done .wire-uploader-status{color:var(--wire-success,#16a34a)}\" +\n    \".wire-uploader-item.is-error .wire-uploader-fill{background:var(--wire-danger,#dc2626)}\" +\n    \".wire-uploader-item.is-error .wire-uploader-status{color:var(--wire-danger,#dc2626)}\";\n\n  function injectCss() {\n    if (document.getElementById(\"wire-uploader-css\")) return;\n    var s = document.createElement(\"style\");\n    s.id = \"wire-uploader-css\";\n    s.textContent = CSS;\n    document.head.appendChild(s);\n  }\n\n  function cookie(name) {\n    var m = document.cookie.match(new RegExp(\"(?:^|; )\" + name + \"=([^;]*)\"));\n    return m ? decodeURIComponent(m[1]) : \"\";\n  }\n  function el(tag, cls, text) {\n    var e = document.createElement(tag);\n    if (cls) e.className = cls;\n    if (text != null) e.textContent = text;\n    return e;\n  }\n  function fmt(n) {\n    if (n < 1024) return n + \" B\";\n    if (n < 1048576) return (n / 1024).toFixed(1) + \" KB\";\n    return (n / 1048576).toFixed(1) + \" MB\";\n  }\n  function accepts(accept, file) {\n    var list = (accept || \"\").split(\",\").map(function (s) { return s.trim().toLowerCase(); }).filter(Boolean);\n    if (!list.length) return true;\n    var type = (file.type || \"\").toLowerCase();\n    var name = (file.name || \"\").toLowerCase();\n    var ext = name.indexOf(\".\") >= 0 ? name.slice(name.lastIndexOf(\".\")) : \"\";\n    return list.some(function (rule) {\n      if (rule.charAt(0) === \".\") return rule === ext;\n      if (rule.slice(-2) === \"/*\") return type.indexOf(rule.slice(0, -1)) === 0;\n      return rule === type;\n    });\n  }\n\n  function setup(root) {\n    if (root.__wrnexusUploader) return;\n    root.__wrnexusUploader = true;\n\n    var endpoint = root.getAttribute(\"data-endpoint\") || \"/api/upload\";\n    var multipleAttr = root.getAttribute(\"data-multiple\");\n    var multiple = root.hasAttribute(\"data-multiple\") && multipleAttr !== \"false\";\n    var accept = root.getAttribute(\"data-accept\") || \"\";\n    var maxBytes = parseInt(root.getAttribute(\"data-max\") || \"0\", 10) || 0;\n    var field = root.getAttribute(\"data-field\") || (multiple ? \"files\" : \"file\");\n    var invalidate = String(root.getAttribute(\"data-invalidate\") || \"\")\n      .split(\",\")\n      .map(function (tag) { return tag.trim(); })\n      .filter(Boolean);\n    var promptText = root.getAttribute(\"data-label\") || \"Drag files here or click to browse\";\n\n    root.classList.add(\"wire-uploader\");\n    var zone = el(\"div\", \"wire-uploader-zone\");\n    zone.setAttribute(\"role\", \"button\");\n    zone.setAttribute(\"tabindex\", \"0\");\n    zone.appendChild(el(\"div\", \"wire-uploader-prompt\", promptText));\n    var input = document.createElement(\"input\");\n    input.type = \"file\";\n    input.className = \"wire-uploader-input\";\n    if (multiple) input.multiple = true;\n    if (accept) input.accept = accept;\n    zone.appendChild(input);\n    var listEl = el(\"ul\", \"wire-uploader-list\");\n    root.appendChild(zone);\n    root.appendChild(listEl);\n\n    zone.addEventListener(\"keydown\", function (e) {\n      if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); input.click(); }\n    });\n    [\"dragenter\", \"dragover\"].forEach(function (ev) {\n      zone.addEventListener(ev, function (e) { e.preventDefault(); zone.classList.add(\"is-drag\"); });\n    });\n    [\"dragleave\", \"drop\"].forEach(function (ev) {\n      zone.addEventListener(ev, function (e) { e.preventDefault(); zone.classList.remove(\"is-drag\"); });\n    });\n    zone.addEventListener(\"drop\", function (e) {\n      if (e.dataTransfer && e.dataTransfer.files) handle(e.dataTransfer.files);\n    });\n    input.addEventListener(\"change\", function () {\n      if (input.files) handle(input.files);\n      input.value = \"\";\n    });\n\n    function handle(files) {\n      var arr = Array.prototype.slice.call(files);\n      if (!multiple) arr = arr.slice(0, 1);\n      arr.forEach(uploadOne);\n    }\n\n    function row(file) {\n      var li = el(\"li\", \"wire-uploader-item\");\n      li.appendChild(el(\"span\", \"wire-uploader-name\", file.name));\n      li.appendChild(el(\"span\", \"wire-uploader-meta\", fmt(file.size)));\n      var bar = el(\"div\", \"wire-uploader-bar\");\n      var fill = el(\"div\", \"wire-uploader-fill\");\n      bar.appendChild(fill);\n      li.appendChild(bar);\n      var status = el(\"span\", \"wire-uploader-status\", \"\");\n      li.appendChild(status);\n      listEl.appendChild(li);\n      return { li: li, fill: fill, status: status };\n    }\n\n    function uploadOne(file) {\n      var ui = row(file);\n      if (maxBytes && file.size > maxBytes) return fail(ui, \"Too large (max \" + fmt(maxBytes) + \")\", file);\n      if (!accepts(accept, file)) return fail(ui, \"Type not allowed\", file);\n\n      var fd = new FormData();\n      fd.append(field, file, file.name);\n      var xhr = new XMLHttpRequest();\n      xhr.open(\"POST\", endpoint, true);\n      var token = cookie(CSRF_COOKIE);\n      if (token) xhr.setRequestHeader(\"x-csrf-token\", token);\n      xhr.upload.addEventListener(\"progress\", function (e) {\n        if (e.lengthComputable) {\n          var pct = Math.round((e.loaded / e.total) * 100);\n          ui.fill.style.width = pct + \"%\";\n          ui.status.textContent = pct + \"%\";\n        }\n      });\n      xhr.addEventListener(\"load\", function () {\n        var data = null;\n        try { data = JSON.parse(xhr.responseText); }\n        catch (error) { console.warn(\"[wrnexus:uploader] upload response was not valid JSON\", error); }\n        if (xhr.status >= 200 && xhr.status < 300 && data && data.ok) {\n          done(ui, (data.files && data.files[0]) || null, file);\n        } else {\n          fail(ui, (data && data.error) || (\"Upload failed (\" + xhr.status + \")\"), file);\n        }\n      });\n      xhr.addEventListener(\"error\", function () { fail(ui, \"Network error\", file); });\n      xhr.send(fd);\n    }\n\n    function done(ui, info, file) {\n      ui.li.classList.remove(\"is-error\");\n      ui.li.classList.add(\"is-done\");\n      ui.fill.style.width = \"100%\";\n      ui.status.textContent = \"\\u2713 Uploaded\";\n      root.dispatchEvent(new CustomEvent(\"wrnexus:upload\", { bubbles: true, detail: { file: file, result: info } }));\n      if (invalidate.length) {\n        window.dispatchEvent(new CustomEvent(\"wrnexus:cache:invalidate\", {\n          detail: { tags: invalidate, source: \"uploader\", file: file, result: info }\n        }));\n      }\n    }\n    function fail(ui, msg, file) {\n      ui.li.classList.add(\"is-error\");\n      ui.status.textContent = \"\\u2717 \" + msg;\n      root.dispatchEvent(new CustomEvent(\"wrnexus:upload-error\", { bubbles: true, detail: { file: file, error: msg } }));\n    }\n  }\n\n  function init() {\n    injectCss();\n    var nodes = document.querySelectorAll(\"[data-uploader]\");\n    for (var i = 0; i < nodes.length; i++) setup(nodes[i]);\n  }\n  if (document.readyState === \"loading\") document.addEventListener(\"DOMContentLoaded\", init);\n  else init();\n})();\n";
    +declare const UPLOAD_RUNTIME = "\n(function () {\n  if (typeof document === \"undefined\") return;\n  var CSRF_COOKIE = \"wrn-csrf\";\n\n  var CSS =\n    \".wrn-uploader{display:block}\" +\n    \".wrn-uploader-zone{display:flex;align-items:center;justify-content:center;text-align:center;\" +\n      \"min-height:8rem;padding:1.25rem;border:2px dashed var(--wrn-border,#cbd5e1);border-radius:12px;\" +\n      \"background:var(--wrn-surface,transparent);color:var(--wrn-muted,#64748b);cursor:pointer;\" +\n      \"transition:border-color .15s ease,background-color .15s ease;position:relative}\" +\n    \".wrn-uploader-zone:hover,.wrn-uploader-zone:focus-visible{border-color:var(--wrn-brand,#3f7dff);outline:none}\" +\n    \".wrn-uploader-zone.is-drag{border-color:var(--wrn-brand,#3f7dff);background:color-mix(in oklab,var(--wrn-brand,#3f7dff) 8%,transparent)}\" +\n    \".wrn-uploader-prompt{font-size:.9rem;pointer-events:none}\" +\n    \".wrn-uploader-input{position:absolute;inset:0;width:100%;height:100%;opacity:0;cursor:pointer}\" +\n    \".wrn-uploader-list{list-style:none;margin:.75rem 0 0;padding:0;display:flex;flex-direction:column;gap:.5rem}\" +\n    \".wrn-uploader-item{display:grid;grid-template-columns:1fr auto;gap:.15rem .75rem;align-items:center;\" +\n      \"font-size:.82rem;padding:.5rem .7rem;border:1px solid var(--wrn-border,#e2e8f0);border-radius:8px}\" +\n    \".wrn-uploader-name{font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--wrn-text,#0f172a)}\" +\n    \".wrn-uploader-meta{color:var(--wrn-muted,#94a3b8);font-variant-numeric:tabular-nums}\" +\n    \".wrn-uploader-bar{grid-column:1/-1;height:5px;border-radius:999px;background:var(--wrn-border,#e2e8f0);overflow:hidden}\" +\n    \".wrn-uploader-fill{height:100%;width:0;border-radius:999px;background:var(--wrn-brand,#3f7dff);transition:width .15s ease}\" +\n    \".wrn-uploader-status{grid-column:1/-1;font-size:.75rem;color:var(--wrn-muted,#94a3b8);font-variant-numeric:tabular-nums}\" +\n    \".wrn-uploader-item.is-done .wrn-uploader-fill{background:var(--wrn-success,#16a34a)}\" +\n    \".wrn-uploader-item.is-done .wrn-uploader-status{color:var(--wrn-success,#16a34a)}\" +\n    \".wrn-uploader-item.is-error .wrn-uploader-fill{background:var(--wrn-danger,#dc2626)}\" +\n    \".wrn-uploader-item.is-error .wrn-uploader-status{color:var(--wrn-danger,#dc2626)}\";\n\n  function injectCss() {\n    if (document.getElementById(\"wrn-uploader-css\")) return;\n    var s = document.createElement(\"style\");\n    s.id = \"wrn-uploader-css\";\n    s.textContent = CSS;\n    document.head.appendChild(s);\n  }\n\n  function cookie(name) {\n    var m = document.cookie.match(new RegExp(\"(?:^|; )\" + name + \"=([^;]*)\"));\n    return m ? decodeURIComponent(m[1]) : \"\";\n  }\n  function el(tag, cls, text) {\n    var e = document.createElement(tag);\n    if (cls) e.className = cls;\n    if (text != null) e.textContent = text;\n    return e;\n  }\n  function fmt(n) {\n    if (n < 1024) return n + \" B\";\n    if (n < 1048576) return (n / 1024).toFixed(1) + \" KB\";\n    return (n / 1048576).toFixed(1) + \" MB\";\n  }\n  function accepts(accept, file) {\n    var list = (accept || \"\").split(\",\").map(function (s) { return s.trim().toLowerCase(); }).filter(Boolean);\n    if (!list.length) return true;\n    var type = (file.type || \"\").toLowerCase();\n    var name = (file.name || \"\").toLowerCase();\n    var ext = name.indexOf(\".\") >= 0 ? name.slice(name.lastIndexOf(\".\")) : \"\";\n    return list.some(function (rule) {\n      if (rule.charAt(0) === \".\") return rule === ext;\n      if (rule.slice(-2) === \"/*\") return type.indexOf(rule.slice(0, -1)) === 0;\n      return rule === type;\n    });\n  }\n\n  function setup(root) {\n    if (root.__wrnexusUploader) return;\n    root.__wrnexusUploader = true;\n\n    var endpoint = root.getAttribute(\"data-endpoint\") || \"/api/upload\";\n    var multipleAttr = root.getAttribute(\"data-multiple\");\n    var multiple = root.hasAttribute(\"data-multiple\") && multipleAttr !== \"false\";\n    var accept = root.getAttribute(\"data-accept\") || \"\";\n    var maxBytes = parseInt(root.getAttribute(\"data-max\") || \"0\", 10) || 0;\n    var field = root.getAttribute(\"data-field\") || (multiple ? \"files\" : \"file\");\n    var invalidate = String(root.getAttribute(\"data-invalidate\") || \"\")\n      .split(\",\")\n      .map(function (tag) { return tag.trim(); })\n      .filter(Boolean);\n    var promptText = root.getAttribute(\"data-label\") || \"Drag files here or click to browse\";\n\n    root.classList.add(\"wrn-uploader\");\n    var zone = el(\"div\", \"wrn-uploader-zone\");\n    zone.setAttribute(\"role\", \"button\");\n    zone.setAttribute(\"tabindex\", \"0\");\n    zone.appendChild(el(\"div\", \"wrn-uploader-prompt\", promptText));\n    var input = document.createElement(\"input\");\n    input.type = \"file\";\n    input.className = \"wrn-uploader-input\";\n    if (multiple) input.multiple = true;\n    if (accept) input.accept = accept;\n    zone.appendChild(input);\n    var listEl = el(\"ul\", \"wrn-uploader-list\");\n    root.appendChild(zone);\n    root.appendChild(listEl);\n\n    zone.addEventListener(\"keydown\", function (e) {\n      if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); input.click(); }\n    });\n    [\"dragenter\", \"dragover\"].forEach(function (ev) {\n      zone.addEventListener(ev, function (e) { e.preventDefault(); zone.classList.add(\"is-drag\"); });\n    });\n    [\"dragleave\", \"drop\"].forEach(function (ev) {\n      zone.addEventListener(ev, function (e) { e.preventDefault(); zone.classList.remove(\"is-drag\"); });\n    });\n    zone.addEventListener(\"drop\", function (e) {\n      if (e.dataTransfer && e.dataTransfer.files) handle(e.dataTransfer.files);\n    });\n    input.addEventListener(\"change\", function () {\n      if (input.files) handle(input.files);\n      input.value = \"\";\n    });\n\n    function handle(files) {\n      var arr = Array.prototype.slice.call(files);\n      if (!multiple) arr = arr.slice(0, 1);\n      arr.forEach(uploadOne);\n    }\n\n    function row(file) {\n      var li = el(\"li\", \"wrn-uploader-item\");\n      li.appendChild(el(\"span\", \"wrn-uploader-name\", file.name));\n      li.appendChild(el(\"span\", \"wrn-uploader-meta\", fmt(file.size)));\n      var bar = el(\"div\", \"wrn-uploader-bar\");\n      var fill = el(\"div\", \"wrn-uploader-fill\");\n      bar.appendChild(fill);\n      li.appendChild(bar);\n      var status = el(\"span\", \"wrn-uploader-status\", \"\");\n      li.appendChild(status);\n      listEl.appendChild(li);\n      return { li: li, fill: fill, status: status };\n    }\n\n    function uploadOne(file) {\n      var ui = row(file);\n      if (maxBytes && file.size > maxBytes) return fail(ui, \"Too large (max \" + fmt(maxBytes) + \")\", file);\n      if (!accepts(accept, file)) return fail(ui, \"Type not allowed\", file);\n\n      var fd = new FormData();\n      fd.append(field, file, file.name);\n      var xhr = new XMLHttpRequest();\n      xhr.open(\"POST\", endpoint, true);\n      var token = cookie(CSRF_COOKIE);\n      if (token) xhr.setRequestHeader(\"x-csrf-token\", token);\n      xhr.upload.addEventListener(\"progress\", function (e) {\n        if (e.lengthComputable) {\n          var pct = Math.round((e.loaded / e.total) * 100);\n          ui.fill.style.width = pct + \"%\";\n          ui.status.textContent = pct + \"%\";\n        }\n      });\n      xhr.addEventListener(\"load\", function () {\n        var data = null;\n        try { data = JSON.parse(xhr.responseText); }\n        catch (error) { console.warn(\"[wrnexus:uploader] upload response was not valid JSON\", error); }\n        if (xhr.status >= 200 && xhr.status < 300 && data && data.ok) {\n          done(ui, (data.files && data.files[0]) || null, file);\n        } else {\n          fail(ui, (data && data.error) || (\"Upload failed (\" + xhr.status + \")\"), file);\n        }\n      });\n      xhr.addEventListener(\"error\", function () { fail(ui, \"Network error\", file); });\n      xhr.send(fd);\n    }\n\n    function done(ui, info, file) {\n      ui.li.classList.remove(\"is-error\");\n      ui.li.classList.add(\"is-done\");\n      ui.fill.style.width = \"100%\";\n      ui.status.textContent = \"\\u2713 Uploaded\";\n      root.dispatchEvent(new CustomEvent(\"wrnexus:upload\", { bubbles: true, detail: { file: file, result: info } }));\n      if (invalidate.length) {\n        window.dispatchEvent(new CustomEvent(\"wrnexus:cache:invalidate\", {\n          detail: { tags: invalidate, source: \"uploader\", file: file, result: info }\n        }));\n      }\n    }\n    function fail(ui, msg, file) {\n      ui.li.classList.add(\"is-error\");\n      ui.status.textContent = \"\\u2717 \" + msg;\n      root.dispatchEvent(new CustomEvent(\"wrnexus:upload-error\", { bubbles: true, detail: { file: file, error: msg } }));\n    }\n  }\n\n  function init() {\n    injectCss();\n    var nodes = document.querySelectorAll(\"[data-uploader]\");\n    for (var i = 0; i < nodes.length; i++) setup(nodes[i]);\n  }\n  if (document.readyState === \"loading\") document.addEventListener(\"DOMContentLoaded\", init);\n  else init();\n})();\n";
     
     /**
      * Local-disk storage driver. Files live under a configured directory; keys map
    @@ -638,7 +638,7 @@ import { serveFromStore } from "@wrnexus/uploader";
     export const GET = serveFromStore("docs"); // your middleware decides who gets in
    - + } } diff --git a/app/pages/packages/validation.wrn b/app/pages/packages/validation.wrn index ee57804e..cb481e41 100644 --- a/app/pages/packages/validation.wrn +++ b/app/pages/packages/validation.wrn @@ -10,7 +10,7 @@ page wrnexusvalidation {
    W WRNexusJS - +
    -
    Security · Package reference

    @wrnexus/validation

    Typed schemas, coercion, validation, and browser descriptors.

    v0.8.8Private registrySecurity

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/validation@0.8.8

    Request preview access. Never put registry tokens in source control.

    One fluent schema, validated on the server (API bodies, env vars) and mirrored to an eval-free browser validator for forms.
    +
    Security · Package reference

    @wrnexus/validation

    Typed schemas, coercion, validation, and browser descriptors.

    v0.8.13Private registrySecurity

    Install the package

    After WorkRoot approves private registry access, install the package:

    bun add @wrnexus/validation@0.8.13

    Request preview access. Never put registry tokens in source control.

    One fluent schema, validated on the server (API bodies, env vars) and mirrored to an eval-free browser validator for forms.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Boundary contracts

    Use ContractRegistry with defineContract or defineEvent to publish the same schema descriptors for APIs, actions, webhooks, realtime, queues, cron, pub/sub, plugins, configuration, and environment variables.

    @@ -36,7 +36,7 @@ export const contracts = new ContractRegistry().register( );

    Export the registry from app/contracts.ts, then accept a baseline with wrnexus contracts snapshot. CI can run wrnexus contracts check; removed contracts/fields, required-field additions, type changes, narrowed enums, and tighter validation fail with stable WRN-CONTRACT-* diagnostics and list known consumers. A generated wrnexus.contracts.json can be used instead of a module.

    Overview

    -

    Define a schema once with the fluent v builder, then reuse it in three places: .parse() runs server-side and returns coerced values plus per-field errors; .describe() emits a plain-JSON SchemaDescriptor that the browser runtime interprets (no eval, no bundled validator); and helpers like parseBody and parseEnv wire schemas straight into API routes and startup config. The server rule logic (applyRule/checkField) and the client runtime (VALIDATE_RUNTIME) mirror each other exactly, so a form validates identically in both places. Schemas are conventionally kept in app/schemas/.

    +

    Define a schema once with the fluent v builder, then reuse it in three places: .parse() runs server-side and returns coerced values plus per-field errors; .describe() emits a plain-JSON SchemaDescriptor that the browser runtime interprets (no eval, no bundled validator); and helpers like parseBody and parseEnv wrn schemas straight into API routes and startup config. The server rule logic (applyRule/checkField) and the client runtime (VALIDATE_RUNTIME) mirror each other exactly, so a form validates identically in both places. Schemas are conventionally kept in app/schemas/.

    bun add @wrnexus/validation
    Private package — the machine must be authenticated to the wrnexus npm org
    (a read token in ~/.npmrc). Requires Bun (Node is not supported).
    @@ -97,8 +97,8 @@ parseBody<T>(schema, req):
    renderSchemasScript(descriptors: Record<string, SchemaDescriptor>): string
     VALIDATE_RUNTIME: string
      -
    • renderSchemasScript produces window.__wireSchemas = { name: descriptor, … }; to inline in the page.
    • -
    • VALIDATE_RUNTIME is a self-contained, eval-free IIFE string. Injected as a <script>, it binds every form[data-schema] and validates on submit and blur, writing messages into [data-error="<field>"] elements and toggling aria-invalid / .wire-invalid. On a valid submit it fetches the form action as JSON (attaching the wire-csrf cookie as an x-csrf-token header), then follows data-redirect / a redirect in the response, surfaces server-side field errors, and fires wire:success / wire:error events. It exposes window.__wireValidate.init(root) and self-initializes on DOMContentLoaded.
    • +
    • renderSchemasScript produces window.__wrnSchemas = { name: descriptor, … }; to inline in the page.
    • +
    • VALIDATE_RUNTIME is a self-contained, eval-free IIFE string. Injected as a <script>, it binds every form[data-schema] and validates on submit and blur, writing messages into [data-error="<field>"] elements and toggling aria-invalid / .wrn-invalid. On a valid submit it fetches the form action as JSON (attaching the wrn-csrf cookie as an x-csrf-token header), then follows data-redirect / a redirect in the response, surfaces server-side field errors, and fires wrn:success / wrn:error events. It exposes window.__wrnValidate.init(root) and self-initializes on DOMContentLoaded.

    Usage

    Define a schema and validate an API body:

    @@ -134,7 +134,7 @@ export const env = parseEnv( }), ); // throws one readable error listing every bad variable if misconfigured
    -

    Wire the same schema into the browser:

    +

    WRNexusJS the same schema into the browser:

    import { renderSchemasScript, VALIDATE_RUNTIME } from "@wrnexus/validation";
     import { signupSchema } from "./app/schemas/signup.ts";
     
    @@ -188,13 +188,13 @@ import '@wrnexus/plugin';
     
     /**
      * Client-side validation. `renderSchemasScript` bakes the discovered schema
    - * descriptors into `window.__wireSchemas`; `VALIDATE_RUNTIME` is a generic,
    + * descriptors into `window.__wrnSchemas`; `VALIDATE_RUNTIME` is a generic,
      * eval-free validator that reads them and validates every `form[data-schema]`
      * on submit and blur, writing messages into `[data-error="<field>"]` elements.
      * The rule logic mirrors `checkField`/`applyRule` in index.ts.
      */
     
    -/** `window.__wireSchemas = { name: descriptor, ... }` for the client validator. */
    +/** `window.__wrnSchemas = { name: descriptor, ... }` for the client validator. */
     declare function renderSchemasScript(descriptors: Record<string, SchemaDescriptor>): string;
     declare const VALIDATE_RUNTIME: string;
     
    @@ -543,7 +543,7 @@ export const env = parseEnv(
         DEBUG: v.boolean().optional(),
       }),
     );
    -// throws one readable error listing every bad variable if misconfigured

    Wire the same schema into the browser

    import { renderSchemasScript, VALIDATE_RUNTIME } from "@wrnexus/validation";
    +// throws one readable error listing every bad variable if misconfigured

    WRNexusJS the same schema into the browser

    import { renderSchemasScript, VALIDATE_RUNTIME } from "@wrnexus/validation";
     import { signupSchema } from "./app/schemas/signup.ts";
     
     const head = `<script>${renderSchemasScript({ signup: signupSchema.describe() })}</script>
    @@ -551,7 +551,7 @@ const head = `<script>${renderSchemasScript({ signup: signupSche
     // render a <form data-schema="signup"> with [data-error="email"] etc.
    - + } } diff --git a/app/pages/releases/0.8.72.wrn b/app/pages/releases/0.8.72.wrn new file mode 100644 index 00000000..1c54d8ee --- /dev/null +++ b/app/pages/releases/0.8.72.wrn @@ -0,0 +1,24 @@ +page Release0872 { + seo { + title = "Release 0.8.72" + description = "WRNexusJS 0.8.72 release notes." + canonical = "https://wrnexusjs.dev/releases/0.8.72" + } + view { + +
    +
    W WRNexusJS
    + +

    WRNexusJS 0.8.72

    Released 2026-07-13. All 47 installed packages are aligned to this version. Highlights include the new helpers package, reliable workspace app addition, and browser SSO redirects through forward authentication. See the changelog, upgrade guide, and package references.

    + +
    + } +} \ No newline at end of file diff --git a/app/pages/roadmap.wrn b/app/pages/roadmap.wrn index 46e42c1c..3c01704b 100644 --- a/app/pages/roadmap.wrn +++ b/app/pages/roadmap.wrn @@ -7,7 +7,7 @@ page Roadmap { view {
    -
    W WRNexusJS
    +
    W WRNexusJS

    Roadmap

    Roadmap items are direction, not delivery commitments. Dates require explicit owner approval.

    Now

    • Private preview onboarding and accurate package references
    • Runnable documentation fixtures and link/accessibility checks
    • License, support, and disclosure owner decisions

    Next

    • Durable queue driver guidance
    • Expanded database/auth/realtime examples
    • Versioned release notes and migration fixtures

    Later / exploration

    • Historical documentation selector
    • Maintained reproducible benchmarks
    • Broader mobile/native coverage
    - +
    } } \ No newline at end of file diff --git a/app/pages/search.wrn b/app/pages/search.wrn index 0acffe2b..cfeb7b58 100644 --- a/app/pages/search.wrn +++ b/app/pages/search.wrn @@ -7,7 +7,7 @@ page Search { view {
    -
    W WRNexusJS
    +
    W WRNexusJS

    Search documentation

    This build-time index is local and sends no query to a third party. Use your browser’s find command to filter this compact index.

    Core documentation

    Get started · Packages · Components · Language · Architecture

    Guides

    Project structure · Routing · Pages and components · Server data · API routes · Middleware · Forms and validation · Authentication · Authorization · Application security · Database · Uploads · Realtime · Pub/sub · Queues · Testing · Workspaces and gateway · Deployment · Configuration and profiles · Internationalization and themes · Mobile · Observability · Upgrading · Troubleshooting · Auth and permissions dashboard demo

    Package APIs

    @wrnexus/ai · @wrnexus/authz · @wrnexus/compiler · @wrnexus/core · @wrnexus/csr · @wrnexus/db · @wrnexus/dev-server · @wrnexus/encryption · @wrnexus/helpers · @wrnexus/i18n · @wrnexus/jwt · @wrnexus/mobile · @wrnexus/native · @wrnexus/oauth · @wrnexus/pubsub · @wrnexus/queue · @wrnexus/reactive · @wrnexus/router · @wrnexus/ssr · @wrnexus/styles · @wrnexus/test · @wrnexus/tracking · @wrnexus/ui · @wrnexus/uploader · @wrnexus/validation · @wrnexus/dev-toolbar · @wrnexus/syntax · @wrnexus/plugin · @wrnexus/captcha · @wrnexus/auth · @wrnexus/store · @wrnexus/typecheck · @wrnexus/security · @wrnexus/cache · @wrnexus/image · @wrnexus/observability · @wrnexus/benchmark · @wrnexus/realtime · @wrnexus/content · @wrnexus/graphql · @wrnexus/identity · @wrnexus/language-server · @wrnexus/mcp · @wrnexus/playground · @wrnexus/pwa · @wrnexus/rpc · @wrnexus/cli

    - +
    } } \ No newline at end of file diff --git a/app/pages/security.wrn b/app/pages/security.wrn index cb7ced1b..dfecdba3 100644 --- a/app/pages/security.wrn +++ b/app/pages/security.wrn @@ -7,7 +7,7 @@ page Security { view {
    -
    W WRNexusJS
    +
    W WRNexusJS
    - +bunx wrnexus build .

    Review the resolved production configuration, then test a valid request, an invalid CSRF token, an oversized body, an unapproved origin, an anonymous protected request, and a permission-denied request. Security configuration is complete only when denial behavior is tested.

    Supported releases

    Only the current private-preview release 0.8.72 is documented here. A formal old-release support window is not yet published.

    Report a vulnerability

    Use WorkRoot’s approved private contact path at workroot.in. Do not publish exploit details or secrets. Include affected version, impact, reproduction, and a safe contact method. Response targets, encryption key, bounty, audit, and certification are not currently claimed.

    Deployment controls

    Terminate TLS at a trusted edge, forward only expected proxy headers, store secrets outside source control, apply database migrations before traffic, and monitor rejected requests without logging credentials. Continue with the complete application security guide.

    + } } \ No newline at end of file diff --git a/app/pages/showcase.wrn b/app/pages/showcase.wrn index afafad0d..3a0b1000 100644 --- a/app/pages/showcase.wrn +++ b/app/pages/showcase.wrn @@ -7,7 +7,7 @@ page Showcase { view {
    -
    W WRNexusJS
    +
    W WRNexusJS

    Showcase

    Only confirmed public properties are listed; no customer or traffic claims are made.

    WorkRoot

    Creator/company site demonstrating a public WRNexusJS deployment. Exact deployed version and infrastructure notes await owner confirmation.

    WRNexusJS docs

    This documentation portal, built and verified against WRNexusJS 0.8.8 on Bun.

    Screenshots are intentionally deferred until approved assets and alt text are available.

    - +

    Showcase

    Only confirmed public properties are listed; no customer or traffic claims are made.

    WorkRoot

    Creator/company site demonstrating a public WRNexusJS deployment. Exact deployed version and infrastructure notes await owner confirmation.

    WRNexusJS docs

    This documentation portal, built and verified against WRNexusJS 0.8.72 on Bun.

    Screenshots are intentionally deferred until approved assets and alt text are available.

    +
    } } \ No newline at end of file diff --git a/app/pages/support.wrn b/app/pages/support.wrn index 209cc566..b07cfaf9 100644 --- a/app/pages/support.wrn +++ b/app/pages/support.wrn @@ -7,7 +7,7 @@ page Support { view {
    -
    W WRNexusJS
    +
    W WRNexusJS

    Support

    WRNexusJS has no public Discord, public issue tracker, or guaranteed community support channel listed by this repository. Preview access and support begin through WorkRoot’s public contact path.

    Include WRNexusJS version, Bun version, OS, a minimal reproduction, expected and actual behavior, and sanitized logs. Never include registry tokens, credentials, session cookies, or private data.

    Support scope, service levels, and commercial terms require owner confirmation.

    - +
    } } \ No newline at end of file diff --git a/app/pages/tutorial.wrn b/app/pages/tutorial.wrn index fe44abd3..5edf134c 100644 --- a/app/pages/tutorial.wrn +++ b/app/pages/tutorial.wrn @@ -7,7 +7,7 @@ page Tutorial { view {
    -
    W WRNexusJS
    +
    W WRNexusJS
    Preview · runnable-project extraction pending

    Secure task board

    This tutorial connects the installed 0.8.8 APIs into one design. Snippets are limited to declarations and README patterns verified in the installed packages; a CI-compiled standalone fixture remains on the roadmap.

    Application shape

    A .wrn page renders tasks from an SSR API binding. A shared validation schema protects mutations. Session middleware identifies users, authorization policies gate updates, and a realtime room broadcasts changes.

    Schema and create route

    import { v, parseBody } from "@wrnexus/validation";
    +
    Preview · runnable-project extraction pending

    Secure task board

    This tutorial connects the installed 0.8.72 APIs into one design. Snippets are limited to declarations and README patterns verified in the installed packages; a CI-compiled standalone fixture remains on the roadmap.

    Application shape

    A .wrn page renders tasks from an SSR API binding. A shared validation schema protects mutations. Session middleware identifies users, authorization policies gate updates, and a realtime room broadcasts changes.

    Schema and create route

    import { v, parseBody } from "@wrnexus/validation";
     const task = v.object({ title: v.string().trim().min(3).max(120) });
     export const POST = async (ctx) => {
       const parsed = await parseBody(task, ctx.req);
    @@ -31,7 +31,7 @@ export const POST = async (ctx) => {
         </ul></main>
       }
     }

    Production checklist

    • Choose SQLite for local development or configure the supported PostgreSQL driver.
    • Run migrations before accepting traffic.
    • Enable session authentication and enforce authorization on every mutation.
    • Validate upload types and sizes; keep private objects behind authenticated routes.
    • Use Redis pub/sub when realtime rooms span processes.
    • Treat the default queue as non-durable until a production driver is selected.

    Follow the focused database, authentication, authorization, realtime, and upload guides.

    - +
    } } \ No newline at end of file diff --git a/app/routes.gen.ts b/app/routes.gen.ts index 3e4f30c7..216d6019 100644 --- a/app/routes.gen.ts +++ b/app/routes.gen.ts @@ -172,6 +172,7 @@ export interface Routes { "/releases/0.8.5": Record; "/releases/0.8.6": Record; "/releases/0.8.7": Record; + "/releases/0.8.72": Record; "/releases/0.8.8": Record; "/roadmap": Record; "/search": Record; @@ -182,13 +183,13 @@ export interface Routes { } export interface RouteNames { - "index": "/"; + index: "/"; "404": "/404"; - "access": "/access"; - "architecture": "/architecture"; - "benchmarks": "/benchmarks"; - "changelog": "/changelog"; - "examples": "/examples"; + access: "/access"; + architecture: "/architecture"; + benchmarks: "/benchmarks"; + changelog: "/changelog"; + examples: "/examples"; "getting.started": "/getting-started"; "guides.api.routes": "/guides/api-routes"; "guides.authentication": "/guides/authentication"; @@ -215,9 +216,9 @@ export interface RouteNames { "guides.upgrading": "/guides/upgrading"; "guides.uploads": "/guides/uploads"; "guides.workspaces.and.gateway": "/guides/workspaces-and-gateway"; - "language": "/language"; - "license": "/license"; - "packages": "/packages"; + language: "/language"; + license: "/license"; + packages: "/packages"; "packages.ai": "/packages/ai"; "packages.auth": "/packages/auth"; "packages.authz": "/packages/authz"; @@ -352,13 +353,14 @@ export interface RouteNames { "releases.0.8.5": "/releases/0.8.5"; "releases.0.8.6": "/releases/0.8.6"; "releases.0.8.7": "/releases/0.8.7"; + "releases.0.8.72": "/releases/0.8.72"; "releases.0.8.8": "/releases/0.8.8"; - "roadmap": "/roadmap"; - "search": "/search"; - "security": "/security"; - "showcase": "/showcase"; - "support": "/support"; - "tutorial": "/tutorial"; + roadmap: "/roadmap"; + search: "/search"; + security: "/security"; + showcase: "/showcase"; + support: "/support"; + tutorial: "/tutorial"; } export interface RouteQueries { @@ -374,7 +376,11 @@ type RouteValue = string | readonly string[] | undefined; function encodeRouteValue(value: RouteValue, catchAll: boolean): string { if (value === undefined) return ""; - const values = Array.isArray(value) ? value : catchAll ? String(value).split("/") : [String(value)]; + const values = Array.isArray(value) + ? value + : catchAll + ? String(value).split("/") + : [String(value)]; return values.map((part) => encodeURIComponent(part)).join("/"); } @@ -404,7 +410,8 @@ function buildHref(path: string, params: Record = {}): strin } const value = params[name]; if (value === undefined && optional) continue; - if (value === undefined) throw new Error(`WRN-ROUTE-MISSING-PARAM: Missing route parameter '${name}'.`); + if (value === undefined) + throw new Error(`WRN-ROUTE-MISSING-PARAM: Missing route parameter '${name}'.`); output.push(encodeRouteValue(value, catchAll)); } return "/" + output.filter(Boolean).join("/"); @@ -431,184 +438,185 @@ export function route( : [params: Routes[RouteNames[N]], query?: RouteQuery] ): string { const paths: Record = { - "404": "/404", - "index": "/", - "access": "/access", - "architecture": "/architecture", - "benchmarks": "/benchmarks", - "changelog": "/changelog", - "examples": "/examples", - "getting.started": "/getting-started", - "guides.api.routes": "/guides/api-routes", - "guides.authentication": "/guides/authentication", - "guides.authorization": "/guides/authorization", - "guides.configuration.and.profiles": "/guides/configuration-and-profiles", - "guides.database": "/guides/database", - "guides.deployment": "/guides/deployment", - "guides.forms.and.validation": "/guides/forms-and-validation", - "guides.full.stack.auth.demo": "/guides/full-stack-auth-demo", - "guides.i18n.and.themes": "/guides/i18n-and-themes", - "guides.middleware": "/guides/middleware", - "guides.mobile": "/guides/mobile", - "guides.observability": "/guides/observability", - "guides.pages.and.components": "/guides/pages-and-components", - "guides.project.structure": "/guides/project-structure", - "guides.pubsub": "/guides/pubsub", - "guides.queues": "/guides/queues", - "guides.realtime": "/guides/realtime", - "guides.routing": "/guides/routing", - "guides.security": "/guides/security", - "guides.server.data": "/guides/server-data", - "guides.testing": "/guides/testing", - "guides.troubleshooting": "/guides/troubleshooting", - "guides.upgrading": "/guides/upgrading", - "guides.uploads": "/guides/uploads", - "guides.workspaces.and.gateway": "/guides/workspaces-and-gateway", - "language": "/language", - "license": "/license", - "packages": "/packages", - "packages.ai": "/packages/ai", - "packages.auth": "/packages/auth", - "packages.authz": "/packages/authz", - "packages.benchmark": "/packages/benchmark", - "packages.cache": "/packages/cache", - "packages.captcha": "/packages/captcha", - "packages.cli": "/packages/cli", - "packages.compiler": "/packages/compiler", - "packages.content": "/packages/content", - "packages.core": "/packages/core", - "packages.csr": "/packages/csr", - "packages.db": "/packages/db", - "packages.dev.server": "/packages/dev-server", - "packages.dev.toolbar": "/packages/dev-toolbar", - "packages.encryption": "/packages/encryption", - "packages.graphql": "/packages/graphql", - "packages.helpers": "/packages/helpers", - "packages.i18n": "/packages/i18n", - "packages.identity": "/packages/identity", - "packages.image": "/packages/image", - "packages.jwt": "/packages/jwt", - "packages.language.server": "/packages/language-server", - "packages.mcp": "/packages/mcp", - "packages.mobile": "/packages/mobile", - "packages.native": "/packages/native", - "packages.oauth": "/packages/oauth", - "packages.observability": "/packages/observability", - "packages.playground": "/packages/playground", - "packages.plugin": "/packages/plugin", - "packages.pubsub": "/packages/pubsub", - "packages.pwa": "/packages/pwa", - "packages.queue": "/packages/queue", - "packages.reactive": "/packages/reactive", - "packages.realtime": "/packages/realtime", - "packages.router": "/packages/router", - "packages.security": "/packages/security", - "packages.ssr": "/packages/ssr", - "packages.store": "/packages/store", - "packages.styles": "/packages/styles", - "packages.syntax": "/packages/syntax", - "packages.test": "/packages/test", - "packages.tracking": "/packages/tracking", - "packages.typecheck": "/packages/typecheck", - "packages.ui": "/packages/ui", - "packages.uploader": "/packages/uploader", - "packages.validation": "/packages/validation", - "releases.0.2.15": "/releases/0.2.15", - "releases.0.2.17": "/releases/0.2.17", - "releases.0.2.18": "/releases/0.2.18", - "releases.0.2.19": "/releases/0.2.19", - "releases.0.2.20": "/releases/0.2.20", - "releases.0.2.21": "/releases/0.2.21", - "releases.0.2.22": "/releases/0.2.22", - "releases.0.2.23": "/releases/0.2.23", - "releases.0.2.24": "/releases/0.2.24", - "releases.0.2.25": "/releases/0.2.25", - "releases.0.2.26": "/releases/0.2.26", - "releases.0.2.27": "/releases/0.2.27", - "releases.0.2.28": "/releases/0.2.28", - "releases.0.2.29": "/releases/0.2.29", - "releases.0.2.30": "/releases/0.2.30", - "releases.0.2.31": "/releases/0.2.31", - "releases.0.2.32": "/releases/0.2.32", - "releases.0.2.33": "/releases/0.2.33", - "releases.0.2.34": "/releases/0.2.34", - "releases.0.2.35": "/releases/0.2.35", - "releases.0.2.36": "/releases/0.2.36", - "releases.0.2.37": "/releases/0.2.37", - "releases.0.2.38": "/releases/0.2.38", - "releases.0.2.39": "/releases/0.2.39", - "releases.0.2.40": "/releases/0.2.40", - "releases.0.2.41": "/releases/0.2.41", - "releases.0.2.42": "/releases/0.2.42", - "releases.0.2.43": "/releases/0.2.43", - "releases.0.2.44": "/releases/0.2.44", - "releases.0.2.45": "/releases/0.2.45", - "releases.0.2.46": "/releases/0.2.46", - "releases.0.2.47": "/releases/0.2.47", - "releases.0.2.48": "/releases/0.2.48", - "releases.0.2.49": "/releases/0.2.49", - "releases.0.2.50": "/releases/0.2.50", - "releases.0.2.51": "/releases/0.2.51", - "releases.0.2.52": "/releases/0.2.52", - "releases.0.2.53": "/releases/0.2.53", - "releases.0.2.54": "/releases/0.2.54", - "releases.0.2.55": "/releases/0.2.55", - "releases.0.2.56": "/releases/0.2.56", - "releases.0.2.57": "/releases/0.2.57", - "releases.0.2.58": "/releases/0.2.58", - "releases.0.2.59": "/releases/0.2.59", - "releases.0.2.60": "/releases/0.2.60", - "releases.0.2.61": "/releases/0.2.61", - "releases.0.2.62": "/releases/0.2.62", - "releases.0.2.63": "/releases/0.2.63", - "releases.0.2.64": "/releases/0.2.64", - "releases.0.2.65": "/releases/0.2.65", - "releases.0.2.66": "/releases/0.2.66", - "releases.0.2.67": "/releases/0.2.67", - "releases.0.2.68": "/releases/0.2.68", - "releases.0.2.69": "/releases/0.2.69", - "releases.0.2.70": "/releases/0.2.70", - "releases.0.2.71": "/releases/0.2.71", - "releases.0.2.72": "/releases/0.2.72", - "releases.0.2.73": "/releases/0.2.73", - "releases.0.2.74": "/releases/0.2.74", - "releases.0.2.75": "/releases/0.2.75", - "releases.0.2.76": "/releases/0.2.76", - "releases.0.2.77": "/releases/0.2.77", - "releases.0.2.78": "/releases/0.2.78", - "releases.0.2.79": "/releases/0.2.79", - "releases.0.3.0": "/releases/0.3.0", - "releases.0.3.1": "/releases/0.3.1", - "releases.0.3.2": "/releases/0.3.2", - "releases.0.3.3": "/releases/0.3.3", - "releases.0.3.4": "/releases/0.3.4", - "releases.0.3.5": "/releases/0.3.5", - "releases.0.3.6": "/releases/0.3.6", - "releases.0.4.0": "/releases/0.4.0", - "releases.0.5.0": "/releases/0.5.0", - "releases.0.5.1": "/releases/0.5.1", - "releases.0.5.10": "/releases/0.5.10", - "releases.0.5.11": "/releases/0.5.11", - "releases.0.5.12": "/releases/0.5.12", - "releases.0.5.13": "/releases/0.5.13", - "releases.0.6.0": "/releases/0.6.0", - "releases.0.7.0": "/releases/0.7.0", - "releases.0.8.0": "/releases/0.8.0", - "releases.0.8.1": "/releases/0.8.1", - "releases.0.8.2": "/releases/0.8.2", - "releases.0.8.3": "/releases/0.8.3", - "releases.0.8.4": "/releases/0.8.4", - "releases.0.8.5": "/releases/0.8.5", - "releases.0.8.6": "/releases/0.8.6", - "releases.0.8.7": "/releases/0.8.7", - "releases.0.8.8": "/releases/0.8.8", - "roadmap": "/roadmap", - "search": "/search", - "security": "/security", - "showcase": "/showcase", - "support": "/support", - "tutorial": "/tutorial" -} as Record; + "404": "/404", + index: "/", + access: "/access", + architecture: "/architecture", + benchmarks: "/benchmarks", + changelog: "/changelog", + examples: "/examples", + "getting.started": "/getting-started", + "guides.api.routes": "/guides/api-routes", + "guides.authentication": "/guides/authentication", + "guides.authorization": "/guides/authorization", + "guides.configuration.and.profiles": "/guides/configuration-and-profiles", + "guides.database": "/guides/database", + "guides.deployment": "/guides/deployment", + "guides.forms.and.validation": "/guides/forms-and-validation", + "guides.full.stack.auth.demo": "/guides/full-stack-auth-demo", + "guides.i18n.and.themes": "/guides/i18n-and-themes", + "guides.middleware": "/guides/middleware", + "guides.mobile": "/guides/mobile", + "guides.observability": "/guides/observability", + "guides.pages.and.components": "/guides/pages-and-components", + "guides.project.structure": "/guides/project-structure", + "guides.pubsub": "/guides/pubsub", + "guides.queues": "/guides/queues", + "guides.realtime": "/guides/realtime", + "guides.routing": "/guides/routing", + "guides.security": "/guides/security", + "guides.server.data": "/guides/server-data", + "guides.testing": "/guides/testing", + "guides.troubleshooting": "/guides/troubleshooting", + "guides.upgrading": "/guides/upgrading", + "guides.uploads": "/guides/uploads", + "guides.workspaces.and.gateway": "/guides/workspaces-and-gateway", + language: "/language", + license: "/license", + packages: "/packages", + "packages.ai": "/packages/ai", + "packages.auth": "/packages/auth", + "packages.authz": "/packages/authz", + "packages.benchmark": "/packages/benchmark", + "packages.cache": "/packages/cache", + "packages.captcha": "/packages/captcha", + "packages.cli": "/packages/cli", + "packages.compiler": "/packages/compiler", + "packages.content": "/packages/content", + "packages.core": "/packages/core", + "packages.csr": "/packages/csr", + "packages.db": "/packages/db", + "packages.dev.server": "/packages/dev-server", + "packages.dev.toolbar": "/packages/dev-toolbar", + "packages.encryption": "/packages/encryption", + "packages.graphql": "/packages/graphql", + "packages.helpers": "/packages/helpers", + "packages.i18n": "/packages/i18n", + "packages.identity": "/packages/identity", + "packages.image": "/packages/image", + "packages.jwt": "/packages/jwt", + "packages.language.server": "/packages/language-server", + "packages.mcp": "/packages/mcp", + "packages.mobile": "/packages/mobile", + "packages.native": "/packages/native", + "packages.oauth": "/packages/oauth", + "packages.observability": "/packages/observability", + "packages.playground": "/packages/playground", + "packages.plugin": "/packages/plugin", + "packages.pubsub": "/packages/pubsub", + "packages.pwa": "/packages/pwa", + "packages.queue": "/packages/queue", + "packages.reactive": "/packages/reactive", + "packages.realtime": "/packages/realtime", + "packages.router": "/packages/router", + "packages.security": "/packages/security", + "packages.ssr": "/packages/ssr", + "packages.store": "/packages/store", + "packages.styles": "/packages/styles", + "packages.syntax": "/packages/syntax", + "packages.test": "/packages/test", + "packages.tracking": "/packages/tracking", + "packages.typecheck": "/packages/typecheck", + "packages.ui": "/packages/ui", + "packages.uploader": "/packages/uploader", + "packages.validation": "/packages/validation", + "releases.0.2.15": "/releases/0.2.15", + "releases.0.2.17": "/releases/0.2.17", + "releases.0.2.18": "/releases/0.2.18", + "releases.0.2.19": "/releases/0.2.19", + "releases.0.2.20": "/releases/0.2.20", + "releases.0.2.21": "/releases/0.2.21", + "releases.0.2.22": "/releases/0.2.22", + "releases.0.2.23": "/releases/0.2.23", + "releases.0.2.24": "/releases/0.2.24", + "releases.0.2.25": "/releases/0.2.25", + "releases.0.2.26": "/releases/0.2.26", + "releases.0.2.27": "/releases/0.2.27", + "releases.0.2.28": "/releases/0.2.28", + "releases.0.2.29": "/releases/0.2.29", + "releases.0.2.30": "/releases/0.2.30", + "releases.0.2.31": "/releases/0.2.31", + "releases.0.2.32": "/releases/0.2.32", + "releases.0.2.33": "/releases/0.2.33", + "releases.0.2.34": "/releases/0.2.34", + "releases.0.2.35": "/releases/0.2.35", + "releases.0.2.36": "/releases/0.2.36", + "releases.0.2.37": "/releases/0.2.37", + "releases.0.2.38": "/releases/0.2.38", + "releases.0.2.39": "/releases/0.2.39", + "releases.0.2.40": "/releases/0.2.40", + "releases.0.2.41": "/releases/0.2.41", + "releases.0.2.42": "/releases/0.2.42", + "releases.0.2.43": "/releases/0.2.43", + "releases.0.2.44": "/releases/0.2.44", + "releases.0.2.45": "/releases/0.2.45", + "releases.0.2.46": "/releases/0.2.46", + "releases.0.2.47": "/releases/0.2.47", + "releases.0.2.48": "/releases/0.2.48", + "releases.0.2.49": "/releases/0.2.49", + "releases.0.2.50": "/releases/0.2.50", + "releases.0.2.51": "/releases/0.2.51", + "releases.0.2.52": "/releases/0.2.52", + "releases.0.2.53": "/releases/0.2.53", + "releases.0.2.54": "/releases/0.2.54", + "releases.0.2.55": "/releases/0.2.55", + "releases.0.2.56": "/releases/0.2.56", + "releases.0.2.57": "/releases/0.2.57", + "releases.0.2.58": "/releases/0.2.58", + "releases.0.2.59": "/releases/0.2.59", + "releases.0.2.60": "/releases/0.2.60", + "releases.0.2.61": "/releases/0.2.61", + "releases.0.2.62": "/releases/0.2.62", + "releases.0.2.63": "/releases/0.2.63", + "releases.0.2.64": "/releases/0.2.64", + "releases.0.2.65": "/releases/0.2.65", + "releases.0.2.66": "/releases/0.2.66", + "releases.0.2.67": "/releases/0.2.67", + "releases.0.2.68": "/releases/0.2.68", + "releases.0.2.69": "/releases/0.2.69", + "releases.0.2.70": "/releases/0.2.70", + "releases.0.2.71": "/releases/0.2.71", + "releases.0.2.72": "/releases/0.2.72", + "releases.0.2.73": "/releases/0.2.73", + "releases.0.2.74": "/releases/0.2.74", + "releases.0.2.75": "/releases/0.2.75", + "releases.0.2.76": "/releases/0.2.76", + "releases.0.2.77": "/releases/0.2.77", + "releases.0.2.78": "/releases/0.2.78", + "releases.0.2.79": "/releases/0.2.79", + "releases.0.3.0": "/releases/0.3.0", + "releases.0.3.1": "/releases/0.3.1", + "releases.0.3.2": "/releases/0.3.2", + "releases.0.3.3": "/releases/0.3.3", + "releases.0.3.4": "/releases/0.3.4", + "releases.0.3.5": "/releases/0.3.5", + "releases.0.3.6": "/releases/0.3.6", + "releases.0.4.0": "/releases/0.4.0", + "releases.0.5.0": "/releases/0.5.0", + "releases.0.5.1": "/releases/0.5.1", + "releases.0.5.10": "/releases/0.5.10", + "releases.0.5.11": "/releases/0.5.11", + "releases.0.5.12": "/releases/0.5.12", + "releases.0.5.13": "/releases/0.5.13", + "releases.0.6.0": "/releases/0.6.0", + "releases.0.7.0": "/releases/0.7.0", + "releases.0.8.0": "/releases/0.8.0", + "releases.0.8.1": "/releases/0.8.1", + "releases.0.8.2": "/releases/0.8.2", + "releases.0.8.3": "/releases/0.8.3", + "releases.0.8.4": "/releases/0.8.4", + "releases.0.8.5": "/releases/0.8.5", + "releases.0.8.6": "/releases/0.8.6", + "releases.0.8.7": "/releases/0.8.7", + "releases.0.8.72": "/releases/0.8.72", + "releases.0.8.8": "/releases/0.8.8", + roadmap: "/roadmap", + search: "/search", + security: "/security", + showcase: "/showcase", + support: "/support", + tutorial: "/tutorial", + } as Record; const output = buildHref(paths[name], (args[0] ?? {}) as Record); const query = args[1]; if (!query) return output; diff --git a/app/types/wrnexus.generated.api-checks.ts b/app/types/wrnexus.generated.api-checks.ts new file mode 100644 index 00000000..372018ab --- /dev/null +++ b/app/types/wrnexus.generated.api-checks.ts @@ -0,0 +1,7 @@ +// AUTO-GENERATED by `wrnexus generate types` - do not edit. +// +// Type-only assertions for sectioned `api` blocks. Kept as a real .ts file (not +// wrnexus.generated.d.ts) because `skipLibCheck` exempts .d.ts contents from being +// checked; this file is compiled and checked normally by the project's own tsc. + +export {}; diff --git a/app/types/wrnexus.generated.d.ts b/app/types/wrnexus.generated.d.ts index ee702b89..e3064874 100644 --- a/app/types/wrnexus.generated.d.ts +++ b/app/types/wrnexus.generated.d.ts @@ -11,9 +11,189 @@ declare namespace WRNexusGenerated { : T extends (db: any, ...rest: any[]) => infer R ? { args: Record; result: Awaited } : never; - type RealtimeMessage = T extends import("@wrnexus/core").RoomDefinition ? M : unknown; + type RealtimeMessage = T extends import("@wrnexus/core").RoomDefinition + ? M + : unknown; type QueuePayload = T extends import("@wrnexus/queue").JobDefinition ? I : unknown; - type RouteName = "404" | "access" | "architecture" | "benchmarks" | "changelog" | "examples" | "getting.started" | "guides.api.routes" | "guides.authentication" | "guides.authorization" | "guides.configuration.and.profiles" | "guides.database" | "guides.deployment" | "guides.forms.and.validation" | "guides.full.stack.auth.demo" | "guides.i18n.and.themes" | "guides.middleware" | "guides.mobile" | "guides.observability" | "guides.pages.and.components" | "guides.project.structure" | "guides.pubsub" | "guides.queues" | "guides.realtime" | "guides.routing" | "guides.security" | "guides.server.data" | "guides.testing" | "guides.troubleshooting" | "guides.upgrading" | "guides.uploads" | "guides.workspaces.and.gateway" | "index" | "language" | "license" | "packages" | "packages.ai" | "packages.auth" | "packages.authz" | "packages.benchmark" | "packages.cache" | "packages.captcha" | "packages.cli" | "packages.compiler" | "packages.content" | "packages.core" | "packages.csr" | "packages.db" | "packages.dev.server" | "packages.dev.toolbar" | "packages.encryption" | "packages.graphql" | "packages.helpers" | "packages.i18n" | "packages.identity" | "packages.image" | "packages.jwt" | "packages.language.server" | "packages.mcp" | "packages.mobile" | "packages.native" | "packages.oauth" | "packages.observability" | "packages.playground" | "packages.plugin" | "packages.pubsub" | "packages.pwa" | "packages.queue" | "packages.reactive" | "packages.realtime" | "packages.router" | "packages.security" | "packages.ssr" | "packages.store" | "packages.styles" | "packages.syntax" | "packages.test" | "packages.tracking" | "packages.typecheck" | "packages.ui" | "packages.uploader" | "packages.validation" | "releases.0.2.15" | "releases.0.2.17" | "releases.0.2.18" | "releases.0.2.19" | "releases.0.2.20" | "releases.0.2.21" | "releases.0.2.22" | "releases.0.2.23" | "releases.0.2.24" | "releases.0.2.25" | "releases.0.2.26" | "releases.0.2.27" | "releases.0.2.28" | "releases.0.2.29" | "releases.0.2.30" | "releases.0.2.31" | "releases.0.2.32" | "releases.0.2.33" | "releases.0.2.34" | "releases.0.2.35" | "releases.0.2.36" | "releases.0.2.37" | "releases.0.2.38" | "releases.0.2.39" | "releases.0.2.40" | "releases.0.2.41" | "releases.0.2.42" | "releases.0.2.43" | "releases.0.2.44" | "releases.0.2.45" | "releases.0.2.46" | "releases.0.2.47" | "releases.0.2.48" | "releases.0.2.49" | "releases.0.2.50" | "releases.0.2.51" | "releases.0.2.52" | "releases.0.2.53" | "releases.0.2.54" | "releases.0.2.55" | "releases.0.2.56" | "releases.0.2.57" | "releases.0.2.58" | "releases.0.2.59" | "releases.0.2.60" | "releases.0.2.61" | "releases.0.2.62" | "releases.0.2.63" | "releases.0.2.64" | "releases.0.2.65" | "releases.0.2.66" | "releases.0.2.67" | "releases.0.2.68" | "releases.0.2.69" | "releases.0.2.70" | "releases.0.2.71" | "releases.0.2.72" | "releases.0.2.73" | "releases.0.2.74" | "releases.0.2.75" | "releases.0.2.76" | "releases.0.2.77" | "releases.0.2.78" | "releases.0.2.79" | "releases.0.3.0" | "releases.0.3.1" | "releases.0.3.2" | "releases.0.3.3" | "releases.0.3.4" | "releases.0.3.5" | "releases.0.3.6" | "releases.0.4.0" | "releases.0.5.0" | "releases.0.5.1" | "releases.0.5.10" | "releases.0.5.11" | "releases.0.5.12" | "releases.0.5.13" | "releases.0.6.0" | "releases.0.7.0" | "releases.0.8.0" | "releases.0.8.1" | "releases.0.8.2" | "releases.0.8.3" | "releases.0.8.4" | "releases.0.8.5" | "releases.0.8.6" | "releases.0.8.7" | "releases.0.8.8" | "roadmap" | "search" | "security" | "showcase" | "support" | "tutorial"; + type RouteName = + | "404" + | "access" + | "architecture" + | "benchmarks" + | "changelog" + | "examples" + | "getting.started" + | "guides.api.routes" + | "guides.authentication" + | "guides.authorization" + | "guides.configuration.and.profiles" + | "guides.database" + | "guides.deployment" + | "guides.forms.and.validation" + | "guides.full.stack.auth.demo" + | "guides.i18n.and.themes" + | "guides.middleware" + | "guides.mobile" + | "guides.observability" + | "guides.pages.and.components" + | "guides.project.structure" + | "guides.pubsub" + | "guides.queues" + | "guides.realtime" + | "guides.routing" + | "guides.security" + | "guides.server.data" + | "guides.testing" + | "guides.troubleshooting" + | "guides.upgrading" + | "guides.uploads" + | "guides.workspaces.and.gateway" + | "index" + | "language" + | "license" + | "packages" + | "packages.ai" + | "packages.auth" + | "packages.authz" + | "packages.benchmark" + | "packages.cache" + | "packages.captcha" + | "packages.cli" + | "packages.compiler" + | "packages.content" + | "packages.core" + | "packages.csr" + | "packages.db" + | "packages.dev.server" + | "packages.dev.toolbar" + | "packages.encryption" + | "packages.graphql" + | "packages.helpers" + | "packages.i18n" + | "packages.identity" + | "packages.image" + | "packages.jwt" + | "packages.language.server" + | "packages.mcp" + | "packages.mobile" + | "packages.native" + | "packages.oauth" + | "packages.observability" + | "packages.playground" + | "packages.plugin" + | "packages.pubsub" + | "packages.pwa" + | "packages.queue" + | "packages.reactive" + | "packages.realtime" + | "packages.router" + | "packages.security" + | "packages.ssr" + | "packages.store" + | "packages.styles" + | "packages.syntax" + | "packages.test" + | "packages.tracking" + | "packages.typecheck" + | "packages.ui" + | "packages.uploader" + | "packages.validation" + | "releases.0.2.15" + | "releases.0.2.17" + | "releases.0.2.18" + | "releases.0.2.19" + | "releases.0.2.20" + | "releases.0.2.21" + | "releases.0.2.22" + | "releases.0.2.23" + | "releases.0.2.24" + | "releases.0.2.25" + | "releases.0.2.26" + | "releases.0.2.27" + | "releases.0.2.28" + | "releases.0.2.29" + | "releases.0.2.30" + | "releases.0.2.31" + | "releases.0.2.32" + | "releases.0.2.33" + | "releases.0.2.34" + | "releases.0.2.35" + | "releases.0.2.36" + | "releases.0.2.37" + | "releases.0.2.38" + | "releases.0.2.39" + | "releases.0.2.40" + | "releases.0.2.41" + | "releases.0.2.42" + | "releases.0.2.43" + | "releases.0.2.44" + | "releases.0.2.45" + | "releases.0.2.46" + | "releases.0.2.47" + | "releases.0.2.48" + | "releases.0.2.49" + | "releases.0.2.50" + | "releases.0.2.51" + | "releases.0.2.52" + | "releases.0.2.53" + | "releases.0.2.54" + | "releases.0.2.55" + | "releases.0.2.56" + | "releases.0.2.57" + | "releases.0.2.58" + | "releases.0.2.59" + | "releases.0.2.60" + | "releases.0.2.61" + | "releases.0.2.62" + | "releases.0.2.63" + | "releases.0.2.64" + | "releases.0.2.65" + | "releases.0.2.66" + | "releases.0.2.67" + | "releases.0.2.68" + | "releases.0.2.69" + | "releases.0.2.70" + | "releases.0.2.71" + | "releases.0.2.72" + | "releases.0.2.73" + | "releases.0.2.74" + | "releases.0.2.75" + | "releases.0.2.76" + | "releases.0.2.77" + | "releases.0.2.78" + | "releases.0.2.79" + | "releases.0.3.0" + | "releases.0.3.1" + | "releases.0.3.2" + | "releases.0.3.3" + | "releases.0.3.4" + | "releases.0.3.5" + | "releases.0.3.6" + | "releases.0.4.0" + | "releases.0.5.0" + | "releases.0.5.1" + | "releases.0.5.10" + | "releases.0.5.11" + | "releases.0.5.12" + | "releases.0.5.13" + | "releases.0.6.0" + | "releases.0.7.0" + | "releases.0.8.0" + | "releases.0.8.1" + | "releases.0.8.2" + | "releases.0.8.3" + | "releases.0.8.4" + | "releases.0.8.5" + | "releases.0.8.6" + | "releases.0.8.7" + | "releases.0.8.72" + | "releases.0.8.8" + | "roadmap" + | "search" + | "security" + | "showcase" + | "support" + | "tutorial"; type ApiRoute = never; type RealtimeRoute = never; type EnvironmentKey = never; @@ -27,4 +207,14 @@ declare namespace WRNexusGenerated { type RealtimeMessages = Record; type QueuePayloads = Record; type ApplicationConfig = (typeof import("../../wrnexus.config.ts"))["default"]; + type AssertAssignable = unknown extends Expected + ? true + : [Actual] extends [Expected] + ? [Exclude] extends [never] + ? true + : false + : false; + type __wrn_expect_true = T; + type ApiInput

    = ApiContracts[P][M]["input"]; + type ApiOutput

    = ApiContracts[P][M]["output"]; } diff --git a/bun.lock b/bun.lock index 701311a0..a45f0a09 100644 --- a/bun.lock +++ b/bun.lock @@ -1,5 +1,5 @@ { - "lockfileVersion": 1, + "lockfileVersion": 2, "configVersion": 1, "workspaces": { "": { @@ -7,59 +7,59 @@ "dependencies": { "@iconify-json/lucide": "^1.2.118", "@iconify/tailwind4": "^1.2.3", - "@wrnexus/ai": "^0.8.8", - "@wrnexus/auth": "^0.8.8", - "@wrnexus/authz": "^0.8.8", + "@wrnexus/ai": "^0.8.9", + "@wrnexus/auth": "^0.8.33", + "@wrnexus/authz": "^0.8.15", "@wrnexus/benchmark": "^0.8.8", "@wrnexus/cache": "^0.8.8", - "@wrnexus/captcha": "^0.8.8", - "@wrnexus/compiler": "^0.8.8", - "@wrnexus/content": "^0.8.8", - "@wrnexus/core": "^0.8.8", - "@wrnexus/csr": "^0.8.8", - "@wrnexus/db": "^0.8.8", - "@wrnexus/dev-server": "^0.8.8", - "@wrnexus/dev-toolbar": "^0.8.8", - "@wrnexus/encryption": "^0.8.8", + "@wrnexus/captcha": "^0.8.16", + "@wrnexus/compiler": "^0.8.30", + "@wrnexus/content": "^0.8.9", + "@wrnexus/core": "^0.8.16", + "@wrnexus/csr": "^0.8.43", + "@wrnexus/db": "^0.8.23", + "@wrnexus/dev-server": "^0.8.66", + "@wrnexus/dev-toolbar": "^0.8.18", + "@wrnexus/encryption": "^0.8.10", "@wrnexus/graphql": "^0.8.8", - "@wrnexus/helpers": "^0.8.8", - "@wrnexus/i18n": "^0.8.8", + "@wrnexus/helpers": "^0.8.9", + "@wrnexus/i18n": "^0.8.12", "@wrnexus/identity": "^0.8.8", - "@wrnexus/image": "^0.8.8", - "@wrnexus/jwt": "^0.8.8", - "@wrnexus/language-server": "^0.8.8", + "@wrnexus/image": "^0.8.10", + "@wrnexus/jwt": "^0.8.9", + "@wrnexus/language-server": "^0.8.12", "@wrnexus/mcp": "^0.8.8", "@wrnexus/mobile": "^0.8.8", "@wrnexus/native": "^0.8.8", "@wrnexus/oauth": "^0.8.8", "@wrnexus/observability": "^0.8.8", "@wrnexus/playground": "^0.8.8", - "@wrnexus/plugin": "^0.8.8", - "@wrnexus/pubsub": "^0.8.8", - "@wrnexus/pwa": "^0.8.8", - "@wrnexus/queue": "^0.8.8", - "@wrnexus/reactive": "^0.8.8", - "@wrnexus/realtime": "^0.8.8", - "@wrnexus/router": "^0.8.8", - "@wrnexus/rpc": "^0.8.8", - "@wrnexus/security": "^0.8.8", - "@wrnexus/ssr": "^0.8.8", - "@wrnexus/store": "^0.8.8", - "@wrnexus/styles": "^0.8.8", - "@wrnexus/syntax": "^0.8.8", - "@wrnexus/test": "^0.8.8", + "@wrnexus/plugin": "^0.8.9", + "@wrnexus/pubsub": "^0.8.9", + "@wrnexus/pwa": "^0.8.12", + "@wrnexus/queue": "^0.8.14", + "@wrnexus/reactive": "^0.8.9", + "@wrnexus/realtime": "^0.8.10", + "@wrnexus/router": "^0.8.10", + "@wrnexus/rpc": "^0.8.10", + "@wrnexus/security": "^0.8.9", + "@wrnexus/ssr": "^0.8.12", + "@wrnexus/store": "^0.8.12", + "@wrnexus/styles": "^0.8.26", + "@wrnexus/syntax": "^0.8.19", + "@wrnexus/test": "^0.8.16", "@wrnexus/tracking": "^0.8.8", - "@wrnexus/typecheck": "^0.8.8", - "@wrnexus/ui": "^0.8.8", - "@wrnexus/uploader": "^0.8.8", - "@wrnexus/validation": "^0.8.8", + "@wrnexus/typecheck": "^0.8.17", + "@wrnexus/ui": "^0.8.88", + "@wrnexus/uploader": "^0.8.13", + "@wrnexus/validation": "^0.8.13", }, "devDependencies": { "@eslint/js": "^9.0.0", "@tailwindcss/cli": "^4.0.0", "@types/bun": "latest", "@types/node": "^26.1.1", - "@wrnexus/cli": "^0.8.8", + "@wrnexus/cli": "^0.8.72", "eslint": "^9.0.0", "prettier": "latest", "tailwindcss": "^4.0.0", @@ -69,11 +69,11 @@ }, }, "packages": { - "@antfu/install-pkg": ["@antfu/install-pkg@1.1.0", "", { "dependencies": { "package-manager-detector": "^1.3.0", "tinyexec": "^1.0.1" } }, "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ=="], + "@antfu/install-pkg": ["@antfu/install-pkg@2.1.0", "", { "dependencies": { "package-manager-detector": "^1.8.0", "tinyexec": "^1.3.1" } }, "sha512-sdg9NxU3zR4Mnawfbc/x6GB5Wf17WYud5qOuEuxXjaKpYpMkISSJEjItGebXJ2bQ4DIcly4NYH23mtkGJjvKUw=="], "@cyberalien/svg-utils": ["@cyberalien/svg-utils@1.2.19", "", { "dependencies": { "@iconify/types": "^2.0.0" } }, "sha512-paDJoDu+LhuH5Ma1q0BDqBpg6d16Xk22cZZrlg/s/J9oB8KgnnpU/snaEETJu2G1pwYcWQINUz6WUqu0Wm9k6A=="], - "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ=="], + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.10.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg=="], "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], @@ -83,7 +83,7 @@ "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], - "@eslint/eslintrc": ["@eslint/eslintrc@3.3.6", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.3.0", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA=="], + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.7", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.3.2", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-F42g89Qd5oAWtp0k0nnSrjziAKza7w8SVT4mStc18LZMaRb4J1HQAHLCalEtDCxrTuksx7NU9qsmeLwpOfPqWw=="], "@eslint/js": ["@eslint/js@9.39.5", "", {}, "sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A=="], @@ -101,15 +101,15 @@ "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], - "@iconify-json/lucide": ["@iconify-json/lucide@1.2.118", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-JBnK4YOq6K/lA0JP//27QxFxJ4120TjvfXAzGZZIGjCcXcRRRFxl1rcV7+IWdcVCe90KXdqVaAwLaLf6G3HELw=="], + "@iconify-json/lucide": ["@iconify-json/lucide@1.2.137", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-uKz1+tFbv1RFX/mJQNksdnyKJijNfRGSNnxfiyKtr+dLNfA3ERph+IgpXClKGOlV/5GsZwLv2jgJXQ/bjF/JAg=="], "@iconify/tailwind4": ["@iconify/tailwind4@1.2.3", "", { "dependencies": { "@iconify/tools": "^5.0.5", "@iconify/types": "^2.0.0", "@iconify/utils": "^3.1.0" }, "peerDependencies": { "tailwindcss": ">= 4.0.0" } }, "sha512-z8SKiMHRASJKF/IY//87MF88lcB7ulxh8vlhQXXLWsBkNtOh6ese9R41MyGpQeqXdRvQVt+/fX2glQtHFjQ+MA=="], - "@iconify/tools": ["@iconify/tools@5.0.12", "", { "dependencies": { "@cyberalien/svg-utils": "^1.2.15", "@iconify/types": "^2.0.0", "@iconify/utils": "^3.1.3", "fflate": "^0.8.3", "modern-tar": "^0.7.6", "pathe": "^2.0.3", "svgo": "^4.0.1" } }, "sha512-aFPwSFmFphUPVjNLUkgxgUPSPVgTEEjv0mE7NgvfoQBuE5TtsMrKa4HTY65cM5oXZ2a1xKQcW/RKhiOKEiAarw=="], + "@iconify/tools": ["@iconify/tools@5.0.14", "", { "dependencies": { "@cyberalien/svg-utils": "^1.2.19", "@iconify/types": "^2.0.0", "@iconify/utils": "^3.1.4", "fflate": "^0.8.3", "modern-tar": "^0.8.4", "pathe": "^2.0.3", "svgo": "^4.1.0" } }, "sha512-wJ4ZE3/HZh2iBqLwG+8FOMHe7CMJAJqwSXZSpPwMdj1gZM3Z4t2hbQMVw4Vm45oQ985qn0g89PUIcDEdKTheBA=="], "@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="], - "@iconify/utils": ["@iconify/utils@3.1.4", "", { "dependencies": { "@antfu/install-pkg": "^1.1.0", "@iconify/types": "^2.0.0", "import-meta-resolve": "^4.2.0" } }, "sha512-b1S7B1k9ohZ+iNTi2ATxbRYG9fTrJmUT0rc46bvVnNxqNRGW7dyo/vRREwyniI5IRN2RSJHDcm+s3BjWrSAjHw=="], + "@iconify/utils": ["@iconify/utils@3.1.7", "", { "dependencies": { "@antfu/install-pkg": "^2.0.1", "@iconify/types": "^2.0.0", "import-meta-resolve": "^4.2.0" } }, "sha512-JZHlwdID+dy+lTgbYC8NEC4zeugqeYsc6jewvzb4c58kHauJn+X7rNwQjxz5p2qSjqaEeQoLkCIQ9v/H4PK0/w=="], "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], @@ -117,11 +117,11 @@ "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], - "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.6.0", "", {}, "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw=="], "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - "@noble/hashes": ["@noble/hashes@1.4.0", "", {}, "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg=="], + "@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], "@parcel/watcher": ["@parcel/watcher@2.5.1", "", { "dependencies": { "detect-libc": "^1.0.3", "is-glob": "^4.0.3", "micromatch": "^4.0.5", "node-addon-api": "^7.0.0" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.5.1", "@parcel/watcher-darwin-arm64": "2.5.1", "@parcel/watcher-darwin-x64": "2.5.1", "@parcel/watcher-freebsd-x64": "2.5.1", "@parcel/watcher-linux-arm-glibc": "2.5.1", "@parcel/watcher-linux-arm-musl": "2.5.1", "@parcel/watcher-linux-arm64-glibc": "2.5.1", "@parcel/watcher-linux-arm64-musl": "2.5.1", "@parcel/watcher-linux-x64-glibc": "2.5.1", "@parcel/watcher-linux-x64-musl": "2.5.1", "@parcel/watcher-win32-arm64": "2.5.1", "@parcel/watcher-win32-ia32": "2.5.1", "@parcel/watcher-win32-x64": "2.5.1" } }, "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg=="], @@ -151,183 +151,187 @@ "@parcel/watcher-win32-x64": ["@parcel/watcher-win32-x64@2.5.1", "", { "os": "win32", "cpu": "x64" }, "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA=="], - "@peculiar/asn1-cms": ["@peculiar/asn1-cms@2.8.0", "", { "dependencies": { "@peculiar/asn1-schema": "^2.8.0", "@peculiar/asn1-x509": "^2.8.0", "@peculiar/asn1-x509-attr": "^2.8.0", "asn1js": "^3.0.10", "tslib": "^2.8.1" } }, "sha512-NgekZOrSJFSBFLFoLfwePguAWAx7z1+f2TEsWFUMyiqqfntZ4+S/S5hzqME3q4pCA0iOsFKdwiQ35dwY24eVqA=="], + "@peculiar/asn1-cms": ["@peculiar/asn1-cms@2.10.0", "", { "dependencies": { "@peculiar/asn1-schema": "^2.10.0", "@peculiar/asn1-x509": "^2.10.0", "@peculiar/asn1-x509-attr": "^2.10.0", "asn1js": "^3.0.10", "tslib": "^2.8.1" } }, "sha512-CkX0H4NCIOMHOU3rh2xXZywinYZ/EnJlaOlJiGI0e5L4XjFqHf4iH30LMbXWChVppdA9ljbanjtzQFOhDNfTWg=="], - "@peculiar/asn1-csr": ["@peculiar/asn1-csr@2.8.0", "", { "dependencies": { "@peculiar/asn1-schema": "^2.8.0", "@peculiar/asn1-x509": "^2.8.0", "asn1js": "^3.0.10", "tslib": "^2.8.1" } }, "sha512-akbF8+uvleHs8sejNPQxwmVFuInAg6FMNHOwMILXfP518YfFJwdR3jr6oNUPOaEJfuEhn/vkNOCIT6ASUd4mbg=="], + "@peculiar/asn1-csr": ["@peculiar/asn1-csr@2.10.0", "", { "dependencies": { "@peculiar/asn1-schema": "^2.10.0", "@peculiar/asn1-x509": "^2.10.0", "asn1js": "^3.0.10", "tslib": "^2.8.1" } }, "sha512-jTPTr/9rxKM+niQLMF3jiAMb0lWHUhUHIuSOhdGCIfpB4FAQYf9SoiXOgxP8bS/68IB+bj+1OHvVnDVCQfVUZw=="], - "@peculiar/asn1-ecc": ["@peculiar/asn1-ecc@2.8.0", "", { "dependencies": { "@peculiar/asn1-schema": "^2.8.0", "@peculiar/asn1-x509": "^2.8.0", "asn1js": "^3.0.10", "tslib": "^2.8.1" } }, "sha512-ohwlk+u9Rv2NOAY1c6MfHj45ATVF8R1DUN/WCgABiRtLi2ZftlZWZX7KvpAbU8v9xPcmoILfELeEABj/rn18AQ=="], + "@peculiar/asn1-ecc": ["@peculiar/asn1-ecc@2.10.0", "", { "dependencies": { "@peculiar/asn1-schema": "^2.10.0", "@peculiar/asn1-x509": "^2.10.0", "asn1js": "^3.0.10", "tslib": "^2.8.1" } }, "sha512-GFd3iOjFrWX+QWH2R2dO5QSJyyRGv9CIBKtRlGlPNCvb2RvmCbBDexe91MJgV76c69d998Xsa+CvuQ98seoiPg=="], - "@peculiar/asn1-pfx": ["@peculiar/asn1-pfx@2.8.0", "", { "dependencies": { "@peculiar/asn1-cms": "^2.8.0", "@peculiar/asn1-pkcs8": "^2.8.0", "@peculiar/asn1-rsa": "^2.8.0", "@peculiar/asn1-schema": "^2.8.0", "asn1js": "^3.0.10", "tslib": "^2.8.1" } }, "sha512-5yof1ytoB++RQtaFbqSUJ8pxDJtZT6vbVqZ8XoJ61ph7UjNVvfFwAilnCodqkNsAodpy13gDhoxZXw00pghnyg=="], + "@peculiar/asn1-pfx": ["@peculiar/asn1-pfx@2.10.0", "", { "dependencies": { "@peculiar/asn1-cms": "^2.10.0", "@peculiar/asn1-pkcs8": "^2.10.0", "@peculiar/asn1-rsa": "^2.10.0", "@peculiar/asn1-schema": "^2.10.0", "asn1js": "^3.0.10", "tslib": "^2.8.1" } }, "sha512-1y3QK9ZH1IPleAMmRoJlPS10eGkAWnULETW8zDFNUK1ffqpG7zmDY+kYBMYQgwlcQZ2iitLm2z2EBP0xzRXpaA=="], - "@peculiar/asn1-pkcs8": ["@peculiar/asn1-pkcs8@2.8.0", "", { "dependencies": { "@peculiar/asn1-schema": "^2.8.0", "@peculiar/asn1-x509": "^2.8.0", "asn1js": "^3.0.10", "tslib": "^2.8.1" } }, "sha512-qAKXtLpBEw9LqhKpjw3ajZSXlBur+ipW+y2ivVBQAG6F6qRx94yO+1ZR4mvw+YaCfKSaOzLeYEzsPaBp4SJELA=="], + "@peculiar/asn1-pkcs8": ["@peculiar/asn1-pkcs8@2.10.0", "", { "dependencies": { "@peculiar/asn1-schema": "^2.10.0", "@peculiar/asn1-x509": "^2.10.0", "asn1js": "^3.0.10", "tslib": "^2.8.1" } }, "sha512-Ri+BZT9bnwqlHWmhs7lvWjvJRxKev2hA2+4EbZajgeYWCbR8hyv0znF4DhsFouOhMj2nSDV/iGJ6DMQtwITnCw=="], - "@peculiar/asn1-pkcs9": ["@peculiar/asn1-pkcs9@2.8.0", "", { "dependencies": { "@peculiar/asn1-cms": "^2.8.0", "@peculiar/asn1-pfx": "^2.8.0", "@peculiar/asn1-pkcs8": "^2.8.0", "@peculiar/asn1-schema": "^2.8.0", "@peculiar/asn1-x509": "^2.8.0", "@peculiar/asn1-x509-attr": "^2.8.0", "asn1js": "^3.0.10", "tslib": "^2.8.1" } }, "sha512-b5nDWCnkV60+cQ141D6sVVwK9nz64R5n3zSVnklGd+ECdkW2Ol3U1a6yYFlalpSOaD557yuJB64A+q42jG7lUQ=="], + "@peculiar/asn1-pkcs9": ["@peculiar/asn1-pkcs9@2.10.0", "", { "dependencies": { "@peculiar/asn1-cms": "^2.10.0", "@peculiar/asn1-pfx": "^2.10.0", "@peculiar/asn1-pkcs8": "^2.10.0", "@peculiar/asn1-schema": "^2.10.0", "@peculiar/asn1-x509": "^2.10.0", "@peculiar/asn1-x509-attr": "^2.10.0", "asn1js": "^3.0.10", "tslib": "^2.8.1" } }, "sha512-XIXsbDQFezYk6fudczkuvawkRD4GNpISGCqfYhdkJlvcGF/RFknU+0DDJagOaJqBf+PdPzk4J9oMqDGcvfR9HQ=="], - "@peculiar/asn1-rsa": ["@peculiar/asn1-rsa@2.8.0", "", { "dependencies": { "@peculiar/asn1-schema": "^2.8.0", "@peculiar/asn1-x509": "^2.8.0", "asn1js": "^3.0.10", "tslib": "^2.8.1" } }, "sha512-zHEUlCqB2mk7x2lxDwHHJy7hWZOPdGHVlsmITWKB5/PbQo61atbu9PJ/0r9dQNMwFzbKPXZ8uK8/91eUhRznSg=="], + "@peculiar/asn1-rsa": ["@peculiar/asn1-rsa@2.10.0", "", { "dependencies": { "@peculiar/asn1-schema": "^2.10.0", "@peculiar/asn1-x509": "^2.10.0", "asn1js": "^3.0.10", "tslib": "^2.8.1" } }, "sha512-4Jvmwlh3gZAhNZ4/u7JSyLuce9hofOFZ4o3PYKAccCImGnyaT5CMym/ATgvAvqpOYFNW531oPZvJlEBhJy9VfA=="], - "@peculiar/asn1-schema": ["@peculiar/asn1-schema@2.8.0", "", { "dependencies": { "@peculiar/utils": "^2.0.2", "asn1js": "^3.0.10", "tslib": "^2.8.1" } }, "sha512-7YT0U/ze0tF2QOBbE15gKZwy5tvgGyLRiRHLzhlbOpf7BT032oBSd0haZqXn5W6l26WLlu3dyxzjM+2638/z2Q=="], + "@peculiar/asn1-schema": ["@peculiar/asn1-schema@2.10.0", "", { "dependencies": { "@peculiar/utils": "^2.0.2", "asn1js": "^3.0.10", "tslib": "^2.8.1" } }, "sha512-GhokD41lV4gQrrLYm3wCkHfBOnJrnhDMgt4XeMW8gzfE1UdJqIuSwsE+ggf82XBjUXRJylcm+KIGQFa4utIVLw=="], - "@peculiar/asn1-x509": ["@peculiar/asn1-x509@2.8.0", "", { "dependencies": { "@peculiar/asn1-schema": "^2.8.0", "@peculiar/utils": "^2.0.2", "asn1js": "^3.0.10", "tslib": "^2.8.1" } }, "sha512-N0CMuhWUzsWEVq6F1q9X6+VKUnWzSW+cSVg+aPaGGwDdbFoFWTYgin5MHwXgpWd6y9COMBxnfy/Qc+Xc7F0Zwg=="], + "@peculiar/asn1-x509": ["@peculiar/asn1-x509@2.10.0", "", { "dependencies": { "@peculiar/asn1-schema": "^2.10.0", "@peculiar/utils": "^2.0.2", "asn1js": "^3.0.10", "tslib": "^2.8.1" } }, "sha512-ucNVg8+ANveTpMN3fy9lA2alryONdXc2A4cEG2hMniWbvQt+YOZoe8BI80YYNO8FBcuDY1qbDQ4uQGQVraHxGA=="], - "@peculiar/asn1-x509-attr": ["@peculiar/asn1-x509-attr@2.8.0", "", { "dependencies": { "@peculiar/asn1-schema": "^2.8.0", "@peculiar/asn1-x509": "^2.8.0", "asn1js": "^3.0.10", "tslib": "^2.8.1" } }, "sha512-tHjkfS/qhMnmrlB2J9NhflQlQ7In3khO3CfmVrriOlpTeErY9ZIKOso1hQ5JQiyrJ7ShvqVPk7E5fQmbclkSKA=="], + "@peculiar/asn1-x509-attr": ["@peculiar/asn1-x509-attr@2.10.0", "", { "dependencies": { "@peculiar/asn1-schema": "^2.10.0", "@peculiar/asn1-x509": "^2.10.0", "asn1js": "^3.0.10", "tslib": "^2.8.1" } }, "sha512-/85GtKOKmgvuSJNlaFfwGWNdRSZZ+hpF02NyM01XiCdzpaZONiBltDyfluFPvFx966CR+ZHNSG1jniwpy07oGg=="], "@peculiar/utils": ["@peculiar/utils@2.0.3", "", { "dependencies": { "tslib": "^2.8.1" } }, "sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ=="], "@peculiar/x509": ["@peculiar/x509@1.14.3", "", { "dependencies": { "@peculiar/asn1-cms": "^2.6.0", "@peculiar/asn1-csr": "^2.6.0", "@peculiar/asn1-ecc": "^2.6.0", "@peculiar/asn1-pkcs9": "^2.6.0", "@peculiar/asn1-rsa": "^2.6.0", "@peculiar/asn1-schema": "^2.6.0", "@peculiar/asn1-x509": "^2.6.0", "pvtsutils": "^1.3.6", "reflect-metadata": "^0.2.2", "tslib": "^2.8.1", "tsyringe": "^4.10.0" } }, "sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA=="], - "@tailwindcss/cli": ["@tailwindcss/cli@4.3.2", "", { "dependencies": { "@parcel/watcher": "2.5.1", "@tailwindcss/node": "4.3.2", "@tailwindcss/oxide": "4.3.2", "enhanced-resolve": "5.21.6", "mri": "^1.2.0", "picocolors": "^1.1.1", "tailwindcss": "4.3.2" }, "bin": { "tailwindcss": "./dist/index.mjs" } }, "sha512-Fzt+HrIZHDlkRYKdLMBeufaroaPvwCBG70sMLdmurdeadNMO/LxbmT8Sbb+P83ep0iAlAImettb7Y+rO+37rXw=="], + "@tailwindcss/cli": ["@tailwindcss/cli@4.3.3", "", { "dependencies": { "@parcel/watcher": "2.5.1", "@tailwindcss/node": "4.3.3", "@tailwindcss/oxide": "4.3.3", "enhanced-resolve": "^5.24.1", "mri": "^1.2.0", "picocolors": "^1.1.1", "tailwindcss": "4.3.3" }, "bin": { "tailwindcss": "./dist/index.mjs" } }, "sha512-ZvS/n1ZHOBKcVlhkt8l5NNr1EDXk1NboYO5CYDOs6NUmvT9z6bzkwsosaJftY57T/3gWNzWMJzIXLodZC8ssdw=="], - "@tailwindcss/node": ["@tailwindcss/node@4.3.2", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "5.21.6", "jiti": "^2.7.0", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.3.2" } }, "sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg=="], + "@tailwindcss/node": ["@tailwindcss/node@4.3.3", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.24.1", "jiti": "^2.7.0", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.3.3" } }, "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg=="], - "@tailwindcss/oxide": ["@tailwindcss/oxide@4.3.2", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.3.2", "@tailwindcss/oxide-darwin-arm64": "4.3.2", "@tailwindcss/oxide-darwin-x64": "4.3.2", "@tailwindcss/oxide-freebsd-x64": "4.3.2", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.2", "@tailwindcss/oxide-linux-arm64-gnu": "4.3.2", "@tailwindcss/oxide-linux-arm64-musl": "4.3.2", "@tailwindcss/oxide-linux-x64-gnu": "4.3.2", "@tailwindcss/oxide-linux-x64-musl": "4.3.2", "@tailwindcss/oxide-wasm32-wasi": "4.3.2", "@tailwindcss/oxide-win32-arm64-msvc": "4.3.2", "@tailwindcss/oxide-win32-x64-msvc": "4.3.2" } }, "sha512-z8ZgnzX8gdNoWLBLqBPoh/sjnxkwvf9ZuWjnO0l0yIzbLa5/9S+eC5QxGZKRobVHIC3/1BoMWjHblqWjcgFgag=="], + "@tailwindcss/oxide": ["@tailwindcss/oxide@4.3.3", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.3.3", "@tailwindcss/oxide-darwin-arm64": "4.3.3", "@tailwindcss/oxide-darwin-x64": "4.3.3", "@tailwindcss/oxide-freebsd-x64": "4.3.3", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", "@tailwindcss/oxide-linux-x64-musl": "4.3.3", "@tailwindcss/oxide-wasm32-wasi": "4.3.3", "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" } }, "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA=="], - "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.3.2", "", { "os": "android", "cpu": "arm64" }, "sha512-WHxqIuHpvZ5VtdX6GTl1Ik/Vp2YuN42Et+0CdeaVd/frQ9jAvGmvR8vLT+jk3e8/Q3x8kECB9+R17pgpp2BulA=="], + "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.3.3", "", { "os": "android", "cpu": "arm64" }, "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw=="], - "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.3.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-GZypeUY/IDJW3877KeM+O67vbXr3MBnbtEL4aYhNErv/JWZhye2vGSWWG9tB6iiqR2MqRNkY8IOUy4NdSZV26w=="], + "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.3.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw=="], - "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.3.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-UIIzmefR6KO1sDU7MzRqAxC8iBpft/VhkGjTjnhoS6k7Z3rQ9wEgA1ODSiyH/tcSYssulNm4Ci3hOeK1jH7ccQ=="], + "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.3.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw=="], - "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.3.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-GN+uAmcI6DNspnCDwtOAZrTz6oukJnp337qZvxqCGLd3BHBzJpO0ZbTLRvJNdztOeAmTzewewGIMPb0tk2R4WA=="], + "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.3.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw=="], - "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.3.2", "", { "os": "linux", "cpu": "arm" }, "sha512-4ABn7qSbdHRwTiDiuWNegCyb5+2FJ4vKIKc3DmKrvAFw7MU1Lm11dIkTPwUaFdTzc7IsOpDbqBrlh0x6y36U/w=="], + "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3", "", { "os": "linux", "cpu": "arm" }, "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ=="], - "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.3.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-wDgEIGwoM8w8pufh9LVt1PahDgNdKXrLC2qfAnV3vAmococ9RWbxeAw4pxPttd/TsJfwjyLf90Dg1y9y8I6Emw=="], + "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.3.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w=="], - "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.3.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-J5Nuk0uZQIiMTJj3LEx4sAA9tMFUoXQZFv1J6An+QGYe53HKRJuFDi0rpq/tuouCZeAbOBY3kQ6g8qeD4TUjtA=="], + "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.3.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA=="], - "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.3.2", "", { "os": "linux", "cpu": "x64" }, "sha512-kqCZpSKOBEJO4mz7OqWoofBZeXTAwaVGPj0ErAj7CojmhKpWVWVOnrt9dE8odoIraZq4oj3ausM37kXi+Tow8w=="], + "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.3.3", "", { "os": "linux", "cpu": "x64" }, "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w=="], - "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.3.2", "", { "os": "linux", "cpu": "x64" }, "sha512-cixpqbh2toJDmkuCRI68nXA8ZxNmdK9Y+9v5h3MC3ZQKy/0BO8AWzlkWyRM7JAFSGBlfig4YVTPsK6MVgqz1uw=="], + "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.3.3", "", { "os": "linux", "cpu": "x64" }, "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img=="], - "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.3.2", "", { "dependencies": { "@emnapi/core": "^1.11.1", "@emnapi/runtime": "^1.11.1", "@emnapi/wasi-threads": "^1.2.2", "@napi-rs/wasm-runtime": "^1.1.4", "@tybys/wasm-util": "^0.10.2", "tslib": "^2.8.1" }, "cpu": "none" }, "sha512-4ec2Z/LOmRsAgU23CS4xeJfcJlmRg94A/XrbGRCF1gyU/zdDfRLYDVsS+ynSZCmGNxQ1jQriQOKMQeQxBA3Isw=="], + "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.3.3", "", { "dependencies": { "@emnapi/core": "^1.11.1", "@emnapi/runtime": "^1.11.1", "@emnapi/wasi-threads": "^1.2.2", "@napi-rs/wasm-runtime": "^1.1.4", "@tybys/wasm-util": "^0.10.2", "tslib": "^2.8.1" }, "cpu": "none" }, "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ=="], - "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.3.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-Zyr/M0+XcYZu3bZrUytc7TXvrk0ftWfl8gN2MwekNDzhqhKRUucMPSeOzM0o0wH5AWOU49BsKRrfKxI2atCPMQ=="], + "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.3.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ=="], - "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.3.2", "", { "os": "win32", "cpu": "x64" }, "sha512-QI9BO7KlNZsp2GuO0jwAAj5jCDABOKXRkCk2XuKTSaNEFSdfzqswYVTtCHBNKHLsqyjFyFkqlDiwkNbTYSssMQ=="], + "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.3.3", "", { "os": "win32", "cpu": "x64" }, "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw=="], - "@types/bun": ["@types/bun@1.3.14", "", { "dependencies": { "bun-types": "1.3.14" } }, "sha512-h1hFqFVcvAvD9j9K7ZW7vd82aSA+rTdznZa+5bwvCwqSB1jmmfLcbIWhOLx1/+boy/xmjgCs/OMUL8hRJSmnPw=="], + "@types/bun": ["@types/bun@1.4.2", "", { "dependencies": { "bun-types": "1.4.2" } }, "sha512-GimotNn7+ZV0uVArItBbriZsR1oNf0+WTzPkdcFrzShI7k2norL0uzEaJT8T33dWr7O/c9ZDuAFQrctKCi72oQ=="], "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], - "@types/node": ["@types/node@26.1.1", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw=="], + "@types/node": ["@types/node@26.6.3", "", { "dependencies": { "undici-types": "~8.9.0" } }, "sha512-dsqMQQoeTLqu9wynDD00q573mNzso3IdQOAfHRJqLCcmCFPoGo9A1bDpUcv/9tnKpErQWv9uKeGfl37EIS02Yg=="], - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.63.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.63.0", "@typescript-eslint/type-utils": "8.63.0", "@typescript-eslint/utils": "8.63.0", "@typescript-eslint/visitor-keys": "8.63.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.63.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-rvwSgqT+DHpWdzfSzPatRLm02a0GlESt++9iy3hLCDY4BgkaLcl8LBi9Yh7XGFBpwcBE/K3024QuXWTpbz4FfQ=="], + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.71.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.71.0", "@typescript-eslint/type-utils": "8.71.0", "@typescript-eslint/utils": "8.71.0", "@typescript-eslint/visitor-keys": "8.71.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.71.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-pqcS9c1HxZTHt7End4nXqd0s5lJrrFzrgCkKFJrsbUnaL6M3+6oBFZaslg6Gjsl3argl2DDRFROnXARaZ2e4Nw=="], - "@typescript-eslint/parser": ["@typescript-eslint/parser@8.63.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.63.0", "@typescript-eslint/types": "8.63.0", "@typescript-eslint/typescript-estree": "8.63.0", "@typescript-eslint/visitor-keys": "8.63.0", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-gwh4gvvlaVDKKxyfxMG+Gnu1u9X0OQBwyGLkbwB65dIzBKnxeRiJlNFqlI3zwVhNXJIs6qV7mlFCn/BIajlVig=="], + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.71.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.71.0", "@typescript-eslint/types": "8.71.0", "@typescript-eslint/typescript-estree": "8.71.0", "@typescript-eslint/visitor-keys": "8.71.0", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-CG4nPk1f2zc8yw4pALqHsFYH2hdo+h1T9daSp21+Hnxi9LOE3GT9hAfTKJCBXVNM2GmYs1eMEP615wPoeOgk3A=="], - "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.63.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.63.0", "@typescript-eslint/types": "^8.63.0", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-e5dh0/UI0ok53AlZ5wRkXCB32z/f2jUZqPR/ygAw5WYaSw8j9EoJWlS7wQjr/dmOaqWjnPIn2m+HhVPCMWGZVQ=="], + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.71.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.71.0", "@typescript-eslint/types": "^8.71.0", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-aABjw5rjBacYONVPaPiWOCjJu0vEF4a25iQuodlmQYL1trtLZ0X/y+2Vzl3BKI1odM4LnwLE1oUDXYp1wzx1TQ=="], - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.63.0", "", { "dependencies": { "@typescript-eslint/types": "8.63.0", "@typescript-eslint/visitor-keys": "8.63.0" } }, "sha512-uUyfMWCnDSN8bCpcrY8nGP2BLkQ9Xn0GsipcONcpIDWhwhO4ZSyHvyS14U3X75mzxWxL3I2UZIrenTzdzcJO8A=="], + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.71.0", "", { "dependencies": { "@typescript-eslint/types": "8.71.0", "@typescript-eslint/visitor-keys": "8.71.0" } }, "sha512-gWF0BhUcnjZxSpLE8ngS/59n2SB0J3YqRxvX1+2aoRJk9hNtHSLOV+TcarFiOr5ipXm3yc1QrI4c9YZc8zyCxw=="], - "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.63.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-sUAbkulqBAsncKnbRP3+7CtQFRKicexnj7ZwNC6ddCR7EmrXvjvdCYMJbUIqMd6lwoEriZjwLo08aS5tSjVMHg=="], + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.71.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-Z1UlWHADEK2Mlb9NpWfDeSjqoZ5EyrOv4R3eQpbkzqn/EwaIdOpXXupEA1+0ZIOSJSZZDBHG0BrQyN8zUG6Pwg=="], - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.63.0", "", { "dependencies": { "@typescript-eslint/types": "8.63.0", "@typescript-eslint/typescript-estree": "8.63.0", "@typescript-eslint/utils": "8.63.0", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-Nzzh/OGxVCOjObjaj1CQF2RUasyYy2Jfuh+zZ3PjLzG2fYRriAiZLib9UKtO+CpQAS3YHiAS+ckZDclwqI1TPA=="], + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.71.0", "", { "dependencies": { "@typescript-eslint/types": "8.71.0", "@typescript-eslint/typescript-estree": "8.71.0", "@typescript-eslint/utils": "8.71.0", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-i8uO1qbdxeKgRnS5sCRt6On3/nfo2d2DwQe3Yvjx543zLy7r8ySqRuPPiIIXAhS03U0v5NfAFx+rUgxFzKKwNw=="], - "@typescript-eslint/types": ["@typescript-eslint/types@8.63.0", "", {}, "sha512-xyLtl9DUBBFrcJS4x2pIqGLH68/tC2uOa4Z7pUteW09D3bXnnXUom4dyPikzWgB7llmIc1zoeI3aoUdC4rPK/Q=="], + "@typescript-eslint/types": ["@typescript-eslint/types@8.71.0", "", {}, "sha512-cJ4OoxPGWvFnBTnSZyaU+qJzGTqPTGJY+gDchj6cRyLRdmIdt4rcsE4twj+zPfrNiWuVi38wijHzShL++Z9atQ=="], - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.63.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.63.0", "@typescript-eslint/tsconfig-utils": "8.63.0", "@typescript-eslint/types": "8.63.0", "@typescript-eslint/visitor-keys": "8.63.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-ygBkU+B7ex5UI/gKhaqexWev79uISfIv7XQCRNYO/jmD8rGLPyWLAb3KMRT6nd8Gt9bmUBi9+iX6tBdYfOY81Q=="], + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.71.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.71.0", "@typescript-eslint/tsconfig-utils": "8.71.0", "@typescript-eslint/types": "8.71.0", "@typescript-eslint/visitor-keys": "8.71.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-PEEF4G5sLLWAS5BpPrUvms4ySZkiBQQZM4z+3ReI46axK5Vqr/vXBQatJQIZZOYdGyPUAKTtsrWzpqKuU+3DEw=="], - "@typescript-eslint/utils": ["@typescript-eslint/utils@8.63.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.63.0", "@typescript-eslint/types": "8.63.0", "@typescript-eslint/typescript-estree": "8.63.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-fUKaeAvrTuQg/Tgt3nliAUSZHJM6DlCcfyEmxCvlX8kieWSStBX+5O5Fnidtc3i2JrH+9c/GL4RY2iasd/GPTA=="], + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.71.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.71.0", "@typescript-eslint/types": "8.71.0", "@typescript-eslint/typescript-estree": "8.71.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-pKR/tEMVrXZG23UFKUn5BQf3zfmfk7KQceI2cGzywZ5nxM5Eu3hEJU1utjWzydtzBbcJAQhHN8iPCxobHpPcZQ=="], - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.63.0", "", { "dependencies": { "@typescript-eslint/types": "8.63.0", "eslint-visitor-keys": "^5.0.0" } }, "sha512-UexrHGnGTpbuQHct2ExOc2ZcFbGUS9FOesCxxqdBGcpI1BxYu/LZ6U8Aq6/72XtF/qRBk9nhuGHFJIXXMhPMdw=="], + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.71.0", "", { "dependencies": { "@typescript-eslint/types": "8.71.0", "eslint-visitor-keys": "^5.0.0" } }, "sha512-8eQ9R218XORK+KLosnf4bu/QsUXvUyVwTbArg7/0NMB1Pu87OJKvj4nhFblkYE8gQV73mW1dx1ptlPCkwRGa7A=="], - "@wrnexus/ai": ["@wrnexus/ai@0.8.8", "", {}, "sha512-TBSJ9z/+LXP54EIvX1h5uBo3O6gBPXFZwJPPzglpcYW3rj+azzrxA79IrGYvAIKAkwEY4+tAZQqqTKMU0844Pg=="], + "@vscode/l10n": ["@vscode/l10n@0.0.18", "", {}, "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ=="], - "@wrnexus/auth": ["@wrnexus/auth@0.8.8", "", { "dependencies": { "@wrnexus/authz": "^0.8.8", "@wrnexus/captcha": "^0.8.8", "@wrnexus/core": "^0.8.8", "@wrnexus/db": "^0.8.8", "@wrnexus/encryption": "^0.8.8", "@wrnexus/jwt": "^0.8.8", "@wrnexus/oauth": "^0.8.8", "@wrnexus/plugin": "^0.8.8", "@wrnexus/queue": "^0.8.8", "@wrnexus/ui": "^0.8.8", "@wrnexus/validation": "^0.8.8" } }, "sha512-yUChoGXFFwCiJYUtU4Der7bLDg4pRwWHZG46l0IGI0l48nfoHGz0IywXsfS1EulnGG0dDFKyVR5Fz60u7aVh+g=="], + "@wrnexus/ai": ["@wrnexus/ai@0.8.9", "https://registry.workroot.in/repository/npm/@wrnexus/ai/-/ai-0.8.9.tgz", {}, "sha512-vhAJk8qlDSyyfjx6xQCe8xj7/9Yi+qNDY/XCG50Ub77YYaR6f7dMwP9w68dxDfFhR8F4FfXz0SiCr61y2VI7iA=="], - "@wrnexus/authz": ["@wrnexus/authz@0.8.8", "", { "dependencies": { "@wrnexus/core": "^0.8.8", "@wrnexus/db": "^0.8.8" } }, "sha512-PnYddvFOuHyYIHeGts+CrXHl7TjIDB5BlCdUcM/d+ijYUY1+KVtp+oUoBsaR4bZMTFm0x+LACy12OQkx2AU/Ww=="], + "@wrnexus/auth": ["@wrnexus/auth@0.8.33", "https://registry.workroot.in/repository/npm/@wrnexus/auth/-/auth-0.8.33.tgz", { "dependencies": { "@wrnexus/authz": "^0.8.15", "@wrnexus/captcha": "^0.8.16", "@wrnexus/core": "^0.8.16", "@wrnexus/db": "^0.8.23", "@wrnexus/encryption": "^0.8.10", "@wrnexus/jwt": "^0.8.9", "@wrnexus/oauth": "^0.8.8", "@wrnexus/plugin": "^0.8.9", "@wrnexus/queue": "^0.8.14", "@wrnexus/ui": "^0.8.84", "@wrnexus/validation": "^0.8.13" } }, "sha512-cYzne54IP7krY7YNT0ieg6CBYo65XxtucpL+A5EYlY73rHTYs/Ci5OjLSOOKx1rZagxDWu9y5fWy7AapafXaZw=="], - "@wrnexus/benchmark": ["@wrnexus/benchmark@0.8.8", "", {}, "sha512-g0HtpwbcXhw4sch/cdIHPHJV1GqjnhwvEYoIx7HBXWmET6iZe2R9jh35YuxY/rJG892WMk7zgI/jLCnnxwye5w=="], + "@wrnexus/authz": ["@wrnexus/authz@0.8.15", "https://registry.workroot.in/repository/npm/@wrnexus/authz/-/authz-0.8.15.tgz", { "dependencies": { "@wrnexus/core": "^0.8.12", "@wrnexus/db": "^0.8.20", "@wrnexus/plugin": "^0.8.8" } }, "sha512-ZV1cvHrOkephfjs/gzzcLkN4HEHSFWJVZVmfsvir/GZs/X7+ZQbPNYUQZV7SsRlyMkUxgTKMCiZ8Ym49eOBSQw=="], - "@wrnexus/cache": ["@wrnexus/cache@0.8.8", "", { "dependencies": { "@wrnexus/core": "^0.8.8" } }, "sha512-gB1UB4PxklgEsBTApWwVi0eVhbGOZcr47dLwjxpLT+3aS9b65kTupE+0BJhEAxa2Qh2aikgdfH40XvTPfjrUrg=="], + "@wrnexus/benchmark": ["@wrnexus/benchmark@0.8.8", "https://registry.workroot.in/repository/npm/@wrnexus/benchmark/-/benchmark-0.8.8.tgz", {}, "sha512-o6/El/DceF853XjU4+BPWT1MPhMtZybjv36YQSISYFEy/wU4LrbzDsZeO0w/p8Alkx0KLy/CCphlPQUr4WZjag=="], - "@wrnexus/captcha": ["@wrnexus/captcha@0.8.8", "", { "dependencies": { "@wrnexus/core": "^0.8.8", "@wrnexus/plugin": "^0.8.8", "@wrnexus/ui": "^0.8.8", "@wrnexus/validation": "^0.8.8" } }, "sha512-/fxuTv9KZv6Clci/GsQzOj1NWXop55bSA/ntUJGudqEl6Ss7R7qrvXp5JFvuUTeaqRnBG+dMRMKIoLkAt7LsAw=="], + "@wrnexus/cache": ["@wrnexus/cache@0.8.8", "https://registry.workroot.in/repository/npm/@wrnexus/cache/-/cache-0.8.8.tgz", { "dependencies": { "@wrnexus/core": "^0.8.9" } }, "sha512-GSV2myyy8xVeI8LdtJoIffW6fveCqB4WWN0CaodhVpI+4Y2aEmfJ6qwFikf34qI8Fy1+2ca9sKl5t1494kZBvw=="], - "@wrnexus/cli": ["@wrnexus/cli@0.8.8", "", { "dependencies": { "@wrnexus/authz": "^0.8.8", "@wrnexus/compiler": "^0.8.8", "@wrnexus/core": "^0.8.8", "@wrnexus/csr": "^0.8.8", "@wrnexus/db": "^0.8.8", "@wrnexus/dev-server": "^0.8.8", "@wrnexus/i18n": "^0.8.8", "@wrnexus/mcp": "^0.8.8", "@wrnexus/playground": "^0.8.8", "@wrnexus/plugin": "^0.8.8", "@wrnexus/router": "^0.8.8", "@wrnexus/security": "^0.8.8", "@wrnexus/styles": "^0.8.8", "@wrnexus/syntax": "^0.8.8", "@wrnexus/typecheck": "^0.8.8", "@wrnexus/ui": "^0.8.8", "@wrnexus/validation": "^0.8.8", "selfsigned": "^5.5.0" }, "bin": { "wrnexus": "dist/index.js" } }, "sha512-v4F7iPiSRVw0zUGkGavss1j2uYta7L1zzy80aR2++Dy2C1QEpkf3wIzcQmLDL6RPJqtL3RgeMKu8IZDVsswB3A=="], + "@wrnexus/captcha": ["@wrnexus/captcha@0.8.16", "https://registry.workroot.in/repository/npm/@wrnexus/captcha/-/captcha-0.8.16.tgz", { "dependencies": { "@wrnexus/core": "^0.8.12", "@wrnexus/plugin": "^0.8.8", "@wrnexus/ui": "^0.8.76", "@wrnexus/validation": "^0.8.13" } }, "sha512-iBMnhn9RcnsdHOKgHFIwSkZ8NvTZIJ3J+gqbeGQCGpdRAuI+sI87paiUr9QXNgXqH0HlWEhYmaX/850Dsd4XcA=="], - "@wrnexus/compiler": ["@wrnexus/compiler@0.8.8", "", { "dependencies": { "@wrnexus/csr": "^0.8.8", "@wrnexus/store": "^0.8.8", "@wrnexus/syntax": "^0.8.8", "@wrnexus/validation": "^0.8.8" } }, "sha512-yX6lMLT+ZHxPO7t2EFi3fAPAqMvXPebKZIXt/haE8bKX+Ay5uyAuicMwZn95hXw/X6m0eCRGDaLdEwqU5hMBaw=="], + "@wrnexus/cli": ["@wrnexus/cli@0.8.72", "https://registry.workroot.in/repository/npm/@wrnexus/cli/-/cli-0.8.72.tgz", { "dependencies": { "@wrnexus/authz": "^0.8.15", "@wrnexus/compiler": "^0.8.30", "@wrnexus/core": "^0.8.16", "@wrnexus/csr": "^0.8.41", "@wrnexus/db": "^0.8.23", "@wrnexus/dev-server": "^0.8.66", "@wrnexus/i18n": "^0.8.12", "@wrnexus/mcp": "^0.8.8", "@wrnexus/playground": "^0.8.8", "@wrnexus/plugin": "^0.8.9", "@wrnexus/react": "^0.8.9", "@wrnexus/router": "^0.8.10", "@wrnexus/security": "^0.8.9", "@wrnexus/styles": "^0.8.25", "@wrnexus/syntax": "^0.8.19", "@wrnexus/typecheck": "^0.8.17", "@wrnexus/ui": "^0.8.85", "@wrnexus/validation": "^0.8.13", "selfsigned": "^5.5.0" }, "bin": { "wrnexus": "dist/index.js" } }, "sha512-JeFsDMldcjiUFMhal11V/bfg/dNcG+OJh7+Bt6lmU3ojxTajvxV6pjLPp022hYDBZPu83jupiF4WZPwOLy/+Bw=="], - "@wrnexus/content": ["@wrnexus/content@0.8.8", "", {}, "sha512-Va37m2vxiEZ2pspPUxX9kE/nTQ+4VA9KfZ5kI7umKYV6lWWJoUbMLfTg5PtWN0DBI9vXG4a3yGLlxRx+IqynPg=="], + "@wrnexus/compiler": ["@wrnexus/compiler@0.8.30", "https://registry.workroot.in/repository/npm/@wrnexus/compiler/-/compiler-0.8.30.tgz", { "dependencies": { "@wrnexus/csr": "^0.8.41", "@wrnexus/store": "^0.8.12", "@wrnexus/syntax": "^0.8.19", "@wrnexus/validation": "^0.8.13" } }, "sha512-zsxqcIMOzXxX98z6RFffwQUa6VuniOqGZO/vxDdOJiyJ8RTs7gOk8dsBhA6MTLQ1fafPxJPV3zkGotKXOuxhCQ=="], - "@wrnexus/core": ["@wrnexus/core@0.8.8", "", {}, "sha512-R4ViefmkLIAENYn+HJP/YwlzQaABFqgiEjbk1A1z0ZQdcI/NhrMik/hG+05gfMFQPM1t27kM4jqewAibJEoEMA=="], + "@wrnexus/content": ["@wrnexus/content@0.8.9", "https://registry.workroot.in/repository/npm/@wrnexus/content/-/content-0.8.9.tgz", {}, "sha512-8ue55L7FVoKJwQyFVUt5dePEzYzboNUssnzUOIWCoB3BOVnm5D+YYHTaB21AKcAR/oAP+e86zXt2D+l7VFEDFA=="], - "@wrnexus/csr": ["@wrnexus/csr@0.8.8", "", { "dependencies": { "@wrnexus/core": "^0.8.8" } }, "sha512-OooOCDs3HRrLUxBAHoNiDWIRYImK6W917FdntefEMS7YkhBw7bJxOkcOQtPdXP6ndN9BODQiaVik2BGDCUasAg=="], + "@wrnexus/core": ["@wrnexus/core@0.8.16", "https://registry.workroot.in/repository/npm/@wrnexus/core/-/core-0.8.16.tgz", {}, "sha512-lTNigmTpJsgQnB95xMhalJ6Xbp/QBUf9J0MM4cuiecZ1DQLpaSgGC12Sn7FIC46rTU4w8878XJXlVWDCabe16Q=="], - "@wrnexus/db": ["@wrnexus/db@0.8.8", "", {}, "sha512-xlX+vXDj6n7kfqnnrWiSZiqHgb30ZcIvKMR4vppDxbxI6daZ/uVm+jGtWkJL38sqJFLFcEuj0xYjiiYBAeKUwA=="], + "@wrnexus/csr": ["@wrnexus/csr@0.8.43", "https://registry.workroot.in/repository/npm/@wrnexus/csr/-/csr-0.8.43.tgz", { "dependencies": { "@wrnexus/core": "^0.8.12" } }, "sha512-czmxeLxvNvD7XjU3TufFBGMzuDWpNB0qpYbmbiARB7l6rslBw3+GuBWf2U5k4DH6oYiN/DGD6Jj+/G3bEh6ARw=="], - "@wrnexus/dev-server": ["@wrnexus/dev-server@0.8.8", "", { "dependencies": { "@wrnexus/authz": "^0.8.8", "@wrnexus/cache": "^0.8.8", "@wrnexus/compiler": "^0.8.8", "@wrnexus/core": "^0.8.8", "@wrnexus/csr": "^0.8.8", "@wrnexus/db": "^0.8.8", "@wrnexus/dev-toolbar": "^0.8.8", "@wrnexus/i18n": "^0.8.8", "@wrnexus/observability": "^0.8.8", "@wrnexus/plugin": "^0.8.8", "@wrnexus/pubsub": "^0.8.8", "@wrnexus/pwa": "^0.8.8", "@wrnexus/router": "^0.8.8", "@wrnexus/rpc": "^0.8.8", "@wrnexus/security": "^0.8.8", "@wrnexus/ssr": "^0.8.8", "@wrnexus/store": "^0.8.8", "@wrnexus/styles": "^0.8.8", "@wrnexus/ui": "^0.8.8", "@wrnexus/uploader": "^0.8.8", "@wrnexus/validation": "^0.8.8" } }, "sha512-m3Gou8RuWTYTo9qQfQHCFQDzbL4yNRCbRsCrn21umK+1HXx0Efk+Nd7RoA4nPAQP5AaDkwSfd8nb+5YtakTUIA=="], + "@wrnexus/db": ["@wrnexus/db@0.8.23", "https://registry.workroot.in/repository/npm/@wrnexus/db/-/db-0.8.23.tgz", {}, "sha512-ncZlvclHW98Enah9wlHOf9+StoVGLrCOCVBAOEFdZKV91vKnYDltcFlmG7i7crndN37kayyb319Wiwol8Hmhyg=="], - "@wrnexus/dev-toolbar": ["@wrnexus/dev-toolbar@0.8.8", "", {}, "sha512-WrRRXyzAaDfXdxTJsM3p4s9vBc2vVJtGkIkvOHdtvX9S89OqnuqKluqwixlHGedB7m+J+LqCcrbD6OfdNP2VEQ=="], + "@wrnexus/dev-server": ["@wrnexus/dev-server@0.8.66", "https://registry.workroot.in/repository/npm/@wrnexus/dev-server/-/dev-server-0.8.66.tgz", { "dependencies": { "@wrnexus/authz": "^0.8.15", "@wrnexus/cache": "^0.8.8", "@wrnexus/compiler": "^0.8.30", "@wrnexus/core": "^0.8.16", "@wrnexus/csr": "^0.8.41", "@wrnexus/db": "^0.8.23", "@wrnexus/dev-toolbar": "^0.8.18", "@wrnexus/i18n": "^0.8.12", "@wrnexus/observability": "^0.8.8", "@wrnexus/plugin": "^0.8.9", "@wrnexus/pubsub": "^0.8.9", "@wrnexus/pwa": "^0.8.12", "@wrnexus/queue": "^0.8.14", "@wrnexus/react": "^0.8.9", "@wrnexus/router": "^0.8.10", "@wrnexus/rpc": "^0.8.10", "@wrnexus/security": "^0.8.9", "@wrnexus/ssr": "^0.8.12", "@wrnexus/store": "^0.8.12", "@wrnexus/styles": "^0.8.23", "@wrnexus/ui": "^0.8.84", "@wrnexus/uploader": "^0.8.13", "@wrnexus/validation": "^0.8.13" } }, "sha512-RBJWyUEGmOS6ZgIm5NvNPB4BVhVIpGFEEf4NSLDKJtp/Z5K2+G44KbRhZaaYvl6F4IEZM2Zg5x+ZAX+o5XB34w=="], - "@wrnexus/encryption": ["@wrnexus/encryption@0.8.8", "", { "dependencies": { "@wrnexus/core": "^0.8.8" } }, "sha512-AKy4kEBIJsbw9OPXlfKqVnidbQqQmglqWnDQuTgtxOdRsDP990KRhdd95pQthpgq1LhzxPdLnkDJKfTA6CFrwQ=="], + "@wrnexus/dev-toolbar": ["@wrnexus/dev-toolbar@0.8.18", "https://registry.workroot.in/repository/npm/@wrnexus/dev-toolbar/-/dev-toolbar-0.8.18.tgz", {}, "sha512-7mj/FLIhLjx/DxH/gUlYwZqm63o/rcwH/0K/K6Efxvu9zfM5OyAh2w3L2eDWI9asK5foZkit8cKMUXVgmqHkcA=="], - "@wrnexus/graphql": ["@wrnexus/graphql@0.8.8", "", { "dependencies": { "@wrnexus/plugin": "^0.8.8" } }, "sha512-37eA5k4WSLN1SIRcqGcCAPYniEwLsnf+NJAuQn7RAtyzRWWVKVJx254r2sa7AuBG9E+zlVG9qzXAuMDEcQLBCw=="], + "@wrnexus/encryption": ["@wrnexus/encryption@0.8.10", "https://registry.workroot.in/repository/npm/@wrnexus/encryption/-/encryption-0.8.10.tgz", { "dependencies": { "@wrnexus/core": "^0.8.12", "@wrnexus/db": "^0.8.20" } }, "sha512-4U7X9kzK/JWPoNDXxtVH/D2bVBNQzKGWSUmHgyYWTrNSpsiCLW17te//SVddkQfq7HCSv3cihuyoYl2j03Xf0Q=="], - "@wrnexus/helpers": ["@wrnexus/helpers@0.8.8", "", { "dependencies": { "@wrnexus/core": "^0.8.8" } }, "sha512-ArWU3F3N3EXXENYxID3O8FAbQ0Un/XkA3IkLE1aI8e1enyJ6ubPbhBt9TswKQcuc09+zpdZ4t0IUNld3TXBfog=="], + "@wrnexus/graphql": ["@wrnexus/graphql@0.8.8", "https://registry.workroot.in/repository/npm/@wrnexus/graphql/-/graphql-0.8.8.tgz", { "dependencies": { "@wrnexus/plugin": "^0.8.8" } }, "sha512-9rlf85Xa6cWlGrqZb5tyxvODHYb4OXRSsbLJSlNoGI/q/nVohVn98IjeTWWAmXq6Gwjm0fAUA+AlA/m9Fmlu5w=="], - "@wrnexus/i18n": ["@wrnexus/i18n@0.8.8", "", { "dependencies": { "@wrnexus/core": "^0.8.8", "@wrnexus/plugin": "^0.8.8", "@wrnexus/ui": "^0.8.8" } }, "sha512-aTTV8SWwoRN0wzWVenGqu9LVO3y7LlLNXdKQLDrILq13/g4v8lNcBNDsXf+rwERe6VOdI3j5Q8BZZIU0hJfUZg=="], + "@wrnexus/helpers": ["@wrnexus/helpers@0.8.9", "https://registry.workroot.in/repository/npm/@wrnexus/helpers/-/helpers-0.8.9.tgz", { "dependencies": { "@wrnexus/authz": "^0.8.14", "@wrnexus/core": "^0.8.12", "@wrnexus/db": "^0.8.20" } }, "sha512-EzT9LSZJXIAIm2fO62BMbPJOnrloC1lujW+5UNsSd4kj44mBt6WMpBwaCSDGUcVy2/b7GKXlgBnUVZtIIGn0gw=="], - "@wrnexus/identity": ["@wrnexus/identity@0.8.8", "", { "dependencies": { "@wrnexus/auth": "^0.8.8", "@wrnexus/authz": "^0.8.8", "@wrnexus/oauth": "^0.8.8" } }, "sha512-w1Un+b3bc0tZocZLh5W9VsLM7vfQDZD06J04o2iY3Slw//dfJMhQgM7/LV1ciKVLwSG2VTT+/PMWtmPqH2Ku0g=="], + "@wrnexus/i18n": ["@wrnexus/i18n@0.8.12", "https://registry.workroot.in/repository/npm/@wrnexus/i18n/-/i18n-0.8.12.tgz", { "dependencies": { "@wrnexus/core": "^0.8.9", "@wrnexus/plugin": "^0.8.8", "@wrnexus/ui": "^0.8.19" } }, "sha512-pgDJZpS8qB3tz+FMY+CNUF7AZXJVRFWbFDSHk+QMeUAwkU7JbNDxwmKioa6QU50F6C0SUMbfVwDR3kBXZKBflQ=="], - "@wrnexus/image": ["@wrnexus/image@0.8.8", "", { "dependencies": { "@wrnexus/plugin": "^0.8.8", "@wrnexus/security": "^0.8.8", "@wrnexus/ui": "^0.8.8" } }, "sha512-vRRDKjqbrtR1R8XOR/TePQr1m+vti1K8+8ehH8/YuGhjwaG3Qbu/ypUHQL4hGF2zw7u3cD9v1AZe6NKNgxidGw=="], + "@wrnexus/identity": ["@wrnexus/identity@0.8.8", "https://registry.workroot.in/repository/npm/@wrnexus/identity/-/identity-0.8.8.tgz", { "dependencies": { "@wrnexus/auth": "^0.8.11", "@wrnexus/authz": "^0.8.9", "@wrnexus/oauth": "^0.8.8" } }, "sha512-fPnZDEZwjLBQ2/2pZ6AeQKkcXvGltTTQ5lgStgweW8oiSPeuheOyl3C0k4jiPEzo+Qt0R8Z41ee2cN8XYVvNOA=="], - "@wrnexus/jwt": ["@wrnexus/jwt@0.8.8", "", { "dependencies": { "@wrnexus/core": "^0.8.8" } }, "sha512-is2SDq8Y8Ltyrh4F48WpUoLHY1QiHl6ZxQ2KKkNDh6ASZoTwvDWklmZe/C27cxJDqE2yhdXBofAO+nHx5+26jA=="], + "@wrnexus/image": ["@wrnexus/image@0.8.10", "https://registry.workroot.in/repository/npm/@wrnexus/image/-/image-0.8.10.tgz", { "dependencies": { "@wrnexus/plugin": "^0.8.8", "@wrnexus/security": "^0.8.8", "@wrnexus/ui": "^0.8.19" } }, "sha512-o9Bn6FhHF8oOP4PLnJHKyvPckd+cBxrWGFUqsINT+VStvSEA57gktIZw5f9jiHOMnp6TgVprscaviQMa0NO4pQ=="], - "@wrnexus/language-server": ["@wrnexus/language-server@0.8.8", "", { "dependencies": { "@wrnexus/syntax": "^0.8.8", "@wrnexus/typecheck": "^0.8.8" }, "bin": { "wrnexus-language-server": "dist/server.js" } }, "sha512-sF91UE9Yo+809t0wU1JjyAqxENxfBsLSoySnLZV9pRyXRXuN1sqeYVPJ0lz5u8ZY6rwuVtUyrB8fJ8OeX3/tPA=="], + "@wrnexus/jwt": ["@wrnexus/jwt@0.8.9", "https://registry.workroot.in/repository/npm/@wrnexus/jwt/-/jwt-0.8.9.tgz", { "dependencies": { "@wrnexus/core": "^0.8.9" } }, "sha512-LcjXLdDp8pnJ3F6dDGlB3COlvg7jVBIZe+UnF48i7Hy12gHZu0Rbv/iBn9w203tpzT2EmcpGtMyI/J+uLQUeVg=="], - "@wrnexus/mcp": ["@wrnexus/mcp@0.8.8", "", { "bin": { "wrnexus-mcp": "dist/stdio.js" } }, "sha512-+vyx5iKyBwl0+uEONwIMrM/sU7gKOpw9AtFqjjJlcoIO0eMTjKnf0FXX2moxV2UjFH4OTRtpjAKG5KhLoEsnRA=="], + "@wrnexus/language-server": ["@wrnexus/language-server@0.8.12", "https://registry.workroot.in/repository/npm/@wrnexus/language-server/-/language-server-0.8.12.tgz", { "dependencies": { "@wrnexus/syntax": "^0.8.11", "@wrnexus/typecheck": "^0.8.11", "vscode-html-languageservice": "^5.6.2" }, "bin": { "wrnexus-language-server": "dist/server.js" } }, "sha512-eeJXLzh5tGckAlu2CtuLk0FjiewOtEEfSwGi22e3z4KiGx3KzBjT/kwHyFVureyDAD0HqBYQLshr5FeNQKxIiA=="], - "@wrnexus/mobile": ["@wrnexus/mobile@0.8.8", "", { "dependencies": { "@wrnexus/native": "^0.8.8" } }, "sha512-fWCKukaRwv/h/NVgpehzMP924IEHe7gqWwGGdQbUewtTDvI/8OCdJSqHbs0HbkKiJIA63wR5K/Dp5w/raV3DmQ=="], + "@wrnexus/mcp": ["@wrnexus/mcp@0.8.8", "https://registry.workroot.in/repository/npm/@wrnexus/mcp/-/mcp-0.8.8.tgz", { "bin": { "wrnexus-mcp": "dist/stdio.js" } }, "sha512-E4Rz03RVjzyjTdwL9d2zzMKLIkyTw1DMcwiRrdAcAEk6/HYJr4rnttiIGcw1lu58ptrLM/lUeqYWEWV+SyDXcQ=="], - "@wrnexus/native": ["@wrnexus/native@0.8.8", "", {}, "sha512-z9cF/NQpYudsrRpUr5e1V1ZNq8YEOftPOR26TkDcqs630oUv5YtzBfBFqsGQyydJKwswKM1scEXgsjyZLT2qyg=="], + "@wrnexus/mobile": ["@wrnexus/mobile@0.8.8", "https://registry.workroot.in/repository/npm/@wrnexus/mobile/-/mobile-0.8.8.tgz", { "dependencies": { "@wrnexus/native": "^0.8.8" } }, "sha512-uAxPwTqJ+Gn1SBW7S8B2Xm36FAK5vwgnSztY32xKWIP4LdtVW3TGQPD43dGyWltooJUd0JlGK+7EPF8IZECOsw=="], - "@wrnexus/oauth": ["@wrnexus/oauth@0.8.8", "", { "dependencies": { "@wrnexus/jwt": "^0.8.8" } }, "sha512-IO03peTZDi6aXfbCaA+i6og9bhdZvV6MC8ow/SL0jISbqPiTcLwVT1lPxmcA0EtRdozXKjrBwoumskVLQjMVOQ=="], + "@wrnexus/native": ["@wrnexus/native@0.8.8", "https://registry.workroot.in/repository/npm/@wrnexus/native/-/native-0.8.8.tgz", {}, "sha512-OSQLit1OaVpFlUOzAF9vX9gRKFAxtQkCN8UWnEIMKIfc/b+veSMgCqdcAdtxcbJiOciUg1404k1LwVrFo7a5hQ=="], - "@wrnexus/observability": ["@wrnexus/observability@0.8.8", "", { "dependencies": { "@wrnexus/core": "^0.8.8" } }, "sha512-250hw6aUcJi1gAQ+WUuDNr2Ls7VA0CY4QsTQB8OnGgg5zQ48z1fNAMMjju3CeIK/hVaTLHQ3XYpPbFngGX6XtA=="], + "@wrnexus/oauth": ["@wrnexus/oauth@0.8.8", "https://registry.workroot.in/repository/npm/@wrnexus/oauth/-/oauth-0.8.8.tgz", { "dependencies": { "@wrnexus/jwt": "^0.8.8" } }, "sha512-YTTIjUDoUB/x6otZ7HgowbdLVKavsa1koKcvIoHE95tAGAX2thKQ+pUhE/oTZi35V1eJCCduViNos3/LDVrK/g=="], - "@wrnexus/playground": ["@wrnexus/playground@0.8.8", "", { "dependencies": { "@wrnexus/compiler": "^0.8.8", "@wrnexus/syntax": "^0.8.8" } }, "sha512-CWAZvZIx2vArzcQCEuMhbDJm+ORpUSGic9RwPSPVZ8Vp2CHjZBjoTZ/OsLrYbaBvOMOovECfl+IPXrXgETQoqA=="], + "@wrnexus/observability": ["@wrnexus/observability@0.8.8", "https://registry.workroot.in/repository/npm/@wrnexus/observability/-/observability-0.8.8.tgz", { "dependencies": { "@wrnexus/core": "^0.8.9" } }, "sha512-P7R4IYm7o6OfP1TmQ6L537DAOMH5WbC74TP4rw/Stwx8RxS/ORYPWw0mGB8f+1eamOV40Y5U4E04nmf3Tugj0Q=="], - "@wrnexus/plugin": ["@wrnexus/plugin@0.8.8", "", { "dependencies": { "@wrnexus/syntax": "^0.8.8" } }, "sha512-b1ItR2B1Jkaes1kR1YECpMEnOBMtPw6sVSVcGueF3wOgTPS6zPptwpwLzwQTYH6+sT4eRFMjybEM7An8TscaMw=="], + "@wrnexus/playground": ["@wrnexus/playground@0.8.8", "https://registry.workroot.in/repository/npm/@wrnexus/playground/-/playground-0.8.8.tgz", { "dependencies": { "@wrnexus/compiler": "^0.8.10", "@wrnexus/syntax": "^0.8.9" } }, "sha512-FpQ2n81GWSJSc0LccH6zDYm0pfdUk54LdDYma0Y72pyLfRjSY0ymQJcCr6Jp/EE5iBIhRowD6ag7vd26h27pZA=="], - "@wrnexus/pubsub": ["@wrnexus/pubsub@0.8.8", "", { "dependencies": { "@wrnexus/core": "^0.8.8", "@wrnexus/rpc": "^0.8.8" } }, "sha512-X7QH6kecu7gzt0waW+CkaYdDUmEAykoxMwk35GizNTECkUg8SJHjQNf9bgGM9RNIQOkCr12jFSnR+0njn+LqiA=="], + "@wrnexus/plugin": ["@wrnexus/plugin@0.8.9", "https://registry.workroot.in/repository/npm/@wrnexus/plugin/-/plugin-0.8.9.tgz", { "dependencies": { "@wrnexus/syntax": "^0.8.19" } }, "sha512-XpkQL4/MpiNxoNcH1l7dL5cYEu8HN54/b5bx6DBXWutU4tMrAjChtbJ+SsE2YrNve4uWVUhF8wPgsdBrJONOQQ=="], - "@wrnexus/pwa": ["@wrnexus/pwa@0.8.8", "", {}, "sha512-rW4S/xNQ1IC0zDthheLfQNPtDeNuRLbQYictOvoJXiYndrh3HZgKdKAvh9DCare+/HftgSM28Tn8ZqUtd0zpBg=="], + "@wrnexus/pubsub": ["@wrnexus/pubsub@0.8.9", "https://registry.workroot.in/repository/npm/@wrnexus/pubsub/-/pubsub-0.8.9.tgz", { "dependencies": { "@wrnexus/core": "^0.8.9", "@wrnexus/rpc": "^0.8.9" } }, "sha512-Z696WHuzJsPJvkvz3aRcifiZEqHXSIzoH3ji/wPqBP+vqmKIiZ/WIzViSQ0j8QJgtHiiq1mo2d4GFxsfdAPbqg=="], - "@wrnexus/queue": ["@wrnexus/queue@0.8.8", "", { "dependencies": { "@wrnexus/core": "^0.8.8", "@wrnexus/rpc": "^0.8.8" } }, "sha512-hsP+e06pJsrEA51tc8vA9dNqKp382EkmyiEUXd1eU37rIgGyU8egeBxnXtJALXBU47ddo8JVawNn2wqaKvLA8g=="], + "@wrnexus/pwa": ["@wrnexus/pwa@0.8.12", "https://registry.workroot.in/repository/npm/@wrnexus/pwa/-/pwa-0.8.12.tgz", {}, "sha512-XI5wgn+vbPcSbAt3EsqnrPjkx2cd/Zpo3xy2deawuU5k7irkRImPNUWvtjkTar5GaNedVvuZQAhXLghb9p/GQQ=="], - "@wrnexus/reactive": ["@wrnexus/reactive@0.8.8", "", {}, "sha512-BjfLB3wwJL/Fqld53TqMY+8ZtUt9hTctRESXUgr41+AWPj8+S6c7oVNV65pEoGN8C+wAQONg8A67JoZP9jQRXw=="], + "@wrnexus/queue": ["@wrnexus/queue@0.8.14", "https://registry.workroot.in/repository/npm/@wrnexus/queue/-/queue-0.8.14.tgz", { "dependencies": { "@wrnexus/core": "^0.8.12", "@wrnexus/db": "^0.8.20", "@wrnexus/rpc": "^0.8.10" } }, "sha512-uulbyU1AF3gnfylmlFMIoBjAKgAgHsHg+FfEmLtoYwsaQ+JtMNk5PEZ/GUUBxEmK9ZbEAdgBAxgEX69E7ne9aA=="], - "@wrnexus/realtime": ["@wrnexus/realtime@0.8.8", "", { "dependencies": { "@wrnexus/core": "^0.8.8", "@wrnexus/plugin": "^0.8.8", "@wrnexus/ui": "^0.8.8" } }, "sha512-7arnRMucFz6sYepAIpPLpQtqqEoiPn7YChZ6Ig+wXMeB/3JQRV9PT7usRTtsrKF+eb2IcxguS1V/jzEeHlzdmg=="], + "@wrnexus/react": ["@wrnexus/react@0.8.9", "https://registry.workroot.in/repository/npm/@wrnexus/react/-/react-0.8.9.tgz", { "dependencies": { "@wrnexus/store": "^0.8.8" } }, "sha512-031RC/EBF1nzSeiwo2gXhOJ+xMLRtPUniN612ZVzj+pqGdn1J8I8vajZwRYKYC2xAVdCiB/EGoZ3FQaT75h8qw=="], - "@wrnexus/router": ["@wrnexus/router@0.8.8", "", { "dependencies": { "@wrnexus/compiler": "^0.8.8", "@wrnexus/core": "^0.8.8" } }, "sha512-cO+5X9nHljYA8S44Hf3KTv9jRnN558eynZMer54ODw/Iz+8FXBgmRho66f5EAjvML5APKI+fZyFYekL2WNZXYQ=="], + "@wrnexus/reactive": ["@wrnexus/reactive@0.8.9", "https://registry.workroot.in/repository/npm/@wrnexus/reactive/-/reactive-0.8.9.tgz", {}, "sha512-/4+wYx2zwJ2vsHF5VYaQqgTz+WbNsIkC/lFWD2ok/w5VxGC5p2WFj2P+psE22g30bzkAmdEvdiurlKGCSkP8TA=="], - "@wrnexus/rpc": ["@wrnexus/rpc@0.8.8", "", { "dependencies": { "@wrnexus/core": "^0.8.8", "@wrnexus/helpers": "^0.8.8", "@wrnexus/jwt": "^0.8.8", "@wrnexus/validation": "^0.8.8" } }, "sha512-2mmiNnQ1nIhjSzrt75yU0LfW4n7E6teO7mcvqMPbDrMb+hivv4J3HcreoQXGnp1dAJCyYpf5laPbUmZLGAY6Iw=="], + "@wrnexus/realtime": ["@wrnexus/realtime@0.8.10", "https://registry.workroot.in/repository/npm/@wrnexus/realtime/-/realtime-0.8.10.tgz", { "dependencies": { "@wrnexus/core": "^0.8.9", "@wrnexus/plugin": "^0.8.8", "@wrnexus/ui": "^0.8.19" } }, "sha512-sU1djUTqIAX8CGJEuyZTmmRaZZ6hEkPsr8B0XERPTJeKPwoExbnB3oFf1iOOJ7ihZ6MM7vrFOgA11WNNDqSjFg=="], - "@wrnexus/security": ["@wrnexus/security@0.8.8", "", { "dependencies": { "@wrnexus/core": "^0.8.8" } }, "sha512-ayctEobZK+6AqpHH6SV9u8DO22IAabew2QkxAzVX+eQp7fuQa3vctx2iI4JPmihXsxcZ/bFYsBgeUpPC6VVbkg=="], + "@wrnexus/router": ["@wrnexus/router@0.8.10", "https://registry.workroot.in/repository/npm/@wrnexus/router/-/router-0.8.10.tgz", { "dependencies": { "@wrnexus/compiler": "^0.8.17", "@wrnexus/core": "^0.8.12" } }, "sha512-zh+h+VDNshSsh2iryqbOCWOhcIbKXg58iWkHz3wKNovlWT0uAgLhmea6IHsiApI8RC/VPw4TAmAhfkaK1c4BBA=="], - "@wrnexus/ssr": ["@wrnexus/ssr@0.8.8", "", { "dependencies": { "@wrnexus/core": "^0.8.8", "@wrnexus/security": "^0.8.8", "@wrnexus/store": "^0.8.8" } }, "sha512-vQ8KPfsxtkqF80fjp5FWfyhRw4dI9AgqJ8SlLPLGmMmGQdeHG+qzcMf5JL0yFys/2DAY609mhUO23YZdTCs8BQ=="], + "@wrnexus/rpc": ["@wrnexus/rpc@0.8.10", "https://registry.workroot.in/repository/npm/@wrnexus/rpc/-/rpc-0.8.10.tgz", { "dependencies": { "@wrnexus/core": "^0.8.9", "@wrnexus/helpers": "^0.8.8", "@wrnexus/jwt": "^0.8.9", "@wrnexus/validation": "^0.8.10" } }, "sha512-KbfSxEe0D0ZiM1CckxiEVIEBSzYRYb3iEJYyJnT8DqlrEpos1hCwT22XnTMC3ldsCAusoUPO5gTXMBXL9qMKDQ=="], - "@wrnexus/store": ["@wrnexus/store@0.8.8", "", {}, "sha512-qeIwa8OGq/BUtECJrgXSqleWGI9DY/syikAeaAF6hvGk775rrxh4971zR2tuiVh/0DUWm/s/8Wzj/bN99EYD2A=="], + "@wrnexus/security": ["@wrnexus/security@0.8.9", "https://registry.workroot.in/repository/npm/@wrnexus/security/-/security-0.8.9.tgz", { "dependencies": { "@wrnexus/core": "^0.8.11" } }, "sha512-dgz2fYwiw7uhBdsMuLqlPQaqajJx1McTjAhx8Pp1lf8gddsXm+Dnmri/1LXSbPwuSpWB7gsNq326JlVICfipVQ=="], - "@wrnexus/styles": ["@wrnexus/styles@0.8.8", "", { "dependencies": { "@wrnexus/core": "^0.8.8", "@wrnexus/plugin": "^0.8.8", "@wrnexus/uploader": "^0.8.8" } }, "sha512-s7dKF5XrjSxoYfNTefX1FKCimKlv2o9/FEK46RAAtM3p39dpaboj59EcEPFYf1wvcgiUXtH0EWxiKVjyg9wnjA=="], + "@wrnexus/ssr": ["@wrnexus/ssr@0.8.12", "https://registry.workroot.in/repository/npm/@wrnexus/ssr/-/ssr-0.8.12.tgz", { "dependencies": { "@wrnexus/core": "^0.8.16", "@wrnexus/security": "^0.8.9", "@wrnexus/store": "^0.8.12" } }, "sha512-fPoxMfnlwuUs6syJ6LMjqzxIKGsghQ3UCKjSFkRXlvdwdPpWRSxW0g0+jJF66/OTyCo2kB0dwMRGVLhICLgvLw=="], - "@wrnexus/syntax": ["@wrnexus/syntax@0.8.8", "", {}, "sha512-T3Xq4eiTQ6LxMLsbmo5cm76/FCjbLgpsUlS10QiIe0lSdVJQKpGWjc4aNBKo431Vdulw0T+2K62a93gnVI0wIQ=="], + "@wrnexus/store": ["@wrnexus/store@0.8.12", "https://registry.workroot.in/repository/npm/@wrnexus/store/-/store-0.8.12.tgz", {}, "sha512-5AiJXZ6AFT2eshp21JEyeHlmBgHuxyeRslN6YZiIvUfoO4Dre3VtR4pI+hN3lOGloLXwXBUfEMm2mgGsXS36Kg=="], - "@wrnexus/test": ["@wrnexus/test@0.8.8", "", {}, "sha512-RoZidv+0xvkUhfDJGwXy8KqXZ1u2zlDCQez/2RpyTEvkza35KYhWQq0QMySFv7SZJTStQY1ow8yUrFYnasHg1A=="], + "@wrnexus/styles": ["@wrnexus/styles@0.8.26", "https://registry.workroot.in/repository/npm/@wrnexus/styles/-/styles-0.8.26.tgz", { "dependencies": { "@wrnexus/core": "^0.8.16", "@wrnexus/plugin": "^0.8.9", "@wrnexus/uploader": "^0.8.13" } }, "sha512-B1FgQYks6S9SohlWjDkRabbzAAW9IIKbR5rHrdXegr6QY3nQMtJYPMG8xUVMTpQ8gRL+GODtuhDYPHD/igHuPg=="], - "@wrnexus/tracking": ["@wrnexus/tracking@0.8.8", "", {}, "sha512-a3+tpXuIlVFVJJrXFTuTNEB4ZRIcIEjaJUWicT62Sg0yDYga73UHcDfyuYCljt4/WkAeL/muhQN4Y3mMzIAxrg=="], + "@wrnexus/syntax": ["@wrnexus/syntax@0.8.19", "https://registry.workroot.in/repository/npm/@wrnexus/syntax/-/syntax-0.8.19.tgz", {}, "sha512-/OZ+Z/cdFmfqKeqCZZpmwN2ZRSITA2ByqmVjGVONtMRfxHBj99T5jB0be6qlxrmoK0cgntRxEe2JCS/d9h54YA=="], - "@wrnexus/typecheck": ["@wrnexus/typecheck@0.8.8", "", { "dependencies": { "@wrnexus/syntax": "^0.8.8", "typescript": "^5.5.0" } }, "sha512-vFNsQc4k2p5rTrqaKYXj3W74Ebe7MMDMLXftGpZWyBNby4aF8HlsJclFLuFdKpfoDX1fprkZ5xGdVFzd51BSRQ=="], + "@wrnexus/test": ["@wrnexus/test@0.8.16", "https://registry.workroot.in/repository/npm/@wrnexus/test/-/test-0.8.16.tgz", { "dependencies": { "@wrnexus/core": "^0.8.16" } }, "sha512-jaeNicouq3Fu6sELzbnSP+XMUMaqZDIwayUSI6PssGyeUFuYm9v7ZoOWc3ljBo1CSvZtTZlT9qAU7jhFmSpV1w=="], - "@wrnexus/ui": ["@wrnexus/ui@0.8.8", "", { "dependencies": { "@wrnexus/core": "^0.8.8" } }, "sha512-Yxjcz950u9BRPPBRce2ug1Tf/rBESYR8gJ9XehBHQgP5kpCq8RGO7F2OFENCw07AFnElt8je0ym9lfBfEfKGrQ=="], + "@wrnexus/tracking": ["@wrnexus/tracking@0.8.8", "https://registry.workroot.in/repository/npm/@wrnexus/tracking/-/tracking-0.8.8.tgz", {}, "sha512-7qA4dL9uaPG1DFA/+d0IZ7GX+gkmTFU0JsyABtSoS8DowuZlEFINeS34UVwwjx5e9sZPbgPN+BNoccXUx7xqEw=="], - "@wrnexus/uploader": ["@wrnexus/uploader@0.8.8", "", { "dependencies": { "@wrnexus/core": "^0.8.8", "@wrnexus/plugin": "^0.8.8", "@wrnexus/ui": "^0.8.8" } }, "sha512-OveR+mjsuHrCuyrtADzWh63LahR9n4zVJSIHFHjK4FsiJQo0NmJKxsEfPiHvb2PBk5bubM/KdGX4aqBXLliTcg=="], + "@wrnexus/typecheck": ["@wrnexus/typecheck@0.8.17", "https://registry.workroot.in/repository/npm/@wrnexus/typecheck/-/typecheck-0.8.17.tgz", { "dependencies": { "@wrnexus/syntax": "^0.8.19", "typescript": "^6.0.3" } }, "sha512-sEvCraG7qudT61h0SbuccIegi37nVWW2B1+BjmPg6Zrtc0251lUozASOYMW2ntjiizASDXMTSnZvSJ36EJPflA=="], - "@wrnexus/validation": ["@wrnexus/validation@0.8.8", "", { "dependencies": { "@wrnexus/core": "^0.8.8", "@wrnexus/plugin": "^0.8.8", "@wrnexus/ui": "^0.8.8" } }, "sha512-cEh4VObnwoNLAeKz6OP1PDdYaHPd79i4BPxnJSI7rKJi6GrI6vgmJr0U1wXADMbUwC0Xm6GwjGopnYKTGCZfgg=="], + "@wrnexus/ui": ["@wrnexus/ui@0.8.88", "https://registry.workroot.in/repository/npm/@wrnexus/ui/-/ui-0.8.88.tgz", { "dependencies": { "@wrnexus/core": "^0.8.16" } }, "sha512-C6q3c85tJm0Ajhgb8i+DYOWyICNxeXVsR3KbD5yP0rC2XS5Vj9TP72x7NPux798jGLpbOpSPRiIPUff7zAod7w=="], - "acorn": ["acorn@8.17.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg=="], + "@wrnexus/uploader": ["@wrnexus/uploader@0.8.13", "https://registry.workroot.in/repository/npm/@wrnexus/uploader/-/uploader-0.8.13.tgz", { "dependencies": { "@wrnexus/core": "^0.8.12", "@wrnexus/plugin": "^0.8.8", "@wrnexus/ui": "^0.8.23" } }, "sha512-Cfj5Iqtbk/ccXV/YXQ4I8v0GkcE7cFnzMEB33qy3DcWo4fA5ndiWU9CN4Ap1oysA5MWEmcCKuJlcTKdWLhiTvw=="], + + "@wrnexus/validation": ["@wrnexus/validation@0.8.13", "https://registry.workroot.in/repository/npm/@wrnexus/validation/-/validation-0.8.13.tgz", { "dependencies": { "@wrnexus/core": "^0.8.12", "@wrnexus/plugin": "^0.8.8", "@wrnexus/ui": "^0.8.76" } }, "sha512-ud9bzeSaOzbYnmu6pKEr5XbBT25FW+ROOI9iB0YJBc624juurslgHm2lpmpOu2WKUWulgktb/2vl9nsvtI8pSw=="], + + "acorn": ["acorn@8.18.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ=="], "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], @@ -343,11 +347,11 @@ "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], - "brace-expansion": ["brace-expansion@1.1.16", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw=="], + "brace-expansion": ["brace-expansion@1.1.21", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw=="], "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], - "bun-types": ["bun-types@1.3.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-4N0ig0fEomHt5R0KCFWjovxow98rIoRwKolrYdCcknNwMekCXRnWEUvgu5soYV8QXtVsrUD8B95MBOZGPvr6KQ=="], + "bun-types": ["bun-types@1.4.2", "", { "dependencies": { "@types/node": "*" } }, "sha512-bxV1FgK7yBIzjRe5zBozIM4Bem11ZJcCXSrjWRG3YWLt8yFDePu4cLjpebO8OvPeIE9trbyPF4fuj3Cia4Fj3w=="], "bytestreamjs": ["bytestreamjs@2.0.1", "", {}, "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ=="], @@ -365,15 +369,15 @@ "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], - "css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="], + "css-select": ["css-select@6.0.0", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^7.0.0", "domhandler": "^5.0.3", "domutils": "^3.2.2", "nth-check": "^2.1.1" } }, "sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw=="], "css-tree": ["css-tree@3.2.1", "", { "dependencies": { "mdn-data": "2.27.1", "source-map-js": "^1.2.1" } }, "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA=="], - "css-what": ["css-what@6.2.2", "", {}, "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="], + "css-what": ["css-what@7.0.0", "", {}, "sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ=="], "csso": ["csso@5.0.5", "", { "dependencies": { "css-tree": "~2.2.0" } }, "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ=="], - "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" }, "peerDependencies": { "supports-color": "*" }, "optionalPeers": ["supports-color"] }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], @@ -387,7 +391,7 @@ "domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="], - "enhanced-resolve": ["enhanced-resolve@5.21.6", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" } }, "sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ=="], + "enhanced-resolve": ["enhanced-resolve@5.26.0", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" } }, "sha512-9vhedylFonb2YGogzUKX6+Ja72gOJbN1QHAqdrvqLwhdl/QWbKopzoUC9EbQNVsAns/bx/4uyqalrQAoy1IByw=="], "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], @@ -427,7 +431,7 @@ "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], - "flatted": ["flatted@3.4.2", "", {}, "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA=="], + "flatted": ["flatted@3.4.4", "", {}, "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q=="], "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], @@ -455,7 +459,7 @@ "jiti": ["jiti@2.7.0", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="], - "js-yaml": ["js-yaml@4.3.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q=="], + "js-yaml": ["js-yaml@4.3.2", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA=="], "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], @@ -503,7 +507,7 @@ "minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], - "modern-tar": ["modern-tar@0.7.7", "", {}, "sha512-t9VmxaqrmANnEOBhpSDI6HD192Ge48k8vmWqQQL7hSFEqHEYwZbbsu49+aKLWZeRvFs3j1pMhXOqqF4kPlvjkQ=="], + "modern-tar": ["modern-tar@0.8.5", "", {}, "sha512-snEhs+6G5Tjd4I7tLCDOaoln2RgE0bD19RzEKgvgK2hZ5VKy3MpLhLTZ2fWpXSTg4K2cyPwp+VHATFJhxfnOeA=="], "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="], @@ -521,7 +525,7 @@ "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], - "package-manager-detector": ["package-manager-detector@1.7.0", "", {}, "sha512-xg1eHpwYL/D/HEdWw2goFZP6vV0FH7W+PZ5rFkGjdIDLtxq7EkzBUeT3m+lndYCt8wKbmofUu1MUdMCXkCk9ZQ=="], + "package-manager-detector": ["package-manager-detector@1.8.0", "", {}, "sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A=="], "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], @@ -535,23 +539,23 @@ "picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], - "pkijs": ["pkijs@3.4.0", "", { "dependencies": { "@noble/hashes": "1.4.0", "asn1js": "^3.0.6", "bytestreamjs": "^2.0.1", "pvtsutils": "^1.3.6", "pvutils": "^1.1.3", "tslib": "^2.8.1" } }, "sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw=="], + "pkijs": ["pkijs@3.4.1", "", { "dependencies": { "@noble/hashes": "1.8.0", "asn1js": "^3.0.6", "bytestreamjs": "^2.0.1", "pvtsutils": "^1.3.6", "pvutils": "^1.1.3", "tslib": "^2.8.1" } }, "sha512-Oo/NZcSWccq8KyoG7gLE9fnltgHns+pNCjCAp/WmjsUySi+sX7y4z4Xqu4fVb42CDHzRPl33fjzT15V1wvcyhA=="], "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], - "prettier": ["prettier@3.9.5", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-/FVl766LpUfB5vXgCYOYa0MeV/441Ia99AeICQIQFTY/Nw0roZwULcXpku5i1/m5kt/baz+s4Zogspd839HSMg=="], + "prettier": ["prettier@3.9.9", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-Z/CJHIkdujO/OtN7nXUii0Rf3VT5SRuhjBA82Xvu2XhBUgX3nhP67T0LHceBdQLex7OOFGTox+Q5Yg8Jk2Qivg=="], "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], "pvtsutils": ["pvtsutils@1.3.6", "", { "dependencies": { "tslib": "^2.8.1" } }, "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg=="], - "pvutils": ["pvutils@1.1.5", "", {}, "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA=="], + "pvutils": ["pvutils@1.2.0", "", {}, "sha512-BbubeCEyTuQjVMakvJQ/Sxbc93F2pwmbsxONT/ZRrwU7Ua38d8unYTwXpTVLAKJ4BDuH9IGztCjQcd/N/39Dvg=="], "reflect-metadata": ["reflect-metadata@0.2.2", "", {}, "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q=="], "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], - "sax": ["sax@1.6.0", "", {}, "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA=="], + "sax": ["sax@1.6.1", "", {}, "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q=="], "selfsigned": ["selfsigned@5.5.0", "", { "dependencies": { "@peculiar/x509": "^1.14.2", "pkijs": "^3.3.3" } }, "sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew=="], @@ -567,13 +571,13 @@ "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "svgo": ["svgo@4.0.2", "", { "dependencies": { "commander": "^11.1.0", "css-select": "^5.1.0", "css-tree": "^3.0.1", "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.1.1", "sax": "^1.5.0" }, "bin": "./bin/svgo.js" }, "sha512-ekx94z1rRc5LDi6oSUaeRnYhd0UOJxdtQCL2rF8xpWxD3TPAsISWOrxezqGovqS38GRZOdpDfvQe3ts6F7nsng=="], + "svgo": ["svgo@4.1.0", "", { "dependencies": { "commander": "^11.1.0", "css-select": "^6.0.0", "css-tree": "^3.0.1", "css-what": "^7.0.0", "csso": "^5.0.5", "picocolors": "^1.1.1", "sax": "1.6.1" }, "bin": { "svgo": "bin/svgo.js" } }, "sha512-bkxnTg1kSU0guhIBmibA6UUhrQmPVA1XsQLN+ylCd+UWzbnLkySOcXpyk1mrl05f+pcaCx2eHb+sp6BgMZWX+Q=="], - "tailwindcss": ["tailwindcss@4.3.2", "", {}, "sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA=="], + "tailwindcss": ["tailwindcss@4.3.3", "", {}, "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ=="], "tapable": ["tapable@2.3.3", "", {}, "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A=="], - "tinyexec": ["tinyexec@1.2.4", "", {}, "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg=="], + "tinyexec": ["tinyexec@1.3.1", "", {}, "sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA=="], "tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="], @@ -589,12 +593,20 @@ "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], - "typescript-eslint": ["typescript-eslint@8.63.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.63.0", "@typescript-eslint/parser": "8.63.0", "@typescript-eslint/typescript-estree": "8.63.0", "@typescript-eslint/utils": "8.63.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-xgwXyzG4sK9ALkBxbyGkTMMOS+imnW65iPhxCQMK83KhxyoDNW7l+IDqEf9vMdoUidHpOoS967RCq4eMiTexwQ=="], + "typescript-eslint": ["typescript-eslint@8.71.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.71.0", "@typescript-eslint/parser": "8.71.0", "@typescript-eslint/typescript-estree": "8.71.0", "@typescript-eslint/utils": "8.71.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-fBdHYiqQ14RW6mOMXD14Svn82ZsCYAoQSzGRzyEjR59S5A2Krh/l7fGTOQ7iCr8gGy/mHVXtEF7s5fgjEdV0Pw=="], - "undici-types": ["undici-types@8.3.0", "", {}, "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="], + "undici-types": ["undici-types@8.9.0", "", {}, "sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg=="], "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + "vscode-html-languageservice": ["vscode-html-languageservice@5.6.2", "", { "dependencies": { "@vscode/l10n": "^0.0.18", "vscode-languageserver-textdocument": "^1.0.12", "vscode-languageserver-types": "^3.17.5", "vscode-uri": "^3.1.0" } }, "sha512-ulCrSnFnfQ16YzvwnYUgEbUEl/ZG7u2eV27YhvLObSHKkb8fw1Z9cgsnUwjTEeDIdJDoTDTDpxuhQwoenoLNMg=="], + + "vscode-languageserver-textdocument": ["vscode-languageserver-textdocument@1.0.15", "", {}, "sha512-Gsfr9S8LU3S6885cS+NaleasJ0n3V5y/SOTqHCifQiXWFw3G9w9/YItDfwHrlCz+dSZWWZ8ilYVMcJe7Sz7Sxw=="], + + "vscode-languageserver-types": ["vscode-languageserver-types@3.18.4", "", {}, "sha512-nQsacoiijvl0fRf2q28uFDrAVwRhdCa3QveiF7/CX0r18mLR5FU/1WskSsCKOjmEbtteKUnY8x8Yzxop+k0zwg=="], + + "vscode-uri": ["vscode-uri@3.2.0", "", {}, "sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg=="], + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], @@ -603,33 +615,35 @@ "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.11.2", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" }, "bundled": true }, "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA=="], + "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.11.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.3", "tslib": "^2.4.0" }, "bundled": true }, "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg=="], - "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.11.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA=="], + "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.11.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA=="], - "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA=="], + "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g=="], - "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.6", "", { "dependencies": { "@tybys/wasm-util": "^0.10.3" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" }, "bundled": true }, "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg=="], + "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.2.4", "", { "dependencies": { "@tybys/wasm-util": "^0.10.3" }, "peerDependencies": { "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.4", "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4" }, "bundled": true }, "sha512-AJxoUD2/15ESHbvpcyjU274nsAPLuOtPHCk0vKJM5pj//Fg/B1FXNWjPnXTT9PymCYYiHo4zPj0ZomXBKhoy7g=="], - "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg=="], + "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.4", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A=="], "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.6", "", {}, "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw=="], + "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.10", "", {}, "sha512-HpbUakT7xp5miBUywCHf36ZEuAJNklBJDDsGpUIjMzOSmM8ELSfA9Sa/QDPeNeqeoN31u+UTCkL4klCOVvRm4Q=="], - "@typescript-eslint/typescript-estree/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@10.2.6", "", { "dependencies": { "brace-expansion": "^5.0.8" } }, "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A=="], "@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + "@wrnexus/typecheck/typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="], + "csso/css-tree": ["css-tree@2.2.1", "", { "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" } }, "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA=="], "lightningcss/detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], - "tinyglobby/picomatch": ["picomatch@4.0.5", "", {}, "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A=="], + "tinyglobby/picomatch": ["picomatch@4.0.7", "", {}, "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA=="], "tsyringe/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], - "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@5.0.7", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA=="], + "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@5.0.12", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ=="], "csso/css-tree/mdn-data": ["mdn-data@2.0.28", "", {}, "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="], diff --git a/docs/release-access-status.md b/docs/release-access-status.md index d6a99ada..b9804c12 100644 --- a/docs/release-access-status.md +++ b/docs/release-access-status.md @@ -2,6 +2,6 @@ ## Decision: Mode B — Private Developer Preview -Active version: 0.8.8, derived from package.json#wrnexus.version. All 47 installed @wrnexus packages resolve to 0.8.8 and npm reports restricted access. The repository remote is a private WorkRoot Git service and no public license file exists. +Active version: 0.8.72, derived from package.json#wrnexus.version. All 47 installed @wrnexus packages resolve to 0.8.72 and npm reports restricted access. The repository remote is a private WorkRoot Git service and no public license file exists. -External users cannot execute an installation without approved private registry credentials. The truthful CTA is Request preview access. After approval, the canonical command is bunx @wrnexus/cli@0.8.8 create my-app. Tokens must never appear in documentation or source. +External users cannot execute an installation without approved private registry credentials. The truthful CTA is Request preview access. After approval, the canonical command is bunx @wrnexus/cli@0.8.72 create my-app. Tokens must never appear in documentation or source. diff --git a/docs/site-audit.md b/docs/site-audit.md index 626e570d..8bdf4740 100644 --- a/docs/site-audit.md +++ b/docs/site-audit.md @@ -1,6 +1,6 @@ # WRNexusJS site audit -Date: 2026-07-13. Baseline: Bun 1.3.14, framework 0.8.8. +Date: 2026-07-13. Baseline: Bun 1.3.14, framework 0.8.72. ## Baseline results @@ -12,7 +12,7 @@ Date: 2026-07-13. Baseline: Bun 1.3.14, framework 0.8.8. ## Findings -Package documentation, discovery assets, and AI-readable references are generated from the installed release. The 0.8.8 portal includes the helpers package, workspace app addition, and safe forward-auth login redirect guidance. +Package documentation, discovery assets, and AI-readable references are generated from the installed release. The 0.8.72 portal includes the helpers package, workspace app addition, and safe forward-auth login redirect guidance. ## Audit limitations diff --git a/package-lock.json b/package-lock.json index 4a3f42fd..587ad125 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,59 +10,59 @@ "dependencies": { "@iconify-json/lucide": "^1.2.118", "@iconify/tailwind4": "^1.2.3", - "@wrnexus/ai": "^0.8.8", - "@wrnexus/auth": "^0.8.8", - "@wrnexus/authz": "^0.8.8", + "@wrnexus/ai": "^0.8.9", + "@wrnexus/auth": "^0.8.33", + "@wrnexus/authz": "^0.8.15", "@wrnexus/benchmark": "^0.8.8", "@wrnexus/cache": "^0.8.8", - "@wrnexus/captcha": "^0.8.8", - "@wrnexus/compiler": "^0.8.8", - "@wrnexus/content": "^0.8.8", - "@wrnexus/core": "^0.8.8", - "@wrnexus/csr": "^0.8.8", - "@wrnexus/db": "^0.8.8", - "@wrnexus/dev-server": "^0.8.8", - "@wrnexus/dev-toolbar": "^0.8.8", - "@wrnexus/encryption": "^0.8.8", + "@wrnexus/captcha": "^0.8.16", + "@wrnexus/compiler": "^0.8.30", + "@wrnexus/content": "^0.8.9", + "@wrnexus/core": "^0.8.16", + "@wrnexus/csr": "^0.8.43", + "@wrnexus/db": "^0.8.23", + "@wrnexus/dev-server": "^0.8.66", + "@wrnexus/dev-toolbar": "^0.8.18", + "@wrnexus/encryption": "^0.8.10", "@wrnexus/graphql": "^0.8.8", - "@wrnexus/helpers": "^0.8.8", - "@wrnexus/i18n": "^0.8.8", + "@wrnexus/helpers": "^0.8.9", + "@wrnexus/i18n": "^0.8.12", "@wrnexus/identity": "^0.8.8", - "@wrnexus/image": "^0.8.8", - "@wrnexus/jwt": "^0.8.8", - "@wrnexus/language-server": "^0.8.8", + "@wrnexus/image": "^0.8.10", + "@wrnexus/jwt": "^0.8.9", + "@wrnexus/language-server": "^0.8.12", "@wrnexus/mcp": "^0.8.8", "@wrnexus/mobile": "^0.8.8", "@wrnexus/native": "^0.8.8", "@wrnexus/oauth": "^0.8.8", "@wrnexus/observability": "^0.8.8", "@wrnexus/playground": "^0.8.8", - "@wrnexus/plugin": "^0.8.8", - "@wrnexus/pubsub": "^0.8.8", - "@wrnexus/pwa": "^0.8.8", - "@wrnexus/queue": "^0.8.8", - "@wrnexus/reactive": "^0.8.8", - "@wrnexus/realtime": "^0.8.8", - "@wrnexus/router": "^0.8.8", - "@wrnexus/rpc": "^0.8.8", - "@wrnexus/security": "^0.8.8", - "@wrnexus/ssr": "^0.8.8", - "@wrnexus/store": "^0.8.8", - "@wrnexus/styles": "^0.8.8", - "@wrnexus/syntax": "^0.8.8", - "@wrnexus/test": "^0.8.8", + "@wrnexus/plugin": "^0.8.9", + "@wrnexus/pubsub": "^0.8.9", + "@wrnexus/pwa": "^0.8.12", + "@wrnexus/queue": "^0.8.14", + "@wrnexus/reactive": "^0.8.9", + "@wrnexus/realtime": "^0.8.10", + "@wrnexus/router": "^0.8.10", + "@wrnexus/rpc": "^0.8.10", + "@wrnexus/security": "^0.8.9", + "@wrnexus/ssr": "^0.8.12", + "@wrnexus/store": "^0.8.12", + "@wrnexus/styles": "^0.8.26", + "@wrnexus/syntax": "^0.8.19", + "@wrnexus/test": "^0.8.16", "@wrnexus/tracking": "^0.8.8", - "@wrnexus/typecheck": "^0.8.8", - "@wrnexus/ui": "^0.8.8", - "@wrnexus/uploader": "^0.8.8", - "@wrnexus/validation": "^0.8.8" + "@wrnexus/typecheck": "^0.8.17", + "@wrnexus/ui": "^0.8.88", + "@wrnexus/uploader": "^0.8.13", + "@wrnexus/validation": "^0.8.13" }, "devDependencies": { "@eslint/js": "^9.0.0", "@tailwindcss/cli": "^4.0.0", "@types/bun": "latest", "@types/node": "^26.1.1", - "@wrnexus/cli": "^0.8.8", + "@wrnexus/cli": "^0.8.72", "eslint": "^9.0.0", "prettier": "latest", "tailwindcss": "^4.0.0", @@ -1503,45 +1503,52 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@vscode/l10n": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.18.tgz", + "integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==", + "license": "MIT" + }, "node_modules/@wrnexus/ai": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/ai/-/ai-0.8.8.tgz", - "integrity": "sha512-TBSJ9z/+LXP54EIvX1h5uBo3O6gBPXFZwJPPzglpcYW3rj+azzrxA79IrGYvAIKAkwEY4+tAZQqqTKMU0844Pg==", + "version": "0.8.9", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/ai/-/ai-0.8.9.tgz", + "integrity": "sha512-vhAJk8qlDSyyfjx6xQCe8xj7/9Yi+qNDY/XCG50Ub77YYaR6f7dMwP9w68dxDfFhR8F4FfXz0SiCr61y2VI7iA==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/auth": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/auth/-/auth-0.8.8.tgz", - "integrity": "sha512-yUChoGXFFwCiJYUtU4Der7bLDg4pRwWHZG46l0IGI0l48nfoHGz0IywXsfS1EulnGG0dDFKyVR5Fz60u7aVh+g==", + "version": "0.8.33", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/auth/-/auth-0.8.33.tgz", + "integrity": "sha512-cYzne54IP7krY7YNT0ieg6CBYo65XxtucpL+A5EYlY73rHTYs/Ci5OjLSOOKx1rZagxDWu9y5fWy7AapafXaZw==", "license": "MIT", "dependencies": { - "@wrnexus/authz": "^0.8.8", - "@wrnexus/captcha": "^0.8.8", - "@wrnexus/core": "^0.8.8", - "@wrnexus/db": "^0.8.8", - "@wrnexus/encryption": "^0.8.8", - "@wrnexus/jwt": "^0.8.8", + "@wrnexus/authz": "^0.8.15", + "@wrnexus/captcha": "^0.8.16", + "@wrnexus/core": "^0.8.16", + "@wrnexus/db": "^0.8.23", + "@wrnexus/encryption": "^0.8.10", + "@wrnexus/jwt": "^0.8.9", "@wrnexus/oauth": "^0.8.8", - "@wrnexus/plugin": "^0.8.8", - "@wrnexus/queue": "^0.8.8", - "@wrnexus/ui": "^0.8.8", - "@wrnexus/validation": "^0.8.8" + "@wrnexus/plugin": "^0.8.9", + "@wrnexus/queue": "^0.8.14", + "@wrnexus/ui": "^0.8.84", + "@wrnexus/validation": "^0.8.13" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/authz": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/authz/-/authz-0.8.8.tgz", - "integrity": "sha512-PnYddvFOuHyYIHeGts+CrXHl7TjIDB5BlCdUcM/d+ijYUY1+KVtp+oUoBsaR4bZMTFm0x+LACy12OQkx2AU/Ww==", + "version": "0.8.15", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/authz/-/authz-0.8.15.tgz", + "integrity": "sha512-ZV1cvHrOkephfjs/gzzcLkN4HEHSFWJVZVmfsvir/GZs/X7+ZQbPNYUQZV7SsRlyMkUxgTKMCiZ8Ym49eOBSQw==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.8.8", - "@wrnexus/db": "^0.8.8" + "@wrnexus/core": "^0.8.12", + "@wrnexus/db": "^0.8.20", + "@wrnexus/plugin": "^0.8.8" }, "engines": { "bun": ">=1.3.0" @@ -1569,44 +1576,45 @@ } }, "node_modules/@wrnexus/captcha": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/captcha/-/captcha-0.8.8.tgz", - "integrity": "sha512-/fxuTv9KZv6Clci/GsQzOj1NWXop55bSA/ntUJGudqEl6Ss7R7qrvXp5JFvuUTeaqRnBG+dMRMKIoLkAt7LsAw==", + "version": "0.8.16", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/captcha/-/captcha-0.8.16.tgz", + "integrity": "sha512-iBMnhn9RcnsdHOKgHFIwSkZ8NvTZIJ3J+gqbeGQCGpdRAuI+sI87paiUr9QXNgXqH0HlWEhYmaX/850Dsd4XcA==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.8.8", + "@wrnexus/core": "^0.8.12", "@wrnexus/plugin": "^0.8.8", - "@wrnexus/ui": "^0.8.8", - "@wrnexus/validation": "^0.8.8" + "@wrnexus/ui": "^0.8.76", + "@wrnexus/validation": "^0.8.13" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/cli": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/cli/-/cli-0.8.8.tgz", - "integrity": "sha512-v4F7iPiSRVw0zUGkGavss1j2uYta7L1zzy80aR2++Dy2C1QEpkf3wIzcQmLDL6RPJqtL3RgeMKu8IZDVsswB3A==", + "version": "0.8.72", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/cli/-/cli-0.8.72.tgz", + "integrity": "sha512-JeFsDMldcjiUFMhal11V/bfg/dNcG+OJh7+Bt6lmU3ojxTajvxV6pjLPp022hYDBZPu83jupiF4WZPwOLy/+Bw==", "dev": true, "license": "MIT", "dependencies": { - "@wrnexus/authz": "^0.8.8", - "@wrnexus/compiler": "^0.8.8", - "@wrnexus/core": "^0.8.8", - "@wrnexus/csr": "^0.8.8", - "@wrnexus/db": "^0.8.8", - "@wrnexus/dev-server": "^0.8.8", - "@wrnexus/i18n": "^0.8.8", + "@wrnexus/authz": "^0.8.15", + "@wrnexus/compiler": "^0.8.30", + "@wrnexus/core": "^0.8.16", + "@wrnexus/csr": "^0.8.41", + "@wrnexus/db": "^0.8.23", + "@wrnexus/dev-server": "^0.8.66", + "@wrnexus/i18n": "^0.8.12", "@wrnexus/mcp": "^0.8.8", "@wrnexus/playground": "^0.8.8", - "@wrnexus/plugin": "^0.8.8", - "@wrnexus/router": "^0.8.8", - "@wrnexus/security": "^0.8.8", - "@wrnexus/styles": "^0.8.8", - "@wrnexus/syntax": "^0.8.8", - "@wrnexus/typecheck": "^0.8.8", - "@wrnexus/ui": "^0.8.8", - "@wrnexus/validation": "^0.8.8", + "@wrnexus/plugin": "^0.8.9", + "@wrnexus/react": "^0.8.9", + "@wrnexus/router": "^0.8.10", + "@wrnexus/security": "^0.8.9", + "@wrnexus/styles": "^0.8.25", + "@wrnexus/syntax": "^0.8.19", + "@wrnexus/typecheck": "^0.8.17", + "@wrnexus/ui": "^0.8.85", + "@wrnexus/validation": "^0.8.13", "selfsigned": "^5.5.0" }, "bin": { @@ -1617,107 +1625,110 @@ } }, "node_modules/@wrnexus/compiler": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/compiler/-/compiler-0.8.8.tgz", - "integrity": "sha512-yX6lMLT+ZHxPO7t2EFi3fAPAqMvXPebKZIXt/haE8bKX+Ay5uyAuicMwZn95hXw/X6m0eCRGDaLdEwqU5hMBaw==", + "version": "0.8.30", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/compiler/-/compiler-0.8.30.tgz", + "integrity": "sha512-zsxqcIMOzXxX98z6RFffwQUa6VuniOqGZO/vxDdOJiyJ8RTs7gOk8dsBhA6MTLQ1fafPxJPV3zkGotKXOuxhCQ==", "license": "MIT", "dependencies": { - "@wrnexus/csr": "^0.8.8", - "@wrnexus/store": "^0.8.8", - "@wrnexus/syntax": "^0.8.8", - "@wrnexus/validation": "^0.8.8" + "@wrnexus/csr": "^0.8.41", + "@wrnexus/store": "^0.8.12", + "@wrnexus/syntax": "^0.8.19", + "@wrnexus/validation": "^0.8.13" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/content": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/content/-/content-0.8.8.tgz", - "integrity": "sha512-Va37m2vxiEZ2pspPUxX9kE/nTQ+4VA9KfZ5kI7umKYV6lWWJoUbMLfTg5PtWN0DBI9vXG4a3yGLlxRx+IqynPg==", + "version": "0.8.9", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/content/-/content-0.8.9.tgz", + "integrity": "sha512-8ue55L7FVoKJwQyFVUt5dePEzYzboNUssnzUOIWCoB3BOVnm5D+YYHTaB21AKcAR/oAP+e86zXt2D+l7VFEDFA==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/core": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/core/-/core-0.8.8.tgz", - "integrity": "sha512-R4ViefmkLIAENYn+HJP/YwlzQaABFqgiEjbk1A1z0ZQdcI/NhrMik/hG+05gfMFQPM1t27kM4jqewAibJEoEMA==", + "version": "0.8.16", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/core/-/core-0.8.16.tgz", + "integrity": "sha512-lTNigmTpJsgQnB95xMhalJ6Xbp/QBUf9J0MM4cuiecZ1DQLpaSgGC12Sn7FIC46rTU4w8878XJXlVWDCabe16Q==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/csr": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/csr/-/csr-0.8.8.tgz", - "integrity": "sha512-OooOCDs3HRrLUxBAHoNiDWIRYImK6W917FdntefEMS7YkhBw7bJxOkcOQtPdXP6ndN9BODQiaVik2BGDCUasAg==", + "version": "0.8.43", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/csr/-/csr-0.8.43.tgz", + "integrity": "sha512-czmxeLxvNvD7XjU3TufFBGMzuDWpNB0qpYbmbiARB7l6rslBw3+GuBWf2U5k4DH6oYiN/DGD6Jj+/G3bEh6ARw==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.8.8" + "@wrnexus/core": "^0.8.12" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/db": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/db/-/db-0.8.8.tgz", - "integrity": "sha512-xlX+vXDj6n7kfqnnrWiSZiqHgb30ZcIvKMR4vppDxbxI6daZ/uVm+jGtWkJL38sqJFLFcEuj0xYjiiYBAeKUwA==", + "version": "0.8.23", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/db/-/db-0.8.23.tgz", + "integrity": "sha512-ncZlvclHW98Enah9wlHOf9+StoVGLrCOCVBAOEFdZKV91vKnYDltcFlmG7i7crndN37kayyb319Wiwol8Hmhyg==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/dev-server": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/dev-server/-/dev-server-0.8.8.tgz", - "integrity": "sha512-m3Gou8RuWTYTo9qQfQHCFQDzbL4yNRCbRsCrn21umK+1HXx0Efk+Nd7RoA4nPAQP5AaDkwSfd8nb+5YtakTUIA==", + "version": "0.8.66", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/dev-server/-/dev-server-0.8.66.tgz", + "integrity": "sha512-RBJWyUEGmOS6ZgIm5NvNPB4BVhVIpGFEEf4NSLDKJtp/Z5K2+G44KbRhZaaYvl6F4IEZM2Zg5x+ZAX+o5XB34w==", "license": "MIT", "dependencies": { - "@wrnexus/authz": "^0.8.8", + "@wrnexus/authz": "^0.8.15", "@wrnexus/cache": "^0.8.8", - "@wrnexus/compiler": "^0.8.8", - "@wrnexus/core": "^0.8.8", - "@wrnexus/csr": "^0.8.8", - "@wrnexus/db": "^0.8.8", - "@wrnexus/dev-toolbar": "^0.8.8", - "@wrnexus/i18n": "^0.8.8", + "@wrnexus/compiler": "^0.8.30", + "@wrnexus/core": "^0.8.16", + "@wrnexus/csr": "^0.8.41", + "@wrnexus/db": "^0.8.23", + "@wrnexus/dev-toolbar": "^0.8.18", + "@wrnexus/i18n": "^0.8.12", "@wrnexus/observability": "^0.8.8", - "@wrnexus/plugin": "^0.8.8", - "@wrnexus/pubsub": "^0.8.8", - "@wrnexus/pwa": "^0.8.8", - "@wrnexus/router": "^0.8.8", - "@wrnexus/rpc": "^0.8.8", - "@wrnexus/security": "^0.8.8", - "@wrnexus/ssr": "^0.8.8", - "@wrnexus/store": "^0.8.8", - "@wrnexus/styles": "^0.8.8", - "@wrnexus/ui": "^0.8.8", - "@wrnexus/uploader": "^0.8.8", - "@wrnexus/validation": "^0.8.8" + "@wrnexus/plugin": "^0.8.9", + "@wrnexus/pubsub": "^0.8.9", + "@wrnexus/pwa": "^0.8.12", + "@wrnexus/queue": "^0.8.14", + "@wrnexus/react": "^0.8.9", + "@wrnexus/router": "^0.8.10", + "@wrnexus/rpc": "^0.8.10", + "@wrnexus/security": "^0.8.9", + "@wrnexus/ssr": "^0.8.12", + "@wrnexus/store": "^0.8.12", + "@wrnexus/styles": "^0.8.23", + "@wrnexus/ui": "^0.8.84", + "@wrnexus/uploader": "^0.8.13", + "@wrnexus/validation": "^0.8.13" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/dev-toolbar": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/dev-toolbar/-/dev-toolbar-0.8.8.tgz", - "integrity": "sha512-WrRRXyzAaDfXdxTJsM3p4s9vBc2vVJtGkIkvOHdtvX9S89OqnuqKluqwixlHGedB7m+J+LqCcrbD6OfdNP2VEQ==", + "version": "0.8.18", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/dev-toolbar/-/dev-toolbar-0.8.18.tgz", + "integrity": "sha512-7mj/FLIhLjx/DxH/gUlYwZqm63o/rcwH/0K/K6Efxvu9zfM5OyAh2w3L2eDWI9asK5foZkit8cKMUXVgmqHkcA==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/encryption": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/encryption/-/encryption-0.8.8.tgz", - "integrity": "sha512-AKy4kEBIJsbw9OPXlfKqVnidbQqQmglqWnDQuTgtxOdRsDP990KRhdd95pQthpgq1LhzxPdLnkDJKfTA6CFrwQ==", + "version": "0.8.10", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/encryption/-/encryption-0.8.10.tgz", + "integrity": "sha512-4U7X9kzK/JWPoNDXxtVH/D2bVBNQzKGWSUmHgyYWTrNSpsiCLW17te//SVddkQfq7HCSv3cihuyoYl2j03Xf0Q==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.8.8" + "@wrnexus/core": "^0.8.12", + "@wrnexus/db": "^0.8.20" }, "engines": { "bun": ">=1.3.0" @@ -1736,26 +1747,28 @@ } }, "node_modules/@wrnexus/helpers": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/helpers/-/helpers-0.8.8.tgz", - "integrity": "sha512-ArWU3F3N3EXXENYxID3O8FAbQ0Un/XkA3IkLE1aI8e1enyJ6ubPbhBt9TswKQcuc09+zpdZ4t0IUNld3TXBfog==", + "version": "0.8.9", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/helpers/-/helpers-0.8.9.tgz", + "integrity": "sha512-EzT9LSZJXIAIm2fO62BMbPJOnrloC1lujW+5UNsSd4kj44mBt6WMpBwaCSDGUcVy2/b7GKXlgBnUVZtIIGn0gw==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.8.8" + "@wrnexus/authz": "^0.8.14", + "@wrnexus/core": "^0.8.12", + "@wrnexus/db": "^0.8.20" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/i18n": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/i18n/-/i18n-0.8.8.tgz", - "integrity": "sha512-aTTV8SWwoRN0wzWVenGqu9LVO3y7LlLNXdKQLDrILq13/g4v8lNcBNDsXf+rwERe6VOdI3j5Q8BZZIU0hJfUZg==", + "version": "0.8.12", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/i18n/-/i18n-0.8.12.tgz", + "integrity": "sha512-pgDJZpS8qB3tz+FMY+CNUF7AZXJVRFWbFDSHk+QMeUAwkU7JbNDxwmKioa6QU50F6C0SUMbfVwDR3kBXZKBflQ==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.8.8", + "@wrnexus/core": "^0.8.9", "@wrnexus/plugin": "^0.8.8", - "@wrnexus/ui": "^0.8.8" + "@wrnexus/ui": "^0.8.19" }, "engines": { "bun": ">=1.3.0" @@ -1776,39 +1789,40 @@ } }, "node_modules/@wrnexus/image": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/image/-/image-0.8.8.tgz", - "integrity": "sha512-vRRDKjqbrtR1R8XOR/TePQr1m+vti1K8+8ehH8/YuGhjwaG3Qbu/ypUHQL4hGF2zw7u3cD9v1AZe6NKNgxidGw==", + "version": "0.8.10", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/image/-/image-0.8.10.tgz", + "integrity": "sha512-o9Bn6FhHF8oOP4PLnJHKyvPckd+cBxrWGFUqsINT+VStvSEA57gktIZw5f9jiHOMnp6TgVprscaviQMa0NO4pQ==", "license": "MIT", "dependencies": { "@wrnexus/plugin": "^0.8.8", "@wrnexus/security": "^0.8.8", - "@wrnexus/ui": "^0.8.8" + "@wrnexus/ui": "^0.8.19" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/jwt": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/jwt/-/jwt-0.8.8.tgz", - "integrity": "sha512-is2SDq8Y8Ltyrh4F48WpUoLHY1QiHl6ZxQ2KKkNDh6ASZoTwvDWklmZe/C27cxJDqE2yhdXBofAO+nHx5+26jA==", + "version": "0.8.9", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/jwt/-/jwt-0.8.9.tgz", + "integrity": "sha512-LcjXLdDp8pnJ3F6dDGlB3COlvg7jVBIZe+UnF48i7Hy12gHZu0Rbv/iBn9w203tpzT2EmcpGtMyI/J+uLQUeVg==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.8.8" + "@wrnexus/core": "^0.8.9" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/language-server": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/language-server/-/language-server-0.8.8.tgz", - "integrity": "sha512-sF91UE9Yo+809t0wU1JjyAqxENxfBsLSoySnLZV9pRyXRXuN1sqeYVPJ0lz5u8ZY6rwuVtUyrB8fJ8OeX3/tPA==", + "version": "0.8.12", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/language-server/-/language-server-0.8.12.tgz", + "integrity": "sha512-eeJXLzh5tGckAlu2CtuLk0FjiewOtEEfSwGi22e3z4KiGx3KzBjT/kwHyFVureyDAD0HqBYQLshr5FeNQKxIiA==", "license": "MIT", "dependencies": { - "@wrnexus/syntax": "^0.8.8", - "@wrnexus/typecheck": "^0.8.8" + "@wrnexus/syntax": "^0.8.11", + "@wrnexus/typecheck": "^0.8.11", + "vscode-html-languageservice": "^5.6.2" }, "bin": { "wrnexus-language-server": "dist/server.js" @@ -1888,166 +1902,182 @@ } }, "node_modules/@wrnexus/plugin": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/plugin/-/plugin-0.8.8.tgz", - "integrity": "sha512-b1ItR2B1Jkaes1kR1YECpMEnOBMtPw6sVSVcGueF3wOgTPS6zPptwpwLzwQTYH6+sT4eRFMjybEM7An8TscaMw==", + "version": "0.8.9", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/plugin/-/plugin-0.8.9.tgz", + "integrity": "sha512-XpkQL4/MpiNxoNcH1l7dL5cYEu8HN54/b5bx6DBXWutU4tMrAjChtbJ+SsE2YrNve4uWVUhF8wPgsdBrJONOQQ==", "license": "MIT", "dependencies": { - "@wrnexus/syntax": "^0.8.8" + "@wrnexus/syntax": "^0.8.19" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/pubsub": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/pubsub/-/pubsub-0.8.8.tgz", - "integrity": "sha512-X7QH6kecu7gzt0waW+CkaYdDUmEAykoxMwk35GizNTECkUg8SJHjQNf9bgGM9RNIQOkCr12jFSnR+0njn+LqiA==", + "version": "0.8.9", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/pubsub/-/pubsub-0.8.9.tgz", + "integrity": "sha512-Z696WHuzJsPJvkvz3aRcifiZEqHXSIzoH3ji/wPqBP+vqmKIiZ/WIzViSQ0j8QJgtHiiq1mo2d4GFxsfdAPbqg==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.8.8", - "@wrnexus/rpc": "^0.8.8" + "@wrnexus/core": "^0.8.9", + "@wrnexus/rpc": "^0.8.9" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/pwa": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/pwa/-/pwa-0.8.8.tgz", - "integrity": "sha512-rW4S/xNQ1IC0zDthheLfQNPtDeNuRLbQYictOvoJXiYndrh3HZgKdKAvh9DCare+/HftgSM28Tn8ZqUtd0zpBg==", + "version": "0.8.12", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/pwa/-/pwa-0.8.12.tgz", + "integrity": "sha512-XI5wgn+vbPcSbAt3EsqnrPjkx2cd/Zpo3xy2deawuU5k7irkRImPNUWvtjkTar5GaNedVvuZQAhXLghb9p/GQQ==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/queue": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/queue/-/queue-0.8.8.tgz", - "integrity": "sha512-hsP+e06pJsrEA51tc8vA9dNqKp382EkmyiEUXd1eU37rIgGyU8egeBxnXtJALXBU47ddo8JVawNn2wqaKvLA8g==", + "version": "0.8.14", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/queue/-/queue-0.8.14.tgz", + "integrity": "sha512-uulbyU1AF3gnfylmlFMIoBjAKgAgHsHg+FfEmLtoYwsaQ+JtMNk5PEZ/GUUBxEmK9ZbEAdgBAxgEX69E7ne9aA==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.8.8", - "@wrnexus/rpc": "^0.8.8" + "@wrnexus/core": "^0.8.12", + "@wrnexus/db": "^0.8.20", + "@wrnexus/rpc": "^0.8.10" }, "engines": { "bun": ">=1.3.0" } }, - "node_modules/@wrnexus/reactive": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/reactive/-/reactive-0.8.8.tgz", - "integrity": "sha512-BjfLB3wwJL/Fqld53TqMY+8ZtUt9hTctRESXUgr41+AWPj8+S6c7oVNV65pEoGN8C+wAQONg8A67JoZP9jQRXw==", - "license": "MIT", - "engines": { - "bun": ">=1.3.0" - } - }, - "node_modules/@wrnexus/realtime": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/realtime/-/realtime-0.8.8.tgz", - "integrity": "sha512-7arnRMucFz6sYepAIpPLpQtqqEoiPn7YChZ6Ig+wXMeB/3JQRV9PT7usRTtsrKF+eb2IcxguS1V/jzEeHlzdmg==", + "node_modules/@wrnexus/react": { + "version": "0.8.9", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/react/-/react-0.8.9.tgz", + "integrity": "sha512-031RC/EBF1nzSeiwo2gXhOJ+xMLRtPUniN612ZVzj+pqGdn1J8I8vajZwRYKYC2xAVdCiB/EGoZ3FQaT75h8qw==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.8.8", - "@wrnexus/plugin": "^0.8.8", - "@wrnexus/ui": "^0.8.8" - }, - "engines": { - "bun": ">=1.3.0" - } - }, - "node_modules/@wrnexus/router": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/router/-/router-0.8.8.tgz", - "integrity": "sha512-cO+5X9nHljYA8S44Hf3KTv9jRnN558eynZMer54ODw/Iz+8FXBgmRho66f5EAjvML5APKI+fZyFYekL2WNZXYQ==", - "license": "MIT", - "dependencies": { - "@wrnexus/compiler": "^0.8.8", - "@wrnexus/core": "^0.8.8" - }, - "engines": { - "bun": ">=1.3.0" - } - }, - "node_modules/@wrnexus/rpc": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/rpc/-/rpc-0.8.8.tgz", - "integrity": "sha512-2mmiNnQ1nIhjSzrt75yU0LfW4n7E6teO7mcvqMPbDrMb+hivv4J3HcreoQXGnp1dAJCyYpf5laPbUmZLGAY6Iw==", - "license": "MIT", - "dependencies": { - "@wrnexus/core": "^0.8.8", - "@wrnexus/helpers": "^0.8.8", - "@wrnexus/jwt": "^0.8.8", - "@wrnexus/validation": "^0.8.8" - }, - "engines": { - "bun": ">=1.3.0" - } - }, - "node_modules/@wrnexus/security": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/security/-/security-0.8.8.tgz", - "integrity": "sha512-ayctEobZK+6AqpHH6SV9u8DO22IAabew2QkxAzVX+eQp7fuQa3vctx2iI4JPmihXsxcZ/bFYsBgeUpPC6VVbkg==", - "license": "MIT", - "dependencies": { - "@wrnexus/core": "^0.8.8" - }, - "engines": { - "bun": ">=1.3.0" - } - }, - "node_modules/@wrnexus/ssr": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/ssr/-/ssr-0.8.8.tgz", - "integrity": "sha512-vQ8KPfsxtkqF80fjp5FWfyhRw4dI9AgqJ8SlLPLGmMmGQdeHG+qzcMf5JL0yFys/2DAY609mhUO23YZdTCs8BQ==", - "license": "MIT", - "dependencies": { - "@wrnexus/core": "^0.8.8", - "@wrnexus/security": "^0.8.8", "@wrnexus/store": "^0.8.8" }, "engines": { "bun": ">=1.3.0" } }, + "node_modules/@wrnexus/reactive": { + "version": "0.8.9", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/reactive/-/reactive-0.8.9.tgz", + "integrity": "sha512-/4+wYx2zwJ2vsHF5VYaQqgTz+WbNsIkC/lFWD2ok/w5VxGC5p2WFj2P+psE22g30bzkAmdEvdiurlKGCSkP8TA==", + "license": "MIT", + "engines": { + "bun": ">=1.3.0" + } + }, + "node_modules/@wrnexus/realtime": { + "version": "0.8.10", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/realtime/-/realtime-0.8.10.tgz", + "integrity": "sha512-sU1djUTqIAX8CGJEuyZTmmRaZZ6hEkPsr8B0XERPTJeKPwoExbnB3oFf1iOOJ7ihZ6MM7vrFOgA11WNNDqSjFg==", + "license": "MIT", + "dependencies": { + "@wrnexus/core": "^0.8.9", + "@wrnexus/plugin": "^0.8.8", + "@wrnexus/ui": "^0.8.19" + }, + "engines": { + "bun": ">=1.3.0" + } + }, + "node_modules/@wrnexus/router": { + "version": "0.8.10", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/router/-/router-0.8.10.tgz", + "integrity": "sha512-zh+h+VDNshSsh2iryqbOCWOhcIbKXg58iWkHz3wKNovlWT0uAgLhmea6IHsiApI8RC/VPw4TAmAhfkaK1c4BBA==", + "license": "MIT", + "dependencies": { + "@wrnexus/compiler": "^0.8.17", + "@wrnexus/core": "^0.8.12" + }, + "engines": { + "bun": ">=1.3.0" + } + }, + "node_modules/@wrnexus/rpc": { + "version": "0.8.10", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/rpc/-/rpc-0.8.10.tgz", + "integrity": "sha512-KbfSxEe0D0ZiM1CckxiEVIEBSzYRYb3iEJYyJnT8DqlrEpos1hCwT22XnTMC3ldsCAusoUPO5gTXMBXL9qMKDQ==", + "license": "MIT", + "dependencies": { + "@wrnexus/core": "^0.8.9", + "@wrnexus/helpers": "^0.8.8", + "@wrnexus/jwt": "^0.8.9", + "@wrnexus/validation": "^0.8.10" + }, + "engines": { + "bun": ">=1.3.0" + } + }, + "node_modules/@wrnexus/security": { + "version": "0.8.9", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/security/-/security-0.8.9.tgz", + "integrity": "sha512-dgz2fYwiw7uhBdsMuLqlPQaqajJx1McTjAhx8Pp1lf8gddsXm+Dnmri/1LXSbPwuSpWB7gsNq326JlVICfipVQ==", + "license": "MIT", + "dependencies": { + "@wrnexus/core": "^0.8.11" + }, + "engines": { + "bun": ">=1.3.0" + } + }, + "node_modules/@wrnexus/ssr": { + "version": "0.8.12", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/ssr/-/ssr-0.8.12.tgz", + "integrity": "sha512-fPoxMfnlwuUs6syJ6LMjqzxIKGsghQ3UCKjSFkRXlvdwdPpWRSxW0g0+jJF66/OTyCo2kB0dwMRGVLhICLgvLw==", + "license": "MIT", + "dependencies": { + "@wrnexus/core": "^0.8.16", + "@wrnexus/security": "^0.8.9", + "@wrnexus/store": "^0.8.12" + }, + "engines": { + "bun": ">=1.3.0" + } + }, "node_modules/@wrnexus/store": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/store/-/store-0.8.8.tgz", - "integrity": "sha512-qeIwa8OGq/BUtECJrgXSqleWGI9DY/syikAeaAF6hvGk775rrxh4971zR2tuiVh/0DUWm/s/8Wzj/bN99EYD2A==", + "version": "0.8.12", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/store/-/store-0.8.12.tgz", + "integrity": "sha512-5AiJXZ6AFT2eshp21JEyeHlmBgHuxyeRslN6YZiIvUfoO4Dre3VtR4pI+hN3lOGloLXwXBUfEMm2mgGsXS36Kg==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/styles": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/styles/-/styles-0.8.8.tgz", - "integrity": "sha512-s7dKF5XrjSxoYfNTefX1FKCimKlv2o9/FEK46RAAtM3p39dpaboj59EcEPFYf1wvcgiUXtH0EWxiKVjyg9wnjA==", + "version": "0.8.26", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/styles/-/styles-0.8.26.tgz", + "integrity": "sha512-B1FgQYks6S9SohlWjDkRabbzAAW9IIKbR5rHrdXegr6QY3nQMtJYPMG8xUVMTpQ8gRL+GODtuhDYPHD/igHuPg==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.8.8", - "@wrnexus/plugin": "^0.8.8", - "@wrnexus/uploader": "^0.8.8" + "@wrnexus/core": "^0.8.16", + "@wrnexus/plugin": "^0.8.9", + "@wrnexus/uploader": "^0.8.13" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/syntax": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/syntax/-/syntax-0.8.8.tgz", - "integrity": "sha512-T3Xq4eiTQ6LxMLsbmo5cm76/FCjbLgpsUlS10QiIe0lSdVJQKpGWjc4aNBKo431Vdulw0T+2K62a93gnVI0wIQ==", + "version": "0.8.19", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/syntax/-/syntax-0.8.19.tgz", + "integrity": "sha512-/OZ+Z/cdFmfqKeqCZZpmwN2ZRSITA2ByqmVjGVONtMRfxHBj99T5jB0be6qlxrmoK0cgntRxEe2JCS/d9h54YA==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/test": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/test/-/test-0.8.8.tgz", - "integrity": "sha512-RoZidv+0xvkUhfDJGwXy8KqXZ1u2zlDCQez/2RpyTEvkza35KYhWQq0QMySFv7SZJTStQY1ow8yUrFYnasHg1A==", + "version": "0.8.16", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/test/-/test-0.8.16.tgz", + "integrity": "sha512-jaeNicouq3Fu6sELzbnSP+XMUMaqZDIwayUSI6PssGyeUFuYm9v7ZoOWc3ljBo1CSvZtTZlT9qAU7jhFmSpV1w==", "license": "MIT", + "dependencies": { + "@wrnexus/core": "^0.8.16" + }, "engines": { "bun": ">=1.3.0" } @@ -2062,53 +2092,66 @@ } }, "node_modules/@wrnexus/typecheck": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/typecheck/-/typecheck-0.8.8.tgz", - "integrity": "sha512-vFNsQc4k2p5rTrqaKYXj3W74Ebe7MMDMLXftGpZWyBNby4aF8HlsJclFLuFdKpfoDX1fprkZ5xGdVFzd51BSRQ==", + "version": "0.8.17", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/typecheck/-/typecheck-0.8.17.tgz", + "integrity": "sha512-sEvCraG7qudT61h0SbuccIegi37nVWW2B1+BjmPg6Zrtc0251lUozASOYMW2ntjiizASDXMTSnZvSJ36EJPflA==", "license": "MIT", "dependencies": { - "@wrnexus/syntax": "^0.8.8", - "typescript": "^5.5.0" + "@wrnexus/syntax": "^0.8.19", + "typescript": "^6.0.3" }, "engines": { "bun": ">=1.3.0" } }, + "node_modules/@wrnexus/typecheck/node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/@wrnexus/ui": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/ui/-/ui-0.8.8.tgz", - "integrity": "sha512-Yxjcz950u9BRPPBRce2ug1Tf/rBESYR8gJ9XehBHQgP5kpCq8RGO7F2OFENCw07AFnElt8je0ym9lfBfEfKGrQ==", + "version": "0.8.88", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/ui/-/ui-0.8.88.tgz", + "integrity": "sha512-C6q3c85tJm0Ajhgb8i+DYOWyICNxeXVsR3KbD5yP0rC2XS5Vj9TP72x7NPux798jGLpbOpSPRiIPUff7zAod7w==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.8.8" + "@wrnexus/core": "^0.8.16" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/uploader": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/uploader/-/uploader-0.8.8.tgz", - "integrity": "sha512-OveR+mjsuHrCuyrtADzWh63LahR9n4zVJSIHFHjK4FsiJQo0NmJKxsEfPiHvb2PBk5bubM/KdGX4aqBXLliTcg==", + "version": "0.8.13", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/uploader/-/uploader-0.8.13.tgz", + "integrity": "sha512-Cfj5Iqtbk/ccXV/YXQ4I8v0GkcE7cFnzMEB33qy3DcWo4fA5ndiWU9CN4Ap1oysA5MWEmcCKuJlcTKdWLhiTvw==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.8.8", + "@wrnexus/core": "^0.8.12", "@wrnexus/plugin": "^0.8.8", - "@wrnexus/ui": "^0.8.8" + "@wrnexus/ui": "^0.8.23" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/validation": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@wrnexus/validation/-/validation-0.8.8.tgz", - "integrity": "sha512-cEh4VObnwoNLAeKz6OP1PDdYaHPd79i4BPxnJSI7rKJi6GrI6vgmJr0U1wXADMbUwC0Xm6GwjGopnYKTGCZfgg==", + "version": "0.8.13", + "resolved": "https://registry.workroot.in/repository/npm/@wrnexus/validation/-/validation-0.8.13.tgz", + "integrity": "sha512-ud9bzeSaOzbYnmu6pKEr5XbBT25FW+ROOI9iB0YJBc624juurslgHm2lpmpOu2WKUWulgktb/2vl9nsvtI8pSw==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.8.8", + "@wrnexus/core": "^0.8.12", "@wrnexus/plugin": "^0.8.8", - "@wrnexus/ui": "^0.8.8" + "@wrnexus/ui": "^0.8.76" }, "engines": { "bun": ">=1.3.0" @@ -3678,6 +3721,7 @@ }, "node_modules/typescript": { "version": "5.9.3", + "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -3724,6 +3768,36 @@ "punycode": "^2.1.0" } }, + "node_modules/vscode-html-languageservice": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-5.6.2.tgz", + "integrity": "sha512-ulCrSnFnfQ16YzvwnYUgEbUEl/ZG7u2eV27YhvLObSHKkb8fw1Z9cgsnUwjTEeDIdJDoTDTDpxuhQwoenoLNMg==", + "license": "MIT", + "dependencies": { + "@vscode/l10n": "^0.0.18", + "vscode-languageserver-textdocument": "^1.0.12", + "vscode-languageserver-types": "^3.17.5", + "vscode-uri": "^3.1.0" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.15.tgz", + "integrity": "sha512-Gsfr9S8LU3S6885cS+NaleasJ0n3V5y/SOTqHCifQiXWFw3G9w9/YItDfwHrlCz+dSZWWZ8ilYVMcJe7Sz7Sxw==", + "license": "MIT" + }, + "node_modules/vscode-languageserver-types": { + "version": "3.18.4", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.18.4.tgz", + "integrity": "sha512-nQsacoiijvl0fRf2q28uFDrAVwRhdCa3QveiF7/CX0r18mLR5FU/1WskSsCKOjmEbtteKUnY8x8Yzxop+k0zwg==", + "license": "MIT" + }, + "node_modules/vscode-uri": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.2.0.tgz", + "integrity": "sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg==", + "license": "MIT" + }, "node_modules/which": { "version": "2.0.2", "dev": true, diff --git a/package.json b/package.json index 92988167..cb6fc334 100644 --- a/package.json +++ b/package.json @@ -27,59 +27,59 @@ "dependencies": { "@iconify-json/lucide": "^1.2.118", "@iconify/tailwind4": "^1.2.3", - "@wrnexus/ai": "^0.8.8", - "@wrnexus/authz": "^0.8.8", - "@wrnexus/compiler": "^0.8.8", - "@wrnexus/core": "^0.8.8", - "@wrnexus/csr": "^0.8.8", - "@wrnexus/db": "^0.8.8", - "@wrnexus/dev-server": "^0.8.8", - "@wrnexus/encryption": "^0.8.8", - "@wrnexus/helpers": "^0.8.8", - "@wrnexus/i18n": "^0.8.8", - "@wrnexus/jwt": "^0.8.8", + "@wrnexus/ai": "^0.8.9", + "@wrnexus/authz": "^0.8.15", + "@wrnexus/compiler": "^0.8.30", + "@wrnexus/core": "^0.8.16", + "@wrnexus/csr": "^0.8.43", + "@wrnexus/db": "^0.8.23", + "@wrnexus/dev-server": "^0.8.66", + "@wrnexus/encryption": "^0.8.10", + "@wrnexus/helpers": "^0.8.9", + "@wrnexus/i18n": "^0.8.12", + "@wrnexus/jwt": "^0.8.9", "@wrnexus/mobile": "^0.8.8", "@wrnexus/native": "^0.8.8", "@wrnexus/oauth": "^0.8.8", - "@wrnexus/pubsub": "^0.8.8", - "@wrnexus/queue": "^0.8.8", - "@wrnexus/reactive": "^0.8.8", - "@wrnexus/router": "^0.8.8", - "@wrnexus/ssr": "^0.8.8", - "@wrnexus/styles": "^0.8.8", - "@wrnexus/test": "^0.8.8", + "@wrnexus/pubsub": "^0.8.9", + "@wrnexus/queue": "^0.8.14", + "@wrnexus/reactive": "^0.8.9", + "@wrnexus/router": "^0.8.10", + "@wrnexus/ssr": "^0.8.12", + "@wrnexus/styles": "^0.8.26", + "@wrnexus/test": "^0.8.16", "@wrnexus/tracking": "^0.8.8", - "@wrnexus/ui": "^0.8.8", - "@wrnexus/uploader": "^0.8.8", - "@wrnexus/validation": "^0.8.8", - "@wrnexus/dev-toolbar": "^0.8.8", - "@wrnexus/syntax": "^0.8.8", - "@wrnexus/plugin": "^0.8.8", - "@wrnexus/captcha": "^0.8.8", - "@wrnexus/auth": "^0.8.8", - "@wrnexus/store": "^0.8.8", - "@wrnexus/typecheck": "^0.8.8", - "@wrnexus/security": "^0.8.8", + "@wrnexus/ui": "^0.8.88", + "@wrnexus/uploader": "^0.8.13", + "@wrnexus/validation": "^0.8.13", + "@wrnexus/dev-toolbar": "^0.8.18", + "@wrnexus/syntax": "^0.8.19", + "@wrnexus/plugin": "^0.8.9", + "@wrnexus/captcha": "^0.8.16", + "@wrnexus/auth": "^0.8.33", + "@wrnexus/store": "^0.8.12", + "@wrnexus/typecheck": "^0.8.17", + "@wrnexus/security": "^0.8.9", "@wrnexus/cache": "^0.8.8", - "@wrnexus/image": "^0.8.8", + "@wrnexus/image": "^0.8.10", "@wrnexus/observability": "^0.8.8", "@wrnexus/benchmark": "^0.8.8", - "@wrnexus/realtime": "^0.8.8", - "@wrnexus/content": "^0.8.8", + "@wrnexus/realtime": "^0.8.10", + "@wrnexus/content": "^0.8.9", "@wrnexus/graphql": "^0.8.8", "@wrnexus/identity": "^0.8.8", - "@wrnexus/language-server": "^0.8.8", + "@wrnexus/language-server": "^0.8.12", "@wrnexus/mcp": "^0.8.8", "@wrnexus/playground": "^0.8.8", - "@wrnexus/pwa": "^0.8.8", - "@wrnexus/rpc": "^0.8.8" + "@wrnexus/pwa": "^0.8.12", + "@wrnexus/rpc": "^0.8.10" }, "devDependencies": { "@eslint/js": "^9.0.0", "@tailwindcss/cli": "^4.0.0", "@types/bun": "latest", "@types/node": "^26.1.1", - "@wrnexus/cli": "^0.8.8", + "@wrnexus/cli": "^0.8.72", "eslint": "^9.0.0", "prettier": "latest", "tailwindcss": "^4.0.0", @@ -87,6 +87,6 @@ "typescript-eslint": "latest" }, "wrnexus": { - "version": "0.8.8" + "version": "0.8.72" } } diff --git a/public/docs-index.json b/public/docs-index.json index f8b79cd8..6f0797e4 100644 --- a/public/docs-index.json +++ b/public/docs-index.json @@ -1,5 +1,5 @@ { - "version": "0.8.8", + "version": "0.8.72", "status": "private-developer-preview", "generatedAt": "2026-07-13", "documents": [ @@ -7,630 +7,630 @@ "url": "/", "title": "WRNexusJS", "section": "portal", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/access", "title": "access", "section": "portal", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/getting-started", "title": "getting started", "section": "portal", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/tutorial", "title": "tutorial", "section": "portal", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/architecture", "title": "architecture", "section": "portal", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/language", "title": "language", "section": "portal", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages", "title": "packages", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/guides/project-structure", "title": "project structure", "section": "guide", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/guides/routing", "title": "routing", "section": "guide", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/guides/pages-and-components", "title": "pages and components", "section": "guide", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/guides/server-data", "title": "server data", "section": "guide", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/guides/api-routes", "title": "api routes", "section": "guide", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/guides/middleware", "title": "middleware", "section": "guide", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/guides/forms-and-validation", "title": "forms and validation", "section": "guide", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/guides/authentication", "title": "authentication", "section": "guide", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/guides/authorization", "title": "authorization", "section": "guide", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/guides/security", "title": "security", "section": "guide", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/guides/database", "title": "database", "section": "guide", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/guides/uploads", "title": "uploads", "section": "guide", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/guides/realtime", "title": "realtime", "section": "guide", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/guides/pubsub", "title": "pubsub", "section": "guide", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/guides/queues", "title": "queues", "section": "guide", - "version": "0.8.8", + "version": "0.8.72", "stability": "experimental" }, { "url": "/guides/testing", "title": "testing", "section": "guide", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/guides/workspaces-and-gateway", "title": "workspaces and gateway", "section": "guide", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/guides/deployment", "title": "deployment", "section": "guide", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/guides/configuration-and-profiles", "title": "configuration and profiles", "section": "guide", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/guides/i18n-and-themes", "title": "i18n and themes", "section": "guide", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/guides/mobile", "title": "mobile", "section": "guide", - "version": "0.8.8", + "version": "0.8.72", "stability": "experimental" }, { "url": "/guides/observability", "title": "observability", "section": "guide", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/guides/upgrading", "title": "upgrading", "section": "guide", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/guides/troubleshooting", "title": "troubleshooting", "section": "guide", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/guides/full-stack-auth-demo", "title": "full stack auth demo", "section": "guide", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/examples", "title": "examples", "section": "portal", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/showcase", "title": "showcase", "section": "portal", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/benchmarks", "title": "benchmarks", "section": "portal", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/roadmap", "title": "roadmap", "section": "portal", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/changelog", "title": "changelog", "section": "portal", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { - "url": "/releases/0.8.8", - "title": "0.8.8", + "url": "/releases/0.8.72", + "title": "0.8.72", "section": "portal", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/security", "title": "security", "section": "portal", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/support", "title": "support", "section": "portal", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/license", "title": "license", "section": "portal", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/search", "title": "search", "section": "portal", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/404", "title": "404", "section": "portal", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/ai", "title": "ai", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/auth", "title": "auth", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/authz", "title": "authz", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/benchmark", "title": "benchmark", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/cache", "title": "cache", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/captcha", "title": "captcha", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/cli", "title": "cli", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/compiler", "title": "compiler", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/content", "title": "content", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/core", "title": "core", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/csr", "title": "csr", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/db", "title": "db", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/dev-server", "title": "dev server", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/dev-toolbar", "title": "dev toolbar", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/encryption", "title": "encryption", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/graphql", "title": "graphql", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/helpers", "title": "helpers", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/i18n", "title": "i18n", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/identity", "title": "identity", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/image", "title": "image", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/jwt", "title": "jwt", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/language-server", "title": "language server", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/mcp", "title": "mcp", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/mobile", "title": "mobile", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "experimental" }, { "url": "/packages/native", "title": "native", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/oauth", "title": "oauth", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/observability", "title": "observability", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/playground", "title": "playground", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/plugin", "title": "plugin", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/pubsub", "title": "pubsub", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/pwa", "title": "pwa", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/queue", "title": "queue", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/reactive", "title": "reactive", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/realtime", "title": "realtime", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/router", "title": "router", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/rpc", "title": "rpc", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/security", "title": "security", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/ssr", "title": "ssr", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/store", "title": "store", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/styles", "title": "styles", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/syntax", "title": "syntax", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/test", "title": "test", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/tracking", "title": "tracking", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/typecheck", "title": "typecheck", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/ui", "title": "ui", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/uploader", "title": "uploader", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" }, { "url": "/packages/validation", "title": "validation", "section": "package", - "version": "0.8.8", + "version": "0.8.72", "stability": "preview" } ] diff --git a/public/llms-full.txt b/public/llms-full.txt index 03ffba47..36bf2049 100644 --- a/public/llms-full.txt +++ b/public/llms-full.txt @@ -1,4 +1,4 @@ -# WRNexusJS documentation 0.8.8 +# WRNexusJS documentation 0.8.72 Status: Private Developer Preview. This site documents 47 release-aligned packages. @@ -259,7 +259,7 @@ export const POST = async (ctx) => { ## CLI -See the generated **Complete CLI command reference** below. It is sourced from the installed 0.8.8 executable so command names and options cannot drift. +See the generated **Complete CLI command reference** below. It is sourced from the installed 0.8.72 executable so command names and options cannot drift. ## When asked to "create a page/component/feature" @@ -269,9 +269,11 @@ See the generated **Complete CLI command reference** below. It is sourced from t 4. Style with Tailwind utility classes in the view, or theme tokens (`var(--wire-*)`), or `style { }`. 5. Never emit React/JSX, a manual router, or client-side island JS — the framework handles hydration. +Release: WRNexusJS 0.8.72 + # Complete CLI command reference -This section is generated from the installed `@wrnexus/cli@0.8.7` executable. It is the canonical command inventory for this release. +This section is generated from the installed `@wrnexus/cli@0.8.72` executable. It is the canonical command inventory for this release. ```text wrnexus — WrNexus CLI @@ -298,11 +300,12 @@ Usage: wrnexus generate types [app-dir] Generate application-wide route/component/key types wrnexus routes [app-dir] Generate typed named routes wrnexus typecheck [app-dir] Generate types and check TypeScript plus every .wrn file + wrnexus check [app-dir] Build/generate, typecheck, lint, test, and format-check wrnexus mobile add Install Capacitor or Expo native packages wrnexus mobile compile Compile .wrn pages into native Expo routes wrnexus native list List cross-platform native capabilities wrnexus native add Install capability packages for the configured mobile mode - wrnexus eject Copy a Wire UI component into app/components + wrnexus eject Copy a WrNexus UI component into app/components wrnexus update [dir] [--latest] Upgrade deps, migrate project files, and verify the app wrnexus db Migrations: migrate | rollback | status | seed | generate | new wrnexus authz Authorization: list | generate | init [--dialect=sqlite|postgres|mysql] @@ -310,8 +313,6 @@ Usage: Run unit | component | api | browser | visual | accessibility | performance wrnexus profiles [app-dir] List config profiles (dev/prod/uat/…) and their env files wrnexus doctor [app-dir] [--fix] Check project health; optionally apply safe repairs - wrnexus compatibility [app-dir] - Inspect or explicitly upgrade behavior defaults wrnexus contracts [app-dir] Detect breaking boundary contract changes wrnexus security [app-dir] @@ -355,1486 +356,7 @@ Commands below are copy-ready. Paths, ports, counts, and timings vary by project ### Create, check, build, and preview an application ```bash -bunx @wrnexus/cli@0.8.7 create my-app -cd my-app -bun install -bunx wrnexus typecheck . -bunx wrnexus build . -bunx wrnexus preview . --port=3000 -``` - -Expected output: - -```text -✓ Application types are valid -✓ Runtime: .../dist/reactive.js -✓ Styles: .../dist/styles.css -✓ Server: .../dist/server.js -Run it: bun .../dist/server.js -``` - -### Generate framework files and committed application types - -```bash -bunx wrnexus generate page Dashboard -bunx wrnexus generate component status-card -bunx wrnexus generate api health -bunx wrnexus generate schema account -bunx wrnexus generate routes -bunx wrnexus generate types . -``` - -Expected output includes created source paths followed by: - -```text -✓ Generated app/routes.gen.ts (... routes) -✓ Generated .../app/types/wrnexus.generated.d.ts (... routes, ... components) -``` - -### Run development and production-runtime modes - -```bash -bunx wrnexus dev . --port=3000 -bunx wrnexus dev . --services --services-port=3099 -bunx wrnexus dev . --production-runtime --port=3000 -``` - -Expected output reports the active profile, discovered plugins/routes, generated cache path, and listening URL. Production-runtime mode rebuilds and reloads the exact production artifact. - -### Database lifecycle - -```bash -bunx wrnexus db status -bunx wrnexus db new create_accounts --from-models -bunx wrnexus db migrate -bunx wrnexus db generate -bunx wrnexus db seed -``` - -Expected output identifies the selected profile/dialect, migration state, applied migration names, and generated typed query files. Run `db rollback` only when intentionally reverting the latest migration. - -### Diagnose, inspect, and enforce contracts - -```bash -bunx wrnexus doctor . -bunx wrnexus typecheck . -bunx wrnexus compatibility check . -bunx wrnexus contracts check . -bunx wrnexus security audit . -bunx wrnexus inspect packages . -bunx wrnexus inspect routes . -bunx wrnexus inspect component Navbar . -bunx wrnexus analyze . -``` - -Successful checks exit with status 0. Inspect commands print the resolved package, route, component, asset, runtime, style, migration, or bundle contract without changing the application. - -### Tests, API artifacts, SDKs, and deployment manifests - -```bash -bunx wrnexus test unit . -bunx wrnexus test component . -bunx wrnexus test api . -bunx wrnexus test browser . -bunx wrnexus api generate . -bunx wrnexus api docs . -bunx wrnexus sdk generate typescript . -bunx wrnexus deploy docker . -``` - -Test commands return the underlying suite summary and a nonzero status on failure. API/SDK/deploy commands report each generated artifact; review and commit generated files after validation. - -### Workspaces and environments - -```bash -bunx wrnexus workspace company-platform -cd company-platform -bunx wrnexus workspace add reports --domain=reports.localhost -bunx wrnexus gateway --port=3000 -bunx wrnexus production . --prepare-only -bunx wrnexus staging . -``` - -Expected output lists created apps, domain mappings, selected environment/profile, build and migration decisions, and the gateway address. - -### Internationalization, native targets, MCP, and support bundles - -```bash -bunx wrnexus i18n extract . -bunx wrnexus i18n validate . -bunx wrnexus generate mobile -bunx wrnexus mobile compile -bunx wrnexus native list -bunx wrnexus mcp . -bunx wrnexus report . --file=app/pages/index.wrn -``` - -Expected output identifies extracted/validated translation keys, generated native routes, available capabilities, MCP stdio startup, or the sanitized reproduction archive. MCP uses stdio, so protocol messages—not a web URL—are its normal runtime output. - -### Safe upgrades - -```bash -bunx wrnexus update . --latest --dry-run -bunx wrnexus update . --latest -``` - -The dry run previews dependency and migration changes. A real update prints the source and target versions, backup directory, each migration action, installation result, and verification result. Commit or back up the application before upgrading. - -# Complete CLI command reference - -This section is generated from the installed `@wrnexus/cli@0.8.7` executable. It is the canonical command inventory for this release. - -```text -wrnexus — WrNexus CLI - -Usage: - wrnexus dev [app-dir] [--port=3000] [--host=::] - Start the development server (live reload) - wrnexus dev [app-dir] --services Start local production-service simulators with the app - wrnexus dev [app-dir] --production-runtime - wrnexus dev [app-dir] --services [--services-port=3099] [--services-http] - Rebuild and reload the exact production artifact - wrnexus build [app-dir] Build a production server bundle + assets - wrnexus preview [app-dir] Serve the existing exact production output - wrnexus create Scaffold a new app - wrnexus workspace Scaffold a monorepo (apps/* + shared packages/*) - wrnexus workspace add [--domain=name.localhost] - Add an app to the current workspace - wrnexus gateway [--port=3000] Serve every workspace app behind one port, routed by domain - wrnexus production [workspace-dir] Build, migrate, and serve the complete production workspace - wrnexus [workspace-dir] Run a configured workspace environment (development/staging/custom) - wrnexus generate Scaffold a page | component | api | schema - wrnexus generate routes | docker | mobile - Generate routes or scaffold deployment targets - wrnexus generate types [app-dir] Generate application-wide route/component/key types - wrnexus routes [app-dir] Generate typed named routes - wrnexus typecheck [app-dir] Generate types and check TypeScript plus every .wrn file - wrnexus mobile add Install Capacitor or Expo native packages - wrnexus mobile compile Compile .wrn pages into native Expo routes - wrnexus native list List cross-platform native capabilities - wrnexus native add Install capability packages for the configured mobile mode - wrnexus eject Copy a Wire UI component into app/components - wrnexus update [dir] [--latest] Upgrade deps, migrate project files, and verify the app - wrnexus db Migrations: migrate | rollback | status | seed | generate | new - wrnexus authz Authorization: list | generate | init [--dialect=sqlite|postgres|mysql] - wrnexus test [level] [app-dir] [--watch] - Run unit | component | api | browser | visual | accessibility | performance - wrnexus profiles [app-dir] List config profiles (dev/prod/uat/…) and their env files - wrnexus doctor [app-dir] [--fix] Check project health; optionally apply safe repairs - wrnexus compatibility [app-dir] - Inspect or explicitly upgrade behavior defaults - wrnexus contracts [app-dir] - Detect breaking boundary contract changes - wrnexus security [app-dir] - Audit ASVS controls, inspect headers, or run abuse tests - wrnexus api [app-dir] Generate OpenAPI, docs, Postman, examples and SDKs - wrnexus sdk generate [app-dir] - Generate TypeScript, JavaScript, Java, Go, or Python SDK - wrnexus deploy [app-dir] Generate docker | kubernetes | systemd | railway | render | fly - wrnexus mcp [app-dir] Start the WRNexus MCP server over stdio - wrnexus i18n [app-dir] - Extract and audit translation keys - wrnexus report [app-dir] [--file=app/pages/page.wrn] - Create a sanitized reproduction bundle - wrnexus playground [--port=4173] Start the shareable WRN compiler playground - wrnexus config [app-dir] --explain Print the fully resolved profile configuration - wrnexus analyze [app-dir] Inspect dist/build-report.json and performance budgets - wrnexus explain [subject] [app-dir] - Explain compiler and production build decisions - wrnexus explain [app-dir] - Explain route caching or permission enforcement - wrnexus inspect [app-dir] Inspect packages | plugins | routes | assets | runtimes | styles | migrations | bundle - wrnexus inspect component [app-dir] - Inspect a component's typed public contract - wrnexus generate system Scaffold a complete framework-native package - -Profiles: pass --profile= to dev/build/db (or set WRNEXUS_PROFILE) to load -that profile's .env cascade and config overrides. e.g. wrnexus dev --profile=uat - -Workspace environments: configure protocol, rootDomain, port, hostname, runtime -(development|production), hmr, build, migrate, and profile in wrnexus.workspace.ts. -CLI overrides: --port, --host, --build/--no-build, --migrate/--no-migrate, ---profile, and --prepare-only. - -Update options: --dry-run previews changes; --no-verify skips post-update check/build. -``` - -## CLI workflows with expected output - -Commands below are copy-ready. Paths, ports, counts, and timings vary by project; the shown output identifies the success condition to check. - -### Create, check, build, and preview an application - -```bash -bunx @wrnexus/cli@0.8.7 create my-app -cd my-app -bun install -bunx wrnexus typecheck . -bunx wrnexus build . -bunx wrnexus preview . --port=3000 -``` - -Expected output: - -```text -✓ Application types are valid -✓ Runtime: .../dist/reactive.js -✓ Styles: .../dist/styles.css -✓ Server: .../dist/server.js -Run it: bun .../dist/server.js -``` - -### Generate framework files and committed application types - -```bash -bunx wrnexus generate page Dashboard -bunx wrnexus generate component status-card -bunx wrnexus generate api health -bunx wrnexus generate schema account -bunx wrnexus generate routes -bunx wrnexus generate types . -``` - -Expected output includes created source paths followed by: - -```text -✓ Generated app/routes.gen.ts (... routes) -✓ Generated .../app/types/wrnexus.generated.d.ts (... routes, ... components) -``` - -### Run development and production-runtime modes - -```bash -bunx wrnexus dev . --port=3000 -bunx wrnexus dev . --services --services-port=3099 -bunx wrnexus dev . --production-runtime --port=3000 -``` - -Expected output reports the active profile, discovered plugins/routes, generated cache path, and listening URL. Production-runtime mode rebuilds and reloads the exact production artifact. - -### Database lifecycle - -```bash -bunx wrnexus db status -bunx wrnexus db new create_accounts --from-models -bunx wrnexus db migrate -bunx wrnexus db generate -bunx wrnexus db seed -``` - -Expected output identifies the selected profile/dialect, migration state, applied migration names, and generated typed query files. Run `db rollback` only when intentionally reverting the latest migration. - -### Diagnose, inspect, and enforce contracts - -```bash -bunx wrnexus doctor . -bunx wrnexus typecheck . -bunx wrnexus compatibility check . -bunx wrnexus contracts check . -bunx wrnexus security audit . -bunx wrnexus inspect packages . -bunx wrnexus inspect routes . -bunx wrnexus inspect component Navbar . -bunx wrnexus analyze . -``` - -Successful checks exit with status 0. Inspect commands print the resolved package, route, component, asset, runtime, style, migration, or bundle contract without changing the application. - -### Tests, API artifacts, SDKs, and deployment manifests - -```bash -bunx wrnexus test unit . -bunx wrnexus test component . -bunx wrnexus test api . -bunx wrnexus test browser . -bunx wrnexus api generate . -bunx wrnexus api docs . -bunx wrnexus sdk generate typescript . -bunx wrnexus deploy docker . -``` - -Test commands return the underlying suite summary and a nonzero status on failure. API/SDK/deploy commands report each generated artifact; review and commit generated files after validation. - -### Workspaces and environments - -```bash -bunx wrnexus workspace company-platform -cd company-platform -bunx wrnexus workspace add reports --domain=reports.localhost -bunx wrnexus gateway --port=3000 -bunx wrnexus production . --prepare-only -bunx wrnexus staging . -``` - -Expected output lists created apps, domain mappings, selected environment/profile, build and migration decisions, and the gateway address. - -### Internationalization, native targets, MCP, and support bundles - -```bash -bunx wrnexus i18n extract . -bunx wrnexus i18n validate . -bunx wrnexus generate mobile -bunx wrnexus mobile compile -bunx wrnexus native list -bunx wrnexus mcp . -bunx wrnexus report . --file=app/pages/index.wrn -``` - -Expected output identifies extracted/validated translation keys, generated native routes, available capabilities, MCP stdio startup, or the sanitized reproduction archive. MCP uses stdio, so protocol messages—not a web URL—are its normal runtime output. - -### Safe upgrades - -```bash -bunx wrnexus update . --latest --dry-run -bunx wrnexus update . --latest -``` - -The dry run previews dependency and migration changes. A real update prints the source and target versions, backup directory, each migration action, installation result, and verification result. Commit or back up the application before upgrading. - -# Complete CLI command reference - -This section is generated from the installed `@wrnexus/cli@0.8.7` executable. It is the canonical command inventory for this release. - -```text -wrnexus — WrNexus CLI - -Usage: - wrnexus dev [app-dir] [--port=3000] [--host=::] - Start the development server (live reload) - wrnexus dev [app-dir] --services Start local production-service simulators with the app - wrnexus dev [app-dir] --production-runtime - wrnexus dev [app-dir] --services [--services-port=3099] [--services-http] - Rebuild and reload the exact production artifact - wrnexus build [app-dir] Build a production server bundle + assets - wrnexus preview [app-dir] Serve the existing exact production output - wrnexus create Scaffold a new app - wrnexus workspace Scaffold a monorepo (apps/* + shared packages/*) - wrnexus workspace add [--domain=name.localhost] - Add an app to the current workspace - wrnexus gateway [--port=3000] Serve every workspace app behind one port, routed by domain - wrnexus production [workspace-dir] Build, migrate, and serve the complete production workspace - wrnexus [workspace-dir] Run a configured workspace environment (development/staging/custom) - wrnexus generate Scaffold a page | component | api | schema - wrnexus generate routes | docker | mobile - Generate routes or scaffold deployment targets - wrnexus generate types [app-dir] Generate application-wide route/component/key types - wrnexus routes [app-dir] Generate typed named routes - wrnexus typecheck [app-dir] Generate types and check TypeScript plus every .wrn file - wrnexus mobile add Install Capacitor or Expo native packages - wrnexus mobile compile Compile .wrn pages into native Expo routes - wrnexus native list List cross-platform native capabilities - wrnexus native add Install capability packages for the configured mobile mode - wrnexus eject Copy a Wire UI component into app/components - wrnexus update [dir] [--latest] Upgrade deps, migrate project files, and verify the app - wrnexus db Migrations: migrate | rollback | status | seed | generate | new - wrnexus authz Authorization: list | generate | init [--dialect=sqlite|postgres|mysql] - wrnexus test [level] [app-dir] [--watch] - Run unit | component | api | browser | visual | accessibility | performance - wrnexus profiles [app-dir] List config profiles (dev/prod/uat/…) and their env files - wrnexus doctor [app-dir] [--fix] Check project health; optionally apply safe repairs - wrnexus compatibility [app-dir] - Inspect or explicitly upgrade behavior defaults - wrnexus contracts [app-dir] - Detect breaking boundary contract changes - wrnexus security [app-dir] - Audit ASVS controls, inspect headers, or run abuse tests - wrnexus api [app-dir] Generate OpenAPI, docs, Postman, examples and SDKs - wrnexus sdk generate [app-dir] - Generate TypeScript, JavaScript, Java, Go, or Python SDK - wrnexus deploy [app-dir] Generate docker | kubernetes | systemd | railway | render | fly - wrnexus mcp [app-dir] Start the WRNexus MCP server over stdio - wrnexus i18n [app-dir] - Extract and audit translation keys - wrnexus report [app-dir] [--file=app/pages/page.wrn] - Create a sanitized reproduction bundle - wrnexus playground [--port=4173] Start the shareable WRN compiler playground - wrnexus config [app-dir] --explain Print the fully resolved profile configuration - wrnexus analyze [app-dir] Inspect dist/build-report.json and performance budgets - wrnexus explain [subject] [app-dir] - Explain compiler and production build decisions - wrnexus explain [app-dir] - Explain route caching or permission enforcement - wrnexus inspect [app-dir] Inspect packages | plugins | routes | assets | runtimes | styles | migrations | bundle - wrnexus inspect component [app-dir] - Inspect a component's typed public contract - wrnexus generate system Scaffold a complete framework-native package - -Profiles: pass --profile= to dev/build/db (or set WRNEXUS_PROFILE) to load -that profile's .env cascade and config overrides. e.g. wrnexus dev --profile=uat - -Workspace environments: configure protocol, rootDomain, port, hostname, runtime -(development|production), hmr, build, migrate, and profile in wrnexus.workspace.ts. -CLI overrides: --port, --host, --build/--no-build, --migrate/--no-migrate, ---profile, and --prepare-only. - -Update options: --dry-run previews changes; --no-verify skips post-update check/build. -``` - -## CLI workflows with expected output - -Commands below are copy-ready. Paths, ports, counts, and timings vary by project; the shown output identifies the success condition to check. - -### Create, check, build, and preview an application - -```bash -bunx @wrnexus/cli@0.8.7 create my-app -cd my-app -bun install -bunx wrnexus typecheck . -bunx wrnexus build . -bunx wrnexus preview . --port=3000 -``` - -Expected output: - -```text -✓ Application types are valid -✓ Runtime: .../dist/reactive.js -✓ Styles: .../dist/styles.css -✓ Server: .../dist/server.js -Run it: bun .../dist/server.js -``` - -### Generate framework files and committed application types - -```bash -bunx wrnexus generate page Dashboard -bunx wrnexus generate component status-card -bunx wrnexus generate api health -bunx wrnexus generate schema account -bunx wrnexus generate routes -bunx wrnexus generate types . -``` - -Expected output includes created source paths followed by: - -```text -✓ Generated app/routes.gen.ts (... routes) -✓ Generated .../app/types/wrnexus.generated.d.ts (... routes, ... components) -``` - -### Run development and production-runtime modes - -```bash -bunx wrnexus dev . --port=3000 -bunx wrnexus dev . --services --services-port=3099 -bunx wrnexus dev . --production-runtime --port=3000 -``` - -Expected output reports the active profile, discovered plugins/routes, generated cache path, and listening URL. Production-runtime mode rebuilds and reloads the exact production artifact. - -### Database lifecycle - -```bash -bunx wrnexus db status -bunx wrnexus db new create_accounts --from-models -bunx wrnexus db migrate -bunx wrnexus db generate -bunx wrnexus db seed -``` - -Expected output identifies the selected profile/dialect, migration state, applied migration names, and generated typed query files. Run `db rollback` only when intentionally reverting the latest migration. - -### Diagnose, inspect, and enforce contracts - -```bash -bunx wrnexus doctor . -bunx wrnexus typecheck . -bunx wrnexus compatibility check . -bunx wrnexus contracts check . -bunx wrnexus security audit . -bunx wrnexus inspect packages . -bunx wrnexus inspect routes . -bunx wrnexus inspect component Navbar . -bunx wrnexus analyze . -``` - -Successful checks exit with status 0. Inspect commands print the resolved package, route, component, asset, runtime, style, migration, or bundle contract without changing the application. - -### Tests, API artifacts, SDKs, and deployment manifests - -```bash -bunx wrnexus test unit . -bunx wrnexus test component . -bunx wrnexus test api . -bunx wrnexus test browser . -bunx wrnexus api generate . -bunx wrnexus api docs . -bunx wrnexus sdk generate typescript . -bunx wrnexus deploy docker . -``` - -Test commands return the underlying suite summary and a nonzero status on failure. API/SDK/deploy commands report each generated artifact; review and commit generated files after validation. - -### Workspaces and environments - -```bash -bunx wrnexus workspace company-platform -cd company-platform -bunx wrnexus workspace add reports --domain=reports.localhost -bunx wrnexus gateway --port=3000 -bunx wrnexus production . --prepare-only -bunx wrnexus staging . -``` - -Expected output lists created apps, domain mappings, selected environment/profile, build and migration decisions, and the gateway address. - -### Internationalization, native targets, MCP, and support bundles - -```bash -bunx wrnexus i18n extract . -bunx wrnexus i18n validate . -bunx wrnexus generate mobile -bunx wrnexus mobile compile -bunx wrnexus native list -bunx wrnexus mcp . -bunx wrnexus report . --file=app/pages/index.wrn -``` - -Expected output identifies extracted/validated translation keys, generated native routes, available capabilities, MCP stdio startup, or the sanitized reproduction archive. MCP uses stdio, so protocol messages—not a web URL—are its normal runtime output. - -### Safe upgrades - -```bash -bunx wrnexus update . --latest --dry-run -bunx wrnexus update . --latest -``` - -The dry run previews dependency and migration changes. A real update prints the source and target versions, backup directory, each migration action, installation result, and verification result. Commit or back up the application before upgrading. - -# Complete CLI command reference - -This section is generated from the installed `@wrnexus/cli@0.8.7` executable. It is the canonical command inventory for this release. - -```text -wrnexus — WrNexus CLI - -Usage: - wrnexus dev [app-dir] [--port=3000] [--host=::] - Start the development server (live reload) - wrnexus dev [app-dir] --services Start local production-service simulators with the app - wrnexus dev [app-dir] --production-runtime - wrnexus dev [app-dir] --services [--services-port=3099] [--services-http] - Rebuild and reload the exact production artifact - wrnexus build [app-dir] Build a production server bundle + assets - wrnexus preview [app-dir] Serve the existing exact production output - wrnexus create Scaffold a new app - wrnexus workspace Scaffold a monorepo (apps/* + shared packages/*) - wrnexus workspace add [--domain=name.localhost] - Add an app to the current workspace - wrnexus gateway [--port=3000] Serve every workspace app behind one port, routed by domain - wrnexus production [workspace-dir] Build, migrate, and serve the complete production workspace - wrnexus [workspace-dir] Run a configured workspace environment (development/staging/custom) - wrnexus generate Scaffold a page | component | api | schema - wrnexus generate routes | docker | mobile - Generate routes or scaffold deployment targets - wrnexus generate types [app-dir] Generate application-wide route/component/key types - wrnexus routes [app-dir] Generate typed named routes - wrnexus typecheck [app-dir] Generate types and check TypeScript plus every .wrn file - wrnexus mobile add Install Capacitor or Expo native packages - wrnexus mobile compile Compile .wrn pages into native Expo routes - wrnexus native list List cross-platform native capabilities - wrnexus native add Install capability packages for the configured mobile mode - wrnexus eject Copy a Wire UI component into app/components - wrnexus update [dir] [--latest] Upgrade deps, migrate project files, and verify the app - wrnexus db Migrations: migrate | rollback | status | seed | generate | new - wrnexus authz Authorization: list | generate | init [--dialect=sqlite|postgres|mysql] - wrnexus test [level] [app-dir] [--watch] - Run unit | component | api | browser | visual | accessibility | performance - wrnexus profiles [app-dir] List config profiles (dev/prod/uat/…) and their env files - wrnexus doctor [app-dir] [--fix] Check project health; optionally apply safe repairs - wrnexus compatibility [app-dir] - Inspect or explicitly upgrade behavior defaults - wrnexus contracts [app-dir] - Detect breaking boundary contract changes - wrnexus security [app-dir] - Audit ASVS controls, inspect headers, or run abuse tests - wrnexus api [app-dir] Generate OpenAPI, docs, Postman, examples and SDKs - wrnexus sdk generate [app-dir] - Generate TypeScript, JavaScript, Java, Go, or Python SDK - wrnexus deploy [app-dir] Generate docker | kubernetes | systemd | railway | render | fly - wrnexus mcp [app-dir] Start the WRNexus MCP server over stdio - wrnexus i18n [app-dir] - Extract and audit translation keys - wrnexus report [app-dir] [--file=app/pages/page.wrn] - Create a sanitized reproduction bundle - wrnexus playground [--port=4173] Start the shareable WRN compiler playground - wrnexus config [app-dir] --explain Print the fully resolved profile configuration - wrnexus analyze [app-dir] Inspect dist/build-report.json and performance budgets - wrnexus explain [subject] [app-dir] - Explain compiler and production build decisions - wrnexus explain [app-dir] - Explain route caching or permission enforcement - wrnexus inspect [app-dir] Inspect packages | plugins | routes | assets | runtimes | styles | migrations | bundle - wrnexus inspect component [app-dir] - Inspect a component's typed public contract - wrnexus generate system Scaffold a complete framework-native package - -Profiles: pass --profile= to dev/build/db (or set WRNEXUS_PROFILE) to load -that profile's .env cascade and config overrides. e.g. wrnexus dev --profile=uat - -Workspace environments: configure protocol, rootDomain, port, hostname, runtime -(development|production), hmr, build, migrate, and profile in wrnexus.workspace.ts. -CLI overrides: --port, --host, --build/--no-build, --migrate/--no-migrate, ---profile, and --prepare-only. - -Update options: --dry-run previews changes; --no-verify skips post-update check/build. -``` - -## CLI workflows with expected output - -Commands below are copy-ready. Paths, ports, counts, and timings vary by project; the shown output identifies the success condition to check. - -### Create, check, build, and preview an application - -```bash -bunx @wrnexus/cli@0.8.7 create my-app -cd my-app -bun install -bunx wrnexus typecheck . -bunx wrnexus build . -bunx wrnexus preview . --port=3000 -``` - -Expected output: - -```text -✓ Application types are valid -✓ Runtime: .../dist/reactive.js -✓ Styles: .../dist/styles.css -✓ Server: .../dist/server.js -Run it: bun .../dist/server.js -``` - -### Generate framework files and committed application types - -```bash -bunx wrnexus generate page Dashboard -bunx wrnexus generate component status-card -bunx wrnexus generate api health -bunx wrnexus generate schema account -bunx wrnexus generate routes -bunx wrnexus generate types . -``` - -Expected output includes created source paths followed by: - -```text -✓ Generated app/routes.gen.ts (... routes) -✓ Generated .../app/types/wrnexus.generated.d.ts (... routes, ... components) -``` - -### Run development and production-runtime modes - -```bash -bunx wrnexus dev . --port=3000 -bunx wrnexus dev . --services --services-port=3099 -bunx wrnexus dev . --production-runtime --port=3000 -``` - -Expected output reports the active profile, discovered plugins/routes, generated cache path, and listening URL. Production-runtime mode rebuilds and reloads the exact production artifact. - -### Database lifecycle - -```bash -bunx wrnexus db status -bunx wrnexus db new create_accounts --from-models -bunx wrnexus db migrate -bunx wrnexus db generate -bunx wrnexus db seed -``` - -Expected output identifies the selected profile/dialect, migration state, applied migration names, and generated typed query files. Run `db rollback` only when intentionally reverting the latest migration. - -### Diagnose, inspect, and enforce contracts - -```bash -bunx wrnexus doctor . -bunx wrnexus typecheck . -bunx wrnexus compatibility check . -bunx wrnexus contracts check . -bunx wrnexus security audit . -bunx wrnexus inspect packages . -bunx wrnexus inspect routes . -bunx wrnexus inspect component Navbar . -bunx wrnexus analyze . -``` - -Successful checks exit with status 0. Inspect commands print the resolved package, route, component, asset, runtime, style, migration, or bundle contract without changing the application. - -### Tests, API artifacts, SDKs, and deployment manifests - -```bash -bunx wrnexus test unit . -bunx wrnexus test component . -bunx wrnexus test api . -bunx wrnexus test browser . -bunx wrnexus api generate . -bunx wrnexus api docs . -bunx wrnexus sdk generate typescript . -bunx wrnexus deploy docker . -``` - -Test commands return the underlying suite summary and a nonzero status on failure. API/SDK/deploy commands report each generated artifact; review and commit generated files after validation. - -### Workspaces and environments - -```bash -bunx wrnexus workspace company-platform -cd company-platform -bunx wrnexus workspace add reports --domain=reports.localhost -bunx wrnexus gateway --port=3000 -bunx wrnexus production . --prepare-only -bunx wrnexus staging . -``` - -Expected output lists created apps, domain mappings, selected environment/profile, build and migration decisions, and the gateway address. - -### Internationalization, native targets, MCP, and support bundles - -```bash -bunx wrnexus i18n extract . -bunx wrnexus i18n validate . -bunx wrnexus generate mobile -bunx wrnexus mobile compile -bunx wrnexus native list -bunx wrnexus mcp . -bunx wrnexus report . --file=app/pages/index.wrn -``` - -Expected output identifies extracted/validated translation keys, generated native routes, available capabilities, MCP stdio startup, or the sanitized reproduction archive. MCP uses stdio, so protocol messages—not a web URL—are its normal runtime output. - -### Safe upgrades - -```bash -bunx wrnexus update . --latest --dry-run -bunx wrnexus update . --latest -``` - -The dry run previews dependency and migration changes. A real update prints the source and target versions, backup directory, each migration action, installation result, and verification result. Commit or back up the application before upgrading. - -# Complete CLI command reference - -This section is generated from the installed `@wrnexus/cli@0.8.7` executable. It is the canonical command inventory for this release. - -```text -wrnexus — WrNexus CLI - -Usage: - wrnexus dev [app-dir] [--port=3000] [--host=::] - Start the development server (live reload) - wrnexus dev [app-dir] --services Start local production-service simulators with the app - wrnexus dev [app-dir] --production-runtime - wrnexus dev [app-dir] --services [--services-port=3099] [--services-http] - Rebuild and reload the exact production artifact - wrnexus build [app-dir] Build a production server bundle + assets - wrnexus preview [app-dir] Serve the existing exact production output - wrnexus create Scaffold a new app - wrnexus workspace Scaffold a monorepo (apps/* + shared packages/*) - wrnexus workspace add [--domain=name.localhost] - Add an app to the current workspace - wrnexus gateway [--port=3000] Serve every workspace app behind one port, routed by domain - wrnexus production [workspace-dir] Build, migrate, and serve the complete production workspace - wrnexus [workspace-dir] Run a configured workspace environment (development/staging/custom) - wrnexus generate Scaffold a page | component | api | schema - wrnexus generate routes | docker | mobile - Generate routes or scaffold deployment targets - wrnexus generate types [app-dir] Generate application-wide route/component/key types - wrnexus routes [app-dir] Generate typed named routes - wrnexus typecheck [app-dir] Generate types and check TypeScript plus every .wrn file - wrnexus mobile add Install Capacitor or Expo native packages - wrnexus mobile compile Compile .wrn pages into native Expo routes - wrnexus native list List cross-platform native capabilities - wrnexus native add Install capability packages for the configured mobile mode - wrnexus eject Copy a Wire UI component into app/components - wrnexus update [dir] [--latest] Upgrade deps, migrate project files, and verify the app - wrnexus db Migrations: migrate | rollback | status | seed | generate | new - wrnexus authz Authorization: list | generate | init [--dialect=sqlite|postgres|mysql] - wrnexus test [level] [app-dir] [--watch] - Run unit | component | api | browser | visual | accessibility | performance - wrnexus profiles [app-dir] List config profiles (dev/prod/uat/…) and their env files - wrnexus doctor [app-dir] [--fix] Check project health; optionally apply safe repairs - wrnexus compatibility [app-dir] - Inspect or explicitly upgrade behavior defaults - wrnexus contracts [app-dir] - Detect breaking boundary contract changes - wrnexus security [app-dir] - Audit ASVS controls, inspect headers, or run abuse tests - wrnexus api [app-dir] Generate OpenAPI, docs, Postman, examples and SDKs - wrnexus sdk generate [app-dir] - Generate TypeScript, JavaScript, Java, Go, or Python SDK - wrnexus deploy [app-dir] Generate docker | kubernetes | systemd | railway | render | fly - wrnexus mcp [app-dir] Start the WRNexus MCP server over stdio - wrnexus i18n [app-dir] - Extract and audit translation keys - wrnexus report [app-dir] [--file=app/pages/page.wrn] - Create a sanitized reproduction bundle - wrnexus playground [--port=4173] Start the shareable WRN compiler playground - wrnexus config [app-dir] --explain Print the fully resolved profile configuration - wrnexus analyze [app-dir] Inspect dist/build-report.json and performance budgets - wrnexus explain [subject] [app-dir] - Explain compiler and production build decisions - wrnexus explain [app-dir] - Explain route caching or permission enforcement - wrnexus inspect [app-dir] Inspect packages | plugins | routes | assets | runtimes | styles | migrations | bundle - wrnexus inspect component [app-dir] - Inspect a component's typed public contract - wrnexus generate system Scaffold a complete framework-native package - -Profiles: pass --profile= to dev/build/db (or set WRNEXUS_PROFILE) to load -that profile's .env cascade and config overrides. e.g. wrnexus dev --profile=uat - -Workspace environments: configure protocol, rootDomain, port, hostname, runtime -(development|production), hmr, build, migrate, and profile in wrnexus.workspace.ts. -CLI overrides: --port, --host, --build/--no-build, --migrate/--no-migrate, ---profile, and --prepare-only. - -Update options: --dry-run previews changes; --no-verify skips post-update check/build. -``` - -## CLI workflows with expected output - -Commands below are copy-ready. Paths, ports, counts, and timings vary by project; the shown output identifies the success condition to check. - -### Create, check, build, and preview an application - -```bash -bunx @wrnexus/cli@0.8.7 create my-app -cd my-app -bun install -bunx wrnexus typecheck . -bunx wrnexus build . -bunx wrnexus preview . --port=3000 -``` - -Expected output: - -```text -✓ Application types are valid -✓ Runtime: .../dist/reactive.js -✓ Styles: .../dist/styles.css -✓ Server: .../dist/server.js -Run it: bun .../dist/server.js -``` - -### Generate framework files and committed application types - -```bash -bunx wrnexus generate page Dashboard -bunx wrnexus generate component status-card -bunx wrnexus generate api health -bunx wrnexus generate schema account -bunx wrnexus generate routes -bunx wrnexus generate types . -``` - -Expected output includes created source paths followed by: - -```text -✓ Generated app/routes.gen.ts (... routes) -✓ Generated .../app/types/wrnexus.generated.d.ts (... routes, ... components) -``` - -### Run development and production-runtime modes - -```bash -bunx wrnexus dev . --port=3000 -bunx wrnexus dev . --services --services-port=3099 -bunx wrnexus dev . --production-runtime --port=3000 -``` - -Expected output reports the active profile, discovered plugins/routes, generated cache path, and listening URL. Production-runtime mode rebuilds and reloads the exact production artifact. - -### Database lifecycle - -```bash -bunx wrnexus db status -bunx wrnexus db new create_accounts --from-models -bunx wrnexus db migrate -bunx wrnexus db generate -bunx wrnexus db seed -``` - -Expected output identifies the selected profile/dialect, migration state, applied migration names, and generated typed query files. Run `db rollback` only when intentionally reverting the latest migration. - -### Diagnose, inspect, and enforce contracts - -```bash -bunx wrnexus doctor . -bunx wrnexus typecheck . -bunx wrnexus compatibility check . -bunx wrnexus contracts check . -bunx wrnexus security audit . -bunx wrnexus inspect packages . -bunx wrnexus inspect routes . -bunx wrnexus inspect component Navbar . -bunx wrnexus analyze . -``` - -Successful checks exit with status 0. Inspect commands print the resolved package, route, component, asset, runtime, style, migration, or bundle contract without changing the application. - -### Tests, API artifacts, SDKs, and deployment manifests - -```bash -bunx wrnexus test unit . -bunx wrnexus test component . -bunx wrnexus test api . -bunx wrnexus test browser . -bunx wrnexus api generate . -bunx wrnexus api docs . -bunx wrnexus sdk generate typescript . -bunx wrnexus deploy docker . -``` - -Test commands return the underlying suite summary and a nonzero status on failure. API/SDK/deploy commands report each generated artifact; review and commit generated files after validation. - -### Workspaces and environments - -```bash -bunx wrnexus workspace company-platform -cd company-platform -bunx wrnexus workspace add reports --domain=reports.localhost -bunx wrnexus gateway --port=3000 -bunx wrnexus production . --prepare-only -bunx wrnexus staging . -``` - -Expected output lists created apps, domain mappings, selected environment/profile, build and migration decisions, and the gateway address. - -### Internationalization, native targets, MCP, and support bundles - -```bash -bunx wrnexus i18n extract . -bunx wrnexus i18n validate . -bunx wrnexus generate mobile -bunx wrnexus mobile compile -bunx wrnexus native list -bunx wrnexus mcp . -bunx wrnexus report . --file=app/pages/index.wrn -``` - -Expected output identifies extracted/validated translation keys, generated native routes, available capabilities, MCP stdio startup, or the sanitized reproduction archive. MCP uses stdio, so protocol messages—not a web URL—are its normal runtime output. - -### Safe upgrades - -```bash -bunx wrnexus update . --latest --dry-run -bunx wrnexus update . --latest -``` - -The dry run previews dependency and migration changes. A real update prints the source and target versions, backup directory, each migration action, installation result, and verification result. Commit or back up the application before upgrading. - -# Complete CLI command reference - -This section is generated from the installed `@wrnexus/cli@0.8.7` executable. It is the canonical command inventory for this release. - -```text -wrnexus — WrNexus CLI - -Usage: - wrnexus dev [app-dir] [--port=3000] [--host=::] - Start the development server (live reload) - wrnexus dev [app-dir] --services Start local production-service simulators with the app - wrnexus dev [app-dir] --production-runtime - wrnexus dev [app-dir] --services [--services-port=3099] [--services-http] - Rebuild and reload the exact production artifact - wrnexus build [app-dir] Build a production server bundle + assets - wrnexus preview [app-dir] Serve the existing exact production output - wrnexus create Scaffold a new app - wrnexus workspace Scaffold a monorepo (apps/* + shared packages/*) - wrnexus workspace add [--domain=name.localhost] - Add an app to the current workspace - wrnexus gateway [--port=3000] Serve every workspace app behind one port, routed by domain - wrnexus production [workspace-dir] Build, migrate, and serve the complete production workspace - wrnexus [workspace-dir] Run a configured workspace environment (development/staging/custom) - wrnexus generate Scaffold a page | component | api | schema - wrnexus generate routes | docker | mobile - Generate routes or scaffold deployment targets - wrnexus generate types [app-dir] Generate application-wide route/component/key types - wrnexus routes [app-dir] Generate typed named routes - wrnexus typecheck [app-dir] Generate types and check TypeScript plus every .wrn file - wrnexus mobile add Install Capacitor or Expo native packages - wrnexus mobile compile Compile .wrn pages into native Expo routes - wrnexus native list List cross-platform native capabilities - wrnexus native add Install capability packages for the configured mobile mode - wrnexus eject Copy a Wire UI component into app/components - wrnexus update [dir] [--latest] Upgrade deps, migrate project files, and verify the app - wrnexus db Migrations: migrate | rollback | status | seed | generate | new - wrnexus authz Authorization: list | generate | init [--dialect=sqlite|postgres|mysql] - wrnexus test [level] [app-dir] [--watch] - Run unit | component | api | browser | visual | accessibility | performance - wrnexus profiles [app-dir] List config profiles (dev/prod/uat/…) and their env files - wrnexus doctor [app-dir] [--fix] Check project health; optionally apply safe repairs - wrnexus compatibility [app-dir] - Inspect or explicitly upgrade behavior defaults - wrnexus contracts [app-dir] - Detect breaking boundary contract changes - wrnexus security [app-dir] - Audit ASVS controls, inspect headers, or run abuse tests - wrnexus api [app-dir] Generate OpenAPI, docs, Postman, examples and SDKs - wrnexus sdk generate [app-dir] - Generate TypeScript, JavaScript, Java, Go, or Python SDK - wrnexus deploy [app-dir] Generate docker | kubernetes | systemd | railway | render | fly - wrnexus mcp [app-dir] Start the WRNexus MCP server over stdio - wrnexus i18n [app-dir] - Extract and audit translation keys - wrnexus report [app-dir] [--file=app/pages/page.wrn] - Create a sanitized reproduction bundle - wrnexus playground [--port=4173] Start the shareable WRN compiler playground - wrnexus config [app-dir] --explain Print the fully resolved profile configuration - wrnexus analyze [app-dir] Inspect dist/build-report.json and performance budgets - wrnexus explain [subject] [app-dir] - Explain compiler and production build decisions - wrnexus explain [app-dir] - Explain route caching or permission enforcement - wrnexus inspect [app-dir] Inspect packages | plugins | routes | assets | runtimes | styles | migrations | bundle - wrnexus inspect component [app-dir] - Inspect a component's typed public contract - wrnexus generate system Scaffold a complete framework-native package - -Profiles: pass --profile= to dev/build/db (or set WRNEXUS_PROFILE) to load -that profile's .env cascade and config overrides. e.g. wrnexus dev --profile=uat - -Workspace environments: configure protocol, rootDomain, port, hostname, runtime -(development|production), hmr, build, migrate, and profile in wrnexus.workspace.ts. -CLI overrides: --port, --host, --build/--no-build, --migrate/--no-migrate, ---profile, and --prepare-only. - -Update options: --dry-run previews changes; --no-verify skips post-update check/build. -``` - -## CLI workflows with expected output - -Commands below are copy-ready. Paths, ports, counts, and timings vary by project; the shown output identifies the success condition to check. - -### Create, check, build, and preview an application - -```bash -bunx @wrnexus/cli@0.8.7 create my-app -cd my-app -bun install -bunx wrnexus typecheck . -bunx wrnexus build . -bunx wrnexus preview . --port=3000 -``` - -Expected output: - -```text -✓ Application types are valid -✓ Runtime: .../dist/reactive.js -✓ Styles: .../dist/styles.css -✓ Server: .../dist/server.js -Run it: bun .../dist/server.js -``` - -### Generate framework files and committed application types - -```bash -bunx wrnexus generate page Dashboard -bunx wrnexus generate component status-card -bunx wrnexus generate api health -bunx wrnexus generate schema account -bunx wrnexus generate routes -bunx wrnexus generate types . -``` - -Expected output includes created source paths followed by: - -```text -✓ Generated app/routes.gen.ts (... routes) -✓ Generated .../app/types/wrnexus.generated.d.ts (... routes, ... components) -``` - -### Run development and production-runtime modes - -```bash -bunx wrnexus dev . --port=3000 -bunx wrnexus dev . --services --services-port=3099 -bunx wrnexus dev . --production-runtime --port=3000 -``` - -Expected output reports the active profile, discovered plugins/routes, generated cache path, and listening URL. Production-runtime mode rebuilds and reloads the exact production artifact. - -### Database lifecycle - -```bash -bunx wrnexus db status -bunx wrnexus db new create_accounts --from-models -bunx wrnexus db migrate -bunx wrnexus db generate -bunx wrnexus db seed -``` - -Expected output identifies the selected profile/dialect, migration state, applied migration names, and generated typed query files. Run `db rollback` only when intentionally reverting the latest migration. - -### Diagnose, inspect, and enforce contracts - -```bash -bunx wrnexus doctor . -bunx wrnexus typecheck . -bunx wrnexus compatibility check . -bunx wrnexus contracts check . -bunx wrnexus security audit . -bunx wrnexus inspect packages . -bunx wrnexus inspect routes . -bunx wrnexus inspect component Navbar . -bunx wrnexus analyze . -``` - -Successful checks exit with status 0. Inspect commands print the resolved package, route, component, asset, runtime, style, migration, or bundle contract without changing the application. - -### Tests, API artifacts, SDKs, and deployment manifests - -```bash -bunx wrnexus test unit . -bunx wrnexus test component . -bunx wrnexus test api . -bunx wrnexus test browser . -bunx wrnexus api generate . -bunx wrnexus api docs . -bunx wrnexus sdk generate typescript . -bunx wrnexus deploy docker . -``` - -Test commands return the underlying suite summary and a nonzero status on failure. API/SDK/deploy commands report each generated artifact; review and commit generated files after validation. - -### Workspaces and environments - -```bash -bunx wrnexus workspace company-platform -cd company-platform -bunx wrnexus workspace add reports --domain=reports.localhost -bunx wrnexus gateway --port=3000 -bunx wrnexus production . --prepare-only -bunx wrnexus staging . -``` - -Expected output lists created apps, domain mappings, selected environment/profile, build and migration decisions, and the gateway address. - -### Internationalization, native targets, MCP, and support bundles - -```bash -bunx wrnexus i18n extract . -bunx wrnexus i18n validate . -bunx wrnexus generate mobile -bunx wrnexus mobile compile -bunx wrnexus native list -bunx wrnexus mcp . -bunx wrnexus report . --file=app/pages/index.wrn -``` - -Expected output identifies extracted/validated translation keys, generated native routes, available capabilities, MCP stdio startup, or the sanitized reproduction archive. MCP uses stdio, so protocol messages—not a web URL—are its normal runtime output. - -### Safe upgrades - -```bash -bunx wrnexus update . --latest --dry-run -bunx wrnexus update . --latest -``` - -The dry run previews dependency and migration changes. A real update prints the source and target versions, backup directory, each migration action, installation result, and verification result. Commit or back up the application before upgrading. - -# Complete CLI command reference - -This section is generated from the installed `@wrnexus/cli@0.8.8` executable. It is the canonical command inventory for this release. - -```text -wrnexus — WrNexus CLI - -Usage: - wrnexus dev [app-dir] [--port=3000] [--host=::] - Start the development server (live reload) - wrnexus dev [app-dir] --services Start local production-service simulators with the app - wrnexus dev [app-dir] --production-runtime - wrnexus dev [app-dir] --services [--services-port=3099] [--services-http] - Rebuild and reload the exact production artifact - wrnexus build [app-dir] Build a production server bundle + assets - wrnexus preview [app-dir] Serve the existing exact production output - wrnexus create Scaffold a new app - wrnexus workspace Scaffold a monorepo (apps/* + shared packages/*) - wrnexus workspace add [--domain=name.localhost] - Add an app to the current workspace - wrnexus gateway [--port=3000] Serve every workspace app behind one port, routed by domain - wrnexus production [workspace-dir] Build, migrate, and serve the complete production workspace - wrnexus [workspace-dir] Run a configured workspace environment (development/staging/custom) - wrnexus generate Scaffold a page | component | api | schema - wrnexus generate routes | docker | mobile - Generate routes or scaffold deployment targets - wrnexus generate types [app-dir] Generate application-wide route/component/key types - wrnexus routes [app-dir] Generate typed named routes - wrnexus typecheck [app-dir] Generate types and check TypeScript plus every .wrn file - wrnexus mobile add Install Capacitor or Expo native packages - wrnexus mobile compile Compile .wrn pages into native Expo routes - wrnexus native list List cross-platform native capabilities - wrnexus native add Install capability packages for the configured mobile mode - wrnexus eject Copy a Wire UI component into app/components - wrnexus update [dir] [--latest] Upgrade deps, migrate project files, and verify the app - wrnexus db Migrations: migrate | rollback | status | seed | generate | new - wrnexus authz Authorization: list | generate | init [--dialect=sqlite|postgres|mysql] - wrnexus test [level] [app-dir] [--watch] - Run unit | component | api | browser | visual | accessibility | performance - wrnexus profiles [app-dir] List config profiles (dev/prod/uat/…) and their env files - wrnexus doctor [app-dir] [--fix] Check project health; optionally apply safe repairs - wrnexus compatibility [app-dir] - Inspect or explicitly upgrade behavior defaults - wrnexus contracts [app-dir] - Detect breaking boundary contract changes - wrnexus security [app-dir] - Audit ASVS controls, inspect headers, or run abuse tests - wrnexus api [app-dir] Generate OpenAPI, docs, Postman, examples and SDKs - wrnexus sdk generate [app-dir] - Generate TypeScript, JavaScript, Java, Go, or Python SDK - wrnexus deploy [app-dir] Generate docker | kubernetes | systemd | railway | render | fly - wrnexus mcp [app-dir] Start the WRNexus MCP server over stdio - wrnexus i18n [app-dir] - Extract and audit translation keys - wrnexus report [app-dir] [--file=app/pages/page.wrn] - Create a sanitized reproduction bundle - wrnexus playground [--port=4173] Start the shareable WRN compiler playground - wrnexus config [app-dir] --explain Print the fully resolved profile configuration - wrnexus analyze [app-dir] Inspect dist/build-report.json and performance budgets - wrnexus explain [subject] [app-dir] - Explain compiler and production build decisions - wrnexus explain [app-dir] - Explain route caching or permission enforcement - wrnexus inspect [app-dir] Inspect packages | plugins | routes | assets | runtimes | styles | migrations | bundle - wrnexus inspect component [app-dir] - Inspect a component's typed public contract - wrnexus generate system Scaffold a complete framework-native package - -Profiles: pass --profile= to dev/build/db (or set WRNEXUS_PROFILE) to load -that profile's .env cascade and config overrides. e.g. wrnexus dev --profile=uat - -Workspace environments: configure protocol, rootDomain, port, hostname, runtime -(development|production), hmr, build, migrate, and profile in wrnexus.workspace.ts. -CLI overrides: --port, --host, --build/--no-build, --migrate/--no-migrate, ---profile, and --prepare-only. - -Update options: --dry-run previews changes; --no-verify skips post-update check/build. -``` - -## CLI workflows with expected output - -Commands below are copy-ready. Paths, ports, counts, and timings vary by project; the shown output identifies the success condition to check. - -### Create, check, build, and preview an application - -```bash -bunx @wrnexus/cli@0.8.8 create my-app -cd my-app -bun install -bunx wrnexus typecheck . -bunx wrnexus build . -bunx wrnexus preview . --port=3000 -``` - -Expected output: - -```text -✓ Application types are valid -✓ Runtime: .../dist/reactive.js -✓ Styles: .../dist/styles.css -✓ Server: .../dist/server.js -Run it: bun .../dist/server.js -``` - -### Generate framework files and committed application types - -```bash -bunx wrnexus generate page Dashboard -bunx wrnexus generate component status-card -bunx wrnexus generate api health -bunx wrnexus generate schema account -bunx wrnexus generate routes -bunx wrnexus generate types . -``` - -Expected output includes created source paths followed by: - -```text -✓ Generated app/routes.gen.ts (... routes) -✓ Generated .../app/types/wrnexus.generated.d.ts (... routes, ... components) -``` - -### Run development and production-runtime modes - -```bash -bunx wrnexus dev . --port=3000 -bunx wrnexus dev . --services --services-port=3099 -bunx wrnexus dev . --production-runtime --port=3000 -``` - -Expected output reports the active profile, discovered plugins/routes, generated cache path, and listening URL. Production-runtime mode rebuilds and reloads the exact production artifact. - -### Database lifecycle - -```bash -bunx wrnexus db status -bunx wrnexus db new create_accounts --from-models -bunx wrnexus db migrate -bunx wrnexus db generate -bunx wrnexus db seed -``` - -Expected output identifies the selected profile/dialect, migration state, applied migration names, and generated typed query files. Run `db rollback` only when intentionally reverting the latest migration. - -### Diagnose, inspect, and enforce contracts - -```bash -bunx wrnexus doctor . -bunx wrnexus typecheck . -bunx wrnexus compatibility check . -bunx wrnexus contracts check . -bunx wrnexus security audit . -bunx wrnexus inspect packages . -bunx wrnexus inspect routes . -bunx wrnexus inspect component Navbar . -bunx wrnexus analyze . -``` - -Successful checks exit with status 0. Inspect commands print the resolved package, route, component, asset, runtime, style, migration, or bundle contract without changing the application. - -### Tests, API artifacts, SDKs, and deployment manifests - -```bash -bunx wrnexus test unit . -bunx wrnexus test component . -bunx wrnexus test api . -bunx wrnexus test browser . -bunx wrnexus api generate . -bunx wrnexus api docs . -bunx wrnexus sdk generate typescript . -bunx wrnexus deploy docker . -``` - -Test commands return the underlying suite summary and a nonzero status on failure. API/SDK/deploy commands report each generated artifact; review and commit generated files after validation. - -### Workspaces and environments - -```bash -bunx wrnexus workspace company-platform -cd company-platform -bunx wrnexus workspace add reports --domain=reports.localhost -bunx wrnexus gateway --port=3000 -bunx wrnexus production . --prepare-only -bunx wrnexus staging . -``` - -Expected output lists created apps, domain mappings, selected environment/profile, build and migration decisions, and the gateway address. - -### Internationalization, native targets, MCP, and support bundles - -```bash -bunx wrnexus i18n extract . -bunx wrnexus i18n validate . -bunx wrnexus generate mobile -bunx wrnexus mobile compile -bunx wrnexus native list -bunx wrnexus mcp . -bunx wrnexus report . --file=app/pages/index.wrn -``` - -Expected output identifies extracted/validated translation keys, generated native routes, available capabilities, MCP stdio startup, or the sanitized reproduction archive. MCP uses stdio, so protocol messages—not a web URL—are its normal runtime output. - -### Safe upgrades - -```bash -bunx wrnexus update . --latest --dry-run -bunx wrnexus update . --latest -``` - -The dry run previews dependency and migration changes. A real update prints the source and target versions, backup directory, each migration action, installation result, and verification result. Commit or back up the application before upgrading. - -Release: WRNexusJS 0.8.8 - -# Complete CLI command reference - -This section is generated from the installed `@wrnexus/cli@0.8.8` executable. It is the canonical command inventory for this release. - -```text -wrnexus — WrNexus CLI - -Usage: - wrnexus dev [app-dir] [--port=3000] [--host=::] - Start the development server (live reload) - wrnexus dev [app-dir] --services Start local production-service simulators with the app - wrnexus dev [app-dir] --production-runtime - wrnexus dev [app-dir] --services [--services-port=3099] [--services-http] - Rebuild and reload the exact production artifact - wrnexus build [app-dir] Build a production server bundle + assets - wrnexus preview [app-dir] Serve the existing exact production output - wrnexus create Scaffold a new app - wrnexus workspace Scaffold a monorepo (apps/* + shared packages/*) - wrnexus workspace add [--domain=name.localhost] - Add an app to the current workspace - wrnexus gateway [--port=3000] Serve every workspace app behind one port, routed by domain - wrnexus production [workspace-dir] Build, migrate, and serve the complete production workspace - wrnexus [workspace-dir] Run a configured workspace environment (development/staging/custom) - wrnexus generate Scaffold a page | component | api | schema - wrnexus generate routes | docker | mobile - Generate routes or scaffold deployment targets - wrnexus generate types [app-dir] Generate application-wide route/component/key types - wrnexus routes [app-dir] Generate typed named routes - wrnexus typecheck [app-dir] Generate types and check TypeScript plus every .wrn file - wrnexus mobile add Install Capacitor or Expo native packages - wrnexus mobile compile Compile .wrn pages into native Expo routes - wrnexus native list List cross-platform native capabilities - wrnexus native add Install capability packages for the configured mobile mode - wrnexus eject Copy a Wire UI component into app/components - wrnexus update [dir] [--latest] Upgrade deps, migrate project files, and verify the app - wrnexus db Migrations: migrate | rollback | status | seed | generate | new - wrnexus authz Authorization: list | generate | init [--dialect=sqlite|postgres|mysql] - wrnexus test [level] [app-dir] [--watch] - Run unit | component | api | browser | visual | accessibility | performance - wrnexus profiles [app-dir] List config profiles (dev/prod/uat/…) and their env files - wrnexus doctor [app-dir] [--fix] Check project health; optionally apply safe repairs - wrnexus compatibility [app-dir] - Inspect or explicitly upgrade behavior defaults - wrnexus contracts [app-dir] - Detect breaking boundary contract changes - wrnexus security [app-dir] - Audit ASVS controls, inspect headers, or run abuse tests - wrnexus api [app-dir] Generate OpenAPI, docs, Postman, examples and SDKs - wrnexus sdk generate [app-dir] - Generate TypeScript, JavaScript, Java, Go, or Python SDK - wrnexus deploy [app-dir] Generate docker | kubernetes | systemd | railway | render | fly - wrnexus mcp [app-dir] Start the WRNexus MCP server over stdio - wrnexus i18n [app-dir] - Extract and audit translation keys - wrnexus report [app-dir] [--file=app/pages/page.wrn] - Create a sanitized reproduction bundle - wrnexus playground [--port=4173] Start the shareable WRN compiler playground - wrnexus config [app-dir] --explain Print the fully resolved profile configuration - wrnexus analyze [app-dir] Inspect dist/build-report.json and performance budgets - wrnexus explain [subject] [app-dir] - Explain compiler and production build decisions - wrnexus explain [app-dir] - Explain route caching or permission enforcement - wrnexus inspect [app-dir] Inspect packages | plugins | routes | assets | runtimes | styles | migrations | bundle - wrnexus inspect component [app-dir] - Inspect a component's typed public contract - wrnexus generate system Scaffold a complete framework-native package - -Profiles: pass --profile= to dev/build/db (or set WRNEXUS_PROFILE) to load -that profile's .env cascade and config overrides. e.g. wrnexus dev --profile=uat - -Workspace environments: configure protocol, rootDomain, port, hostname, runtime -(development|production), hmr, build, migrate, and profile in wrnexus.workspace.ts. -CLI overrides: --port, --host, --build/--no-build, --migrate/--no-migrate, ---profile, and --prepare-only. - -Update options: --dry-run previews changes; --no-verify skips post-update check/build. -``` - -## CLI workflows with expected output - -Commands below are copy-ready. Paths, ports, counts, and timings vary by project; the shown output identifies the success condition to check. - -### Create, check, build, and preview an application - -```bash -bunx @wrnexus/cli@0.8.8 create my-app +bunx @wrnexus/cli@0.8.72 create my-app cd my-app bun install bunx wrnexus typecheck . @@ -1966,7 +488,7 @@ The dry run previews dependency and migration changes. A real update prints the # Installed package documentation -The following README files and declarations come from the installed private 0.8.8 release. +The following README files and declarations come from the installed private 0.8.72 release. ## @wrnexus/ai @@ -2184,6 +706,57 @@ Documentation URL: https://wrnexusjs.dev/packages/auth # @wrnexus/auth +### New-browser verification and device trust + +Enable `requireTrustedDeviceVerification: true` to require a verified email or +SMS challenge before an untrusted browser receives a sign-in session. The HTTP +handlers use a host-only HttpOnly random cookie, ignoring posted fingerprints. +Direct engine callers must supply a trusted server-side browser fingerprint. +`trustSignupDevice: true` grants the registration browser one-time trust after +required account verification, at its first successful sign-in. + +Use `trustedDeviceTtlMs: 30 * 86400_000` for 30-day trust. Ordinary logins do not +renew it. The verification form offers explicit trust consent; expiry/revocation +requires a new email/SMS challenge. Successful login alerts use both verified +contact channels when configured. Delivery still requires an application adapter. + +### Signup business logic and verification-only sessions + +```ts +const auth = createAuthEngine({ + store: () => new SqlAuthStore(getDb()), + secret: process.env.AUTH_SECRET!, + requireVerifiedEmail: true, + onSignUp(ctx, user) { + // Application business logic can run here after successful registration. + return { verificationSession: true, redirectTo: "/verify-email" }; + }, + delivery: { + async send(message) { + // message.channel, template, destination, user, expiresAt + // Verification uses message.token and message.url; OTP flows use message.code. + // Render your branded content here before passing it to your provider. + }, + }, +}); +``` + +`onSuccessfulSignUp` remains supported; configure only one signup hook. Hooks run +from the HTTP registration handler and may return an action or a custom Response. +The request origin (or configured `auth.baseUrl`) supplies signup link URLs; a +client-supplied `baseUrl` is never trusted. Direct `engine.register` callers may +provide a trusted `baseUrl` explicitly. + +The verification cookie is HttpOnly, SameSite=Lax, Secure on HTTPS, and host-only. +Its opaque token is stored hashed in the auth token store, separate from login +sessions; it cannot bypass email verification, MFA, or account policy. Use +`getVerificationUser(ctx, auth)` to guard your verification page and +`clearVerificationSession(ctx, auth)` after verification. Use +`startVerificationSession(ctx, auth, user.id)` only after credential validation +when an unverified user signs in again. SQL-backed sessions survive server reloads; +memory stores remain development/test-only. No email or SMS provider is configured +automatically. + Framework-native authentication, identity, account-security, and session management for WRNexusJS. ## Capabilities @@ -2567,15 +1140,16 @@ Server helpers include `authRoute`, `authSuccess`, `authFailure`, `requireAuthUs ### Exported TypeScript declarations ```ts -import { A as AuthEngine } from './engine-BDu0-aZp.js'; -export { c as createAuthEngine, i as inferIdentityType, n as normalizeEmail, a as normalizeIdentity, b as normalizePhone, d as normalizeUsername, p as publicUser, s as safeAuthReturnTo } from './engine-BDu0-aZp.js'; -import { o as AuthRiskSignals, m as AuthRiskDecision, s as AuthSession, B as AuthUser } from './types-BhwPi3qr.js'; -export { A as AUTH_SECURITY_EVENT_TYPES, a as AuthAccountStatus, b as AuthClock, c as AuthDeliveryMessage, d as AuthDeliveryProvider, e as AuthEngineOptions, f as AuthIdentity, g as AuthIdentityType, h as AuthImpersonationDecision, i as AuthMfaMethod, j as AuthPublicUser, k as AuthRandom, l as AuthResult, n as AuthRiskLevel, p as AuthSecretProtector, q as AuthSecurityEvent, r as AuthSecurityEventType, t as AuthSessionVerificationHandler, u as AuthSignedInHandler, v as AuthSignedOutHandler, U as AuthStore, w as AuthSuccessfulSignUpAction, x as AuthSuccessfulSignUpHandler, y as AuthTokenPurpose, z as AuthTokenUrlInput, C as AuthenticatedContext, K as KnownAuthSecurityEventType, L as LoginAttempt, D as LoginInput, V as MemoryPasskeyChallengeStore, O as OAuthAccount, E as OneTimeToken, F as OtpChallenge, P as PasskeyAuthenticationOptions, W as PasskeyChallengeKind, X as PasskeyChallengeRecord, Y as PasskeyChallengeStore, G as PasskeyCredential, H as PasskeyProvider, I as PasskeyRegistrationOptions, J as PasskeyVerificationResult, M as PasswordBreachProvider, N as PasswordCredential, R as RecoveryCodeRecord, Q as RegisterInput, T as TotpCredential, S as TrustedDevice, Z as assertPasskeyProvider } from './types-BhwPi3qr.js'; +import { A as AuthEngine } from './engine-NjrTiSrg.js'; +export { c as createAuthEngine, i as inferIdentityType, n as normalizeEmail, a as normalizeIdentity, b as normalizePhone, d as normalizeUsername, p as publicUser, s as safeAuthReturnTo } from './engine-NjrTiSrg.js'; +export { VERIFICATION_SESSION_COOKIE, clearVerificationSession, getVerificationUser, startVerificationSession } from './server/index.js'; +import { m as AuthRiskSignals, n as AuthRiskDecision, d as AuthSession, b as AuthUser } from './types-CuQWJQV1.js'; +export { o as AUTH_SECURITY_EVENT_TYPES, p as AuthAccountStatus, q as AuthClock, r as AuthDeliveryMessage, s as AuthDeliveryProvider, t as AuthEngineOptions, c as AuthIdentity, u as AuthIdentityType, v as AuthImpersonationDecision, w as AuthMfaMethod, j as AuthPublicUser, x as AuthRandom, y as AuthResult, z as AuthRiskLevel, l as AuthSecretProtector, i as AuthSecurityEvent, B as AuthSecurityEventType, A as AuthSessionVerificationHandler, C as AuthSignedInHandler, D as AuthSignedOutHandler, a as AuthStore, E as AuthSuccessfulSignUpAction, F as AuthSuccessfulSignUpHandler, G as AuthTokenPurpose, H as AuthTokenUrlInput, k as AuthenticatedContext, K as KnownAuthSecurityEventType, L as LoginAttempt, I as LoginInput, M as MemoryPasskeyChallengeStore, h as OAuthAccount, O as OneTimeToken, e as OtpChallenge, J as PasskeyAuthenticationOptions, N as PasskeyChallengeKind, Q as PasskeyChallengeRecord, S as PasskeyChallengeStore, g as PasskeyCredential, U as PasskeyProvider, V as PasskeyRegistrationOptions, W as PasskeyVerificationResult, X as PasswordBreachProvider, P as PasswordCredential, R as RecoveryCodeRecord, Y as RegisterInput, f as TotpCredential, T as TrustedDevice, Z as assertPasskeyProvider } from './types-CuQWJQV1.js'; export { MemoryAuthStore } from './stores/memory.js'; -export { SqlAuthStore } from './stores/sql.js'; -export { AUTH_SESSION_KEY, authSession, clearAuthSession, establishAuthSession, getAuthSession, getAuthUser, isAuthenticatedContext, requireAuth } from './middleware.js'; -export { A as AuthHttpOptions, a as AuthPasskeyHttpOptions, b as AuthSchemaOverrides, c as AuthSchemaSet, d as authBrowserSchemaDescriptors, e as authBrowserSchemaMap, f as authSchemas, g as authenticatorConfirmSchema, h as authenticatorDisableSchema, i as authenticatorSetupSchema, j as changePasswordSchema, k as createAuthHttpHandlers, l as emptyActionSchema, m as impersonationStartSchema, n as invitationAcceptSchema, o as loginSchema, p as magicLinkConsumeSchema, q as magicLinkRequestSchema, r as mfaOtpRequestSchema, s as mfaSchema, t as otpIssueSchema, u as otpLoginCompleteSchema, v as otpLoginRequestSchema, w as otpSchema, x as passkeyAuthenticationOptionsSchema, y as passkeyAuthenticationVerifySchema, z as passkeyRegistrationOptionsSchema, B as passkeyRegistrationVerifySchema, C as passwordResetRequestSchema, D as passwordResetSchema, E as recoveryCodesSchema, F as registerSchema, G as resolveAuthSchemas, H as sessionRevokeSchema, I as signUpSchema, J as verificationRequestSchema, K as verificationTokenSchema } from './index-B4uaD0Z3.js'; -export { AuthAuditIssue, AuthConfig, AuthPluginOptions, AuthRoutesConfig, authComponentsDir, authPlugin } from './plugin.js'; +export { SqlAuthStore, SqlAuthStoreOptions } from './stores/sql.js'; +export { AUTH_SESSION_KEY, AuthRequiredError, authSession, clearAuthSession, establishAuthSession, getAuthSession, getAuthUser, isAuthenticatedContext, requireAuth, requireAuthUser } from './middleware.js'; +export { d as AuthHttpOptions, a as AuthPasskeyHttpOptions, A as AuthSchemaOverrides, b as AuthSchemaSet, e as authBrowserSchemaDescriptors, f as authBrowserSchemaMap, g as authSchemas, h as authenticatorConfirmSchema, i as authenticatorDisableSchema, j as authenticatorSetupSchema, k as changePasswordSchema, c as createAuthHttpHandlers, l as emptyActionSchema, m as impersonationStartSchema, n as invitationAcceptSchema, o as loginSchema, p as magicLinkConsumeSchema, q as magicLinkRequestSchema, r as mfaOtpRequestSchema, s as mfaSchema, t as otpIssueSchema, u as otpLoginCompleteSchema, v as otpLoginRequestSchema, w as otpSchema, x as passkeyAuthenticationOptionsSchema, y as passkeyAuthenticationVerifySchema, z as passkeyRegistrationOptionsSchema, B as passkeyRegistrationVerifySchema, C as passwordResetRequestSchema, D as passwordResetSchema, E as recoveryCodesSchema, F as registerSchema, G as resolveAuthSchemas, H as sessionRevokeSchema, I as signUpSchema, J as verificationRequestSchema, K as verificationTokenSchema } from './index-DuuY2a1R.js'; +export { AuthAuditIssue, AuthConfig, AuthPluginOptions, AuthRoutesConfig, authComponentsDir, authPlugin, configureAuthRuntime, validateProductionAuthConfig } from './plugin.js'; export { DefaultAuthRouteOptions, clearDefaultAuthEngine, getDefaultAuthEngine, getDefaultAuthRouteOptions, getDefaultAuthSchemas, hasDefaultAuthEngine, setDefaultAuthEngine, setDefaultAuthRouteOptions, setDefaultAuthSchemas, tryGetDefaultAuthEngine } from './runtime.js'; export { createAuthSecretProtector } from './protector.js'; export { decodeBase32, encodeBase32, generateTotp, generateTotpSecret, totpUri, verifyTotp } from './totp/index.js'; @@ -2600,7 +1174,6 @@ declare function authRoute(name: AuthRouteName, options?: { }): string; declare function authSuccess>(data: T, init?: ResponseInit): Response; declare function authFailure(code: string, message: string, status?: number, details?: Record): Response; -declare function requireAuthUser(ctx: Context): AuthUser; declare function optionalAuthUser(ctx: Context): AuthUser | null; declare function currentAuthSession(engine: AuthEngine, sessionId: string | undefined): Promise; declare function authComponentProps(input: Record, defaults?: { @@ -2609,7 +1182,7 @@ declare function authComponentProps(input: Record, defaults?: { class?: string; }): Record; -export { AuthEngine, AuthRiskDecision, AuthRiskSignals, type AuthRouteName, AuthSession, AuthUser, type RiskPolicy, authComponentProps, authFailure, authRoute, authSuccess, currentAuthSession, evaluateAuthRisk, optionalAuthUser, requireAuthUser }; +export { AuthEngine, AuthRiskDecision, AuthRiskSignals, type AuthRouteName, AuthSession, AuthUser, type RiskPolicy, authComponentProps, authFailure, authRoute, authSuccess, currentAuthSession, evaluateAuthRisk, optionalAuthUser }; ``` --- @@ -2932,12 +1505,12 @@ import { Context, Middleware } from '@wrnexus/core'; * Validate and freeze one authorization declaration. Called from * `app/authz/.ts` as the module's default export. */ -declare function defineAuthz(module: AuthzModule): AuthzModule; +declare function defineAuthz(module: AuthzModule): DefinedAuthzModule; interface CatalogSource { /** File or package that declared this module, used in conflict messages. */ source: string; - module: AuthzModule; + module: AuthzModule; } declare function emptyCatalog(): AuthzCatalog; declare function mergeCatalogs(sources: CatalogSource[]): AuthzCatalog; @@ -3061,8 +1634,29 @@ declare function createAuthzResolver(options: AuthzResolverOptions): AuthzResolv * @wrnexus/authz. The per-request resolver lives here instead. */ declare const AUTHZ_LOCALS_KEY = "_authz"; +interface AuthorizationResponses { + forbidden(decision?: AuthorizationDecision, options?: { + exposeReason?: boolean; + }): Response; + notFoundOrForbidden(options?: { + mayDiscover?: boolean; + decision?: AuthorizationDecision; + exposeReason?: boolean; + }): Response; +} +interface RequestAuthorization extends AuthorizationResponses { + can(permission: string, resource?: unknown): Promise; + decide(permission: string, resource?: unknown): Promise; +} +declare module "@wrnexus/core" { + interface Context { + /** Installed by authzMiddleware for handlers that prefer context-local authorization. */ + authz?: RequestAuthorization; + } +} /** 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 @@ -3095,6 +1689,47 @@ declare function guardPermission(permission: string, options?: GuardOptions): Mi /** Keep only the items the current subject may act on. */ declare function filterCan(ctx: Context, permission: string, items: readonly T[]): Promise; +interface AuthorizedHandlerOptions { + permission: string; + resource?: (ctx: Context) => Resource | null | undefined | Promise; + exposeReason?: boolean; + mayDiscover?: (ctx: Context) => boolean | Promise; + handle(ctx: Context & { + resource: Resource; + }): Result | Promise; +} +/** Define an API handler whose resource loading and permission check cannot be skipped. */ +declare function defineAuthorizedHandler(options: AuthorizedHandlerOptions): (ctx: Context) => Promise; +interface OwnedResourceDefinition { + name: string; + owner(resource: Resource): string | null | undefined; + permissions: { + read?: string; + create?: string; + update?: string; + delete?: string; + readAny?: string; + writeAny?: string; + }; +} +/** Shared ownership and override vocabulary for application resource modules. */ +declare function defineOwnedResource(definition: OwnedResourceDefinition): Readonly<{ + attributes(resource: Resource): { + ownerId: string | null | undefined; + }; + isOwner(subjectId: string, resource: Resource): boolean; + name: string; + owner(resource: Resource): string | null | undefined; + permissions: { + read?: string; + create?: string; + update?: string; + delete?: string; + readAny?: string; + writeAny?: string; + }; +}>; + /** * Emit `Permission`/`Role` string-literal unions from the registered catalog. * @@ -3188,14 +1823,22 @@ interface AttributeMeta { description?: string; } /** One `app/authz/.ts` declaration. */ -interface AuthzModule { +interface AuthzModule { permissions?: Record; roles?: Record; - policies?: Record>; + policies?: Record>; attributes?: Record; /** permission id -> policy names that must pass for it. */ bindings?: Record; } +/** A declaration after defineAuthz() has supplied all optional collections. */ +type DefinedAuthzModule = { + permissions: Record; + roles: Record; + policies: Record>; + attributes: Record; + bindings: Record; +}; /** The merged, frozen view of every declaration in the app. */ interface AuthzCatalog { permissions: ReadonlyMap; @@ -3250,7 +1893,7 @@ interface CacheOptions { */ declare function cachedPermissionStore(inner: PermissionStore, options?: CacheOptions): CachedPermissionStore; -export { 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 }; +export { 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 }; ``` --- @@ -3634,7 +2277,7 @@ export const HEAD = POST; /> ``` -The component uses Tailwind utilities and `--wire-*` theme variables. It has no companion component CSS file. +The component uses Tailwind utilities and `--wrn-*` theme variables. It has no companion component CSS file. ### Main props @@ -4051,21 +2694,14 @@ Every command accepts an optional `[app-dir]` (defaults to `.`). Commands that r | `wrnexus generate docker` | Scaffold `Dockerfile`, `.dockerignore`, and `docker-compose.yml`. | | `wrnexus generate mobile` | Scaffold a Capacitor shell for iOS and Android. | | `wrnexus mobile add ` | Install Capacitor plugins and sync native projects. | -| `wrnexus eject ` | Copy Wire UI component `.wrn` sources into `app/components/`. | +| `wrnexus eject ` | Copy WrNexus UI component `.wrn` sources into `app/components/`. | | `wrnexus db ` | Database migrations and tooling (see [db](#wrnexus-db)). | | `wrnexus test [app-dir] [--watch]` | Run the app's tests via `bun test` (defaults to the `test` profile). | | `wrnexus profiles [app-dir]` | List config profiles and their `.env` files, marking the active one. | -| `wrnexus compatibility check` | Check whether behavior defaults are explicitly pinned and current. | -| `wrnexus compatibility explain` | Explain configured, effective, and current compatibility behavior. | -| `wrnexus compatibility upgrade` | Back up config and explicitly opt into reviewed current behavior. | | `wrnexus help` | Print usage. | `wrnexus g` is an alias for `wrnexus generate`. -Compatibility upgrades never happen implicitly. New applications pin -`compatibilityDate` and `frameworkBehaviour`; existing applications use -`wrnexus compatibility explain` before the backed-up, idempotent upgrade command. - ### `wrnexus dev` Supervises a child dev-server process (from `@wrnexus/dev-server`). The child owns file watching and HMR: CSS and client-island edits update the live page over a WebSocket with no restart; when a server module changes, the child exits with a restart code and the supervisor respawns it (the browser reconnects and morphs in the new HTML). On startup it regenerates typed DB queries and typed routes (best effort). Use `--port=` to change the port (default `3000`). @@ -4151,7 +2787,7 @@ WrNexus response pages. ### `wrnexus eject` -Copies a Wire UI component's `.wrn` source out of `@wrnexus/ui` into `app/components/`, so the app owns and can edit it (the app copy shadows the library one by name). Run with no names to list available components. It skips components that already exist in the app. +Copies a WrNexus UI component's `.wrn` source out of `@wrnexus/ui` into `app/components/`, so the app owns and can edit it (the app copy shadows the library one by name). Run with no names to list available components. It skips components that already exist in the app. ```bash wrnexus eject button card modal @@ -4294,7 +2930,7 @@ export default config; ## Requirements / Notes - **Bun-only.** The CLI runs on Bun, spawns the Bun binary for the dev child and `bun test`, and the production build uses `Bun.build`. Node is not supported. -- Orchestrates the rest of the framework: `@wrnexus/dev-server` (dev/prod server + gateway), `@wrnexus/router` (route + typed-routes codegen), `@wrnexus/compiler` (`.wrn` → `.ts`), `@wrnexus/db` (migrations, typed queries), `@wrnexus/styles` (config, profiles, `.env`, themes, styles), `@wrnexus/ui` (ejectable Wire UI components), `@wrnexus/validation`, `@wrnexus/csr`, and `@wrnexus/i18n`. +- Orchestrates the rest of the framework: `@wrnexus/dev-server` (dev/prod server + gateway), `@wrnexus/router` (route + typed-routes codegen), `@wrnexus/compiler` (`.wrn` → `.ts`), `@wrnexus/db` (migrations, typed queries), `@wrnexus/styles` (config, profiles, `.env`, themes, styles), `@wrnexus/ui` (ejectable WrNexus UI components), `@wrnexus/validation`, `@wrnexus/csr`, and `@wrnexus/i18n`. - Reads `wrnexus.config.ts` for `db` / `databases`, `theme`, `styles`, `seo`, `security`, `i18n`, and `profiles`, and `wrnexus.workspace.ts` for the gateway. ### Exported TypeScript declarations @@ -4380,7 +3016,7 @@ bun add @wrnexus/compiler All exports come from the package root (`@wrnexus/compiler`). -### `compileWireFile(source: string): string` +### `compileWrnFile(source: string): string` Compile `.wrn` source to a TypeScript module string. Throws `ParseError` on invalid input. The output is prefixed with a `// compiled from .wrn` comment. @@ -4426,10 +3062,10 @@ class Lexer { ### Errors -| Class | Thrown by | Meaning | -| ------------ | ------------------------------------------------- | --------------------------------------------------------------- | -| `ParseError` | `parse`, `compile`, `compileWireFile`, `generate` | Invalid `.wrn` grammar or (rewrapped) lex failure. | -| `LexError` | `Lexer` | Unexpected character / unterminated string / unbalanced braces. | +| Class | Thrown by | Meaning | +| ------------ | ------------------------------------------------ | --------------------------------------------------------------- | +| `ParseError` | `parse`, `compile`, `compileWrnFile`, `generate` | Invalid `.wrn` grammar or (rewrapped) lex failure. | +| `LexError` | `Lexer` | Unexpected character / unterminated string / unbalanced braces. | ### AST types @@ -4454,9 +3090,9 @@ Exported type-only symbols describing the parsed tree: Compile a page: ```ts -import { compileWireFile } from "@wrnexus/compiler"; +import { compileWrnFile } from "@wrnexus/compiler"; -const ts = compileWireFile(` +const ts = compileWrnFile(` page Home { state count = 0 seo { title = "Home" description = "Welcome" } @@ -4525,14 +3161,13 @@ A file opens with `page ` or `component ` followed by a `{ ... }` bo ## Requirements / Notes - Pure TypeScript with no runtime dependencies; runs under **Bun** as part of the WrNexus toolchain (Node is not supported). -- Generated modules target WrNexus runtime primitives (`data-scope`, `data-text`, `data-on-*`, `data-for`, `data-component`, `__wrnexus*`/`__wire*` helpers) — consume the output within a WrNexus app, e.g. via `@wrnexus/core`'s dev loader. +- Generated modules target WrNexus runtime primitives (`data-scope`, `data-text`, `data-on-*`, `data-for`, `data-component`, `__wrnexus*`/`__wrn*` helpers) — consume the output within a WrNexus app, e.g. via `@wrnexus/core`'s dev loader. ### Exported TypeScript declarations ```ts -import { PageAst as PageAst$1, StructuredImportDecl, WrnDiagnostic } from '@wrnexus/syntax'; +import { PageAst, StructuredImportDecl, WrnDiagnostic } from '@wrnexus/syntax'; export { ActionBlock, ApiBlock, Attr, ComputedDecl, DataApiBlock, DataMode, EffectBlock, EventDecl, FormatWrnOptions, LexError, Lexer, LoadBlock, ModeFunctionsBlock, OutputDecl, PageAst, ParseError, PropDecl, RealtimeBlock, RuntimeFunctionDecl, SeoBlock, StateDecl, StateRuntime, StoreKind, StructuredImportDecl, ViewNode, WrnDiagnostic, assertValidAst, diagnose, diagnosticFromError, eraseFunctionTypes, formatDiagnostic, formatWrn, inferredRuntimeType, parse, runtimeTypeOf } from '@wrnexus/syntax'; -import { PageAst } from '@wrnexus/syntax/parser'; /** * Code generation: lower a `.wrn` AST to TypeScript that targets the framework's @@ -4551,11 +3186,15 @@ import { PageAst } from '@wrnexus/syntax/parser'; * realtime {..} -> export const websocket = { evt(ws, ...args) { b } } */ -declare function generate(ast: PageAst): string; +interface GenerateOptions { + /** Local names bound to .tsx island imports in this file. */ + islands?: ReadonlySet; +} +declare function generate(ast: PageAst, options?: GenerateOptions): string; interface ComponentContractMetadata { name: string; - kind: PageAst$1["kind"]; + kind: PageAst["kind"]; props: Array<{ name: string; type: string; @@ -4597,7 +3236,7 @@ interface ComponentContractMetadata { namedImports: string[]; }>; } -declare function createComponentContract(ast: PageAst$1): ComponentContractMetadata; +declare function createComponentContract(ast: PageAst): ComponentContractMetadata; interface RpcManifestEntry { id: string; @@ -4610,8 +3249,8 @@ interface RpcManifestEntry { }>; returnType: string; } -declare function rpcManifest(ast: PageAst$1): RpcManifestEntry[]; -declare function generateServerFunctionsModule(ast: PageAst$1): string; +declare function rpcManifest(ast: PageAst): RpcManifestEntry[]; +declare function generateServerFunctionsModule(ast: PageAst): string; interface CompileTargets { server: string; @@ -4620,15 +3259,30 @@ interface CompileTargets { contract: ReturnType; rpc: ReturnType; } -declare function generateTargets(ast: PageAst$1): CompileTargets; +declare function generateTargets(ast: PageAst): CompileTargets; -declare function generateBrowserModule(ast: PageAst$1): string; +declare function generateBrowserModule(ast: PageAst): string; -declare function generateDeclarations(ast: PageAst$1): string; +/** + * Strip TypeScript from a generated browser module. + * + * A client function's body is emitted verbatim, so anything TypeScript-only + * inside one -- an annotated local, an `as` cast, a local interface -- reaches + * the browser module as TypeScript source. Codegen removes the types from the + * function's *signature*, which is what made this easy to miss: the emitted + * module looked transpiled, and only bodies carried types through. + * + * The artifact is written as `.mjs` and read back as plain JavaScript, so the + * failure surfaced as a syntax error pointing at generated code rather than at + * the `.wrn` line responsible. + */ +declare function stripBrowserTypes(code: string): string; -declare function generateStoreModule(ast: PageAst$1): string; +declare function generateDeclarations(ast: PageAst): string; + +declare function generateStoreModule(ast: PageAst): string; /** Standalone browser artifact for an imported `.wrn` store. */ -declare function generateStoreBrowserModule(ast: PageAst$1): string; +declare function generateStoreBrowserModule(ast: PageAst): string; type ImportMode = "legacy" | "compatible" | "explicit"; interface ImportResolverOptions { @@ -4639,6 +3293,8 @@ interface ImportResolverOptions { interface ResolvedImport { declaration: StructuredImportDecl; resolved?: string; + /** `.tsx` imports are React islands, not `.wrn` components. */ + kind?: "island"; diagnostic?: { code: string; message: string; @@ -4667,6 +3323,8 @@ interface RuntimeRequirements { kind: RouteExecutionKind; canPrerender: boolean; needsClientRuntime: boolean; + /** True when the route mounts a React island and must ship the island runtime. */ + needsIslandRuntime: boolean; needsServerRuntime: boolean; hydrationStrategy: string | null; reasons: string[]; @@ -4688,12 +3346,19 @@ interface OptimizationReport { serverOnlyModules: string[]; } /** Safe compile-time folding for literal conditional branches. */ -declare function optimizeAst(ast: PageAst$1): { - ast: PageAst$1; +declare function optimizeAst(ast: PageAst): { + ast: PageAst; eliminatedBranches: number; }; -declare function analyzeOptimizations(ast: PageAst$1): OptimizationReport; -declare function analyzeRuntimeRequirements(ast: PageAst$1): RuntimeRequirements; +declare function analyzeOptimizations(ast: PageAst): OptimizationReport; +/** + * A route containing a React island ships JavaScript and can no longer be + * classified as zero-JS static, so island presence must reach the classifier. + */ +declare function routeNeedsIslands(imports: ResolvedImport[]): boolean; +declare function analyzeRuntimeRequirements(ast: PageAst, options?: { + hasIslands?: boolean; +}): RuntimeRequirements; type DeploymentRuntime = "bun" | "node" | "edge" | "worker" | "service-worker" | "browser"; type RuntimeCapability = "filesystem" | "tcp" | "process" | "websocket" | "crypto" | "streams" | "background-tasks"; @@ -4746,6 +3411,93 @@ declare class DependencyGraph { affected(file: string): string[]; } +type IslandStrategy = "only" | "load" | "visible" | "idle"; +interface IslandDiagnostic { + code: "WRN-ISLAND-PROPS"; + message: string; + severity: "error"; +} +declare function parseIslandStrategy(directives: string[]): IslandStrategy; +/** + * Interprets an island attribute value with JSX semantics. + * + * `title="Revenue"` is a string, `start={3}` is a number, `flag` alone is + * `true`. Without this every prop arrives as a string, so `start={3}` would be + * `"3"` and arithmetic in the island silently concatenates. + * + * Returns `dynamic` for a `{…}` value that is not JSON: such expressions are + * evaluated at runtime and cannot cross the serialization boundary. + */ +declare function islandPropValue(raw: string | undefined): { + value: unknown; +} | { + dynamic: string; +}; +declare function serializeIslandProps(componentName: string, props: Record): { + json: string; +} | { + diagnostic: IslandDiagnostic; +}; +declare function renderIslandMarker(input: { + name: string; + strategy: IslandStrategy; + propsJson: string; +}): string; +/** + * Local binding names introduced by island imports. + * + * Codegen sees only component tag names, so it needs the set of names that came + * from `.tsx` imports to tell an island apart from a `.wrn` component. + */ +declare function islandNamesFrom(imports: Array<{ + kind?: "island"; + declaration: { + defaultImport?: string; + }; +}>): Set; + +interface IslandInput { + name: string; + sourcePath: string; +} +interface IslandBuildResult { + assets: Array<{ + name: string; + hash: string; + path: string; + }>; + sharedChunks: string[]; +} +/** + * Generates the per-island browser entry. + * + * Never imports react-dom/server — islands are client-only. + */ +declare function generateIslandEntry(input: IslandInput): string; +declare function assertReactAvailable(appRoot: string): { + code: "WRN-ISLAND-REACT-MISSING"; + message: string; + severity: "error"; +} | null; +/** + * Bundles island entries. `splitting: true` is required so React is emitted + * once as a shared chunk rather than duplicated into every island. + */ +declare function buildIslands(input: { + islands: IslandInput[]; + outDir: string; + /** + * App root used to resolve the island mount runtime. When given, the runtime + * is emitted as `runtime.js` in the SAME build as the islands. + * + * This is not a convenience: building the runtime separately gives it its own + * copy of React, and a component rendered by one copy while importing hooks + * from another fails with "Cannot read properties of null (reading + * 'useState')". One build with splitting keeps React in a single shared chunk. + */ + appRoot?: string; +}): Promise; + /** * @wrnexus/compiler — the `.wrn` language compiler. * @@ -4755,23 +3507,23 @@ declare class DependencyGraph { interface CompileResult { code: string; - ast: PageAst$1; + ast: PageAst; /** Backward-compatible plain diagnostic messages. */ diagnostics: string[]; /** Structured diagnostics for editors, CI, and the DevToolbar. */ richDiagnostics: WrnDiagnostic[]; } /** Compile `.wrn` source into an Expo Router React Native screen. */ -declare function compileNativeWireFile(source: string): string; +declare function compileNativeWrnFile(source: string): string; /** * Compile `.wrn` source into TypeScript source. Errors include a stable code, * source location, code frame, and actionable hint whenever available. */ -declare function compileWireFile(source: string, filePath?: string): string; +declare function compileWrnFile(source: string, filePath?: string): string; /** Richer entry point returning the AST and structured diagnostics. */ declare function compile(source: string, filePath?: string): CompileResult; -export { type CompilationCache, type CompilationCacheEntry, type CompilationCacheOptions, type CompileResult, DependencyGraph, type DeploymentRuntime, NativeCompileError, type OptimizationReport, type RouteExecutionKind, type RuntimeCapability, type RuntimeCapabilityDiagnostic, type RuntimeRequirements, analyzeOptimizations, analyzeRuntimeImports, analyzeRuntimeRequirements, compilationKey, compile, compileNativeWireFile, compileWireFile, createCompilationCache, createComponentContract, createWrnSourceMap, generate, generateBrowserModule, generateDeclarations, generateNative, generateServerFunctionsModule, generateStoreBrowserModule, generateStoreModule, generateTargets, optimizeAst, resolveWrnImport, resolveWrnImports, rpcManifest, runtimeCapabilities }; +export { type CompilationCache, type CompilationCacheEntry, type CompilationCacheOptions, type CompileResult, DependencyGraph, type DeploymentRuntime, type IslandBuildResult, type IslandDiagnostic, type IslandInput, type IslandStrategy, NativeCompileError, type OptimizationReport, type RouteExecutionKind, type RuntimeCapability, type RuntimeCapabilityDiagnostic, type RuntimeRequirements, analyzeOptimizations, analyzeRuntimeImports, analyzeRuntimeRequirements, assertReactAvailable, buildIslands, compilationKey, compile, compileNativeWrnFile, compileWrnFile, createCompilationCache, createComponentContract, createWrnSourceMap, generate, generateBrowserModule, generateDeclarations, generateIslandEntry, generateNative, generateServerFunctionsModule, generateStoreBrowserModule, generateStoreModule, generateTargets, islandNamesFrom, islandPropValue, optimizeAst, parseIslandStrategy, renderIslandMarker, resolveWrnImport, resolveWrnImports, routeNeedsIslands, rpcManifest, runtimeCapabilities, serializeIslandProps, stripBrowserTypes }; ``` --- @@ -4986,7 +3738,7 @@ The `Context` (`ctx`) is the single value passed to middleware and handlers. | `Context` | type | Per-request object: `req`, `url`, `lang`, `t`, `params`, `locals`, `user?`, `ip?`, `cookies`, `session`, `localStorage`. | | `Next` | type | `() => Promise \| Response` — invokes the next middleware/handler. | | `Middleware` | type | `(ctx, next) => Promise \| Response`. Return `next()` to continue, or a `Response` to short-circuit. | -| `createContext(req, url)` | fn | Build a fresh `Context` for an incoming request (wires up cookies, session, localStorage snapshot). | +| `createContext(req, url)` | fn | Build a fresh `Context` for an incoming request (connects up cookies, session, localStorage snapshot). | | `withContextHeaders(ctx, res)` | fn | Apply accumulated headers (e.g. `Set-Cookie`) from the context onto a response. | | `PageComponent` | type | `(ctx) => string \| Promise` — a page module's default export. | | `PageMeta` / `SeoConfig` | type | `` metadata: `title`, `description`, `canonical`, `robots`, `image`, `twitterCard`, `themeColor`, … | @@ -5019,15 +3771,15 @@ cookie-backed `SessionStore`. ### CSRF — `@wrnexus/core` -Double-submit cookie pattern: a readable `wire-csrf` cookie is echoed in an +Double-submit cookie pattern: a readable `wrn-csrf` cookie is echoed in an `x-csrf-token` header on unsafe requests. -| Export | Signature | Notes | -| ----------------------------- | -------------------------------- | ---------------------------------------------------------------------------------------------------------------- | -| `csrfToken(ctx)` | `(Context) => string` | Ensures the CSRF cookie exists and returns its token. | -| `verifyCsrf(ctx)` | `(Context) => boolean` | Safe methods (GET/HEAD/OPTIONS) pass; otherwise header/`ctx.locals._csrf` must match the cookie (constant-time). | -| `csrfProtection()` | `() => Middleware` | 403s unsafe requests with a missing/mismatched token. | -| `CSRF_COOKIE` / `CSRF_HEADER` | `"wire-csrf"` / `"x-csrf-token"` | Cookie & header names. | +| Export | Signature | Notes | +| ----------------------------- | ------------------------------- | ---------------------------------------------------------------------------------------------------------------- | +| `csrfToken(ctx)` | `(Context) => string` | Ensures the CSRF cookie exists and returns its token. | +| `verifyCsrf(ctx)` | `(Context) => boolean` | Safe methods (GET/HEAD/OPTIONS) pass; otherwise header/`ctx.locals._csrf` must match the cookie (constant-time). | +| `csrfProtection()` | `() => Middleware` | 403s unsafe requests with a missing/mismatched token. | +| `CSRF_COOKIE` / `CSRF_HEADER` | `"wrn-csrf"` / `"x-csrf-token"` | Cookie & header names. | ### Rate limiting — `@wrnexus/core` @@ -5173,7 +3925,7 @@ broadcasts and `toUser` cross the bridge. Config types: `SecurityConfig` (top-level), `CorsConfig`/`CorsOrigin`, `ContentSecurityPolicyConfig`/`CspDirectiveValue`, `HstsConfig`, `TrustedTypesConfig`, `PermissionsPolicyConfig`. WrNexus applies sensible -defaults (self-only CSP, `frame-ancestors 'none'`, restrictive Permissions-Policy, +defaults (self-only CSP, `frame-ancestors 'self'`, restrictive Permissions-Policy, HSTS in production, Trusted Types in production); each is individually overridable or disable-able via `false`. @@ -5516,6 +4268,12 @@ interface CookieStore { set(name: string, value: string, options?: CookieOptions): void; delete(name: string, options?: CookieOptions): void; headers(): string[]; + transaction = Record>(name: string, options?: CookieOptions): TransactionCookie; +} +interface TransactionCookie> { + set(value: T): void; + consume(): T | undefined; + clear(): void; } interface SessionStore { id(): string; @@ -5598,7 +4356,15 @@ declare function loadSession(backend: AsyncSessionBackend, options?: { /** Translate a key for the active language, interpolating `{param}` placeholders. */ type TFunction = (key: string, params?: Record) => string; -type Context = { +interface PaginationOptions { + defaultLimit?: number; + maxLimit?: number; +} +interface PaginationInput { + limit: number; + cursor?: string; +} +interface Context = Record, User = unknown> { /** The raw incoming web-standard Request. */ req: Request; /** Parsed URL of the request (pathname, query, etc.). */ @@ -5608,17 +4374,19 @@ type Context = { /** Translate a key for the active language (identity until the runtime sets it). */ t: TFunction; /** Dynamic route params, e.g. `/users/[id]` -> `{ id: "42" }`. */ - params: Record; + params: Params; /** * Per-request scratch space. Middleware can attach values here * (e.g. the authenticated user) and downstream handlers can read them. */ locals: Record; + /** Resource resolved by a declarative route guard, when present. */ + resource?: unknown; /** * The authenticated user for this request, or null when anonymous. Populated * by the `sessionAuth` middleware (or `logIn`); read via `getUser(ctx)`. */ - user?: unknown; + user?: User | null; /** Active tenant/workspace resolved by tenant middleware. */ tenant?: Tenant; /** Request tracer installed by observability middleware. */ @@ -5635,7 +4403,9 @@ type Context = { session: SessionStore; /** Read-only localStorage snapshot sent by the browser for CSR data bindings. */ localStorage: LocalStorageSnapshot; -}; + /** Parse and bound the standard `limit` and `cursor` query parameters. */ + pagination(options?: PaginationOptions): PaginationInput; +} /** Calls the next middleware in the chain (or the final route handler). */ type Next = () => Promise | Response; /** @@ -5669,10 +4439,14 @@ type PageMeta = SeoConfig; /** A page module's default export. Returns an HTML string for the body. */ type PageComponent = (ctx: Context) => string | Promise; /** Create a fresh context for an incoming request. */ -declare function createContext(req: Request, url: URL): Context; +declare function createContext = Record>(req: Request, url: URL): Context; /** Apply headers accumulated on the context, such as Set-Cookie. */ declare function withContextHeaders(ctx: Context, res: Response): Response; +declare function runWithRequestContext(ctx: Context, fn: () => T): T; +declare function getRequestContext(): Context | undefined; +declare function requireRequestContext(what: string): Context; + type ExecutionKind = "http" | "api" | "action" | "loader" | "middleware" | "realtime" | "queue" | "cron" | "webhook"; interface ResponseContext { status: number; @@ -5714,6 +4488,21 @@ interface ExecutionContextInput extends Partial, input?: Omit): ExecutionContext; +/** + * Assemble an API request from a block's declared input. + * + * Shared by both transports on purpose. The browser and the in-process server + * caller must send the same thing for the same call; two copies of these rules + * would drift, and the drift would be invisible because each side is tested + * separately. + */ +interface BuiltApiRequest { + url: string; + body?: string; + contentType?: string; +} +declare function buildApiRequest(path: string, method: string, input: Record | undefined): BuiltApiRequest; + /** * Small, dependency-free security helpers shared across packages. */ @@ -5737,7 +4526,7 @@ declare function isSafeRequestPath(pathname: string): boolean; * metadata validation for unsafe requests. */ -declare const CSRF_COOKIE = "wire-csrf"; +declare const CSRF_COOKIE = "wrn-csrf"; declare const CSRF_HEADER = "x-csrf-token"; interface CsrfProtectionOptions { /** Validate Origin when present. Defaults to true. */ @@ -6179,7 +4968,7 @@ interface RealtimeEnvelope { message: unknown; } /** - * A pub/sub bridge for horizontal scaling. Wire the registry to a shared bus + * A pub/sub bridge for horizontal scaling. WrNexus the registry to a shared bus * (Redis pub/sub, NATS, …): local broadcasts/`toUser` sends are published to * peers, and messages received from peers are delivered via `registry.deliver`. * Connection-targeted sends (`send`, `to(id)`) stay local (ids are per-process). @@ -6329,7 +5118,7 @@ interface SecurityConfig { trustedTypes?: false | TrustedTypesConfig; /** Defaults to "same-origin". */ crossOriginOpenerPolicy?: false | "same-origin" | "same-origin-allow-popups" | "unsafe-none"; - /** Defaults to "DENY". */ + /** Defaults to "SAMEORIGIN". */ frameOptions?: false | "DENY" | "SAMEORIGIN"; /** Defaults to "strict-origin-when-cross-origin". */ referrerPolicy?: false | string; @@ -6387,6 +5176,10 @@ interface EndpointDefinition { input?: SchemaLike | OutputSchemaLike; output?: SchemaLike | OutputSchemaLike; auth?: "optional" | "required"; + /** Permission checked through an installed @wrnexus/authz middleware. */ + permission?: string; + /** Resource supplied to bound authorization policies. */ + resource?: (ctx: Context, input: I) => unknown | Promise; description?: string; tags?: string[]; handler(input: I, ctx: Context): O | Promise; @@ -6623,7 +5416,11 @@ declare function withIdempotency(store: IdempotencyStore, key: string, exe replayed: boolean; }>; -export { type ActionDefinition, ApplicationLifecycle, type AsyncSessionBackend, type BackoffStrategy, type Bucket, type BudgetViolation, Bulkhead, type BulkheadOptions, CSRF_COOKIE, CSRF_HEADER, type CacheControlOptions, type CachePolicy, CircuitBreaker, type CircuitBreakerOptions, type CircuitBreakerSnapshot, type ContentSecurityPolicyConfig, type Context, type CookieOptions, type CookieStore, type CorsConfig, type CorsOrigin, type CspDirectiveValue, type CsrfProtectionOptions, type DefinedAction, type DefinedEndpoint, type DefinedLoader, type Duration, type EndpointDefinition, EndpointError, type EndpointErrorBody, type ExecutionContext, type ExecutionContextInput, type ExecutionKind, type FeatureFlags, type FeatureRule, type FeatureValue, type HealthCheck, type HealthCheckResult, HealthRegistry, type HstsConfig, type IdempotencyRecord, type IdempotencyStore, type InferEndpointSchema, type LifecycleHandler, type LifecyclePhase, type LoaderDefinition, type LocalStorageSnapshot, type Middleware, type Mode, type Next, type OutputSchemaLike, POSTGRES_TENANT_DIRECTORY_SCHEMA, type PageComponent, type PageMeta, type PerformanceBudgets, type PerformanceMeasurement, type PermissionsPolicyConfig, type ProblemDetails, type ProblemDetailsInput, type RateLimitOptions, type RateLimitStore, type RawSocket, type RealtimeBridge, type RealtimeBus, type RealtimeConnectMeta, type RealtimeEnvelope, type RealtimeHandler, type RealtimeRegistry, type RealtimeRegistryOptions, type RealtimeSecurityOptions, type RealtimeSocket, type RequestLimitsConfig, type RequestLoggerOptions, type RequestRecord, type RequireAuthOptions, ResilienceError, type ResilientCallOptions, type ResponseContext, type Room, type RoomAuthInfo, type RoomClient, type RoomDefinition, type RoomHandlers, type RpcClientOptions, SESSION_USER_KEY, type SaveUploadOptions, type SavedUpload, type SchemaLike, type SecureUploadOptions, type SecurityConfig, type SeoConfig, type ServerSentEvent, ServiceContainer, type ServiceToken, type SessionBackend, type SessionEntry, type SessionPolicy, type SessionStore, type Span, type SpanRecord, type StreamResponseInit, type TFunction, TTLCache, type Target, type Tenant, type TenantAuditEvent, type TenantDirectoryStore, type TenantMembership, type TenantMiddlewareOptions, type TenantQuota, type TenantResolver, type TenantResource, type TenantSqlClient, type Tracer, type TrustedTypesConfig, UploadError, type UploadInspectionResult, type UploadInspector, type UploadScanner, assertTenantAccess, bridgeRealtime, cacheControl, checkPerformanceBudgets, collectUploads, composeTenantResolvers, createContext, createCorsPreflightResponse, createExecutionContext, createPersistentTenantDirectory, createRealtimeRegistry, createRpcClient, createTenantDirectory, createTracer, csrfProtection, csrfToken, dedupe, defaultKey, defineAction, defineEndpoint, defineFeatureFlags, defineLoader, defineRoom, durationMs, escapeHtml, etag, executionContextFromHttp, getUser, hashPassword, isRoomDefinition, isSafeIslandName, isSafeRequestPath, isWebSocketOriginAllowed, loadSession, logIn, logOut, memoryIdempotencyStore, memoryTenantDirectoryStore, migrateTenants, notModified, peerKey, postgresTenantDirectoryStore, problem, proxyKey, randomUploadFilename, rateLimit, recommendedWebBudgets, renderDevError, renderError, renderNotFound, renderProdError, renderStatusPage, requestId, requestLogger, requireAuth, requireTenant, resilientCall, resolveRequestUrl, sanitizeFilename, saveUpload, saveUploadSecure, secureDownloadHeaders, serviceToken, sessionAuth, setSessionBackend, setSessionPolicy, sse, streamResponse, tenantFromDomain, tenantFromHeader, tenantFromPath, tenantFromSession, tenantFromSubdomain, tenantKey, tenantMiddleware, tenantScope, tracingMiddleware, verifyCsrf, verifyPassword, withCacheControl, withContextHeaders, withIdempotency, withSecurityHeaders, withSpan }; +/** Hoist nested templates out of each other for linear-size hydration data. */ +declare function encodeControlTemplate(value: unknown): string; +declare function renderControlTemplates(): string; + +export { type ActionDefinition, ApplicationLifecycle, type AsyncSessionBackend, type BackoffStrategy, type Bucket, type BudgetViolation, type BuiltApiRequest, Bulkhead, type BulkheadOptions, CSRF_COOKIE, CSRF_HEADER, type CacheControlOptions, type CachePolicy, CircuitBreaker, type CircuitBreakerOptions, type CircuitBreakerSnapshot, type ContentSecurityPolicyConfig, type Context, type CookieOptions, type CookieStore, type CorsConfig, type CorsOrigin, type CspDirectiveValue, type CsrfProtectionOptions, type DefinedAction, type DefinedEndpoint, type DefinedLoader, type Duration, type EndpointDefinition, EndpointError, type EndpointErrorBody, type ExecutionContext, type ExecutionContextInput, type ExecutionKind, type FeatureFlags, type FeatureRule, type FeatureValue, type HealthCheck, type HealthCheckResult, HealthRegistry, type HstsConfig, type IdempotencyRecord, type IdempotencyStore, type InferEndpointSchema, type LifecycleHandler, type LifecyclePhase, type LoaderDefinition, type LocalStorageSnapshot, type Middleware, type Mode, type Next, type OutputSchemaLike, POSTGRES_TENANT_DIRECTORY_SCHEMA, type PageComponent, type PageMeta, type PaginationInput, type PaginationOptions, type PerformanceBudgets, type PerformanceMeasurement, type PermissionsPolicyConfig, type ProblemDetails, type ProblemDetailsInput, type RateLimitOptions, type RateLimitStore, type RawSocket, type RealtimeBridge, type RealtimeBus, type RealtimeConnectMeta, type RealtimeEnvelope, type RealtimeHandler, type RealtimeRegistry, type RealtimeRegistryOptions, type RealtimeSecurityOptions, type RealtimeSocket, type RequestLimitsConfig, type RequestLoggerOptions, type RequestRecord, type RequireAuthOptions, ResilienceError, type ResilientCallOptions, type ResponseContext, type Room, type RoomAuthInfo, type RoomClient, type RoomDefinition, type RoomHandlers, type RpcClientOptions, SESSION_USER_KEY, type SaveUploadOptions, type SavedUpload, type SchemaLike, type SecureUploadOptions, type SecurityConfig, type SeoConfig, type ServerSentEvent, ServiceContainer, type ServiceToken, type SessionBackend, type SessionEntry, type SessionPolicy, type SessionStore, type Span, type SpanRecord, type StreamResponseInit, type TFunction, TTLCache, type Target, type Tenant, type TenantAuditEvent, type TenantDirectoryStore, type TenantMembership, type TenantMiddlewareOptions, type TenantQuota, type TenantResolver, type TenantResource, type TenantSqlClient, type Tracer, type TransactionCookie, type TrustedTypesConfig, UploadError, type UploadInspectionResult, type UploadInspector, type UploadScanner, assertTenantAccess, bridgeRealtime, buildApiRequest, cacheControl, checkPerformanceBudgets, collectUploads, composeTenantResolvers, createContext, createCorsPreflightResponse, createExecutionContext, createPersistentTenantDirectory, createRealtimeRegistry, createRpcClient, createTenantDirectory, createTracer, csrfProtection, csrfToken, dedupe, defaultKey, defineAction, defineEndpoint, defineFeatureFlags, defineLoader, defineRoom, durationMs, encodeControlTemplate, escapeHtml, etag, executionContextFromHttp, getRequestContext, getUser, hashPassword, isRoomDefinition, isSafeIslandName, isSafeRequestPath, isWebSocketOriginAllowed, loadSession, logIn, logOut, memoryIdempotencyStore, memoryTenantDirectoryStore, migrateTenants, notModified, peerKey, postgresTenantDirectoryStore, problem, proxyKey, randomUploadFilename, rateLimit, recommendedWebBudgets, renderControlTemplates, renderDevError, renderError, renderNotFound, renderProdError, renderStatusPage, requestId, requestLogger, requireAuth, requireRequestContext, requireTenant, resilientCall, resolveRequestUrl, runWithRequestContext, sanitizeFilename, saveUpload, saveUploadSecure, secureDownloadHeaders, serviceToken, sessionAuth, setSessionBackend, setSessionPolicy, sse, streamResponse, tenantFromDomain, tenantFromHeader, tenantFromPath, tenantFromSession, tenantFromSubdomain, tenantKey, tenantMiddleware, tenantScope, tracingMiddleware, verifyCsrf, verifyPassword, withCacheControl, withContextHeaders, withIdempotency, withSecurityHeaders, withSpan }; ``` --- @@ -6745,11 +5542,11 @@ Intercepts same-origin `` clicks, fetches the target page, and swaps the `#ap Connects to `/realtime/` over WebSocket (`ws`/`wss` chosen from `location.protocol`). Two usage modes. -Programmatic API via `window.wire`: +Programmatic API via `window.wrn`: ```ts -wire.room(name): Room // open (or reuse) a room connection -wire.bindRooms(root?) // (re)bind declarative [data-room] containers +wrn.room(name): Room // open (or reuse) a room connection +wrn.bindRooms(root?) // (re)bind declarative [data-room] containers interface Room { name: string; @@ -6845,7 +5642,7 @@ A realtime chat, fully declarative: Or drive a room from code: ```ts -const room = wire.room("lobby"); +const room = wrn.room("lobby"); room.on("chat", (msg) => console.log(msg.user, msg.text)); room.send({ type: "chat", user: "ada", text: "hi" }); ``` @@ -6911,7 +5708,7 @@ declare const NAV_RUNTIME: string; * `data-room-reset` clear after send). Optional `data-room-user` identifies * the connection. * - * 2. Programmatic: `const room = wire.room("chat"); room.on("chat", fn); + * 2. Programmatic: `const room = wrn.room("chat"); room.on("chat", fn); * room.send({ type: "chat", text })`. Handles connect, JSON, reconnect. * * Rebinds on `wrnexus:navigated` (client-side nav) and closes rooms whose @@ -6921,6 +5718,19 @@ declare const REALTIME_RUNTIME: string; declare const ACTION_RUNTIME: string; +interface ApiRequest { + method?: string; + params?: Record; + query?: Record; + body?: Input; +} +interface ApiClientOptions { + baseUrl?: string; + fetch?: (input: RequestInfo | URL, init?: RequestInit) => Promise; +} +/** Runtime used by generated API clients; throws a typed response error on non-2xx results. */ +declare function createApiClient(options?: ApiClientOptions): (template: string, request?: ApiRequest) => Promise; + type OutputHandler = (payload: T) => void | Promise; interface OutputHost extends HTMLElement { __wrnexusOutputHandlers?: Map>; @@ -6993,6 +5803,14 @@ interface WrnexusBrowserGlobals { * no per-component browser bundles: SSR stays cleanly separated from CSR. */ +/** Public client transport used by `.wrn` client functions for dynamic URLs. */ +declare function useFetch(path: string, methodOrOptions?: string | { + method?: string; + query?: unknown; + params?: unknown; + body?: unknown; + data?: unknown; +}, input?: unknown): Promise; /** The reactive runtime served at `/__wrnexus/reactive.js` (plain browser JS). */ declare function getReactiveRuntime(development?: boolean): string; /** Component-specific controllers, loaded only when their marker is present. */ @@ -7003,7 +5821,7 @@ declare function getNavRuntime(): string; declare function getRealtimeRuntime(): string; declare function getActionRuntime(): string; -export { ACTION_RUNTIME, ActionClientError, type ActionClientOptions, type ActionResult, type ClientModuleScope, type HydrationScopeApi, NAV_RUNTIME, type OutputHandler, type OutputHost, REACTIVE_RUNTIME, REALTIME_RUNTIME, type ServerCallOptions, WrnServerCallError, type WrnexusBrowserGlobals, callServerFunction, collectRefs, createActionClient, createOutputProxy, createServerProxy, getActionRuntime, getComponentControllerRuntime, getNavRuntime, getReactiveRuntime, getRealtimeRuntime, invalidateClientModule, invokeOutput, loadClientFunctions, registerOutputHandler }; +export { ACTION_RUNTIME, ActionClientError, type ActionClientOptions, type ActionResult, type ApiClientOptions, type ApiRequest, type ClientModuleScope, type HydrationScopeApi, NAV_RUNTIME, type OutputHandler, type OutputHost, REACTIVE_RUNTIME, REALTIME_RUNTIME, type ServerCallOptions, WrnServerCallError, type WrnexusBrowserGlobals, callServerFunction, collectRefs, createActionClient, createApiClient, createOutputProxy, createServerProxy, getActionRuntime, getComponentControllerRuntime, getNavRuntime, getReactiveRuntime, getRealtimeRuntime, invalidateClientModule, invokeOutput, loadClientFunctions, registerOutputHandler, useFetch }; ``` --- @@ -7142,7 +5960,7 @@ const events = await getDb("analytics").all("SELECT * FROM hits"); Migrations are `.sql` files (in e.g. `app/db/migrations`), each split into `-- +up` and `-- +down` sections. A file with no markers is treated entirely as -`up`. Applied names are recorded in a `_wire_migrations` table so each runs once. +`up`. Applied names are recorded in a `_wrn_migrations` table so each runs once. - `parseMigration(name, content)` → `Migration` (`{ name, up, down }`). - `loadMigrations(dir)` — parse all `.sql` files, sorted by filename. @@ -7263,7 +6081,7 @@ SQL driver — use `@wrnexus/db/mongo` directly. - **Bun-only.** Uses `bun:sqlite` (SQLite adapter + session store) and `Bun.SQL` (Postgres/MySQL). Migrations/scaffolding use `node:fs`/`node:path`. - Works with `@wrnexus/core` — `sqliteSessionStore` implements its - `SessionBackend`; `getDb`/`setDb` are wired by the WrNexus runtime from + `SessionBackend`; `getDb`/`setDb` are connected by the WrNexus runtime from `wrnexus.config.ts`. - The `mongodb` npm package is an optional, lazily-imported peer — install it only if you use `@wrnexus/db/mongo`. The core package stays dependency-free. @@ -7312,6 +6130,19 @@ Repository SQL identifiers are validated and values remain parameterized. Placeh `retryTransaction()` retries recognized serialization, deadlock, and database-lock errors by default. Supply `shouldRetry` for application-specific retryable errors; ordinary validation or business errors are not retried automatically. +## Reusable seed helpers + +```ts +import { addSeedData, removeSeedData, runSeedQuery, getDb } from "@wrnexus/db"; + +await addSeedData(getDb, [{ code: "free", credits: 100 }], "plans", { conflict: "ignore" }); +await removeSeedData(getDb(), { code: "legacy" }, "plans"); +await runSeedQuery(getDb(), "UPDATE plans SET credits = ? WHERE code = ?", [200, "free"]); +``` + +Table and column identifiers are validated, values are always parameterized, and empty bulk +deletes are refused unless `{ all: true }` is explicit. + ### Exported TypeScript declarations ```ts @@ -7355,7 +6186,7 @@ declare function closeDatabases(): Promise; /** * Migration runner. Migrations are `.sql` files in `app/db/migrations`, each * split into `-- +up` and `-- +down` sections. Applied migrations are recorded - * in a `_wire_migrations` table so they run exactly once, newest-last. + * in a `_wrn_migrations` table so they run exactly once, newest-last. * * `scaffoldMigration(..., models)` writes an initial migration straight from the * TS models — the source of truth — so you don't hand-write the first schema. @@ -7386,7 +6217,18 @@ declare function appliedMigrations(db: Db): Promise; declare function applyMigrations(db: Db, migrations: readonly Migration[], options?: MigrationRunOptions): Promise; /** Apply all pending migrations from a directory. */ declare function migrate(db: Db, dir: string, options?: MigrationRunOptions): Promise; -/** Roll back the most recently applied migration. Returns its name, or null. */ +/** + * Roll back the most recently applied migration. Returns its name, or null when + * nothing has been applied. + * + * Refuses a migration that changed the schema but defines no `-- +down` section. + * Removing its tracking row would leave the change in place and unrecorded, and + * the next `migrate` would replay statements such as `ALTER TABLE ... ADD COLUMN` + * that cannot run twice, stranding the database between the two states. + * + * A migration whose `up` is empty — a placeholder, or comments only — has + * nothing to undo, so it rolls back by dropping its tracking row alone. + */ declare function rollback(db: Db, dir: string, options?: Omit & { dryRun?: boolean; }): Promise; @@ -7437,7 +6279,15 @@ interface ModelRef { varName: string; model: Model; } -/** Parse annotated queries from one `.sql` file's contents. */ +/** + * Parse annotated queries from one `.sql` file's contents. + * + * Line endings are normalised to LF first. The generator embeds each query's + * SQL as a string literal, so without this a CRLF checkout regenerated every + * query with CRLF where the committed file had LF -- a build dirtied the + * working tree, and that churn buried real changes in the same file. Line + * endings carry no meaning in SQL. + */ declare function parseQueries(content: string): QueryDef[]; /** Generate the full `queries.gen.ts` source. */ declare function generateQueriesFile(queries: QueryDef[], models: ModelRef[], dialect: Dialect): string; @@ -7569,6 +6419,16 @@ declare function firstOrThrow(db: Db, sql: string, params?: unknown[], model? declare function exists(db: Db, sql: string, params?: unknown[]): Promise; declare function countRows(db: Db, table: string, where?: string, params?: unknown[]): Promise; declare function withTransaction(db: Db, callback: (tx: Db) => Promise): Promise; +/** Execute a parameterized compare-and-set update and report whether this caller won. */ +declare function compareAndSet(db: Db, options: { + table: string; + idColumn?: string; + id: string | number; + stateColumn?: string; + from: string; + to: string; + extra?: Record; +}): Promise; declare function retryTransaction(db: Db, callback: (tx: Db, attempt: number) => Promise, options?: { attempts?: number; baseDelayMs?: number; @@ -7611,7 +6471,59 @@ declare function createRepository(db: Db, input: { }; }): Repository; -export { type CursorPage, type CursorPageOptions, Db, Dialect, ExecResult, type Migration, type MigrationRunOptions, type MigrationSafetyIssue, Model, type ModelRef, type PageOptions, type Paginated, type QueryDef, type QueryIssue, type QueryKind, type QueryPolicy, type QueryRecord, RecordNotFoundError, type RelationOptions, type Repository, Row, analyzeMigrationSafety, analyzeMigrations, appliedMigrations, applyMigrations, batch, closeDatabases, countRows, createRepository, cursorPaginate, databaseHealth, databaseNames, exists, firstOrThrow, generateQueriesFile, getDb, getDbPerformanceSnapshot, hasDb, instrumentDb, loadMigrations, loadRelated, migrate, optimisticUpdate, paginate, parseMigration, parseQueries, queryOperation, registerDb, registerLazyDb, resetDbPerformanceSnapshot, retryTransaction, rollback, scaffoldMigration, setDb, softDeleteClause, status, tenantScope, withTransaction }; +type SeedRow = Record; +type SeedDatabase = Db | (() => Db); +interface AddSeedOptions { + conflict?: "error" | "ignore" | "replace"; +} +interface UpsertSeedOptions { + key: string | readonly string[]; + update?: readonly string[]; +} +/** Insert one or many object rows with parameterized values. */ +declare function addSeedData(source: SeedDatabase, data: SeedRow | readonly SeedRow[], table: string, options?: AddSeedOptions): Promise; +/** Delete matching seed rows. An empty match is refused unless `all` is explicit. */ +declare function removeSeedData(source: SeedDatabase, match: SeedRow, table: string, options?: { + all?: boolean; +}): Promise; +/** Execute an application-owned parameterized seed statement. */ +declare function runSeedQuery(source: SeedDatabase, query: string, data?: readonly unknown[]): Promise; +/** Portable object upsert for SQLite, PostgreSQL and MySQL. */ +declare function upsertSeedData(source: SeedDatabase, data: SeedRow | readonly SeedRow[], table: string, options: UpsertSeedOptions): Promise; +declare function seedIfMissing(source: SeedDatabase, table: string, match: SeedRow, data: SeedRow): Promise; +type SeedStep = (db: Db) => void | Promise; +declare function defineSeed(...steps: readonly SeedStep[]): SeedStep; +interface SeedUserAccount { + identifier: string; + password?: string; + [key: string]: unknown; +} +declare function seedUsers(accounts: readonly T[], options: { + find(identifier: string): Promise; + create(account: T): Promise; + configure?(user: U, account: T): void | Promise; +}): Promise; + +interface LedgerOptions { + db: () => Db; + table: string; + subjectColumn?: string; + amountColumn?: string; + kindColumn?: string; + reasonColumn?: string; + referenceColumn?: string; +} +declare function defineLedger(options: LedgerOptions): { + balance: (subjectId: string, db?: Db) => Promise; + credit(subjectId: string, value: number, entryReason: string, ref?: string): Promise; + debit(subjectId: string, value: number, entryReason: string, ref?: string): Promise; + refund: (subjectId: string, value: number, entryReason: string, ref?: string) => Promise; + entries: (subjectId: string) => Promise; +}; + +export { type AddSeedOptions, type CursorPage, type CursorPageOptions, Db, Dialect, ExecResult, type LedgerOptions, type Migration, type MigrationRunOptions, type MigrationSafetyIssue, Model, type ModelRef, type PageOptions, type Paginated, type QueryDef, type QueryIssue, type QueryKind, type QueryPolicy, type QueryRecord, RecordNotFoundError, type RelationOptions, type Repository, Row, type SeedDatabase, type SeedRow, type SeedStep, type SeedUserAccount, type UpsertSeedOptions, addSeedData, analyzeMigrationSafety, analyzeMigrations, appliedMigrations, applyMigrations, batch, closeDatabases, compareAndSet, countRows, createRepository, cursorPaginate, databaseHealth, databaseNames, defineLedger, defineSeed, exists, firstOrThrow, generateQueriesFile, getDb, getDbPerformanceSnapshot, hasDb, instrumentDb, loadMigrations, loadRelated, migrate, optimisticUpdate, paginate, parseMigration, parseQueries, queryOperation, registerDb, registerLazyDb, removeSeedData, resetDbPerformanceSnapshot, retryTransaction, rollback, runSeedQuery, scaffoldMigration, seedIfMissing, seedUsers, setDb, softDeleteClause, status, tenantScope, upsertSeedData, withTransaction }; ``` --- @@ -7628,7 +6540,7 @@ Part of the **WrNexus** framework — an SSR-first, Bun-native full-stack web fr ## Overview -This package is the server runtime that powers a WrNexus app in both development and production. A single **request runtime** (`createHandlers`) owns HTTP/WebSocket dispatch and SSR document assembly; it knows nothing about _how_ modules and assets are produced, so the dev and prod entry points wire in different backends: dev uses dynamic module loading plus on-the-fly bundling and injects a live-reload client; prod uses a static, pre-built manifest with cache-immutable assets. The package also ships a multi-app **gateway** (route several apps by `Host` header behind one port) and a portable `node:http` adapter for WinterCG hosts. It is entirely server-side and Bun-native (`Bun.serve`, `Bun.file`, `Bun.gzipSync`). +This package is the server runtime that powers a WrNexus app in both development and production. A single **request runtime** (`createHandlers`) owns HTTP/WebSocket dispatch and SSR document assembly; it knows nothing about _how_ modules and assets are produced, so the dev and prod entry points wrn in different backends: dev uses dynamic module loading plus on-the-fly bundling and injects a live-reload client; prod uses a static, pre-built manifest with cache-immutable assets. The package also ships a multi-app **gateway** (route several apps by `Host` header behind one port) and a portable `node:http` adapter for WinterCG hosts. It is entirely server-side and Bun-native (`Bun.serve`, `Bun.file`, `Bun.gzipSync`). ## Installation @@ -7643,16 +6555,16 @@ bun add @wrnexus/dev-server ### Main entry (`@wrnexus/dev-server`) -| Export | Kind | Purpose | -| --------------------------------------------------------- | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | -| `startServer(opts: ServeOptions)` | `Promise` | Start the dev server on `Bun.serve`: builds the router, connects/migrates databases, wires assets + HMR, and starts the file watcher. | -| `createHandlers(deps: RuntimeDeps)` | `Handlers` | The shared request runtime (fetch + websocket handlers). Re-exported from `runtime.ts`. | -| `createProductionServer(manifest, opts)` | `Bun.Server` | Start the production server from a precompiled manifest. | -| `createProductionHandlers(manifest, opts)` | `Handlers` | Build the portable prod fetch/websocket handlers with no server bound (the deployment-adapter seam). | -| `startGateway(opts: GatewayOptions)` | `Promise` | Boot multiple apps as child processes and route by `Host`. | -| `toRequest`, `writeResponse`, `nodeListener`, `serveNode` | functions | `node:http` ↔ WinterCG `Request`/`Response` adapter. | -| `RESTART_EXIT_CODE` | `number` (`97`) | Exit code the dev child uses to ask the supervisor for a fresh process. | -| `STYLES_HREF`, `HMR_CLIENT_JS` | constants | The global stylesheet URL and the inline HMR client script. | +| Export | Kind | Purpose | +| --------------------------------------------------------- | ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | +| `startServer(opts: ServeOptions)` | `Promise` | Start the dev server on `Bun.serve`: builds the router, connects/migrates databases, connects assets + HMR, and starts the file watcher. | +| `createHandlers(deps: RuntimeDeps)` | `Handlers` | The shared request runtime (fetch + websocket handlers). Re-exported from `runtime.ts`. | +| `createProductionServer(manifest, opts)` | `Bun.Server` | Start the production server from a precompiled manifest. | +| `createProductionHandlers(manifest, opts)` | `Handlers` | Build the portable prod fetch/websocket handlers with no server bound (the deployment-adapter seam). | +| `startGateway(opts: GatewayOptions)` | `Promise` | Boot multiple apps as child processes and route by `Host`. | +| `toRequest`, `writeResponse`, `nodeListener`, `serveNode` | functions | `node:http` ↔ WinterCG `Request`/`Response` adapter. | +| `RESTART_EXIT_CODE` | `number` (`97`) | Exit code the dev child uses to ask the supervisor for a fresh process. | +| `STYLES_HREF`, `HMR_CLIENT_JS` | constants | The global stylesheet URL and the inline HMR client script. | Exported types: `ServeOptions`, `RunningServer`, `RuntimeDeps`, `AssetServer`, `WsData`, `GatewayApp`, `GatewayOptions`, `GatewayAuth`, `GatewaySecurity`, `RunningGateway`, `FetchHandler`. @@ -7688,6 +6600,14 @@ interface RunningServer { In development, `startServer` also connects `app/db/migrations` (and `app/db//migrations`) and auto-applies migrations, then starts an in-process file watcher. CSS edits hot-swap live. Page, component, layout, API, middleware, realtime, schema, locale, and public-asset edits invalidate only their cached modules, rescan routes where necessary, and morph fresh HTML through the existing HMR WebSocket. The server process and active gateway stay running. +### Custom not-found handlers + +Add `app/pages/404.wrn` to customize unmatched frontend routes. The rendered +page keeps the requested response's HTTP `404` status. Add `app/api/404.ts` +with normal HTTP method exports to customize unmatched backend/API responses; +its response body and headers are preserved and its status is normalized to +`404`. + `getWrnCompileMetrics()` exposes cumulative content-addressed compiler cache `hits`, `misses`, successful `compilations`, `errors`, `totalDurationMs`, and `lastDurationMs` for the DevToolbar or custom diagnostics. Tests and embedded @@ -7707,7 +6627,7 @@ interface RuntimeDeps { getMiddleware(): Promise; assets: AssetServer; // serves /__wrnexus/* (islands, reactive, hmr) hasStyles?: boolean; // inject the global stylesheet link - hasUi?: boolean; // inject the Wire UI stylesheet (/__wrnexus/ui.css) + hasUi?: boolean; // inject the WrNexus UI stylesheet (/__wrnexus/ui.css) theme?: ResolvedTheme; // enables /__wrnexus/theme.css + i18n?: ResolvedI18n; // enables ctx.t, , {t:key} markers inlineStyles?: string; // inline small prod stylesheets into @@ -7937,8 +6857,9 @@ Pages get only the scripts they use: `nav.js` always, `reactive.js` when a page ```ts import { Mode, Middleware, SeoConfig, SecurityConfig, HealthRegistry, RealtimeBus, RealtimeConnectMeta } from '@wrnexus/core'; import { Router } from '@wrnexus/router'; -import { ResolvedTheme, MobileConfig, PwaConfig, ObservabilityConfig, TenancyConfig, NavigationConfig, StylesConfig, ThemeConfig } from '@wrnexus/styles'; +import { ResolvedTheme, MobileConfig, PwaConfig, ObservabilityConfig, TenancyConfig, NavigationConfig, StylesConfig, ThemeConfig, BrowserCookiesConfig } from '@wrnexus/styles'; import { ResolvedI18n, I18nConfig } from '@wrnexus/i18n'; +import { QueueStorageConfig } from '@wrnexus/queue'; import { StorageConfig } from '@wrnexus/uploader'; import { DevToolbarConfig, DevToolbarPlatformSnapshot, DevToolbarPanel } from '@wrnexus/dev-toolbar/types'; import { ClientRuntimeDefinition, PluginInput } from '@wrnexus/plugin'; @@ -7988,6 +6909,31 @@ interface WrnCompileMetrics { declare function getWrnCompileMetrics(): Readonly; declare function resetWrnCompileMetrics(): void; +/** + * Shared server-function RPC helpers used by both the dev server (index.ts) + * and the production server (prod.ts). Kept in their own module so prod.ts + * can import them without creating a circular dependency on index.ts (which + * itself re-exports `createProductionServer`/`createProductionHandlers` from + * prod.ts). + */ +/** + * CSRF check for `/__wrnexus/rpc` (the server-function RPC endpoint the + * browser runtime calls for `server.fn()`). Requires a same-origin request + * carrying a matching CSRF cookie + header pair — the standard double-submit + * cookie pattern. + */ +declare function validateRpcCsrf(request: Request): boolean; +/** + * Wrap the server-function RPC handler so it runs inside the request's + * AsyncLocalStorage context. `/__wrnexus/rpc` is intercepted BEFORE + * `handlers.fetch` (fetchHandler) in both dev and production, so a server + * function called via `server.fn()` from the browser runs entirely outside + * fetchHandler's own context wrap. It runs user code directly, so — like + * every other entry point that runs user server code — it needs the request + * context too. + */ +declare function withServerFnRequestContext(handler: (request: Request) => Promise): (request: Request) => Promise; + /** * HMR hub — tracks connected browser HMR sockets and broadcasts update events. * @@ -8029,8 +6975,8 @@ declare class HmrHub { * * It owns the HTTP/WebSocket dispatch and the SSR document assembly, but knows * nothing about *how* modules or assets are produced — those come in via - * `RuntimeDeps`. Dev wires in dynamic module loading + on-the-fly bundling; - * prod wires in a static manifest + pre-built chunks on disk. + * `RuntimeDeps`. Dev connects in dynamic module loading + on-the-fly bundling; + * prod connects in a static manifest + pre-built chunks on disk. */ /** A realtime module's `websocket` export: a bag of optional lifecycle hooks. */ @@ -8068,7 +7014,7 @@ interface RuntimeDeps { assets: AssetServer; /** When true, inject the global stylesheet link into every page head. */ hasStyles?: boolean; - /** When true, inject the Wire UI stylesheet link (`/__wrnexus/ui.css`). */ + /** When true, inject the WrNexus UI stylesheet link (`/__wrnexus/ui.css`). */ hasUi?: boolean; /** Production build combined theme + UI stylesheet. */ hasFrameworkStyles?: boolean; @@ -8128,6 +7074,7 @@ interface RuntimeDeps { interface UpgradeServer { upgrade(req: Request, opts: { data: WsData; + headers?: Headers; }): boolean; /** Bun's per-request socket peer address (used for the non-spoofable client IP). */ requestIP?(req: Request): { @@ -8142,6 +7089,7 @@ interface Ws { } interface Handlers { fetch(req: Request, server: UpgradeServer): Promise; + shutdown(): Promise; websocket: { open(ws: Ws): void; message(ws: Ws, message: string | Uint8Array): void; @@ -8162,6 +7110,7 @@ declare function createHandlers(deps: RuntimeDeps): Handlers; * reverse proxy for both HTTP and WebSocket. Apps talk to each other at runtime * via @wrnexus/pubsub (use the Redis driver so messages cross processes). */ + type GatewayForwardAuth = ({ url: string; app?: never; @@ -8289,6 +7238,11 @@ interface ProdManifest { name: string; mod: RouteModule; }[]; + /** Background queue modules (from app/queues/*.ts). */ + queues?: { + name: string; + mod: RouteModule; + }[]; } interface ProductionPluginAsset { path: string; @@ -8302,7 +7256,7 @@ interface ProdOptions { inlineStyles?: string; /** `stylesPath` contains theme + UI + app CSS in cascade order. */ stylesIncludeFramework?: boolean; - /** `stylesPath` already contains the shared Wire UI stylesheet. */ + /** `stylesPath` already contains the shared WrNexus UI stylesheet. */ stylesIncludeUi?: boolean; /** Absolute path to the pre-built reactive runtime. */ reactivePath?: string; @@ -8310,6 +7264,7 @@ interface ProdOptions { controllersPath?: string; /** Absolute directory containing bundled per-WRN browser modules. */ clientModulesDir?: string; + islandsDir?: string; /** Absolute path to the pre-built theme stylesheet (`theme.css`). */ themePath?: string; /** Pre-built active theme/accent stylesheets, loaded on demand. */ @@ -8318,11 +7273,11 @@ interface ProdOptions { themeJsPath?: string; /** Resolved theme config: enables `` + `theme.css` link. */ theme?: ResolvedTheme; - /** Absolute path to the pre-built Wire UI stylesheet (`ui.css`). */ + /** Absolute path to the pre-built WrNexus UI stylesheet (`ui.css`). */ uiCssPath?: string; - /** Combined production theme + Wire UI stylesheet. */ + /** Combined production theme + WrNexus UI stylesheet. */ frameworkCssPath?: string; - /** Pre-built `window.__wireSchemas = {...}` script for client validation. */ + /** Pre-built `window.__wrnSchemas = {...}` script for client validation. */ schemasJs?: string; /** * Authorization declarations discovered by `wrnexus build` from @@ -8349,6 +7304,8 @@ interface ProdOptions { driver: string; url: string; }>; + /** Queue persistence; durable SQLite is used when omitted. */ + queue?: QueueStorageConfig; /** * Absolute path to the default db's migrations bundled into the build * (`dist/migrations`). When set, they are applied on startup — like dev. @@ -8423,13 +7380,6 @@ interface AuthzManifestEntry { * `createProductionHandlers`, ever runs. */ declare function applyAuthzManifestEarly(entries: AuthzManifestEntry[]): void; -/** - * Build the portable request handler from a precompiled manifest — a - * WinterCG-style `fetch(request) => Response` plus the websocket handlers, with - * NO server bound. This is the deployment-adapter seam: `createProductionServer` - * wraps it in `Bun.serve`, `serveNode` bridges it onto `node:http`, and edge or - * serverless targets can call `fetch` directly. - */ declare function createProductionHandlers(manifest: ProdManifest, opts: ProdOptions): ReturnType; /** Start the production server on Bun from a precompiled manifest. */ declare function createProductionServer(manifest: ProdManifest, opts: ProdOptions): Promise>; @@ -8485,6 +7435,8 @@ interface ServeOptions { /** Inject the live-reload client (defaults to true in development). */ hmr?: boolean; appConfig?: Record; + /** Queue persistence; durable SQLite is used when omitted. */ + queue?: QueueStorageConfig; /** Resolved absolute path to the global CSS entry, or null. */ styleEntry?: string | null; /** Custom styles config (e.g. a Tailwind/PostCSS processor). */ @@ -8497,6 +7449,8 @@ interface ServeOptions { security?: SecurityConfig; /** Design-token theme config (merged over the built-in light/dark). */ theme?: ThemeConfig; + /** Shared browser-cookie defaults and preference-specific overrides. */ + cookies?: BrowserCookiesConfig; /** i18n config (default language + supported locales). */ i18n?: I18nConfig; /** Default database connection (driver + url). Enables `getDb()` and dev auto-migrate. */ @@ -8533,7 +7487,7 @@ interface RunningServer { } declare function startServer(opts: ServeOptions): Promise; -export { type AssetServer, type AuthzManifestEntry, type FetchHandler, type GatewayApp, type GatewayAuth, type GatewayOptions, type GatewaySecurity, RESTART_EXIT_CODE, type RunningGateway, type RunningServer, type RuntimeDeps, type ServeOptions, type WrnCompileMetrics, type WsData, applyAuthzManifestEarly, createHandlers, createProductionHandlers, createProductionServer, expandStaticComponents, getWrnCompileMetrics, nodeListener, precomputePartialStaticShell, resetWrnCompileMetrics, serveNode, startGateway, startServer, toRequest, writeResponse }; +export { type AssetServer, type AuthzManifestEntry, type FetchHandler, type GatewayApp, type GatewayAuth, type GatewayOptions, type GatewaySecurity, RESTART_EXIT_CODE, type RunningGateway, type RunningServer, type RuntimeDeps, type ServeOptions, type WrnCompileMetrics, type WsData, applyAuthzManifestEarly, createHandlers, createProductionHandlers, createProductionServer, expandStaticComponents, getWrnCompileMetrics, nodeListener, precomputePartialStaticShell, resetWrnCompileMetrics, serveNode, startGateway, startServer, toRequest, validateRpcCsrf, withServerFnRequestContext, writeResponse }; ``` --- @@ -8660,6 +7614,7 @@ Use a shared replay store such as Redis in multi-instance deployments. The memor ```ts import { Middleware } from '@wrnexus/core'; +import { Db } from '@wrnexus/db'; interface EncryptionKey { id: string; @@ -8741,6 +7696,22 @@ declare function encryptedExchange(options: EncryptedHttpOptions & { encryptResponses?: boolean; }): Middleware; +interface SecretResourceOptions> { + db: () => Db; + table: string; + key: string | (() => string); + encrypted: readonly (keyof T & string)[]; + hidden?: readonly (keyof T & string)[]; + id?: string; +} +/** Encrypt selected database fields and guarantee hidden fields never leave `safe()`. */ +declare function defineSecretResource>(options: SecretResourceOptions): { + seal(input: T): Promise; + open(input: T): Promise; + safe(input: T): Partial; + find(value: string | number): Promise; +}; + /** * @wrnexus/encryption — authenticated symmetric encryption (AES-256-GCM) via * WebCrypto, dependency-free. Use it to encrypt secrets, tokens, or database @@ -8770,7 +7741,7 @@ declare function decrypt(payload: string, key: string): Promise; /** Derive a base64 AES key from a password + salt (PBKDF2, 100k iterations). */ declare function deriveKey(password: string, salt: string): Promise; -export { type DecryptedHttpBody, ENCRYPTED_HTTP_CONTENT_TYPE, ENCRYPTED_HTTP_VERSION, type EncryptedHttpEnvelope, type EncryptedHttpOptions, type EncryptionKey, type EncryptionKeyring, type ReplayStore, createEncryptedRequest, createKeyring, createMemoryReplayStore, decrypt, decryptEncryptedResponse, decryptHttpBody, decryptRequest, deriveKey, encrypt, encryptHttpBody, encryptResponse, encryptedBody, encryptedExchange, encryptedFetch, generateKey, hmacSign, hmacVerify, needsRotation, open, seal, sealedKeyId, sha256 }; +export { type DecryptedHttpBody, ENCRYPTED_HTTP_CONTENT_TYPE, ENCRYPTED_HTTP_VERSION, type EncryptedHttpEnvelope, type EncryptedHttpOptions, type EncryptionKey, type EncryptionKeyring, type ReplayStore, type SecretResourceOptions, createEncryptedRequest, createKeyring, createMemoryReplayStore, decrypt, decryptEncryptedResponse, decryptHttpBody, decryptRequest, defineSecretResource, deriveKey, encrypt, encryptHttpBody, encryptResponse, encryptedBody, encryptedExchange, encryptedFetch, generateKey, hmacSign, hmacVerify, needsRotation, open, seal, sealedKeyId, sha256 }; ``` --- @@ -8884,6 +7855,7 @@ For direct requests without gateway headers, URL helpers use `ctx.url`. ```ts import { Context } from '@wrnexus/core'; +import { Db } from '@wrnexus/db'; declare function appOrigin(appName: string): string; declare function appUrl(appName: string, path?: string): string; @@ -8912,6 +7884,59 @@ declare function safeJsonParse(value: string, fallback: T): T; declare function clamp(value: number, min: number, max: number): number; declare function once any>(fn: T): T; +declare class HttpError extends Error { + readonly status: number; + readonly details?: unknown | undefined; + constructor(status: number, message: string, details?: unknown | undefined); +} +declare function subjectId(ctx: Pick): string; +declare function requireUser(ctx: Pick): { + id: string; + user: unknown; +}; +declare function requireParam(ctx: Pick, name: string, options?: { + integer?: boolean; + positive?: boolean; +}): string | number; +declare function requireJson>(ctx: Pick): Promise; +declare function requirePermission(ctx: Context, permission: string, resource?: unknown): Promise; +declare const json: { + ok: (value: T) => Response; + created: (value: T) => Response; + noContent: () => Response; + error: (status: number, message: string, details?: unknown) => Response; +}; +type ApiHandler = (ctx: Context) => Response | Promise; +/** Convert thrown HttpError values into the framework's standard JSON error shape. */ +declare function defineApiRoute(handler: ApiHandler): ApiHandler; +declare function authorized(permission: string, handler: ApiHandler, resource?: (ctx: Context) => unknown | Promise): ApiHandler; + +interface ResourceDefinition> { + name: string; + db: () => Db; + table: string; + id?: string; + owner?: string; + fields: readonly (keyof T & string)[]; + permissions?: { + read?: string; + readAny?: string; + write?: string; + writeAny?: string; + }; + validate?: (input: unknown, mode: "create" | "update") => T | Promise; + serialize?: (row: T) => unknown; +} +interface ResourceHandlers { + list(ctx: Context): Response | Promise; + create(ctx: Context): Response | Promise; + get(ctx: Context): Response | Promise; + update(ctx: Context): Response | Promise; + remove(ctx: Context): Response | Promise; +} +/** Build conventional owned CRUD handlers from one checked resource declaration. */ +declare function defineResource>(definition: ResourceDefinition): ResourceHandlers; + /** * @wrnexus/helpers — safe conveniences for common WrNexus application flows. * @@ -8953,7 +7978,7 @@ declare function getOriginalRequestOrigin(ctx: RequestContext, options?: Origina */ declare function redirectToLogin(ctx: RequestContext, loginUrl: string | URL, options?: LoginRedirectOptions): Response; -export { type AllowedHosts, type LoginRedirectOptions, type OriginalRequestOptions, type RequestContext, type RetryOptions, appOrigin, appUrl, backoffDelay, clamp, currentAppName, currentAppOrigin, getOriginalRequestMethod, getOriginalRequestOrigin, getOriginalRequestPath, getOriginalRequestUrl, once, redirectToLogin, retry, safeJsonParse, sleep, stableStringify, withTimeout, workspaceAppOrigins, workspaceRootDomain }; +export { type AllowedHosts, type ApiHandler, HttpError, type LoginRedirectOptions, type OriginalRequestOptions, type RequestContext, type ResourceDefinition, type ResourceHandlers, type RetryOptions, appOrigin, appUrl, authorized, backoffDelay, clamp, currentAppName, currentAppOrigin, defineApiRoute, defineResource, getOriginalRequestMethod, getOriginalRequestOrigin, getOriginalRequestPath, getOriginalRequestUrl, json, once, redirectToLogin, requireJson, requireParam, requirePermission, requireUser, retry, safeJsonParse, sleep, stableStringify, subjectId, withTimeout, workspaceAppOrigins, workspaceRootDomain }; ``` --- @@ -8986,7 +8011,7 @@ const i18n = resolveI18n(loadLocales("app/locales", { strict: true }), { default: "en", locales: ["en", "mr", "hi"], fallbacks: { "mr-IN": ["mr", "en"] }, - cookie: { name: "wire-lang", sameSite: "Lax", secure: true }, + cookie: { name: "wrn-lang", sameSite: "Lax", secure: true }, }); const lang = resolveLang(i18n, cookieValue, request.headers.get("accept-language")); @@ -9021,7 +8046,7 @@ Enable `i18nPlugin()` to use: - `` - `` -`LanguageSwitcher` renders a native `select[data-wire-lang]`. The packaged runtime validates the +`LanguageSwitcher` renders a native `select[data-wrn-lang]`. The packaged runtime validates the selection against the configured locales, writes the configured language cookie, updates the document `lang`/`dir` attributes, emits `wrnexus:language-change`, and reloads so the next SSR request uses the same cookie. No application-owned browser script is required. @@ -9136,6 +8161,7 @@ interface LocaleLoadOptions { interface I18nCookieConfig { name?: string; maxAge?: number; + domain?: string; path?: string; sameSite?: "Strict" | "Lax" | "None"; secure?: boolean; @@ -9161,7 +8187,7 @@ interface ResolvedI18n { labels: Record; cookie: Required; } -declare const LANG_COOKIE = "wire-lang"; +declare const LANG_COOKIE = "wrn-lang"; declare const I18N_JS_HREF = "/__wrnexus/i18n.js"; declare function normalizeLocale(locale: string): string; /** @@ -9185,10 +8211,22 @@ declare function loadRouteMessages(directory: string, locale: string, route: str declare function parseAcceptLanguage(value: string | null): string[]; declare function resolveLang(i18n: ResolvedI18n, cookieValue: string | undefined, acceptLanguage: string | null): string; declare function translateHtml(html: string, t: TFunction): string; +/** Attribute marking the JSON block that carries per-request i18n data. */ +declare const I18N_DATA_ATTRIBUTE = "data-wrn-i18n"; +/** + * The i18n payload, emitted as JSON rather than as an assignment. + * + * It ships inside a `type="application/json"` block, which the browser never + * executes, so `script-src` does not apply to it. As an inline executable + * script it was blocked whenever the surrounding document's CSP nonce came + * from a different response, leaving window.__wrnI18n undefined. + */ declare function renderI18nData(i18n: ResolvedI18n, lang: string): string; +/** The full JSON block, including its script tag. */ +declare function renderI18nDataTag(i18n: ResolvedI18n, lang: string): string; declare const I18N_RUNTIME: string; -export { type ExtractedTranslationKey, I18N_JS_HREF, I18N_RUNTIME, type I18nConfig, type I18nCookieConfig, LANG_COOKIE, type LocaleFormatter, type LocaleLoadOptions, type Messages, type ResolvedI18n, auditLocaleKeys, createLocaleFormatter, createPseudoLocale, extractTranslationKeys, extractTranslationKeysFromFiles, flattenMessageKeys, flattenMessages, formatCurrency, formatDate, formatMessage, formatNumber, formatRelativeTime, interpolate, loadLocales, loadRouteMessages, localeDirection, localeFallbacks, lookupMessage, makeT, normalizeLocale, parseAcceptLanguage, plural, pseudoLocalize, renderI18nData, resolveI18n, resolveLang, translateHtml, translationChain, translationCoverage, withTenantMessages }; +export { type ExtractedTranslationKey, I18N_DATA_ATTRIBUTE, I18N_JS_HREF, I18N_RUNTIME, type I18nConfig, type I18nCookieConfig, LANG_COOKIE, type LocaleFormatter, type LocaleLoadOptions, type Messages, type ResolvedI18n, auditLocaleKeys, createLocaleFormatter, createPseudoLocale, extractTranslationKeys, extractTranslationKeysFromFiles, flattenMessageKeys, flattenMessages, formatCurrency, formatDate, formatMessage, formatNumber, formatRelativeTime, interpolate, loadLocales, loadRouteMessages, localeDirection, localeFallbacks, lookupMessage, makeT, normalizeLocale, parseAcceptLanguage, plural, pseudoLocalize, renderI18nData, renderI18nDataTag, resolveI18n, resolveLang, translateHtml, translationChain, translationCoverage, withTenantMessages }; ``` --- @@ -10083,7 +9121,7 @@ interface TextDocument { text: string; version?: number; } -declare const WRN_COMPLETIONS: readonly ["page", "component", "layout", "props", "outputs", "state", "computed", "effect", "watch", "lifecycle", "load", "action", "api", "realtime", "view", "style", "runtime", "hydrate"]; +declare const WRN_KEYWORDS: readonly ["page", "component", "layout", "props", "outputs", "state", "computed", "effect", "watch", "lifecycle", "load", "action", "api", "apis", "realtime", "view", "style", "runtime", "hydrate"]; declare function offsetAt(text: string, position: Position): number; declare function positionAt(text: string, requestedOffset: number): Position; declare function wordAt(text: string, position: Position): { @@ -10164,7 +9202,7 @@ declare function hover(document: TextDocument, position: Position): { range: Range; } | null; declare function completionItems(): { - label: "page" | "component" | "layout" | "props" | "outputs" | "state" | "computed" | "effect" | "watch" | "lifecycle" | "load" | "action" | "api" | "realtime" | "view" | "style" | "runtime" | "hydrate"; + label: "page" | "component" | "layout" | "props" | "outputs" | "state" | "computed" | "effect" | "watch" | "lifecycle" | "load" | "action" | "api" | "apis" | "realtime" | "view" | "style" | "runtime" | "hydrate"; kind: number; detail: string; }[]; @@ -10177,7 +9215,7 @@ declare function semanticTokens(document: TextDocument): { data: number[]; }; -export { type Position, type Range, type TextDocument, WRN_COMPLETIONS, type WorkspaceCompletionItem, clearWorkspaceIndexCache, completionItems, definitionLocation, documentDiagnostics, documentSymbols, extractComponentRefactor, formatDocument, hover, htmlToWrn, offsetAt, positionAt, semanticTokens, semanticTokensLegend, symbolLocations, virtualTypeScriptDocument, wordAt, workspaceCompletionItems, workspaceSymbolLocations }; +export { type Position, type Range, type TextDocument, WRN_KEYWORDS, type WorkspaceCompletionItem, clearWorkspaceIndexCache, completionItems, definitionLocation, documentDiagnostics, documentSymbols, extractComponentRefactor, formatDocument, hover, htmlToWrn, offsetAt, positionAt, semanticTokens, semanticTokensLegend, symbolLocations, virtualTypeScriptDocument, wordAt, workspaceCompletionItems, workspaceSymbolLocations }; ``` --- @@ -11650,11 +10688,11 @@ Part of the **WrNexus** framework — an SSR-first, Bun-native full-stack web fr ## Overview -`@wrnexus/queue` is a server-side in-process job queue. You register named +`@wrnexus/queue` is a server-side durable job queue. You register named workers, enqueue jobs (optionally delayed or recurring), and let the queue poll and run them on a timer — with per-job retry limits and doubling backoff between -attempts. The default store lives in memory; the design allows a pluggable driver -to back it with Redis/SQL for durability across restarts. Reach for it when you +attempts. `defineQueue` persists to `.wrnexus/queue.sqlite` by default, while +low-level `createQueue` remains an intentionally in-memory primitive. Reach for it when you need to defer work (emails, webhooks, cleanup) off the request path without a heavyweight external broker. Tests can drive it deterministically via `drain()`. @@ -11688,7 +10726,7 @@ function createQueue(options?: QueueOptions): Queue; | `pollMs` | `number` | `250` | Poll interval used once `start()` is called (ms). | | `onFailed` | `(job: Job, error: unknown) => void` | — | Called when a job exhausts its attempts. | | `concurrency` | `number` | unlimited | Maximum jobs claimed by one `drain()` call. | -| `capacity` | `number` | unlimited | Maximum queued plus active jobs before adds reject. | +| `capacity` | `number` | unlimited | Optional maximum queued jobs; omitted queues never scan merely to enforce a hidden cap. | | `now` | `() => number` | `Date.now` | Clock injection for deterministic tests. | ### `Queue` @@ -11744,6 +10782,20 @@ interface Job { ## Usage +Application queues belong in `app/queues/*.ts` and default-export `defineQueue(...)`. +Configure persistence once in `wrnexus.config.ts`: + +```ts +export default { + queue: { storage: "database", databaseName: "default" }, + // Or omit queue entirely for .wrnexus/queue.sqlite. +}; +``` + +Use `storage: "memory"` only for disposable work. A selected database must exist; +WrNexus fails startup/first use with a clear error instead of silently falling back. +Each job may declare `success(data, job)` and `failed(data, error, job)` lifecycle hooks. + Register workers, enqueue jobs, then start the poller: ```ts @@ -11762,6 +10814,45 @@ await queue.add("email", { to: "a@b.com" }, { delayMs: 5000, maxAttempts: 3 }); queue.start(); // begin polling; queue.stop() to halt ``` +### Application queues with `defineQueue` + +WrNexus applications can place typed queue modules in `app/queues`. The dev and +production servers discover them, start them after runtime initialization, and +shut them down gracefully: + +```ts +import { defineQueue } from "@wrnexus/queue"; + +export default defineQueue({ + name: "email", + jobs: { + send: { + maxAttempts: 3, + idempotency: ({ messageId }: { messageId: number }) => `message:${messageId}`, + run: async ({ messageId }) => sendMessage(messageId), + }, + }, +}); +``` + +Callers get a typed producer and inspection helpers: + +```ts +const job = await email.send.add({ messageId: 42 }); +await email.send.status(job.id); +await email.send.cancel(job.id); +await email.send.retry(job.id); +``` + +`createDurableQueue` also exposes `start()`, `stop()`, `isRunning()`, `health()` +and `get()` so applications do not need to build their own polling middleware. + +### SQLite + +Use `sqliteQueueStore(db)` from `@wrnexus/queue/sqlite` with a WrNexus-compatible +SQLite client. `installSqliteQueueSchema(db)` installs the queue table and its +due-job and idempotency indexes. + Use `context.signal` in network/database calls so forced shutdown and active cancellation finish promptly. For process termination, prefer `await queue.shutdown()`; use `{ force: true }` only after your grace period. @@ -11857,282 +10948,10 @@ Use `memoryWorkflowStore()` for tests. Production stores implement the small `ge ### Exported TypeScript declarations ```ts -import { ExecutionContext, Context } from '@wrnexus/core'; -import { SubjectContext } from '@wrnexus/rpc'; - -/** - * Persistence contract for the durable queue. - * - * Distributed drivers should implement `claim()` atomically and exclude leased - * jobs from `due()` until their lease expires. Calling `put()` must replace the - * stored record and release any previous lease for that job. - */ -interface QueueStore { - put(job: Job): Promise; - get(id: string): Promise; - remove(id: string): Promise; - due(now: number, limit: number): Promise; - list(name?: string): Promise; - claim?(id: string, worker: string, leaseUntil: number): Promise; -} -declare function memoryQueueStore(): QueueStore; -interface DurableQueueOptions { - store?: QueueStore; - workerId?: string; - maxAttempts?: number; - concurrency?: number; - capacity?: number; - leaseMs?: number; - backoff?: (attempt: number) => number; - now?: () => number; - onDeadLetter?: (job: Job, error: unknown) => void | Promise; - context?: (job: Job, signal: AbortSignal) => ExecutionContext; -} -interface DurableQueue { - add(name: string, data: T, options?: AddOptions): Promise>; - process(name: string, handler: JobHandler): void; - drain(): Promise; - cancel(id: string): Promise; - shutdown(options?: { - force?: boolean; - }): Promise; - list(name?: string): Promise; - failed(): Job[]; - retry(id: string): Promise; -} -declare function createDurableQueue(options?: DurableQueueOptions): DurableQueue; - -interface RedisQueueClient { - get(key: string): Promise; - set(key: string, value: string, options?: { - NX?: boolean; - PX?: number; - }): Promise; - del(...keys: string[]): Promise; - zadd(key: string, score: number, member: string): Promise; - zrem(key: string, member: string): Promise; - zrangebyscore(key: string, min: number, max: number, options?: { - limit: [number, number]; - }): Promise; - smembers(key: string): Promise; - sadd(key: string, member: string): Promise; - srem(key: string, member: string): Promise; -} -/** Redis-backed queue store using only the common client command surface. */ -declare function redisQueueStore(client: RedisQueueClient, prefix?: string): QueueStore; -interface SqlQueueClient { - query>(sql: string, parameters?: unknown[]): Promise<{ - rows: T[]; - }>; -} -/** PostgreSQL store with atomic SKIP LOCKED leasing and JSON payloads. */ -declare function postgresQueueStore(db: SqlQueueClient, table?: string): QueueStore; -declare const POSTGRES_QUEUE_SCHEMA = "CREATE TABLE IF NOT EXISTS wrnexus_jobs (\n id text PRIMARY KEY, name text NOT NULL, payload jsonb NOT NULL, run_at bigint NOT NULL,\n priority integer NOT NULL DEFAULT 0, lease_owner text, lease_until bigint\n); CREATE INDEX IF NOT EXISTS wrnexus_jobs_due ON wrnexus_jobs (run_at, priority DESC);"; - -interface ScheduledJob { - name: string; - data: T; - everyMs: number; - options?: AddOptions; -} -interface QueueScheduler { - start(): void; - stop(): void; - tick(now?: number): Promise; - snapshot(): { - running: boolean; - schedules: number; - nextRuns: Record; - }; -} -/** Restart-safe scheduler when used with a durable queue and stable idempotency buckets. */ -declare function createQueueScheduler(queue: DurableQueue, schedules: ScheduledJob[], options?: { - pollMs?: number; - now?: () => number; -}): QueueScheduler; -declare function addBatch(queue: DurableQueue, name: string, values: T[], options?: AddOptions): Promise[]>; -interface QueueDashboardSnapshot { - generatedAt: number; - pending: number; - failed: number; - byName: Record; - oldestRunAt?: number; -} -declare function queueDashboardSnapshot(queue: DurableQueue): Promise; -declare function renderQueueDashboard(snapshot: QueueDashboardSnapshot): string; -/** Long-running scheduler/worker loop suitable for a dedicated process or container. */ -declare function runQueueDaemon(queue: DurableQueue, scheduler: QueueScheduler, options?: { - signal?: AbortSignal; - pollMs?: number; - onError?: (error: unknown) => void; -}): Promise; - -type WorkflowStatus = "pending" | "running" | "waiting-approval" | "completed" | "failed" | "cancelled"; -interface WorkflowStep$1 { - name: string; - dependsOn?: string[]; - approval?: boolean; - run(input: I, context: WorkflowRunContext): O | Promise; -} -interface WorkflowRunContext { - workflowId: string; - step: string; - results: Readonly>; - signal: AbortSignal; - progress(value: number, message?: string): void; -} -interface WorkflowSnapshot { - id: string; - name: string; - status: WorkflowStatus; - input: unknown; - results: Record; - completed: string[]; - waitingFor?: string; - progress: number; - message?: string; - error?: string; - updatedAt: number; -} -interface WorkflowStore { - get(id: string): Promise; - put(snapshot: WorkflowSnapshot): Promise; - list(): Promise; -} -declare function memoryWorkflowStore(): WorkflowStore; -interface WorkflowDefinition { - name: string; - steps: WorkflowStep$1[]; - /** Compile-time input marker; definitions do not store runtime input values. */ - readonly __input?: I; -} -interface WorkflowEngine { - start(definition: WorkflowDefinition, input: I, id?: string): Promise; - resume(definition: WorkflowDefinition, id: string): Promise; - approve(definition: WorkflowDefinition, id: string, step: string, actor: string): Promise; - cancel(id: string): Promise; - get(id: string): Promise; - list(): Promise; -} -declare function createWorkflowEngine(store?: WorkflowStore): WorkflowEngine; -declare function defineDurableWorkflow(definition: WorkflowDefinition): WorkflowDefinition; - -interface SubjectEnvelope { - payload: T; - identity?: string; -} -interface SubjectJob extends Omit>, "data"> { - data: T; - subject?: SubjectContext; -} -interface SubjectQueue { - add(ctx: Context, name: string, data: T, options?: AddOptions): Promise>>; - process(name: string, handler: (job: SubjectJob, context: { - signal: AbortSignal; - }) => void | Promise): void; -} -/** Queue adapter that persists a signed end-user context alongside job data. */ -/** Works with both the in-memory Queue and createDurableQueue(). */ -declare function subjectQueue(queue: Queue | DurableQueue): SubjectQueue; - -/** - * @wrnexus/queue — a background job queue with delays, retries + backoff, and - * concurrent workers. The default store is in-process; a pluggable driver lets - * you back it with Redis/SQL for durability across restarts. - * - * const queue = createQueue(); - * queue.process("email", async (job) => { await send(job.data); }); - * await queue.add("email", { to: "a@b.com" }, { delayMs: 5000, maxAttempts: 3 }); - * queue.start(); // begin polling; queue.stop() to halt - * - * Tests can drive it deterministically with `await queue.drain(now)`. - */ -interface Job { - id: string; - name: string; - data: T; - attempts: number; - maxAttempts: number; - runAt: number; - /** If set, re-enqueue this job this many ms after each successful run. */ - repeat?: number; - priority: number; - idempotencyKey?: string; - createdAt: number; -} -interface JobContext { - /** Aborted when an active job is cancelled or the queue is force-stopped. */ - signal: AbortSignal; - /** The same trusted context shape used by HTTP, actions, realtime and webhooks. */ - execution: ExecutionContext; -} -type JobHandler = (job: Job, context: JobContext) => void | Promise; -interface AddOptions { - /** Delay before the job becomes runnable (ms). */ - delayMs?: number; - /** Max attempts before it's dead-lettered. Default from queue options. */ - maxAttempts?: number; - /** Re-enqueue this job this many ms after each successful run (recurring). */ - repeat?: number; - /** Higher-priority jobs run first when multiple jobs are due. */ - priority?: number; - /** Prevent duplicate queued work with the same stable key. */ - idempotencyKey?: string; -} -interface QueueOptions { - /** Default max attempts per job. Default 3. */ - maxAttempts?: number; - /** Base retry backoff (ms); doubles per attempt. Default 1000. */ - backoffMs?: number; - /** Poll interval when started (ms). Default 250. */ - pollMs?: number; - /** Called when a job exhausts its attempts. */ - onFailed?: (job: Job, error: unknown) => void; - /** Maximum jobs executed in one drain. Default: unlimited. */ - concurrency?: number; - /** Maximum queued + active jobs. Adds reject once this limit is reached. */ - capacity?: number; - /** Clock injection (tests). Default Date.now. */ - now?: () => number; - context?: (job: Job, signal: AbortSignal) => ExecutionContext; -} -interface Queue { - add(name: string, data: T, options?: AddOptions): Promise>; - process(name: string, handler: JobHandler): void; - /** Run every job whose runAt ≤ now, once. Returns how many ran. */ - drain(now?: number): Promise; - start(): void; - stop(): void; - /** Stop accepting work and wait for active handlers (or abort them). */ - shutdown(options?: { - force?: boolean; - }): Promise; - size(): number; - get(id: string): Job | undefined; - list(name?: string): Job[]; - cancel(id: string): boolean; - failed(): Job[]; - retry(id: string): Promise; -} -interface JobDefinition { - name: string; - options?: Omit; - run: JobHandler; -} -declare function defineJob(definition: JobDefinition): JobDefinition; -interface WorkflowStep { - name: string; - run(input: I): O | Promise; -} -declare function defineWorkflow(name: string, steps: Array>): { - name: string; - steps: WorkflowStep[]; - run(input: T): Promise; -}; -declare function cronToInterval(cron: string): number; -declare function createQueue(options?: QueueOptions): Queue; - -export { type AddOptions, type DurableQueue, type DurableQueueOptions, type Job, type JobContext, type JobDefinition, type JobHandler, POSTGRES_QUEUE_SCHEMA, type Queue, type QueueDashboardSnapshot, type QueueOptions, type QueueScheduler, type QueueStore, type RedisQueueClient, type ScheduledJob, type SqlQueueClient, type SubjectJob, type SubjectQueue, type WorkflowDefinition, type WorkflowEngine, type WorkflowRunContext, type WorkflowSnapshot, type WorkflowStatus, type WorkflowStep, type WorkflowStore, addBatch, createDurableQueue, createQueue, createQueueScheduler, createWorkflowEngine, cronToInterval, defineDurableWorkflow, defineJob, defineWorkflow, memoryQueueStore, memoryWorkflowStore, postgresQueueStore, queueDashboardSnapshot, redisQueueStore, renderQueueDashboard, runQueueDaemon, subjectQueue }; +export { A as AddOptions, D as DefineQueueOptions, a as DefinedJob, b as DefinedJobOptions, c as DefinedJobs, d as DefinedQueue, e as DurableQueue, f as DurableQueueOptions, J as Job, g as JobContext, h as JobDefinition, i as JobHandler, j as JobStateMachineOptions, k as JobStatus, O as OutboxEntry, l as OutboxWriter, P as POSTGRES_QUEUE_SCHEMA, Q as Queue, m as QueueAdminOptions, n as QueueDashboardSnapshot, o as QueueEvent, p as QueueEventType, q as QueueHealth, r as QueueJobDefinitions, s as QueueJobRecord, t as QueueJobState, u as QueueOptions, v as QueueScheduler, w as QueueStorage, x as QueueStorageConfig, y as QueueStore, R as RedisQueueClient, S as SagaStep, z as ScheduledJob, B as SqlQueueClient, SqliteQueueClient, C as SubjectJob, E as SubjectQueue, W as WorkerDefinition, F as WorkflowDefinition, G as WorkflowEngine, H as WorkflowRunContext, I as WorkflowSnapshot, K as WorkflowStatus, L as WorkflowStep, M as WorkflowStore, N as addBatch, T as configureQueueStorage, U as configuredQueueStore, V as createDurableQueue, X as createQueue, Y as createQueueAdminHandler, Z as createQueueScheduler, _ as createWorkflowEngine, $ as cronToInterval, a0 as databaseQueueStore, a1 as defineDurableWorkflow, a2 as defineJob, a3 as defineJobStateMachine, a4 as defineQueue, a5 as defineSaga, a6 as defineWorker, a7 as defineWorkflow, a8 as drainOutbox, a9 as installDatabaseQueueSchema, aa as installOutboxSchema, installSqliteQueueSchema, ab as memoryQueueStore, ac as memoryWorkflowStore, ad as postgresQueueStore, ae as queueDashboardSnapshot, af as queueStorageConfig, ag as redisQueueStore, ah as renderQueueDashboard, ai as runQueueDaemon, aj as runWorker, sqliteQueueSchema, sqliteQueueStore, ak as subjectQueue, al as testQueue, am as withOutbox } from './sqlite.js'; +import '@wrnexus/core'; +import '@wrnexus/db'; +import '@wrnexus/rpc'; ``` --- @@ -12352,7 +11171,26 @@ declare function createTimeline(steps: TimelineStep[], options?: { frame?: (callback: () => void) => unknown; }): AnimationTimeline; -export { type AnimationTimeline, type Cleanup, type HistorySignal, type ReactiveContext, type ReactiveScope, type ReadonlySignal, type Resource, type ResourceOptions, type ResourceStatus, type Signal, type Subscriber, type TimelineStep, type Unsubscribe, type UrlStateOptions, type WatchOptions, batch, computed, createContextProvider, createScope, createTimeline, effect, historySignal, mountPortal, resource, signal, transition, untrack, urlSignal, watch }; +interface FormState> { + values: Signal; + errors: Signal>>; + submitting: Signal; + dirty: ReadonlySignal; + field(name: K): { + value: T[K]; + onInput(payload: { + value?: unknown; + checked?: boolean; + }): void; + }; + set(name: K, value: T[K]): void; + reset(next?: T): void; + validate(): Promise; + submit(operation: (values: T) => R | Promise): Promise; +} +declare function useForm>(initial: T, validator?: (values: T) => Partial> | Promise>>): FormState; + +export { type AnimationTimeline, type Cleanup, type FormState, type HistorySignal, type ReactiveContext, type ReactiveScope, type ReadonlySignal, type Resource, type ResourceOptions, type ResourceStatus, type Signal, type Subscriber, type TimelineStep, type Unsubscribe, type UrlStateOptions, type WatchOptions, batch, computed, createContextProvider, createScope, createTimeline, effect, historySignal, mountPortal, resource, signal, transition, untrack, urlSignal, useForm, watch }; ``` --- @@ -12533,7 +11371,7 @@ interface BrowserRoomConnection { close(): void; } interface WrnexusRealtimeWindow extends Window { - wire?: { + wrn?: { room?: (name: string, query?: string) => BrowserRoomConnection; }; } @@ -12911,6 +11749,8 @@ interface Router { authz: ComponentRef[]; /** Service implementations (`app/services/.ts`) mounted for inter-app calls. */ services: ComponentRef[]; + /** Background queues (`app/queues/.ts`) loaded and started with the server. */ + queues?: ComponentRef[]; matchPage(pathname: string): RouteMatch | null; matchApi(pathname: string): RouteMatch | null; matchRealtime(pathname: string): RouteMatch | null; @@ -13124,14 +11964,14 @@ declare class ServiceError extends Error { /** * `retryable` defaults to the code-derived value for callers that * construct a `ServiceError` directly. Pass it explicitly when relaying a - * wire result: the transport already computed the authoritative value + * wrn result: the transport already computed the authoritative value * (e.g. a bounded HTTP-status check), and recomputing it here from the * code alone would silently flip it — `RPC_TRANSPORT` derives to `true`, * even for a non-retryable 403. */ constructor(code: string, message: string, retryable?: boolean); /** - * Convert to a wire result. The message is replaced unless explicitly + * Convert to a wrn result. The message is replaced unless explicitly * exposed: a handler's error text routinely names tables, hosts, or * credentials, and this value crosses an app boundary. */ @@ -13502,7 +12342,7 @@ const html = renderDocument({ }, url: new URL("https://acme.example/about"), body: "

    About Us

    ", - scripts: ["/_wire/runtime.js", "/_wire/islands/about.js"], + scripts: ["/_wrn/runtime.js", "/_wrn/islands/about.js"], htmlAttrs: ' data-theme="dark"', }); @@ -13728,16 +12568,26 @@ other arrays intentionally replace earlier values. Cycles and missing/invalid entries fail with stable `WRN-CONFIG-LAYER-*` diagnostics. `wrnexus config --explain` lists every resolved layer source. -> Global CSS bundling, the `--wire-*` design-token theme system, and the `wrnexus.config.ts` app-config loader for WrNexus apps. +> Global CSS bundling, the `--wrn-*` design-token theme system, and the `wrnexus.config.ts` app-config loader for WrNexus apps. Part of the **WrNexus** framework — an SSR-first, Bun-native full-stack web framework. ## Overview +### Production CSS inlining + +`styles.inlineMaxBytes` controls the maximum uncompressed size of the combined +production stylesheet to embed in the document. The default is 4096 bytes; `0` +disables inlining. A measured first-visit optimization can use, for example, +`styles: { inlineMaxBytes: 128 * 1024 }`. Larger limits remove a blocking stylesheet +request but repeat the CSS in each HTML response. Stylesheets containing relative +asset URLs stay external so their URL base does not change. Theme switching and +the separately served stylesheet remain available. + This package owns three server-side concerns that shape every page a WrNexus app renders: 1. **Global stylesheet pipeline** — finds `app/styles/global.css` (or aggregates `app/styles/*.css`), bundles it with Bun's CSS bundler (which resolves `@import`, including from `node_modules`), and produces one stylesheet that is ``ed into every page's ``. Because it is a plain global sheet, it styles server-rendered markup and hydrated client islands identically. A custom `process` hook lets you swap in Tailwind / PostCSS / Sass. -2. **Theme system** — design tokens exposed as CSS custom properties (`--wire-`), with built-in `light`/`dark` sets, deep-merged user overrides, an SSR `` render (no flash), and a tiny client runtime to toggle/persist the choice. +2. **Theme system** — design tokens exposed as CSS custom properties (`--wrn-`), with built-in `light`/`dark` sets, deep-merged user overrides, an SSR `` render (no flash), and a tiny client runtime to toggle/persist the choice. 3. **App config** — loads `wrnexus.config.ts` (the `AppConfig` type), applies named profile overrides, and loads the `.env` cascade. It runs server-side / at build time. Reach for it when configuring an app, defining themes, or customising how global CSS is produced. @@ -13818,7 +12668,7 @@ interface StyleProcessContext { | Export | Type / Signature | Purpose | | -------------------- | -------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | | `DEFAULT_THEMES` | `Record` | Built-in `light` and `dark` token maps. | -| `THEME_COOKIE` | `"wire-theme"` | Cookie the resolved theme is read from / persisted to. | +| `THEME_COOKIE` | `"wrn-theme"` | Cookie the resolved theme is read from / persisted to. | | `THEME_CSS_HREF` | `"/__wrnexus/theme.css"` | URL the generated theme stylesheet is served at. | | `THEME_JS_HREF` | `"/__wrnexus/theme.js"` | URL the client theme runtime is served at. | | `resolveThemeConfig` | `(config?: ThemeConfig) => ResolvedTheme` | Deep-merge the user's `theme` config over the defaults; pick the default theme (config's `default` if valid, else `dark`, else the first). | @@ -13826,7 +12676,7 @@ interface StyleProcessContext { | `renderThemeCss` | `(theme: ResolvedTheme) => string` | Generate the theme stylesheet: a `:root{…}` default plus one `[data-theme=""]{…}` block per theme. | | `renderThemeRuntime` | `(theme: ResolvedTheme) => string` | Generate the client runtime (see below). | -Tokens are emitted as `--wire-` custom properties, **except** the reserved key `color-scheme`, which is emitted as the native `color-scheme` CSS property so form controls and scrollbars match the theme. +Tokens are emitted as `--wrn-` custom properties, **except** the reserved key `color-scheme`, which is emitted as the native `color-scheme` CSS property so form controls and scrollbars match the theme. `ThemeConfig` / `ThemeTokens` / `ResolvedTheme`: @@ -13871,7 +12721,36 @@ theme: { } ``` -The client runtime (`renderThemeRuntime`) exposes `window.wireTheme` with `{ get, set, toggle, bind, themes }`, wires up any `[data-wire-theme-toggle]` and `[data-wire-theme-set]` elements on load, and persists the choice to the `wire-theme` cookie (`max-age` 1 year, `samesite=lax`). `toggle()` cycles through the configured theme names in order. +The client runtime (`renderThemeRuntime`) exposes `window.wrnTheme` with `{ get, set, toggle, bind, themes }`, connects up any `[data-wrn-theme-toggle]` and `[data-wrn-theme-set]` elements on load, and persists the choice to the `wrn-theme` cookie (`max-age` 1 year, `samesite=lax`). `toggle()` cycles through the configured theme names in order. + +### Shared browser cookies + +Set one cookie policy for theme, accent, language, and application cookies: + +```ts +export default { + cookies: { + defaults: { + domain: "example.com", + path: "/", + maxAge: 31_536_000, + sameSite: "Lax", + secure: true, + }, + language: { maxAge: 2_592_000 }, + }, +} satisfies AppConfig; +``` + +The theme, accent, and language switchers use this policy automatically. Client +functions can use the same resolved policy for other values: + +```ts +window.wrnCookies.set("dashboard-view", "compact"); +window.wrnCookies.set("locale-preview", "hi", "language"); +const value = window.wrnCookies.get("dashboard-view"); +window.wrnCookies.remove("dashboard-view"); +``` ## Usage @@ -13959,17 +12838,17 @@ In templates, consume tokens via the custom properties: ```css .card { - background: var(--wire-color-surface); - color: var(--wire-color-text); - border: 1px solid var(--wire-color-border); - border-radius: var(--wire-radius); - box-shadow: var(--wire-shadow-1); + background: var(--wrn-color-surface); + color: var(--wrn-color-text); + border: 1px solid var(--wrn-color-border); + border-radius: var(--wrn-radius); + box-shadow: var(--wrn-shadow-1); } ``` ```html - - + + ``` ## Requirements / Notes @@ -13977,7 +12856,7 @@ In templates, consume tokens via the custom properties: - **Bun-only.** `bundleCss` uses `Bun.build`'s CSS bundler for `@import` resolution, nesting, and minification. Node is not supported. - Config and env loading use `node:fs` / `node:path` / `node:url` and read from `process.env`. - Peer package: `@wrnexus/core` supplies the `SeoConfig` and `SecurityConfig` types referenced by `AppConfig`. -- The bundled global stylesheet, the theme stylesheet (`THEME_CSS_HREF`), and the theme runtime (`THEME_JS_HREF`) are wired into pages by the framework's server; this package only produces their contents. +- The bundled global stylesheet, the theme stylesheet (`THEME_CSS_HREF`), and the theme runtime (`THEME_JS_HREF`) are connected into pages by the framework's server; this package only produces their contents. ### Exported TypeScript declarations @@ -13989,7 +12868,7 @@ import { StorageConfig } from '@wrnexus/uploader'; /** * Theme system - design tokens that work SSR and client-side. * - * Tokens are plain CSS custom properties (`--wire-`) so they cascade and + * Tokens are plain CSS custom properties (`--wrn-`) so they cascade and * can be overridden by user CSS. Each theme is a flat token map; the framework * ships default `light`/`dark` sets and the user's config deep-merges over them. * @@ -13999,7 +12878,7 @@ import { StorageConfig } from '@wrnexus/uploader'; * emitted as the native CSS property instead of a custom property. */ type ThemeSemanticColor = "primary" | "secondary" | "info" | "success" | "warning" | "danger" | "error"; -type ThemeToken = "color-scheme" | "color-bg" | "color-background" | "color-foreground" | "color-surface" | "color-surface-2" | "color-surface-raised" | "color-surface-muted" | "color-surface-soft" | "color-text" | "color-text-muted" | "color-text-subtle" | "color-muted" | "color-border" | "color-border-strong" | "color-code-background" | "color-code-surface" | "color-code-text" | "color-code-muted" | "color-code-border" | `color-${ThemeSemanticColor}` | `color-${ThemeSemanticColor}-${"hover" | "active" | "contrast" | "soft" | "muted" | "text"}` | `color-on-${"primary" | "secondary"}` | "radius" | "radius-sm" | "shadow-1" | "shadow-sm" | "shadow-md" | "shadow-lg" | "space-section" | "space-section-sm" | "container-max" | "font-sans"; +type ThemeToken = "color-scheme" | "color-bg" | "color-background" | "color-foreground" | "color-surface" | "color-surface-2" | "color-surface-raised" | "color-surface-muted" | "color-surface-soft" | "color-text" | "color-text-muted" | "color-text-subtle" | "color-muted" | "color-border" | "color-border-strong" | "color-code-background" | "color-code-surface" | "color-code-text" | "color-code-muted" | "color-code-border" | `color-${ThemeSemanticColor}` | `color-${ThemeSemanticColor}-${"hover" | "active" | "contrast" | "soft" | "muted" | "text"}` | `color-on-${"primary" | "secondary"}` | "radius" | "radius-sm" | "radius-md" | "radius-lg" | "control-height-sm" | "control-height" | "control-height-lg" | "space-panel" | "font-size-ui" | "shadow-1" | "shadow-2" | "shadow-3" | "shadow-sm" | "shadow-md" | "shadow-lg" | "space-section" | "space-section-sm" | "container-max" | "font-sans"; /** Known tokens get autocomplete while applications may add namespaced custom tokens. */ type ThemeTokens = Partial> & Record; declare function defineThemeTokens(tokens: T): T; @@ -14021,7 +12900,7 @@ interface CustomThemePalette { } interface ThemeAccentConfig { /** - * Accent used when no `wire-accent` cookie is present. + * Accent used when no `wrn-accent` cookie is present. * * - Omitted: use the named `palette`, or `blue` when no palette is configured. * - `false`: keep the configured base palette until the user explicitly picks an accent. @@ -14029,13 +12908,49 @@ interface ThemeAccentConfig { default?: ThemePaletteName | false; /** Runtime-selectable accent names. Defaults to every built-in THEME_PALETTE. */ options?: ThemePaletteName[]; + /** Cookie scope used to persist the selected accent across related applications. */ + cookie?: ThemeCookieConfig; } +interface ThemeCookieConfig { + /** Parent domain shared by related applications, for example `localhost` or `.example.com`. */ + domain?: string; + /** Cookie path. Defaults to `/`. */ + path?: string; + /** SameSite policy. Defaults to `Lax`. */ + sameSite?: "Strict" | "Lax" | "None"; + /** Force or disable Secure. When omitted it follows the current protocol. */ + secure?: boolean; + /** Cookie lifetime in seconds. Defaults to one year. */ + maxAge?: number; +} +type BrowserCookieOptions = ThemeCookieConfig; +/** Shared browser-cookie policy with optional per-preference overrides. */ +interface BrowserCookiesConfig { + defaults?: BrowserCookieOptions; + theme?: BrowserCookieOptions; + accent?: BrowserCookieOptions; + language?: BrowserCookieOptions; +} +type BrowserCookiePreference = "theme" | "accent" | "language"; +interface BrowserCookieApi { + readonly config: BrowserCookiesConfig; + get(name: string): string | null; + options(preference?: BrowserCookiePreference | BrowserCookieOptions, override?: BrowserCookieOptions): BrowserCookieOptions; + set(name: string, value: string, preference?: BrowserCookiePreference | BrowserCookieOptions, override?: BrowserCookieOptions): void; + remove(name: string, preference?: BrowserCookiePreference | BrowserCookieOptions, override?: BrowserCookieOptions): void; +} +declare global { + interface Window { + wrnCookies: BrowserCookieApi; + } +} +declare function resolveBrowserCookieOptions(config: BrowserCookiesConfig | undefined, preference: BrowserCookiePreference, override?: BrowserCookieOptions): BrowserCookieOptions; interface ThemeConfig { /** Built-in palette name, or a complete custom semantic color palette. */ palette?: ThemePaletteName | CustomThemePalette; /** Runtime accent/palette switcher configuration. */ accent?: ThemeAccentConfig; - /** Name of the theme used when no `wire-theme` cookie is present. */ + /** Name of the theme used when no `wrn-theme` cookie is present. */ default?: string; /** Named token maps. Deep-merged over the framework's built-in light/dark. */ themes?: Record; @@ -14046,10 +12961,13 @@ interface ResolvedTheme { themes: Record; defaultAccent?: ThemePaletteName; accentNames: ThemePaletteName[]; + accentCookie?: ThemeCookieConfig; + themeCookie?: ThemeCookieConfig; + cookies?: BrowserCookiesConfig; } /** Cookies used by the SSR renderer and client runtime. */ -declare const THEME_COOKIE = "wire-theme"; -declare const ACCENT_COOKIE = "wire-accent"; +declare const THEME_COOKIE = "wrn-theme"; +declare const ACCENT_COOKIE = "wrn-accent"; declare const THEME_CSS_HREF = "/__wrnexus/theme.css"; declare const THEME_CSS_PREFIX = "/__wrnexus/theme/"; declare const THEME_JS_HREF = "/__wrnexus/theme.js"; @@ -14061,7 +12979,7 @@ declare const THEME_PALETTES: Record; /** Built-in themes so components have tokens out of the box. */ declare const DEFAULT_THEMES: Record; /** Merge the user's theme config over the built-in defaults. */ -declare function resolveThemeConfig(config?: ThemeConfig): ResolvedTheme; +declare function resolveThemeConfig(config?: ThemeConfig, cookies?: BrowserCookiesConfig): ResolvedTheme; /** Pick a valid theme name from a cookie value, falling back to the default. */ declare function resolveThemeName(cookieValue: string | undefined, theme: ResolvedTheme): string; /** Pick a valid accent name from a cookie value, falling back to the configured default. */ @@ -14079,8 +12997,8 @@ declare function renderActiveThemeCss(theme: ResolvedTheme, themeName: string, a */ declare function renderThemeCss(theme: ResolvedTheme): string; /** - * Generate the client theme runtime. It exposes `window.wireTheme` and - * `window.wireAccent`, and binds theme/accent controls. + * Generate the client theme runtime. It exposes `window.wrnTheme` and + * `window.wrnAccent`, and binds theme/accent controls. * * The runtime changes only data attributes and cookies. It never writes inline * CSS variables and never uses localStorage, so CSS and SSR remain the single @@ -14162,26 +13080,6 @@ declare function fontCspSources(fonts?: FontConfig): { font: string[]; }; -declare const CURRENT_COMPATIBILITY_DATE = "2026-08-02"; -declare const CURRENT_FRAMEWORK_BEHAVIOUR = 1; -interface CompatibilityPolicy { - compatibilityDate?: string; - frameworkBehaviour?: number; -} -interface CompatibilityReport { - configuredDate?: string; - effectiveDate: string; - currentDate: string; - configuredBehaviour?: number; - effectiveBehaviour: number; - currentBehaviour: number; - needsUpgrade: boolean; - future: boolean; - messages: string[]; -} -declare function isCompatibilityDate(value: string): boolean; -declare function resolveCompatibility(policy: CompatibilityPolicy): CompatibilityReport; - /** * App configuration loader (`wrnexus.config.ts`). * @@ -14210,6 +13108,8 @@ interface StylesConfig { entry?: string; /** Include the complete @wrnexus/ui component catalog stylesheet. Default true. */ includeUi?: boolean; + /** Maximum uncompressed production CSS bytes to inline in the document. Default 4096; 0 disables inlining. Larger limits trade repeat HTML bytes for one fewer blocking request. */ + inlineMaxBytes?: number; /** * Optional custom processor. Return the final CSS string. Use this to run * Tailwind, PostCSS, Sass, etc. When omitted, the built-in Bun CSS bundler is @@ -14383,20 +13283,11 @@ interface TypesConfig { generateDeclarations?: boolean; globalTypes?: string; } -interface FunctionsConfig { - legacyDefaultRuntime?: "current" | "client" | "server" | "shared"; -} interface StoresConfig { strictMutations?: boolean; persistence?: boolean; } -interface CompatibilityConfig { - legacyEmit?: boolean; - legacyEventProps?: boolean; - legacyComponentDiscovery?: boolean; - stringLayouts?: boolean; -} -interface AppConfig extends CompatibilityPolicy { +interface AppConfig { /** Ordered reusable configuration layers; the application always has final precedence. */ extends?: string | string[]; /** Compiler/dev/build plugins, resolved in deterministic pre/normal/post order. */ @@ -14410,12 +13301,8 @@ interface AppConfig extends CompatibilityPolicy { imports?: ImportsConfig; /** TypeScript-backed .wrn type checking and declaration generation. */ types?: TypesConfig; - /** Legacy function runtime behavior for existing applications. */ - functions?: FunctionsConfig; /** Typed global/page store behavior. */ stores?: StoresConfig; - /** Temporary v0.5 syntax compatibility switches. */ - compatibility?: CompatibilityConfig; /** Opt-in APIs that are not yet covered by stable compatibility guarantees. */ experimental?: ExperimentalConfig; /** Route and asset budgets plus build analyzer behavior. */ @@ -14449,6 +13336,8 @@ interface AppConfig extends CompatibilityPolicy { fonts?: FontConfig; /** Design-token themes (deep-merged over the built-in light/dark). */ theme?: ThemeConfig; + /** Shared client cookie policy used by theme, accent, language, and window.wrnCookies. */ + cookies?: BrowserCookiesConfig; /** i18n: default language + supported locales (strings live in app/locales/*.json). */ i18n?: { default?: string; @@ -14459,6 +13348,7 @@ interface AppConfig extends CompatibilityPolicy { cookie?: { name?: string; maxAge?: number; + domain?: string; path?: string; sameSite?: "Strict" | "Lax" | "None"; secure?: boolean; @@ -14470,6 +13360,34 @@ interface AppConfig extends CompatibilityPolicy { driver: "sqlite" | "postgres" | "mysql" | "mongo"; url: string; }; + /** Background-job persistence. Defaults to durable `.wrnexus/queue.sqlite`. */ + queue?: { + storage?: "sqlite" | "database" | "memory"; + databaseName?: string; + table?: string; + dashboard?: { + enabled?: boolean; + path?: string; + permission?: string; + }; + }; + /** Driver-neutral mail defaults consumed by @wrnexus/mail/application drivers. */ + mail?: { + from?: string; + queue?: string | boolean; + sandbox?: { + enabled?: boolean; + allowlist?: string[]; + }; + }; + /** Payment gateway configuration consumed by @wrnexus/payment. */ + payment?: { + default: string; + currency?: string; + sandbox?: boolean; + databaseName?: string; + gateways?: Record>; + }; /** * File-upload storage. Declare named stores (local dir or S3-compatible), * upload with `handleUpload`/`upload` from `@wrnexus/uploader`, and serve @@ -14505,6 +13423,13 @@ interface AppConfig extends CompatibilityPolicy { */ profiles?: Record>>; } +/** User-authored configuration; retained as an explicit name for API clarity. */ +type AppConfigInput = AppConfig; +/** Configuration after profile/layer resolution. Required input fields stay required. */ +type ResolvedAppConfig = Omit & Omit & { + readonly extends?: undefined; + readonly profiles?: undefined; +}; /** * Resolve the active profile name: explicit argument > `WRNEXUS_PROFILE` env var * > a mode-based default ("production" in prod, else "development"). @@ -14521,7 +13446,7 @@ declare function resolveConfigLayers(appRoot: string, application: AppConfig): P /** Load the raw `wrnexus.config.*` (with the `profiles` map intact), or `{}`. */ declare function loadRawConfig(appRoot: string): Promise; /** Load `wrnexus.config.*`, applying the active profile's overrides. */ -declare function loadAppConfig(appRoot: string, profile?: string): Promise; +declare function loadAppConfig(appRoot: string, profile?: string): Promise; /** * Load the `.env` cascade for a profile into `process.env`, WITHOUT clobbering * variables already set in the real environment (which always win). Order, low @@ -14534,7 +13459,7 @@ interface ConfigIssue { severity: "error" | "warning"; message: string; } -declare function defineConfig(config: AppConfig): AppConfig; +declare function defineConfig(config: T): T; declare function validateAppConfig(config: AppConfig): ConfigIssue[]; interface ExplainedConfig { profile: string; @@ -14577,7 +13502,7 @@ interface CssTokenAudit { unused: string[]; } /** Audit framework design-token declarations and var() references. */ -declare function auditWireTokens(css: string): CssTokenAudit; +declare function auditWrnTokens(css: string): CssTokenAudit; interface StyleSource { path: string; reason?: string; @@ -14617,7 +13542,7 @@ declare function auditCssPerformance(source: string): CssPerformanceAuditIssue[] */ declare function renderStyles(ctx: StyleProcessContext, styles?: StylesConfig): Promise; -export { ACCENT_COOKIE, type AppConfig, type BuildConfig, CURRENT_COMPATIBILITY_DATE, CURRENT_FRAMEWORK_BEHAVIOUR, type CompatibilityPolicy, type CompatibilityReport, type ConfigIssue, type ContrastResult, type CssPerformanceAuditIssue, type CssTokenAudit, type CustomThemePalette, DEFAULT_THEMES, type DevToolbarConfig, type ExperimentalConfig, type ExplainedConfig, type FontConfig, type FontDisplay, type GoogleFont, type LocalFontFace, type MobileConfig, type Mode, type NavigationConfig, type ObservabilityConfig, type PerformanceConfig, type PwaConfig, type ResolvedConfigLayers, type ResolvedTheme, type StyleProcessContext, type StyleSource, type StylesConfig, type Mode as StylesMode, THEME_COOKIE, THEME_CSS_HREF, THEME_CSS_PREFIX, THEME_JS_HREF, THEME_PALETTES, THEME_PALETTE_NAMES, type TenancyConfig, type ThemeAccentConfig, type ThemeConfig, type ThemePaletteName, type ThemeSemanticColor, type ThemeToken, type ThemeTokens, activeThemeCssHref, auditCssPerformance, auditWireTokens, bundleCss, contrast, defineConfig, defineThemeTokens, explainAppConfig, findStyleEntry, fontCspSources, headToString, isCompatibilityDate, loadAppConfig, loadEnv, loadRawConfig, normalizeStyleSources, renderActiveThemeCss, renderFontHead, renderProductionFontHead, renderStyles, renderThemeCss, renderThemeRuntime, resolveAccentName, resolveCompatibility, resolveConfigLayers, resolveProfile, resolveThemeConfig, resolveThemeName, tailwindSourceDirectives, themeVar, validateAppConfig }; +export { ACCENT_COOKIE, type AppConfig, type AppConfigInput, type BrowserCookieApi, type BrowserCookieOptions, type BrowserCookiePreference, type BrowserCookiesConfig, type BuildConfig, type ConfigIssue, type ContrastResult, type CssPerformanceAuditIssue, type CssTokenAudit, type CustomThemePalette, DEFAULT_THEMES, type DevToolbarConfig, type ExperimentalConfig, type ExplainedConfig, type FontConfig, type FontDisplay, type GoogleFont, type LocalFontFace, type MobileConfig, type Mode, type NavigationConfig, type ObservabilityConfig, type PerformanceConfig, type PwaConfig, type ResolvedAppConfig, type ResolvedConfigLayers, type ResolvedTheme, type StyleProcessContext, type StyleSource, type StylesConfig, type Mode as StylesMode, THEME_COOKIE, THEME_CSS_HREF, THEME_CSS_PREFIX, THEME_JS_HREF, THEME_PALETTES, THEME_PALETTE_NAMES, type TenancyConfig, type ThemeAccentConfig, type ThemeConfig, type ThemeCookieConfig, type ThemePaletteName, type ThemeSemanticColor, type ThemeToken, type ThemeTokens, activeThemeCssHref, auditCssPerformance, auditWrnTokens, bundleCss, contrast, defineConfig, defineThemeTokens, explainAppConfig, findStyleEntry, fontCspSources, headToString, loadAppConfig, loadEnv, loadRawConfig, normalizeStyleSources, renderActiveThemeCss, renderFontHead, renderProductionFontHead, renderStyles, renderThemeCss, renderThemeRuntime, resolveAccentName, resolveBrowserCookieOptions, resolveConfigLayers, resolveProfile, resolveThemeConfig, resolveThemeName, tailwindSourceDirectives, themeVar, validateAppConfig }; ``` --- @@ -14637,14 +13562,22 @@ See `docs/WRN-LANGUAGE-SPEC-1.0.md` in the WRNexusJS repository. ### Exported TypeScript declarations ```ts -export { LexError, Lexer } from './tokenizer.js'; +export { LexError, Lexer, skipLiteralOrComment } from './tokenizer.js'; export { FormatWrnOptions, formatWrn } from './formatter.js'; -export { A as ActionBlock, a as ApiBlock, b as Attr, C as ComputedDecl, D as DataApiBlock, c as DataMode, E as EffectBlock, d as EventDecl, F as FunctionParameterDecl, e as FunctionRuntime, L as LifecycleBlock, f as LoadBlock, M as ModeFunctionsBlock, O as OutputDecl, P as PageAst, g as ParseError, h as PersistDecl, i as PropDecl, R as RealtimeBlock, j as RealtimeHandler, k as RuntimeFunctionDecl, S as SeoBlock, l as StateDecl, m as StateRuntime, n as StoreKind, o as StoreLifecycleDecl, p as StructuredImportDecl, V as VOID_ELEMENTS, q as ViewNode, W as WatchBlock, r as parse, s as parseComputedDeclarations, t as parseHtmlView, u as parseOutputs, v as parsePersist, w as parseRuntimeFunctions, x as parseStateDeclarations, y as parseStoreLifecycle, z as parseStructuredImports, B as stripRuntimeFunctionModifiers } from './parser-CTLO4mcT.js'; +export { A as ActionBlock, a as ApiBlock, b as Attr, C as ComputedDecl, D as DataApiBlock, c as DataMode, E as EffectBlock, d as EventDecl, F as FunctionParameterDecl, e as FunctionRuntime, L as LifecycleBlock, f as LoadBlock, M as ModeFunctionsBlock, O as OutputDecl, P as PageAst, g as ParseError, h as PersistDecl, i as PropDecl, R as RealtimeBlock, j as RealtimeHandler, k as RuntimeFunctionDecl, S as SeoBlock, l as StateDecl, m as StateRuntime, n as StoreKind, o as StoreLifecycleDecl, p as StructuredImportDecl, V as VOID_ELEMENTS, q as ViewNode, W as WatchBlock, r as parse, s as parseComputedDeclarations, t as parseHtmlView, u as parseOutputs, v as parsePersist, w as parseRuntimeFunctions, x as parseStateDeclarations, y as parseStoreLifecycle, z as parseStructuredImports, B as stripRuntimeFunctionModifiers } from './parser-DI-7cM1V.js'; export { RuntimeType, eraseFunctionTypes, inferredRuntimeType, runtimeTypeOf, validateTypedInitializer } from './types.js'; import { WrnDiagnostic } from './diagnostics.js'; export { DiagnoseOptions, WrnDiagnosticSeverity, WrnSourcePosition, assertValidAst, classifyParseError, containsReadonlyPropMutation, diagnose, diagnosticFromError, formatDiagnostic, isHydrationStrategy, isRuntimeTarget, positionAt } from './diagnostics.js'; export { WRN_DIAGNOSTIC_CODES, WRN_HYDRATION_STRATEGIES, WRN_LANGUAGE_VERSION, WRN_ROOT_KINDS, WRN_ROOT_MEMBERS, WRN_RUNTIME_TARGETS, WrnHydrationStrategy, WrnRootKind, WrnRootMember, WrnRuntimeTarget } from './spec.js'; +interface InterpolationSegment { + expression: string; + start: number; + end: number; +} +/** Extract top-level `{...}` expressions while preserving nested object/array literals. */ +declare function extractInterpolations(value: string): InterpolationSegment[]; + /** Current stable syntax contract. Bump only when parsers/codegen need migration. */ declare const WRN_SYNTAX_VERSION: "0.4"; type WrnSyntaxFeature = "typed-declarations" | "layouts" | "server-client-blocks" | "effects" | "watch" | "lifecycle" | "embedded-api" | "realtime" | "runtime-markers"; @@ -14663,7 +13596,7 @@ declare function diagnosticSummary(diagnostics: readonly WrnDiagnostic[]): { }; declare function supportsSyntaxFeature(feature: string): feature is WrnSyntaxFeature; -export { type SourceRange, WRN_SYNTAX_FEATURES, WRN_SYNTAX_VERSION, WrnDiagnostic, type WrnSyntaxFeature, createSourceRange, diagnosticSummary, sliceSource, supportsSyntaxFeature }; +export { type InterpolationSegment, type SourceRange, WRN_SYNTAX_FEATURES, WRN_SYNTAX_VERSION, WrnDiagnostic, type WrnSyntaxFeature, createSourceRange, diagnosticSummary, extractInterpolations, sliceSource, supportsSyntaxFeature }; ``` --- @@ -14842,18 +13775,33 @@ test("health endpoint", async () => { ### Exported TypeScript declarations ```ts -import { ProblemDetails, Context } from '@wrnexus/core'; +import { Context, ProblemDetails } from '@wrnexus/core'; export { createContext } from '@wrnexus/core'; export { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, mock, spyOn, test } from 'bun:test'; interface TestRequestOptions extends Omit { body?: BodyInit | Record | URLSearchParams | FormData | null; baseUrl?: string; + params?: Record; + user?: unknown; + locals?: Record; } /** Build a web-standard Request with convenient JSON/FormData handling. */ declare function testRequest(path?: string, options?: TestRequestOptions): Request; /** Create a complete Context suitable for middleware and route unit tests. */ declare function testContext(path?: string, options?: TestRequestOptions): Context; +/** Preferred descriptive alias for testContext(). */ +declare const createTestContext: typeof testContext; +/** Fluent, Bun-compatible fetch mock (including Bun.fetch.preconnect). */ +type FetchMock = typeof fetch & { + readonly calls: ReadonlyArray<{ + input: string | URL | Request; + init?: RequestInit; + }>; + respondOnce(response: Response | (() => Response | Promise)): FetchMock; + reset(): void; +}; +declare function createFetchMock(): FetchMock; interface JsonResponse { response: Response; body: T; @@ -14913,6 +13861,29 @@ declare function captureBrowserArtifacts(page: BrowserArtifactPage, testName: st trace?: string; }>; +interface MutationCase { + name: string; + value: T; +} +interface MutationReport { + baseline: O; + killed: string[]; + survived: string[]; +} +interface DetectMutationsOptions { + baseline: T; + mutations: Array>; + exercise(value: T): O | Promise; + equivalent?(left: O, right: O): boolean; +} +/** + * Run the same behavioural probe against a baseline and explicit mutations. + * A mutation survives when the observable result is unchanged. The helper + * throws with every survivor by default, making it suitable for an ordinary + * Bun test and CI without a second runner or source-rewriting process. + */ +declare function detectMutations(options: DetectMutationsOptions): Promise>; + /** * @wrnexus/test — testing utilities for WrNexus apps. Runs on `bun test` (via * `wrnexus test`). Import everything from one place: @@ -14967,8 +13938,10 @@ interface HarnessOptions { * up your test database/env. Remember to `await app.close()`. */ declare function createHarness(projectRoot: string, options?: HarnessOptions): Promise; +/** Preferred full-stack name; retained alongside createHarness for compatibility. */ +declare const createTestApp: typeof createHarness; -export { type BrowserArtifactPage, type Deferred, type Harness, type HarnessOptions, type JsonResponse, MemoryCookieJar, type TestRequestOptions, type TransactionalDatabase, type WaitForOptions, callRoute, captureBrowserArtifacts, createFactory, createHarness, deferred, expectProblem, mountHtml, readJsonResponse, renderComponent, testContext, testRequest, waitFor, withDatabaseRollback }; +export { type BrowserArtifactPage, type Deferred, type DetectMutationsOptions, type FetchMock, type Harness, type HarnessOptions, type JsonResponse, MemoryCookieJar, type MutationCase, type MutationReport, type TestRequestOptions, type TransactionalDatabase, type WaitForOptions, callRoute, captureBrowserArtifacts, createFactory, createFetchMock, createHarness, createTestApp, createTestContext, deferred, detectMutations, expectProblem, mountHtml, readJsonResponse, renderComponent, testContext, testRequest, waitFor, withDatabaseRollback }; ``` --- @@ -15199,6 +14172,8 @@ Static type checking for `.wrn` declarations, props, state, outputs, functions, The package is compiler tooling rather than a browser UI package, so its public kit consists of programmatic typecheck helpers and diagnostics. +View attribute `{t:key}` segments are translation markers, not TypeScript expressions. Ordinary expressions in the same attribute remain typechecked. Inline event bindings accept statement lists, with `event.currentTarget` typed as the bound HTML/SVG element. Nullable DOM queries still require normal guards. + ### Exported TypeScript declarations ```ts @@ -15259,7 +14234,7 @@ Documentation URL: https://wrnexusjs.dev/packages/ui # @wrnexus/ui -> First-party Wire UI component library — a set of themeable `.wrn` components plus a single tokenized stylesheet. +> First-party WrNexus UI component library — a set of themeable `.wrn` components plus a single tokenized stylesheet. Part of the **WrNexus** framework — an SSR-first, Bun-native full-stack web framework. @@ -15270,11 +14245,11 @@ controls, and feedback UI) together with one themeable stylesheet, `ui.css`. The components are **auto-discovered** by the framework router — you don't import them in code. Once the package's component directory is on the router's scan path, you mount any component in a page with `data-component=""`. Every visual is -driven by `var(--wire-*)` theme tokens, so components restyle instantly when the +driven by `var(--wrn-*)` theme tokens, so components restyle instantly when the theme changes. The tiny JS surface (`src/index.ts`) exists only so the toolchain (CLI build + dev server) can locate the component directory and stylesheet. -The complete PDF-aligned catalog currently contains **85 components**. The +The complete catalog currently contains **102 components**. The generated `COMPONENTS.md` and `component-reference.json` files document every mount name, prop, inferred type, default/required status, slot, event, category, and source file directly from the packaged `.wrn` source. @@ -15289,7 +14264,7 @@ bun add @wrnexus/ui > (a read token in `~/.npmrc`). Requires **Bun** (Node is not supported). In practice you rarely install this directly: `@wrnexus/cli` and -`@wrnexus/dev-server` already depend on it and wire it into the router for you +`@wrnexus/dev-server` already depend on it and wrn it into the router for you (see [Auto-discovery](#auto-discovery)). ## Components @@ -15313,19 +14288,19 @@ element), and most render their body from either a named prop or the default slo ### Core / feedback -| Name | Purpose | Key props | -| -------------- | ---------------------------------------------------- | ----------------------------------------------------------------------------------------------- | -| `button` | Button | `label`, `variant` (`default`\|`primary`\|`danger`\|`ghost`), `size` (`sm`\|`md`\|`lg`), `type` | -| `input` | Text input | see source | -| `textarea` | Multi-line input | see source | -| `checkbox` | Checkbox | see source | -| `badge` | Small status badge | `label`, `variant` | -| `alert` | Callout box | `variant` (`info`\|`success`\|`danger`\|`warning`), `title`, `message` | -| `card` | Padded, bordered surface | `class` | -| `avatar` | User avatar | see source | -| `spinner` | Loading indicator | see source | -| `disclosure` | Expandable details/summary | see source | -| `theme-toggle` | Theme switch button (binds `data-wire-theme-toggle`) | `label` | +| Name | Purpose | Key props | +| -------------- | --------------------------------------------------- | ----------------------------------------------------------------------------------------------- | +| `button` | Button | `label`, `variant` (`default`\|`primary`\|`danger`\|`ghost`), `size` (`sm`\|`md`\|`lg`), `type` | +| `input` | Text input | see source | +| `textarea` | Multi-line input | see source | +| `checkbox` | Checkbox | see source | +| `badge` | Small status badge | `label`, `variant` | +| `alert` | Callout box | `variant` (`info`\|`success`\|`danger`\|`warning`), `title`, `message` | +| `card` | Padded, bordered surface | `class` | +| `avatar` | User avatar | see source | +| `spinner` | Loading indicator | see source | +| `disclosure` | Expandable details/summary | see source | +| `theme-toggle` | Theme switch button (binds `data-wrn-theme-toggle`) | `label` | ### Additional controls & data display @@ -15349,6 +14324,62 @@ the component directory at runtime. For the full catalog, see [`COMPONENTS.md`](./COMPONENTS.md). The machine-readable equivalent is exported as `@wrnexus/ui/component-reference.json`. +### Typed Navbar items + +Keep navigation data in a shared TypeScript module and validate it with the +package contract. `NavbarItem` is a discriminated union of `link`, `dropdown`, +and `mega`; a mega item accepts every `MegaMenu` layout option. + +```ts +import type { NavbarItem } from "@wrnexus/ui"; + +export const navigation = [ + { type: "link", label: "Pricing", href: "/pricing" }, + { + type: "dropdown", + label: "Company", + items: [ + { label: "About", href: "/about" }, + { label: "Contact", href: "/contact" }, + ], + }, + { + type: "mega", + label: "Products", + mega: { + variant: "icon-grid", + panelWidth: "2xl", + columnCount: 3, + rail: [{ label: "All products", href: "/products" }], + columns: [ + { + heading: "Work", + items: [ + { + label: "Projects", + href: "/products/projects", + icon: "icon-[lucide--folders]", + description: "Plan and deliver work", + badge: "New", + }, + ], + }, + ], + featured: { + title: "What's new", + actionLabel: "Explore", + actionHref: "/new", + }, + actionLabel: "View all products", + actionHref: "/products", + }, + }, +] satisfies NavbarItem[]; +``` + +Importing from `@wrnexus/ui/navigation` is also supported. Existing untyped +Navbar data using `children` remains accepted at runtime for migration. + ## API The JS module (`@wrnexus/ui`) exposes five helpers used by the build tooling to @@ -15359,7 +14390,7 @@ are `.wrn` files rendered server-side. | ------------------ | -------------------------- | ------------------------------------------------------------------------------------------ | | `uiComponentsDir` | `() => string` | Absolute path to the `.wrn` component directory (feed to `buildRouter`'s `componentDirs`). | | `uiCssPath` | `() => string` | Absolute path to `ui.css`. | -| `uiCss` | `() => string` | The `ui.css` file contents (all `.wire-*` classes, themed via tokens). | +| `uiCss` | `() => string` | The `ui.css` file contents (all `.wrn-*` classes, themed via tokens). | | `uiComponentNames` | `() => string[]` | Sorted list of declared built-in component names. | | `uiComponentPath` | `(name: string) => string` | Absolute source path for a declared component name or case-insensitive alias. | @@ -15385,9 +14416,9 @@ primitives. Applications can still use Tailwind independently in their own source files. The shared stylesheet gives all component boundaries consistent, GPU-friendly -entry and interaction motion. Override `--wire-motion-fast`, -`--wire-motion-base`, `--wire-motion-slow`, `--wire-ease-standard`, or -`--wire-ease-emphasized` to tune it. Hover lift is limited to precise pointing +entry and interaction motion. Override `--wrn-motion-fast`, +`--wrn-motion-base`, `--wrn-motion-slow`, `--wrn-ease-standard`, or +`--wrn-ease-emphasized` to tune it. Hover lift is limited to precise pointing devices and `prefers-reduced-motion` is honored automatically. ### Using the selected theme in application UI @@ -15398,21 +14429,21 @@ pages and custom `.wrn` components can use the same contract: ```css .account-card { - background: var(--wire-color-surface); - color: var(--wire-color-text); - border: 1px solid var(--wire-color-border); + background: var(--wrn-color-surface); + color: var(--wrn-color-text); + border: 1px solid var(--wrn-color-border); } .account-card__action { - background: var(--wire-color-primary); - color: var(--wire-color-primary-contrast); + background: var(--wrn-color-primary); + color: var(--wrn-color-primary-contrast); } ``` -Stable no-spacing helper classes are also available: `wire-bg-page`, -`wire-bg-surface`, `wire-bg-surface-2`, `wire-bg-primary`, `wire-bg-secondary`, -`wire-text`, `wire-text-muted`, `wire-text-primary`, `wire-text-success`, -`wire-text-warning`, `wire-text-danger`, and `wire-border`. +Stable no-spacing helper classes are also available: `wrn-bg-page`, +`wrn-bg-surface`, `wrn-bg-surface-2`, `wrn-bg-primary`, `wrn-bg-secondary`, +`wrn-text`, `wrn-text-muted`, `wrn-text-primary`, `wrn-text-success`, +`wrn-text-warning`, `wrn-text-danger`, and `wrn-border`. Tailwind-authored custom markup can continue using the palette families already used by packaged components. `indigo-*` and `violet-*` resolve to primary, @@ -15428,7 +14459,7 @@ The router scans extra `componentDirs` (in addition to the app's own `app/components`) and keys components by name. Library dirs are scanned **first** and `app/components` **last**, so an app component of the same name shadows the library's. The CLI build (`@wrnexus/cli`) and dev server (`@wrnexus/dev-server`) -both wire the UI directory in for you: +both wrn the UI directory in for you: ```ts import { buildRouter } from "@wrnexus/router"; @@ -15454,11 +14485,11 @@ attributes (other than `data-component`) become string props: Ways to customize the components, in increasing order of power: -1. **Theme tokens** — override CSS custom properties such as `--wire-color-primary`, - `--wire-color-surface`, `--wire-radius-sm`, etc. Every component style resolves - through `var(--wire-*)`, so changing a token restyles everything instantly +1. **Theme tokens** — override CSS custom properties such as `--wrn-color-primary`, + `--wrn-color-surface`, `--wrn-radius-sm`, etc. Every component style resolves + through `var(--wrn-*)`, so changing a token restyles everything instantly (including across theme switches). -2. **App CSS** — redefine a `.wire-*` class in your own stylesheet, which is loaded +2. **App CSS** — redefine a `.wrn-*` class in your own stylesheet, which is loaded after `ui.css` and therefore wins. 3. **`class` prop** — pass a `class` prop to a component; it is appended to the component's root element, letting you add per-instance classes without touching @@ -15476,12 +14507,12 @@ Ways to customize the components, in increasing order of power: [`@wrnexus/dev-server`](../dev-server) / built by [`@wrnexus/cli`](../cli). - Depends on [`@wrnexus/core`](../core) (`dependencies`). - `theme-toggle` relies on the framework's theme runtime, which binds the - `data-wire-theme-toggle` attribute — no per-component JS is required. + `data-wrn-theme-toggle` attribute — no per-component JS is required. ### Exported TypeScript declarations ```ts -export { } +export { MegaMenuColumn, MegaMenuDensity, MegaMenuFeatured, MegaMenuPanelAlign, MegaMenuPanelWidth, MegaMenuRailItem, MegaMenuVariant, NavbarAction, NavbarBrand, NavbarDropdownGroup, NavbarDropdownItem, NavbarItem, NavbarItemType, NavbarLinkItem, NavbarMegaMenuData, NavbarMegaMenuItem, NavigationLink } from './navigation.js'; ``` --- @@ -15850,7 +14881,7 @@ declare function serveFromStore(storeName?: string, opts?: { /** * Framework asset hook: serve PUBLIC local objects at * `/__wrnexus/uploads//`. Returns `null` for anything it doesn't - * own (unknown/private/S3-backed store) so the caller falls through. Wired into + * own (unknown/private/S3-backed store) so the caller falls through. Connected to * the dev + prod asset servers. */ declare function serveStoredFile(pathname: string): Promise; @@ -15860,7 +14891,7 @@ declare function serveStoredFile(pathname: string): Promise; * input, per-file progress bars, and success/failed states. Injected by * `collectScripts` only on pages that contain `data-uploader` (same mechanism as * `validate.js`). Self-contained: it injects its own themed stylesheet (using - * `--wire-*` tokens) and posts each file via XHR so upload progress is live. + * `--wrn-*` tokens) and posts each file via XHR so upload progress is live. * * Markup it enhances (also a valid no-JS `
    ` fallback if you wrap it): *
    ; * backticks and no ${...}, so it embeds safely in the exported template string. */ declare const UPLOAD_JS_HREF = "/__wrnexus/uploader.js"; -declare const UPLOAD_RUNTIME = "\n(function () {\n if (typeof document === \"undefined\") return;\n var CSRF_COOKIE = \"wire-csrf\";\n\n var CSS =\n \".wire-uploader{display:block}\" +\n \".wire-uploader-zone{display:flex;align-items:center;justify-content:center;text-align:center;\" +\n \"min-height:8rem;padding:1.25rem;border:2px dashed var(--wire-border,#cbd5e1);border-radius:12px;\" +\n \"background:var(--wire-surface,transparent);color:var(--wire-muted,#64748b);cursor:pointer;\" +\n \"transition:border-color .15s ease,background-color .15s ease;position:relative}\" +\n \".wire-uploader-zone:hover,.wire-uploader-zone:focus-visible{border-color:var(--wire-brand,#3f7dff);outline:none}\" +\n \".wire-uploader-zone.is-drag{border-color:var(--wire-brand,#3f7dff);background:color-mix(in oklab,var(--wire-brand,#3f7dff) 8%,transparent)}\" +\n \".wire-uploader-prompt{font-size:.9rem;pointer-events:none}\" +\n \".wire-uploader-input{position:absolute;inset:0;width:100%;height:100%;opacity:0;cursor:pointer}\" +\n \".wire-uploader-list{list-style:none;margin:.75rem 0 0;padding:0;display:flex;flex-direction:column;gap:.5rem}\" +\n \".wire-uploader-item{display:grid;grid-template-columns:1fr auto;gap:.15rem .75rem;align-items:center;\" +\n \"font-size:.82rem;padding:.5rem .7rem;border:1px solid var(--wire-border,#e2e8f0);border-radius:8px}\" +\n \".wire-uploader-name{font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--wire-text,#0f172a)}\" +\n \".wire-uploader-meta{color:var(--wire-muted,#94a3b8);font-variant-numeric:tabular-nums}\" +\n \".wire-uploader-bar{grid-column:1/-1;height:5px;border-radius:999px;background:var(--wire-border,#e2e8f0);overflow:hidden}\" +\n \".wire-uploader-fill{height:100%;width:0;border-radius:999px;background:var(--wire-brand,#3f7dff);transition:width .15s ease}\" +\n \".wire-uploader-status{grid-column:1/-1;font-size:.75rem;color:var(--wire-muted,#94a3b8);font-variant-numeric:tabular-nums}\" +\n \".wire-uploader-item.is-done .wire-uploader-fill{background:var(--wire-success,#16a34a)}\" +\n \".wire-uploader-item.is-done .wire-uploader-status{color:var(--wire-success,#16a34a)}\" +\n \".wire-uploader-item.is-error .wire-uploader-fill{background:var(--wire-danger,#dc2626)}\" +\n \".wire-uploader-item.is-error .wire-uploader-status{color:var(--wire-danger,#dc2626)}\";\n\n function injectCss() {\n if (document.getElementById(\"wire-uploader-css\")) return;\n var s = document.createElement(\"style\");\n s.id = \"wire-uploader-css\";\n s.textContent = CSS;\n document.head.appendChild(s);\n }\n\n function cookie(name) {\n var m = document.cookie.match(new RegExp(\"(?:^|; )\" + name + \"=([^;]*)\"));\n return m ? decodeURIComponent(m[1]) : \"\";\n }\n function el(tag, cls, text) {\n var e = document.createElement(tag);\n if (cls) e.className = cls;\n if (text != null) e.textContent = text;\n return e;\n }\n function fmt(n) {\n if (n < 1024) return n + \" B\";\n if (n < 1048576) return (n / 1024).toFixed(1) + \" KB\";\n return (n / 1048576).toFixed(1) + \" MB\";\n }\n function accepts(accept, file) {\n var list = (accept || \"\").split(\",\").map(function (s) { return s.trim().toLowerCase(); }).filter(Boolean);\n if (!list.length) return true;\n var type = (file.type || \"\").toLowerCase();\n var name = (file.name || \"\").toLowerCase();\n var ext = name.indexOf(\".\") >= 0 ? name.slice(name.lastIndexOf(\".\")) : \"\";\n return list.some(function (rule) {\n if (rule.charAt(0) === \".\") return rule === ext;\n if (rule.slice(-2) === \"/*\") return type.indexOf(rule.slice(0, -1)) === 0;\n return rule === type;\n });\n }\n\n function setup(root) {\n if (root.__wrnexusUploader) return;\n root.__wrnexusUploader = true;\n\n var endpoint = root.getAttribute(\"data-endpoint\") || \"/api/upload\";\n var multipleAttr = root.getAttribute(\"data-multiple\");\n var multiple = root.hasAttribute(\"data-multiple\") && multipleAttr !== \"false\";\n var accept = root.getAttribute(\"data-accept\") || \"\";\n var maxBytes = parseInt(root.getAttribute(\"data-max\") || \"0\", 10) || 0;\n var field = root.getAttribute(\"data-field\") || (multiple ? \"files\" : \"file\");\n var invalidate = String(root.getAttribute(\"data-invalidate\") || \"\")\n .split(\",\")\n .map(function (tag) { return tag.trim(); })\n .filter(Boolean);\n var promptText = root.getAttribute(\"data-label\") || \"Drag files here or click to browse\";\n\n root.classList.add(\"wire-uploader\");\n var zone = el(\"div\", \"wire-uploader-zone\");\n zone.setAttribute(\"role\", \"button\");\n zone.setAttribute(\"tabindex\", \"0\");\n zone.appendChild(el(\"div\", \"wire-uploader-prompt\", promptText));\n var input = document.createElement(\"input\");\n input.type = \"file\";\n input.className = \"wire-uploader-input\";\n if (multiple) input.multiple = true;\n if (accept) input.accept = accept;\n zone.appendChild(input);\n var listEl = el(\"ul\", \"wire-uploader-list\");\n root.appendChild(zone);\n root.appendChild(listEl);\n\n zone.addEventListener(\"keydown\", function (e) {\n if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); input.click(); }\n });\n [\"dragenter\", \"dragover\"].forEach(function (ev) {\n zone.addEventListener(ev, function (e) { e.preventDefault(); zone.classList.add(\"is-drag\"); });\n });\n [\"dragleave\", \"drop\"].forEach(function (ev) {\n zone.addEventListener(ev, function (e) { e.preventDefault(); zone.classList.remove(\"is-drag\"); });\n });\n zone.addEventListener(\"drop\", function (e) {\n if (e.dataTransfer && e.dataTransfer.files) handle(e.dataTransfer.files);\n });\n input.addEventListener(\"change\", function () {\n if (input.files) handle(input.files);\n input.value = \"\";\n });\n\n function handle(files) {\n var arr = Array.prototype.slice.call(files);\n if (!multiple) arr = arr.slice(0, 1);\n arr.forEach(uploadOne);\n }\n\n function row(file) {\n var li = el(\"li\", \"wire-uploader-item\");\n li.appendChild(el(\"span\", \"wire-uploader-name\", file.name));\n li.appendChild(el(\"span\", \"wire-uploader-meta\", fmt(file.size)));\n var bar = el(\"div\", \"wire-uploader-bar\");\n var fill = el(\"div\", \"wire-uploader-fill\");\n bar.appendChild(fill);\n li.appendChild(bar);\n var status = el(\"span\", \"wire-uploader-status\", \"\");\n li.appendChild(status);\n listEl.appendChild(li);\n return { li: li, fill: fill, status: status };\n }\n\n function uploadOne(file) {\n var ui = row(file);\n if (maxBytes && file.size > maxBytes) return fail(ui, \"Too large (max \" + fmt(maxBytes) + \")\", file);\n if (!accepts(accept, file)) return fail(ui, \"Type not allowed\", file);\n\n var fd = new FormData();\n fd.append(field, file, file.name);\n var xhr = new XMLHttpRequest();\n xhr.open(\"POST\", endpoint, true);\n var token = cookie(CSRF_COOKIE);\n if (token) xhr.setRequestHeader(\"x-csrf-token\", token);\n xhr.upload.addEventListener(\"progress\", function (e) {\n if (e.lengthComputable) {\n var pct = Math.round((e.loaded / e.total) * 100);\n ui.fill.style.width = pct + \"%\";\n ui.status.textContent = pct + \"%\";\n }\n });\n xhr.addEventListener(\"load\", function () {\n var data = null;\n try { data = JSON.parse(xhr.responseText); }\n catch (error) { console.warn(\"[wrnexus:uploader] upload response was not valid JSON\", error); }\n if (xhr.status >= 200 && xhr.status < 300 && data && data.ok) {\n done(ui, (data.files && data.files[0]) || null, file);\n } else {\n fail(ui, (data && data.error) || (\"Upload failed (\" + xhr.status + \")\"), file);\n }\n });\n xhr.addEventListener(\"error\", function () { fail(ui, \"Network error\", file); });\n xhr.send(fd);\n }\n\n function done(ui, info, file) {\n ui.li.classList.remove(\"is-error\");\n ui.li.classList.add(\"is-done\");\n ui.fill.style.width = \"100%\";\n ui.status.textContent = \"\\u2713 Uploaded\";\n root.dispatchEvent(new CustomEvent(\"wrnexus:upload\", { bubbles: true, detail: { file: file, result: info } }));\n if (invalidate.length) {\n window.dispatchEvent(new CustomEvent(\"wrnexus:cache:invalidate\", {\n detail: { tags: invalidate, source: \"uploader\", file: file, result: info }\n }));\n }\n }\n function fail(ui, msg, file) {\n ui.li.classList.add(\"is-error\");\n ui.status.textContent = \"\\u2717 \" + msg;\n root.dispatchEvent(new CustomEvent(\"wrnexus:upload-error\", { bubbles: true, detail: { file: file, error: msg } }));\n }\n }\n\n function init() {\n injectCss();\n var nodes = document.querySelectorAll(\"[data-uploader]\");\n for (var i = 0; i < nodes.length; i++) setup(nodes[i]);\n }\n if (document.readyState === \"loading\") document.addEventListener(\"DOMContentLoaded\", init);\n else init();\n})();\n"; +declare const UPLOAD_RUNTIME = "\n(function () {\n if (typeof document === \"undefined\") return;\n var CSRF_COOKIE = \"wrn-csrf\";\n\n var CSS =\n \".wrn-uploader{display:block}\" +\n \".wrn-uploader-zone{display:flex;align-items:center;justify-content:center;text-align:center;\" +\n \"min-height:8rem;padding:1.25rem;border:2px dashed var(--wrn-border,#cbd5e1);border-radius:12px;\" +\n \"background:var(--wrn-surface,transparent);color:var(--wrn-muted,#64748b);cursor:pointer;\" +\n \"transition:border-color .15s ease,background-color .15s ease;position:relative}\" +\n \".wrn-uploader-zone:hover,.wrn-uploader-zone:focus-visible{border-color:var(--wrn-brand,#3f7dff);outline:none}\" +\n \".wrn-uploader-zone.is-drag{border-color:var(--wrn-brand,#3f7dff);background:color-mix(in oklab,var(--wrn-brand,#3f7dff) 8%,transparent)}\" +\n \".wrn-uploader-prompt{font-size:.9rem;pointer-events:none}\" +\n \".wrn-uploader-input{position:absolute;inset:0;width:100%;height:100%;opacity:0;cursor:pointer}\" +\n \".wrn-uploader-list{list-style:none;margin:.75rem 0 0;padding:0;display:flex;flex-direction:column;gap:.5rem}\" +\n \".wrn-uploader-item{display:grid;grid-template-columns:1fr auto;gap:.15rem .75rem;align-items:center;\" +\n \"font-size:.82rem;padding:.5rem .7rem;border:1px solid var(--wrn-border,#e2e8f0);border-radius:8px}\" +\n \".wrn-uploader-name{font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--wrn-text,#0f172a)}\" +\n \".wrn-uploader-meta{color:var(--wrn-muted,#94a3b8);font-variant-numeric:tabular-nums}\" +\n \".wrn-uploader-bar{grid-column:1/-1;height:5px;border-radius:999px;background:var(--wrn-border,#e2e8f0);overflow:hidden}\" +\n \".wrn-uploader-fill{height:100%;width:0;border-radius:999px;background:var(--wrn-brand,#3f7dff);transition:width .15s ease}\" +\n \".wrn-uploader-status{grid-column:1/-1;font-size:.75rem;color:var(--wrn-muted,#94a3b8);font-variant-numeric:tabular-nums}\" +\n \".wrn-uploader-item.is-done .wrn-uploader-fill{background:var(--wrn-success,#16a34a)}\" +\n \".wrn-uploader-item.is-done .wrn-uploader-status{color:var(--wrn-success,#16a34a)}\" +\n \".wrn-uploader-item.is-error .wrn-uploader-fill{background:var(--wrn-danger,#dc2626)}\" +\n \".wrn-uploader-item.is-error .wrn-uploader-status{color:var(--wrn-danger,#dc2626)}\";\n\n function injectCss() {\n if (document.getElementById(\"wrn-uploader-css\")) return;\n var s = document.createElement(\"style\");\n s.id = \"wrn-uploader-css\";\n s.textContent = CSS;\n document.head.appendChild(s);\n }\n\n function cookie(name) {\n var m = document.cookie.match(new RegExp(\"(?:^|; )\" + name + \"=([^;]*)\"));\n return m ? decodeURIComponent(m[1]) : \"\";\n }\n function el(tag, cls, text) {\n var e = document.createElement(tag);\n if (cls) e.className = cls;\n if (text != null) e.textContent = text;\n return e;\n }\n function fmt(n) {\n if (n < 1024) return n + \" B\";\n if (n < 1048576) return (n / 1024).toFixed(1) + \" KB\";\n return (n / 1048576).toFixed(1) + \" MB\";\n }\n function accepts(accept, file) {\n var list = (accept || \"\").split(\",\").map(function (s) { return s.trim().toLowerCase(); }).filter(Boolean);\n if (!list.length) return true;\n var type = (file.type || \"\").toLowerCase();\n var name = (file.name || \"\").toLowerCase();\n var ext = name.indexOf(\".\") >= 0 ? name.slice(name.lastIndexOf(\".\")) : \"\";\n return list.some(function (rule) {\n if (rule.charAt(0) === \".\") return rule === ext;\n if (rule.slice(-2) === \"/*\") return type.indexOf(rule.slice(0, -1)) === 0;\n return rule === type;\n });\n }\n\n function setup(root) {\n if (root.__wrnexusUploader) return;\n root.__wrnexusUploader = true;\n\n var endpoint = root.getAttribute(\"data-endpoint\") || \"/api/upload\";\n var multipleAttr = root.getAttribute(\"data-multiple\");\n var multiple = root.hasAttribute(\"data-multiple\") && multipleAttr !== \"false\";\n var accept = root.getAttribute(\"data-accept\") || \"\";\n var maxBytes = parseInt(root.getAttribute(\"data-max\") || \"0\", 10) || 0;\n var field = root.getAttribute(\"data-field\") || (multiple ? \"files\" : \"file\");\n var invalidate = String(root.getAttribute(\"data-invalidate\") || \"\")\n .split(\",\")\n .map(function (tag) { return tag.trim(); })\n .filter(Boolean);\n var promptText = root.getAttribute(\"data-label\") || \"Drag files here or click to browse\";\n\n root.classList.add(\"wrn-uploader\");\n var zone = el(\"div\", \"wrn-uploader-zone\");\n zone.setAttribute(\"role\", \"button\");\n zone.setAttribute(\"tabindex\", \"0\");\n zone.appendChild(el(\"div\", \"wrn-uploader-prompt\", promptText));\n var input = document.createElement(\"input\");\n input.type = \"file\";\n input.className = \"wrn-uploader-input\";\n if (multiple) input.multiple = true;\n if (accept) input.accept = accept;\n zone.appendChild(input);\n var listEl = el(\"ul\", \"wrn-uploader-list\");\n root.appendChild(zone);\n root.appendChild(listEl);\n\n zone.addEventListener(\"keydown\", function (e) {\n if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); input.click(); }\n });\n [\"dragenter\", \"dragover\"].forEach(function (ev) {\n zone.addEventListener(ev, function (e) { e.preventDefault(); zone.classList.add(\"is-drag\"); });\n });\n [\"dragleave\", \"drop\"].forEach(function (ev) {\n zone.addEventListener(ev, function (e) { e.preventDefault(); zone.classList.remove(\"is-drag\"); });\n });\n zone.addEventListener(\"drop\", function (e) {\n if (e.dataTransfer && e.dataTransfer.files) handle(e.dataTransfer.files);\n });\n input.addEventListener(\"change\", function () {\n if (input.files) handle(input.files);\n input.value = \"\";\n });\n\n function handle(files) {\n var arr = Array.prototype.slice.call(files);\n if (!multiple) arr = arr.slice(0, 1);\n arr.forEach(uploadOne);\n }\n\n function row(file) {\n var li = el(\"li\", \"wrn-uploader-item\");\n li.appendChild(el(\"span\", \"wrn-uploader-name\", file.name));\n li.appendChild(el(\"span\", \"wrn-uploader-meta\", fmt(file.size)));\n var bar = el(\"div\", \"wrn-uploader-bar\");\n var fill = el(\"div\", \"wrn-uploader-fill\");\n bar.appendChild(fill);\n li.appendChild(bar);\n var status = el(\"span\", \"wrn-uploader-status\", \"\");\n li.appendChild(status);\n listEl.appendChild(li);\n return { li: li, fill: fill, status: status };\n }\n\n function uploadOne(file) {\n var ui = row(file);\n if (maxBytes && file.size > maxBytes) return fail(ui, \"Too large (max \" + fmt(maxBytes) + \")\", file);\n if (!accepts(accept, file)) return fail(ui, \"Type not allowed\", file);\n\n var fd = new FormData();\n fd.append(field, file, file.name);\n var xhr = new XMLHttpRequest();\n xhr.open(\"POST\", endpoint, true);\n var token = cookie(CSRF_COOKIE);\n if (token) xhr.setRequestHeader(\"x-csrf-token\", token);\n xhr.upload.addEventListener(\"progress\", function (e) {\n if (e.lengthComputable) {\n var pct = Math.round((e.loaded / e.total) * 100);\n ui.fill.style.width = pct + \"%\";\n ui.status.textContent = pct + \"%\";\n }\n });\n xhr.addEventListener(\"load\", function () {\n var data = null;\n try { data = JSON.parse(xhr.responseText); }\n catch (error) { console.warn(\"[wrnexus:uploader] upload response was not valid JSON\", error); }\n if (xhr.status >= 200 && xhr.status < 300 && data && data.ok) {\n done(ui, (data.files && data.files[0]) || null, file);\n } else {\n fail(ui, (data && data.error) || (\"Upload failed (\" + xhr.status + \")\"), file);\n }\n });\n xhr.addEventListener(\"error\", function () { fail(ui, \"Network error\", file); });\n xhr.send(fd);\n }\n\n function done(ui, info, file) {\n ui.li.classList.remove(\"is-error\");\n ui.li.classList.add(\"is-done\");\n ui.fill.style.width = \"100%\";\n ui.status.textContent = \"\\u2713 Uploaded\";\n root.dispatchEvent(new CustomEvent(\"wrnexus:upload\", { bubbles: true, detail: { file: file, result: info } }));\n if (invalidate.length) {\n window.dispatchEvent(new CustomEvent(\"wrnexus:cache:invalidate\", {\n detail: { tags: invalidate, source: \"uploader\", file: file, result: info }\n }));\n }\n }\n function fail(ui, msg, file) {\n ui.li.classList.add(\"is-error\");\n ui.status.textContent = \"\\u2717 \" + msg;\n root.dispatchEvent(new CustomEvent(\"wrnexus:upload-error\", { bubbles: true, detail: { file: file, error: msg } }));\n }\n }\n\n function init() {\n injectCss();\n var nodes = document.querySelectorAll(\"[data-uploader]\");\n for (var i = 0; i < nodes.length; i++) setup(nodes[i]);\n }\n if (document.readyState === \"loading\") document.addEventListener(\"DOMContentLoaded\", init);\n else init();\n})();\n"; /** * Local-disk storage driver. Files live under a configured directory; keys map @@ -16162,7 +15193,7 @@ consumers. A generated `wrnexus.contracts.json` can be used instead of a module. ## Overview -Define a schema once with the fluent `v` builder, then reuse it in three places: `.parse()` runs server-side and returns coerced values plus per-field errors; `.describe()` emits a plain-JSON `SchemaDescriptor` that the browser runtime interprets (no `eval`, no bundled validator); and helpers like `parseBody` and `parseEnv` wire schemas straight into API routes and startup config. The server rule logic (`applyRule`/`checkField`) and the client runtime (`VALIDATE_RUNTIME`) mirror each other exactly, so a form validates identically in both places. Schemas are conventionally kept in `app/schemas/`. +Define a schema once with the fluent `v` builder, then reuse it in three places: `.parse()` runs server-side and returns coerced values plus per-field errors; `.describe()` emits a plain-JSON `SchemaDescriptor` that the browser runtime interprets (no `eval`, no bundled validator); and helpers like `parseBody` and `parseEnv` wrn schemas straight into API routes and startup config. The server rule logic (`applyRule`/`checkField`) and the client runtime (`VALIDATE_RUNTIME`) mirror each other exactly, so a form validates identically in both places. Schemas are conventionally kept in `app/schemas/`. ## Installation @@ -16267,8 +15298,8 @@ renderSchemasScript(descriptors: Record): string VALIDATE_RUNTIME: string ``` -- `renderSchemasScript` produces `window.__wireSchemas = { name: descriptor, … };` to inline in the page. -- `VALIDATE_RUNTIME` is a self-contained, eval-free IIFE string. Injected as a `