@absolutejs/absolute 0.20.0-beta.176 → 0.20.0-beta.178

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 (82) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/changelog.json +62 -0
  3. package/dist/angular/browser.js +17 -2
  4. package/dist/angular/browser.js.map +4 -4
  5. package/dist/angular/components/core/streamingSlotRegistrar.js +1 -1
  6. package/dist/angular/components/core/streamingSlotRegistry.js +2 -2
  7. package/dist/angular/index.js +57 -33
  8. package/dist/angular/index.js.map +9 -8
  9. package/dist/angular/server.js +57 -33
  10. package/dist/angular/server.js.map +9 -8
  11. package/dist/build.js +532 -416
  12. package/dist/build.js.map +15 -15
  13. package/dist/cli/{compile-w2z6c9vt.js → compile-p5yv6ecp.js} +2 -2
  14. package/dist/cli/config/server.js +45 -12
  15. package/dist/cli/{dev-8br5mr7t.js → dev-2hbcsvkp.js} +1 -1
  16. package/dist/cli/{index-420h9hq7.js → index-1ewba8ye.js} +32 -3
  17. package/dist/cli/{index-7z1hh3fg.js → index-9dzdbbfc.js} +1 -1
  18. package/dist/cli/index.js +7 -7
  19. package/dist/cli/{islands-bx67g15t.js → islands-6zgb7501.js} +1 -1
  20. package/dist/cli/{mobile-we5q51ey.js → mobile-c92dh8s2.js} +2 -2
  21. package/dist/cli/{start-srs11bm8.js → start-asxb79rc.js} +2 -2
  22. package/dist/cli/{typecheck-7fvww3b7.js → typecheck-m2j4tkdk.js} +165 -35
  23. package/dist/client/chunks/{index-8m2qq61n.js → index-58svs66p.js} +13 -3
  24. package/dist/client/chunks/{index-8m2qq61n.js.map → index-58svs66p.js.map} +5 -4
  25. package/dist/client/chunks/{islands-mfjmdwnb.js → islands-tcadmgcx.js} +3 -6
  26. package/dist/client/chunks/{islands-mfjmdwnb.js.map → islands-tcadmgcx.js.map} +3 -4
  27. package/dist/client/chunks/{react-sprprqzs.js → react-khr6ewhr.js} +2 -2
  28. package/dist/client/index.js +82 -6
  29. package/dist/client/index.js.map +7 -6
  30. package/dist/dev/client/handlers/islands.ts +2 -0
  31. package/dist/dev/client/handlers/react.ts +92 -111
  32. package/dist/dev/client/handlers/reactUpdateQueue.ts +153 -0
  33. package/dist/index.js +506 -389
  34. package/dist/index.js.map +16 -16
  35. package/dist/islands/browser.js +2 -2
  36. package/dist/islands/browser.js.map +3 -3
  37. package/dist/islands/index.js +13 -6
  38. package/dist/islands/index.js.map +6 -5
  39. package/dist/react/browser.js +113 -12
  40. package/dist/react/browser.js.map +10 -7
  41. package/dist/react/components/index.js +31 -7
  42. package/dist/react/components/index.js.map +5 -4
  43. package/dist/react/components/server/index.js +22 -6
  44. package/dist/react/index.js +190 -46
  45. package/dist/react/index.js.map +15 -11
  46. package/dist/react/server.js +82 -23
  47. package/dist/react/server.js.map +11 -9
  48. package/dist/src/build/compileSvelte.d.ts +12 -1
  49. package/dist/src/build/compileVue.d.ts +1 -0
  50. package/dist/src/build/islandEntries.d.ts +3 -1
  51. package/dist/src/cli/scripts/typecheck.d.ts +8 -0
  52. package/dist/src/cli/scripts/typecheckDiagnostics.d.ts +17 -0
  53. package/dist/src/client/preserveIslandMarkup.d.ts +4 -0
  54. package/dist/src/core/islandManifest.d.ts +6 -0
  55. package/dist/src/core/islandStylesheet.d.ts +17 -0
  56. package/dist/src/react/Island.d.ts +9 -2
  57. package/dist/src/react/IslandStyleLink.d.ts +11 -0
  58. package/dist/src/react/createIsland.d.ts +1 -1
  59. package/dist/src/react/serverComponents/nodeRendererRef.d.ts +13 -0
  60. package/dist/src/utils/requestRenderUrl.d.ts +1 -0
  61. package/dist/src/utils/resolveConvention.d.ts +1 -0
  62. package/dist/src/vue/Island.browser.d.ts +3 -1
  63. package/dist/src/vue/Island.d.ts +2 -2
  64. package/dist/src/vue/createIsland.browser.d.ts +2 -2
  65. package/dist/src/vue/createIsland.d.ts +2 -2
  66. package/dist/src/vue/islandStyleLink.d.ts +30 -0
  67. package/dist/svelte/browser.js +2 -2
  68. package/dist/svelte/browser.js.map +3 -3
  69. package/dist/svelte/index.js +51 -49
  70. package/dist/svelte/index.js.map +9 -8
  71. package/dist/svelte/server.js +48 -45
  72. package/dist/svelte/server.js.map +8 -7
  73. package/dist/types/globals.d.ts +3 -0
  74. package/dist/vue/browser.js +105 -10
  75. package/dist/vue/browser.js.map +10 -7
  76. package/dist/vue/index.js +170 -47
  77. package/dist/vue/index.js.map +14 -11
  78. package/dist/vue/server.js +81 -22
  79. package/dist/vue/server.js.map +9 -7
  80. package/package.json +1 -1
  81. /package/dist/cli/{index-6522t968.js → index-yd672jyq.js} +0 -0
  82. /package/dist/client/chunks/{react-sprprqzs.js.map → react-khr6ewhr.js.map} +0 -0
