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.
Files changed (57) hide show
  1. package/dist/analytics/handler.d.ts +5 -1
  2. package/dist/analytics/handler.d.ts.map +1 -1
  3. package/dist/analytics/handler.js +14 -10
  4. package/dist/analytics/handler.js.map +1 -1
  5. package/dist/cli.js +1 -1
  6. package/dist/cli.js.map +1 -1
  7. package/dist/client/hooks.d.ts +9 -1
  8. package/dist/client/hooks.d.ts.map +1 -1
  9. package/dist/client/hooks.js +26 -2
  10. package/dist/client/hooks.js.map +1 -1
  11. package/dist/commands/build.d.ts.map +1 -1
  12. package/dist/commands/build.js +163 -43
  13. package/dist/commands/build.js.map +1 -1
  14. package/dist/commands/start.js +1 -1
  15. package/dist/commands/start.js.map +1 -1
  16. package/dist/components/Image.d.ts +0 -12
  17. package/dist/components/Image.d.ts.map +1 -1
  18. package/dist/components/Image.js +2 -29
  19. package/dist/components/Image.js.map +1 -1
  20. package/dist/components/ImageServer.d.ts +20 -0
  21. package/dist/components/ImageServer.d.ts.map +1 -0
  22. package/dist/components/ImageServer.js +37 -0
  23. package/dist/components/ImageServer.js.map +1 -0
  24. package/dist/components/index.d.ts +1 -1
  25. package/dist/components/index.d.ts.map +1 -1
  26. package/dist/components/index.js +1 -1
  27. package/dist/components/index.js.map +1 -1
  28. package/dist/server/app.d.ts.map +1 -1
  29. package/dist/server/app.js +193 -43
  30. package/dist/server/app.js.map +1 -1
  31. package/dist/server/cache.d.ts.map +1 -1
  32. package/dist/server/cache.js +23 -1
  33. package/dist/server/cache.js.map +1 -1
  34. package/dist/server/csrf.d.ts.map +1 -1
  35. package/dist/server/csrf.js +5 -0
  36. package/dist/server/csrf.js.map +1 -1
  37. package/dist/ssr/html.d.ts.map +1 -1
  38. package/dist/ssr/html.js +15 -0
  39. package/dist/ssr/html.js.map +1 -1
  40. package/dist/ssr/ppr.d.ts.map +1 -1
  41. package/dist/ssr/ppr.js +2 -1
  42. package/dist/ssr/ppr.js.map +1 -1
  43. package/package.json +8 -3
  44. package/src/analytics/handler.ts +15 -10
  45. package/src/cli.ts +3 -1
  46. package/src/client/hooks.ts +30 -2
  47. package/src/commands/build.ts +182 -47
  48. package/src/commands/start.ts +1 -1
  49. package/src/components/Image.tsx +2 -35
  50. package/src/components/ImageServer.ts +43 -0
  51. package/src/components/index.ts +1 -1
  52. package/src/server/app.ts +210 -44
  53. package/src/server/cache.ts +23 -1
  54. package/src/server/csrf.ts +5 -0
  55. package/src/ssr/html.ts +15 -0
  56. package/src/ssr/ppr.ts +2 -1
  57. package/tsconfig.tsbuildinfo +1 -1
