@elurjs/kit 2.4.10 → 2.5.1

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 (188) hide show
  1. package/CHANGELOG.md +313 -0
  2. package/README.md +248 -15
  3. package/dist/lib/action/index.cjs +1 -1
  4. package/dist/lib/action/index.js +1 -1
  5. package/dist/lib/{action-DZHihU3Z.cjs → action-BiE4tEty.cjs} +2 -2
  6. package/dist/lib/{action-DZHihU3Z.cjs.map → action-BiE4tEty.cjs.map} +1 -1
  7. package/dist/lib/{action-BB6N5yD-.js → action-CXVk8rWt.js} +3 -3
  8. package/dist/lib/{action-BB6N5yD-.js.map → action-CXVk8rWt.js.map} +1 -1
  9. package/dist/lib/adapter-DNsjXvq5.js +160 -0
  10. package/dist/lib/adapter-DNsjXvq5.js.map +1 -0
  11. package/dist/lib/adapter-Dz2hzR36.cjs +3 -0
  12. package/dist/lib/adapter-Dz2hzR36.cjs.map +1 -0
  13. package/dist/lib/adapters/bun.cjs +2 -2
  14. package/dist/lib/adapters/bun.cjs.map +1 -1
  15. package/dist/lib/adapters/bun.js +17 -9
  16. package/dist/lib/adapters/bun.js.map +1 -1
  17. package/dist/lib/adapters/index.d.cts +34 -0
  18. package/dist/lib/adapters/index.d.ts +34 -0
  19. package/dist/lib/adapters/netlify.cjs +1 -1
  20. package/dist/lib/adapters/netlify.js +7 -7
  21. package/dist/lib/adapters/node.cjs +5 -5
  22. package/dist/lib/adapters/node.cjs.map +1 -1
  23. package/dist/lib/adapters/node.js +20 -12
  24. package/dist/lib/adapters/node.js.map +1 -1
  25. package/dist/lib/adapters/vercel.cjs +1 -1
  26. package/dist/lib/adapters/vercel.js +8 -8
  27. package/dist/lib/build/build.d.cts +40 -0
  28. package/dist/lib/build/build.d.ts +40 -0
  29. package/dist/lib/build/document-shell.d.cts +47 -1
  30. package/dist/lib/build/document-shell.d.ts +47 -1
  31. package/dist/lib/build/vite-build.d.cts +25 -2
  32. package/dist/lib/build/vite-build.d.ts +25 -2
  33. package/dist/lib/cache/adapter.d.cts +41 -0
  34. package/dist/lib/cache/adapter.d.ts +41 -0
  35. package/dist/lib/cache/index.cjs +2 -0
  36. package/dist/lib/cache/index.cjs.map +1 -0
  37. package/dist/lib/cache/index.d.cts +5 -0
  38. package/dist/lib/cache/index.d.ts +5 -0
  39. package/dist/lib/cache/index.js +113 -0
  40. package/dist/lib/cache/index.js.map +1 -0
  41. package/dist/lib/cache/invalidation.d.cts +36 -0
  42. package/dist/lib/cache/invalidation.d.ts +36 -0
  43. package/dist/lib/cache/redis-adapter.d.cts +49 -0
  44. package/dist/lib/cache/redis-adapter.d.ts +49 -0
  45. package/dist/lib/cache-DGhTYyqh.js +50 -0
  46. package/dist/lib/cache-DGhTYyqh.js.map +1 -0
  47. package/dist/lib/cache-X1n4Ossu.cjs +2 -0
  48. package/dist/lib/cache-X1n4Ossu.cjs.map +1 -0
  49. package/dist/lib/cli/output.d.cts +58 -0
  50. package/dist/lib/cli/output.d.ts +58 -0
  51. package/dist/lib/cli/ports.d.cts +20 -0
  52. package/dist/lib/cli/ports.d.ts +20 -0
  53. package/dist/lib/cli.cjs +2559 -1488
  54. package/dist/lib/cli.cjs.map +1 -1
  55. package/dist/lib/cli.d.cts +21 -0
  56. package/dist/lib/cli.d.ts +21 -0
  57. package/dist/lib/cli.js +2558 -1488
  58. package/dist/lib/cli.js.map +1 -1
  59. package/dist/lib/config/index.cjs +1 -1
  60. package/dist/lib/config/index.cjs.map +1 -1
  61. package/dist/lib/config/index.d.cts +79 -0
  62. package/dist/lib/config/index.d.ts +79 -0
  63. package/dist/lib/config/index.js +21 -14
  64. package/dist/lib/config/index.js.map +1 -1
  65. package/dist/lib/{errors-ePYxDlhU.js → errors-j4cg9VN3.js} +24 -30
  66. package/dist/lib/{errors-ePYxDlhU.js.map → errors-j4cg9VN3.js.map} +1 -1
  67. package/dist/lib/errors-kSl9yLkg.cjs +2 -0
  68. package/dist/lib/{errors-0X7pCFNU.cjs.map → errors-kSl9yLkg.cjs.map} +1 -1
  69. package/dist/lib/hydrate-BSLuI0Nh.cjs +2 -0
  70. package/dist/lib/hydrate-BSLuI0Nh.cjs.map +1 -0
  71. package/dist/lib/hydrate-BaS7-d8C.js +133 -0
  72. package/dist/lib/hydrate-BaS7-d8C.js.map +1 -0
  73. package/dist/lib/idiomorph.esm-BOOTOg1r.cjs +2 -0
  74. package/dist/lib/idiomorph.esm-BOOTOg1r.cjs.map +1 -0
  75. package/dist/lib/idiomorph.esm-CXuY-EHB.js +371 -0
  76. package/dist/lib/idiomorph.esm-CXuY-EHB.js.map +1 -0
  77. package/dist/lib/index.cjs +1 -1
  78. package/dist/lib/index.cjs.map +1 -1
  79. package/dist/lib/index.d.cts +8 -6
  80. package/dist/lib/index.d.ts +8 -6
  81. package/dist/lib/index.js +1 -1
  82. package/dist/lib/index.js.map +1 -1
  83. package/dist/lib/interpolation-plugin-C0dTd69H.cjs +58 -0
  84. package/dist/lib/interpolation-plugin-C0dTd69H.cjs.map +1 -0
  85. package/dist/lib/{interpolation-plugin-Wgb1j4pT.js → interpolation-plugin-K2qE69tF.js} +95 -126
  86. package/dist/lib/interpolation-plugin-K2qE69tF.js.map +1 -0
  87. package/dist/lib/invalidation-CFpNQUv6.cjs +2 -0
  88. package/dist/lib/invalidation-CFpNQUv6.cjs.map +1 -0
  89. package/dist/lib/invalidation-DXhdE9wj.js +64 -0
  90. package/dist/lib/invalidation-DXhdE9wj.js.map +1 -0
  91. package/dist/lib/island/generate-entry.d.cts +40 -2
  92. package/dist/lib/island/generate-entry.d.ts +40 -2
  93. package/dist/lib/island/hydrate.d.cts +19 -6
  94. package/dist/lib/island/hydrate.d.ts +19 -6
  95. package/dist/lib/island/index.cjs +1 -1
  96. package/dist/lib/island/index.d.cts +2 -1
  97. package/dist/lib/island/index.d.ts +2 -1
  98. package/dist/lib/island/index.js +1 -1
  99. package/dist/lib/island/island.d.cts +15 -0
  100. package/dist/lib/island/island.d.ts +15 -0
  101. package/dist/lib/island-CTBnsOhI.js +59 -0
  102. package/dist/lib/island-CTBnsOhI.js.map +1 -0
  103. package/dist/lib/island-kfQEKRe_.cjs +2 -0
  104. package/dist/lib/island-kfQEKRe_.cjs.map +1 -0
  105. package/dist/lib/node-http-DVFcYeBS.js +723 -0
  106. package/dist/lib/node-http-DVFcYeBS.js.map +1 -0
  107. package/dist/lib/node-http-Uct7DhmN.cjs +13 -0
  108. package/dist/lib/node-http-Uct7DhmN.cjs.map +1 -0
  109. package/dist/lib/rolldown-runtime-BIInC43l.cjs +1 -0
  110. package/dist/lib/rolldown-runtime-Dy4uBu1J.js +11 -0
  111. package/dist/lib/router/client.cjs +1 -1
  112. package/dist/lib/router/client.cjs.map +1 -1
  113. package/dist/lib/router/client.d.cts +55 -8
  114. package/dist/lib/router/client.d.ts +55 -8
  115. package/dist/lib/router/client.js +298 -97
  116. package/dist/lib/router/client.js.map +1 -1
  117. package/dist/lib/router/redirects.d.cts +34 -0
  118. package/dist/lib/router/redirects.d.ts +34 -0
  119. package/dist/lib/runtime/handler.d.cts +59 -0
  120. package/dist/lib/runtime/handler.d.ts +59 -0
  121. package/dist/lib/runtime/index.cjs +1 -1
  122. package/dist/lib/runtime/index.d.cts +2 -1
  123. package/dist/lib/runtime/index.d.ts +2 -1
  124. package/dist/lib/runtime/index.js +4 -4
  125. package/dist/lib/runtime/logger.d.cts +47 -0
  126. package/dist/lib/runtime/logger.d.ts +47 -0
  127. package/dist/lib/runtime/node-http.d.cts +11 -1
  128. package/dist/lib/runtime/node-http.d.ts +11 -1
  129. package/dist/lib/runtime-ChE4flX3.cjs +2 -0
  130. package/dist/lib/runtime-ChE4flX3.cjs.map +1 -0
  131. package/dist/lib/runtime-OMyz5yE-.js +905 -0
  132. package/dist/lib/runtime-OMyz5yE-.js.map +1 -0
  133. package/dist/lib/seo/index.cjs +1 -10
  134. package/dist/lib/seo/index.d.cts +1 -0
  135. package/dist/lib/seo/index.d.ts +1 -0
  136. package/dist/lib/seo/index.js +2 -41
  137. package/dist/lib/seo/sitemap-from-routes.d.cts +24 -0
  138. package/dist/lib/seo/sitemap-from-routes.d.ts +24 -0
  139. package/dist/lib/{shared-CfqOLsKj.cjs → shared-CP0Dc3cp.cjs} +72 -47
  140. package/dist/lib/shared-CP0Dc3cp.cjs.map +1 -0
  141. package/dist/lib/{shared-DU3iQgr7.js → shared-D8w-neq2.js} +87 -58
  142. package/dist/lib/shared-D8w-neq2.js.map +1 -0
  143. package/dist/lib/sitemap-from-routes-CaBoiGvE.js +77 -0
  144. package/dist/lib/sitemap-from-routes-CaBoiGvE.js.map +1 -0
  145. package/dist/lib/sitemap-from-routes-DbcLLL4G.cjs +13 -0
  146. package/dist/lib/sitemap-from-routes-DbcLLL4G.cjs.map +1 -0
  147. package/dist/lib/ssr/render.d.cts +8 -2
  148. package/dist/lib/ssr/render.d.ts +8 -2
  149. package/dist/lib/ssr/server.d.cts +7 -0
  150. package/dist/lib/ssr/server.d.ts +7 -0
  151. package/dist/lib/ssr/stream-response.d.cts +30 -0
  152. package/dist/lib/ssr/stream-response.d.ts +30 -0
  153. package/dist/lib/ssr/stream.d.cts +16 -1
  154. package/dist/lib/ssr/stream.d.ts +16 -1
  155. package/dist/lib/{stream-DmZjYqHm.cjs → stream-Cg-xYG82.cjs} +3 -3
  156. package/dist/lib/stream-Cg-xYG82.cjs.map +1 -0
  157. package/dist/lib/stream-D-ytogdu.js +106 -0
  158. package/dist/lib/stream-D-ytogdu.js.map +1 -0
  159. package/dist/lib/vite/index.cjs +1 -1
  160. package/dist/lib/vite/index.cjs.map +1 -1
  161. package/dist/lib/vite/index.d.cts +11 -0
  162. package/dist/lib/vite/index.d.ts +11 -0
  163. package/dist/lib/vite/index.js +101 -94
  164. package/dist/lib/vite/index.js.map +1 -1
  165. package/package.json +25 -8
  166. package/dist/lib/errors-0X7pCFNU.cjs +0 -2
  167. package/dist/lib/hydrate-CJbUWdXu.js +0 -126
  168. package/dist/lib/hydrate-CJbUWdXu.js.map +0 -1
  169. package/dist/lib/hydrate-D6MR24mz.cjs +0 -2
  170. package/dist/lib/hydrate-D6MR24mz.cjs.map +0 -1
  171. package/dist/lib/interpolation-plugin-TWDch8nn.cjs +0 -39
  172. package/dist/lib/interpolation-plugin-TWDch8nn.cjs.map +0 -1
  173. package/dist/lib/interpolation-plugin-Wgb1j4pT.js.map +0 -1
  174. package/dist/lib/node-http-DRAUhO0c.js +0 -617
  175. package/dist/lib/node-http-DRAUhO0c.js.map +0 -1
  176. package/dist/lib/node-http-DhxguYyz.cjs +0 -13
  177. package/dist/lib/node-http-DhxguYyz.cjs.map +0 -1
  178. package/dist/lib/runtime-CrH5X-Es.cjs +0 -2
  179. package/dist/lib/runtime-CrH5X-Es.cjs.map +0 -1
  180. package/dist/lib/runtime-Ds2-wH6P.js +0 -520
  181. package/dist/lib/runtime-Ds2-wH6P.js.map +0 -1
  182. package/dist/lib/seo/index.cjs.map +0 -1
  183. package/dist/lib/seo/index.js.map +0 -1
  184. package/dist/lib/shared-CfqOLsKj.cjs.map +0 -1
  185. package/dist/lib/shared-DU3iQgr7.js.map +0 -1
  186. package/dist/lib/stream-CpOG052V.js +0 -104
  187. package/dist/lib/stream-CpOG052V.js.map +0 -1
  188. package/dist/lib/stream-DmZjYqHm.cjs.map +0 -1