@@ -482,7 +482,7 @@ var ISLAND_BOOTSTRAP_MANIFEST_KEY = "AbsoluteIslandBootstrap", LEGACY_ISLAND_BOO
482
482
  islands[framework] = entries;
483
483
  }
484
484
  return islands;
485
- }, getIslandManifestKey = (framework, component) => `Island${toIslandFrameworkSegment(framework)}${component}`;
485
+ }, getIslandManifestKey = (framework, component) => `Island${toIslandFrameworkSegment(framework)}${component}`, ISLAND_STYLE_PREFIX = "IslandStyle", getIslandStyleManifestEntries = (manifest) => Object.entries(manifest).filter(([key]) => key.startsWith(ISLAND_STYLE_PREFIX)), getIslandStyleManifestKey = (framework, component) => `${ISLAND_STYLE_PREFIX}${toIslandFrameworkSegment(framework)}${component}`;
486
486
 
487
487
  // src/core/islandPageContext.ts
488
488
  var ISLAND_MARKER = 'data-island="true"', MANIFEST_MARKER = "__ABSOLUTE_MANIFEST__", ISLAND_STATE_MARKER = "__ABS_ISLAND_STATE__", CLOSING_HEAD_TAG = "</head>", warnedMissingBootstrap = false, warnIfBootstrapMissing = (manifest) => {
@@ -519,12 +519,27 @@ var ISLAND_MARKER = 'data-island="true"', MANIFEST_MARKER = "__ABSOLUTE_MANIFEST
519
519
  browserManifest[key] = value;
520
520
  }
521
521
  return browserManifest;