@@ -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
- /** Global in-process LRU-style cache. Shared across all server function calls. */
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. */
@@ -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,kFAAkF;AAClF,MAAM,MAAM,GAAG,IAAI,GAAG,EAAsB,CAAC;AAE7C,OAAO,EAAE,UAAU,EAAE,CAAC;AAEtB,0EAA0E;AAC1E,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9B,IAAI,CAAC,KAAK;QAAE,OAAO,UAAU,CAAC;IAC9B,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC;AACpB,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,QAAQ,CACtB,GAAW,EACX,IAAa,EACb,IAAsC;IAEtC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE;QACd,IAAI;QACJ,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,KAAK;QACtC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;KACtB,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,IAAwB;IACtD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAClD,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACrB,CAAC;AAeD,MAAM,UAAU,GAAG,IAAI,GAAG,EAA0B,CAAC;AAErD;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,cAAc;IACd,IAAI,GAAG,IAAI,KAAK,CAAC,OAAO;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACpE,iFAAiF;IACjF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,KAAK,EAAE,MAAM,CAAC,CAAC;IAC1D,IAAI,GAAG,IAAI,KAAK,CAAC,OAAO,GAAG,SAAS,EAAE,CAAC;QACrC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC3C,CAAC;IACD,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,IAAY,EAAE,GAAW,EAAE,OAAiB,EAAE;IAC5F,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACxG,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,oBAAoB,CAAC,QAAgB;IACnD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,KAAK;QAAE,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;AACvC,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,OAAO,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,YAAY,IAAI,KAAK,CAAC;AACzD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC9B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAc;IACjD,KAAK,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;QACpC,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACrD,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAAC,IAAwB;IACpD,6BAA6B;IAC7B,eAAe,CAAC,IAAI,CAAC,CAAC;IACtB,wBAAwB;IACxB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,UAAU,EAAE,CAAC;QACvC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAClD,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;AACH,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,YAAY;IAK1B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,MAAM,GAA8D,EAAE,CAAC;IAC7E,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;QAClC,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;QACtC,IAAI,SAAS,GAAG,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;;YAC7F,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
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,sEAwB7B;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAapD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjD"}
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"}
@@ -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 &&
@@ -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"}
@@ -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,CAM3E;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"}
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>`;
@@ -1 +1 @@
1
- {"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/ssr/html.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/ssr/html.ts"],"names":[],"mappings":"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"}
@@ -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,CAYjF"}
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
- const candidate = `${dir}/layout.tsx`;
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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ppr.js","sourceRoot":"","sources":["../../src/ssr/ppr.ts"],"names":[],"mappings":"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"}
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.2.6",
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.2.6"
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.2.6"
97
+ "alabjs-vite-plugin": "0.3.0-alpha.1"
93
98
  },
94
99
  "devDependencies": {
95
100
  "@types/react": "^19.1.0",
@@ -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
- * Protected by Authorization: Bearer <ALAB_ANALYTICS_SECRET>.
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
- if (secret) {
96
- const auth = req.headers["authorization"] ?? "";
97
- const token = auth.startsWith("Bearer ") ? auth.slice(7) : "";
98
- if (token !== secret) {
99
- res.statusCode = 401;
100
- res.setHeader("content-type", "application/json");
101
- res.end(JSON.stringify({ error: "Unauthorized. Set Authorization: Bearer <ALAB_ANALYTICS_SECRET>." }));
102
- return;
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) => m.start({ cwd }));
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 }));
@@ -19,7 +19,15 @@ function _cacheSet(key: string, value: Promise<unknown>): void {
19
19
  _promiseCache.set(key, value);
20
20
  }
21
21
 
22
- /** Clear the server-side promise cache between SSR renders. Called by alab's dev server. */
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: { "content-type": "application/json" },
205
+ headers: {
206
+ "content-type": "application/json",
207
+ ...(csrfToken ? { "x-csrf-token": csrfToken } : {}),
208
+ },
181
209
  body: JSON.stringify(input),
182
210
  });
183
211
 
@@ -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
- outDir: resolve(cwd, ".alabjs/dist"),
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
- for (const route of pageRoutes) {
246
- const modulePath = resolve(distDir, "server", route.file);
247
- if (!existsSync(modulePath)) continue;
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
- // Dynamic import — module is compiled ESM, importable by Node directly.
250
- const mod = await import(modulePath) as {
251
- default?: unknown;
252
- ppr?: unknown;
253
- metadata?: Record<string, unknown>;
254
- };
255
-
256
- if (mod.ppr !== true) continue;
257
- if (typeof mod.default !== "function") {
258
- console.warn(` alab ppr: ${route.file} has no default export — skipping.`);
259
- continue;
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
- // Load layout modules (outermost → innermost).
263
- const layoutPaths = findBuildLayoutFiles(route.file, distDir);
264
- const layoutMods = await Promise.all(
265
- layoutPaths.map((p) => import(resolve(distDir, "server", p))),
266
- );
267
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
268
- const layouts = layoutMods.map((m: any) => m.default).filter((c: unknown) => typeof c === "function");
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
- try {
271
- await preRenderPPRShell({
272
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
273
- Page: mod.default as any,
274
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
275
- layouts: layouts as any[],
276
- shellOpts: {
277
- metadata: (mod.metadata as never) ?? {},
278
- paramsJson: "{}",
279
- searchParamsJson: "{}",
280
- routeFile: route.file,
281
- ssr: true,
282
- },
283
- pprCacheDir,
284
- routePath: route.path,
285
- });
286
- count++;
287
- } catch (err) {
288
- const msg = err instanceof Error ? err.message : String(err);
289
- console.warn(` alab ppr: failed to pre-render ${route.path}: ${msg}`);
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
- rolldownOptions: { output: { inlineDynamicImports: true } },
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) {
@@ -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 {