docs: update portal for WRNexusJS 0.8.72

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

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

No files matched your search

+6 -6
View File
@@ -10,7 +10,7 @@ page wrnexusuploader {
<header class="topbar">
<a class="brand" href="/"><span>W</span> WRNexusJS</a>
<nav aria-label="Primary"><a href="/getting-started">Get started</a><a href="/packages">Packages</a><a href="https://component.wrnexusjs.dev/">Components</a><a href="/language">Language</a><a href="/architecture">Architecture</a></nav>
<div class="topbar-actions"><a class="preview-pill" href="/access">Private preview · v0.8.8</a><button data-wire-theme-toggle class="theme-button" aria-label="Toggle color theme" title="Toggle color theme">◐</button></div>
<div class="topbar-actions"><a class="preview-pill" href="/access">Private preview · v0.8.72</a><button data-wire-theme-toggle class="theme-button" aria-label="Toggle color theme" title="Toggle color theme">◐</button></div>
</header>
<div class="mobile-doc-nav"><details><summary>Browse documentation</summary><nav><a href="/getting-started">Get started</a><a href="/packages">Packages</a><a href="https://component.wrnexusjs.dev/">Components</a><a href="/language">Language</a><a href="/architecture">Architecture</a><a href="/tutorial">Tutorial</a><a href="/guides/project-structure">Guides</a><a href="/examples">Examples</a><a href="/search">Search</a></nav></details></div>
<main id="main" class="portal-main docs-layout docs-layout--navigation"><aside class="docs-section-menu" aria-label="Documentation sections"><nav>
@@ -20,7 +20,7 @@ page wrnexusuploader {
<section><strong>Reference</strong><a href="/packages">Packages overview</a><a href="/packages/cli">CLI</a><a href="/language">.wrn language</a><a href="https://component.wrnexusjs.dev/">Components</a><a href="/examples">Examples</a></section>
<section class="package-menu"><strong>Packages</strong><a href="/packages/ai">@wrnexus/ai</a><a href="/packages/auth">@wrnexus/auth</a><a href="/packages/authz">@wrnexus/authz</a><a href="/packages/benchmark">@wrnexus/benchmark</a><a href="/packages/cache">@wrnexus/cache</a><a href="/packages/captcha">@wrnexus/captcha</a><a href="/packages/cli">@wrnexus/cli</a><a href="/packages/compiler">@wrnexus/compiler</a><a href="/packages/content">@wrnexus/content</a><a href="/packages/core">@wrnexus/core</a><a href="/packages/csr">@wrnexus/csr</a><a href="/packages/db">@wrnexus/db</a><a href="/packages/dev-server">@wrnexus/dev-server</a><a href="/packages/dev-toolbar">@wrnexus/dev-toolbar</a><a href="/packages/encryption">@wrnexus/encryption</a><a href="/packages/graphql">@wrnexus/graphql</a><a href="/packages/helpers">@wrnexus/helpers</a><a href="/packages/i18n">@wrnexus/i18n</a><a href="/packages/identity">@wrnexus/identity</a><a href="/packages/image">@wrnexus/image</a><a href="/packages/jwt">@wrnexus/jwt</a><a href="/packages/language-server">@wrnexus/language-server</a><a href="/packages/mcp">@wrnexus/mcp</a><a href="/packages/mobile">@wrnexus/mobile</a><a href="/packages/native">@wrnexus/native</a><a href="/packages/oauth">@wrnexus/oauth</a><a href="/packages/observability">@wrnexus/observability</a><a href="/packages/playground">@wrnexus/playground</a><a href="/packages/plugin">@wrnexus/plugin</a><a href="/packages/pubsub">@wrnexus/pubsub</a><a href="/packages/pwa">@wrnexus/pwa</a><a href="/packages/queue">@wrnexus/queue</a><a href="/packages/reactive">@wrnexus/reactive</a><a href="/packages/realtime">@wrnexus/realtime</a><a href="/packages/router">@wrnexus/router</a><a href="/packages/security">@wrnexus/security</a><a href="/packages/ssr">@wrnexus/ssr</a><a href="/packages/store">@wrnexus/store</a><a href="/packages/styles">@wrnexus/styles</a><a href="/packages/syntax">@wrnexus/syntax</a><a href="/packages/test">@wrnexus/test</a><a href="/packages/tracking">@wrnexus/tracking</a><a href="/packages/typecheck">@wrnexus/typecheck</a><a href="/packages/ui">@wrnexus/ui</a><a href="/packages/uploader">@wrnexus/uploader</a><a href="/packages/validation">@wrnexus/validation</a></section>
</nav></aside><div class="docs-reading-column">
<article class="documentation prose standalone package-document"><nav class="breadcrumbs" aria-label="Breadcrumb"><a href="/">Home</a><span>/</span><a href="/packages">Packages</a><span>/</span><span aria-current="page">@wrnexus/uploader</span></nav><section class="doc-intro"><span class="eyebrow">Data · Package reference</span><h1>@wrnexus/uploader</h1><p>Validated local/S3 uploads and secure file serving.</p><div class="doc-meta"><span>v0.8.8</span><span>Private registry</span><span>Data</span></div><section id="access" class="access-callout"><h2>Install the package</h2><p>After WorkRoot approves private registry access, install the release-aligned package:</p><pre><code>bun add @wrnexus/uploader@0.8.8</code><button type="button" class="copy-button" aria-label="Copy installation command">Copy</button></pre><p><a href="/access">Request preview access</a>. Never put registry tokens in source control.</p></section></section><section id="guide"><p>Config-driven file uploads + serving for <a href="https://www.npmjs.com/org/wrnexus" rel="noreferrer">WRNexusJS</a>. Declare named <strong>storage stores</strong> (local disk or any S3-compatible backend) in <code>wrnexus.config.ts</code>, 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).</p>
<article class="documentation prose standalone package-document"><nav class="breadcrumbs" aria-label="Breadcrumb"><a href="/">Home</a><span>/</span><a href="/packages">Packages</a><span>/</span><span aria-current="page">@wrnexus/uploader</span></nav><section class="doc-intro"><span class="eyebrow">Data · Package reference</span><h1>@wrnexus/uploader</h1><p>Validated local/S3 uploads and secure file serving.</p><div class="doc-meta"><span>v0.8.13</span><span>Private registry</span><span>Data</span></div><section id="access" class="access-callout"><h2>Install the package</h2><p>After WorkRoot approves private registry access, install the package:</p><pre><code>bun add @wrnexus/uploader@0.8.13</code><button type="button" class="copy-button" aria-label="Copy installation command">Copy</button></pre><p><a href="/access">Request preview access</a>. Never put registry tokens in source control.</p></section></section><section id="guide"><p>Config-driven file uploads + serving for <a href="https://www.npmjs.com/org/wrnexus" rel="noreferrer">WRNexusJS</a>. Declare named <strong>storage stores</strong> (local disk or any S3-compatible backend) in <code>wrnexus.config.ts</code>, 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).</p>
<h3 id="usage">Usage</h3>
<h4 id="configure-local-and-s3-stores">Configure local and S3 stores</h4>
<pre data-language="ts"><code>// wrnexus.config.ts
@@ -316,7 +316,7 @@ declare function serveFromStore(storeName?: string, opts?: &#123;
/**
* Framework asset hook: serve PUBLIC local objects at
* `/__wrnexus/uploads/&lt;store&gt;/&lt;key&gt;`. 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&lt;Response | null&gt;;
@@ -326,7 +326,7 @@ declare function serveStoredFile(pathname: string): Promise&lt;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 `&lt;form&gt;` fallback if you wrap it):
* &lt;div data-uploader=&quot;public&quot; data-endpoint=&quot;/api/upload&quot;
@@ -340,7 +340,7 @@ declare function serveStoredFile(pathname: string): Promise&lt;Response | null&g
* backticks and no $&#123;...&#125;, so it embeds safely in the exported template string.
*/
declare const UPLOAD_JS_HREF = &quot;/__wrnexus/uploader.js&quot;;
declare const UPLOAD_RUNTIME = &quot;\n(function () &#123;\n if (typeof document === \&quot;undefined\&quot;) return;\n var CSRF_COOKIE = \&quot;wire-csrf\&quot;;\n\n var CSS =\n \&quot;.wire-uploader&#123;display:block&#125;\&quot; +\n \&quot;.wire-uploader-zone&#123;display:flex;align-items:center;justify-content:center;text-align:center;\&quot; +\n \&quot;min-height:8rem;padding:1.25rem;border:2px dashed var(--wire-border,#cbd5e1);border-radius:12px;\&quot; +\n \&quot;background:var(--wire-surface,transparent);color:var(--wire-muted,#64748b);cursor:pointer;\&quot; +\n \&quot;transition:border-color .15s ease,background-color .15s ease;position:relative&#125;\&quot; +\n \&quot;.wire-uploader-zone:hover,.wire-uploader-zone:focus-visible&#123;border-color:var(--wire-brand,#3f7dff);outline:none&#125;\&quot; +\n \&quot;.wire-uploader-zone.is-drag&#123;border-color:var(--wire-brand,#3f7dff);background:color-mix(in oklab,var(--wire-brand,#3f7dff) 8%,transparent)&#125;\&quot; +\n \&quot;.wire-uploader-prompt&#123;font-size:.9rem;pointer-events:none&#125;\&quot; +\n \&quot;.wire-uploader-input&#123;position:absolute;inset:0;width:100%;height:100%;opacity:0;cursor:pointer&#125;\&quot; +\n \&quot;.wire-uploader-list&#123;list-style:none;margin:.75rem 0 0;padding:0;display:flex;flex-direction:column;gap:.5rem&#125;\&quot; +\n \&quot;.wire-uploader-item&#123;display:grid;grid-template-columns:1fr auto;gap:.15rem .75rem;align-items:center;\&quot; +\n \&quot;font-size:.82rem;padding:.5rem .7rem;border:1px solid var(--wire-border,#e2e8f0);border-radius:8px&#125;\&quot; +\n \&quot;.wire-uploader-name&#123;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--wire-text,#0f172a)&#125;\&quot; +\n \&quot;.wire-uploader-meta&#123;color:var(--wire-muted,#94a3b8);font-variant-numeric:tabular-nums&#125;\&quot; +\n \&quot;.wire-uploader-bar&#123;grid-column:1/-1;height:5px;border-radius:999px;background:var(--wire-border,#e2e8f0);overflow:hidden&#125;\&quot; +\n \&quot;.wire-uploader-fill&#123;height:100%;width:0;border-radius:999px;background:var(--wire-brand,#3f7dff);transition:width .15s ease&#125;\&quot; +\n \&quot;.wire-uploader-status&#123;grid-column:1/-1;font-size:.75rem;color:var(--wire-muted,#94a3b8);font-variant-numeric:tabular-nums&#125;\&quot; +\n \&quot;.wire-uploader-item.is-done .wire-uploader-fill&#123;background:var(--wire-success,#16a34a)&#125;\&quot; +\n \&quot;.wire-uploader-item.is-done .wire-uploader-status&#123;color:var(--wire-success,#16a34a)&#125;\&quot; +\n \&quot;.wire-uploader-item.is-error .wire-uploader-fill&#123;background:var(--wire-danger,#dc2626)&#125;\&quot; +\n \&quot;.wire-uploader-item.is-error .wire-uploader-status&#123;color:var(--wire-danger,#dc2626)&#125;\&quot;;\n\n function injectCss() &#123;\n if (document.getElementById(\&quot;wire-uploader-css\&quot;)) return;\n var s = document.createElement(\&quot;style\&quot;);\n s.id = \&quot;wire-uploader-css\&quot;;\n s.textContent = CSS;\n document.head.appendChild(s);\n &#125;\n\n function cookie(name) &#123;\n var m = document.cookie.match(new RegExp(\&quot;(?:^|; )\&quot; + name + \&quot;=([^;]*)\&quot;));\n return m ? decodeURIComponent(m[1]) : \&quot;\&quot;;\n &#125;\n function el(tag, cls, text) &#123;\n var e = document.createElement(tag);\n if (cls) e.className = cls;\n if (text != null) e.textContent = text;\n return e;\n &#125;\n function fmt(n) &#123;\n if (n &lt; 1024) return n + \&quot; B\&quot;;\n if (n &lt; 1048576) return (n / 1024).toFixed(1) + \&quot; KB\&quot;;\n return (n / 1048576).toFixed(1) + \&quot; MB\&quot;;\n &#125;\n function accepts(accept, file) &#123;\n var list = (accept || \&quot;\&quot;).split(\&quot;,\&quot;).map(function (s) &#123; return s.trim().toLowerCase(); &#125;).filter(Boolean);\n if (!list.length) return true;\n var type = (file.type || \&quot;\&quot;).toLowerCase();\n var name = (file.name || \&quot;\&quot;).toLowerCase();\n var ext = name.indexOf(\&quot;.\&quot;) &gt;= 0 ? name.slice(name.lastIndexOf(\&quot;.\&quot;)) : \&quot;\&quot;;\n return list.some(function (rule) &#123;\n if (rule.charAt(0) === \&quot;.\&quot;) return rule === ext;\n if (rule.slice(-2) === \&quot;/*\&quot;) return type.indexOf(rule.slice(0, -1)) === 0;\n return rule === type;\n &#125;);\n &#125;\n\n function setup(root) &#123;\n if (root.__wrnexusUploader) return;\n root.__wrnexusUploader = true;\n\n var endpoint = root.getAttribute(\&quot;data-endpoint\&quot;) || \&quot;/api/upload\&quot;;\n var multipleAttr = root.getAttribute(\&quot;data-multiple\&quot;);\n var multiple = root.hasAttribute(\&quot;data-multiple\&quot;) &amp;&amp; multipleAttr !== \&quot;false\&quot;;\n var accept = root.getAttribute(\&quot;data-accept\&quot;) || \&quot;\&quot;;\n var maxBytes = parseInt(root.getAttribute(\&quot;data-max\&qLine truncated
declare const UPLOAD_RUNTIME = &quot;\n(function () &#123;\n if (typeof document === \&quot;undefined\&quot;) return;\n var CSRF_COOKIE = \&quot;wrn-csrf\&quot;;\n\n var CSS =\n \&quot;.wrn-uploader&#123;display:block&#125;\&quot; +\n \&quot;.wrn-uploader-zone&#123;display:flex;align-items:center;justify-content:center;text-align:center;\&quot; +\n \&quot;min-height:8rem;padding:1.25rem;border:2px dashed var(--wrn-border,#cbd5e1);border-radius:12px;\&quot; +\n \&quot;background:var(--wrn-surface,transparent);color:var(--wrn-muted,#64748b);cursor:pointer;\&quot; +\n \&quot;transition:border-color .15s ease,background-color .15s ease;position:relative&#125;\&quot; +\n \&quot;.wrn-uploader-zone:hover,.wrn-uploader-zone:focus-visible&#123;border-color:var(--wrn-brand,#3f7dff);outline:none&#125;\&quot; +\n \&quot;.wrn-uploader-zone.is-drag&#123;border-color:var(--wrn-brand,#3f7dff);background:color-mix(in oklab,var(--wrn-brand,#3f7dff) 8%,transparent)&#125;\&quot; +\n \&quot;.wrn-uploader-prompt&#123;font-size:.9rem;pointer-events:none&#125;\&quot; +\n \&quot;.wrn-uploader-input&#123;position:absolute;inset:0;width:100%;height:100%;opacity:0;cursor:pointer&#125;\&quot; +\n \&quot;.wrn-uploader-list&#123;list-style:none;margin:.75rem 0 0;padding:0;display:flex;flex-direction:column;gap:.5rem&#125;\&quot; +\n \&quot;.wrn-uploader-item&#123;display:grid;grid-template-columns:1fr auto;gap:.15rem .75rem;align-items:center;\&quot; +\n \&quot;font-size:.82rem;padding:.5rem .7rem;border:1px solid var(--wrn-border,#e2e8f0);border-radius:8px&#125;\&quot; +\n \&quot;.wrn-uploader-name&#123;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--wrn-text,#0f172a)&#125;\&quot; +\n \&quot;.wrn-uploader-meta&#123;color:var(--wrn-muted,#94a3b8);font-variant-numeric:tabular-nums&#125;\&quot; +\n \&quot;.wrn-uploader-bar&#123;grid-column:1/-1;height:5px;border-radius:999px;background:var(--wrn-border,#e2e8f0);overflow:hidden&#125;\&quot; +\n \&quot;.wrn-uploader-fill&#123;height:100%;width:0;border-radius:999px;background:var(--wrn-brand,#3f7dff);transition:width .15s ease&#125;\&quot; +\n \&quot;.wrn-uploader-status&#123;grid-column:1/-1;font-size:.75rem;color:var(--wrn-muted,#94a3b8);font-variant-numeric:tabular-nums&#125;\&quot; +\n \&quot;.wrn-uploader-item.is-done .wrn-uploader-fill&#123;background:var(--wrn-success,#16a34a)&#125;\&quot; +\n \&quot;.wrn-uploader-item.is-done .wrn-uploader-status&#123;color:var(--wrn-success,#16a34a)&#125;\&quot; +\n \&quot;.wrn-uploader-item.is-error .wrn-uploader-fill&#123;background:var(--wrn-danger,#dc2626)&#125;\&quot; +\n \&quot;.wrn-uploader-item.is-error .wrn-uploader-status&#123;color:var(--wrn-danger,#dc2626)&#125;\&quot;;\n\n function injectCss() &#123;\n if (document.getElementById(\&quot;wrn-uploader-css\&quot;)) return;\n var s = document.createElement(\&quot;style\&quot;);\n s.id = \&quot;wrn-uploader-css\&quot;;\n s.textContent = CSS;\n document.head.appendChild(s);\n &#125;\n\n function cookie(name) &#123;\n var m = document.cookie.match(new RegExp(\&quot;(?:^|; )\&quot; + name + \&quot;=([^;]*)\&quot;));\n return m ? decodeURIComponent(m[1]) : \&quot;\&quot;;\n &#125;\n function el(tag, cls, text) &#123;\n var e = document.createElement(tag);\n if (cls) e.className = cls;\n if (text != null) e.textContent = text;\n return e;\n &#125;\n function fmt(n) &#123;\n if (n &lt; 1024) return n + \&quot; B\&quot;;\n if (n &lt; 1048576) return (n / 1024).toFixed(1) + \&quot; KB\&quot;;\n return (n / 1048576).toFixed(1) + \&quot; MB\&quot;;\n &#125;\n function accepts(accept, file) &#123;\n var list = (accept || \&quot;\&quot;).split(\&quot;,\&quot;).map(function (s) &#123; return s.trim().toLowerCase(); &#125;).filter(Boolean);\n if (!list.length) return true;\n var type = (file.type || \&quot;\&quot;).toLowerCase();\n var name = (file.name || \&quot;\&quot;).toLowerCase();\n var ext = name.indexOf(\&quot;.\&quot;) &gt;= 0 ? name.slice(name.lastIndexOf(\&quot;.\&quot;)) : \&quot;\&quot;;\n return list.some(function (rule) &#123;\n if (rule.charAt(0) === \&quot;.\&quot;) return rule === ext;\n if (rule.slice(-2) === \&quot;/*\&quot;) return type.indexOf(rule.slice(0, -1)) === 0;\n return rule === type;\n &#125;);\n &#125;\n\n function setup(root) &#123;\n if (root.__wrnexusUploader) return;\n root.__wrnexusUploader = true;\n\n var endpoint = root.getAttribute(\&quot;data-endpoint\&quot;) || \&quot;/api/upload\&quot;;\n var multipleAttr = root.getAttribute(\&quot;data-multiple\&quot;);\n var multiple = root.hasAttribute(\&quot;data-multiple\&quot;) &amp;&amp; multipleAttr !== \&quot;false\&quot;;\n var accept = root.getAttribute(\&quot;data-accept\&quot;) || \&quot;\&quot;;\n var maxBytes = parseInt(root.getAttribute(\&quot;data-max\&quot;) || \&quot;0\&quot;, 10) || 0;\n Line truncated
/**
* Local-disk storage driver. Files live under a configured directory; keys map
@@ -638,7 +638,7 @@ import &#123; serveFromStore &#125; from &quot;@wrnexus/uploader&quot;;
export const GET = serveFromStore(&quot;docs&quot;); // your middleware decides who gets in</code></pre></article></div></section></article></div>
<aside class="on-this-page"><h2>On this page</h2><nav><a class="toc-level-2" href="#guide">Guide</a><a class="toc-level-3" href="#usage">Usage</a><a class="toc-level-4" href="#configure-local-and-s3-stores">Configure local and S3 stores</a><a class="toc-level-4" href="#upload-from-an-api-route-or-server-function">Upload from an API route or server function</a><a class="toc-level-4" href="#add-a-client-upload-widget">Add a client upload widget</a><a class="toc-level-4" href="#serve-private-files-behind-application-authentication">Serve private files behind application authentication</a><a class="toc-level-3" href="#api">API</a><a class="toc-level-3" href="#notes">Notes</a><a class="toc-level-3" href="#helper-and-component-kit">Helper and component kit</a><a class="toc-level-2" href="#api">Complete API</a><a class="toc-level-2" href="#examples">Examples</a></nav></aside>
</main>
<footer><div class="footer-brand"><span class="footer-mark" aria-hidden="true">W</span><p><strong>WRNexusJS 0.8.8</strong><span>Complete API documentation generated from installed package declarations.</span></p></div><nav aria-label="Footer"><a href="/packages">All packages</a><a href="/getting-started">Get started</a><a href="/security">Security</a><a href="/support">Support</a><a href="/llms.txt">AI guide</a></nav><p class="footer-meta">Private Developer Preview · Bun-native</p></footer>
<footer><div class="footer-brand"><span class="footer-mark" aria-hidden="true">W</span><p><strong>WRNexusJS 0.8.72</strong><span>Complete API documentation generated from installed package declarations.</span></p></div><nav aria-label="Footer"><a href="/packages">All packages</a><a href="/getting-started">Get started</a><a href="/security">Security</a><a href="/support">Support</a><a href="/llms.txt">AI guide</a></nav><p class="footer-meta">Private Developer Preview · Bun-native</p></footer>
</div>
}
}