@absolutejs/absolute 0.20.0-beta.127 → 0.20.0-beta.128

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.
@@ -374,7 +374,96 @@ var init_devRouteRegistrationCallsite = __esm(() => {
374
374
  pageHandlerWrappers = new WeakMap;
375
375
  });
376
376
 
377
+ // src/utils/ssrErrorPage.ts
378
+ var exports_ssrErrorPage = {};
379
+ __export(exports_ssrErrorPage, {
380
+ buildErrorPage: () => buildErrorPage,
381
+ ssrErrorPage: () => ssrErrorPage
382
+ });
383
+ var errorPageHtml = ({
384
+ framework,
385
+ hint,
386
+ kind,
387
+ message,
388
+ script = ""
389
+ }) => {
390
+ const frameworkColors = {
391
+ angular: "#dd0031",
392
+ html: "#e34c26",
393
+ htmx: "#1a365d",
394
+ react: "#61dafb",
395
+ svelte: "#ff3e00",
396
+ vue: "#42b883"
397
+ };
398
+ const accent = frameworkColors[framework] ?? "#94a3b8";
399
+ const label = framework.charAt(0).toUpperCase() + framework.slice(1);
400
+ return `<!DOCTYPE html>
401
+ <html>
402
+ <head>
403
+ <meta charset="utf-8">
404
+ <meta name="viewport" content="width=device-width, initial-scale=1">
405
+ <title>SSR Error - AbsoluteJS</title>
406
+ <style>
407
+ *{margin:0;padding:0;box-sizing:border-box}
408
+ body{min-height:100vh;background:linear-gradient(135deg,rgba(15,23,42,0.98) 0%,rgba(30,41,59,0.98) 100%);color:#e2e8f0;font-family:"JetBrains Mono","Fira Code",ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:14px;line-height:1.6;display:flex;align-items:flex-start;justify-content:center;padding:32px}
409
+ .card{max-width:720px;width:100%;background:rgba(30,41,59,0.6);border:1px solid rgba(71,85,105,0.5);border-radius:16px;box-shadow:0 25px 50px -12px rgba(0,0,0,0.5),0 0 0 1px rgba(255,255,255,0.05);overflow:hidden}
410
+ .header{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:20px 24px;background:rgba(15,23,42,0.5);border-bottom:1px solid rgba(71,85,105,0.4)}
411
+ .brand{font-weight:700;font-size:20px;color:#fff;letter-spacing:-0.02em}
412
+ .badge{padding:5px 10px;border-radius:8px;font-size:12px;font-weight:600;background:${accent};color:#fff;opacity:0.95;box-shadow:0 2px 4px rgba(0,0,0,0.2)}
413
+ .kind{color:#94a3b8;font-size:13px;font-weight:500}
414
+ .content{padding:24px}
415
+ .label{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.08em;color:#94a3b8;margin-bottom:8px}
416
+ .message{margin:0;padding:16px 20px;background:rgba(239,68,68,0.12);border:1px solid rgba(239,68,68,0.25);border-radius:10px;overflow-x:auto;white-space:pre-wrap;word-break:break-word;color:#fca5a5;font-size:13px;line-height:1.5}
417
+ .hint{margin-top:20px;padding:12px 20px;background:rgba(71,85,105,0.3);border-radius:10px;border:1px solid rgba(71,85,105,0.4);color:#cbd5e1;font-size:13px}
418
+ </style>
419
+ </head>
420
+ <body>
421
+ <div class="card">
422
+ <div class="header">
423
+ <div style="display:flex;align-items:center;gap:12px">
424
+ <span class="brand">AbsoluteJS</span>
425
+ <span class="badge">${label}</span>
426
+ </div>
427
+ <span class="kind">${kind}</span>
428
+ </div>
429
+ <div class="content">
430
+ <div class="label">What went wrong</div>
431
+ <pre class="message">${message.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;")}</pre>
432
+ <div class="hint">${hint}</div>
433
+ </div>
434
+ </div>
435
+ ${script}
436
+ </body>
437
+ </html>`;
438
+ }, RELOAD_ON_REBUILD = `<script>(()=>{const url=(location.protocol==='https:'?'wss://':'ws://')+location.host+'/hmr';let seen=false;const connect=()=>{const socket=new WebSocket(url);socket.onopen=()=>{if(seen)location.reload();seen=true;};socket.onmessage=(event)=>{try{const message=JSON.parse(event.data);const type=message&&typeof message.type==='string'?message.type:'';if(type==='rebuild-complete'||type==='server-entry-reloaded'||type.endsWith('-update'))location.reload();}catch{}};socket.onclose=()=>setTimeout(connect,500);};connect();})();</script>`, buildErrorPage = (framework, pageName, error) => errorPageHtml({
439
+ framework,
440
+ hint: "Fix the file and save. This page reloads by itself when the build succeeds.",
441
+ kind: "Build Error",
442
+ message: `${pageName || "This page"} could not be built.
443
+
444
+ ${error ?? "The dev-server terminal has the build output."}`,
445
+ script: RELOAD_ON_REBUILD
446
+ }), ssrErrorPage = (framework, error) => errorPageHtml({
447
+ framework,
448
+ hint: "A component threw during server-side rendering. Check the terminal for the full stack trace.",
449
+ kind: "Server Render Error",
450
+ message: error instanceof Error ? error.message : String(error)
451
+ });
452
+
377
453
  // src/core/requestContext.ts