522
- }, buildIslandsHeadMarkup = (manifest) => {
522
+ }, ISLAND_MARKER_TAG, ISLAND_FRAMEWORKS, readMarkerAttribute = (tag, name) => new RegExp(`\\b${name}="([^"]*)"`).exec(tag)?.[1]?.replaceAll("&quot;", '"').replaceAll("&lt;", "<").replaceAll("&gt;", ">").replaceAll("&amp;", "&"), toIslandFramework = (value) => ISLAND_FRAMEWORKS.find((framework) => framework === value), collectRenderedIslandStyleKeys = (html) => {
523
+ const keys = new Set;
524
+ for (const [tag] of html.matchAll(ISLAND_MARKER_TAG)) {
525
+ const framework = toIslandFramework(readMarkerAttribute(tag, "data-framework"));
526
+ const component = readMarkerAttribute(tag, "data-component");
527
+ if (framework && component)
528
+ keys.add(getIslandStyleManifestKey(framework, component));
529
+ }
530
+ return keys;
531
+ }, buildIslandStyleLinks = (manifest, html) => {
532
+ if (html === undefined)
533
+ return "";
534
+ const renderedKeys = collectRenderedIslandStyleKeys(html);
535
+ return getIslandStyleManifestEntries(manifest).filter(([key]) => renderedKeys.has(key)).filter(([, href]) => !html.includes(`href="${href}"`)).map(([key, href]) => `<link rel="stylesheet" href="${href}" data-island-style="${key}"${nonceAttr()}>`).join("");
536
+ }, buildIslandsHeadMarkup = (manifest, html) => {
537
+ const styleLinks = buildIslandStyleLinks(manifest, html);
523
538
  const manifestScript = `<script${nonceAttr()}>window.__ABSOLUTE_MANIFEST__ = ${escapeScriptContent(JSON.stringify(toBrowserManifest(manifest)))}</script>`;
524
539
  const islandStateScript = `<script${nonceAttr()}>window.__ABS_ISLAND_STATE__ = ${escapeScriptContent(JSON.stringify(globalThis.__ABS_ISLAND_STATE__ ?? {}))}</script>`;
525
540
  const bootstrapPath = getIslandBootstrapPath(manifest);
526
541
  const bootstrapScript = bootstrapPath ? `<script${nonceAttr()} type="module" src="${bootstrapPath}"></script>` : "";
527
- return `${manifestScript}${islandStateScript}${bootstrapScript}`;
542
+ return `${styleLinks}${manifestScript}${islandStateScript}${bootstrapScript}`;
528
543
  }, injectHeadMarkup = (html, markup) => {
529
544
  const closingHeadIndex = html.indexOf("</head>");
530
545
  if (closingHeadIndex >= 0) {
@@ -706,7 +721,7 @@ var ISLAND_MARKER = 'data-island="true"', MANIFEST_MARKER = "__ABSOLUTE_MANIFEST
706
721
  return html;
707
722
  }
708
723
  warnIfBootstrapMissing(manifest);
709
- return injectHeadMarkup(html, buildIslandsHeadMarkup(manifest));
724
+ return injectHeadMarkup(html, buildIslandsHeadMarkup(manifest, html));
710
725
  }, injectIslandPageContextStream = (stream, options) => {
711
726
  const manifest = globalThis.__absoluteManifest;
712
727
  if (!manifest)
@@ -730,6 +745,13 @@ var init_islandPageContext = __esm(() => {
730
745
  init_logger();
731
746
  MANIFEST_BUILD_DIR_KEY = Symbol.for("absolutejs.islandManifestBuildDir");
732
747
  WINDOWS_ABSOLUTE_PATH = /^[A-Za-z]:[\\/]|^\\\\/;
748
+ ISLAND_MARKER_TAG = /<[^>]*\bdata-island="true"[^>]*>/g;
749
+ ISLAND_FRAMEWORKS = [
750
+ "react",
751
+ "svelte",
752
+ "vue",
753
+ "angular"
754
+ ];
733
755
  });
734
756
 
735
757
  // src/core/devRouteRegistrationCallsite.ts
@@ -2128,6 +2150,12 @@ var CONVENTIONS_KEY = "__absoluteConventions", isConventionsMap = (value) => Boo
2128
2150
  logConventionRenderError(framework, "error", renderError);
2129
2151
  }
