alabjs 0.2.6 → 0.3.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analytics/handler.d.ts +5 -1
- package/dist/analytics/handler.d.ts.map +1 -1
- package/dist/analytics/handler.js +14 -10
- package/dist/analytics/handler.js.map +1 -1
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/client/hooks.d.ts +9 -1
- package/dist/client/hooks.d.ts.map +1 -1
- package/dist/client/hooks.js +26 -2
- package/dist/client/hooks.js.map +1 -1
- package/dist/commands/build.d.ts.map +1 -1
- package/dist/commands/build.js +163 -43
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/start.js +1 -1
- package/dist/commands/start.js.map +1 -1
- package/dist/components/Image.d.ts +0 -12
- package/dist/components/Image.d.ts.map +1 -1
- package/dist/components/Image.js +2 -29
- package/dist/components/Image.js.map +1 -1
- package/dist/components/ImageServer.d.ts +20 -0
- package/dist/components/ImageServer.d.ts.map +1 -0
- package/dist/components/ImageServer.js +37 -0
- package/dist/components/ImageServer.js.map +1 -0
- package/dist/components/index.d.ts +1 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +1 -1
- package/dist/components/index.js.map +1 -1
- package/dist/server/app.d.ts.map +1 -1
- package/dist/server/app.js +193 -43
- package/dist/server/app.js.map +1 -1
- package/dist/server/cache.d.ts.map +1 -1
- package/dist/server/cache.js +23 -1
- package/dist/server/cache.js.map +1 -1
- package/dist/server/csrf.d.ts.map +1 -1
- package/dist/server/csrf.js +5 -0
- package/dist/server/csrf.js.map +1 -1
- package/dist/ssr/html.d.ts.map +1 -1
- package/dist/ssr/html.js +15 -0
- package/dist/ssr/html.js.map +1 -1
- package/dist/ssr/ppr.d.ts.map +1 -1
- package/dist/ssr/ppr.js +2 -1
- package/dist/ssr/ppr.js.map +1 -1
- package/package.json +8 -3
- package/src/analytics/handler.ts +15 -10
- package/src/cli.ts +3 -1
- package/src/client/hooks.ts +30 -2
- package/src/commands/build.ts +182 -47
- package/src/commands/start.ts +1 -1
- package/src/components/Image.tsx +2 -35
- package/src/components/ImageServer.ts +43 -0
- package/src/components/index.ts +1 -1
- package/src/server/app.ts +210 -44
- package/src/server/cache.ts +23 -1
- package/src/server/csrf.ts +5 -0
- package/src/ssr/html.ts +15 -0
- package/src/ssr/ppr.ts +2 -1
- package/tsconfig.tsbuildinfo +1 -1
package/dist/server/cache.js
CHANGED
|
@@ -19,7 +19,18 @@
|
|
|
19
19
|
*/
|
|
20
20
|
/** Sentinel value returned when a cache key has no valid entry. */
|
|
21
21
|
const CACHE_MISS = Symbol("alab:cache_miss");
|
|
22
|
-
/**
|
|
22
|
+
/**
|
|
23
|
+
* Global in-process LRU cache. Shared across all server function calls.
|
|
24
|
+
*
|
|
25
|
+
* Max size is capped to prevent unbounded memory growth in long-running servers.
|
|
26
|
+
* When the cap is reached, the oldest entry (by insertion order) is evicted.
|
|
27
|
+
*
|
|
28
|
+
* ⚠️ Multi-tenant note: this cache is process-wide and shared across all
|
|
29
|
+
* requests. In multi-tenant deployments, cache keys MUST include a tenant
|
|
30
|
+
* identifier (e.g. `tenant:${tenantId}:posts`) to prevent data leakage
|
|
31
|
+
* between tenants.
|
|
32
|
+
*/
|
|
33
|
+
const _STORE_MAX = 2048;
|
|
23
34
|
const _store = new Map();
|
|
24
35
|
export { CACHE_MISS };
|
|
25
36
|
/** Retrieve a cached value. Returns `CACHE_MISS` if absent or expired. */
|
|
@@ -31,10 +42,17 @@ export function getCached(key) {
|
|
|
31
42
|
_store.delete(key);
|
|
32
43
|
return CACHE_MISS;
|
|
33
44
|
}
|
|
45
|
+
// Move to end (LRU: mark as recently used)
|
|
46
|
+
_store.delete(key);
|
|
47
|
+
_store.set(key, entry);
|
|
34
48
|
return entry.data;
|
|
35
49
|
}
|
|
36
50
|
/** Store a value in the cache with a TTL (seconds) and optional tags. */
|
|
37
51
|
export function setCache(key, data, opts) {
|
|
52
|
+
// Evict oldest entry when at capacity
|
|
53
|
+
if (_store.size >= _STORE_MAX && !_store.has(key)) {
|
|
54
|
+
_store.delete(_store.keys().next().value);
|
|
55
|
+
}
|
|
38
56
|
_store.set(key, {
|
|
39
57
|
data,
|
|
40
58
|
expires: Date.now() + opts.ttl * 1_000,
|
|
@@ -64,6 +82,7 @@ export function invalidateCache(opts) {
|
|
|
64
82
|
export function invalidateCacheKey(key) {
|
|
65
83
|
_store.delete(key);
|
|
66
84
|
}
|
|
85
|
+
const _PAGE_STORE_MAX = 1024;
|
|
67
86
|
const _pageStore = new Map();
|
|
68
87
|
/**
|
|
69
88
|
* Retrieve a cached HTML page. Returns `null` if absent or fully expired
|
|
@@ -87,6 +106,9 @@ export function getCachedPage(pathname) {
|
|
|
87
106
|
}
|
|
88
107
|
/** Store a rendered HTML page with a TTL (seconds). */
|
|
89
108
|
export function setCachedPage(pathname, html, ttl, tags = []) {
|
|
109
|
+
if (_pageStore.size >= _PAGE_STORE_MAX && !_pageStore.has(pathname)) {
|
|
110
|
+
_pageStore.delete(_pageStore.keys().next().value);
|
|
111
|
+
}
|
|
90
112
|
_pageStore.set(pathname, { html, expires: Date.now() + ttl * 1_000, ttl, revalidating: false, tags });
|
|
91
113
|
}
|
|
92
114
|
/** Mark a page as currently being revalidated to prevent concurrent regen. */
|
package/dist/server/cache.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/server/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AASH,mEAAmE;AACnE,MAAM,UAAU,GAAkB,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAE5D,
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/server/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"csrf.d.ts","sourceRoot":"","sources":["../../src/server/csrf.ts"],"names":[],"mappings":"AACA,OAAO,EAML,KAAK,OAAO,EACb,MAAM,IAAI,CAAC;AAEZ,eAAO,MAAM,WAAW,cAAc,CAAC;AACvC,eAAO,MAAM,WAAW,iBAAiB,CAAC;AAI1C;;;;;;;;;GASG;AACH,wBAAgB,cAAc,
|
|
1
|
+
{"version":3,"file":"csrf.d.ts","sourceRoot":"","sources":["../../src/server/csrf.ts"],"names":[],"mappings":"AACA,OAAO,EAML,KAAK,OAAO,EACb,MAAM,IAAI,CAAC;AAEZ,eAAO,MAAM,WAAW,cAAc,CAAC;AACvC,eAAO,MAAM,WAAW,iBAAiB,CAAC;AAI1C;;;;;;;;;GASG;AACH,wBAAgB,cAAc,sEA6B7B;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAapD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjD"}
|
package/dist/server/csrf.js
CHANGED
|
@@ -21,6 +21,11 @@ export function csrfMiddleware() {
|
|
|
21
21
|
const method = event.method.toUpperCase();
|
|
22
22
|
if (SAFE_METHODS.has(method))
|
|
23
23
|
return;
|
|
24
|
+
// Internal endpoints that use their own auth (Bearer token, no cookie session)
|
|
25
|
+
// don't need CSRF protection.
|
|
26
|
+
const path = (event.node.req.url ?? "").split("?")[0] ?? "";
|
|
27
|
+
if (path === "/_alabjs/revalidate" || path === "/_alabjs/vitals")
|
|
28
|
+
return;
|
|
24
29
|
const cookieToken = getCookie(event, CSRF_COOKIE);
|
|
25
30
|
const headerToken = getHeader(event, CSRF_HEADER);
|
|
26
31
|
const tokensMatch = !!cookieToken &&
|
package/dist/server/csrf.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"csrf.js","sourceRoot":"","sources":["../../src/server/csrf.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EACL,kBAAkB,EAClB,SAAS,EACT,SAAS,EACT,SAAS,EACT,WAAW,GAEZ,MAAM,IAAI,CAAC;AAEZ,MAAM,CAAC,MAAM,WAAW,GAAG,WAAW,CAAC;AACvC,MAAM,CAAC,MAAM,WAAW,GAAG,cAAc,CAAC;AAE1C,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;AAEzD;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,kBAAkB,CAAC,CAAC,KAAK,EAAE,EAAE;QAClC,+DAA+D;QAC/D,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,YAAY;YAAE,OAAO;QAErD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QAC1C,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,OAAO;QAErC,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAClD,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAElD,MAAM,WAAW,GACf,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,WAAW;YACb,WAAW,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM;YACzC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;QAEtE,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,WAAW,CAAC;gBAChB,UAAU,EAAE,GAAG;gBACf,OAAO,EAAE,uDAAuD;aACjE,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAC/C,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IAClC,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE;QACnC,QAAQ,EAAE,KAAK;QACf,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,YAAY;QAChD,IAAI,EAAE,GAAG;QACT,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,WAAW;KAClC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,oCAAoC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC;AACjF,CAAC"}
|
|
1
|
+
{"version":3,"file":"csrf.js","sourceRoot":"","sources":["../../src/server/csrf.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EACL,kBAAkB,EAClB,SAAS,EACT,SAAS,EACT,SAAS,EACT,WAAW,GAEZ,MAAM,IAAI,CAAC;AAEZ,MAAM,CAAC,MAAM,WAAW,GAAG,WAAW,CAAC;AACvC,MAAM,CAAC,MAAM,WAAW,GAAG,cAAc,CAAC;AAE1C,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;AAEzD;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,kBAAkB,CAAC,CAAC,KAAK,EAAE,EAAE;QAClC,+DAA+D;QAC/D,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,YAAY;YAAE,OAAO;QAErD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QAC1C,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,OAAO;QAErC,+EAA+E;QAC/E,8BAA8B;QAC9B,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5D,IAAI,IAAI,KAAK,qBAAqB,IAAI,IAAI,KAAK,iBAAiB;YAAE,OAAO;QAEzE,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAClD,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAElD,MAAM,WAAW,GACf,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,WAAW;YACb,WAAW,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM;YACzC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;QAEtE,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,WAAW,CAAC;gBAChB,UAAU,EAAE,GAAG;gBACf,OAAO,EAAE,uDAAuD;aACjE,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAC/C,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IAClC,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE;QACnC,QAAQ,EAAE,KAAK;QACf,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,YAAY;QAChD,IAAI,EAAE,GAAG;QACT,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,WAAW;KAClC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,oCAAoC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC;AACjF,CAAC"}
|
package/dist/ssr/html.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../src/ssr/html.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,YAAY,CAAC;IACvB,+EAA+E;IAC/E,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,gBAAgB,EAAE,MAAM,CAAC;IACzB,yEAAyE;IACzE,SAAS,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,GAAG,EAAE,OAAO,CAAC;IACb,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,oFAAoF;IACpF,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAED,iGAAiG;AACjG,wBAAgB,eAAe,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAgE9D;AAED,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../src/ssr/html.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,YAAY,CAAC;IACvB,+EAA+E;IAC/E,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,gBAAgB,EAAE,MAAM,CAAC;IACzB,yEAAyE;IACzE,SAAS,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,GAAG,EAAE,OAAO,CAAC;IACb,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,oFAAoF;IACpF,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAED,iGAAiG;AACjG,wBAAgB,eAAe,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAgE9D;AAED,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAAG,MAAM,CAqB3E;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,gBAAgB,EAAE,UAAU,GAAG,WAAW,CAAC,GAAG,MAAM,CAchG;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI,CAAC,gBAAgB,EAAE,UAAU,GAAG,WAAW,CAAC,GACrD,MAAM,CA0BR"}
|
package/dist/ssr/html.js
CHANGED
|
@@ -49,7 +49,22 @@ export function htmlShellBefore(opts) {
|
|
|
49
49
|
/** Build the closing HTML fragment — everything after the SSR content. */
|
|
50
50
|
export function htmlShellAfter(opts) {
|
|
51
51
|
const nonceAttr = opts.nonce ? ` nonce="${escAttr(opts.nonce)}"` : "";
|
|
52
|
+
// The Rust compiler (oxc_transformer::enable_all) always emits $RefreshReg$ /
|
|
53
|
+
// $RefreshSig$ calls into TSX files, even in production builds. These are
|
|
54
|
+
// React Fast Refresh globals that only exist when the dev preamble is injected.
|
|
55
|
+
// In production there is no preamble, so the calls throw ReferenceError which
|
|
56
|
+
// silently aborts module loading and prevents React from mounting.
|
|
57
|
+
//
|
|
58
|
+
// A classic (non-module) <script> executes synchronously during HTML parsing,
|
|
59
|
+
// before any <script type="module"> is evaluated (modules are always deferred).
|
|
60
|
+
// Defining no-op shims here guarantees they exist before any page chunk runs.
|
|
61
|
+
const refreshShim = `<script${nonceAttr}>` +
|
|
62
|
+
`if(typeof $RefreshReg$==="undefined"){` +
|
|
63
|
+
`window.$RefreshReg$=function(){};` +
|
|
64
|
+
`window.$RefreshSig$=function(){return function(x){return x};}` +
|
|
65
|
+
`}</script>`;
|
|
52
66
|
return `</div>
|
|
67
|
+
${refreshShim}
|
|
53
68
|
<script type="module" src="/@alabjs/client"${nonceAttr}></script>
|
|
54
69
|
</body>
|
|
55
70
|
</html>`;
|
package/dist/ssr/html.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/ssr/html.ts"],"names":[],"mappings":"AAoCA,iGAAiG;AACjG,MAAM,UAAU,eAAe,CAAC,IAAsB;IACpD,MAAM,EACJ,QAAQ,EACR,UAAU,EACV,gBAAgB,EAChB,SAAS,EACT,GAAG,EACH,WAAW,EACX,WAAW,EACX,SAAS,GAAG,EAAE,EACd,OAAO,EACP,aAAa,GACd,GAAG,IAAI,CAAC;IAET,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK;QAC7B,CAAC,CAAC,UAAU,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU;QAC7C,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW;QAClC,CAAC,CAAC,qCAAqC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM;QAC1E,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS;QACrC,CAAC,CAAC,+BAA+B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM;QAClE,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM;QAC/B,CAAC,CAAC,gCAAgC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM;QAChE,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,aAAa,GAAG,QAAQ,CAAC,UAAU;QACvC,CAAC,CAAC,qCAAqC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM;QACzE,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,MAAM,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3D,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/E,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEvE,OAAO;;;;;MAKH,QAAQ;MACR,OAAO;MACP,YAAY;MACZ,SAAS;MACT,aAAa;MACb,MAAM;MACN,WAAW;MACX,SAAS;yCAC0B,OAAO,CAAC,SAAS,CAAC;uCACpB,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;0CACnB,OAAO,CAAC,UAAU,CAAC;iDACZ,OAAO,CAAC,gBAAgB,CAAC;MACpE,WAAW,CAAC,CAAC,CAAC,wCAAwC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;MACrF,WAAW,CAAC,CAAC,CAAC,wCAAwC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;MACrF,OAAO,CAAC,CAAC,CAAC,yCAAyC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;MAC9E,aAAa,CAAC,CAAC,CAAC,4BAA4B,aAAa,WAAW,CAAC,CAAC,CAAC,EAAE;;MAEzE,SAAS;;;2BAGY,CAAC;AAC5B,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,cAAc,CAAC,IAAoC;IACjE,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACtE,OAAO;
|
|
1
|
+
{"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/ssr/html.ts"],"names":[],"mappings":"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"}
|
package/dist/ssr/ppr.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ppr.d.ts","sourceRoot":"","sources":["../../src/ssr/ppr.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAA2B,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAOpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAIlD,sEAAsE;AACtE,eAAO,MAAM,gBAAgB,sBAAsB,CAAC;AAIpD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAMzD;AAID,MAAM,WAAW,mBAAmB;IAClC,yDAAyD;IAEzD,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC;IACzB,gDAAgD;IAEhD,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;IAC9B,kEAAkE;IAClE,SAAS,EAAE,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;IAC/C,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CAAC,EACtC,IAAI,EACJ,OAAO,EACP,SAAS,EACT,WAAW,EACX,SAAS,GACV,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkCrC;AAID;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOjF;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAQ/E;AAID;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"ppr.d.ts","sourceRoot":"","sources":["../../src/ssr/ppr.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAA2B,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAOpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAIlD,sEAAsE;AACtE,eAAO,MAAM,gBAAgB,sBAAsB,CAAC;AAIpD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAMzD;AAID,MAAM,WAAW,mBAAmB;IAClC,yDAAyD;IAEzD,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC;IACzB,gDAAgD;IAEhD,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;IAC9B,kEAAkE;IAClE,SAAS,EAAE,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;IAC/C,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CAAC,EACtC,IAAI,EACJ,OAAO,EACP,SAAS,EACT,WAAW,EACX,SAAS,GACV,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkCrC;AAID;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOjF;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAQ/E;AAID;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAajF"}
|
package/dist/ssr/ppr.js
CHANGED
|
@@ -122,7 +122,8 @@ export function findBuildLayoutFiles(routeFile, distDir) {
|
|
|
122
122
|
const layouts = [];
|
|
123
123
|
for (let i = 1; i <= parts.length; i++) {
|
|
124
124
|
const dir = parts.slice(0, i).join("/");
|
|
125
|
-
|
|
125
|
+
// esbuild compiles layout.tsx → layout.js in the dist/server tree.
|
|
126
|
+
const candidate = `${dir}/layout.js`;
|
|
126
127
|
if (existsSync(join(distDir, "server", candidate))) {
|
|
127
128
|
layouts.push(candidate);
|
|
128
129
|
}
|
package/dist/ssr/ppr.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ppr.js","sourceRoot":"","sources":["../../src/ssr/ppr.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAsB,MAAM,OAAO,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG5D,iFAAiF;AAEjF,sEAAsE;AACtE,MAAM,CAAC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AAEpD,iFAAiF;AAEjF;;;;;;;;;GASG;AACH,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,MAAM,IAAI,GAAG,SAAS;SACnB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAmB,kBAAkB;SACvD,OAAO,CAAC,eAAe,EAAE,OAAO,CAAC,CAAI,qBAAqB;SAC1D,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAgB,SAAS;IACjD,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,OAAO,CAAC;AACrC,CAAC;AAmBD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EACtC,IAAI,EACJ,OAAO,EACP,SAAS,EACT,WAAW,EACX,SAAS,GACW;IACpB,8EAA8E;IAC9E,8DAA8D;IAC9D,IAAI,MAAM,GAAQ,aAAa,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;IACxE,uEAAuE;IACvE,MAAM,GAAG,aAAa,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;IAC7D,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,MAAM;YAAE,MAAM,GAAG,aAAa,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;IACzD,CAAC;IACD,2DAA2D;IAC3D,8DAA8D;IAC9D,MAAM,IAAI,GAAG,aAAa,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAEnE,2EAA2E;IAC3E,2EAA2E;IAC3E,MAAM,SAAS,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC9D,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC;YACxB,KAAK,CAAC,KAAa,EAAE,IAAI,EAAE,EAAE,IAAI,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACpE,KAAK,CAAC,EAAE,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;SACrC,CAAC,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,GAAG,sBAAsB,CAAC,IAAI,EAAE;YAC5C,UAAU,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC5B,OAAO,CAAC,GAAG,IAAK,MAAM,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAC/E,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,GAAG,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;IAChE,MAAM,KAAK,GAAI,cAAc,CAAC,EAAE,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,EAAE,CAAC;IAEjD,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AACjF,CAAC;AAED,iFAAiF;AAEjF;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,SAAiB,EAAE,WAAmB;IAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;IAC/D,IAAI,CAAC;QACH,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAY,EAAE,OAAe;IACrE,MAAM,GAAG,GAAG,yCAAyC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC;IAC3F,+DAA+D;IAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC1C,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,GAAG,GAAG,IAAI,CAAC;AACpB,CAAC;AAED,iFAAiF;AAEjF;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB,EAAE,OAAe;IACrE,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,SAAS,GAAG,GAAG,GAAG,
|
|
1
|
+
{"version":3,"file":"ppr.js","sourceRoot":"","sources":["../../src/ssr/ppr.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "alabjs",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0-alpha.1",
|
|
4
4
|
"description": "AlabJS — full-stack React framework powered by a Rust compiler",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"react",
|
|
@@ -53,6 +53,10 @@
|
|
|
53
53
|
"import": "./dist/components/index.js",
|
|
54
54
|
"types": "./dist/components/index.d.ts"
|
|
55
55
|
},
|
|
56
|
+
"./components/server": {
|
|
57
|
+
"import": "./dist/components/ImageServer.js",
|
|
58
|
+
"types": "./dist/components/ImageServer.d.ts"
|
|
59
|
+
},
|
|
56
60
|
"./middleware": {
|
|
57
61
|
"import": "./dist/server/middleware.js",
|
|
58
62
|
"types": "./dist/server/middleware.d.ts"
|
|
@@ -82,14 +86,15 @@
|
|
|
82
86
|
"alab": "./dist/cli.js"
|
|
83
87
|
},
|
|
84
88
|
"optionalDependencies": {
|
|
85
|
-
"@alabjs/compiler": "0.
|
|
89
|
+
"@alabjs/compiler": "0.3.0-alpha.1"
|
|
86
90
|
},
|
|
87
91
|
"dependencies": {
|
|
88
92
|
"h3": "^1.15.0",
|
|
89
93
|
"vite": "^8.0.0",
|
|
94
|
+
"esbuild": "^0.25.0",
|
|
90
95
|
"react": "^19.1.0",
|
|
91
96
|
"react-dom": "^19.1.0",
|
|
92
|
-
"alabjs-vite-plugin": "0.
|
|
97
|
+
"alabjs-vite-plugin": "0.3.0-alpha.1"
|
|
93
98
|
},
|
|
94
99
|
"devDependencies": {
|
|
95
100
|
"@types/react": "^19.1.0",
|
package/src/analytics/handler.ts
CHANGED
|
@@ -81,8 +81,12 @@ export async function handleVitalsBeacon(
|
|
|
81
81
|
* GET /_alabjs/analytics
|
|
82
82
|
*
|
|
83
83
|
* Returns a JSON snapshot of all collected metrics.
|
|
84
|
-
*
|
|
84
|
+
* Always requires Authorization: Bearer <ALAB_ANALYTICS_SECRET>.
|
|
85
85
|
* Falls back to ALAB_REVALIDATE_SECRET if ALAB_ANALYTICS_SECRET is unset.
|
|
86
|
+
*
|
|
87
|
+
* If neither env var is set the endpoint returns 401 — the endpoint is
|
|
88
|
+
* intentionally closed by default to prevent information leaks in production
|
|
89
|
+
* deployments that forget to set an analytics secret.
|
|
86
90
|
*/
|
|
87
91
|
export function handleAnalyticsDashboard(
|
|
88
92
|
req: IncomingMessage,
|
|
@@ -92,15 +96,16 @@ export function handleAnalyticsDashboard(
|
|
|
92
96
|
process.env["ALAB_ANALYTICS_SECRET"] ??
|
|
93
97
|
process.env["ALAB_REVALIDATE_SECRET"];
|
|
94
98
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
}
|
|
99
|
+
const auth = req.headers["authorization"] ?? "";
|
|
100
|
+
const token = auth.startsWith("Bearer ") ? auth.slice(7) : "";
|
|
101
|
+
|
|
102
|
+
if (!secret || token !== secret) {
|
|
103
|
+
res.statusCode = 401;
|
|
104
|
+
res.setHeader("content-type", "application/json");
|
|
105
|
+
res.end(JSON.stringify({
|
|
106
|
+
error: "Unauthorized. Set ALAB_ANALYTICS_SECRET and pass Authorization: Bearer <secret>.",
|
|
107
|
+
}));
|
|
108
|
+
return;
|
|
104
109
|
}
|
|
105
110
|
|
|
106
111
|
res.statusCode = 200;
|
package/src/cli.ts
CHANGED
|
@@ -48,7 +48,9 @@ switch (command) {
|
|
|
48
48
|
break;
|
|
49
49
|
}
|
|
50
50
|
case "start":
|
|
51
|
-
await import("./commands/start.js").then((m) =>
|
|
51
|
+
await import("./commands/start.js").then((m) =>
|
|
52
|
+
m.start({ cwd, port: Number(values["port"]) }),
|
|
53
|
+
);
|
|
52
54
|
break;
|
|
53
55
|
case "info":
|
|
54
56
|
await import("./commands/info.js").then((m) => m.info({ cwd }));
|
package/src/client/hooks.ts
CHANGED
|
@@ -19,7 +19,15 @@ function _cacheSet(key: string, value: Promise<unknown>): void {
|
|
|
19
19
|
_promiseCache.set(key, value);
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
/**
|
|
22
|
+
/**
|
|
23
|
+
* Clear the server-side promise cache between SSR renders.
|
|
24
|
+
*
|
|
25
|
+
* @internal — Called by Alab's dev and production SSR entry points before each
|
|
26
|
+
* `renderToPipeableStream` call. If you build a custom SSR integration, you
|
|
27
|
+
* MUST call this before rendering each page; failing to do so causes stale
|
|
28
|
+
* promises from a previous request to be returned by `useServerData`, resulting
|
|
29
|
+
* in wrong data being served to subsequent visitors.
|
|
30
|
+
*/
|
|
23
31
|
export function _clearALabSSRCache(): void {
|
|
24
32
|
_promiseCache.clear();
|
|
25
33
|
}
|
|
@@ -48,6 +56,17 @@ export function useServerData<T extends ServerFn<any, any, any>>(
|
|
|
48
56
|
fnName: string,
|
|
49
57
|
params?: RouteParams<InferServerPath<T>>,
|
|
50
58
|
): InferServerOutput<T> {
|
|
59
|
+
// During PPR build-time pre-rendering there is no server running, so we
|
|
60
|
+
// must not make network calls. Return an empty array so the component can
|
|
61
|
+
// render its static shell; data-dependent children should be inside
|
|
62
|
+
// <Dynamic> which renders a placeholder hole in PPR mode anyway.
|
|
63
|
+
if (
|
|
64
|
+
typeof process !== "undefined" &&
|
|
65
|
+
process.env["ALAB_PPR_PRERENDER"] === "1"
|
|
66
|
+
) {
|
|
67
|
+
return [] as unknown as InferServerOutput<T>;
|
|
68
|
+
}
|
|
69
|
+
|
|
51
70
|
const searchParams = params
|
|
52
71
|
? new URLSearchParams(params as Record<string, string>).toString()
|
|
53
72
|
: "";
|
|
@@ -175,9 +194,18 @@ export function useMutation<T extends ServerFn<any, any, any>>(
|
|
|
175
194
|
startTransition(() => {
|
|
176
195
|
void (async () => {
|
|
177
196
|
try {
|
|
197
|
+
// Read the CSRF token from the cookie (set by the server on any SSR
|
|
198
|
+
// page response) and echo it as x-csrf-token for double-submit protection.
|
|
199
|
+
const csrfToken =
|
|
200
|
+
typeof document !== "undefined"
|
|
201
|
+
? document.cookie.match(/alab-csrf=([^;]+)/)?.[1] ?? ""
|
|
202
|
+
: "";
|
|
178
203
|
const r = await fetch(`/_alabjs/fn/${fnName}`, {
|
|
179
204
|
method: "POST",
|
|
180
|
-
headers: {
|
|
205
|
+
headers: {
|
|
206
|
+
"content-type": "application/json",
|
|
207
|
+
...(csrfToken ? { "x-csrf-token": csrfToken } : {}),
|
|
208
|
+
},
|
|
181
209
|
body: JSON.stringify(input),
|
|
182
210
|
});
|
|
183
211
|
|
package/src/commands/build.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { build as viteBuild, type PluginOption } from "vite";
|
|
2
|
-
import { resolve } from "node:path";
|
|
2
|
+
import { resolve, relative, isAbsolute } from "node:path";
|
|
3
|
+
import { pathToFileURL } from "node:url";
|
|
3
4
|
import { spawn, execSync } from "node:child_process";
|
|
4
5
|
import { existsSync, writeFileSync, readFileSync, mkdirSync } from "node:fs";
|
|
5
6
|
import { loadUserConfig } from "../config.js";
|
|
@@ -151,7 +152,10 @@ export async function build({ cwd, skipTypecheck = false, mode = "ssr", analyze
|
|
|
151
152
|
...(visualizerPlugin ? [visualizerPlugin] : []),
|
|
152
153
|
],
|
|
153
154
|
build: {
|
|
154
|
-
|
|
155
|
+
// Output client assets to .alabjs/dist/client/ so the production server's
|
|
156
|
+
// static handler (which serves from distDir/client/) can find them.
|
|
157
|
+
outDir: resolve(cwd, ".alabjs/dist/client"),
|
|
158
|
+
manifest: true,
|
|
155
159
|
ssrManifest: true,
|
|
156
160
|
rolldownOptions: {
|
|
157
161
|
// In SSR mode, we don't use an index.html as the entry point.
|
|
@@ -169,9 +173,19 @@ export async function build({ cwd, skipTypecheck = false, mode = "ssr", analyze
|
|
|
169
173
|
|
|
170
174
|
await Promise.all(tasks);
|
|
171
175
|
|
|
172
|
-
// Write a stable build ID for skew protection (must run after Vite so the
|
|
173
|
-
// route-manifest.json is in place for the content-hash fallback path).
|
|
174
176
|
const distDir = resolve(cwd, ".alabjs/dist");
|
|
177
|
+
|
|
178
|
+
// Scan the app/ directory with the Rust router, normalize paths, and write
|
|
179
|
+
// route-manifest.json. Must run before writeBuildId (hash) and buildPPRShells.
|
|
180
|
+
const manifest = await buildRouteManifest(cwd, distDir);
|
|
181
|
+
|
|
182
|
+
// Compile all app pages, layouts, and server functions to .alabjs/dist/server/.
|
|
183
|
+
// Must run after buildRouteManifest so we have the entry list, and before
|
|
184
|
+
// buildPPRShells which imports the compiled modules.
|
|
185
|
+
await buildSsrBundle(cwd, distDir, manifest);
|
|
186
|
+
|
|
187
|
+
// Write a stable build ID for skew protection (must run after the route
|
|
188
|
+
// manifest is in place for the content-hash fallback path).
|
|
175
189
|
await writeBuildId(distDir, cwd);
|
|
176
190
|
await buildPPRShells(distDir, cwd);
|
|
177
191
|
|
|
@@ -242,52 +256,64 @@ async function buildPPRShells(distDir: string, cwd: string): Promise<void> {
|
|
|
242
256
|
const pprCacheDir = resolve(cwd, PPR_CACHE_SUBDIR);
|
|
243
257
|
let count = 0;
|
|
244
258
|
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
259
|
+
// Signal to useServerData that it must not make network calls — return
|
|
260
|
+
// empty placeholders instead so components can render their static shell.
|
|
261
|
+
process.env["ALAB_PPR_PRERENDER"] = "1";
|
|
248
262
|
|
|
249
|
-
|
|
250
|
-
const
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
263
|
+
try {
|
|
264
|
+
for (const route of pageRoutes) {
|
|
265
|
+
// esbuild compiles .tsx/.ts → .js; use the compiled path.
|
|
266
|
+
const modulePath = resolve(distDir, "server", route.file.replace(/\.(tsx?)$/, ".js"));
|
|
267
|
+
if (!existsSync(modulePath)) continue;
|
|
268
|
+
|
|
269
|
+
// Dynamic import — on Windows absolute paths need a file:// URL.
|
|
270
|
+
const mod = await import(pathToFileURL(modulePath).href) as {
|
|
271
|
+
default?: unknown;
|
|
272
|
+
ppr?: unknown;
|
|
273
|
+
metadata?: Record<string, unknown>;
|
|
274
|
+
};
|
|
275
|
+
|
|
276
|
+
if (mod.ppr !== true) continue;
|
|
277
|
+
if (typeof mod.default !== "function") {
|
|
278
|
+
console.warn(` alab ppr: ${route.file} has no default export — skipping.`);
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
261
281
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
282
|
+
// Load layout modules (outermost → innermost).
|
|
283
|
+
const layoutPaths = findBuildLayoutFiles(route.file, distDir);
|
|
284
|
+
const layoutMods = await Promise.all(
|
|
285
|
+
layoutPaths.map((p) => import(pathToFileURL(resolve(distDir, "server", p)).href)),
|
|
286
|
+
);
|
|
287
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
288
|
+
const layouts = layoutMods.map((m: any) => m.default).filter((c: unknown) => typeof c === "function");
|
|
269
289
|
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
+
try {
|
|
291
|
+
await preRenderPPRShell({
|
|
292
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
293
|
+
Page: mod.default as any,
|
|
294
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
295
|
+
layouts: layouts as any[],
|
|
296
|
+
shellOpts: {
|
|
297
|
+
metadata: (mod.metadata as never) ?? {},
|
|
298
|
+
paramsJson: "{}",
|
|
299
|
+
searchParamsJson: "{}",
|
|
300
|
+
routeFile: route.file,
|
|
301
|
+
// PPR shells are static snapshots — client mounts via CSR (createRoot)
|
|
302
|
+
// rather than hydration to avoid mismatches with the pre-rendered HTML.
|
|
303
|
+
ssr: false,
|
|
304
|
+
layoutsJson: JSON.stringify(layoutPaths.map(p => p.replace(/\.js$/, ".tsx"))),
|
|
305
|
+
},
|
|
306
|
+
pprCacheDir,
|
|
307
|
+
routePath: route.path,
|
|
308
|
+
});
|
|
309
|
+
count++;
|
|
310
|
+
} catch (err) {
|
|
311
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
312
|
+
console.warn(` alab ppr: failed to pre-render ${route.path}: ${msg}`);
|
|
313
|
+
}
|
|
290
314
|
}
|
|
315
|
+
} finally {
|
|
316
|
+
delete process.env["ALAB_PPR_PRERENDER"];
|
|
291
317
|
}
|
|
292
318
|
|
|
293
319
|
if (count > 0) {
|
|
@@ -443,6 +469,112 @@ async function buildFederationExposes(
|
|
|
443
469
|
);
|
|
444
470
|
}
|
|
445
471
|
|
|
472
|
+
/**
|
|
473
|
+
* Scan `app/` with the Rust router napi, normalize absolute file paths to
|
|
474
|
+
* cwd-relative, and write `route-manifest.json` to `distDir`.
|
|
475
|
+
*
|
|
476
|
+
* Returns the in-memory manifest so callers can use it immediately without
|
|
477
|
+
* reading the file back from disk.
|
|
478
|
+
*/
|
|
479
|
+
async function buildRouteManifest(cwd: string, distDir: string): Promise<RouteManifest> {
|
|
480
|
+
const appDir = resolve(cwd, "app");
|
|
481
|
+
let manifest: RouteManifest = { routes: [] };
|
|
482
|
+
|
|
483
|
+
try {
|
|
484
|
+
type NapiRoutes = { buildRoutes(appDir: string): string };
|
|
485
|
+
const mod = await import("@alabjs/compiler") as unknown as { default?: NapiRoutes } & NapiRoutes;
|
|
486
|
+
const napi = (mod.default ?? mod) as NapiRoutes;
|
|
487
|
+
const json = napi.buildRoutes(appDir);
|
|
488
|
+
manifest = JSON.parse(json) as RouteManifest;
|
|
489
|
+
|
|
490
|
+
// The Rust scanner stores absolute paths; normalize to cwd-relative so the
|
|
491
|
+
// production server can construct `distDir/server/<file>` paths correctly.
|
|
492
|
+
for (const route of manifest.routes) {
|
|
493
|
+
if (isAbsolute(route.file)) {
|
|
494
|
+
route.file = relative(cwd, route.file);
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
} catch {
|
|
498
|
+
console.warn(
|
|
499
|
+
" alab warning: Rust compiler unavailable — route manifest will be empty.\n" +
|
|
500
|
+
" Run `cargo build --release -p alab-napi && bash scripts/copy-napi-binary.sh`.",
|
|
501
|
+
);
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
mkdirSync(distDir, { recursive: true });
|
|
505
|
+
writeFileSync(resolve(distDir, "route-manifest.json"), JSON.stringify(manifest, null, 2), "utf8");
|
|
506
|
+
|
|
507
|
+
const pages = manifest.routes.filter((r) => r.kind === "page").length;
|
|
508
|
+
const apis = manifest.routes.filter((r) => r.kind === "api").length;
|
|
509
|
+
console.log(` alab routes → ${pages} page(s), ${apis} api route(s)`);
|
|
510
|
+
|
|
511
|
+
return manifest;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
/**
|
|
515
|
+
* Compile all SSR route files to `distDir/server/` using esbuild's per-file
|
|
516
|
+
* transpilation mode.
|
|
517
|
+
*
|
|
518
|
+
* We use esbuild directly (bundled with Vite) rather than a second viteBuild
|
|
519
|
+
* call because:
|
|
520
|
+
* 1. Preserves directory structure via `outbase` without needing
|
|
521
|
+
* `preserveModules` (which hangs with some Rolldown versions).
|
|
522
|
+
* 2. `packages: "external"` externalizes all npm specifiers while inlining
|
|
523
|
+
* local relative imports — avoids Node ESM extensionless-import failures.
|
|
524
|
+
* 3. Much faster: no second Vite startup overhead.
|
|
525
|
+
*/
|
|
526
|
+
async function buildSsrBundle(cwd: string, distDir: string, manifest: RouteManifest): Promise<void> {
|
|
527
|
+
const entryFiles = manifest.routes.map((r) => resolve(cwd, r.file));
|
|
528
|
+
|
|
529
|
+
// Include top-level middleware.ts if present.
|
|
530
|
+
const middlewarePath = resolve(cwd, "middleware.ts");
|
|
531
|
+
if (existsSync(middlewarePath)) entryFiles.push(middlewarePath);
|
|
532
|
+
|
|
533
|
+
if (entryFiles.length === 0) return;
|
|
534
|
+
|
|
535
|
+
// Build the import.meta.env replacement object for esbuild.
|
|
536
|
+
// Node.js never defines import.meta.env (it's a Vite-only concept), so if
|
|
537
|
+
// we leave it undefined the compiled server modules throw at runtime on any
|
|
538
|
+
// reference to import.meta.env.*. We mirror exactly what Vite inlines for
|
|
539
|
+
// the client build: standard constants + ALAB_PUBLIC_* / VITE_* vars.
|
|
540
|
+
const publicEnv: Record<string, string> = {};
|
|
541
|
+
for (const [key, val] of Object.entries(process.env)) {
|
|
542
|
+
if (key.startsWith("ALAB_PUBLIC_") || key.startsWith("VITE_")) {
|
|
543
|
+
publicEnv[key] = val ?? "";
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
const metaEnv = {
|
|
547
|
+
PROD: true,
|
|
548
|
+
DEV: false,
|
|
549
|
+
SSR: true,
|
|
550
|
+
MODE: "production",
|
|
551
|
+
BASE_URL: "/",
|
|
552
|
+
...publicEnv,
|
|
553
|
+
};
|
|
554
|
+
|
|
555
|
+
const { build: esbuild } = await import("esbuild");
|
|
556
|
+
await esbuild({
|
|
557
|
+
entryPoints: entryFiles,
|
|
558
|
+
outbase: cwd, // preserve directory structure: app/page.tsx → server/app/page.js
|
|
559
|
+
outdir: resolve(distDir, "server"),
|
|
560
|
+
format: "esm",
|
|
561
|
+
platform: "node",
|
|
562
|
+
target: "node22",
|
|
563
|
+
bundle: true, // bundle local imports (resolves extensionless paths)
|
|
564
|
+
packages: "external", // keep all npm specifiers (react, alabjs/*…) as-is
|
|
565
|
+
jsx: "automatic",
|
|
566
|
+
jsxImportSource: "react",
|
|
567
|
+
logLevel: "warning",
|
|
568
|
+
define: {
|
|
569
|
+
// Replace the entire import.meta.env expression so property accesses,
|
|
570
|
+
// destructuring, and optional-chaining all resolve correctly at runtime.
|
|
571
|
+
"import.meta.env": JSON.stringify(metaEnv),
|
|
572
|
+
},
|
|
573
|
+
});
|
|
574
|
+
|
|
575
|
+
console.log(" alab SSR bundle → .alabjs/dist/server");
|
|
576
|
+
}
|
|
577
|
+
|
|
446
578
|
/** Compile the offline service worker to a standalone iife bundle. */
|
|
447
579
|
async function buildOfflineSw(cwd: string): Promise<void> {
|
|
448
580
|
const swEntry = new URL("../client/offline-sw.js", import.meta.url).pathname;
|
|
@@ -461,7 +593,10 @@ async function buildOfflineSw(cwd: string): Promise<void> {
|
|
|
461
593
|
fileName: () => "offline-sw.js",
|
|
462
594
|
},
|
|
463
595
|
minify: true,
|
|
464
|
-
|
|
596
|
+
// Note: do NOT set rolldownOptions.output.inlineDynamicImports here.
|
|
597
|
+
// iife format sets codeSplitting:false which already implies
|
|
598
|
+
// inlineDynamicImports:true in Rolldown. Setting it explicitly
|
|
599
|
+
// produces a warning that can cause the build to stall in Rolldown/Vite 8+.
|
|
465
600
|
},
|
|
466
601
|
});
|
|
467
602
|
} catch (err) {
|
package/src/commands/start.ts
CHANGED
|
@@ -8,7 +8,7 @@ interface StartOptions {
|
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
export async function start({ cwd, port = 3000 }: StartOptions) {
|
|
11
|
-
const manifestPath = resolve(cwd, ".alabjs/route-manifest.json");
|
|
11
|
+
const manifestPath = resolve(cwd, ".alabjs/dist/route-manifest.json");
|
|
12
12
|
|
|
13
13
|
let manifest: RouteManifest;
|
|
14
14
|
try {
|