454
+ var exports_requestContext = {};
455
+ __export(exports_requestContext, {
456
+ absoluteRequestContext: () => absoluteRequestContext,
457
+ devBuildErrorResponse: () => devBuildErrorResponse,
458
+ getCurrentAbsoluteRequest: () => getCurrentAbsoluteRequest,
459
+ getDevPageWarmer: () => getDevPageWarmer,
460
+ getMissingAssets: () => getMissingAssets,
461
+ recordMissingAsset: () => recordMissingAsset,
462
+ resolveDeferredPageAssets: () => resolveDeferredPageAssets,
463
+ runWithAbsoluteRequest: () => runWithAbsoluteRequest,
464
+ setDevPageWarmer: () => setDevPageWarmer,
465
+ withDeferredStylesheets: () => withDeferredStylesheets
466
+ });
378
467
  import { AsyncLocalStorage as AsyncLocalStorage2 } from "async_hooks";
379
468
  import { Elysia as Elysia2 } from "elysia";
380
469
  var REQUEST_STORAGE_KEY, PAGE_WARMER_KEY, isAbsoluteRequestStorage = (value) => typeof value === "object" && value !== null && ("getStore" in value) && typeof value.getStore === "function" && ("run" in value) && typeof value.run === "function", getRequestStorage = () => {
@@ -387,7 +476,17 @@ var REQUEST_STORAGE_KEY, PAGE_WARMER_KEY, isAbsoluteRequestStorage = (value) =>
387
476
  const storage = new AsyncLocalStorage2;
388
477
  Reflect.set(globalThis, REQUEST_STORAGE_KEY, storage);
389
478
  return storage;
390
- }, absoluteRequestContext, getCurrentAbsoluteRequest = () => getRequestStorage()?.getStore()?.request, runWithAbsoluteRequest = (request, callback) => ensureRequestStorage().run({ request }, callback), CSS_KEY_RE, isDevPageWarmer = (value) => typeof value === "object" && value !== null && ("describe" in value) && typeof value.describe === "function" && ("warm" in value) && typeof value.warm === "function" && ("lookup" in value) && typeof value.lookup === "function", getDevPageWarmer = () => {
479
+ }, absoluteRequestContext, getCurrentAbsoluteRequest = () => getRequestStorage()?.getStore()?.request, runWithAbsoluteRequest = (request, callback) => ensureRequestStorage().run({ request }, callback), CSS_KEY_RE, isDevPageWarmer = (value) => typeof value === "object" && value !== null && ("describe" in value) && typeof value.describe === "function" && ("warm" in value) && typeof value.warm === "function" && ("lookup" in value) && typeof value.lookup === "function", devBuildErrorResponse = (framework, assets) => {
480
+ if (!assets?.failed)
481
+ return null;
482
+ return new Response(buildErrorPage(framework, assets.name, assets.error), {
483
+ headers: {
484
+ "cache-control": "no-store",
485
+ "content-type": "text/html; charset=utf-8"
486
+ },
487
+ status: 500
488
+ });
489
+ }, getDevPageWarmer = () => {
391
490
  const value = Reflect.get(globalThis, PAGE_WARMER_KEY);
392
491
  return isDevPageWarmer(value) ? value : undefined;
393
492
  }, getMissingAssets = () => {
@@ -417,6 +516,7 @@ var REQUEST_STORAGE_KEY, PAGE_WARMER_KEY, isAbsoluteRequestStorage = (value) =>
417
516
  const cssHrefs = () => cssKeys.map(lookup).filter((href) => href.length > 0 && href.startsWith("/"));
418
517
  const assets = {
419
518
  cssHrefs,
519
+ error: failed ? warmer.lastError?.() : undefined,
420
520
  failed,
421
521
  lookup,
422
522
  name: described.name
@@ -1694,62 +1794,6 @@ var init_logger = __esm(() => {
1694
1794
  };
1695
1795
  });
1696
1796
 
1697
- // src/utils/ssrErrorPage.ts
1698
- var exports_ssrErrorPage = {};
1699
- __export(exports_ssrErrorPage, {
1700
- ssrErrorPage: () => ssrErrorPage
1701
- });
1702
- var ssrErrorPage = (framework, error) => {
1703
- const frameworkColors2 = {
1704
- angular: "#dd0031",
1705
- html: "#e34c26",
1706
- htmx: "#1a365d",
1707
- react: "#61dafb",
1708
- svelte: "#ff3e00",
1709
- vue: "#42b883"
1710
- };
1711
- const accent = frameworkColors2[framework] ?? "#94a3b8";
1712
- const label = framework.charAt(0).toUpperCase() + framework.slice(1);
1713
- const message = error instanceof Error ? error.message : String(error);
1714
- return `<!DOCTYPE html>
1715
- <html>
1716
- <head>
1717
- <meta charset="utf-8">
1718
- <meta name="viewport" content="width=device-width, initial-scale=1">
1719
- <title>SSR Error - AbsoluteJS</title>
1720
- <style>
1721
- *{margin:0;padding:0;box-sizing:border-box}
1722
- body{min-height:100vh;background:linear-gradient(135deg,rgba(15,23,42,0.98) 0%,rgba(30,41,59,0.98) 100%);color:#e2e8f0;font-family:"JetBrains Mono","Fira Code",ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:14px;line-height:1.6;display:flex;align-items:flex-start;justify-content:center;padding:32px}
1723
- .card{max-width:720px;width:100%;background:rgba(30,41,59,0.6);border:1px solid rgba(71,85,105,0.5);border-radius:16px;box-shadow:0 25px 50px -12px rgba(0,0,0,0.5),0 0 0 1px rgba(255,255,255,0.05);overflow:hidden}
1724
- .header{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:20px 24px;background:rgba(15,23,42,0.5);border-bottom:1px solid rgba(71,85,105,0.4)}
1725
- .brand{font-weight:700;font-size:20px;color:#fff;letter-spacing:-0.02em}
1726
- .badge{padding:5px 10px;border-radius:8px;font-size:12px;font-weight:600;background:${accent};color:#fff;opacity:0.95;box-shadow:0 2px 4px rgba(0,0,0,0.2)}
1727
- .kind{color:#94a3b8;font-size:13px;font-weight:500}
1728
- .content{padding:24px}
1729
- .label{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.08em;color:#94a3b8;margin-bottom:8px}
1730
- .message{margin:0;padding:16px 20px;background:rgba(239,68,68,0.12);border:1px solid rgba(239,68,68,0.25);border-radius:10px;overflow-x:auto;white-space:pre-wrap;word-break:break-word;color:#fca5a5;font-size:13px;line-height:1.5}
1731
- .hint{margin-top:20px;padding:12px 20px;background:rgba(71,85,105,0.3);border-radius:10px;border:1px solid rgba(71,85,105,0.4);color:#cbd5e1;font-size:13px}
1732
- </style>
1733
- </head>
1734
- <body>
1735
- <div class="card">
1736
- <div class="header">
1737
- <div style="display:flex;align-items:center;gap:12px">
1738
- <span class="brand">AbsoluteJS</span>
1739
- <span class="badge">${label}</span>
1740
- </div>
1741
- <span class="kind">Server Render Error</span>
1742
- </div>
1743
- <div class="content">
1744
- <div class="label">What went wrong</div>
1745
- <pre class="message">${message.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;")}</pre>
1746
- <div class="hint">A component threw during server-side rendering. Check the terminal for the full stack trace.</div>
1747
- </div>
1748
- </div>
1749
- </body>
1750
- </html>`;
1751
- };
1752
-
1753
1797
  // src/utils/stringModifiers.ts
1754
1798
  var normalizeSlug = (str) => str.trim().replace(/\s+/g, "-").replace(/[^A-Za-z0-9\-_]+/g, "").replace(/[-_]{2,}/g, "-"), toKebab = (str) => normalizeSlug(str).replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), toPascal = (str) => {
1755
1799
  if (!str.includes("-") && !str.includes("_")) {
@@ -2367,6 +2411,9 @@ var buildRefreshSetup = () => {
2367
2411
  var handleReactPageRequest = async (input) => {
2368
2412
  const { Page } = input;
2369
2413
  const deferredAssets = input.index === "" ? await resolveDeferredPageAssets() : null;
2414
+ const buildFailure = devBuildErrorResponse("react", deferredAssets);
2415
+ if (buildFailure)
2416
+ return buildFailure;
2370
2417
  const resolvedIndex = deferredAssets && input.index === "" ? deferredAssets.lookup(`${deferredAssets.name}Index`) : input.index;
2371
2418
  const options = input;
2372
2419
  const userProps = input.props;
@@ -2448,5 +2495,5 @@ export {
2448
2495
  handleReactPageRequest
2449
2496
  };
2450
2497
 
2451
- //# debugId=85F4EC46EACFE9FA64756E2164756E21
2498
+ //# debugId=62164936DE45DA6264756E2164756E21
2452
2499
  //# sourceMappingURL=server.js.map