@withl5e/l5e 0.2.3 → 0.2.4

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.
package/dist/index.js CHANGED
@@ -1,49 +1,51 @@
1
- import { B as s, H as t, I as r, N as n, R as o, S as d } from "./exceptions-CHPz01DJ.js";
2
- import { F as c, H as p, a as x, b as l, c as m, g as E, d as g, e as u, f, h as C, i as H, j as R, k as S, p as h, l as I, r as v, n as T, o as q, s as F, u as M, q as N, t as b } from "./jsx-runtime-DVQ9eOji.js";
3
- import { coreVite as V } from "./vite-plugin.js";
4
- import { c as w, d as B, s as P } from "./index-BlfNBupp.js";
5
- import { createServer as y, startServer as A } from "./server.js";
6
- import { e as L, a as O, r as U, b as Y } from "./render-BF7iTagJ.js";
7
- import { render as z } from "./entry-server.js";
1
+ import { B as a, H as t, I as r, N as n, R as o, S as d } from "./exceptions-CHPz01DJ.js";
2
+ import { F as c, H as p, a as l, b as x, c as g, g as m, d as E, e as u, f as S, h as f, i as C, j as I, k as H, l as R, p as h, n as v, r as T, o as q, q as F, s as M, t as N, u as b, v as w, w as J } from "./jsx-runtime-Bokflh8Q.js";
3
+ import { coreVite as j } from "./vite-plugin.js";
4
+ import { c as P, d as k, s as y } from "./index-BlfNBupp.js";
5
+ import { createServer as D, startServer as L } from "./server.js";
6
+ import { e as U, a as Y, r as _, b as z } from "./render-DTXfJu0d.js";
7
+ import { render as K } from "./entry-server.js";
8
8
  export {
9
- s as BadRequestException,
9
+ a as BadRequestException,
10
10
  c as Fragment,
11
11
  p as HEAD_PRIORITY,
12
- x as Head,
12
+ l as Head,
13
13
  t as HttpException,
14
14
  r as InternalServerErrorException,
15
15
  n as NotFoundException,
16
16
  o as RedirectException,
17
17
  d as ServiceUnavailableException,
18
- l as addCacheTag,
19
- m as cloneElement,
20
- V as coreVite,
21
- w as createContext,
22
- y as createServer,
23
- B as defineMiddleware,
24
- L as escapeHTML,
25
- O as escapeProp,
26
- E as getCacheTags,
27
- g as getClientJsEntries,
18
+ x as addCacheTag,
19
+ g as cloneElement,
20
+ j as coreVite,
21
+ P as createContext,
22
+ D as createServer,
23
+ k as defineMiddleware,
24
+ U as escapeHTML,
25
+ Y as escapeProp,
26
+ m as getCacheTags,
27
+ E as getClientJsEntries,
28
28
  u as getCssEntries,
29
- f as getHeadContent,
30
- C as getIslandEntries,
31
- H as getSchemas,
32
- R as isValidElement,
33
- S as jsxFactory,
29
+ S as getHeadContent,
30
+ f as getIslandEntries,
31
+ C as getSchemas,
32
+ I as getSsrIslands,
33
+ H as isValidElement,
34
+ R as jsxFactory,
34
35
  h as pushMetadata,
35
- I as pushSchema,
36
- v as registerIsland,
37
- z as render,
38
- U as renderJsxToHtmlString,
39
- Y as renderToRenderedNode,
40
- T as resolveMetadata,
41
- q as runInRenderContext,
42
- P as sequence,
43
- F as setViewName,
44
- A as startServer,
45
- M as useClientJs,
46
- N as useCss,
47
- b as useRequest
36
+ v as pushSchema,
37
+ T as registerIsland,
38
+ q as registerSsrIsland,
39
+ K as render,
40
+ _ as renderJsxToHtmlString,
41
+ z as renderToRenderedNode,
42
+ F as resolveMetadata,
43
+ M as runInRenderContext,
44
+ y as sequence,
45
+ N as setViewName,
46
+ L as startServer,
47
+ b as useClientJs,
48
+ w as useCss,
49
+ J as useRequest
48
50
  };
49
51
  //# sourceMappingURL=index.js.map
@@ -8,9 +8,9 @@ a("idle", (e) => {
8
8
  });