@@ -1,148 +1,155 @@
1
- import { a as e, c as t, l as n, n as r, o as i, t as a } from "../node-http-DRAUhO0c.js";
2
- import { t as o } from "../route-scanner-XcLId7lK.js";
3
- import { t as s } from "../scan-Dn93ycXG.js";
4
- import { a as c, i as l, n as u, o as d, r as f, s as p, t as m } from "../interpolation-plugin-Wgb1j4pT.js";
1
+ import { a as e, f as t, i as n, l as r, o as i, p as a, r as o, t as s, u as c } from "../node-http-DVFcYeBS.js";
2
+ import { t as l } from "../route-scanner-XcLId7lK.js";
3
+ import { t as u } from "../scan-Dn93ycXG.js";
4
+ import { i as d, n as f, r as p, t as m } from "../interpolation-plugin-K2qE69tF.js";
5
5
  import { n as h, t as g } from "../scan-CjMUgnsd.js";
6
6
  import { s as _, t as v } from "../collections-Dbc8aRLf.js";
7
7
  import { mkdir as y, writeFile as b } from "node:fs/promises";
8
8
  import { dirname as x, relative as S, resolve as C } from "node:path";
9
9
  //#region src/vite/index.ts
10
10
  function w(t = {}) {
11
- let n = t.appDir ?? "src/app", i = t.islandsDir ?? "src/islands", m = t.contentDir ?? "src/content", S = t.generatedEntry ?? ".elur/entry-client.ts", w = t.clientEntry ?? "/_elur/entry-client.js", A = t.lang ?? "es", j = t.hydrateImport ?? "@elurjs/kit/island", M = t.routerImport ?? "@elurjs/kit/router", N = null, P = {}, F = ".", I = null, L = {
11
+ let a = t.appDir ?? "src/app", c = t.islandsDir ?? "src/islands", m = t.contentDir ?? "src/content", S = t.generatedEntry ?? ".elur/entry-client.ts", w = t.clientEntry ?? "/_elur/entry-client.js", A = t.lang ?? "es", j = t.hydrateImport ?? "@elurjs/kit/island", M = t.routerImport ?? "@elurjs/kit/router", N = null, P = {}, F = ".", I = null, L = {
12
12
  name: "elur-kit",
13
13
  enforce: "pre",
14
14
  async configResolved(e) {
15
15
  F = e.root;
16
- let t = C(F, S), r = await s(C(F, i)), a = p(r, t, j, M);
17
- await y(x(t), { recursive: !0 }), await b(t, a, "utf8");
18
- let c = C(F, n);
19
- N = await o(c), P = await h(c), _(C(F, m)), I = await l(F);
16
+ let n = C(F, S), r = await u(C(F, c)), i = d(r, n, j, M, t.router);
17
+ await y(x(n), { recursive: !0 }), await b(n, i, "utf8");
18
+ let s = C(F, a);
19
+ N = await l(s), P = await h(s), _(C(F, m)), I = await o(F);
20
20
  },
21
- configureServer(s) {
22
- let l = E(s, F), u = D(() => P, () => N, l), f = C(F, n);
23
- T(s, f, C(F, i), C(F, m), F, S, j, M, () => {
21
+ configureServer(o) {
22
+ let u = E(o, F), d = D(() => P, () => N, u), f = C(F, a);
23
+ T(o, f, C(F, c), C(F, m), F, S, j, M, t.router, () => {
24
24
  N = null, P = {}, v();
25
- }), s.middlewares.use(async (n, i, p) => {
26
- let m = new URL(n.url ?? "/", `http://${n.headers.host ?? "localhost"}`), _ = m.pathname;
27
- if (_ === "/__elur-js/actions" && n.method === "POST") {
25
+ }), o.middlewares.use(async (a, c, p) => {
26
+ let m = new URL(a.url ?? "/", `http://${a.headers.host ?? "localhost"}`), _ = m.pathname;
27
+ if (_ === "/__elur-js/actions" && a.method === "POST") {
28
28
  try {
29
- let e = await O(n), o = a(n, e), s = await r(o, u, t.actionSecurity);
30
- i.writeHead(s.status, Object.fromEntries(s.headers.entries())), i.end(await s.text());
29
+ let e = await O(a), n = s(a, e), r = await i(n, d, t.actionSecurity);
30
+ c.writeHead(r.status, Object.fromEntries(r.headers.entries())), c.end(await r.text());
31
31
  } catch (e) {
32
- console.error("[elur-kit] action error:", e), i.writeHead(500, { "Content-Type": "text/plain; charset=utf-8" }), i.end(String(e));
32
+ console.error("[elur-kit] action error:", e), c.writeHead(500, { "Content-Type": "text/plain; charset=utf-8" }), c.end(String(e));
33
33
  }
34
34
  return;
35
35
  }
36
36
  if (_.startsWith("/_elur/entry-client.js")) {
37
- let e = await s.transformRequest("/.elur/entry-client.ts");
37
+ let e = await o.transformRequest("/.elur/entry-client.ts");
38
38
  if (e) {
39
- i.writeHead(200, {
39
+ c.writeHead(200, {
40
40
  "Content-Type": "application/javascript; charset=utf-8",
41
41
  "Cache-Control": "no-store, must-revalidate"
42
- }), i.end(e.code);
42
+ }), c.end(e.code);
43
43
  return;
44
44
  }
45
45
  }
46
- let v = N ??= await o(f), y = Object.keys(P).length ? P : P = await h(f);
46
+ let v = N ??= await l(f), y = Object.keys(P).length ? P : P = await h(f);
47
47
  if (_ === "/__elur-js/render") {
48
- let { renderPageBody: e, RouteNotFoundError: t } = await import("../stream-CpOG052V.js").then((e) => e.i);
48
+ let { renderPageBody: e, RouteNotFoundError: t } = await import("../stream-D-ytogdu.js").then((e) => e.i);
49
49
  try {
50
- let t = m.searchParams.get("page") ?? "/", r = m.searchParams.get("search") ?? "", o = (n.headers.accept ?? "").includes("application/json"), s = a(n), { body: c, title: u, head: d, clearActionErrorCookie: f } = await e({
50
+ let t = m.searchParams.get("page") ?? "/", n = m.searchParams.get("search") ?? "", r = (a.headers.accept ?? "").includes("application/json"), i = s(a), o = await e({
51
51
  routes: v,
52
52
  pathname: t,
53
- searchParams: new URLSearchParams(r),
53
+ searchParams: new URLSearchParams(n),
54
54
  config: {
55
55
  lang: A,
56
56
  clientEntry: w
57
57
  },
58
58
  actions: g(y),
59
- importer: l,
60
- request: s
59
+ importer: u,
60
+ request: i
61
61
  });
62
- if (o) {
62
+ if (o.response) {
63
+ c.writeHead(o.response.status, Object.fromEntries(o.response.headers.entries())), c.end(Buffer.from(await o.response.arrayBuffer()));
64
+ return;
65
+ }
66
+ let { body: l, title: d, head: f, clearActionErrorCookie: p, data: h, actions: _ } = o;
67
+ if (r) {
63
68
  let e = { "Content-Type": "application/json; charset=utf-8" };
64
- f && (e["X-Elur-Action-Clear-Cookie"] = f), i.writeHead(200, e), i.end(JSON.stringify({
65
- title: u,
66
- body: c,
67
- head: d,
68
- clearActionErrorCookie: f
69
+ p && (e["X-Elur-Action-Clear-Cookie"] = p), c.writeHead(200, e), c.end(JSON.stringify({
70
+ title: d,
71
+ body: l,
72
+ head: f ?? null,
73
+ data: h ?? null,
74
+ actions: _ ?? null,
75
+ clearActionErrorCookie: p ?? null
69
76
  }));
70
77
  } else {
71
78
  let e = { "Content-Type": "text/html; charset=utf-8" };
72
- f && (e["Set-Cookie"] = f), i.writeHead(200, e), i.end(c);
79
+ p && (e["Set-Cookie"] = p), c.writeHead(200, e), c.end(l);
73
80
  }
74
81
  return;
75
82
  } catch (e) {
76
83
  if (e instanceof t) {
77
- i.writeHead(404, { "Content-Type": "text/plain; charset=utf-8" }), i.end("Not Found");
84
+ c.writeHead(404, { "Content-Type": "text/plain; charset=utf-8" }), c.end("Not Found");
78
85
  return;
79
86
  }
80
- console.error("[elur-kit] render endpoint error:", e), i.writeHead(500, { "Content-Type": "text/plain; charset=utf-8" }), i.end(String(e));
87
+ console.error("[elur-kit] render endpoint error:", e), c.writeHead(500, { "Content-Type": "text/plain; charset=utf-8" }), c.end(String(e));
81
88
  return;
82
89
  }
83
90
  }
84
91
  if (!_.startsWith("/@") && !_.startsWith("/node_modules/") && !_.includes(".")) {
85
- let t = e(_, v.api);
86
- if (t) {
92
+ let e = r(_, v.api);
93
+ if (e) {
87
94
  try {
88
- let e = (await l(t.route.routePath))[n.method ?? "GET"];
89
- if (typeof e != "function") {
90
- i.writeHead(405, { "Content-Type": "text/plain" }), i.end(`Method not allowed: ${n.method}`);
95
+ let t = (await u(e.route.routePath))[a.method ?? "GET"];
96
+ if (typeof t != "function") {
97
+ c.writeHead(405, { "Content-Type": "text/plain" }), c.end(`Method not allowed: ${a.method}`);
91
98
  return;
92
99
  }
93
- let r = n.method && n.method !== "GET" && n.method !== "HEAD" ? await O(n) : void 0, o = await e(a(n, r), { params: t.params });
94
- i.writeHead(o.status, Object.fromEntries(o.headers.entries())), i.end(Buffer.from(await o.arrayBuffer()));
100
+ let n = a.method && a.method !== "GET" && a.method !== "HEAD" ? await O(a) : void 0, r = await t(s(a, n), { params: e.params });
101
+ c.writeHead(r.status, Object.fromEntries(r.headers.entries())), c.end(Buffer.from(await r.arrayBuffer()));
95
102
  } catch (e) {
96
- console.error("[elur-kit] API route error:", e), i.writeHead(500, { "Content-Type": "text/plain; charset=utf-8" }), i.end(String(e));
103
+ console.error("[elur-kit] API route error:", e), c.writeHead(500, { "Content-Type": "text/plain; charset=utf-8" }), c.end(String(e));
97
104
  }
98
105
  return;
99
106
  }
100
107
  }
101
108
  let b;
102
- if (I && c(_, I.config)) {
103
- let e = await d(I, a(n));
104
- if (e.kind === "response") {
105
- i.writeHead(e.response.status, Object.fromEntries(e.response.headers.entries())), i.end(Buffer.from(await e.response.arrayBuffer()));
109
+ if (I && n(_, I.config)) {
110
+ let t = await e(I, s(a));
111
+ if (t.kind === "response") {
112
+ c.writeHead(t.response.status, Object.fromEntries(t.response.headers.entries())), c.end(Buffer.from(await t.response.arrayBuffer()));
106
113
  return;
107
114
  }
108
- b = e.headers;
115
+ b = t.headers;
109
116
  }
110
- await k(n, i, p, {
117
+ await k(a, c, p, {
111
118
  routes: v,
112
119
  actions: y,
113
120
  clientEntry: w,
114
121
  lang: A,
115
- ssrLoad: l,
122
+ ssrLoad: u,
116
123
  middlewareHeaders: b
117
124
  }) || p();
118
125
  });
119
126
  }
120
127
  };
121
- return f(t.interpolation ?? "auto") ? [L, u({
122
- appDir: n,
123
- islandsDir: i
128
+ return p(t.interpolation ?? "auto") ? [L, f({
129
+ appDir: a,
130
+ islandsDir: c
124
131
  })] : [L];
125
132
  }
126
- function T(e, t, n, r, i, a, o, c, l) {
127
- let u = (e) => e.startsWith(t) || e.startsWith(n) || e.startsWith(r);
128
- async function d() {
129
- let t = await s(n), r = C(i, a), l = p(t, r, o, c);
133
+ function T(e, t, n, r, i, a, o, s, c, l) {
134
+ let f = (e) => e.startsWith(t) || e.startsWith(n) || e.startsWith(r);
135
+ async function p() {
136
+ let t = await u(n), r = C(i, a), l = d(t, r, o, s, c);
130
137
  await y(x(r), { recursive: !0 }), await b(r, l, "utf8");
131
- let u = e.moduleGraph.getModuleById(r);
132
- u && e.moduleGraph.invalidateModule(u);
138
+ let f = e.moduleGraph.getModuleById(r);
139
+ f && e.moduleGraph.invalidateModule(f);
133
140
  }
134
141
  e.watcher.on("change", async (t) => {
135
- if (!u(t)) return;
142
+ if (!f(t)) return;
136
143
  l();
137
144
  let i = e.moduleGraph.getModuleById(t);
138
- i && e.moduleGraph.invalidateModule(i), t.startsWith(n) ? (await d(), console.log("[elur-kit] HMR reload islands after change:", t)) : t.startsWith(r) && t.endsWith(".md") ? console.log("[elur-kit] HMR content changed:", t) : (t.includes(".action.ts") || t.includes(".data.ts") || t.includes("page.ts") || t.includes("layout.ts")) && console.log("[elur-kit] HMR reload routes/actions after change:", t);
145
+ i && e.moduleGraph.invalidateModule(i), t.startsWith(n) ? (await p(), console.log("[elur-kit] HMR reload islands after change:", t)) : t.startsWith(r) && t.endsWith(".md") ? console.log("[elur-kit] HMR content changed:", t) : (t.includes(".action.ts") || t.includes(".data.ts") || t.includes("page.ts") || t.includes("layout.ts")) && console.log("[elur-kit] HMR reload routes/actions after change:", t);
139
146
  }), e.watcher.on("add", async (e) => {
140
- u(e) && (l(), e.startsWith(n) && await d(), console.log("[elur-kit] HMR new file detected:", e));
147
+ f(e) && (l(), e.startsWith(n) && await p(), console.log("[elur-kit] HMR new file detected:", e));
141
148
  }), e.watcher.on("unlink", async (t) => {
142
- if (!u(t)) return;
149
+ if (!f(t)) return;
143
150
  l();
144
151
  let r = e.moduleGraph.getModuleById(t);
145
- r && e.moduleGraph.invalidateModule(r), t.startsWith(n) && await d(), console.log("[elur-kit] HMR file removed:", t);
152
+ r && e.moduleGraph.invalidateModule(r), t.startsWith(n) && await p(), console.log("[elur-kit] HMR file removed:", t);
146
153
  });
147
154
  }
148
155
  function E(e, t) {
@@ -152,10 +159,10 @@ function E(e, t) {
152
159
  };
153
160
  }
154
161
  function D(e, t, n) {
155
- return async (r, a) => {
156
- let o = e(), s = t(), c;
157
- a && s && (c = s.pages.some((e) => e.path === a) ? a : i(a, s.pages)?.route.path ?? a);
158
- let l = c ? o[c] : Object.values(o).find((e) => e[r]) ?? void 0, u = l ? l[r] : void 0;
162
+ return async (r, i) => {
163
+ let a = e(), o = t(), s;
164
+ i && o && (s = o.pages.some((e) => e.path === i) ? i : c(i, o.pages)?.route.path ?? i);
165
+ let l = s ? a[s] : Object.values(a).find((e) => e[r]) ?? void 0, u = l ? l[r] : void 0;
159
166
  if (!u) return;
160
167
  let d = (await n(u))[r];
161
168
  if (typeof d == "function") return d;
@@ -169,61 +176,61 @@ function O(e) {
169
176
  }), e.on("end", () => t(r)), e.on("error", n);
170
177
  });
171
178
  }
172
- async function k(e, r, o, s) {
173
- if (!s.routes) return !1;
174
- let c = g(s.actions), l = e.url ?? "/";
179
+ async function k(e, n, r, i) {
180
+ if (!i.routes) return !1;
181
+ let o = g(i.actions), l = e.url ?? "/";
175
182
  if (l.includes("?") && (l = l.split("?")[0]), l.startsWith("/@") || l.startsWith("/node_modules/") || l.includes(".")) return !1;
176
183
  let u = {
177
- lang: s.lang,
178
- clientEntry: s.clientEntry
179
- }, d = i(l, s.routes.pages);
184
+ lang: i.lang,
185
+ clientEntry: i.clientEntry
186
+ }, d = c(l, i.routes.pages);
180
187
  if (d) try {
181
- let t = a(e);
182
- if (s.middlewareHeaders) for (let [e, n] of Object.entries(s.middlewareHeaders)) t.headers.set(e, n);
183
- let { html: i, clearActionErrorCookie: o } = await n({
188
+ let t = s(e);
189
+ if (i.middlewareHeaders) for (let [e, n] of Object.entries(i.middlewareHeaders)) t.headers.set(e, n);
190
+ let { html: r, clearActionErrorCookie: c } = await a({
184
191
  route: d.route,
185
192
  params: d.params,
186
193
  searchParams: new URLSearchParams(e.url?.split("?")[1] ?? ""),
187
194
  config: u,
188
- importer: s.ssrLoad,
189
- actions: c,
195
+ importer: i.ssrLoad,
196
+ actions: o,
190
197
  request: t
191
198
  }), l = {
192
199
  "Content-Type": "text/html; charset=utf-8",
193
200
  "Cache-Control": "no-store, must-revalidate"
194
201
  };
195
- return o && (l["Set-Cookie"] = o), r.writeHead(200, l), r.end(i), !0;
202
+ return c && (l["Set-Cookie"] = c), n.writeHead(200, l), n.end(r), !0;
196
203
  } catch (e) {
197
204
  console.error("[elur-kit] SSR render error:", e);
198
- let n = await t({
199
- routes: s.routes,
205
+ let r = await t({
206
+ routes: i.routes,
200
207
  status: 500,
201
208
  error: e,
202
209
  config: u,
203
- actions: c,
204
- importer: s.ssrLoad
210
+ actions: o,
211
+ importer: i.ssrLoad
205
212
  });
206
- return n ? (r.writeHead(n.status, {
213
+ return r ? (n.writeHead(r.status, {
207
214
  "Content-Type": "text/html; charset=utf-8",
208
215
  "Cache-Control": "no-store, must-revalidate"
209
- }), r.end(n.html)) : (r.writeHead(500, {
216
+ }), n.end(r.html)) : (n.writeHead(500, {
210
217
  "Content-Type": "text/plain; charset=utf-8",
211
218
  "Cache-Control": "no-store, must-revalidate"
212
- }), r.end(String(e))), !0;
219
+ }), n.end(String(e))), !0;
213
220
  }
214
221
  let f = await t({
215
- routes: s.routes,
222
+ routes: i.routes,
216
223
  status: 404,
217
224
  config: u,
218
- actions: c,
219
- importer: s.ssrLoad
225
+ actions: o,
226
+ importer: i.ssrLoad
220
227
  });
221
- return f ? (r.writeHead(f.status, {
228
+ return f ? (n.writeHead(f.status, {
222
229
  "Content-Type": "text/html; charset=utf-8",
223
230
  "Cache-Control": "no-store, must-revalidate"
224
- }), r.end(f.html), !0) : !1;
231
+ }), n.end(f.html), !0) : !1;
225
232
  }
226
233
  //#endregion
227
- export { m as coreSupportsPartialInterpolation, u as elurJsInterpolationPlugin, w as elurJsKit, f as shouldUseLegacyInterpolation };
234
+ export { m as coreSupportsPartialInterpolation, f as elurJsInterpolationPlugin, w as elurJsKit, p as shouldUseLegacyInterpolation };
228
235
 
229
236
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/vite/index.ts"],"sourcesContent":["import { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, relative, resolve } from \"node:path\";\nimport type { Plugin, Connect, ViteDevServer } from \"vite\";\nimport { scanRoutes } from \"../router/route-scanner.js\";\nimport { scanActions, actionNames, type ActionRegistry } from \"../action/scan.js\";\nimport { handleActionRequest, type ActionSecurityOptions } from \"../action/server.js\";\nimport { scanIslands } from \"../island/scan.js\";\nimport { buildEntrySource } from \"../island/generate-entry.js\";\nimport { matchApiRoute, matchRoute } from \"../ssr/match.js\";\nimport { renderPage, renderErrorPage } from \"../ssr/render.js\";\nimport { setContentRoot, clearContentCache } from \"../content/collections.js\";\nimport { loadMiddleware, matchesMiddleware, runMiddleware, type LoadedMiddleware } from \"../middleware/index.js\";\nimport { elurJsInterpolationPlugin, shouldUseLegacyInterpolation, type InterpolationMode } from \"./interpolation-plugin.js\";\nimport { incomingMessageToRequest } from \"../runtime/node-http.js\";\n\nexport interface ElurJsKitViteOptions {\n /** App directory relative to Vite root (default: src/app). */\n appDir?: string;\n /** Islands directory relative to Vite root (default: src/islands). */\n islandsDir?: string;\n /** Content directory relative to Vite root (default: src/content). */\n contentDir?: string;\n /** Where to write the generated client entry (default: .elur/entry-client.ts). */\n generatedEntry?: string;\n /** Public path for the client entry module (default: /_elur/entry-client.js). */\n clientEntry?: string;\n /** HTML lang attribute (default: es). */\n lang?: string;\n /** Import specifier for hydrateIslands in the generated entry. */\n hydrateImport?: string;\n /** Import specifier for startClientRouter in the generated entry. */\n routerImport?: string;\n /** CSRF / origin policy applied to the server actions endpoint in dev. */\n actionSecurity?: ActionSecurityOptions;\n /**\n * How the legacy interpolation transform is handled (default: \"auto\").\n * With a Elur core that supports partial attribute interpolation natively\n * the transform is not applied; use \"legacy\" for migrations against older\n * cores and \"off\" to never transform.\n */\n interpolation?: InterpolationMode;\n}\n\n/**\n * Official Vite plugin for elur-kit.\n *\n * In dev mode it generates the islands entry and renders every page via SSR.\n * In production builds it can be combined with `elur-kit build` to generate\n * static HTML files.\n */\nexport function elurJsKit(options: ElurJsKitViteOptions = {}): Plugin[] {\n const appDir = options.appDir ?? \"src/app\";\n const islandsDir = options.islandsDir ?? \"src/islands\";\n const contentDir = options.contentDir ?? \"src/content\";\n const generatedEntry = options.generatedEntry ?? \".elur/entry-client.ts\";\n const clientEntry = options.clientEntry ?? \"/_elur/entry-client.js\";\n const lang = options.lang ?? \"es\";\n const hydrateImport = options.hydrateImport ?? \"@elurjs/kit/island\";\n const routerImport = options.routerImport ?? \"@elurjs/kit/router\";\n\n let routes: Awaited<ReturnType<typeof scanRoutes>> | null = null;\n let actions: ActionRegistry = {};\n let root: string = \".\";\n let middleware: LoadedMiddleware | null = null;\n\n const mainPlugin: Plugin = {\n name: \"elur-kit\",\n enforce: \"pre\",\n\n async configResolved(config) {\n root = config.root;\n const entryPath = resolve(root, generatedEntry);\n const islands = await scanIslands(resolve(root, islandsDir));\n const source = buildEntrySource(islands, entryPath, hydrateImport, routerImport);\n await mkdir(dirname(entryPath), { recursive: true });\n await writeFile(entryPath, source, \"utf8\");\n\n const appDirPath = resolve(root, appDir);\n routes = await scanRoutes(appDirPath);\n actions = await scanActions(appDirPath);\n\n // Wire up the content layer root so getCollection/getEntry resolve\n // from the user's src/content directory.\n setContentRoot(resolve(root, contentDir));\n\n // Load user middleware (src/middleware.ts) if it exists.\n middleware = await loadMiddleware(root);\n },\n\n configureServer(server) {\n const ssrLoad = createSsrLoader(server, root);\n const resolveAction = createActionResolver(() => actions, () => routes, ssrLoad);\n\n const appDirPath = resolve(root, appDir);\n const islandsDirPath = resolve(root, islandsDir);\n const contentDirPath = resolve(root, contentDir);\n setupHmr(server, appDirPath, islandsDirPath, contentDirPath, root, generatedEntry, hydrateImport, routerImport, () => {\n routes = null;\n actions = {};\n clearContentCache();\n });\n\n server.middlewares.use(async (req, res, next) => {\n const requestUrl = new URL(req.url ?? \"/\", `http://${req.headers.host ?? \"localhost\"}`);\n const urlPath = requestUrl.pathname;\n\n // Server actions endpoint.\n if (urlPath === \"/__elur-js/actions\" && req.method === \"POST\") {\n try {\n const body = await readRequestBody(req);\n const request = incomingMessageToRequest(req, body);\n const response = await handleActionRequest(request, resolveAction, options.actionSecurity);\n res.writeHead(response.status, Object.fromEntries(response.headers.entries()));\n res.end(await response.text());\n } catch (err) {\n console.error(\"[elur-kit] action error:\", err);\n res.writeHead(500, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n res.end(String(err));\n }\n return;\n }\n\n if (urlPath.startsWith(\"/_elur/entry-client.js\")) {\n const transformed = await server.transformRequest(\n \"/.elur/entry-client.ts\",\n );\n if (transformed) {\n res.writeHead(200, {\n \"Content-Type\": \"application/javascript; charset=utf-8\",\n \"Cache-Control\": \"no-store, must-revalidate\",\n });\n res.end(transformed.code);\n return;\n }\n }\n\n const currentRoutes = routes ?? (routes = await scanRoutes(appDirPath));\n const currentActions = Object.keys(actions).length ? actions : (actions = await scanActions(appDirPath));\n\n // Render endpoint used by the SPA router and streaming boundaries.\n if (urlPath === \"/__elur-js/render\") {\n const { renderPageBody, RouteNotFoundError } = await import(\"../ssr/stream.js\");\n try {\n const page = requestUrl.searchParams.get(\"page\") ?? \"/\";\n const search = requestUrl.searchParams.get(\"search\") ?? \"\";\n const wantsJson = (req.headers[\"accept\"] ?? \"\").includes(\"application/json\");\n const request = incomingMessageToRequest(req);\n const { body, title, head, clearActionErrorCookie } = await renderPageBody({\n routes: currentRoutes,\n pathname: page,\n searchParams: new URLSearchParams(search),\n config: { lang, clientEntry },\n actions: actionNames(currentActions),\n importer: ssrLoad,\n request,\n });\n if (wantsJson) {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json; charset=utf-8\" };\n if (clearActionErrorCookie) headers[\"X-Elur-Action-Clear-Cookie\"] = clearActionErrorCookie;\n res.writeHead(200, headers);\n res.end(JSON.stringify({ title, body, head, clearActionErrorCookie }));\n } else {\n const headers: Record<string, string> = { \"Content-Type\": \"text/html; charset=utf-8\" };\n if (clearActionErrorCookie) headers[\"Set-Cookie\"] = clearActionErrorCookie;\n res.writeHead(200, headers);\n res.end(body);\n }\n return;\n } catch (err) {\n if (err instanceof RouteNotFoundError) {\n res.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n res.end(\"Not Found\");\n return;\n }\n console.error(\"[elur-kit] render endpoint error:\", err);\n res.writeHead(500, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n res.end(String(err));\n return;\n }\n }\n\n if (!urlPath.startsWith(\"/@\") && !urlPath.startsWith(\"/node_modules/\") && !urlPath.includes(\".\")) {\n const apiMatch = matchApiRoute(urlPath, currentRoutes.api);\n if (apiMatch) {\n try {\n const mod = (await ssrLoad(apiMatch.route.routePath)) as Record<\n string,\n (request: Request, context?: { params: Record<string, string | string[]> }) => unknown\n >;\n const handler = mod[req.method ?? \"GET\"];\n if (typeof handler !== \"function\") {\n res.writeHead(405, { \"Content-Type\": \"text/plain\" });\n res.end(`Method not allowed: ${req.method}`);\n return;\n }\n const body = req.method && req.method !== \"GET\" && req.method !== \"HEAD\" ? await readRequestBody(req) : undefined;\n const request = incomingMessageToRequest(req, body);\n const response = (await handler(request, { params: apiMatch.params })) as Response;\n res.writeHead(response.status, Object.fromEntries(response.headers.entries()));\n res.end(Buffer.from(await response.arrayBuffer()));\n } catch (err) {\n console.error(\"[elur-kit] API route error:\", err);\n res.writeHead(500, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n res.end(String(err));\n }\n return;\n }\n }\n\n // Run middleware before SSR rendering.\n let middlewareHeaders: Record<string, string> | undefined;\n if (middleware && matchesMiddleware(urlPath, middleware.config)) {\n const mwResult = await runMiddleware(middleware, incomingMessageToRequest(req));\n if (mwResult.kind === \"response\") {\n res.writeHead(mwResult.response.status, Object.fromEntries(mwResult.response.headers.entries()));\n res.end(Buffer.from(await mwResult.response.arrayBuffer()));\n return;\n }\n middlewareHeaders = mwResult.headers;\n }\n\n const handled = await handleSsrRequest(req, res, next, {\n routes: currentRoutes,\n actions: currentActions,\n clientEntry,\n lang,\n ssrLoad,\n middlewareHeaders,\n });\n if (!handled) next();\n });\n },\n };\n\n return shouldUseLegacyInterpolation(options.interpolation ?? \"auto\")\n ? [mainPlugin, elurJsInterpolationPlugin({ appDir, islandsDir })]\n : [mainPlugin];\n}\n\nexport { elurJsInterpolationPlugin, type InterpolationPluginOptions } from \"./interpolation-plugin.js\";\nexport type { InterpolationMode } from \"./interpolation-plugin.js\";\nexport { coreSupportsPartialInterpolation, shouldUseLegacyInterpolation } from \"./interpolation-plugin.js\";\n\nfunction setupHmr(\n server: ViteDevServer,\n appDirPath: string,\n islandsDirPath: string,\n contentDirPath: string,\n root: string,\n generatedEntry: string,\n hydrateImport: string,\n routerImport: string,\n invalidate: () => void,\n) {\n const isRelevant = (path: string) =>\n path.startsWith(appDirPath) || path.startsWith(islandsDirPath) || path.startsWith(contentDirPath);\n\n async function regenerateIslandEntry() {\n const islands = await scanIslands(islandsDirPath);\n const entryPath = resolve(root, generatedEntry);\n const source = buildEntrySource(islands, entryPath, hydrateImport, routerImport);\n await mkdir(dirname(entryPath), { recursive: true });\n await writeFile(entryPath, source, \"utf8\");\n const entryMod = server.moduleGraph.getModuleById(entryPath);\n if (entryMod) server.moduleGraph.invalidateModule(entryMod);\n }\n\n server.watcher.on(\"change\", async (path) => {\n if (!isRelevant(path)) return;\n invalidate();\n const mod = server.moduleGraph.getModuleById(path);\n if (mod) server.moduleGraph.invalidateModule(mod);\n if (path.startsWith(islandsDirPath)) {\n await regenerateIslandEntry();\n console.log(\"[elur-kit] HMR reload islands after change:\", path);\n } else if (path.startsWith(contentDirPath) && path.endsWith(\".md\")) {\n console.log(\"[elur-kit] HMR content changed:\", path);\n } else if (path.includes(\".action.ts\") || path.includes(\".data.ts\") || path.includes(\"page.ts\") || path.includes(\"layout.ts\")) {\n console.log(\"[elur-kit] HMR reload routes/actions after change:\", path);\n }\n });\n\n server.watcher.on(\"add\", async (path) => {\n if (!isRelevant(path)) return;\n invalidate();\n if (path.startsWith(islandsDirPath)) {\n await regenerateIslandEntry();\n }\n console.log(\"[elur-kit] HMR new file detected:\", path);\n });\n\n server.watcher.on(\"unlink\", async (path) => {\n if (!isRelevant(path)) return;\n invalidate();\n const mod = server.moduleGraph.getModuleById(path);\n if (mod) server.moduleGraph.invalidateModule(mod);\n if (path.startsWith(islandsDirPath)) {\n await regenerateIslandEntry();\n }\n console.log(\"[elur-kit] HMR file removed:\", path);\n });\n}\n\nfunction createSsrLoader(server: ViteDevServer, root: string) {\n return (filePath: string) => {\n const rel = relative(root, filePath);\n const url = \"/\" + rel.split(\"\\\\\").join(\"/\");\n return server.ssrLoadModule(url);\n };\n}\n\nfunction createActionResolver(\n getActions: () => import(\"../action/scan.js\").ActionRegistry,\n getRoutes: () => Awaited<ReturnType<typeof scanRoutes>> | null,\n ssrLoad: (path: string) => Promise<unknown>,\n) {\n return async (name: string, page?: string) => {\n const actions = getActions();\n const routes = getRoutes();\n let pageKey: string | undefined;\n if (page && routes) {\n pageKey = routes.pages.some((route) => route.path === page)\n ? page\n : (matchRoute(page, routes.pages)?.route.path ?? page);\n }\n const pageActions = pageKey ? actions[pageKey] : Object.values(actions).find((p) => p[name]) ?? undefined;\n const actionPath = pageActions ? pageActions[name] : undefined;\n if (!actionPath) return undefined;\n const mod = (await ssrLoad(actionPath)) as Record<string, unknown>;\n const action = mod[name];\n if (typeof action === \"function\") {\n return action as (...args: unknown[]) => unknown;\n }\n return undefined;\n };\n}\n\nfunction readRequestBody(req: Connect.IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n let body = \"\";\n req.setEncoding(\"utf8\");\n req.on(\"data\", (chunk) => {\n body += chunk;\n });\n req.on(\"end\", () => resolve(body));\n req.on(\"error\", reject);\n });\n}\n\ninterface SsrHandlerOptions {\n routes: Awaited<ReturnType<typeof scanRoutes>> | null;\n actions: ActionRegistry;\n clientEntry: string;\n lang: string;\n ssrLoad: (path: string) => Promise<unknown>;\n middlewareHeaders?: Record<string, string>;\n}\n\nasync function handleSsrRequest(\n req: Connect.IncomingMessage,\n res: import(\"node:http\").ServerResponse,\n _next: Connect.NextFunction,\n options: SsrHandlerOptions,\n): Promise<boolean> {\n if (!options.routes) return false;\n const publicActions = actionNames(options.actions);\n\n let urlPath = req.url ?? \"/\";\n if (urlPath.includes(\"?\")) urlPath = urlPath.split(\"?\")[0];\n\n // Let Vite handle its own internals and assets.\n if (urlPath.startsWith(\"/@\") || urlPath.startsWith(\"/node_modules/\")) {\n return false;\n }\n\n // Skip explicit file requests.\n if (urlPath.includes(\".\")) return false;\n\n const config = { lang: options.lang, clientEntry: options.clientEntry };\n const match = matchRoute(urlPath, options.routes.pages);\n if (match) {\n try {\n const request = incomingMessageToRequest(req);\n if (options.middlewareHeaders) {\n for (const [name, value] of Object.entries(options.middlewareHeaders)) request.headers.set(name, value);\n }\n const { html, clearActionErrorCookie } = await renderPage({\n route: match.route,\n params: match.params,\n searchParams: new URLSearchParams(req.url?.split(\"?\")[1] ?? \"\"),\n config,\n importer: options.ssrLoad,\n actions: publicActions,\n request,\n });\n const responseHeaders: Record<string, string> = {\n \"Content-Type\": \"text/html; charset=utf-8\",\n \"Cache-Control\": \"no-store, must-revalidate\",\n };\n if (clearActionErrorCookie) responseHeaders[\"Set-Cookie\"] = clearActionErrorCookie;\n res.writeHead(200, responseHeaders);\n res.end(html);\n return true;\n } catch (err) {\n console.error(\"[elur-kit] SSR render error:\", err);\n const errorResult = await renderErrorPage({\n routes: options.routes,\n status: 500,\n error: err,\n config,\n actions: publicActions,\n importer: options.ssrLoad,\n });\n if (errorResult) {\n res.writeHead(errorResult.status, {\n \"Content-Type\": \"text/html; charset=utf-8\",\n \"Cache-Control\": \"no-store, must-revalidate\",\n });\n res.end(errorResult.html);\n } else {\n res.writeHead(500, {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n \"Cache-Control\": \"no-store, must-revalidate\",\n });\n res.end(String(err));\n }\n return true;\n }\n }\n\n const errorResult = await renderErrorPage({\n routes: options.routes,\n status: 404,\n config,\n actions: publicActions,\n importer: options.ssrLoad,\n });\n if (errorResult) {\n res.writeHead(errorResult.status, {\n \"Content-Type\": \"text/html; charset=utf-8\",\n \"Cache-Control\": \"no-store, must-revalidate\",\n });\n res.end(errorResult.html);\n return true;\n }\n\n return false;\n}\n"],"mappings":";;;;;;;;;AAkDA,SAAgB,EAAU,IAAgC,CAAC,GAAa;CACtE,IAAM,IAAS,EAAQ,UAAU,WAC3B,IAAa,EAAQ,cAAc,eACnC,IAAa,EAAQ,cAAc,eACnC,IAAiB,EAAQ,kBAAkB,yBAC3C,IAAc,EAAQ,eAAe,0BACrC,IAAO,EAAQ,QAAQ,MACvB,IAAgB,EAAQ,iBAAiB,sBACzC,IAAe,EAAQ,gBAAgB,sBAEzC,IAAwD,MACxD,IAA0B,CAAC,GAC3B,IAAe,KACf,IAAsC,MAEpC,IAAqB;EACzB,MAAM;EACN,SAAS;EAET,MAAM,eAAe,GAAQ;GAC3B,IAAO,EAAO;GACd,IAAM,IAAY,EAAQ,GAAM,CAAc,GACxC,IAAU,MAAM,EAAY,EAAQ,GAAM,CAAU,CAAC,GACrD,IAAS,EAAiB,GAAS,GAAW,GAAe,CAAY;GAE/E,AADA,MAAM,EAAM,EAAQ,CAAS,GAAG,EAAE,WAAW,GAAK,CAAC,GACnD,MAAM,EAAU,GAAW,GAAQ,MAAM;GAEzC,IAAM,IAAa,EAAQ,GAAM,CAAM;GASvC,AARA,IAAS,MAAM,EAAW,CAAU,GACpC,IAAU,MAAM,EAAY,CAAU,GAItC,EAAe,EAAQ,GAAM,CAAU,CAAC,GAGxC,IAAa,MAAM,EAAe,CAAI;EACxC;EAEA,gBAAgB,GAAQ;GACtB,IAAM,IAAU,EAAgB,GAAQ,CAAI,GACtC,IAAgB,QAA2B,SAAe,GAAQ,CAAO,GAEzE,IAAa,EAAQ,GAAM,CAAM;GASvC,AANA,EAAS,GAAQ,GAFM,EAAQ,GAAM,CAER,GADN,EAAQ,GAAM,CACQ,GAAgB,GAAM,GAAgB,GAAe,SAAoB;IAGpH,AAFA,IAAS,MACT,IAAU,CAAC,GACX,EAAkB;GACpB,CAAC,GAED,EAAO,YAAY,IAAI,OAAO,GAAK,GAAK,MAAS;IAC/C,IAAM,IAAa,IAAI,IAAI,EAAI,OAAO,KAAK,UAAU,EAAI,QAAQ,QAAQ,aAAa,GAChF,IAAU,EAAW;IAG3B,IAAI,MAAY,wBAAwB,EAAI,WAAW,QAAQ;KAC7D,IAAI;MACF,IAAM,IAAO,MAAM,EAAgB,CAAG,GAChC,IAAU,EAAyB,GAAK,CAAI,GAC5C,IAAW,MAAM,EAAoB,GAAS,GAAe,EAAQ,cAAc;MAEzF,AADA,EAAI,UAAU,EAAS,QAAQ,OAAO,YAAY,EAAS,QAAQ,QAAQ,CAAC,CAAC,GAC7E,EAAI,IAAI,MAAM,EAAS,KAAK,CAAC;KAC/B,SAAS,GAAK;MAGZ,AAFA,QAAQ,MAAM,4BAA4B,CAAG,GAC7C,EAAI,UAAU,KAAK,EAAE,gBAAgB,4BAA4B,CAAC,GAClE,EAAI,IAAI,OAAO,CAAG,CAAC;KACrB;KACA;IACF;IAEA,IAAI,EAAQ,WAAW,wBAAwB,GAAG;KAChD,IAAM,IAAc,MAAM,EAAO,iBAC/B,wBACF;KACA,IAAI,GAAa;MAKf,AAJA,EAAI,UAAU,KAAK;OACjB,gBAAgB;OAChB,iBAAiB;MACnB,CAAC,GACD,EAAI,IAAI,EAAY,IAAI;MACxB;KACF;IACF;IAEA,IAAM,IAAgB,AAAW,MAAS,MAAM,EAAW,CAAU,GAC/D,IAAiB,OAAO,KAAK,CAAO,CAAC,CAAC,SAAS,IAAW,IAAU,MAAM,EAAY,CAAU;IAGtG,IAAI,MAAY,qBAAqB;KACnC,IAAM,EAAE,mBAAgB,0BAAuB,MAAM,OAAO,wBAAA,CAAA,MAAA,MAAA,EAAA,CAAA;KAC5D,IAAI;MACF,IAAM,IAAO,EAAW,aAAa,IAAI,MAAM,KAAK,KAC9C,IAAS,EAAW,aAAa,IAAI,QAAQ,KAAK,IAClD,KAAa,EAAI,QAAQ,UAAa,GAAA,CAAI,SAAS,kBAAkB,GACrE,IAAU,EAAyB,CAAG,GACtC,EAAE,SAAM,UAAO,SAAM,8BAA2B,MAAM,EAAe;OACzE,QAAQ;OACR,UAAU;OACV,cAAc,IAAI,gBAAgB,CAAM;OACxC,QAAQ;QAAE;QAAM;OAAY;OAC5B,SAAS,EAAY,CAAc;OACnC,UAAU;OACV;MACF,CAAC;MACD,IAAI,GAAW;OACb,IAAM,IAAkC,EAAE,gBAAgB,kCAAkC;OAG5F,AAFI,MAAwB,EAAQ,gCAAgC,IACpE,EAAI,UAAU,KAAK,CAAO,GAC1B,EAAI,IAAI,KAAK,UAAU;QAAE;QAAO;QAAM;QAAM;OAAuB,CAAC,CAAC;MACvE,OAAO;OACL,IAAM,IAAkC,EAAE,gBAAgB,2BAA2B;OAGrF,AAFI,MAAwB,EAAQ,gBAAgB,IACpD,EAAI,UAAU,KAAK,CAAO,GAC1B,EAAI,IAAI,CAAI;MACd;MACA;KACF,SAAS,GAAK;MACZ,IAAI,aAAe,GAAoB;OAErC,AADA,EAAI,UAAU,KAAK,EAAE,gBAAgB,4BAA4B,CAAC,GAClE,EAAI,IAAI,WAAW;OACnB;MACF;MAGA,AAFA,QAAQ,MAAM,qCAAqC,CAAG,GACtD,EAAI,UAAU,KAAK,EAAE,gBAAgB,4BAA4B,CAAC,GAClE,EAAI,IAAI,OAAO,CAAG,CAAC;MACnB;KACF;IACF;IAEA,IAAI,CAAC,EAAQ,WAAW,IAAI,KAAK,CAAC,EAAQ,WAAW,gBAAgB,KAAK,CAAC,EAAQ,SAAS,GAAG,GAAG;KAChG,IAAM,IAAW,EAAc,GAAS,EAAc,GAAG;KACzD,IAAI,GAAU;MACZ,IAAI;OAKF,IAAM,KAAU,MAJG,EAAQ,EAAS,MAAM,SAAS,EAAA,CAI/B,EAAI,UAAU;OAClC,IAAI,OAAO,KAAY,YAAY;QAEjC,AADA,EAAI,UAAU,KAAK,EAAE,gBAAgB,aAAa,CAAC,GACnD,EAAI,IAAI,uBAAuB,EAAI,QAAQ;QAC3C;OACF;OACA,IAAM,IAAO,EAAI,UAAU,EAAI,WAAW,SAAS,EAAI,WAAW,SAAS,MAAM,EAAgB,CAAG,IAAI,KAAA,GAElG,IAAY,MAAM,EADR,EAAyB,GAAK,CACd,GAAS,EAAE,QAAQ,EAAS,OAAO,CAAC;OAEpE,AADA,EAAI,UAAU,EAAS,QAAQ,OAAO,YAAY,EAAS,QAAQ,QAAQ,CAAC,CAAC,GAC7E,EAAI,IAAI,OAAO,KAAK,MAAM,EAAS,YAAY,CAAC,CAAC;MACnD,SAAS,GAAK;OAGZ,AAFA,QAAQ,MAAM,+BAA+B,CAAG,GAChD,EAAI,UAAU,KAAK,EAAE,gBAAgB,4BAA4B,CAAC,GAClE,EAAI,IAAI,OAAO,CAAG,CAAC;MACrB;MACA;KACF;IACF;IAGA,IAAI;IACJ,IAAI,KAAc,EAAkB,GAAS,EAAW,MAAM,GAAG;KAC/D,IAAM,IAAW,MAAM,EAAc,GAAY,EAAyB,CAAG,CAAC;KAC9E,IAAI,EAAS,SAAS,YAAY;MAEhC,AADA,EAAI,UAAU,EAAS,SAAS,QAAQ,OAAO,YAAY,EAAS,SAAS,QAAQ,QAAQ,CAAC,CAAC,GAC/F,EAAI,IAAI,OAAO,KAAK,MAAM,EAAS,SAAS,YAAY,CAAC,CAAC;MAC1D;KACF;KACA,IAAoB,EAAS;IAC/B;IAUA,AAAK,MARiB,EAAiB,GAAK,GAAK,GAAM;KACrD,QAAQ;KACR,SAAS;KACT;KACA;KACA;KACA;IACF,CAAC,KACa,EAAK;GACrB,CAAC;EACH;CACF;CAEA,OAAO,EAA6B,EAAQ,iBAAiB,MAAM,IAC/D,CAAC,GAAY,EAA0B;EAAE;EAAQ;CAAW,CAAC,CAAC,IAC9D,CAAC,CAAU;AACjB;AAMA,SAAS,EACP,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA;CACA,IAAM,KAAc,MAClB,EAAK,WAAW,CAAU,KAAK,EAAK,WAAW,CAAc,KAAK,EAAK,WAAW,CAAc;CAElG,eAAe,IAAwB;EACrC,IAAM,IAAU,MAAM,EAAY,CAAc,GAC1C,IAAY,EAAQ,GAAM,CAAc,GACxC,IAAS,EAAiB,GAAS,GAAW,GAAe,CAAY;EAE/E,AADA,MAAM,EAAM,EAAQ,CAAS,GAAG,EAAE,WAAW,GAAK,CAAC,GACnD,MAAM,EAAU,GAAW,GAAQ,MAAM;EACzC,IAAM,IAAW,EAAO,YAAY,cAAc,CAAS;EAC3D,AAAI,KAAU,EAAO,YAAY,iBAAiB,CAAQ;CAC5D;CA0BA,AAxBA,EAAO,QAAQ,GAAG,UAAU,OAAO,MAAS;EAC1C,IAAI,CAAC,EAAW,CAAI,GAAG;EACvB,EAAW;EACX,IAAM,IAAM,EAAO,YAAY,cAAc,CAAI;EAEjD,AADI,KAAK,EAAO,YAAY,iBAAiB,CAAG,GAC5C,EAAK,WAAW,CAAc,KAChC,MAAM,EAAsB,GAC5B,QAAQ,IAAI,+CAA+C,CAAI,KACtD,EAAK,WAAW,CAAc,KAAK,EAAK,SAAS,KAAK,IAC/D,QAAQ,IAAI,mCAAmC,CAAI,KAC1C,EAAK,SAAS,YAAY,KAAK,EAAK,SAAS,UAAU,KAAK,EAAK,SAAS,SAAS,KAAK,EAAK,SAAS,WAAW,MAC1H,QAAQ,IAAI,sDAAsD,CAAI;CAE1E,CAAC,GAED,EAAO,QAAQ,GAAG,OAAO,OAAO,MAAS;EAClC,EAAW,CAAI,MACpB,EAAW,GACP,EAAK,WAAW,CAAc,KAChC,MAAM,EAAsB,GAE9B,QAAQ,IAAI,qCAAqC,CAAI;CACvD,CAAC,GAED,EAAO,QAAQ,GAAG,UAAU,OAAO,MAAS;EAC1C,IAAI,CAAC,EAAW,CAAI,GAAG;EACvB,EAAW;EACX,IAAM,IAAM,EAAO,YAAY,cAAc,CAAI;EAKjD,AAJI,KAAK,EAAO,YAAY,iBAAiB,CAAG,GAC5C,EAAK,WAAW,CAAc,KAChC,MAAM,EAAsB,GAE9B,QAAQ,IAAI,gCAAgC,CAAI;CAClD,CAAC;AACH;AAEA,SAAS,EAAgB,GAAuB,GAAc;CAC5D,QAAQ,MAAqB;EAE3B,IAAM,IAAM,MADA,EAAS,GAAM,CACT,CAAA,CAAI,MAAM,IAAI,CAAC,CAAC,KAAK,GAAG;EAC1C,OAAO,EAAO,cAAc,CAAG;CACjC;AACF;AAEA,SAAS,EACP,GACA,GACA,GACA;CACA,OAAO,OAAO,GAAc,MAAkB;EAC5C,IAAM,IAAU,EAAW,GACrB,IAAS,EAAU,GACrB;EACJ,AAAI,KAAQ,MACV,IAAU,EAAO,MAAM,MAAM,MAAU,EAAM,SAAS,CAAI,IACtD,IACC,EAAW,GAAM,EAAO,KAAK,CAAC,EAAE,MAAM,QAAQ;EAErD,IAAM,IAAc,IAAU,EAAQ,KAAW,OAAO,OAAO,CAAO,CAAC,CAAC,MAAM,MAAM,EAAE,EAAK,KAAK,KAAA,GAC1F,IAAa,IAAc,EAAY,KAAQ,KAAA;EACrD,IAAI,CAAC,GAAY;EAEjB,IAAM,KAAS,MADI,EAAQ,CAAU,EAAA,CAClB;EACnB,IAAI,OAAO,KAAW,YACpB,OAAO;CAGX;AACF;AAEA,SAAS,EAAgB,GAA+C;CACtE,OAAO,IAAI,SAAS,GAAS,MAAW;EACtC,IAAI,IAAO;EAMX,AALA,EAAI,YAAY,MAAM,GACtB,EAAI,GAAG,SAAS,MAAU;GACxB,KAAQ;EACV,CAAC,GACD,EAAI,GAAG,aAAa,EAAQ,CAAI,CAAC,GACjC,EAAI,GAAG,SAAS,CAAM;CACxB,CAAC;AACH;AAWA,eAAe,EACb,GACA,GACA,GACA,GACkB;CAClB,IAAI,CAAC,EAAQ,QAAQ,OAAO;CAC5B,IAAM,IAAgB,EAAY,EAAQ,OAAO,GAE7C,IAAU,EAAI,OAAO;CASzB,IARI,EAAQ,SAAS,GAAG,MAAG,IAAU,EAAQ,MAAM,GAAG,CAAC,CAAC,KAGpD,EAAQ,WAAW,IAAI,KAAK,EAAQ,WAAW,gBAAgB,KAK/D,EAAQ,SAAS,GAAG,GAAG,OAAO;CAElC,IAAM,IAAS;EAAE,MAAM,EAAQ;EAAM,aAAa,EAAQ;CAAY,GAChE,IAAQ,EAAW,GAAS,EAAQ,OAAO,KAAK;CACtD,IAAI,GACF,IAAI;EACF,IAAM,IAAU,EAAyB,CAAG;EAC5C,IAAI,EAAQ,mBACV,KAAK,IAAM,CAAC,GAAM,MAAU,OAAO,QAAQ,EAAQ,iBAAiB,GAAG,EAAQ,QAAQ,IAAI,GAAM,CAAK;EAExG,IAAM,EAAE,SAAM,8BAA2B,MAAM,EAAW;GACxD,OAAO,EAAM;GACb,QAAQ,EAAM;GACd,cAAc,IAAI,gBAAgB,EAAI,KAAK,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE;GAC9D;GACA,UAAU,EAAQ;GAClB,SAAS;GACT;EACF,CAAC,GACK,IAA0C;GAC9C,gBAAgB;GAChB,iBAAiB;EACnB;EAIA,OAHI,MAAwB,EAAgB,gBAAgB,IAC5D,EAAI,UAAU,KAAK,CAAe,GAClC,EAAI,IAAI,CAAI,GACL;CACT,SAAS,GAAK;EACZ,QAAQ,MAAM,gCAAgC,CAAG;EACjD,IAAM,IAAc,MAAM,EAAgB;GACxC,QAAQ,EAAQ;GAChB,QAAQ;GACR,OAAO;GACP;GACA,SAAS;GACT,UAAU,EAAQ;EACpB,CAAC;EAcD,OAbI,KACF,EAAI,UAAU,EAAY,QAAQ;GAChC,gBAAgB;GAChB,iBAAiB;EACnB,CAAC,GACD,EAAI,IAAI,EAAY,IAAI,MAExB,EAAI,UAAU,KAAK;GACjB,gBAAgB;GAChB,iBAAiB;EACnB,CAAC,GACD,EAAI,IAAI,OAAO,CAAG,CAAC,IAEd;CACT;CAGF,IAAM,IAAc,MAAM,EAAgB;EACxC,QAAQ,EAAQ;EAChB,QAAQ;EACR;EACA,SAAS;EACT,UAAU,EAAQ;CACpB,CAAC;CAUD,OATI,KACF,EAAI,UAAU,EAAY,QAAQ;EAChC,gBAAgB;EAChB,iBAAiB;CACnB,CAAC,GACD,EAAI,IAAI,EAAY,IAAI,GACjB,MAGF;AACT"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/vite/index.ts"],"sourcesContent":["import { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, relative, resolve } from \"node:path\";\nimport type { Plugin, Connect, ViteDevServer } from \"vite\";\nimport { scanRoutes } from \"../router/route-scanner.js\";\nimport { scanActions, actionNames, type ActionRegistry } from \"../action/scan.js\";\nimport { handleActionRequest, type ActionSecurityOptions } from \"../action/server.js\";\nimport { scanIslands } from \"../island/scan.js\";\nimport { buildEntrySource } from \"../island/generate-entry.js\";\nimport { matchApiRoute, matchRoute } from \"../ssr/match.js\";\nimport { renderPage, renderErrorPage } from \"../ssr/render.js\";\nimport { setContentRoot, clearContentCache } from \"../content/collections.js\";\nimport { loadMiddleware, matchesMiddleware, runMiddleware, type LoadedMiddleware } from \"../middleware/index.js\";\nimport { elurJsInterpolationPlugin, shouldUseLegacyInterpolation, type InterpolationMode } from \"./interpolation-plugin.js\";\nimport { incomingMessageToRequest } from \"../runtime/node-http.js\";\n\nexport interface ElurJsKitViteOptions {\n /** App directory relative to Vite root (default: src/app). */\n appDir?: string;\n /** Islands directory relative to Vite root (default: src/islands). */\n islandsDir?: string;\n /** Content directory relative to Vite root (default: src/content). */\n contentDir?: string;\n /** Where to write the generated client entry (default: .elur/entry-client.ts). */\n generatedEntry?: string;\n /** Public path for the client entry module (default: /_elur/entry-client.js). */\n clientEntry?: string;\n /** HTML lang attribute (default: es). */\n lang?: string;\n /** Import specifier for hydrateIslands in the generated entry. */\n hydrateImport?: string;\n /** Import specifier for startClientRouter in the generated entry. */\n routerImport?: string;\n /**\n * Client router flags baked into the generated dev entry. In dev the entry\n * is never gated (HMR needs it on every page), but `enabled`/`prefetch`\n * are honored so behavior matches production.\n */\n router?: {\n enabled?: boolean;\n prefetch?: boolean;\n morph?: boolean;\n loadingIndicator?: boolean;\n };\n /** CSRF / origin policy applied to the server actions endpoint in dev. */\n actionSecurity?: ActionSecurityOptions;\n /**\n * How the legacy interpolation transform is handled (default: \"auto\").\n * With a Elur core that supports partial attribute interpolation natively\n * the transform is not applied; use \"legacy\" for migrations against older\n * cores and \"off\" to never transform.\n */\n interpolation?: InterpolationMode;\n}\n\n/**\n * Official Vite plugin for elur-kit.\n *\n * In dev mode it generates the islands entry and renders every page via SSR.\n * In production builds it can be combined with `elur-kit build` to generate\n * static HTML files.\n */\nexport function elurJsKit(options: ElurJsKitViteOptions = {}): Plugin[] {\n const appDir = options.appDir ?? \"src/app\";\n const islandsDir = options.islandsDir ?? \"src/islands\";\n const contentDir = options.contentDir ?? \"src/content\";\n const generatedEntry = options.generatedEntry ?? \".elur/entry-client.ts\";\n const clientEntry = options.clientEntry ?? \"/_elur/entry-client.js\";\n const lang = options.lang ?? \"es\";\n const hydrateImport = options.hydrateImport ?? \"@elurjs/kit/island\";\n const routerImport = options.routerImport ?? \"@elurjs/kit/router\";\n\n let routes: Awaited<ReturnType<typeof scanRoutes>> | null = null;\n let actions: ActionRegistry = {};\n let root: string = \".\";\n let middleware: LoadedMiddleware | null = null;\n\n const mainPlugin: Plugin = {\n name: \"elur-kit\",\n enforce: \"pre\",\n\n async configResolved(config) {\n root = config.root;\n const entryPath = resolve(root, generatedEntry);\n const islands = await scanIslands(resolve(root, islandsDir));\n const source = buildEntrySource(islands, entryPath, hydrateImport, routerImport, options.router);\n await mkdir(dirname(entryPath), { recursive: true });\n await writeFile(entryPath, source, \"utf8\");\n\n const appDirPath = resolve(root, appDir);\n routes = await scanRoutes(appDirPath);\n actions = await scanActions(appDirPath);\n\n // Wire up the content layer root so getCollection/getEntry resolve\n // from the user's src/content directory.\n setContentRoot(resolve(root, contentDir));\n\n // Load user middleware (src/middleware.ts) if it exists.\n middleware = await loadMiddleware(root);\n },\n\n configureServer(server) {\n const ssrLoad = createSsrLoader(server, root);\n const resolveAction = createActionResolver(() => actions, () => routes, ssrLoad);\n\n const appDirPath = resolve(root, appDir);\n const islandsDirPath = resolve(root, islandsDir);\n const contentDirPath = resolve(root, contentDir);\n setupHmr(server, appDirPath, islandsDirPath, contentDirPath, root, generatedEntry, hydrateImport, routerImport, options.router, () => {\n routes = null;\n actions = {};\n clearContentCache();\n });\n\n server.middlewares.use(async (req, res, next) => {\n const requestUrl = new URL(req.url ?? \"/\", `http://${req.headers.host ?? \"localhost\"}`);\n const urlPath = requestUrl.pathname;\n\n // Server actions endpoint.\n if (urlPath === \"/__elur-js/actions\" && req.method === \"POST\") {\n try {\n const body = await readRequestBody(req);\n const request = incomingMessageToRequest(req, body);\n const response = await handleActionRequest(request, resolveAction, options.actionSecurity);\n res.writeHead(response.status, Object.fromEntries(response.headers.entries()));\n res.end(await response.text());\n } catch (err) {\n console.error(\"[elur-kit] action error:\", err);\n res.writeHead(500, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n res.end(String(err));\n }\n return;\n }\n\n if (urlPath.startsWith(\"/_elur/entry-client.js\")) {\n const transformed = await server.transformRequest(\n \"/.elur/entry-client.ts\",\n );\n if (transformed) {\n res.writeHead(200, {\n \"Content-Type\": \"application/javascript; charset=utf-8\",\n \"Cache-Control\": \"no-store, must-revalidate\",\n });\n res.end(transformed.code);\n return;\n }\n }\n\n const currentRoutes = routes ?? (routes = await scanRoutes(appDirPath));\n const currentActions = Object.keys(actions).length ? actions : (actions = await scanActions(appDirPath));\n\n // Render endpoint used by the SPA router and streaming boundaries.\n if (urlPath === \"/__elur-js/render\") {\n const { renderPageBody, RouteNotFoundError } = await import(\"../ssr/stream.js\");\n try {\n const page = requestUrl.searchParams.get(\"page\") ?? \"/\";\n const search = requestUrl.searchParams.get(\"search\") ?? \"\";\n const wantsJson = (req.headers[\"accept\"] ?? \"\").includes(\"application/json\");\n const request = incomingMessageToRequest(req);\n const result = await renderPageBody({\n routes: currentRoutes,\n pathname: page,\n searchParams: new URLSearchParams(search),\n config: { lang, clientEntry },\n actions: actionNames(currentActions),\n importer: ssrLoad,\n request,\n });\n if (result.response) {\n res.writeHead(result.response.status, Object.fromEntries(result.response.headers.entries()));\n res.end(Buffer.from(await result.response.arrayBuffer()));\n return;\n }\n const { body, title, head, clearActionErrorCookie, data, actions: actionsPayload } = result;\n if (wantsJson) {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json; charset=utf-8\" };\n if (clearActionErrorCookie) headers[\"X-Elur-Action-Clear-Cookie\"] = clearActionErrorCookie;\n res.writeHead(200, headers);\n res.end(JSON.stringify({\n title,\n body,\n head: head ?? null,\n data: data ?? null,\n actions: actionsPayload ?? null,\n clearActionErrorCookie: clearActionErrorCookie ?? null,\n }));\n } else {\n const headers: Record<string, string> = { \"Content-Type\": \"text/html; charset=utf-8\" };\n if (clearActionErrorCookie) headers[\"Set-Cookie\"] = clearActionErrorCookie;\n res.writeHead(200, headers);\n res.end(body);\n }\n return;\n } catch (err) {\n if (err instanceof RouteNotFoundError) {\n res.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n res.end(\"Not Found\");\n return;\n }\n console.error(\"[elur-kit] render endpoint error:\", err);\n res.writeHead(500, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n res.end(String(err));\n return;\n }\n }\n\n if (!urlPath.startsWith(\"/@\") && !urlPath.startsWith(\"/node_modules/\") && !urlPath.includes(\".\")) {\n const apiMatch = matchApiRoute(urlPath, currentRoutes.api);\n if (apiMatch) {\n try {\n const mod = (await ssrLoad(apiMatch.route.routePath)) as Record<\n string,\n (request: Request, context?: { params: Record<string, string | string[]> }) => unknown\n >;\n const handler = mod[req.method ?? \"GET\"];\n if (typeof handler !== \"function\") {\n res.writeHead(405, { \"Content-Type\": \"text/plain\" });\n res.end(`Method not allowed: ${req.method}`);\n return;\n }\n const body = req.method && req.method !== \"GET\" && req.method !== \"HEAD\" ? await readRequestBody(req) : undefined;\n const request = incomingMessageToRequest(req, body);\n const response = (await handler(request, { params: apiMatch.params })) as Response;\n res.writeHead(response.status, Object.fromEntries(response.headers.entries()));\n res.end(Buffer.from(await response.arrayBuffer()));\n } catch (err) {\n console.error(\"[elur-kit] API route error:\", err);\n res.writeHead(500, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n res.end(String(err));\n }\n return;\n }\n }\n\n // Run middleware before SSR rendering.\n let middlewareHeaders: Record<string, string> | undefined;\n if (middleware && matchesMiddleware(urlPath, middleware.config)) {\n const mwResult = await runMiddleware(middleware, incomingMessageToRequest(req));\n if (mwResult.kind === \"response\") {\n res.writeHead(mwResult.response.status, Object.fromEntries(mwResult.response.headers.entries()));\n res.end(Buffer.from(await mwResult.response.arrayBuffer()));\n return;\n }\n middlewareHeaders = mwResult.headers;\n }\n\n const handled = await handleSsrRequest(req, res, next, {\n routes: currentRoutes,\n actions: currentActions,\n clientEntry,\n lang,\n ssrLoad,\n middlewareHeaders,\n });\n if (!handled) next();\n });\n },\n };\n\n return shouldUseLegacyInterpolation(options.interpolation ?? \"auto\")\n ? [mainPlugin, elurJsInterpolationPlugin({ appDir, islandsDir })]\n : [mainPlugin];\n}\n\nexport { elurJsInterpolationPlugin, type InterpolationPluginOptions } from \"./interpolation-plugin.js\";\nexport type { InterpolationMode } from \"./interpolation-plugin.js\";\nexport { coreSupportsPartialInterpolation, shouldUseLegacyInterpolation } from \"./interpolation-plugin.js\";\n\nfunction setupHmr(\n server: ViteDevServer,\n appDirPath: string,\n islandsDirPath: string,\n contentDirPath: string,\n root: string,\n generatedEntry: string,\n hydrateImport: string,\n routerImport: string,\n routerOptions: ElurJsKitViteOptions[\"router\"],\n invalidate: () => void,\n) {\n const isRelevant = (path: string) =>\n path.startsWith(appDirPath) || path.startsWith(islandsDirPath) || path.startsWith(contentDirPath);\n\n async function regenerateIslandEntry() {\n const islands = await scanIslands(islandsDirPath);\n const entryPath = resolve(root, generatedEntry);\n const source = buildEntrySource(islands, entryPath, hydrateImport, routerImport, routerOptions);\n await mkdir(dirname(entryPath), { recursive: true });\n await writeFile(entryPath, source, \"utf8\");\n const entryMod = server.moduleGraph.getModuleById(entryPath);\n if (entryMod) server.moduleGraph.invalidateModule(entryMod);\n }\n\n server.watcher.on(\"change\", async (path) => {\n if (!isRelevant(path)) return;\n invalidate();\n const mod = server.moduleGraph.getModuleById(path);\n if (mod) server.moduleGraph.invalidateModule(mod);\n if (path.startsWith(islandsDirPath)) {\n await regenerateIslandEntry();\n console.log(\"[elur-kit] HMR reload islands after change:\", path);\n } else if (path.startsWith(contentDirPath) && path.endsWith(\".md\")) {\n console.log(\"[elur-kit] HMR content changed:\", path);\n } else if (path.includes(\".action.ts\") || path.includes(\".data.ts\") || path.includes(\"page.ts\") || path.includes(\"layout.ts\")) {\n console.log(\"[elur-kit] HMR reload routes/actions after change:\", path);\n }\n });\n\n server.watcher.on(\"add\", async (path) => {\n if (!isRelevant(path)) return;\n invalidate();\n if (path.startsWith(islandsDirPath)) {\n await regenerateIslandEntry();\n }\n console.log(\"[elur-kit] HMR new file detected:\", path);\n });\n\n server.watcher.on(\"unlink\", async (path) => {\n if (!isRelevant(path)) return;\n invalidate();\n const mod = server.moduleGraph.getModuleById(path);\n if (mod) server.moduleGraph.invalidateModule(mod);\n if (path.startsWith(islandsDirPath)) {\n await regenerateIslandEntry();\n }\n console.log(\"[elur-kit] HMR file removed:\", path);\n });\n}\n\nfunction createSsrLoader(server: ViteDevServer, root: string) {\n return (filePath: string) => {\n const rel = relative(root, filePath);\n const url = \"/\" + rel.split(\"\\\\\").join(\"/\");\n return server.ssrLoadModule(url);\n };\n}\n\nfunction createActionResolver(\n getActions: () => import(\"../action/scan.js\").ActionRegistry,\n getRoutes: () => Awaited<ReturnType<typeof scanRoutes>> | null,\n ssrLoad: (path: string) => Promise<unknown>,\n) {\n return async (name: string, page?: string) => {\n const actions = getActions();\n const routes = getRoutes();\n let pageKey: string | undefined;\n if (page && routes) {\n pageKey = routes.pages.some((route) => route.path === page)\n ? page\n : (matchRoute(page, routes.pages)?.route.path ?? page);\n }\n const pageActions = pageKey ? actions[pageKey] : Object.values(actions).find((p) => p[name]) ?? undefined;\n const actionPath = pageActions ? pageActions[name] : undefined;\n if (!actionPath) return undefined;\n const mod = (await ssrLoad(actionPath)) as Record<string, unknown>;\n const action = mod[name];\n if (typeof action === \"function\") {\n return action as (...args: unknown[]) => unknown;\n }\n return undefined;\n };\n}\n\nfunction readRequestBody(req: Connect.IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n let body = \"\";\n req.setEncoding(\"utf8\");\n req.on(\"data\", (chunk) => {\n body += chunk;\n });\n req.on(\"end\", () => resolve(body));\n req.on(\"error\", reject);\n });\n}\n\ninterface SsrHandlerOptions {\n routes: Awaited<ReturnType<typeof scanRoutes>> | null;\n actions: ActionRegistry;\n clientEntry: string;\n lang: string;\n ssrLoad: (path: string) => Promise<unknown>;\n middlewareHeaders?: Record<string, string>;\n}\n\nasync function handleSsrRequest(\n req: Connect.IncomingMessage,\n res: import(\"node:http\").ServerResponse,\n _next: Connect.NextFunction,\n options: SsrHandlerOptions,\n): Promise<boolean> {\n if (!options.routes) return false;\n const publicActions = actionNames(options.actions);\n\n let urlPath = req.url ?? \"/\";\n if (urlPath.includes(\"?\")) urlPath = urlPath.split(\"?\")[0];\n\n // Let Vite handle its own internals and assets.\n if (urlPath.startsWith(\"/@\") || urlPath.startsWith(\"/node_modules/\")) {\n return false;\n }\n\n // Skip explicit file requests.\n if (urlPath.includes(\".\")) return false;\n\n const config = { lang: options.lang, clientEntry: options.clientEntry };\n const match = matchRoute(urlPath, options.routes.pages);\n if (match) {\n try {\n const request = incomingMessageToRequest(req);\n if (options.middlewareHeaders) {\n for (const [name, value] of Object.entries(options.middlewareHeaders)) request.headers.set(name, value);\n }\n const { html, clearActionErrorCookie } = await renderPage({\n route: match.route,\n params: match.params,\n searchParams: new URLSearchParams(req.url?.split(\"?\")[1] ?? \"\"),\n config,\n importer: options.ssrLoad,\n actions: publicActions,\n request,\n });\n const responseHeaders: Record<string, string> = {\n \"Content-Type\": \"text/html; charset=utf-8\",\n \"Cache-Control\": \"no-store, must-revalidate\",\n };\n if (clearActionErrorCookie) responseHeaders[\"Set-Cookie\"] = clearActionErrorCookie;\n res.writeHead(200, responseHeaders);\n res.end(html);\n return true;\n } catch (err) {\n console.error(\"[elur-kit] SSR render error:\", err);\n const errorResult = await renderErrorPage({\n routes: options.routes,\n status: 500,\n error: err,\n config,\n actions: publicActions,\n importer: options.ssrLoad,\n });\n if (errorResult) {\n res.writeHead(errorResult.status, {\n \"Content-Type\": \"text/html; charset=utf-8\",\n \"Cache-Control\": \"no-store, must-revalidate\",\n });\n res.end(errorResult.html);\n } else {\n res.writeHead(500, {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n \"Cache-Control\": \"no-store, must-revalidate\",\n });\n res.end(String(err));\n }\n return true;\n }\n }\n\n const errorResult = await renderErrorPage({\n routes: options.routes,\n status: 404,\n config,\n actions: publicActions,\n importer: options.ssrLoad,\n });\n if (errorResult) {\n res.writeHead(errorResult.status, {\n \"Content-Type\": \"text/html; charset=utf-8\",\n \"Cache-Control\": \"no-store, must-revalidate\",\n });\n res.end(errorResult.html);\n return true;\n }\n\n return false;\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elurjs/kit",
3
- "version": "2.4.10",
3
+ "version": "2.5.1",
4
4
  "description": "Full-stack framework for Elur — file-based routing, SSG and islands.",
5
5
  "license": "MIT",
6
6
  "author": "Deiver Vasquez",
@@ -103,6 +103,14 @@
103
103
  "import": "./dist/lib/action/index.js",
104
104
  "require": "./dist/lib/action/index.cjs"
105
105
  },
106
+ "./cache": {
107
+ "types": {
108
+ "import": "./dist/lib/cache/index.d.ts",
109
+ "require": "./dist/lib/cache/index.d.cts"
110
+ },
111
+ "import": "./dist/lib/cache/index.js",
112
+ "require": "./dist/lib/cache/index.cjs"
113
+ },
106
114
  "./router": {
107
115
  "types": {
108
116
  "import": "./dist/lib/router/client.d.ts",
@@ -197,6 +205,9 @@
197
205
  "action": [
198
206
  "./dist/lib/action/index.d.ts"
199
207
  ],
208
+ "cache": [
209
+ "./dist/lib/cache/index.d.ts"
210
+ ],
200
211
  "router": [
201
212
  "./dist/lib/router/client.d.ts"
202
213
  ],
@@ -259,12 +270,16 @@
259
270
  "test:e2e:hmr": "playwright test --config example/playwright.config.ts"
260
271
  },
261
272
  "dependencies": {
273
+ "idiomorph": "^0.7.4",
262
274
  "tsx": "^4.23.12"
263
275
  },
264
276
  "peerDependencies": {
265
- "@elurjs/core": "^3.5.1",
266
- "@elurjs/vite-plugin-elur": "^2.0.2",
267
- "vite": "^7.0.0 || ^8.0.0"
277
+ "@elurjs/core": "^3.6.2",
278
+ "@elurjs/vite-plugin-elur": "^2.1.0",
279
+ "marked": "^16.0.0 || ^17.0.0 || ^18.0.0",
280
+ "sharp": "^0.33.0 || ^0.34.0 || ^0.35.0",
281
+ "vite": "^7.0.0 || ^8.0.0",
282
+ "zod": "^4.0.0"
268
283
  },
269
284
  "peerDependenciesMeta": {
270
285
  "marked": {
@@ -281,13 +296,15 @@
281
296
  }
282
297
  },
283
298
  "devDependencies": {
284
- "@elurjs/core": "^3.5.1",
285
- "@elurjs/vite-plugin-elur": "^2.0.2",
299
+ "@arethetypeswrong/cli": "^0.18.5",
300
+ "@elurjs/core": "^3.6.2",
301
+ "@elurjs/vite-plugin-elur": "^2.1.0",
286
302
  "@playwright/test": "^1.62.1",
287
- "@types/node": "^22.20.1",
303
+ "@types/node": "^26.5.0",
288
304
  "happy-dom": "^20.11.6",
305
+ "publint": "^0.3.24",
289
306
  "terser": "^5.50.0",
290
- "typescript": "^7.0.2",
307
+ "typescript": "~7.0.2",
291
308
  "vite": "^8.2.1"
292
309
  }
293
310
  }
@@ -1,2 +0,0 @@
1
- var e=Object.defineProperty,t=(t,n)=>{let r={};for(var i in t)e(r,i,{get:t[i],enumerable:!0});return n||e(r,Symbol.toStringTag,{value:`Module`}),r},n=t({ActionFailure:()=>r,RedirectResponse:()=>i,fail:()=>a,isActionFailure:()=>s,isRedirectResponse:()=>c,publicErrorResponse:()=>u,redirect:()=>o,toPublicErrorInfo:()=>l}),r=class{status;data;__elur_js_action_failure=!0;constructor(e,t){this.status=e,this.data=t}},i=class{status;location;__elur_js_action_redirect=!0;constructor(e,t){this.status=e,this.location=t}};function a(e,t){return typeof e==`number`?new r(e,t):new r(t??400,e)}function o(e,t){return typeof e==`number`?new i(e,t):new i(t??303,e)}function s(e){return typeof e==`object`&&!!e&&e.__elur_js_action_failure===!0}function c(e){return typeof e==`object`&&!!e&&e.__elur_js_action_redirect===!0}function l(e,t={}){let n=`INTERNAL_SERVER_ERROR`;return t.includeDetail&&e instanceof Error&&e.message?{code:n,status:500,message:e.message}:{code:n,status:500,message:`Internal Server Error`}}function u(e,t={}){let n=l(e,t),r={"Content-Type":`application/json; charset=utf-8`,"Cache-Control":`no-store`};return t.requestId&&(r[`X-Request-Id`]=t.requestId),new Response(JSON.stringify({error:n}),{status:n.status,headers:r})}Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return t}});
2
- //# sourceMappingURL=errors-0X7pCFNU.cjs.map