diff --git a/.gitignore b/.gitignore index c265e61e..1b591b5d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,23 @@ node_modules/ .wrnexus/ -dist/ \ No newline at end of file +dist/ +**/.wrnexus/ +coverage/ +.env +.env.* +!.env.example +*.log +*.db +*.db-shm +*.db-wal +*.sqlite +*.sqlite3 +mobile/android/ +mobile/ios/ +mobile/.expo/ +.idea/ +.vscode/ +.DS_Store +Thumbs.db +*.tsbuildinfo +.eslintcache diff --git a/README.md b/README.md index 363e50d0..38df6bf8 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # WRNexusJS Documentation -Standalone documentation site for all 25 private `@wrnexus/*` packages at version `0.2.12`. +Standalone documentation site for all 25 private `@wrnexus/*` packages. The displayed release is generated from `package.json#wrnexus.version`. ## Development diff --git a/app/docs.test.ts b/app/docs.test.ts index 0e2af42c..b72871ed 100644 --- a/app/docs.test.ts +++ b/app/docs.test.ts @@ -7,6 +7,8 @@ import { compileWireFile } from "@wrnexus/compiler"; import { mountHtml } from "@wrnexus/test"; const root = join(import.meta.dir, ".."); +const frameworkVersion = JSON.parse(readFileSync(join(root, "package.json"), "utf8")).wrnexus + .version as string; const packagePages = join(root, "app", "pages", "packages"); const expected = [ "ai", @@ -47,7 +49,7 @@ 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}@0.2.12`); + expect(source).toContain(`bun add @wrnexus/${name}@${frameworkVersion}`); expect(source).toContain('id="guide"'); expect(source).toContain('id="api"'); expect(source).toContain("Complete TypeScript API"); diff --git a/app/pages/architecture.wrn b/app/pages/architecture.wrn index 890cc0cb..8ff56ea6 100644 --- a/app/pages/architecture.wrn +++ b/app/pages/architecture.wrn @@ -12,7 +12,7 @@ page Architecture {
Concepts

Architecture

WRNexusJS separates server work, generated markup, and browser behavior so applications stay understandable and efficient.

Request path

Request → Router → Middleware → Page/API → SSR document → Browser runtime

Compiler

The compiler parses .wrn files and lowers state, events, interpolation, loops, conditionals, data bindings, components, and styles into server modules and small declarative browser directives.

Runtime

The server owns routing, data, secrets, sessions, validation, uploads, and rendering. The browser owns reactive scopes, navigation, forms, realtime clients, and native capability dispatch.

Package boundaries

Each package is independently installable. Start with the CLI and core, then add database, security, realtime, native, UI, and operational packages as required.

- + } } diff --git a/app/pages/getting-started.wrn b/app/pages/getting-started.wrn index 0fe789d8..06d31369 100644 --- a/app/pages/getting-started.wrn +++ b/app/pages/getting-started.wrn @@ -25,7 +25,7 @@ bun run dev

2. Add a page

page Dashboard {
 }

3. Verify and build

wrnexus doctor
 wrnexus test
 wrnexus build

Where things live

