@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("_")) {
@@ -4804,6 +4848,9 @@ var buildRefreshSetup = () => {
4804
4848
  var handleReactPageRequest = async (input) => {
4805
4849
  const { Page } = input;
4806
4850
  const deferredAssets = input.index === "" ? await resolveDeferredPageAssets() : null;
4851
+ const buildFailure = devBuildErrorResponse("react", deferredAssets);
4852
+ if (buildFailure)
4853
+ return buildFailure;
4807
4854
  const resolvedIndex = deferredAssets && input.index === "" ? deferredAssets.lookup(`${deferredAssets.name}Index`) : input.index;
4808
4855
  const options = input;
4809
4856
  const userProps = input.props;
@@ -5029,5 +5076,5 @@ export {
5029
5076
  useIslandStore
5030
5077
  };
5031
5078
 
5032
- //# debugId=EB8174B81607FA3364756E2164756E21
5079
+ //# debugId=9893AAB6846669EF64756E2164756E21
5033
5080
  //# sourceMappingURL=index.js.map