9
9
  a("visible", (e, t, r) => {
10
10
  const o = t || "200px", n = new IntersectionObserver(
11
- (s) => {
12
- s.forEach((i) => {
13
- i.isIntersecting && (n.disconnect(), e());
11
+ (i) => {
12
+ i.forEach((s) => {
13
+ s.isIntersecting && (n.disconnect(), e());
14
14
  });
15
15
  },
16
16
  { rootMargin: o }
@@ -42,7 +42,8 @@ function l() {
42
42
  exportName: e.getAttribute("data-island-name"),
43
43
  props: JSON.parse(e.getAttribute("data-island-props") || "{}"),
44
44
  mount: e.getAttribute("data-island-mount") || "load",
45
- mountOpts: e.getAttribute("data-island-opts") || void 0
45
+ mountOpts: e.getAttribute("data-island-opts") || void 0,
46
+ ssr: e.hasAttribute("data-island-ssr")
46
47
  }));
47
48
  }
48
49
  function m(e) {
@@ -59,19 +60,19 @@ function m(e) {
59
60
  return;
60
61
  }
61
62
  try {
62
- const [{ createRoot: o }, { createElement: n }, s] = await Promise.all([
63
+ const [o, { createElement: n }, i] = await Promise.all([
63
64
  import("react-dom/client"),
64
65
  import("react"),
65
66
  import(
66
67
  /* @vite-ignore */
67
68
  r
68
69
  )
69
- ]), i = s.default || s[e.exportName];
70
- if (!i) {
70
+ ]), s = i.default || i[e.exportName];
71
+ if (!s) {
71
72
  console.error(`[l5e-island] No export "default" or "${e.exportName}" in module`);
72
73
  return;
73
74
  }
74
- o(e.element).render(n(i, e.props));
75
+ e.ssr ? o.hydrateRoot(e.element, n(s, e.props)) : o.createRoot(e.element).render(n(s, e.props));
75
76
  } catch (o) {
76
77
  console.error(`[l5e-island] Failed to mount "${e.registryKey}":`, o);
77
78
  }
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sources":["../../src/island/runtime.ts"],"sourcesContent":["import type { IslandMeta } from './types';\nimport { strategies, registerMountStrategy } from './strategy-registry';\n\n// ============================================================\n// PART 1: Built-in strategies\n// ============================================================\n\nregisterMountStrategy('load', (mount) => {\n mount();\n});\n\nregisterMountStrategy('idle', (mount) => {\n if ('requestIdleCallback' in window) {\n requestIdleCallback(() => mount());\n } else {\n setTimeout(() => mount(), 200);\n }\n});\n\nregisterMountStrategy('visible', (mount, opts, el) => {\n const rootMargin = opts || '200px';\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n observer.disconnect();\n mount();\n }\n });\n },\n { rootMargin },\n );\n observer.observe(el);\n return () => observer.disconnect();\n});\n\nregisterMountStrategy('media', (mount, opts) => {\n if (!opts) {\n console.error('[l5e-island] Strategy \"media\" requires mountOpts (media query)');\n return;\n }\n const mql = window.matchMedia(opts);\n if (mql.matches) {\n mount();\n } else {\n const handler = (e: MediaQueryListEvent) => {\n if (e.matches) mount();\n };\n mql.addEventListener('change', handler, { once: true });\n return () => mql.removeEventListener('change', handler);\n }\n});\n\nregisterMountStrategy('none', () => {\n // Don't mount - keep placeholder as-is\n});\n\n// ============================================================\n// PART 2: Import custom strategies (if any)\n// ============================================================\n\nimport 'virtual:l5e-island-strategies';\n\n// ============================================================\n// PART 3: Island discovery + mount logic\n// ============================================================\n\n// Per-page island registry injected by server.ts as inline script\n// Format: { \"Counter_a3f2\": \"/assets/Counter-Abc123.js\" }\nconst islandRegistry: Record<string, string> = (window as any).__L5E_ISLANDS__ || {};\n\nfunction discoverIslands(): IslandMeta[] {\n return Array.from(document.querySelectorAll('[data-island]')).map((el) => ({\n element: el as HTMLElement,\n registryKey: el.getAttribute('data-island')!,\n exportName: el.getAttribute('data-island-name')!,\n props: JSON.parse(el.getAttribute('data-island-props') || '{}'),\n mount: el.getAttribute('data-island-mount') || 'load',\n mountOpts: el.getAttribute('data-island-opts') || undefined,\n }));\n}\n\nfunction createMountFn(island: IslandMeta): () => Promise<void> {\n let mounted = false;\n return async () => {\n if (mounted) return;\n mounted = true;\n\n // Look up component URL from per-page registry\n const url = islandRegistry[island.registryKey];\n if (!url) {\n console.error(\n `[l5e-island] Component \"${island.registryKey}\" not found in page registry.`,\n `Available: ${Object.keys(islandRegistry).join(', ')}`,\n );\n return;\n }\n\n try {\n const [{ createRoot }, { createElement }, mod] = await Promise.all([\n import('react-dom/client'),\n import('react'),\n import(/* @vite-ignore */ url),\n ]);\n\n const Component = mod.default || mod[island.exportName];\n if (!Component) {\n console.error(`[l5e-island] No export \"default\" or \"${island.exportName}\" in module`);\n return;\n }\n\n const root = createRoot(island.element);\n root.render(createElement(Component, island.props));\n } catch (error) {\n console.error(`[l5e-island] Failed to mount \"${island.registryKey}\":`, error);\n }\n };\n}\n\nfunction scheduleMount(island: IslandMeta) {\n const strategy = strategies.get(island.mount);\n\n if (!strategy) {\n console.error(\n `[l5e-island] Strategy \"${island.mount}\" not found.`,\n `Available: ${[...strategies.keys()].join(', ')}`,\n `\\nDid you forget to registerMountStrategy(\"${island.mount}\", ...)?`,\n );\n return;\n }\n\n const mountFn = createMountFn(island);\n strategy(mountFn, island.mountOpts, island.element);\n}\n\n// ============================================================\n// PART 4: Boot\n// ============================================================\n\nfunction boot() {\n const islands = discoverIslands();\n islands.forEach(scheduleMount);\n}\n\nif (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', boot);\n} else {\n boot();\n}\n"],"names":["registerMountStrategy","mount","opts","el","rootMargin","observer","entries","entry","mql","handler","e","islandRegistry","discoverIslands","createMountFn","island","mounted","url","createRoot","createElement","mod","Component","error","scheduleMount","strategy","strategies","mountFn","boot"],"mappings":";;AAOAA,EAAsB,QAAQ,CAACC,MAAU;AACvC,EAAAA,EAAA;AACF,CAAC;AAEDD,EAAsB,QAAQ,CAACC,MAAU;AACvC,EAAI,yBAAyB,SAC3B,oBAAoB,MAAMA,GAAO,IAEjC,WAAW,MAAMA,EAAA,GAAS,GAAG;AAEjC,CAAC;AAEDD,EAAsB,WAAW,CAACC,GAAOC,GAAMC,MAAO;AACpD,QAAMC,IAAaF,KAAQ,SACrBG,IAAW,IAAI;AAAA,IACnB,CAACC,MAAY;AACX,MAAAA,EAAQ,QAAQ,CAACC,MAAU;AACzB,QAAIA,EAAM,mBACRF,EAAS,WAAA,GACTJ,EAAA;AAAA,MAEJ,CAAC;AAAA,IACH;AAAA,IACA,EAAE,YAAAG,EAAA;AAAA,EAAW;AAEf,SAAAC,EAAS,QAAQF,CAAE,GACZ,MAAME,EAAS,WAAA;AACxB,CAAC;AAEDL,EAAsB,SAAS,CAACC,GAAOC,MAAS;AAC9C,MAAI,CAACA,GAAM;AACT,YAAQ,MAAM,gEAAgE;AAC9E;AAAA,EACF;AACA,QAAMM,IAAM,OAAO,WAAWN,CAAI;AAClC,MAAIM,EAAI;AACN,IAAAP,EAAA;AAAA,OACK;AACL,UAAMQ,IAAU,CAACC,MAA2B;AAC1C,MAAIA,EAAE,WAAST,EAAA;AAAA,IACjB;AACA,WAAAO,EAAI,iBAAiB,UAAUC,GAAS,EAAE,MAAM,IAAM,GAC/C,MAAMD,EAAI,oBAAoB,UAAUC,CAAO;AAAA,EACxD;AACF,CAAC;AAEDT,EAAsB,QAAQ,MAAM;AAEpC,CAAC;AAcD,MAAMW,IAA0C,OAAe,mBAAmB,CAAA;AAElF,SAASC,IAAgC;AACvC,SAAO,MAAM,KAAK,SAAS,iBAAiB,eAAe,CAAC,EAAE,IAAI,CAACT,OAAQ;AAAA,IACzE,SAASA;AAAA,IACT,aAAaA,EAAG,aAAa,aAAa;AAAA,IAC1C,YAAYA,EAAG,aAAa,kBAAkB;AAAA,IAC9C,OAAO,KAAK,MAAMA,EAAG,aAAa,mBAAmB,KAAK,IAAI;AAAA,IAC9D,OAAOA,EAAG,aAAa,mBAAmB,KAAK;AAAA,IAC/C,WAAWA,EAAG,aAAa,kBAAkB,KAAK;AAAA,EAAA,EAClD;AACJ;AAEA,SAASU,EAAcC,GAAyC;AAC9D,MAAIC,IAAU;AACd,SAAO,YAAY;AACjB,QAAIA,EAAS;AACb,IAAAA,IAAU;AAGV,UAAMC,IAAML,EAAeG,EAAO,WAAW;AAC7C,QAAI,CAACE,GAAK;AACR,cAAQ;AAAA,QACN,2BAA2BF,EAAO,WAAW;AAAA,QAC7C,cAAc,OAAO,KAAKH,CAAc,EAAE,KAAK,IAAI,CAAC;AAAA,MAAA;AAEtD;AAAA,IACF;AAEA,QAAI;AACF,YAAM,CAAC,EAAE,YAAAM,EAAA,GAAc,EAAE,eAAAC,EAAA,GAAiBC,CAAG,IAAI,MAAM,QAAQ,IAAI;AAAA,QACjE,OAAO,kBAAkB;AAAA,QACzB,OAAO,OAAO;AAAA,QACd;AAAA;AAAA,UAA0BH;AAAA;AAAA,MAAA,CAC3B,GAEKI,IAAYD,EAAI,WAAWA,EAAIL,EAAO,UAAU;AACtD,UAAI,CAACM,GAAW;AACd,gBAAQ,MAAM,wCAAwCN,EAAO,UAAU,aAAa;AACpF;AAAA,MACF;AAGA,MADaG,EAAWH,EAAO,OAAO,EACjC,OAAOI,EAAcE,GAAWN,EAAO,KAAK,CAAC;AAAA,IACpD,SAASO,GAAO;AACd,cAAQ,MAAM,iCAAiCP,EAAO,WAAW,MAAMO,CAAK;AAAA,IAC9E;AAAA,EACF;AACF;AAEA,SAASC,EAAcR,GAAoB;AACzC,QAAMS,IAAWC,EAAW,IAAIV,EAAO,KAAK;AAE5C,MAAI,CAACS,GAAU;AACb,YAAQ;AAAA,MACN,0BAA0BT,EAAO,KAAK;AAAA,MACtC,cAAc,CAAC,GAAGU,EAAW,MAAM,EAAE,KAAK,IAAI,CAAC;AAAA,MAC/C;AAAA,2CAA8CV,EAAO,KAAK;AAAA,IAAA;AAE5D;AAAA,EACF;AAEA,QAAMW,IAAUZ,EAAcC,CAAM;AACpC,EAAAS,EAASE,GAASX,EAAO,WAAWA,EAAO,OAAO;AACpD;AAMA,SAASY,IAAO;AAEd,EADgBd,EAAA,EACR,QAAQU,CAAa;AAC/B;AAEI,SAAS,eAAe,YAC1B,SAAS,iBAAiB,oBAAoBI,CAAI,IAElDA,EAAA;"}
1
+ {"version":3,"file":"runtime.js","sources":["../../src/island/runtime.ts"],"sourcesContent":["import type { IslandMeta } from './types';\nimport { strategies, registerMountStrategy } from './strategy-registry';\n\n// ============================================================\n// PART 1: Built-in strategies\n// ============================================================\n\nregisterMountStrategy('load', (mount) => {\n mount();\n});\n\nregisterMountStrategy('idle', (mount) => {\n if ('requestIdleCallback' in window) {\n requestIdleCallback(() => mount());\n } else {\n setTimeout(() => mount(), 200);\n }\n});\n\nregisterMountStrategy('visible', (mount, opts, el) => {\n const rootMargin = opts || '200px';\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n observer.disconnect();\n mount();\n }\n });\n },\n { rootMargin },\n );\n observer.observe(el);\n return () => observer.disconnect();\n});\n\nregisterMountStrategy('media', (mount, opts) => {\n if (!opts) {\n console.error('[l5e-island] Strategy \"media\" requires mountOpts (media query)');\n return;\n }\n const mql = window.matchMedia(opts);\n if (mql.matches) {\n mount();\n } else {\n const handler = (e: MediaQueryListEvent) => {\n if (e.matches) mount();\n };\n mql.addEventListener('change', handler, { once: true });\n return () => mql.removeEventListener('change', handler);\n }\n});\n\nregisterMountStrategy('none', () => {\n // Don't mount - keep placeholder as-is\n});\n\n// ============================================================\n// PART 2: Import custom strategies (if any)\n// ============================================================\n\nimport 'virtual:l5e-island-strategies';\n\n// ============================================================\n// PART 3: Island discovery + mount logic\n// ============================================================\n\n// Per-page island registry injected by server.ts as inline script\n// Format: { \"Counter_a3f2\": \"/assets/Counter-Abc123.js\" }\nconst islandRegistry: Record<string, string> = (window as any).__L5E_ISLANDS__ || {};\n\nfunction discoverIslands(): IslandMeta[] {\n return Array.from(document.querySelectorAll('[data-island]')).map((el) => ({\n element: el as HTMLElement,\n registryKey: el.getAttribute('data-island')!,\n exportName: el.getAttribute('data-island-name')!,\n props: JSON.parse(el.getAttribute('data-island-props') || '{}'),\n mount: el.getAttribute('data-island-mount') || 'load',\n mountOpts: el.getAttribute('data-island-opts') || undefined,\n ssr: el.hasAttribute('data-island-ssr'),\n }));\n}\n\nfunction createMountFn(island: IslandMeta): () => Promise<void> {\n let mounted = false;\n return async () => {\n if (mounted) return;\n mounted = true;\n\n // Look up component URL from per-page registry\n const url = islandRegistry[island.registryKey];\n if (!url) {\n console.error(\n `[l5e-island] Component \"${island.registryKey}\" not found in page registry.`,\n `Available: ${Object.keys(islandRegistry).join(', ')}`,\n );\n return;\n }\n\n try {\n const [reactDomClient, { createElement }, mod] = await Promise.all([\n import('react-dom/client'),\n import('react'),\n import(/* @vite-ignore */ url),\n ]);\n\n const Component = mod.default || mod[island.exportName];\n if (!Component) {\n console.error(`[l5e-island] No export \"default\" or \"${island.exportName}\" in module`);\n return;\n }\n\n if (island.ssr) {\n // Server already rendered this component into the element → hydrate it.\n reactDomClient.hydrateRoot(island.element, createElement(Component, island.props));\n } else {\n // Client-only mount (default): fresh render into an empty placeholder.\n const root = reactDomClient.createRoot(island.element);\n root.render(createElement(Component, island.props));\n }\n } catch (error) {\n console.error(`[l5e-island] Failed to mount \"${island.registryKey}\":`, error);\n }\n };\n}\n\nfunction scheduleMount(island: IslandMeta) {\n const strategy = strategies.get(island.mount);\n\n if (!strategy) {\n console.error(\n `[l5e-island] Strategy \"${island.mount}\" not found.`,\n `Available: ${[...strategies.keys()].join(', ')}`,\n `\\nDid you forget to registerMountStrategy(\"${island.mount}\", ...)?`,\n );\n return;\n }\n\n const mountFn = createMountFn(island);\n strategy(mountFn, island.mountOpts, island.element);\n}\n\n// ============================================================\n// PART 4: Boot\n// ============================================================\n\nfunction boot() {\n const islands = discoverIslands();\n islands.forEach(scheduleMount);\n}\n\nif (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', boot);\n} else {\n boot();\n}\n"],"names":["registerMountStrategy","mount","opts","el","rootMargin","observer","entries","entry","mql","handler","e","islandRegistry","discoverIslands","createMountFn","island","mounted","url","reactDomClient","createElement","mod","Component","error","scheduleMount","strategy","strategies","mountFn","boot"],"mappings":"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"}
package/dist/island.js CHANGED
@@ -1,39 +1,52 @@
1
- import { r as p, k as f } from "./jsx-runtime-DVQ9eOji.js";
2
- function u(n) {
3
- const a = n.split("/");
1
+ import { r as g, o as v, l as m } from "./jsx-runtime-Bokflh8Q.js";
2
+ function x(l) {
3
+ const a = l.split("/");
4
4
  let s = a[a.length - 1];
5
5
  return s = s.replace(/\.(tsx?|jsx?)$/, ""), s;
6
6
  }
7
- function x(n) {
7
+ function _(l) {
8
8
  const {
9
9
  from: a,
10
10
  props: s = {},
11
- mount: c = "load",
12
- mountOpts: e,
13
- class: l,
14
- id: o,
15
- children: m,
16
- __key: t,
17
- __src: i
18
- } = n, d = u(a);
19
- t && i && p(t, i, d);
20
- const r = {
21
- "data-island": t || "unresolved",
22
- "data-island-name": d,
11
+ mount: p = "load",
12
+ mountOpts: c,
13
+ class: n,
14
+ id: t,
15
+ children: f,
16
+ ssr: u,
17
+ __key: i,
18
+ __src: e
19
+ } = l, r = x(a);
20
+ i && e && g(i, e, r);
21
+ const d = {
22
+ "data-island": i || "unresolved",
23
+ "data-island-name": r,
23
24
  "data-island-props": JSON.stringify(s),
24
- "data-island-mount": c
25
+ "data-island-mount": p
25
26
  };
26
- return e && (r["data-island-opts"] = e), f(
27
+ if (c && (d["data-island-opts"] = c), u && e) {
28
+ const o = v(e, r, s);
29
+ if (o)
30
+ return m("div", {
31
+ ...d,
32
+ "data-island-ssr": o,
33
+ ...t ? { id: t } : {},
34
+ class: n ? `l5e-island ${n}` : "l5e-island",
35
+ // Raw token comment as body; replaced with SSR HTML in entry-server.
36
+ setHtml: `<!--${o}-->`
37
+ });
38
+ }
39
+ return m(
27
40
  "div",
28
41
  {
29
- ...r,
30
- ...o ? { id: o } : {},
31
- class: l ? `l5e-island ${l}` : "l5e-island"
42
+ ...d,
43
+ ...t ? { id: t } : {},
44
+ class: n ? `l5e-island ${n}` : "l5e-island"
32
45
  },
33
- m
46
+ f
34
47
  );
35
48
  }
36
49
  export {
37
- x as ClientIsland
50
+ _ as ClientIsland
38
51
  };
39
52
  //# sourceMappingURL=island.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"island.js","sources":["../src/island/ClientIsland.ts"],"sourcesContent":["import { jsxFactory, registerIsland, type JSXChild, type JSXNode } from '../core/jsx-runtime';\n\n/**\n * Derive component name from `from` path.\n * \"./react/Counter\" → \"Counter\"\n * \"~/features/newsfeed/react/NewsfeedApp\" → \"NewsfeedApp\"\n */\nfunction deriveComponentName(from: string): string {\n const segments = from.split('/');\n let filename = segments[segments.length - 1];\n filename = filename.replace(/\\.(tsx?|jsx?)$/, '');\n return filename;\n}\nexport type MountStrategy = 'load' | 'idle' | 'visible' | 'media' | 'none';\nexport interface ClientIslandProps {\n from: string;\n props?: Record<string, any>;\n mount?: MountStrategy | string;\n mountOpts?: string;\n class?: string;\n id?: string;\n children?: JSXChild | JSXChild[];\n\n /** INTERNAL — injected by vite-plugin. Format: \"[name]_[hash]\" */\n __key?: string;\n /** INTERNAL — injected by vite-plugin. Manifest-compatible source path with extension */\n __src?: string;\n}\n\nexport function ClientIsland(attrs: ClientIslandProps): JSXNode {\n const {\n from,\n props = {},\n mount = 'load',\n mountOpts,\n class: className,\n id,\n children,\n __key,\n __src,\n } = attrs;\n\n const componentName = deriveComponentName(from);\n\n // Register island in render context (like useClientJs)\n // server.ts will use this to generate per-page window.__L5E_ISLANDS__\n if (__key && __src) {\n registerIsland(__key, __src, componentName);\n }\n\n const dataAttrs: Record<string, string> = {\n 'data-island': __key || 'unresolved',\n 'data-island-name': componentName,\n 'data-island-props': JSON.stringify(props),\n 'data-island-mount': mount,\n };\n\n if (mountOpts) {\n dataAttrs['data-island-opts'] = mountOpts;\n }\n\n return jsxFactory(\n 'div',\n {\n ...dataAttrs,\n ...(id ? { id } : {}),\n class: className ? `l5e-island ${className}` : 'l5e-island',\n },\n children,\n );\n}\n"],"names":["deriveComponentName","from","segments","filename","ClientIsland","attrs","props","mount","mountOpts","className","id","children","__key","__src","componentName","registerIsland","dataAttrs","jsxFactory"],"mappings":";AAOA,SAASA,EAAoBC,GAAsB;AACjD,QAAMC,IAAWD,EAAK,MAAM,GAAG;AAC/B,MAAIE,IAAWD,EAASA,EAAS,SAAS,CAAC;AAC3C,SAAAC,IAAWA,EAAS,QAAQ,kBAAkB,EAAE,GACzCA;AACT;AAiBO,SAASC,EAAaC,GAAmC;AAC9D,QAAM;AAAA,IACJ,MAAAJ;AAAA,IACA,OAAAK,IAAQ,CAAA;AAAA,IACR,OAAAC,IAAQ;AAAA,IACR,WAAAC;AAAA,IACA,OAAOC;AAAA,IACP,IAAAC;AAAA,IACA,UAAAC;AAAA,IACA,OAAAC;AAAA,IACA,OAAAC;AAAA,EAAA,IACER,GAEES,IAAgBd,EAAoBC,CAAI;AAI9C,EAAIW,KAASC,KACXE,EAAeH,GAAOC,GAAOC,CAAa;AAG5C,QAAME,IAAoC;AAAA,IACxC,eAAeJ,KAAS;AAAA,IACxB,oBAAoBE;AAAA,IACpB,qBAAqB,KAAK,UAAUR,CAAK;AAAA,IACzC,qBAAqBC;AAAA,EAAA;AAGvB,SAAIC,MACFQ,EAAU,kBAAkB,IAAIR,IAG3BS;AAAA,IACL;AAAA,IACA;AAAA,MACE,GAAGD;AAAA,MACH,GAAIN,IAAK,EAAE,IAAAA,EAAA,IAAO,CAAA;AAAA,MAClB,OAAOD,IAAY,cAAcA,CAAS,KAAK;AAAA,IAAA;AAAA,IAEjDE;AAAA,EAAA;AAEJ;"}
1
+ {"version":3,"file":"island.js","sources":["../src/island/ClientIsland.ts"],"sourcesContent":["import {\n jsxFactory,\n registerIsland,\n registerSsrIsland,\n type JSXChild,\n type JSXNode,\n} from '../core/jsx-runtime';\n\n/**\n * Derive component name from `from` path.\n * \"./react/Counter\" → \"Counter\"\n * \"~/features/newsfeed/react/NewsfeedApp\" → \"NewsfeedApp\"\n */\nfunction deriveComponentName(from: string): string {\n const segments = from.split('/');\n let filename = segments[segments.length - 1];\n filename = filename.replace(/\\.(tsx?|jsx?)$/, '');\n return filename;\n}\nexport type MountStrategy = 'load' | 'idle' | 'visible' | 'media' | 'none';\nexport interface ClientIslandProps {\n from: string;\n props?: Record<string, any>;\n mount?: MountStrategy | string;\n mountOpts?: string;\n class?: string;\n id?: string;\n children?: JSXChild | JSXChild[];\n\n /**\n * Opt-in: server-render the component into the placeholder and hydrate on the\n * client (instead of the default client-only mount). Component must be\n * SSR-safe (no top-level browser access) and props must be JSON-serializable.\n */\n ssr?: boolean;\n\n /** INTERNAL — injected by vite-plugin. Format: \"[name]_[hash]\" */\n __key?: string;\n /** INTERNAL — injected by vite-plugin. Manifest-compatible source path with extension */\n __src?: string;\n}\n\nexport function ClientIsland(attrs: ClientIslandProps): JSXNode {\n const {\n from,\n props = {},\n mount = 'load',\n mountOpts,\n class: className,\n id,\n children,\n ssr,\n __key,\n __src,\n } = attrs;\n\n const componentName = deriveComponentName(from);\n\n // Register island in render context (like useClientJs)\n // server.ts will use this to generate per-page window.__L5E_ISLANDS__\n // (needed for BOTH client-only mount AND ssr hydration — the client still\n // loads the component chunk via this registry).\n if (__key && __src) {\n registerIsland(__key, __src, componentName);\n }\n\n const dataAttrs: Record<string, string> = {\n 'data-island': __key || 'unresolved',\n 'data-island-name': componentName,\n 'data-island-props': JSON.stringify(props),\n 'data-island-mount': mount,\n };\n\n if (mountOpts) {\n dataAttrs['data-island-opts'] = mountOpts;\n }\n\n // SSR opt-in: register a pending server render and embed a unique token as the\n // placeholder body. entry-server replaces the token with renderToString() output\n // after the synchronous render pass, then normalizes data-island-ssr to \"1\".\n // The attribute value holds the token so the post-pass can target this exact\n // island (and strip the attribute on render failure → clean client-only fallback).\n if (ssr && __src) {\n const token = registerSsrIsland(__src, componentName, props);\n if (token) {\n return jsxFactory('div', {\n ...dataAttrs,\n 'data-island-ssr': token,\n ...(id ? { id } : {}),\n class: className ? `l5e-island ${className}` : 'l5e-island',\n // Raw token comment as body; replaced with SSR HTML in entry-server.\n setHtml: `<!--${token}-->`,\n });\n }\n }\n\n return jsxFactory(\n 'div',\n {\n ...dataAttrs,\n ...(id ? { id } : {}),\n class: className ? `l5e-island ${className}` : 'l5e-island',\n },\n children,\n );\n}\n"],"names":["deriveComponentName","from","segments","filename","ClientIsland","attrs","props","mount","mountOpts","className","id","children","ssr","__key","__src","componentName","registerIsland","dataAttrs","token","registerSsrIsland","jsxFactory"],"mappings":";AAaA,SAASA,EAAoBC,GAAsB;AACjD,QAAMC,IAAWD,EAAK,MAAM,GAAG;AAC/B,MAAIE,IAAWD,EAASA,EAAS,SAAS,CAAC;AAC3C,SAAAC,IAAWA,EAAS,QAAQ,kBAAkB,EAAE,GACzCA;AACT;AAwBO,SAASC,EAAaC,GAAmC;AAC9D,QAAM;AAAA,IACJ,MAAAJ;AAAA,IACA,OAAAK,IAAQ,CAAA;AAAA,IACR,OAAAC,IAAQ;AAAA,IACR,WAAAC;AAAA,IACA,OAAOC;AAAA,IACP,IAAAC;AAAA,IACA,UAAAC;AAAA,IACA,KAAAC;AAAA,IACA,OAAAC;AAAA,IACA,OAAAC;AAAA,EAAA,IACET,GAEEU,IAAgBf,EAAoBC,CAAI;AAM9C,EAAIY,KAASC,KACXE,EAAeH,GAAOC,GAAOC,CAAa;AAG5C,QAAME,IAAoC;AAAA,IACxC,eAAeJ,KAAS;AAAA,IACxB,oBAAoBE;AAAA,IACpB,qBAAqB,KAAK,UAAUT,CAAK;AAAA,IACzC,qBAAqBC;AAAA,EAAA;AAYvB,MATIC,MACFS,EAAU,kBAAkB,IAAIT,IAQ9BI,KAAOE,GAAO;AAChB,UAAMI,IAAQC,EAAkBL,GAAOC,GAAeT,CAAK;AAC3D,QAAIY;AACF,aAAOE,EAAW,OAAO;AAAA,QACvB,GAAGH;AAAA,QACH,mBAAmBC;AAAA,QACnB,GAAIR,IAAK,EAAE,IAAAA,EAAA,IAAO,CAAA;AAAA,QAClB,OAAOD,IAAY,cAAcA,CAAS,KAAK;AAAA;AAAA,QAE/C,SAAS,OAAOS,CAAK;AAAA,MAAA,CACtB;AAAA,EAEL;AAEA,SAAOE;AAAA,IACL;AAAA,IACA;AAAA,MACE,GAAGH;AAAA,MACH,GAAIP,IAAK,EAAE,IAAAA,EAAA,IAAO,CAAA;AAAA,MAClB,OAAOD,IAAY,cAAcA,CAAS,KAAK;AAAA,IAAA;AAAA,IAEjDE;AAAA,EAAA;AAEJ;"}
@@ -1,5 +1,5 @@
1
1
  import { AsyncLocalStorage as a } from "async_hooks";
2
- const n = {
2
+ const i = {
3
3
  CRITICAL: 0,
4
4
  // charset, viewport - must be first
5
5
  HIGH: 10,
@@ -102,12 +102,13 @@ function w({
102
102
  }) {
103
103
  return e.setHtml !== void 0 ? { [c]: !0, content: e.setHtml?.toString() || "" } : t;
104
104
  }
105
- const r = new a();
105
+ const s = new a();
106
106
  function u(t) {
107
107
  return {
108
108
  clientJsRegistry: [],
109
109
  cssRegistry: [],
110
110
  islandRegistry: [],
111
+ ssrIslands: [],
111
112
  cacheTags: /* @__PURE__ */ new Set(),
112
113
  headRegistry: [],
113
114
  metadataStack: [],
@@ -117,91 +118,101 @@ function u(t) {
117
118
  }
118
119
  function y(t) {
119
120
  if (typeof t == "string" && t.length > 0) {
120
- const e = r.getStore();
121
+ const e = s.getStore();
121
122
  e && e.clientJsRegistry.push({ path: t, from: "Unknown" });
122
123
  }
123
124
  return "";
124
125
  }
125
126
  function S(t, e, o) {
126
- const s = r.getStore();
127
- s && (s.islandRegistry.some((i) => i.key === t) || s.islandRegistry.push({ key: t, src: e, name: o }));
127
+ const r = s.getStore();
128
+ r && (r.islandRegistry.some((n) => n.key === t) || r.islandRegistry.push({ key: t, src: e, name: o }));
128
129
  }
129
130
  function v() {
130
- const t = r.getStore();
131
+ const t = s.getStore();
131
132
  return t ? t.islandRegistry.slice() : [];
132
133
  }
133
- function L(t) {
134
+ function L(t, e, o) {
135
+ const r = s.getStore();
136
+ if (!r) return "";
137
+ const n = `__L5E_SSR_${r.ssrIslands.length}__`;
138
+ return r.ssrIslands.push({ token: n, src: t, name: e, props: o }), n;
139
+ }
140
+ function R() {
141
+ const t = s.getStore();
142
+ return t ? t.ssrIslands.slice() : [];
143
+ }
144
+ function k(t) {
134
145
  if (typeof t == "string" && t.length > 0) {
135
- const e = r.getStore();
146
+ const e = s.getStore();
136
147
  e && e.cssRegistry.push({ path: t, from: "Unknown" });
137
148
  }
138
149
  return "";
139
150
  }
140
- function R(t, e, o) {
141
- const s = u(e);
142
- return o && (s.viewName = o), r.run(s, () => Promise.resolve(t()));
151
+ function b(t, e, o) {
152
+ const r = u(e);
153
+ return o && (r.viewName = o), s.run(r, () => Promise.resolve(t()));
143
154
  }
144
- function k(t) {
145
- const e = r.getStore();
155
+ function h(t) {
156
+ const e = s.getStore();
146
157
  e && (e.viewName = t);
147
158
  }
148
- function b() {
149
- const t = r.getStore();
159
+ function x() {
160
+ const t = s.getStore();
150
161
  return t ? t.clientJsRegistry.slice() : [];
151
162
  }
152
- function G() {
153
- const t = r.getStore();
163
+ function C() {
164
+ const t = s.getStore();
154
165
  return t ? Array.from(t.cacheTags) : [];
155
166
  }
156
167
  function p(t) {
157
- const e = r.getStore();
168
+ const e = s.getStore();
158
169
  e && (Array.isArray(t) ? t.forEach((o) => {
159
170
  typeof o == "string" && o.trim() && e.cacheTags.add(o.trim());
160
- }) : typeof t == "string" && t.trim() ? e.cacheTags.add(t.trim()) : typeof t == "object" && t !== null && Object.entries(t).forEach(([o, s]) => {
161
- s && typeof o == "string" && o.trim() && e.cacheTags.add(o.trim());
171
+ }) : typeof t == "string" && t.trim() ? e.cacheTags.add(t.trim()) : typeof t == "object" && t !== null && Object.entries(t).forEach(([o, r]) => {
172
+ r && typeof o == "string" && o.trim() && e.cacheTags.add(o.trim());
162
173
  }));
163
174
  }
164
- function h() {
165
- const t = r.getStore();
175
+ function G() {
176
+ const t = s.getStore();
166
177
  return t ? t.cssRegistry.slice() : [];
167
178
  }
168
- function x({
179
+ function l({
169
180
  children: t,
170
- priority: e = n.LOW
181
+ priority: e = i.LOW
171
182
  // Default priority
172
183
  }) {
173
- const o = r.getStore();
184
+ const o = s.getStore();
174
185
  return o && t && (o.headRegistry.push({
175
186
  content: t,
176
- priority: typeof e == "number" ? e : n.LOW,
187
+ priority: typeof e == "number" ? e : i.LOW,
177
188
  source: "manual"
178
- }), o.headRegistry.sort((s, i) => s.priority - i.priority)), null;
189
+ }), o.headRegistry.sort((r, n) => r.priority - n.priority)), null;
179
190
  }
180
- function C() {
181
- const t = r.getStore();
191
+ function I() {
192
+ const t = s.getStore();
182
193
  return t ? t.headRegistry.map((e) => e.content) : [];
183
194
  }
184
195
  function T(t) {
185
- const e = r.getStore();
196
+ const e = s.getStore();
186
197
  e && t && e.metadataStack.push(t);
187
198
  }
188
199
  function E() {
189
- const t = r.getStore();
200
+ const t = s.getStore();
190
201
  return !t || t.metadataStack.length === 0 ? null : t.metadataStack.reduce(
191
202
  (e, o) => f(e, o),
192
203
  null
193
204
  );
194
205
  }
195
206
  function D(t) {
196
- const e = r.getStore();
207
+ const e = s.getStore();
197
208
  e && (Array.isArray(t) ? e.schemaRegistry.push(...t) : e.schemaRegistry.push(t));
198
209
  }
199
210
  function A() {
200
- const t = r.getStore();
211
+ const t = s.getStore();
201
212
  return t ? t.schemaRegistry.slice() : [];
202
213
  }
203
- function H() {
204
- const t = r.getStore();
214
+ function d() {
215
+ const t = s.getStore();
205
216
  if (!t)
206
217
  throw new Error("useRequest called outside of render context");
207
218
  return {
@@ -217,41 +228,43 @@ function H() {
217
228
  getCacheTags: () => Array.from(t.cacheTags)
218
229
  };
219
230
  }
220
- function I(t) {
231
+ function H(t) {
221
232
  return t !== null && typeof t == "object" && "type" in t && "props" in t && "children" in t && (typeof t.type == "string" || typeof t.type == "function");
222
233
  }
223
234
  function j(t, e, ...o) {
224
- const s = { ...t.props, ...e }, i = o.length > 0 ? o.flat() : t.children;
235
+ const r = { ...t.props, ...e }, n = o.length > 0 ? o.flat() : t.children;
225
236
  return {
226
237
  type: t.type,
227
- props: s,
228
- children: i
238
+ props: r,
239
+ children: n
229
240
  };
230
241
  }
231
242
  export {
232
243
  w as F,
233
- n as H,
244
+ i as H,
234
245
  c as R,
235
- x as a,
246
+ l as a,
236
247
  p as b,
237
248
  j as c,
238
- b as d,
239
- h as e,
240
- C as f,
241
- G as g,
249
+ x as d,
250
+ G as e,
251
+ I as f,
252
+ C as g,
242
253
  v as h,
243
254
  A as i,
244
- I as j,
245
- m as k,
246
- D as l,
255
+ R as j,
256
+ H as k,
257
+ m as l,
247
258
  f as m,
248
- E as n,
249
- R as o,
259
+ D as n,
260
+ L as o,
250
261
  T as p,
251
- L as q,
262
+ E as q,
252
263
  S as r,
253
- k as s,
254
- H as t,
255
- y as u
264
+ b as s,
265
+ h as t,
266
+ y as u,
267
+ k as v,
268
+ d as w
256
269
  };
257
- //# sourceMappingURL=jsx-runtime-DVQ9eOji.js.map
270
+ //# sourceMappingURL=jsx-runtime-Bokflh8Q.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsx-runtime-Bokflh8Q.js","sources":["../src/core/head-priority.ts","../src/seo/mergeMetadata.ts","../src/core/const.ts","../src/core/jsx-runtime.ts"],"sourcesContent":["/**\n * Priority constants for Head component rendering order\n * Lower numbers render first (higher priority)\n */\nexport const HEAD_PRIORITY = {\n CRITICAL: 0, // charset, viewport - must be first\n HIGH: 10, // title, description, canonical\n MEDIUM: 50, // meta tags, robots\n SEO: 80, // OpenGraph, Twitter\n LOW: 100, // Custom head elements\n SCRIPTS: 200, // Scripts\n STYLES: 300, // Styles\n} as const;\n\nexport type HeadPriority = (typeof HEAD_PRIORITY)[keyof typeof HEAD_PRIORITY] | number;\n","import type { Metadata } from './types';\n\n/**\n * Merges parent and child metadata objects\n * Follows Next.js shallow merge pattern with deep merge for nested objects\n *\n * @param parent - Parent metadata (from layout/global loader)\n * @param child - Child metadata (from page/view loader)\n * @returns Merged metadata object\n */\nexport function mergeMetadata(\n parent: Metadata | null | undefined,\n child: Metadata | null | undefined,\n): Metadata {\n // If no parent, return child (or empty object)\n if (!parent) {\n return child || {};\n }\n\n // If no child, return parent\n if (!child) {\n return parent;\n }\n\n // Shallow merge base properties (child overrides parent)\n const merged: Metadata = {\n ...parent,\n ...child,\n };\n\n // Deep merge for nested objects\n // OpenGraph: merge nested properties\n if (child.openGraph || parent.openGraph) {\n if (child.openGraph && parent.openGraph) {\n merged.openGraph = {\n ...parent.openGraph,\n ...child.openGraph,\n // Deep merge for nested arrays/objects in openGraph\n images: child.openGraph.images ?? parent.openGraph.images,\n videos: child.openGraph.videos ?? parent.openGraph.videos,\n audio: child.openGraph.audio ?? parent.openGraph.audio,\n alternateLocale: child.openGraph.alternateLocale ?? parent.openGraph.alternateLocale,\n authors: child.openGraph.authors ?? parent.openGraph.authors,\n tags: child.openGraph.tags ?? parent.openGraph.tags,\n };\n } else {\n merged.openGraph = child.openGraph || parent.openGraph;\n }\n }\n\n // Twitter: merge nested properties\n if (child.twitter || parent.twitter) {\n if (child.twitter && parent.twitter) {\n merged.twitter = {\n ...parent.twitter,\n ...child.twitter,\n // Deep merge for nested objects\n images: child.twitter.images ?? parent.twitter.images,\n app: child.twitter.app\n ? {\n ...parent.twitter.app,\n ...child.twitter.app,\n id: {\n ...parent.twitter.app?.id,\n ...child.twitter.app.id,\n },\n url: {\n ...parent.twitter.app?.url,\n ...child.twitter.app.url,\n },\n }\n : parent.twitter.app,\n };\n } else {\n merged.twitter = child.twitter || parent.twitter;\n }\n }\n\n // Icons: merge nested properties\n if (child.icons || parent.icons) {\n if (child.icons && parent.icons) {\n merged.icons = {\n icon: child.icons.icon ?? parent.icons.icon,\n shortcut: child.icons.shortcut ?? parent.icons.shortcut,\n apple: child.icons.apple ?? parent.icons.apple,\n other: child.icons.other ?? parent.icons.other,\n };\n } else {\n merged.icons = child.icons || parent.icons;\n }\n }\n\n // Verification: merge nested properties\n if (child.verification || parent.verification) {\n if (child.verification && parent.verification) {\n merged.verification = {\n ...parent.verification,\n ...child.verification,\n // Deep merge for other verification tags\n other: child.verification.other\n ? {\n ...parent.verification.other,\n ...child.verification.other,\n }\n : parent.verification.other,\n me: child.verification.me ?? parent.verification.me,\n };\n } else {\n merged.verification = child.verification || parent.verification;\n }\n }\n\n // AppLinks: merge nested properties\n if (child.appLinks || parent.appLinks) {\n if (child.appLinks && parent.appLinks) {\n merged.appLinks = {\n ios: child.appLinks.ios\n ? {\n ...parent.appLinks.ios,\n ...child.appLinks.ios,\n }\n : parent.appLinks.ios,\n android: child.appLinks.android\n ? {\n ...parent.appLinks.android,\n ...child.appLinks.android,\n }\n : parent.appLinks.android,\n web: child.appLinks.web\n ? {\n ...parent.appLinks.web,\n ...child.appLinks.web,\n }\n : parent.appLinks.web,\n };\n } else {\n merged.appLinks = child.appLinks || parent.appLinks;\n }\n }\n\n // FormatDetection: merge nested properties\n if (child.formatDetection || parent.formatDetection) {\n if (child.formatDetection && parent.formatDetection) {\n merged.formatDetection = {\n ...parent.formatDetection,\n ...child.formatDetection,\n };\n } else {\n merged.formatDetection = child.formatDetection || parent.formatDetection;\n }\n }\n\n // Viewport: merge if both are objects\n if (child.viewport && parent.viewport) {\n if (typeof child.viewport === 'object' && typeof parent.viewport === 'object') {\n merged.viewport = {\n ...parent.viewport,\n ...child.viewport,\n } as Metadata['viewport'];\n } else {\n // If either is string, child overrides\n merged.viewport = child.viewport;\n }\n }\n\n // Robots: merge if both are objects\n if (child.robots && parent.robots) {\n if (typeof child.robots === 'object' && typeof parent.robots === 'object') {\n merged.robots = {\n ...parent.robots,\n ...child.robots,\n } as Metadata['robots'];\n } else {\n // If either is string, child overrides\n merged.robots = child.robots;\n }\n }\n\n // Array fields: child overrides parent (shallow merge behavior)\n // These are already handled by spread operator above\n // But we explicitly handle them for clarity:\n merged.keywords = child.keywords ?? parent.keywords;\n merged.themeColor = child.themeColor ?? parent.themeColor;\n merged.archives = child.archives ?? parent.archives;\n merged.assets = child.assets ?? parent.assets;\n\n // Other: merge objects\n if (child.other || parent.other) {\n if (child.other && parent.other) {\n merged.other = {\n ...parent.other,\n ...child.other,\n };\n } else {\n merged.other = child.other || parent.other;\n }\n }\n\n return merged;\n}\n","// Marker object để đánh dấu raw HTML không escape\nexport const RAW_HTML_MARKER = Symbol('rawHtml');\n","import { mergeMetadata } from '../seo/mergeMetadata';\nimport type { Metadata } from '../seo/types';\nimport { RAW_HTML_MARKER } from './const';\nimport { RequestInfo } from './entry-server';\nimport { HEAD_PRIORITY, type HeadPriority } from './head-priority';\n\nexport type JSXChild =\n | string\n | number\n | boolean\n | null\n | undefined\n | JSXNode\n | JSXChild[]\n | RawHtmlObject\n | HtmlContentObject;\n\nexport type RawHtmlObject = {\n [RAW_HTML_MARKER]: true;\n content: string;\n};\n\nexport type HtmlContentObject = {\n htmlContent: string;\n};\n\nexport type RenderedNode = {\n string: string;\n};\n\nexport type JSXNode = {\n type: string | ((props: any) => JSXChild);\n props: Record<string, any>;\n children: JSXChild[];\n};\n\nexport function jsxFactory(type: any, props: any, ...children: any): JSXNode {\n return { type, props: props || {}, children: children.flat() };\n}\n\nexport function Fragment({\n children,\n ...props\n}: { children?: JSXChild; setHtml?: unknown } & Record<string, any>): JSXChild {\n // Hỗ trợ setHtml cho Fragment\n if (props.setHtml !== undefined) {\n // Trả về object đặc biệt để không bị escape\n return { [RAW_HTML_MARKER]: true, content: props.setHtml?.toString() || '' };\n }\n return children;\n}\n\n// AsyncLocalStorage for render context (request-level)\nimport { AsyncLocalStorage } from 'async_hooks';\n\ninterface HeadEntry {\n content: JSXChild;\n priority: number; // Số càng nhỏ, render càng sớm\n source?: string; // Để debug (ví dụ: 'layout', 'page', 'seo')\n}\n\ninterface IslandEntry {\n key: string; // \"Counter_a3f2\" — registry key\n src: string; // \"src/views/.../Counter.tsx\" — manifest-compatible path\n name: string; // \"Counter\" — export name\n}\n\n/**\n * A pending server-side render request for an `ssr` island.\n * Collected during the synchronous render pass and filled in afterwards by\n * entry-server (which can `await import()` the component + call renderToString).\n */\ninterface SsrIslandEntry {\n token: string; // unique placeholder token embedded in the HTML body\n src: string; // \"src/views/.../Counter.tsx\" — manifest-compatible path (no leading slash)\n name: string; // \"Counter\" — export name\n props: Record<string, any>;\n}\n\ninterface RenderContext {\n clientJsRegistry: Array<{ path: string; from: string }>;\n cssRegistry: Array<{ path: string; from: string }>;\n islandRegistry: IslandEntry[];\n ssrIslands: SsrIslandEntry[];\n cacheTags: Set<string>;\n headRegistry: HeadEntry[]; // Thay vì JSXChild[]\n metadataStack: Metadata[]; // Stack để track metadata hierarchy\n schemaRegistry: Array<Record<string, any>>; // Schema.org structured data từ loaders\n request: RequestInfo;\n viewName?: string; // View name from route handler\n}\n\nconst renderStore = new AsyncLocalStorage<RenderContext>();\n\n// Create context for each request\nfunction createRequestContext(requestInfo: RequestInfo): RenderContext {\n return {\n clientJsRegistry: [],\n cssRegistry: [],\n islandRegistry: [],\n ssrIslands: [],\n cacheTags: new Set(),\n headRegistry: [],\n metadataStack: [],\n schemaRegistry: [],\n request: requestInfo,\n };\n}\n\nexport function useClientJs(path: string): string {\n if (typeof path === 'string' && path.length > 0) {\n const renderContext = renderStore.getStore();\n if (renderContext) {\n renderContext.clientJsRegistry.push({ path, from: 'Unknown' });\n }\n }\n return '';\n}\n\nexport function registerIsland(key: string, src: string, name: string): void {\n const renderContext = renderStore.getStore();\n if (renderContext) {\n // Dedupe by key\n if (!renderContext.islandRegistry.some((e) => e.key === key)) {\n renderContext.islandRegistry.push({ key, src, name });\n }\n }\n}\n\nexport function getIslandEntries(): IslandEntry[] {\n const context = renderStore.getStore();\n if (!context) return [];\n return context.islandRegistry.slice();\n}\n\n/**\n * Register a pending SSR island render. Returns a unique placeholder token that\n * the caller embeds (as raw HTML) in the island's body. entry-server replaces\n * the token with the server-rendered component HTML after the sync render pass.\n */\nexport function registerSsrIsland(src: string, name: string, props: Record<string, any>): string {\n const renderContext = renderStore.getStore();\n if (!renderContext) return '';\n const token = `__L5E_SSR_${renderContext.ssrIslands.length}__`;\n renderContext.ssrIslands.push({ token, src, name, props });\n return token;\n}\n\nexport function getSsrIslands(): SsrIslandEntry[] {\n const context = renderStore.getStore();\n if (!context) return [];\n return context.ssrIslands.slice();\n}\n\nexport function useCss(path: string): string {\n if (typeof path === 'string' && path.length > 0) {\n const renderContext = renderStore.getStore();\n if (renderContext) {\n renderContext.cssRegistry.push({ path, from: 'Unknown' });\n }\n }\n return '';\n}\n\n// Wrapper to run render in async context\nexport function runInRenderContext<T>(\n renderFn: () => T | Promise<T>,\n requestInfo: RequestInfo,\n viewName?: string,\n): Promise<T> {\n const context = createRequestContext(requestInfo);\n if (viewName) {\n context.viewName = viewName;\n }\n return renderStore.run(context, () => Promise.resolve(renderFn()));\n}\n\n// Set view name in current render context\nexport function setViewName(viewName: string): void {\n const context = renderStore.getStore();\n if (context) {\n context.viewName = viewName;\n }\n}\n\n// Get entries from current context\nexport function getClientJsEntries(): Array<{ path: string; from: string }> {\n const context = renderStore.getStore();\n if (!context) return [];\n return context.clientJsRegistry.slice();\n}\n\n// Get cache tags from current context\nexport function getCacheTags(): string[] {\n const context = renderStore.getStore();\n if (!context) return [];\n return Array.from(context.cacheTags);\n}\n\n// Add cache tags to current context\nexport function addCacheTag(tag: string | string[] | Record<string, boolean>): void {\n const context = renderStore.getStore();\n if (!context) return;\n\n if (Array.isArray(tag)) {\n tag.forEach((t) => {\n if (typeof t === 'string' && t.trim()) {\n context.cacheTags.add(t.trim());\n }\n });\n } else if (typeof tag === 'string' && tag.trim()) {\n context.cacheTags.add(tag.trim());\n } else if (typeof tag === 'object' && tag !== null) {\n Object.entries(tag).forEach(([key, value]) => {\n if (value && typeof key === 'string' && key.trim()) {\n context.cacheTags.add(key.trim());\n }\n });\n }\n}\n\n// Get CSS entries from current context\nexport function getCssEntries(): Array<{ path: string; from: string }> {\n const context = renderStore.getStore();\n if (!context) return [];\n return context.cssRegistry.slice();\n}\n\n// Head component to collect head elements with priority support\nexport function Head({\n children,\n priority = HEAD_PRIORITY.LOW, // Default priority\n}: {\n children?: JSXChild;\n priority?: HeadPriority;\n}): null {\n const renderContext = renderStore.getStore();\n if (renderContext && children) {\n renderContext.headRegistry.push({\n content: children,\n priority: typeof priority === 'number' ? priority : HEAD_PRIORITY.LOW,\n source: 'manual',\n });\n\n // Sort theo priority sau mỗi lần push để đảm bảo thứ tự đúng\n renderContext.headRegistry.sort((a, b) => a.priority - b.priority);\n }\n return null;\n}\n\n// Get head content from current context (already sorted by priority)\nexport function getHeadContent(): JSXChild[] {\n const context = renderStore.getStore();\n if (!context) return [];\n // Đã được sort trong Head component, chỉ cần map để lấy content\n return context.headRegistry.map((entry) => entry.content);\n}\n\n// Push metadata to stack (for hierarchical metadata support)\nexport function pushMetadata(metadata: Metadata): void {\n const context = renderStore.getStore();\n if (context && metadata) {\n context.metadataStack.push(metadata);\n }\n}\n\n// Resolve and merge all metadata from stack (root → leaf)\nexport function resolveMetadata(): Metadata | null {\n const context = renderStore.getStore();\n if (!context || context.metadataStack.length === 0) {\n return null;\n }\n\n // Merge from root → leaf (reduce left to right)\n return context.metadataStack.reduce(\n (acc, current) => mergeMetadata(acc, current),\n null as Metadata | null,\n );\n}\n\n// Push schema to registry (for schema markup from loaders)\n// Accepts schema-dts types (WithContext<T> or array of schemas)\nexport function pushSchema(schema: any | Array<any>): void {\n const context = renderStore.getStore();\n if (!context) return;\n\n if (Array.isArray(schema)) {\n context.schemaRegistry.push(...schema);\n } else {\n context.schemaRegistry.push(schema);\n }\n}\n\n// Get all schemas from registry\nexport function getSchemas(): Array<Record<string, any>> {\n const context = renderStore.getStore();\n if (!context) return [];\n return context.schemaRegistry.slice();\n}\n\n// Hook to get render request context\nexport function useRequest() {\n const context = renderStore.getStore();\n\n if (!context) {\n throw new Error('useRequest called outside of render context');\n }\n\n return {\n request: context.request,\n view: context.viewName,\n locals: (context.request.locals ?? {}) as Record<string, unknown>,\n params: (context.request.params ?? {}) as Record<string, any>,\n\n // Add cache tags\n addCacheTag: (tag: string | string[] | Record<string, boolean>) => {\n addCacheTag(tag);\n },\n\n // Get all cache tags\n getCacheTags: () => {\n return Array.from(context.cacheTags);\n },\n };\n}\n\n/**\n * Checks if a value is a valid JSX element (JSXNode)\n * Similar to React.isValidElement\n */\nexport function isValidElement(value: any): value is JSXNode {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'type' in value &&\n 'props' in value &&\n 'children' in value &&\n (typeof value.type === 'string' || typeof value.type === 'function')\n );\n}\n\n/**\n * Clones a JSX element with new props and/or children\n * Similar to React.cloneElement\n */\nexport function cloneElement(\n element: JSXNode,\n props?: Record<string, any>,\n ...children: JSXChild[]\n): JSXNode {\n const newProps = { ...element.props, ...props };\n const newChildren = children.length > 0 ? children.flat() : element.children;\n\n return {\n type: element.type,\n props: newProps,\n children: newChildren,\n };\n}\n"],"names":["HEAD_PRIORITY","mergeMetadata","parent","child","merged","RAW_HTML_MARKER","jsxFactory","type","props","children","Fragment","renderStore","AsyncLocalStorage","createRequestContext","requestInfo","useClientJs","path","renderContext","registerIsland","key","src","name","e","getIslandEntries","context","registerSsrIsland","token","getSsrIslands","useCss","runInRenderContext","renderFn","viewName","setViewName","getClientJsEntries","getCacheTags","addCacheTag","tag","t","value","getCssEntries","Head","priority","a","b","getHeadContent","entry","pushMetadata","metadata","resolveMetadata","acc","current","pushSchema","schema","getSchemas","useRequest","isValidElement","cloneElement","element","newProps","newChildren"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { F as t, a as n, b as r, c as d, g, d as i, e as l, f as o, h as m, i as u, j as C, k as c, p as h, l as p, r as E, n as x, o as F, s as I, u as f, q as j, t as q } from "./jsx-runtime-DVQ9eOji.js";
1
+ import { F as t, a as n, b as r, c as d, g, d as i, e as l, f as o, h as m, i as u, j as C, k as c, l as h, p, n as E, r as I, o as S, q as x, s as F, t as f, u as j, v as q, w as v } from "./jsx-runtime-Bokflh8Q.js";
2
2
  import "async_hooks";
3
3
  export {
4
4
  t as Fragment,
@@ -11,16 +11,18 @@ export {
11
11
  o as getHeadContent,
12
12
  m as getIslandEntries,
13
13
  u as getSchemas,
14
- C as isValidElement,
15
- c as jsxFactory,
16
- h as pushMetadata,
17
- p as pushSchema,
18
- E as registerIsland,
14
+ C as getSsrIslands,
15
+ c as isValidElement,
16
+ h as jsxFactory,
17
+ p as pushMetadata,
18
+ E as pushSchema,
19
+ I as registerIsland,
20
+ S as registerSsrIsland,
19
21
  x as resolveMetadata,
20
22
  F as runInRenderContext,
21
- I as setViewName,
22
- f as useClientJs,
23
- j as useCss,
24
- q as useRequest
23
+ f as setViewName,
24
+ j as useClientJs,
25
+ q as useCss,
26
+ v as useRequest
25
27
  };
26
28
  //# sourceMappingURL=jsx-runtime.js.map
@@ -1,4 +1,4 @@
1
- import { R as q, b as x } from "./jsx-runtime-DVQ9eOji.js";
1
+ import { R as q, b as x } from "./jsx-runtime-Bokflh8Q.js";
2
2
  function K(r) {
3
3
  return r && r.__esModule && Object.prototype.hasOwnProperty.call(r, "default") ? r.default : r;
4
4
  }
@@ -199,4 +199,4 @@ export {
199
199
  ir as r,
200
200
  nr as s
201
201
  };
202
- //# sourceMappingURL=render-BF7iTagJ.js.map
202
+ //# sourceMappingURL=render-DTXfJu0d.js.map