- + } } diff --git a/app/pages/index.wrn b/app/pages/index.wrn index 45d3de2a..32947d53 100644 --- a/app/pages/index.wrn +++ b/app/pages/index.wrn @@ -11,7 +11,7 @@ page Home { -
WRNexusJS 0.2.12

Build from the server.
Ship only what matters.

An SSR-first, Bun-native framework with reactive .wrn components, typed data, realtime rooms, mobile capabilities, and production security built in.

app/pages/counter.wrn
page Counter {
+      
WRNexusJS 0.2.14

Build from the server.
Ship only what matters.

An SSR-first, Bun-native framework with reactive .wrn components, typed data, realtime rooms, mobile capabilities, and production security built in.

app/pages/counter.wrn
page Counter {
   state count = 0
   view {
     <button @click="count++">
@@ -19,7 +19,7 @@ page Home {
     </button>
   }
 }

SSR by default

Useful HTML reaches the browser immediately. Interactive pages hydrate only the runtime they use.

Secure foundations

CSP, Trusted Types, CSRF, sessions, validation, authorization, encryption, and safe rendering are integrated.

Web to native

Share markup through Capacitor or compile portable pages into Expo and React Native routes.

-
WRNexusJS 0.2.12 · SSR-first · Bun-native · Documentation generated from published package APIs.
+
WRNexusJS 0.2.14 · SSR-first · Bun-native · Documentation generated from published package APIs.
} } diff --git a/app/pages/language.wrn b/app/pages/language.wrn index 2f0b4e92..ecbfe7c5 100644 --- a/app/pages/language.wrn +++ b/app/pages/language.wrn @@ -84,7 +84,7 @@ view { <p data-native-only="browser">Browser instructions</p> <button data-native-requires="haptics">Haptic action</button>

Other framework attributes

AttributePurpose
data-errorField validation error destination.
data-successSuccessful form message.
data-redirectNavigation after form success.
data-room-*Realtime status, templates, sending, and reset behavior.
data-uploaderConfig-driven upload widget.
data-wire-theme-*Theme selection and toggling.
data-wire-lang*Language selection.
data-native-*Cross-platform capability and visibility behavior.
- + } } diff --git a/app/pages/packages.wrn b/app/pages/packages.wrn index 611196a3..f984d4a4 100644 --- a/app/pages/packages.wrn +++ b/app/pages/packages.wrn @@ -13,7 +13,7 @@ page Packages { -
25 focused packages

Package reference

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

Showing {category} packages

+
25 focused packages

Package reference

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

Showing {category} packages

AI

@wrnexus/ai

Server-side Anthropic client with generation and streaming.

Open documentation →
@@ -88,7 +88,7 @@ page Packages { Security

@wrnexus/validation

Typed schemas, coercion, validation, and browser descriptors.

Open documentation →
-
WRNexusJS 0.2.12 · SSR-first · Bun-native · Documentation generated from published package APIs.
+
WRNexusJS 0.2.14 · SSR-first · Bun-native · Documentation generated from published package APIs.
} } diff --git a/app/pages/packages/ai.wrn b/app/pages/packages/ai.wrn index 530f1170..5d421bc0 100644 --- a/app/pages/packages/ai.wrn +++ b/app/pages/packages/ai.wrn @@ -12,8 +12,8 @@ page wrnexusai {
- -
AI

@wrnexus/ai

Server-side Anthropic client with generation and streaming.

bun add @wrnexus/ai@0.2.12
A tiny, zero-dependency Claude (Anthropic) client for WRNexusJS apps — generate and stream text with Claude from any server-side code.
+ +
AI

@wrnexus/ai

Server-side Anthropic client with generation and streaming.

bun add @wrnexus/ai@0.2.14
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

@wrnexus/ai is a thin, dependency-free wrapper over the Anthropic Messages API, built on fetch (Bun-native, no SDK). Use it in API routes, jobs, or middleware to call Claude. It defaults to the most capable model, claude-opus-4-8, reads your key from ANTHROPIC_API_KEY, and supports both one-shot generation and streaming.

@@ -175,7 +175,7 @@ const reply = await ai.generate( );
-
WRNexusJS 0.2.12 · SSR-first · Bun-native · Documentation generated from published package APIs.
+
WRNexusJS 0.2.14 · SSR-first · Bun-native · Documentation generated from published package APIs.
} } diff --git a/app/pages/packages/authz.wrn b/app/pages/packages/authz.wrn index e49ab3b4..21adff66 100644 --- a/app/pages/packages/authz.wrn +++ b/app/pages/packages/authz.wrn @@ -12,8 +12,8 @@ page wrnexusauthz {
- -
Security

@wrnexus/authz

Role, permission, policy, and authorization guards.

bun add @wrnexus/authz@0.2.12
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

@wrnexus/authz

Role, permission, policy, and authorization guards.

bun add @wrnexus/authz@0.2.14
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.

@@ -226,7 +226,7 @@ app.put( );
-
WRNexusJS 0.2.12 · SSR-first · Bun-native · Documentation generated from published package APIs.
+
WRNexusJS 0.2.14 · SSR-first · Bun-native · Documentation generated from published package APIs.
} } diff --git a/app/pages/packages/cli.wrn b/app/pages/packages/cli.wrn index 155376d8..8f03f776 100644 --- a/app/pages/packages/cli.wrn +++ b/app/pages/packages/cli.wrn @@ -12,8 +12,8 @@ page wrnexuscli {
- -
Tooling

@wrnexus/cli

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

bun add @wrnexus/cli@0.2.12
The wrnexus command-line tool that scaffolds, runs, builds, tests, and manages WRNexusJS apps.
+ +
Tooling

@wrnexus/cli

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

bun add @wrnexus/cli@0.2.14
The wrnexus command-line tool that scaffolds, runs, builds, tests, and manages WRNexusJS apps.

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

Overview

@wrnexus/cli provides the wrnexus executable — the single entry point for developing a WRNexusJS app. It runs the HMR dev server, produces a self-contained production build, scaffolds apps/pages/components, drives database migrations, regenerates typed routes and queries, runs tests, and manages configuration profiles. It also scaffolds multi-app monorepos and serves them behind a domain-routing gateway. This is a CLI/build-time package (it shells out to the Bun binary for the dev child and tests) and it also exports the workspace config types via a subpath.

@@ -41,9 +41,14 @@ page wrnexuscli {
  • public/ — copied verbatim.
  • Before bundling, it regenerates typed queries for the default and every named database. Run the output with:

    -
    bun dist/server.js   # PORT env var optional
    +
    bun dist/server.js   # PORT env var optional
    +# Generated apps also provide: npm start
    +# Build and start together: npm run production

    wrnexus create

    -

    Scaffolds a new app from an inline (dependency-free) template — package.json, config, and starter app/ files. Run wrnexus dev in the new directory to start.

    +

    Scaffolds a new app from an inline (dependency-free) template — package.json, .gitignore, config, and starter app/ files. Use npm run dev during development, npm run build && npm start for production, or npm run production to build and start in one command. The generated production server currently requires Bun even when npm is used to manage packages and scripts.

    +

    wrnexus update

    +

    wrnexus update --latest performs a complete project upgrade. It hands control to the exact target CLI, backs up important project files under .wrnexus/update-backups/, updates every @wrnexus/* dependency, refreshes framework-owned references, and applies every versioned syntax/config/file migration between the project version and target version. After installation it runs the project's check and build scripts; the new version is recorded only after verification succeeds.

    +

    Use --dry-run to preview an upgrade or --no-verify when verification is intentionally handled elsewhere. Migrations never overwrite user-owned configuration wholesale: each release must provide a focused, idempotent transformation for any changed syntax or config contract.

    wrnexus create my-app

    wrnexus generate

    Scaffolds a single file from a template, refusing to overwrite an existing file. Types (with aliases): page/p, component/c, api/a, schema/s. Nested names create nested paths.

    @@ -105,10 +110,12 @@ export default config;
  • Reads wrnexus.config.ts for db / databases, theme, styles, seo, security, i18n, and profiles, and wrnexus.workspace.ts for the gateway.
  • Complete TypeScript API

    This declaration is generated from the exact published package and lists its exported functions, classes, interfaces, and types.

    #!/usr/bin/env bun
     

    Examples

    Copy-ready examples taken from this package's published documentation.

    Example 1

    bun add @wrnexus/cli

    Example 2

    bunx wrnexus dev
    -# or add scripts: "dev": "wrnexus dev .", "build": "wrnexus build ."

    Example 3

    wrnexus dev . --port=8080

    Example 4

    bun dist/server.js   # PORT env var optional
    - +# or add scripts: "dev": "wrnexus dev .", "build": "wrnexus build ."

    Example 3

    wrnexus dev . --port=8080

    Example 4

    bun dist/server.js   # PORT env var optional
    +# Generated apps also provide: npm start
    +# Build and start together: npm run production
    +
    - + } } diff --git a/app/pages/packages/compiler.wrn b/app/pages/packages/compiler.wrn index 5fd8751b..64936069 100644 --- a/app/pages/packages/compiler.wrn +++ b/app/pages/packages/compiler.wrn @@ -12,8 +12,8 @@ page wrnexuscompiler {
    - -
    Core

    @wrnexus/compiler

    Parser and code generators for the .wrn language.

    bun add @wrnexus/compiler@0.2.12
    Compiler for the .wrn language — tokenizes, parses, and lowers .wrn page and component files to TypeScript.
    + +
    Core

    @wrnexus/compiler

    Parser and code generators for the .wrn language.

    bun add @wrnexus/compiler@0.2.14
    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.

    Overview

    @wrnexus/compiler turns .wrn source into TypeScript that targets the framework's runtime primitives. A .wrn file declares either a page (a route) or a component (a reusable, prop-driven fragment) with blocks for state, view (plain HTML), seo, style, functions, api, ssr/client data bindings, and realtime websocket handlers. The pipeline is source → Lexer → parse() → PageAst → generate() → TypeScript. It is a build/server-side library — the WRNexusJS dev loader calls it to compile .wrn files on the fly, surfacing ParseError as a readable error page.

    @@ -355,7 +355,7 @@ page Home { // returning an HTML string, wrapped in a data-scope for the reactive runtime.
    - + } } diff --git a/app/pages/packages/core.wrn b/app/pages/packages/core.wrn index 14d83917..a9c95512 100644 --- a/app/pages/packages/core.wrn +++ b/app/pages/packages/core.wrn @@ -12,8 +12,8 @@ page wrnexuscore {
    - -
    Core

    @wrnexus/core

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

    bun add @wrnexus/core@0.2.12
    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

    @wrnexus/core

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

    bun add @wrnexus/core@0.2.14
    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.

    @@ -339,6 +339,8 @@ type Next = () => Promise<Response> | Response; type Middleware = (ctx: Context, next: Next) => Promise<Response> | Response; /** SEO metadata rendered into the document `<head>`. */ type SeoConfig = { + /** BCP 47 document language used on `<html lang>` (default: `en`). */ + lang?: string; title?: string; titleTemplate?: string; description?: string; @@ -960,7 +962,7 @@ if (await verifyPassword(form.password, user.passwordHash)) { const current = getUser<{ id: string }>(ctx); // or null
    - + } } diff --git a/app/pages/packages/csr.wrn b/app/pages/packages/csr.wrn index d351a103..2347e2a6 100644 --- a/app/pages/packages/csr.wrn +++ b/app/pages/packages/csr.wrn @@ -12,8 +12,8 @@ page wrnexuscsr {
    - -
    Frontend

    @wrnexus/csr

    Reactive, navigation, and realtime browser runtimes.

    bun add @wrnexus/csr@0.2.12
    The browser-side client runtime for WRNexusJS — generic, self-contained JS that hydrates server-rendered pages with reactivity, client-side navigation, and realtime rooms.
    + +
    Frontend

    @wrnexus/csr

    Reactive, navigation, and realtime browser runtimes.

    bun add @wrnexus/csr@0.2.14
    The browser-side client runtime for WRNexusJS — generic, self-contained JS that hydrates server-rendered pages with reactivity, client-side navigation, and realtime rooms.

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

    Overview

    @wrnexus/csr holds the three client runtimes that WRNexusJS serves to the browser. Components are authored as .wrn files and rendered on the server; this package provides the single, generic runtime that hydrates that HTML in the browser — there are no per-component browser bundles. Each runtime is exported as a plain-JS string (no build step, no imports) intended to be served verbatim from a well-known URL:

    @@ -228,7 +228,7 @@ Bun.serve({ });
    - + } } diff --git a/app/pages/packages/db.wrn b/app/pages/packages/db.wrn index 057a0134..0ea5d6d7 100644 --- a/app/pages/packages/db.wrn +++ b/app/pages/packages/db.wrn @@ -12,8 +12,8 @@ page wrnexusdb {
    - -
    Data

    @wrnexus/db

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

    bun add @wrnexus/db@0.2.12
    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.
    + +
    Data

    @wrnexus/db

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

    bun add @wrnexus/db@0.2.14
    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.

    Overview

    @wrnexus/db is the server-side data layer. You describe tables as TypeScript models (the v column builder + table()); those models drive migrations, coerce raw DB rows into typed objects, and feed the query generator. A thin Driver interface is implemented by adapters for SQLite (bun:sqlite), Postgres/MySQL (Bun.SQL), and MongoDB. The Db client adds ergonomics — model-mapped all/one, transactions, createTable, pagination, and batched relation loading. A process-wide registry (getDb/setDb) exposes configured connections to pages and API routes. Reach for it whenever a WRNexusJS app needs persistence.

    @@ -315,7 +315,7 @@ const users = table("users", { const events = await getDb("analytics").all("SELECT * FROM hits");
    - + } } diff --git a/app/pages/packages/dev-server.wrn b/app/pages/packages/dev-server.wrn index fb2f7532..dc465afd 100644 --- a/app/pages/packages/dev-server.wrn +++ b/app/pages/packages/dev-server.wrn @@ -12,8 +12,8 @@ page wrnexusdevserver {
    - -
    Runtime

    @wrnexus/dev-server

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

    bun add @wrnexus/dev-server@0.2.12
    The WRNexusJS HTTP + WebSocket server runtime — request dispatch, SSR document assembly, live-reload (HMR), and the portable production handler.
    + +
    Runtime

    @wrnexus/dev-server

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

    bun add @wrnexus/dev-server@0.2.14
    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).

    @@ -312,6 +312,8 @@ interface RuntimeDeps { hasStyles?: boolean; /** When true, inject the Wire UI stylesheet link (`/__wrnexus/ui.css`). */ hasUi?: boolean; + /** Production build combined theme + UI stylesheet. */ + hasFrameworkStyles?: boolean; /** Resolved theme config: enables `/__wrnexus/theme.css` + `<html data-theme>`. */ theme?: ResolvedTheme; /** Resolved i18n bundle: enables `ctx.t`, `<html lang>`, and `{t:key}` markers. */ @@ -488,6 +490,8 @@ interface ProdOptions { theme?: ResolvedTheme; /** Absolute path to the pre-built Wire UI stylesheet (`ui.css`). */ uiCssPath?: string; + /** Combined production theme + Wire UI stylesheet. */ + frameworkCssPath?: string; /** Pre-built `window.__wireSchemas = {...}` script for client validation. */ schemasJs?: string; /** Resolved i18n bundle (default lang + locale messages). */ @@ -721,7 +725,7 @@ interface ProdOptions { }
    - + } } diff --git a/app/pages/packages/encryption.wrn b/app/pages/packages/encryption.wrn index eac2dbb6..76f4c8dc 100644 --- a/app/pages/packages/encryption.wrn +++ b/app/pages/packages/encryption.wrn @@ -12,8 +12,8 @@ page wrnexusencryption {
    - -
    Security

    @wrnexus/encryption

    Hashing, HMAC, authenticated encryption, and key derivation.

    bun add @wrnexus/encryption@0.2.12
    Dependency-free crypto helpers for WRNexusJS: authenticated symmetric encryption (AES-256-GCM), hashing, and HMAC signing.
    + +
    Security

    @wrnexus/encryption

    Hashing, HMAC, authenticated encryption, and key derivation.

    bun add @wrnexus/encryption@0.2.14
    Dependency-free crypto helpers for WRNexusJS: authenticated symmetric encryption (AES-256-GCM), hashing, and HMAC signing.

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

    Overview

    This package provides small, focused cryptographic primitives for server-side use: encrypting secrets/tokens/database fields at rest with AES-256-GCM, deriving keys from passwords via PBKDF2, computing SHA-256 digests, and signing/verifying payloads with HMAC-SHA256. It is built entirely on the standard Web Crypto API (crypto.subtle) plus btoa/atob and TextEncoder/TextDecoder — no third-party dependencies. Reach for it whenever you need to protect sensitive values or verify webhook signatures. All functions are async (Web Crypto is promise-based).

    @@ -107,7 +107,7 @@ const ok = await hmacVerify(rawBody, webhookSecret, incomingSignatureHeader); if (!ok) throw new Error("Invalid webhook signature");
    - + } } diff --git a/app/pages/packages/i18n.wrn b/app/pages/packages/i18n.wrn index a3612c2a..b8592a04 100644 --- a/app/pages/packages/i18n.wrn +++ b/app/pages/packages/i18n.wrn @@ -12,8 +12,8 @@ page wrnexusi18n {
    - -
    Frontend

    @wrnexus/i18n

    Translation loading, locale resolution, and Intl formatting.

    bun add @wrnexus/i18n@0.2.12
    Per-request translations plus locale-aware number, date, and currency formatting for WRNexusJS apps.
    + +
    Frontend

    @wrnexus/i18n

    Translation loading, locale resolution, and Intl formatting.

    bun add @wrnexus/i18n@0.2.14
    Per-request translations plus locale-aware number, date, and currency formatting for WRNexusJS apps.

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

    Overview

    @wrnexus/i18n loads locale files from app/locales/<lang>.json, resolves the active language for each request (cookie → Accept-Language → default), and builds a t(key, params) translator used both in server code and in .wrn views. It also ships Intl-based formatting helpers and a tiny client runtime that wires up a language switcher. Translation lookup, language resolution, and HTML marker rewriting run server-side; only the small I18N_RUNTIME snippet runs in the browser.

    @@ -209,7 +209,7 @@ const finalHtml = translateHtml(renderedHtml, t);
    - + } } diff --git a/app/pages/packages/jwt.wrn b/app/pages/packages/jwt.wrn index 58da5f55..a9ffb625 100644 --- a/app/pages/packages/jwt.wrn +++ b/app/pages/packages/jwt.wrn @@ -12,8 +12,8 @@ page wrnexusjwt {
    - -
    Security

    @wrnexus/jwt

    HS256 JWT signing, verification, and bearer authentication.

    bun add @wrnexus/jwt@0.2.12
    Dependency-free JSON Web Tokens (HS256) via Web Crypto, plus a bearer-token auth middleware for WRNexusJS.
    + +
    Security

    @wrnexus/jwt

    HS256 JWT signing, verification, and bearer authentication.

    bun add @wrnexus/jwt@0.2.14
    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.

    @@ -145,7 +145,7 @@ export { type JwtAuthOptions, type JwtClaims, JwtError, type SignOptions, j ): Promise<T>;

    Example 4

    function jwtAuth(options: JwtAuthOptions): Middleware;
    - + } } diff --git a/app/pages/packages/mobile.wrn b/app/pages/packages/mobile.wrn index ecea5821..5e11aa07 100644 --- a/app/pages/packages/mobile.wrn +++ b/app/pages/packages/mobile.wrn @@ -12,8 +12,8 @@ page wrnexusmobile {
    - -
    Native

    @wrnexus/mobile

    SSR-safe compatibility access to Capacitor plugins.

    bun add @wrnexus/mobile@0.2.12

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

    + +
    Native

    @wrnexus/mobile

    SSR-safe compatibility access to Capacitor plugins.

    bun add @wrnexus/mobile@0.2.14

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

    wrnexus mobile add @capacitor/camera
    import { Camera } from "@capacitor/camera";
     import { mobile } from "@wrnexus/mobile";
    @@ -70,7 +70,7 @@ if (mobile.isNative()) {
     }
    - + } } diff --git a/app/pages/packages/native.wrn b/app/pages/packages/native.wrn index 8b939034..a025b741 100644 --- a/app/pages/packages/native.wrn +++ b/app/pages/packages/native.wrn @@ -12,8 +12,8 @@ page wrnexusnative {
    - -
    Native

    @wrnexus/native

    Cross-platform browser and Capacitor capability registry.

    bun add @wrnexus/native@0.2.12

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

    + +
    Native

    @wrnexus/native

    Cross-platform browser and Capacitor capability registry.

    bun add @wrnexus/native@0.2.14

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

    import { native } from "@wrnexus/native";
     
     if (native.supports("share")) await native.run("share", { title: "WRNexusJS", url: location.href });
    @@ -49,7 +49,7 @@ export { NativeCapability, NativePlatform, NativeRunOptions, NativeTarget, if (native.supports("share")) await native.run("share", { title: "WRNexusJS", url: location.href });
    - + } } diff --git a/app/pages/packages/oauth.wrn b/app/pages/packages/oauth.wrn index 50f1c495..1860d2df 100644 --- a/app/pages/packages/oauth.wrn +++ b/app/pages/packages/oauth.wrn @@ -12,8 +12,8 @@ page wrnexusoauth {
    - -
    Security

    @wrnexus/oauth

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

    bun add @wrnexus/oauth@0.2.12
    Dependency-free OAuth 2.0 sign-in for any provider, with PKCE and presets for Google, GitHub, and Discord.
    + +
    Security

    @wrnexus/oauth

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

    bun add @wrnexus/oauth@0.2.14
    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.

    @@ -263,7 +263,7 @@ interface StartAuthResult { }
    - + } } diff --git a/app/pages/packages/pubsub.wrn b/app/pages/packages/pubsub.wrn index 4a597e55..ff6ff500 100644 --- a/app/pages/packages/pubsub.wrn +++ b/app/pages/packages/pubsub.wrn @@ -12,8 +12,8 @@ page wrnexuspubsub {
    - -
    Realtime

    @wrnexus/pubsub

    In-process and Redis-backed publish/subscribe.

    bun add @wrnexus/pubsub@0.2.12
    Topic-based publish/subscribe with a pluggable driver — in-process by default, Redis for cross-process messaging.
    + +
    Realtime

    @wrnexus/pubsub

    In-process and Redis-backed publish/subscribe.

    bun add @wrnexus/pubsub@0.2.14
    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.

    @@ -131,7 +131,7 @@ type Handler<T = unknown> = (message: T, topic: string) => void | Promi }

    Example 4

    function redisDriver(url?: string): PubSubDriver & { close(): void };
    - + } } diff --git a/app/pages/packages/queue.wrn b/app/pages/packages/queue.wrn index 1a039688..57b34fd4 100644 --- a/app/pages/packages/queue.wrn +++ b/app/pages/packages/queue.wrn @@ -12,8 +12,8 @@ page wrnexusqueue {
    - -
    Data

    @wrnexus/queue

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

    bun add @wrnexus/queue@0.2.12
    A background job queue with delays, retries + exponential backoff, recurring jobs, and concurrent workers.
    + +
    Data

    @wrnexus/queue

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

    bun add @wrnexus/queue@0.2.14
    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().

    @@ -171,7 +171,7 @@ export { type AddOptions, type Job, type JobHandler, type Queue, type Queue }
    - + } } diff --git a/app/pages/packages/reactive.wrn b/app/pages/packages/reactive.wrn index 12eb1c01..0efd836e 100644 --- a/app/pages/packages/reactive.wrn +++ b/app/pages/packages/reactive.wrn @@ -12,8 +12,8 @@ page wrnexusreactive {
    - -
    Frontend

    @wrnexus/reactive

    Small type-safe reactive signal primitives.

    bun add @wrnexus/reactive@0.2.12
    Tiny, type-safe reactive primitives (signals) with zero dependencies.
    + +
    Frontend

    @wrnexus/reactive

    Small type-safe reactive signal primitives.

    bun add @wrnexus/reactive@0.2.14
    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.

    @@ -133,7 +133,7 @@ const user: Signal<{ name: string } | null> = signal(null); user.set({ name: "Ada" });
    - + } } diff --git a/app/pages/packages/router.wrn b/app/pages/packages/router.wrn index 909e4b51..3a903624 100644 --- a/app/pages/packages/router.wrn +++ b/app/pages/packages/router.wrn @@ -12,8 +12,8 @@ page wrnexusrouter {
    - -
    Core

    @wrnexus/router

    Filesystem discovery, route matching, and typed route generation.

    bun add @wrnexus/router@0.2.12
    File-based router that maps an app/ directory onto route tables and matches request paths against them.
    + +
    Core

    @wrnexus/router

    Filesystem discovery, route matching, and typed route generation.

    bun add @wrnexus/router@0.2.14
    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.

    @@ -260,7 +260,7 @@ interface ComponentRef { }
    - + } } diff --git a/app/pages/packages/ssr.wrn b/app/pages/packages/ssr.wrn index bbec320a..2af317fa 100644 --- a/app/pages/packages/ssr.wrn +++ b/app/pages/packages/ssr.wrn @@ -12,8 +12,8 @@ page wrnexusssr {
    - -
    Runtime

    @wrnexus/ssr

    Secure HTML document rendering and SEO metadata.

    bun add @wrnexus/ssr@0.2.12
    Server-side rendering: wraps a page's HTML body in a complete HTML document with a metadata-driven <head>.
    + +
    Runtime

    @wrnexus/ssr

    Secure HTML document rendering and SEO metadata.

    bun add @wrnexus/ssr@0.2.14
    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.

    @@ -165,7 +165,7 @@ return new Response(html, { });
    - + } } diff --git a/app/pages/packages/styles.wrn b/app/pages/packages/styles.wrn index 688cfebe..321eea50 100644 --- a/app/pages/packages/styles.wrn +++ b/app/pages/packages/styles.wrn @@ -12,8 +12,8 @@ page wrnexusstyles {
    - -
    Frontend

    @wrnexus/styles

    CSS pipeline, themes, fonts, profiles, and application config.

    bun add @wrnexus/styles@0.2.12
    Global CSS bundling, the --wire-* design-token theme system, and the wrnexus.config.ts app-config loader for WRNexusJS apps.
    + +
    Frontend

    @wrnexus/styles

    CSS pipeline, themes, fonts, profiles, and application config.

    bun add @wrnexus/styles@0.2.14
    Global CSS bundling, the --wire-* 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

    This package owns three server-side concerns that shape every page a WRNexusJS app renders:

    @@ -263,6 +263,12 @@ interface FontConfig { * configured. The output is trusted, framework-controlled HTML. */ declare function renderFontHead(fonts?: FontConfig): string; +/** + * Production variant that inlines the small Google Fonts stylesheet at build + * time. This removes a render-blocking CSS round trip while retaining the same + * font files, `font-display`, CSP sources, and offline-safe fallback markup. + */ +declare function renderProductionFontHead(fonts?: FontConfig, fetcher?: (input: string, init?: RequestInit) => Promise<Response>): Promise<string>; /** * CSP source hosts required by the configured fonts, so the policy can be * auto-extended (Google Fonts need their CSS + static hosts allow-listed). @@ -501,7 +507,7 @@ declare function bundleCss(entryPath: string, mode: Mode): Promise<string> */ declare function renderStyles(ctx: StyleProcessContext, styles?: StylesConfig): Promise<string>; -export { type AppConfig, DEFAULT_THEMES, type FontConfig, type FontDisplay, type GoogleFont, type LocalFontFace, type MobileConfig, type Mode, type PwaConfig, type ResolvedTheme, type StyleProcessContext, type StylesConfig, type Mode as StylesMode, THEME_COOKIE, THEME_CSS_HREF, THEME_JS_HREF, type ThemeConfig, type ThemeTokens, bundleCss, findStyleEntry, fontCspSources, headToString, loadAppConfig, loadEnv, loadRawConfig, renderFontHead, renderStyles, renderThemeCss, renderThemeRuntime, resolveProfile, resolveThemeConfig, resolveThemeName }; +export { type AppConfig, DEFAULT_THEMES, type FontConfig, type FontDisplay, type GoogleFont, type LocalFontFace, type MobileConfig, type Mode, type PwaConfig, type ResolvedTheme, type StyleProcessContext, type StylesConfig, type Mode as StylesMode, THEME_COOKIE, THEME_CSS_HREF, THEME_JS_HREF, type ThemeConfig, type ThemeTokens, bundleCss, findStyleEntry, fontCspSources, headToString, loadAppConfig, loadEnv, loadRawConfig, renderFontHead, renderProductionFontHead, renderStyles, renderThemeCss, renderThemeRuntime, resolveProfile, resolveThemeConfig, resolveThemeName };

    Examples

    Copy-ready examples taken from this package's published documentation.

    Example 1

    bun add @wrnexus/styles

    Example 2

    interface StylesConfig {
       /** CSS entry path relative to the app root. Default: app/styles/global.css */
       entry?: string;
    @@ -556,7 +562,7 @@ export default {
     } satisfies AppConfig;
    - + } } diff --git a/app/pages/packages/test.wrn b/app/pages/packages/test.wrn index 8c1bcc3a..bc64b144 100644 --- a/app/pages/packages/test.wrn +++ b/app/pages/packages/test.wrn @@ -12,8 +12,8 @@ page wrnexustest {
    - -
    Tooling

    @wrnexus/test

    WRNexusJS-aware component, route, and browser testing utilities.

    bun add @wrnexus/test@0.2.12
    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

    @wrnexus/test

    WRNexusJS-aware component, route, and browser testing utilities.

    bun add @wrnexus/test@0.2.14
    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.

    @@ -170,7 +170,7 @@ export { type Harness, type HarnessOptions, callRoute, createHarness, mount ): Promise<Response>;
    - + } } diff --git a/app/pages/packages/tracking.wrn b/app/pages/packages/tracking.wrn index 4dbe5651..391fc72a 100644 --- a/app/pages/packages/tracking.wrn +++ b/app/pages/packages/tracking.wrn @@ -12,8 +12,8 @@ page wrnexustracking {
    - -
    Runtime

    @wrnexus/tracking

    Error/event capture, middleware, filtering, and sinks.

    bun add @wrnexus/tracking@0.2.12
    Error tracking for WRNexusJS apps: capture exceptions manually or via middleware and fan them out to pluggable sinks.
    + +
    Runtime

    @wrnexus/tracking

    Error/event capture, middleware, filtering, and sinks.

    bun add @wrnexus/tracking@0.2.14
    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.

    @@ -151,7 +151,7 @@ try { }
    - + } } diff --git a/app/pages/packages/ui.wrn b/app/pages/packages/ui.wrn index 93341ebd..35ce0969 100644 --- a/app/pages/packages/ui.wrn +++ b/app/pages/packages/ui.wrn @@ -12,8 +12,8 @@ page wrnexusui {
    - -
    Frontend

    @wrnexus/ui

    Themeable server-rendered UI components and CSS.

    bun add @wrnexus/ui@0.2.12
    First-party Wire UI component library — a set of themeable .wrn components plus a single tokenized stylesheet.
    + +
    Frontend

    @wrnexus/ui

    Themeable server-rendered UI components and CSS.

    bun add @wrnexus/ui@0.2.14
    First-party Wire 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.

    @@ -111,7 +111,7 @@ const router = buildRouter(appDir, { componentDirs: [uiComponentsDir()]  </div>
    - + } } diff --git a/app/pages/packages/uploader.wrn b/app/pages/packages/uploader.wrn index 59c518a8..3b74ee72 100644 --- a/app/pages/packages/uploader.wrn +++ b/app/pages/packages/uploader.wrn @@ -12,8 +12,8 @@ page wrnexusuploader {
    - -
    Data

    @wrnexus/uploader

    Validated local/S3 uploads and secure file serving.

    bun add @wrnexus/uploader@0.2.12

    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

    @wrnexus/uploader

    Validated local/S3 uploads and secure file serving.

    bun add @wrnexus/uploader@0.2.14

    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).

    Configure

    // wrnexus.config.ts
     import type { AppConfig } from "@wrnexus/styles";
    @@ -413,7 +413,7 @@ await getStore("docs").driver.delete(files[0].key);
    - + } } diff --git a/app/pages/packages/validation.wrn b/app/pages/packages/validation.wrn index 5454f7b7..c33dd223 100644 --- a/app/pages/packages/validation.wrn +++ b/app/pages/packages/validation.wrn @@ -12,8 +12,8 @@ page wrnexusvalidation {
    - -
    Security

    @wrnexus/validation

    Typed schemas, coercion, validation, and browser descriptors.

    bun add @wrnexus/validation@0.2.12
    One fluent schema, validated on the server (API bodies, env vars) and mirrored to an eval-free browser validator for forms.
    + +
    Security

    @wrnexus/validation

    Typed schemas, coercion, validation, and browser descriptors.

    bun add @wrnexus/validation@0.2.14
    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.

    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/.

    @@ -310,7 +310,7 @@ schema.describe(): SchemaDescriptor
    - + } } diff --git a/bun.lock b/bun.lock index cda4e9c7..a363c099 100644 --- a/bun.lock +++ b/bun.lock @@ -5,37 +5,37 @@ "": { "name": "wrnexusjs", "dependencies": { - "@wrnexus/ai": "^0.2.13", - "@wrnexus/authz": "^0.2.13", - "@wrnexus/compiler": "^0.2.13", - "@wrnexus/core": "^0.2.13", - "@wrnexus/csr": "^0.2.13", - "@wrnexus/db": "^0.2.13", - "@wrnexus/dev-server": "^0.2.13", - "@wrnexus/encryption": "^0.2.13", - "@wrnexus/i18n": "^0.2.13", - "@wrnexus/jwt": "^0.2.13", - "@wrnexus/mobile": "^0.2.13", - "@wrnexus/native": "^0.2.13", - "@wrnexus/oauth": "^0.2.13", - "@wrnexus/pubsub": "^0.2.13", - "@wrnexus/queue": "^0.2.13", - "@wrnexus/reactive": "^0.2.13", - "@wrnexus/router": "^0.2.13", - "@wrnexus/ssr": "^0.2.13", - "@wrnexus/styles": "^0.2.13", - "@wrnexus/test": "^0.2.13", - "@wrnexus/tracking": "^0.2.13", - "@wrnexus/ui": "^0.2.13", - "@wrnexus/uploader": "^0.2.13", - "@wrnexus/validation": "^0.2.13", + "@wrnexus/ai": "^0.2.14", + "@wrnexus/authz": "^0.2.14", + "@wrnexus/compiler": "^0.2.14", + "@wrnexus/core": "^0.2.14", + "@wrnexus/csr": "^0.2.14", + "@wrnexus/db": "^0.2.14", + "@wrnexus/dev-server": "^0.2.14", + "@wrnexus/encryption": "^0.2.14", + "@wrnexus/i18n": "^0.2.14", + "@wrnexus/jwt": "^0.2.14", + "@wrnexus/mobile": "^0.2.14", + "@wrnexus/native": "^0.2.14", + "@wrnexus/oauth": "^0.2.14", + "@wrnexus/pubsub": "^0.2.14", + "@wrnexus/queue": "^0.2.14", + "@wrnexus/reactive": "^0.2.14", + "@wrnexus/router": "^0.2.14", + "@wrnexus/ssr": "^0.2.14", + "@wrnexus/styles": "^0.2.14", + "@wrnexus/test": "^0.2.14", + "@wrnexus/tracking": "^0.2.14", + "@wrnexus/ui": "^0.2.14", + "@wrnexus/uploader": "^0.2.14", + "@wrnexus/validation": "^0.2.14", }, "devDependencies": { "@eslint/js": "^9.0.0", "@tailwindcss/cli": "^4.0.0", "@types/bun": "latest", "@types/node": "^26.1.1", - "@wrnexus/cli": "^0.2.13", + "@wrnexus/cli": "^0.2.14", "eslint": "^9.0.0", "prettier": "latest", "tailwindcss": "^4.0.0", @@ -169,55 +169,55 @@ "@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=="], - "@wrnexus/ai": ["@wrnexus/ai@0.2.13", "", {}, "sha512-Y67iBWCkvpsvqIdbNVRTKXKgUCBf4s4U+faYY0vVYiXLBxu0oZreaFBqQ1K1wLBpnP7Bn1So20XpIgpNUzFvTw=="], + "@wrnexus/ai": ["@wrnexus/ai@0.2.14", "", {}, "sha512-ArYxJeVT1pZcqr0PVdlIc2Uw5ANnH0NxFmZ+vG890asHrEzTEhtO8ydtKTXF03Kd5afTfd3yiLkNl6S12CwTTQ=="], - "@wrnexus/authz": ["@wrnexus/authz@0.2.13", "", {}, "sha512-B0londyf3PNAK8kwaWvUsfPUXbN8T4JS/7ZRsxpBAWfyzrkNO0iwAr+2qUK5vl0lLzePUqIYkfP1cJtSv1eq/w=="], + "@wrnexus/authz": ["@wrnexus/authz@0.2.14", "", {}, "sha512-XFOmdaquDVZNg1IHfl3UP0511YykeRwHmklZQkr+9II7qwsWnpALkMrs8YMHfPInynBJzAwJ+DOsLBC5EfncyQ=="], - "@wrnexus/cli": ["@wrnexus/cli@0.2.13", "", { "dependencies": { "@wrnexus/compiler": "^0.2.13", "@wrnexus/core": "^0.2.13", "@wrnexus/csr": "^0.2.13", "@wrnexus/db": "^0.2.13", "@wrnexus/dev-server": "^0.2.13", "@wrnexus/i18n": "^0.2.13", "@wrnexus/router": "^0.2.13", "@wrnexus/styles": "^0.2.13", "@wrnexus/ui": "^0.2.13", "@wrnexus/validation": "^0.2.13" }, "bin": { "wrnexus": "dist/index.js" } }, "sha512-NZq6FCPVC0/F1HN7PtlCzbigjEOpFw6MLufU8bQW1ND1PN4VCxr0bPNW2Fg1htuGfaWOL9AajtwtupLqu7k7og=="], + "@wrnexus/cli": ["@wrnexus/cli@0.2.14", "", { "dependencies": { "@wrnexus/compiler": "^0.2.14", "@wrnexus/core": "^0.2.14", "@wrnexus/csr": "^0.2.14", "@wrnexus/db": "^0.2.14", "@wrnexus/dev-server": "^0.2.14", "@wrnexus/i18n": "^0.2.14", "@wrnexus/router": "^0.2.14", "@wrnexus/styles": "^0.2.14", "@wrnexus/ui": "^0.2.14", "@wrnexus/validation": "^0.2.14" }, "bin": { "wrnexus": "dist/index.js" } }, "sha512-8oWT9m9w83/vImhMQh//KKXP4FWev56uBI/Q6jwpbt7s0APig0mIoLtp4Tx3nK1JF0mDjc3J/tOzTrTr2FGslA=="], - "@wrnexus/compiler": ["@wrnexus/compiler@0.2.13", "", {}, "sha512-Ic0vRAalJRlmZKRnVEBwYgenrof5dkyR+4bduQ+RlULkWURAxlxZT2uvABnF5/wbcjIpX2ApiU/d0W0oQnjrkw=="], + "@wrnexus/compiler": ["@wrnexus/compiler@0.2.14", "", {}, "sha512-5OkeQYqCgtQbsgb99Jgq230yWjL9WU+jpOPmHXO83EFVrN5tb4EFzlag7s8dL0kFeDxBseVY40YFMWl3fVjhjQ=="], - "@wrnexus/core": ["@wrnexus/core@0.2.13", "", {}, "sha512-LNooiQBlQNGO7TmLwVL3D8LqfhjG3Flo49RpFJwMfgpv421hwilZwPs05Ug22y31c/XJWCT2LldNTrO6Wsug6A=="], + "@wrnexus/core": ["@wrnexus/core@0.2.14", "", {}, "sha512-j6b/upI8iLnHSp62rFBQETXAkVb1XHM4TE5B8yTcfVg2AaIx4kYlc1CAEUvvkAuc/4s3aVywWuPQf2h9I2SjRw=="], - "@wrnexus/csr": ["@wrnexus/csr@0.2.13", "", { "dependencies": { "@wrnexus/core": "^0.2.13" } }, "sha512-wN38+F+NOoIhAiZFyQChfL4ctraBd8M0w4izmKnW/Wk3SEut/oa4nS6MlWtwDzdTAefzOxHL5Rb4eLl5w2/jxg=="], + "@wrnexus/csr": ["@wrnexus/csr@0.2.14", "", { "dependencies": { "@wrnexus/core": "^0.2.14" } }, "sha512-AfFEBLqH/W4aWK9nsdipmAWdGmD71pmj+7RVd88CFqM8KYq1MFxxwkcgoFCBlhP+b8HJlxGCCdfVfQnSI2piNA=="], - "@wrnexus/db": ["@wrnexus/db@0.2.13", "", {}, "sha512-23y6pvAW6ruvMNXu9Jcdc1bFuTWlWOqxvUCF9VLQ6WvNZmWkU/G1/ITNu+X6tgTnByIJPC60nBtVDE5D4xbqeg=="], + "@wrnexus/db": ["@wrnexus/db@0.2.14", "", {}, "sha512-Rqd4S8NOcjmC0fv+GYkwKiLYdAtXRQSMxVZ+PKERsrpT/KcTA2lkLN/NPMshKUt+HiFaRMy1jJqJSAWFTM8grw=="], - "@wrnexus/dev-server": ["@wrnexus/dev-server@0.2.13", "", { "dependencies": { "@wrnexus/compiler": "^0.2.13", "@wrnexus/core": "^0.2.13", "@wrnexus/csr": "^0.2.13", "@wrnexus/db": "^0.2.13", "@wrnexus/i18n": "^0.2.13", "@wrnexus/pubsub": "^0.2.13", "@wrnexus/router": "^0.2.13", "@wrnexus/ssr": "^0.2.13", "@wrnexus/styles": "^0.2.13", "@wrnexus/ui": "^0.2.13", "@wrnexus/uploader": "^0.2.13", "@wrnexus/validation": "^0.2.13" } }, "sha512-hmbl5KJbJR+gsFZR3KxOkvF7W1LlHxGctuc6SvR7HDWe2oPsUgBHp0NDkxQ7njogue4GPcfZDw1WbNbZtRGOUw=="], + "@wrnexus/dev-server": ["@wrnexus/dev-server@0.2.14", "", { "dependencies": { "@wrnexus/compiler": "^0.2.14", "@wrnexus/core": "^0.2.14", "@wrnexus/csr": "^0.2.14", "@wrnexus/db": "^0.2.14", "@wrnexus/i18n": "^0.2.14", "@wrnexus/pubsub": "^0.2.14", "@wrnexus/router": "^0.2.14", "@wrnexus/ssr": "^0.2.14", "@wrnexus/styles": "^0.2.14", "@wrnexus/ui": "^0.2.14", "@wrnexus/uploader": "^0.2.14", "@wrnexus/validation": "^0.2.14" } }, "sha512-HKylu48sbrPF3gxmNdkPUSwe9LzyfOLqvZjGPPnDnF9aoXUnMih+XidGaJLIKyTKN6VGyPw7CowAU941nZlLbA=="], - "@wrnexus/encryption": ["@wrnexus/encryption@0.2.13", "", {}, "sha512-4MByItCHZFv/BkRyC/MKIOAyDWcjFSE5sVvsqp3tteOQsAmqPOwatZ8gfca9SEyDuk8L80sEu5YQVBZieBPHKw=="], + "@wrnexus/encryption": ["@wrnexus/encryption@0.2.14", "", {}, "sha512-aio0O6xZGCypiKSW30UK1uPXSRg9CKBwEoGNdvof8qjl23it7T6iOBskPRXMZoVVtJS4MaYgROFngpkhIFmX+g=="], - "@wrnexus/i18n": ["@wrnexus/i18n@0.2.13", "", { "dependencies": { "@wrnexus/core": "^0.2.13" } }, "sha512-zBMQ4s5RymCsrrToiYKhiZNTYAf6yinkNcGzbD+v4uMpKngVHCbQ8xL/uqlJNDMtdTTvDATBz+dNe1yP7/Kn4A=="], + "@wrnexus/i18n": ["@wrnexus/i18n@0.2.14", "", { "dependencies": { "@wrnexus/core": "^0.2.14" } }, "sha512-Rzy3NQRxcKKzPmo+3puLQcJJ/R+80kp32uVGJ3O3cqo3hGdF8L1ox9cc4lYT/II84+d3yQ5QCyfKOGHFEabcXA=="], - "@wrnexus/jwt": ["@wrnexus/jwt@0.2.13", "", {}, "sha512-fIzqZkmv1KZVmo3eziLTXCxrmVwC5BuU2LXQu2z5hWnEnEBLKQRROQPYSrooCKcgtqAIZYvxMQ87UHhcWlF8BA=="], + "@wrnexus/jwt": ["@wrnexus/jwt@0.2.14", "", {}, "sha512-zE/7LnncvOxjPnBIPO+eJnWiPZAqwyYU68upJua/PQtyH1fdo3I3625ZQwdWDCwhJtyg+UJyEkZFToUaVS5YeQ=="], - "@wrnexus/mobile": ["@wrnexus/mobile@0.2.13", "", { "dependencies": { "@wrnexus/native": "^0.2.13" } }, "sha512-pCTKYUN3TdmGV7wVQAIq5rNbfxXVwBZuv3FW+/2t6UpAT0+1vW+hsHGRoM9xJAVyEN1ieBAZpqWrTWLcs4vkTg=="], + "@wrnexus/mobile": ["@wrnexus/mobile@0.2.14", "", { "dependencies": { "@wrnexus/native": "^0.2.14" } }, "sha512-qEkPzOzBLMG1v/LTZubmkriye8428mWPSfaPCq0XFP6uV8XXvs1ag4vmU3V8KvXSDkHraQ8ppeOGm+nTFAYVhg=="], - "@wrnexus/native": ["@wrnexus/native@0.2.13", "", {}, "sha512-wIKtgZ9TYS854iy94Ljh6Kkt+HR5wphSuVASEcE9AJ2MNqlc7Bku0hKYARUIpn6HNkp27P1w+g6PJoHmXmVmEQ=="], + "@wrnexus/native": ["@wrnexus/native@0.2.14", "", {}, "sha512-8Tc2GHprmIXnTHIj7EqcKFhzb7GcNbFosYSByrzYsHbD9kn9qhtscOri1kCfm+HA2/+t1auBFbLiEUicAL61aw=="], - "@wrnexus/oauth": ["@wrnexus/oauth@0.2.13", "", {}, "sha512-dlXGgmoCfDeqDXhS2ctLGbDxsr4tUgU6YPor1cQD0lAOFy840vEwS3AmdrebMrYyIkhIFxapxV+xHXbBd6eonA=="], + "@wrnexus/oauth": ["@wrnexus/oauth@0.2.14", "", {}, "sha512-ZrR+Jwj1uoieklF0CFfqMRUvYp8MN0arlh0r3FdWDRoafJUnhDWj/3NfzmA4OU56xFYPFbiWAWWldMgLEsc6Gw=="], - "@wrnexus/pubsub": ["@wrnexus/pubsub@0.2.13", "", {}, "sha512-/BUhOZXusEA6GJFNkS3z85CDq1itzZjtX3xJAWEc3ElpV1D09EsKuGZD1RslmWerF0CqumgkJ3MuQk5MjKuG2g=="], + "@wrnexus/pubsub": ["@wrnexus/pubsub@0.2.14", "", {}, "sha512-o6Tmw2O7jBIrFzCRmmN6j9triJFqE2Q7gmBYAIQ6JitqMYcz7FjDRzgjeNHU+seJir1OO0du8AzB+MX0uCgCbw=="], - "@wrnexus/queue": ["@wrnexus/queue@0.2.13", "", {}, "sha512-ZUFM4VqVLpfGwQ8bnlIzxIJmVACjX/jc2TD/kJsdpBH0B9ff33HHhcDAej6MxsGdhNH6EkwZMWYv0l+te7aXOQ=="], + "@wrnexus/queue": ["@wrnexus/queue@0.2.14", "", {}, "sha512-q9XbUANIpMEZDTiLy1/j2bWkillFRwkQ4ZzMFit3JqSoCSqXH9EuF8Ol+LNwQhVQmJs4isCKzp+oLQMnvDtQ3Q=="], - "@wrnexus/reactive": ["@wrnexus/reactive@0.2.13", "", {}, "sha512-qzaRvFWtlp6JdXU3QD+n2zcDiJeMo2ip8VVwzqrsfcjRSY8GgbqAR3DidoYGfDRxfLavSrbpQOo+WYBBSIAV1A=="], + "@wrnexus/reactive": ["@wrnexus/reactive@0.2.14", "", {}, "sha512-v+GYTrUEmokrBNQjUllKUPbpRtRuPsRLXI8FRu2ecQ0i+achpdo1/oR3X51mqkkDsZMh84iNTbDWmAELk7bdyg=="], - "@wrnexus/router": ["@wrnexus/router@0.2.13", "", { "dependencies": { "@wrnexus/compiler": "^0.2.13", "@wrnexus/core": "^0.2.13" } }, "sha512-uAqbBGWz2gqhuqvri/Nuc807JJ4T4gb3plSMV6AGaC1fuEY1XCRjSgg4i8Noz/3ufHKinDiU+GyZ9Ka+KknIXg=="], + "@wrnexus/router": ["@wrnexus/router@0.2.14", "", { "dependencies": { "@wrnexus/compiler": "^0.2.14", "@wrnexus/core": "^0.2.14" } }, "sha512-MKRNQArv8lKuTPKo/9+LIVigjDfM3se9zjhhRB8725CyhKxED/DY7ORA37i0htz+VbUozKt9ZZGbx4HM7Bx2SA=="], - "@wrnexus/ssr": ["@wrnexus/ssr@0.2.13", "", { "dependencies": { "@wrnexus/core": "^0.2.13" } }, "sha512-hcZewoV4Or55lyStENAh9MD6ENj3wXpn5lbjqxvmVINUhdrk1bNuqfLKumFYU7SlkZvmA+t0UqNV1QQlkZq3Dw=="], + "@wrnexus/ssr": ["@wrnexus/ssr@0.2.14", "", { "dependencies": { "@wrnexus/core": "^0.2.14" } }, "sha512-G8BGpCqNLSjtdgQh5JeFPNSqtXPYnCMZAd/zLH/jCIR8uiimJ2UEnM8fQbfNLsivtoeK4QLzUnEOm/+1sjBkaw=="], - "@wrnexus/styles": ["@wrnexus/styles@0.2.13", "", { "dependencies": { "@wrnexus/uploader": "^0.2.13" } }, "sha512-PNLtYaJuEGILdP5kXMOPueXOmcN2u8uHyUc1W4/Yd+ivFk4NXDi2fDAgwbD95CAEZn5D+0V5OpsNJD3r4Vygmw=="], + "@wrnexus/styles": ["@wrnexus/styles@0.2.14", "", { "dependencies": { "@wrnexus/uploader": "^0.2.14" } }, "sha512-bhRlSAaRxhRQIHHWYgQEVqNI9z3INzlobCvUfYI2dsmLdnzeJiXM+8GZ09auJYhmaht3/F+wNrfUcoswN+ldfA=="], - "@wrnexus/test": ["@wrnexus/test@0.2.13", "", {}, "sha512-HXUfV7mxT7bL6USYxhFjV4kDsvVQmk68syMbkJA78S9MT0t/VauTjvT9jle8L8tmHA1pflGujkQVZTMjitxegA=="], + "@wrnexus/test": ["@wrnexus/test@0.2.14", "", {}, "sha512-iiLz8ps6djkKZcSqI2VjFtZv8i2dV3T/LmLh8AVUTtDxvae3PVlDVQ5n0qdqQEMWSVKOK+azhKWTpEwjIimNIg=="], - "@wrnexus/tracking": ["@wrnexus/tracking@0.2.13", "", {}, "sha512-ikRD4RNqwevEQIaON5aTRp+cemjKQFxfjin1RfUwCmIwoyPsGZqAqaQA5mpQhCkMjAXzCB+ytbFTHVATCpmJlw=="], + "@wrnexus/tracking": ["@wrnexus/tracking@0.2.14", "", {}, "sha512-+rPCXS3ZKa+zEYwihfoWGNOkq1/4SbRRN8pxNyQ59o8JrH4/DSETbatUfNLyIRiEbnw/6LHdHyHibr4TqTqtUA=="], - "@wrnexus/ui": ["@wrnexus/ui@0.2.13", "", { "dependencies": { "@wrnexus/core": "^0.2.13" } }, "sha512-Wop0x4ORymsVLh7CwqD5BOFLdr5p6CaGisZoPH6M/4lEeonp1tsQlltn3OS1x0VevlfVEyE11isRT3sL92sGOw=="], + "@wrnexus/ui": ["@wrnexus/ui@0.2.14", "", { "dependencies": { "@wrnexus/core": "^0.2.14" } }, "sha512-iAlhsPo08Isf+yDLmO+fHasSt7zxF7RTByKyf2AHq015ZMnF7fVtUrYlUqt0Tz5QQt4peFoVhmqKsmGkwMLVmA=="], - "@wrnexus/uploader": ["@wrnexus/uploader@0.2.13", "", { "dependencies": { "@wrnexus/core": "^0.2.13" } }, "sha512-tV1wWku2a49TrsNsU992NbXNTgJFWTnTnF6J9MyCY0OOEiFXI8FZPDpbowQBRvnJecUwwYrmIqs3BgYphaIG6A=="], + "@wrnexus/uploader": ["@wrnexus/uploader@0.2.14", "", { "dependencies": { "@wrnexus/core": "^0.2.14" } }, "sha512-RfUfUUsIflPHTX4TmGLkpoIK0YIixcLNJPuFrJQ6Nzu0xF7q1u6sBtsoxymAl6FoWfq3mP6kZ2Uq5nnVn9ON1Q=="], - "@wrnexus/validation": ["@wrnexus/validation@0.2.13", "", {}, "sha512-Jz/otKOQ80yXr4qbIRotKrjPVKv6DTNxBaoAdgQKqtCI5ynnNmKhR/Hd3dyZwuNHXdLzhcJp5xeNuDWBQ31xfg=="], + "@wrnexus/validation": ["@wrnexus/validation@0.2.14", "", {}, "sha512-X9wb8HG8eCWQL+NbOI4XVXkTGPqYA/t60RBeETrGyeBi6obeTeKoGwCvyCivuTk8tMyQtFwt/lbP9L3l2NJ2YA=="], "acorn": ["acorn@8.17.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg=="], diff --git a/llms.txt b/llms.txt index 6ce52319..0fa4aa49 100644 --- a/llms.txt +++ b/llms.txt @@ -243,7 +243,9 @@ export const POST = async (ctx) => { ``` wrnexus dev . # dev server + HMR wrnexus build . # production build → dist/server.js +bun dist/server.js # run the production server (or npm start) wrnexus create # scaffold a new app +wrnexus update --latest # deps + syntax/config migrations + verification wrnexus generate page # scaffold a page (aliases: g p) wrnexus generate component | api | schema wrnexus db migrate | rollback | status | new [--from-models] | generate | seed diff --git a/package.json b/package.json index 20d12fcf..9d71865c 100644 --- a/package.json +++ b/package.json @@ -12,40 +12,42 @@ "format": "prettier . --write", "format:check": "prettier . --check", "check": "bun run lint && bun run test && bun run format:check", - "docs:generate": "bun run scripts/generate-docs.ts" + "docs:generate": "bun run scripts/generate-docs.ts", + "start": "bun dist/server.js", + "production": "bun run build && bun run start" }, "dependencies": { - "@wrnexus/ai": "^0.2.13", - "@wrnexus/authz": "^0.2.13", - "@wrnexus/compiler": "^0.2.13", - "@wrnexus/core": "^0.2.13", - "@wrnexus/csr": "^0.2.13", - "@wrnexus/db": "^0.2.13", - "@wrnexus/dev-server": "^0.2.13", - "@wrnexus/encryption": "^0.2.13", - "@wrnexus/i18n": "^0.2.13", - "@wrnexus/jwt": "^0.2.13", - "@wrnexus/mobile": "^0.2.13", - "@wrnexus/native": "^0.2.13", - "@wrnexus/oauth": "^0.2.13", - "@wrnexus/pubsub": "^0.2.13", - "@wrnexus/queue": "^0.2.13", - "@wrnexus/reactive": "^0.2.13", - "@wrnexus/router": "^0.2.13", - "@wrnexus/ssr": "^0.2.13", - "@wrnexus/styles": "^0.2.13", - "@wrnexus/test": "^0.2.13", - "@wrnexus/tracking": "^0.2.13", - "@wrnexus/ui": "^0.2.13", - "@wrnexus/uploader": "^0.2.13", - "@wrnexus/validation": "^0.2.13" + "@wrnexus/ai": "^0.2.14", + "@wrnexus/authz": "^0.2.14", + "@wrnexus/compiler": "^0.2.14", + "@wrnexus/core": "^0.2.14", + "@wrnexus/csr": "^0.2.14", + "@wrnexus/db": "^0.2.14", + "@wrnexus/dev-server": "^0.2.14", + "@wrnexus/encryption": "^0.2.14", + "@wrnexus/i18n": "^0.2.14", + "@wrnexus/jwt": "^0.2.14", + "@wrnexus/mobile": "^0.2.14", + "@wrnexus/native": "^0.2.14", + "@wrnexus/oauth": "^0.2.14", + "@wrnexus/pubsub": "^0.2.14", + "@wrnexus/queue": "^0.2.14", + "@wrnexus/reactive": "^0.2.14", + "@wrnexus/router": "^0.2.14", + "@wrnexus/ssr": "^0.2.14", + "@wrnexus/styles": "^0.2.14", + "@wrnexus/test": "^0.2.14", + "@wrnexus/tracking": "^0.2.14", + "@wrnexus/ui": "^0.2.14", + "@wrnexus/uploader": "^0.2.14", + "@wrnexus/validation": "^0.2.14" }, "devDependencies": { "@eslint/js": "^9.0.0", "@tailwindcss/cli": "^4.0.0", "@types/bun": "latest", "@types/node": "^26.1.1", - "@wrnexus/cli": "^0.2.13", + "@wrnexus/cli": "^0.2.14", "eslint": "^9.0.0", "prettier": "latest", "tailwindcss": "^4.0.0", @@ -53,6 +55,6 @@ "typescript-eslint": "latest" }, "wrnexus": { - "version": "0.2.13" + "version": "0.2.14" } } diff --git a/scripts/generate-docs.ts b/scripts/generate-docs.ts index d5db5fe7..77733552 100644 --- a/scripts/generate-docs.ts +++ b/scripts/generate-docs.ts @@ -2,6 +2,11 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"; import { join, resolve } from "node:path"; const root = resolve(import.meta.dir, ".."); +const projectPackage = JSON.parse(readFileSync(join(root, "package.json"), "utf8")) as { + wrnexus?: { version?: string }; +}; +const frameworkVersion = projectPackage.wrnexus?.version; +if (!frameworkVersion) throw new Error("package.json is missing wrnexus.version"); const pages = join(root, "app", "pages"); const packagePages = join(pages, "packages"); mkdirSync(packagePages, { recursive: true }); @@ -201,7 +206,7 @@ ${state} ${content} -
    WrNexus 0.2.12 · SSR-first · Bun-native · Documentation generated from published package APIs.
    +
    WrNexus ${frameworkVersion} · SSR-first · Bun-native · Documentation generated from published package APIs.
    } } @@ -237,7 +242,7 @@ writeFileSync( shell( "Packages", "Explore every WrNexus package, API, function, and copy-ready usage example.", - `
    25 focused packages

    Package reference

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

    ${categoryButtons}

    Showing {category} packages

    ${cards}
    `, + `
    25 focused packages

    Package reference

    Everything in the framework, organized by responsibility and documented from the published ${frameworkVersion} APIs.

    ${categoryButtons}

    Showing {category} packages

    ${cards}
    `, ' state query = ""\n state category = "All"\n', ), ); @@ -263,8 +268,8 @@ for (const [name, category, summary] of catalog) { ) .join(""); const content = `
    - -
    ${category}

    @wrnexus/${name}

    ${summary}

    bun add @wrnexus/${name}@0.2.12
    ${guide.html}

    Complete TypeScript API

    This declaration is generated from the exact published package and lists its exported functions, classes, interfaces, and types.

    ${escape(types)}

    Examples

    Copy-ready examples taken from this package's published documentation.

    ${examplesFrom(readme, name)}
    + +
    ${category}

    @wrnexus/${name}

    ${summary}

    bun add @wrnexus/${name}@${frameworkVersion}
    ${guide.html}

    Complete TypeScript API

    This declaration is generated from the exact published package and lists its exported functions, classes, interfaces, and types.

    ${escape(types)}

    Examples

    Copy-ready examples taken from this package's published documentation.

    ${examplesFrom(readme, name)}
    `; writeFileSync(join(packagePages, `${name}.wrn`), shell(`@wrnexus/${name}`, summary, content)); @@ -275,7 +280,7 @@ writeFileSync( shell( "Home", "WrNexus documentation: build secure, server-rendered, reactive applications with Bun.", - `
    WrNexus 0.2.12

    Build from the server.
    Ship only what matters.

    An SSR-first, Bun-native framework with reactive .wrn components, typed data, realtime rooms, mobile capabilities, and production security built in.

    app/pages/counter.wrn
    page Counter {
    +    `
    WrNexus ${frameworkVersion}

    Build from the server.
    Ship only what matters.

    An SSR-first, Bun-native framework with reactive .wrn components, typed data, realtime rooms, mobile capabilities, and production security built in.

    app/pages/counter.wrn
    page Counter {
       state count = 0
       view {
         <button @click="count++">