2130
2152
  return null;
2153
+ }, isPageRequest = (request) => {
2154
+ if (request.headers.get("hx-request") === "true")
2155
+ return true;
2156
+ if (request.headers.get("sec-fetch-dest") === "document")
2157
+ return true;
2158
+ return (request.headers.get("accept") ?? "").includes("text/html");
2131
2159
  }, renderConventionError = async (framework, pageName, error) => {
2132
2160
  const errorProps = buildErrorProps(error);
2133
2161
  const frameworkResponse = await tryFrameworkErrorConvention(framework, pageName, errorProps, error);
@@ -2139,12 +2167,6 @@ var CONVENTIONS_KEY = "__absoluteConventions", isConventionsMap = (value) => Boo
2139
2167
  return htmlResponse;
2140
2168
  }
2141
2169
  return null;
2142
- }, isPageRequest = (request) => {
2143
- if (request.headers.get("hx-request") === "true")
2144
- return true;
2145
- if (request.headers.get("sec-fetch-dest") === "document")
2146
- return true;
2147
- return (request.headers.get("accept") ?? "").includes("text/html");
2148
2170
  }, renderStaticRouteError = async (request, error) => {
2149
2171
  if (!isPageRequest(request))
2150
2172
  return null;
@@ -2450,6 +2472,18 @@ var asset = (source, name) => {
2450
2472
  return assetPath;
2451
2473
  };
2452
2474
 
2475
+ // src/utils/requestRenderUrl.ts
2476
+ var requestRenderUrl = (request) => {
2477
+ if (!request)
2478
+ return;
2479
+ try {
2480
+ const parsed = new URL(request.url);
2481
+ return `${parsed.pathname.replace(/\/{2,}/g, "/")}${parsed.search}`;
2482
+ } catch {
2483
+ return;
2484
+ }
2485
+ };
2486
+
2453
2487
  // src/react/pageHandler.ts
2454
2488
  init_cspNonceRef();
2455
2489
  init_islandPageContext();
@@ -2735,16 +2769,7 @@ init_spaRouteManifest();
2735
2769
  init_resolveConvention();
2736
2770
  init_browserTranslation();
2737
2771
  var withRequestUrl = (props, url) => Object.assign(Object.create(null), props, { url });
2738
- var resolveRequestPathname = (request) => {
2739
- if (!request)
2740
- return;
2741
- try {
2742
- const parsed = new URL(request.url);
2743
- return `${parsed.pathname}${parsed.search}`;
2744
- } catch {
2745
- return;
2746
- }
2747
- };
2772
+ var resolveRequestPathname = (request) => requestRenderUrl(request);
2748
2773
  var buildRefreshSetup = () => {
2749
2774
  if (isProductionRuntime()) {
2750
2775
  return "";
@@ -2855,6 +2880,7 @@ var reactFileRoute = (route) => defineFileRouteWith("react", route, async ({ man
2855
2880
  init_cspNonceRef();
2856
2881
  init_requestContext();
2857
2882
  init_pageResponseCache();
2883
+ import { AsyncLocalStorage as AsyncLocalStorage5 } from "async_hooks";
2858
2884
  import { readFile } from "fs/promises";
2859
2885
  import { dirname, join } from "path";
2860
2886
  init_devRouteRegistrationCallsite();
@@ -2927,6 +2953,27 @@ var injectFlightPayload = (html, flight, nonce) => {
2927
2953
  });
2928
2954
  };
2929
2955
 
2956
+ // src/react/serverComponents/nodeRendererRef.ts
2957
+ var STORAGE_KEY = Symbol.for("absolutejs.reactServerNodeRendererStorage");
2958
+ var isRendererStorage = (value) => typeof value === "object" && value !== null && ("getStore" in value) && typeof value.getStore === "function" && ("run" in value) && typeof value.run === "function";
2959
+ var isRenderer = (value) => typeof value === "function";
2960
+ var readStorage = () => {
2961
+ const storage = Reflect.get(globalThis, STORAGE_KEY);
2962
+ return isRendererStorage(storage) ? storage : undefined;
2963
+ };
2964
+ var getReactServerNodeRenderer = () => {
2965
+ const store = readStorage()?.getStore();
2966
+ return isRenderer(store) ? store : undefined;
2967
+ };
2968
+ var runWithReactServerNodeRenderer = (renderer, createStorage, render) => {
2969
+ let storage = readStorage();
2970
+ if (!storage) {
2971
+ storage = createStorage();
2972
+ Reflect.set(globalThis, STORAGE_KEY, storage);
2973
+ }
2974
+ return storage.run(renderer, render);
2975
+ };
2976
+
2930
2977
  // src/react/serverComponents/pageHandler.ts
2931
2978
  var isRecord4 = (value) => typeof value === "object" && value !== null;
2932
2979
  var isPageModule = (value) => isRecord4(value) && typeof value.Page === "function" && isRecord4(value.clientManifest) && typeof value.createElement === "function" && typeof value.renderToReadableStream === "function";
@@ -2969,6 +3016,16 @@ var loadRenderer = async (rendererPath) => {
2969
3016
  var logRenderError = (error) => {
2970
3017
  console.error("[SSR] React Server Components error:", error);
2971
3018
  };
3019
+ var createNodeRenderer = (pageModule, renderer) => {
3020
+ const { renderStaticHtml } = renderer;
3021
+ if (!renderStaticHtml)
3022
+ return;
3023
+ const render = (node) => renderStaticHtml(pageModule.renderToReadableStream(node, pageModule.clientManifest, {
3024
+ onError: logRenderError
3025
+ }));
3026
+ return render;
3027
+ };
3028
+ var createRendererStorage = () => new AsyncLocalStorage5;
2972
3029
  var handleReactServerPageRequest = async (input) => {
2973
3030
  const request = input.request ?? getCurrentAbsoluteRequest();
2974
3031
  if (input.page === "") {
@@ -2984,11 +3041,13 @@ var handleReactServerPageRequest = async (input) => {
2984
3041
  ]);
2985
3042
  const renderer = await loadRenderer(runtime.ssr);
2986
3043
  const nonce = readCspNonce();
2987
- const flight = pageModule.renderToReadableStream(pageModule.createElement(pageModule.Page, input.props ?? {}), pageModule.clientManifest, { onError: logRenderError });
3044
+ const renderFlight = () => pageModule.renderToReadableStream(pageModule.createElement(pageModule.Page, input.props ?? {}), pageModule.clientManifest, { onError: logRenderError });
3045
+ const nodeRenderer = createNodeRenderer(pageModule, renderer);
3046
+ const flight = nodeRenderer ? runWithReactServerNodeRenderer(nodeRenderer, createRendererStorage, renderFlight) : renderFlight();
2988
3047
  const [forHtml, forPayload] = flight.tee();
2989
3048
  const html = await renderer.renderHtml(forHtml, {
2990
3049
  bootstrapModules: [runtime.client],
2991
- bootstrapScriptContent: BROWSER_TRANSLATION_BASELINE_SCRIPT,
3050
+ bootstrapScriptContent: `${BROWSER_TRANSLATION_BASELINE_SCRIPT}window.__ABS_SLOT_HYDRATION_PENDING__=true;`,
2992
3051
  nonce,
2993
3052
  onError: logRenderError
2994
3053
  });
@@ -3014,5 +3073,5 @@ export {
3014
3073
  reactFileRoute
3015
3074
  };
3016
3075
 
3017
- //# debugId=FB633E162EB858B764756E2164756E21
3076
+ //# debugId=567A32D4B8B7FF0164756E2164756E21
3018
3077
  //# sourceMappingURL=server.js.map