@vertz/ui-server 0.2.16 → 0.2.18

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.
@@ -1268,6 +1268,9 @@ async function ssrRenderToString(module, url, options) {
1268
1268
  const ssrTimeout = options?.ssrTimeout ?? 300;
1269
1269
  ensureDomShim();
1270
1270
  const ctx = createRequestContext(normalizedUrl);
1271
+ if (options?.ssrAuth) {
1272
+ ctx.ssrAuth = options.ssrAuth;
1273
+ }
1271
1274
  return ssrStorage.run(ctx, async () => {
1272
1275
  try {
1273
1276
  setGlobalSSRTimeout(ssrTimeout);
@@ -1286,6 +1289,15 @@ async function ssrRenderToString(module, url, options) {
1286
1289
  }
1287
1290
  }
1288
1291
  createApp();
1292
+ if (ctx.ssrRedirect) {
1293
+ return {
1294
+ html: "",
1295
+ css: "",
1296
+ ssrData: [],
1297
+ headTags: "",
1298
+ redirect: ctx.ssrRedirect
1299
+ };
1300
+ }
1289
1301
  const store = ssrStorage.getStore();
1290
1302
  if (store) {
1291
1303
  if (store.pendingRouteComponents?.size) {
@@ -2229,10 +2241,16 @@ data: {}
2229
2241
  originalFetch: globalThis.fetch
2230
2242
  }) : null;
2231
2243
  let sessionScript = "";
2244
+ let ssrAuth;
2232
2245
  if (sessionResolver) {
2233
2246
  try {
2234
2247
  const sessionResult = await sessionResolver(request);
2235
2248
  if (sessionResult) {
2249
+ ssrAuth = {
2250
+ status: "authenticated",
2251
+ user: sessionResult.session.user,
2252
+ expiresAt: sessionResult.session.expiresAt
2253
+ };
2236
2254
  const scripts = [];
2237
2255
  scripts.push(createSessionScript(sessionResult.session));
2238
2256
  if (sessionResult.accessSet != null) {
@@ -2240,6 +2258,8 @@ data: {}
2240
2258
  }
2241
2259
  sessionScript = scripts.join(`
2242
2260
  `);
2261
+ } else {
2262
+ ssrAuth = { status: "unauthenticated" };
2243
2263
  }
2244
2264
  } catch (resolverErr) {
2245
2265
  console.warn("[Server] Session resolver failed:", resolverErr instanceof Error ? resolverErr.message : resolverErr);
@@ -2248,15 +2268,22 @@ data: {}
2248
2268
  const doRender = async () => {
2249
2269
  logger.log("ssr", "render-start", { url: pathname });
2250
2270
  const ssrStart = performance.now();
2251
- const result = await ssrRenderToString(ssrMod, pathname, {
2271
+ const result = await ssrRenderToString(ssrMod, pathname + url.search, {
2252
2272
  ssrTimeout: 300,
2253
- fallbackMetrics: fontFallbackMetrics
2273
+ fallbackMetrics: fontFallbackMetrics,
2274
+ ssrAuth
2254
2275
  });
2255
2276
  logger.log("ssr", "render-done", {
2256
2277
  url: pathname,
2257
2278
  durationMs: Math.round(performance.now() - ssrStart),
2258
2279
  htmlBytes: result.html.length
2259
2280
  });
2281
+ if (result.redirect) {
2282
+ return new Response(null, {
2283
+ status: 302,
2284
+ headers: { Location: result.redirect.to }
2285
+ });
2286
+ }
2260
2287
  const scriptTag = buildScriptTag(bundledScriptUrl, hmrBootstrapScript, clientSrc);
2261
2288
  const combinedHeadTags = [headTags, result.headTags].filter(Boolean).join(`
2262
2289
  `);
package/dist/index.d.ts CHANGED
@@ -375,6 +375,7 @@ declare function clearGlobalSSRTimeout(): void;
375
375
  declare function getGlobalSSRTimeout(): number | undefined;
376
376
  import { FontFallbackMetrics as FontFallbackMetrics4 } from "@vertz/ui";
377
377
  import { FontFallbackMetrics as FontFallbackMetrics3, Theme as Theme2 } from "@vertz/ui";
378
+ import { SSRAuth as SSRAuth_jq1nwm } from "@vertz/ui/internals";
378
379
  interface SSRModule {
379
380
  default?: () => unknown;
380
381
  App?: () => unknown;
@@ -401,6 +402,10 @@ interface SSRRenderResult {
401
402
  headTags: string;
402
403
  /** Route patterns discovered by createRouter() during SSR (for build-time pre-rendering). */
403
404
  discoveredRoutes?: string[];
405
+ /** Set when ProtectedRoute writes a redirect during SSR. Server should return 302. */
406
+ redirect?: {
407
+ to: string;
408
+ };
404
409
  }
405
410
  interface SSRDiscoverResult {
406
411
  resolved: Array<{
@@ -420,6 +425,8 @@ declare function ssrRenderToString(module: SSRModule, url: string, options?: {
420
425
  ssrTimeout?: number;
421
426
  /** Pre-computed font fallback metrics (computed at server startup). */
422
427
  fallbackMetrics?: Record<string, FontFallbackMetrics3>;
428
+ /** Auth state resolved from session cookie. Passed to SSRRenderContext for AuthProvider. */
429
+ ssrAuth?: SSRAuth_jq1nwm;
423
430
  }): Promise<SSRRenderResult>;
424
431
  /**
425
432
  * Discover queries for a given URL without rendering.
package/dist/index.js CHANGED
@@ -19,7 +19,7 @@ import {
19
19
  ssrDiscoverQueries,
20
20
  ssrRenderToString,
21
21
  streamToString
22
- } from "./shared/chunk-969qgkdf.js";
22
+ } from "./shared/chunk-c5ee9yf1.js";
23
23
  import {
24
24
  clearGlobalSSRTimeout,
25
25
  createSSRAdapter,
@@ -251,6 +251,9 @@ async function ssrRenderToString(module, url, options) {
251
251
  const ssrTimeout = options?.ssrTimeout ?? 300;
252
252
  ensureDomShim();
253
253
  const ctx = createRequestContext(normalizedUrl);
254
+ if (options?.ssrAuth) {
255
+ ctx.ssrAuth = options.ssrAuth;
256
+ }
254
257
  return ssrStorage.run(ctx, async () => {
255
258
  try {
256
259
  setGlobalSSRTimeout(ssrTimeout);
@@ -269,6 +272,15 @@ async function ssrRenderToString(module, url, options) {
269
272
  }
270
273
  }
271
274
  createApp();
275
+ if (ctx.ssrRedirect) {
276
+ return {
277
+ html: "",
278
+ css: "",
279
+ ssrData: [],
280
+ headTags: "",
281
+ redirect: ctx.ssrRedirect
282
+ };
283
+ }
272
284
  const store = ssrStorage.getStore();
273
285
  if (store) {
274
286
  if (store.pendingRouteComponents?.size) {
@@ -610,10 +622,16 @@ function createSSRHandler(options) {
610
622
  return handleNavRequest(module, pathname, ssrTimeout);
611
623
  }
612
624
  let sessionScript = "";
625
+ let ssrAuth;
613
626
  if (sessionResolver) {
614
627
  try {
615
628
  const sessionResult = await sessionResolver(request);
616
629
  if (sessionResult) {
630
+ ssrAuth = {
631
+ status: "authenticated",
632
+ user: sessionResult.session.user,
633
+ expiresAt: sessionResult.session.expiresAt
634
+ };
617
635
  const scripts = [];
618
636
  scripts.push(createSessionScript(sessionResult.session, nonce));
619
637
  if (sessionResult.accessSet != null) {
@@ -621,12 +639,14 @@ function createSSRHandler(options) {
621
639
  }
622
640
  sessionScript = scripts.join(`
623
641
  `);
642
+ } else {
643
+ ssrAuth = { status: "unauthenticated" };
624
644
  }
625
645
  } catch (resolverErr) {
626
646
  console.warn("[Server] Session resolver failed:", resolverErr instanceof Error ? resolverErr.message : resolverErr);
627
647
  }
628
648
  }
629
- return handleHTMLRequest(module, template, pathname, ssrTimeout, nonce, fallbackMetrics, linkHeader, modulepreloadTags, cacheControl, sessionScript);
649
+ return handleHTMLRequest(module, template, pathname + url.search, ssrTimeout, nonce, fallbackMetrics, linkHeader, modulepreloadTags, cacheControl, sessionScript, ssrAuth);
630
650
  };
631
651
  }
632
652
  async function handleNavRequest(module, url, ssrTimeout) {
@@ -652,9 +672,15 @@ data: {}
652
672
  });
653
673
  }
654
674
  }
655
- async function handleHTMLRequest(module, template, url, ssrTimeout, nonce, fallbackMetrics, linkHeader, modulepreloadTags, cacheControl, sessionScript) {
675
+ async function handleHTMLRequest(module, template, url, ssrTimeout, nonce, fallbackMetrics, linkHeader, modulepreloadTags, cacheControl, sessionScript, ssrAuth) {
656
676
  try {
657
- const result = await ssrRenderToString(module, url, { ssrTimeout, fallbackMetrics });
677
+ const result = await ssrRenderToString(module, url, { ssrTimeout, fallbackMetrics, ssrAuth });
678
+ if (result.redirect) {
679
+ return new Response(null, {
680
+ status: 302,
681
+ headers: { Location: result.redirect.to }
682
+ });
683
+ }
658
684
  const allHeadTags = [result.headTags, modulepreloadTags].filter(Boolean).join(`
659
685
  `);
660
686
  const html = injectIntoTemplate({
@@ -1,5 +1,6 @@
1
1
  import { CompiledRoute } from "@vertz/ui";
2
2
  import { FontFallbackMetrics, Theme } from "@vertz/ui";
3
+ import { SSRAuth as SSRAuth_jq1nwm } from "@vertz/ui/internals";
3
4
  interface SSRModule {
4
5
  default?: () => unknown;
5
6
  App?: () => unknown;
@@ -26,6 +27,10 @@ interface SSRRenderResult {
26
27
  headTags: string;
27
28
  /** Route patterns discovered by createRouter() during SSR (for build-time pre-rendering). */
28
29
  discoveredRoutes?: string[];
30
+ /** Set when ProtectedRoute writes a redirect during SSR. Server should return 302. */
31
+ redirect?: {
32
+ to: string;
33
+ };
29
34
  }
30
35
  interface SSRDiscoverResult {
31
36
  resolved: Array<{
@@ -45,6 +50,8 @@ declare function ssrRenderToString(module: SSRModule, url: string, options?: {
45
50
  ssrTimeout?: number;
46
51
  /** Pre-computed font fallback metrics (computed at server startup). */
47
52
  fallbackMetrics?: Record<string, FontFallbackMetrics>;
53
+ /** Auth state resolved from session cookie. Passed to SSRRenderContext for AuthProvider. */
54
+ ssrAuth?: SSRAuth_jq1nwm;
48
55
  }): Promise<SSRRenderResult>;
49
56
  /**
50
57
  * Discover queries for a given URL without rendering.
package/dist/ssr/index.js CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  injectIntoTemplate,
4
4
  ssrDiscoverQueries,
5
5
  ssrRenderToString
6
- } from "../shared/chunk-969qgkdf.js";
6
+ } from "../shared/chunk-c5ee9yf1.js";
7
7
  import"../shared/chunk-9jjdzz8c.js";
8
8
 
9
9
  // src/prerender.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vertz/ui-server",
3
- "version": "0.2.16",
3
+ "version": "0.2.18",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "Vertz UI server-side rendering runtime",
@@ -58,15 +58,16 @@
58
58
  "@ampproject/remapping": "^2.3.0",
59
59
  "@capsizecss/unpack": "^4.0.0",
60
60
  "@jridgewell/trace-mapping": "^0.3.31",
61
- "@vertz/core": "^0.2.15",
62
- "@vertz/ui": "^0.2.15",
63
- "@vertz/ui-compiler": "^0.2.15",
61
+ "@vertz/core": "^0.2.17",
62
+ "@vertz/ui": "^0.2.17",
63
+ "@vertz/ui-compiler": "^0.2.17",
64
64
  "magic-string": "^0.30.0",
65
65
  "sharp": "^0.34.5",
66
66
  "ts-morph": "^27.0.2"
67
67
  },
68
68
  "devDependencies": {
69
- "@vertz/codegen": "^0.2.15",
69
+ "@vertz/codegen": "^0.2.17",
70
+ "@vertz/ui-auth": "^0.2.17",
70
71
  "bun-types": "^1.3.10",
71
72
  "bunup": "^0.16.31",
72
73
  "@happy-dom/global-registrator": "^20.8.3",