vinojs 0.1.2 → 0.2.0

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 (60) hide show
  1. package/README.md +23 -18
  2. package/dist/client.d.mts +74 -8
  3. package/dist/client.d.mts.map +1 -1
  4. package/dist/client.mjs +194 -53
  5. package/dist/client.mjs.map +1 -1
  6. package/dist/component-wrap.mjs +1 -1
  7. package/dist/config-CXHX9qZs.mjs +17 -0
  8. package/dist/config-CXHX9qZs.mjs.map +1 -0
  9. package/dist/{constants-BVT2bJEd.mjs → constants-DyXAsId-.mjs} +2 -3
  10. package/dist/constants-DyXAsId-.mjs.map +1 -0
  11. package/dist/definePage-DC6gJKwW.mjs +468 -0
  12. package/dist/definePage-DC6gJKwW.mjs.map +1 -0
  13. package/dist/{defineServerFn-H-bz7xBX.mjs → defineServerFn-DH6B99bH.mjs} +2 -17
  14. package/dist/defineServerFn-DH6B99bH.mjs.map +1 -0
  15. package/dist/factory-0LjmIY5F.mjs +123 -0
  16. package/dist/factory-0LjmIY5F.mjs.map +1 -0
  17. package/dist/factory.d.mts +38 -2
  18. package/dist/factory.d.mts.map +1 -0
  19. package/dist/factory.mjs +4 -153
  20. package/dist/hydration.d.mts +3 -0
  21. package/dist/hydration.mjs +2 -0
  22. package/dist/jsx-dev-runtime.client.d.mts +2 -0
  23. package/dist/jsx-dev-runtime.client.mjs +2 -0
  24. package/dist/jsx-dev-runtime.d.mts +2 -0
  25. package/dist/jsx-dev-runtime.mjs +2 -0
  26. package/dist/jsx-runtime-5OIvn_Qa.mjs +335 -0
  27. package/dist/jsx-runtime-5OIvn_Qa.mjs.map +1 -0
  28. package/dist/jsx-runtime-BLN--agM.d.mts +20 -0
  29. package/dist/jsx-runtime-BLN--agM.d.mts.map +1 -0
  30. package/dist/jsx-runtime.client.d.mts +2 -0
  31. package/dist/jsx-runtime.client.mjs +2 -0
  32. package/dist/jsx-runtime.d.mts +2 -0
  33. package/dist/jsx-runtime.mjs +2 -0
  34. package/dist/mount.d.mts +17 -0
  35. package/dist/mount.d.mts.map +1 -0
  36. package/dist/mount.mjs +107 -0
  37. package/dist/mount.mjs.map +1 -0
  38. package/dist/render-Cif1RZMC.d.mts +169 -0
  39. package/dist/render-Cif1RZMC.d.mts.map +1 -0
  40. package/dist/{types-CQITdkpF.d.mts → types-jfsZLl9U.d.mts} +10 -8
  41. package/dist/types-jfsZLl9U.d.mts.map +1 -0
  42. package/dist/vino.d.mts +1 -37
  43. package/dist/vino.d.mts.map +1 -1
  44. package/dist/vino.mjs +2 -201
  45. package/dist/vite.d.mts +1 -1
  46. package/dist/vite.d.mts.map +1 -1
  47. package/dist/vite.mjs +175 -40
  48. package/dist/vite.mjs.map +1 -1
  49. package/package.json +29 -5
  50. package/dist/compile-glNMkyyx.mjs +0 -111
  51. package/dist/compile-glNMkyyx.mjs.map +0 -1
  52. package/dist/constants-BVT2bJEd.mjs.map +0 -1
  53. package/dist/definePage--9Pz7rHs.mjs +0 -73
  54. package/dist/definePage--9Pz7rHs.mjs.map +0 -1
  55. package/dist/defineServerFn-H-bz7xBX.mjs.map +0 -1
  56. package/dist/factory-CVT0-OZw.d.mts +0 -187
  57. package/dist/factory-CVT0-OZw.d.mts.map +0 -1
  58. package/dist/factory.mjs.map +0 -1
  59. package/dist/types-CQITdkpF.d.mts.map +0 -1
  60. package/dist/vino.mjs.map +0 -1
package/dist/vite.mjs CHANGED
@@ -1,19 +1,119 @@
1
- import { d as VIRTUAL_ASSETS, f as VIRTUAL_CLIENT, g as VIRTUAL_SSR_HOOKS, h as VIRTUAL_MANIFEST, m as VIRTUAL_COMPONENTS, p as VIRTUAL_CLIENT_PAGES, s as PAGE_EXTS, u as SHELL_HEADER } from "./constants-BVT2bJEd.mjs";
2
- import { c as usesDefinePage, o as readPageDefinition } from "./definePage--9Pz7rHs.mjs";
3
- import { a as pathDepth, i as pathCovers, n as compareRoutes, o as urlToHtmlFile, r as compileFilePath, s as loadMergedConfig, t as applyParams$1 } from "./compile-glNMkyyx.mjs";
4
- import { n as SERVER_FN_KIND, o as usesDefineServerFn, t as DEFINE_SERVER_FN_CALL } from "./defineServerFn-H-bz7xBX.mjs";
1
+ import { d as VIRTUAL_CLIENT, f as VIRTUAL_CLIENT_PAGES, h as VIRTUAL_SSR_HOOKS, m as VIRTUAL_MANIFEST, p as VIRTUAL_COMPONENTS, s as PAGE_EXTS, u as VIRTUAL_ASSETS } from "./constants-DyXAsId-.mjs";
2
+ import { d as readPageDefinition, p as usesDefinePage } from "./definePage-DC6gJKwW.mjs";
3
+ import { t as loadMergedConfig } from "./config-CXHX9qZs.mjs";
4
+ import { n as SERVER_FN_KIND, o as usesDefineServerFn, t as DEFINE_SERVER_FN_CALL } from "./defineServerFn-DH6B99bH.mjs";
5
5
  import { existsSync, readFileSync } from "node:fs";
6
6
  import { dirname, isAbsolute, join, relative } from "node:path";
7
7
  import { pathToFileURL } from "node:url";
8
8
  import { mkdir, readFile, readdir, writeFile } from "node:fs/promises";
9
- //#region src/vino/prerender.ts
10
- async function collectPrerenderUrls(pages) {
9
+ //#region src/vite/compile.ts
10
+ const GROUP_RE = /^\([^)]+\)$/;
11
+ const CATCH_ALL_RE = /^\[\.\.\.(.+)\]$/;
12
+ const PARAM_RE = /^\[([^\]]+)\]$/;
13
+ function toPosix$2(relativePath) {
14
+ return relativePath.replaceAll("\\", "/").replace(/^\.\//, "");
15
+ }
16
+ function stripExt(posixPath) {
17
+ return posixPath.replace(/\.(tsx|ts|jsx|js|mjs)$/, "");
18
+ }
19
+ /**
20
+ * Compile a pages-dir-relative file path to a Hono route.
21
+ * `(group)` dirs are omitted, `[param]` becomes `:param`, `[...slug]` becomes `:slug{.+}`,
22
+ * trailing `index` is dropped.
23
+ */
24
+ function compileFilePath(relativePath) {
25
+ const segs = stripExt(toPosix$2(relativePath)).split("/").filter(Boolean).filter((seg) => !GROUP_RE.test(seg));
26
+ if (segs.at(-1) === "index") segs.pop();
27
+ const out = [];
28
+ const paramNames = [];
29
+ let isCatchAll = false;
30
+ for (const seg of segs) {
31
+ const catchAll = CATCH_ALL_RE.exec(seg);
32
+ if (catchAll) {
33
+ paramNames.push(catchAll[1]);
34
+ out.push(`:${catchAll[1]}{.+}`);
35
+ isCatchAll = true;
36
+ continue;
37
+ }
38
+ const param = PARAM_RE.exec(seg);
39
+ if (param && !param[1].startsWith("...")) {
40
+ paramNames.push(param[1]);
41
+ out.push(`:${param[1]}`);
42
+ continue;
43
+ }
44
+ out.push(seg);
45
+ }
46
+ const pattern = out.length === 0 ? "/" : `/${out.join("/")}`;
47
+ const path = pattern.replaceAll("{.+}", "");
48
+ const isStatic = paramNames.length === 0 && !isCatchAll;
49
+ return {
50
+ path,
51
+ pattern,
52
+ isCatchAll,
53
+ isStatic,
54
+ paramNames
55
+ };
56
+ }
57
+ function pathSegments(path) {
58
+ return path.split("/").filter(Boolean);
59
+ }
60
+ function pathDepth(path) {
61
+ return pathSegments(path).length;
62
+ }
63
+ /**
64
+ * True if `parent` is `/` or a prefix of `child`.
65
+ * A `:param` segment in `parent` matches any child segment; a static parent
66
+ * segment does not match a param child segment.
67
+ */
68
+ function pathCovers(parent, child) {
69
+ if (parent === "/" || parent === "") return true;
70
+ const a = pathSegments(parent);
71
+ const b = pathSegments(child);
72
+ if (a.length > b.length) return false;
73
+ return a.every((seg, i) => {
74
+ if (seg === b[i]) return true;
75
+ if (seg.startsWith(":")) return true;
76
+ return false;
77
+ });
78
+ }
79
+ function applyParams$1(path, params) {
80
+ let url = path;
81
+ for (const [key, value] of Object.entries(params)) url = url.replace(`:${key}`, value);
82
+ if (!url.startsWith("/")) url = `/${url}`;
83
+ return url;
84
+ }
85
+ function urlToHtmlFile(url) {
86
+ const clean = url.split("?")[0].split("#")[0];
87
+ if (clean === "/") return "index.html";
88
+ const trimmed = clean.replace(/^\//, "").replace(/\/$/, "");
89
+ if (clean.endsWith("/")) return `${trimmed}/index.html`;
90
+ return `${trimmed}.html`;
91
+ }
92
+ function routeRank(pattern) {
93
+ if (pattern.includes("{.+}")) return 2;
94
+ if (pattern.includes(":")) return 1;
95
+ return 0;
96
+ }
97
+ function compareRoutes(a, b) {
98
+ const d = routeRank(a.pattern) - routeRank(b.pattern);
99
+ if (d !== 0) return d;
100
+ return b.pattern.length - a.pattern.length;
101
+ }
102
+ //#endregion
103
+ //#region src/vite/prerender.ts
104
+ /** Whether a page should be written during SSG. */
105
+ function shouldPrerenderPage(pageConfig, globalPrerender) {
106
+ if (pageConfig?.prerender === false) return false;
107
+ if (pageConfig?.prerender === true) return true;
108
+ return globalPrerender;
109
+ }
110
+ async function collectPrerenderUrls(pages, globalPrerender = true) {
11
111
  const urls = [];
12
112
  for (const page of pages) {
13
113
  const pageMod = await page.loadPage();
14
114
  const config = loadMergedConfig(page, pageMod);
115
+ if (!shouldPrerenderPage(config, globalPrerender)) continue;
15
116
  const ssgParams = config.ssgParams;
16
- if (config.prerender === false) continue;
17
117
  if (!page.isStatic) {
18
118
  if (!ssgParams) continue;
19
119
  const list = await ssgParams();
@@ -24,14 +124,13 @@ async function collectPrerenderUrls(pages) {
24
124
  }
25
125
  return [...new Set(urls)];
26
126
  }
127
+ /** Write full HTML documents for the given URLs (or all eligible pages). */
27
128
  async function prerender(options) {
28
- const globalMode = options.mode ?? "partial";
29
- if (globalMode === false && !options.urls?.length) return { files: [] };
30
- const urls = options.urls ?? await collectPrerenderUrls(options.pages);
129
+ if (options.enabled === false && !options.urls?.length) return { files: [] };
130
+ const urls = options.urls ?? await collectPrerenderUrls(options.pages, options.enabled !== false);
31
131
  const files = [];
32
132
  for (const url of urls) {
33
- const init = (options.urlModes?.[url] ?? (globalMode === false ? "full" : globalMode)) === "partial" ? { headers: { [SHELL_HEADER]: "1" } } : void 0;
34
- const res = await options.app.request(url, init);
133
+ const res = await options.app.request(url);
35
134
  if (!res.ok) {
36
135
  console.warn(`[vino] skip prerender ${url} (${res.status})`);
37
136
  continue;
@@ -362,7 +461,7 @@ function resolveOptions(options = {}) {
362
461
  layoutsDir: options.layoutsDir ?? "src/layout",
363
462
  componentsDir: options.componentsDir ?? "src/components",
364
463
  entry: options.entry ?? "src/server.ts",
365
- prerender: options.prerender ?? "partial",
464
+ prerender: options.prerender === true,
366
465
  clientRouting: options.clientRouting ?? true,
367
466
  client: options.client
368
467
  };
@@ -405,8 +504,10 @@ function generateComponents(tree, root) {
405
504
  function generateClientPages(tree) {
406
505
  return `export const clientPages = {\n${tree.pages.filter((p) => p.isClientPage).map((p) => `${JSON.stringify(p.path)}: () => import(${importPath(p.pageFile)})`).join(",\n")}\n}\n`;
407
506
  }
408
- function rewriteJsxToDom(code) {
409
- return code.replaceAll("hono/jsx/jsx-runtime", "hono/jsx/dom/jsx-runtime").replaceAll("hono/jsx/jsx-dev-runtime", "hono/jsx/dom/jsx-dev-runtime").replaceAll(/from\s*(['"])hono\/jsx\1/g, "from $1hono/jsx/dom$1");
507
+ function rewriteJsxToClient(code, isDev) {
508
+ const jsxRuntime = isDev ? "vinojs/jsx-dev-runtime" : "vinojs/jsx-runtime";
509
+ const jsxDevRuntime = "vinojs/jsx-dev-runtime";
510
+ return code.replaceAll("hono/jsx/jsx-runtime", jsxRuntime).replaceAll("hono/jsx/jsx-dev-runtime", jsxDevRuntime).replaceAll("hono/jsx/dom/jsx-runtime", jsxRuntime).replaceAll("hono/jsx/dom/jsx-dev-runtime", jsxDevRuntime).replace(/from\s*([`'"])[^`'"]*hono[^`'"]*\/jsx\/(?:dom\/)?jsx-dev-runtime\.js[^`'"]*\1/g, `from $1${jsxDevRuntime}$1`).replace(/from\s*([`'"])[^`'"]*hono[^`'"]*\/jsx\/(?:dom\/)?jsx-runtime\.js[^`'"]*\1/g, `from $1${jsxRuntime}$1`).replaceAll(/from\s*(['"])hono\/jsx(?:\/dom)?\1/g, "from $1vinojs/client$1");
410
511
  }
411
512
  let cachedTree;
412
513
  let cachedRoot;
@@ -503,13 +604,41 @@ function vino(options = {}) {
503
604
  resolve: { noExternal: ["vinojs", "hono"] },
504
605
  optimizeDeps: { exclude: ["hono"] }
505
606
  };
506
- if (name === "client") return { build: { rollupOptions: {
507
- input: { "vino-client": VIRTUAL_CLIENT },
508
- output: { entryFileNames: (chunk) => {
509
- if (chunk.name === "vino-client") return "assets/vino-client.js";
510
- return "assets/[name]-[hash].js";
607
+ if (name === "client") return {
608
+ resolve: { alias: [
609
+ {
610
+ find: "hono/jsx/jsx-dev-runtime",
611
+ replacement: "vinojs/jsx-dev-runtime"
612
+ },
613
+ {
614
+ find: "hono/jsx/jsx-runtime",
615
+ replacement: "vinojs/jsx-runtime"
616
+ },
617
+ {
618
+ find: "hono/jsx/dom/jsx-dev-runtime",
619
+ replacement: "vinojs/jsx-dev-runtime"
620
+ },
621
+ {
622
+ find: "hono/jsx/dom/jsx-runtime",
623
+ replacement: "vinojs/jsx-runtime"
624
+ },
625
+ {
626
+ find: /^hono\/jsx\/dom$/,
627
+ replacement: "vinojs/client"
628
+ },
629
+ {
630
+ find: /^hono\/jsx$/,
631
+ replacement: "vinojs/client"
632
+ }
633
+ ] },
634
+ build: { rollupOptions: {
635
+ input: { "vino-client": VIRTUAL_CLIENT },
636
+ output: { entryFileNames: (chunk) => {
637
+ if (chunk.name === "vino-client") return "assets/vino-client.js";
638
+ return "assets/[name]-[hash].js";
639
+ } }
511
640
  } }
512
- } } };
641
+ };
513
642
  },
514
643
  configResolved(c) {
515
644
  config = c;
@@ -582,8 +711,10 @@ export * from 'hono/jsx'
582
711
  if (id === RESOLVED.client) {
583
712
  const user = resolved.client;
584
713
  const userAbs = user ? isAbsolute(user) ? user : join(root, user) : void 0;
585
- return `${userAbs && existsSync(userAbs) ? `import ${importPath(userAbs)}\n` : ""}import { createClient } from 'vinojs/client'
586
- const vino = createClient()
714
+ return `${userAbs && existsSync(userAbs) ? `import ${importPath(userAbs)}\n` : ""}import { components } from '${VIRTUAL_COMPONENTS}'
715
+ import { clientPages } from '${VIRTUAL_CLIENT_PAGES}'
716
+ import { createClient } from 'vinojs/client'
717
+ const vino = createClient({ components, clientPages })
587
718
  if (import.meta.hot) {
588
719
  import.meta.hot.accept()
589
720
  import.meta.hot.on(${JSON.stringify(VINO_HMR_EVENT)}, (data) => vino.hmr(data))
@@ -641,7 +772,7 @@ export default wrapComponent(Component, ${JSON.stringify(cid)}, 'default')
641
772
  code: code.replaceAll(/from\s*(['"])hono\/jsx(?:\/dom)?\1/g, `from '${VIRTUAL_SSR_HOOKS}'`),
642
773
  map: null
643
774
  };
644
- let next = rewriteJsxToDom(code);
775
+ let next = rewriteJsxToClient(code, command === "serve");
645
776
  if (command === "serve") {
646
777
  if (hydratable) next += hmrAcceptSnippet("component", componentId(file, config?.root ?? process.cwd()));
647
778
  else if (clientPage) {
@@ -655,6 +786,21 @@ export default wrapComponent(Component, ${JSON.stringify(cid)}, 'default')
655
786
  };
656
787
  }
657
788
  },
789
+ {
790
+ name: "vino:client-jsx",
791
+ enforce: "post",
792
+ transform(code, id) {
793
+ if (this.environment?.name !== "client") return null;
794
+ if (id.includes("node_modules") && !id.includes("vino")) return null;
795
+ if (!code.includes("hono") || !/jsx(?:-dev)?-runtime/.test(code)) return null;
796
+ const next = rewriteJsxToClient(code, command === "serve");
797
+ if (next === code) return null;
798
+ return {
799
+ code: next,
800
+ map: null
801
+ };
802
+ }
803
+ },
658
804
  {
659
805
  name: "vino:prerender",
660
806
  apply: "build",
@@ -687,25 +833,15 @@ export default wrapComponent(Component, ${JSON.stringify(cid)}, 'default')
687
833
  return import(pathToFileURL(join(ssrOutDir, chunk.file)).href);
688
834
  };
689
835
  const urls = [];
690
- const urlModes = {};
691
836
  for (const page of tree.pages) {
692
837
  const pageMod = await loadBuilt(page.pageFile);
693
838
  const inline = readPageDefinition(pageMod && typeof pageMod === "object" ? pageMod.default : void 0);
694
- const pagePrerender = inline?.config?.prerender ?? resolved.prerender;
695
- if (pagePrerender === false) continue;
839
+ if (!shouldPrerenderPage(inline?.config, resolved.prerender)) continue;
696
840
  const ssgParams = inline?.config?.ssgParams;
697
- const mode = pagePrerender === "full" ? "full" : "partial";
698
- if (page.isStatic) {
699
- const url = page.path;
700
- urls.push(url);
701
- urlModes[url] = mode;
702
- } else if (ssgParams) {
841
+ if (page.isStatic) urls.push(page.path);
842
+ else if (ssgParams) {
703
843
  const list = await ssgParams();
704
- for (const params of list) {
705
- const url = applyParams(page.path, params);
706
- urls.push(url);
707
- urlModes[url] = mode;
708
- }
844
+ for (const params of list) urls.push(applyParams(page.path, params));
709
845
  }
710
846
  }
711
847
  const result = await prerender({
@@ -713,8 +849,7 @@ export default wrapComponent(Component, ${JSON.stringify(cid)}, 'default')
713
849
  pages: [],
714
850
  urls,
715
851
  outDir: clientOut,
716
- mode: resolved.prerender,
717
- urlModes
852
+ enabled: true
718
853
  });
719
854
  if (result.files.length) console.info(`[vino] prerendered ${result.files.length} page(s) → ${clientOut}`);
720
855
  } catch (err) {
package/dist/vite.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"vite.mjs","names":["applyParams","toPosix"],"sources":["../src/vino/prerender.ts","../src/vite/files.ts","../src/vite/crawl.ts","../src/vite/match.ts","../src/vite/hmr.ts","../src/vite/server-fn.ts","../src/vite/plugin.ts"],"sourcesContent":["import { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { applyParams, urlToHtmlFile } from \"./compile.ts\";\nimport { SHELL_HEADER } from \"./constants.ts\";\nimport { loadMergedConfig } from \"./config.ts\";\nimport type { ManifestPage, PageConfig } from \"./types.ts\";\n\nexport interface PrerenderApp {\n request: (input: string | Request, init?: RequestInit) => Promise<Response>;\n}\n\nexport async function collectPrerenderUrls(pages: ManifestPage[]): Promise<string[]> {\n const urls: string[] = [];\n for (const page of pages) {\n const pageMod = await page.loadPage();\n const config = loadMergedConfig(page, pageMod);\n const ssgParams = config.ssgParams;\n if (config.prerender === false) continue;\n if (!page.isStatic) {\n if (!ssgParams) continue;\n const list = await ssgParams();\n for (const params of list) urls.push(applyParams(page.path, params));\n continue;\n }\n urls.push(page.path === \"\" ? \"/\" : page.path);\n }\n return [...new Set(urls)];\n}\n\nfunction resolvePagePrerender(\n pageConfig: PageConfig | undefined,\n defaultMode: \"full\" | \"partial\" | false,\n): \"full\" | \"partial\" | false {\n if (pageConfig?.prerender !== undefined) return pageConfig.prerender;\n return defaultMode;\n}\n\nexport async function prerender(options: {\n app: PrerenderApp;\n pages: ManifestPage[];\n outDir: string;\n urls?: string[];\n /** Global prerender mode from vino({ prerender }). */\n mode?: \"full\" | \"partial\" | false;\n /** Per-url mode override (from page config). */\n urlModes?: Record<string, \"full\" | \"partial\">;\n}): Promise<{ files: string[] }> {\n const globalMode = options.mode ?? \"partial\";\n if (globalMode === false && !options.urls?.length) return { files: [] };\n\n const urls = options.urls ?? (await collectPrerenderUrls(options.pages));\n const files: string[] = [];\n for (const url of urls) {\n const mode = options.urlModes?.[url] ?? (globalMode === false ? \"full\" : globalMode);\n const init: RequestInit | undefined =\n mode === \"partial\" ? { headers: { [SHELL_HEADER]: \"1\" } } : undefined;\n const res = await options.app.request(url, init);\n if (!res.ok) {\n console.warn(`[vino] skip prerender ${url} (${res.status})`);\n continue;\n }\n const html = await res.text();\n const rel = urlToHtmlFile(url);\n const dest = join(options.outDir, rel);\n await mkdir(dirname(dest), { recursive: true });\n await writeFile(dest, html);\n files.push(rel);\n }\n return { files };\n}\n\nexport { resolvePagePrerender };\n","import { PAGE_EXTS } from \"../vino/constants.ts\";\n\nexport function stripKnownExt(fileName: string): string {\n for (const ext of PAGE_EXTS) {\n if (fileName.endsWith(ext)) return fileName.slice(0, -ext.length);\n }\n return fileName;\n}\n\nexport function isPageExt(fileName: string): boolean {\n if (fileName.endsWith(\".d.ts\")) return false;\n return PAGE_EXTS.some((ext) => fileName.endsWith(ext));\n}\n\n/** Colocated server modules (`[slug].server.ts`) — not filesystem routes. */\nexport function isServerModuleFile(filePath: string): boolean {\n const base = filePath.split(/[/\\\\]/).at(-1) ?? filePath;\n return /\\.server\\.(tsx|ts|jsx|js|mjs)$/.test(base);\n}\n\nexport function isIgnoredPageFile(fileName: string): boolean {\n const base = fileName.split(\"/\").at(-1) ?? fileName;\n if (base.startsWith(\".\")) return true;\n if (base.endsWith(\".d.ts\")) return true;\n if (isServerModuleFile(base)) return true;\n const name = stripKnownExt(base);\n if (name.startsWith(\"_\") || name.startsWith(\"+\")) return true;\n return false;\n}\n\nexport function isNamedComponentFile(filePath: string): boolean {\n return /\\.component\\.(tsx|ts|jsx|js|mjs)$/.test(filePath);\n}\n\nexport function isHydratableComponentFile(filePath: string, componentsDir: string): boolean {\n const posix = filePath.replaceAll(\"\\\\\", \"/\");\n const dir = componentsDir.replaceAll(\"\\\\\", \"/\").replace(/\\/$/, \"\");\n if (posix.includes(`/${dir}/`) || posix.startsWith(`${dir}/`) || posix.includes(`${dir}/`)) {\n const after = posix.split(`/${dir}/`).at(-1) ?? posix;\n if (after && isPageExt(after) && !isIgnoredPageFile(after)) return true;\n }\n if (isNamedComponentFile(posix)) return true;\n return false;\n}\n","import { readdir, readFile } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport {\n compileFilePath,\n compareRoutes,\n pathCovers,\n pathDepth,\n type CompiledRoute,\n} from \"../vino/compile.ts\";\nimport { usesDefinePage } from \"../vino/definePage.ts\";\nimport { isIgnoredPageFile, isNamedComponentFile, isPageExt } from \"./files.ts\";\n\nexport type CrawledPage = CompiledRoute & {\n id: string;\n pageFile: string;\n isClientPage: boolean;\n layouts: string[];\n};\n\nexport interface CrawledWrapper {\n file: string;\n path: string;\n}\n\nexport interface CrawledTree {\n pages: CrawledPage[];\n components: string[];\n}\n\nfunction toPosix(p: string): string {\n return p.replaceAll(\"\\\\\", \"/\");\n}\n\nasync function walkFiles(dir: string): Promise<string[]> {\n const out: string[] = [];\n let entries;\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return out;\n }\n for (const entry of entries) {\n if (entry.name.startsWith(\".\")) continue;\n const full = join(dir, entry.name);\n if (entry.isDirectory()) {\n if (entry.name === \"node_modules\") continue;\n out.push(...(await walkFiles(full)));\n } else {\n out.push(full);\n }\n }\n return out;\n}\n\nexport async function crawlWrappers(dirAbs: string): Promise<CrawledWrapper[]> {\n const files = await walkFiles(dirAbs);\n const byPath = new Map<string, string>();\n for (const file of files) {\n const rel = toPosix(relative(dirAbs, file));\n const base = rel.split(\"/\").at(-1) ?? rel;\n if (!isPageExt(base) || isIgnoredPageFile(base)) continue;\n const compiled = compileFilePath(rel);\n byPath.set(compiled.path, file);\n }\n return [...byPath.entries()].map(([path, file]) => ({ path, file }));\n}\n\nexport function wrappersForPath(wrappers: CrawledWrapper[], pagePath: string): string[] {\n return wrappers\n .filter((w) => pathCovers(w.path, pagePath))\n .sort((a, b) => pathDepth(a.path) - pathDepth(b.path) || a.path.localeCompare(b.path))\n .map((w) => w.file);\n}\n\nexport async function crawlPages(options: {\n root: string;\n pagesDir: string;\n componentsDir: string;\n layoutsDir: string;\n}): Promise<CrawledTree> {\n const pagesAbs = join(options.root, options.pagesDir);\n const componentsAbs = join(options.root, options.componentsDir);\n const layoutsAbs = join(options.root, options.layoutsDir);\n const files = await walkFiles(pagesAbs);\n const compiledPages: { file: string; rel: string; compiled: CompiledRoute }[] = [];\n\n for (const file of files) {\n const rel = toPosix(relative(pagesAbs, file));\n const base = rel.split(\"/\").at(-1) ?? rel;\n if (!isPageExt(base)) continue;\n if (isNamedComponentFile(rel) || isIgnoredPageFile(base)) continue;\n compiledPages.push({ file, rel, compiled: compileFilePath(rel) });\n }\n\n const layouts = await crawlWrappers(layoutsAbs);\n\n const byPath = new Map<string, (typeof compiledPages)[number]>();\n for (const item of compiledPages) {\n byPath.set(item.compiled.path, item);\n }\n\n const pages: CrawledPage[] = [];\n for (const [urlPath, item] of byPath) {\n const compiled = item.compiled;\n const pageFile = item.file;\n const isClientPage = usesDefinePage(await readFile(pageFile, \"utf8\"));\n pages.push({\n ...compiled,\n path: urlPath,\n isClientPage,\n id: urlPath,\n pageFile,\n layouts: wrappersForPath(layouts, urlPath),\n });\n }\n\n pages.sort(compareRoutes);\n\n const componentFiles = [\n ...(await walkFiles(componentsAbs)),\n ...(await walkFiles(join(options.root, \"src\"))).filter((f) => isNamedComponentFile(toPosix(f))),\n ];\n const components = [...new Set(componentFiles)]\n .filter((file) => {\n const rel = toPosix(relative(options.root, file));\n const base = rel.split(\"/\").at(-1) ?? rel;\n return isPageExt(base) && !isIgnoredPageFile(base);\n })\n .sort();\n\n return { pages, components };\n}\n\nexport function componentId(absFile: string, root: string): string {\n const rel = toPosix(relative(root, absFile));\n return `/${rel}`;\n}\n","import { isHydratableComponentFile } from \"./files.ts\";\nimport { usesDefinePage } from \"../vino/definePage.ts\";\n\nexport function isSourceDirFile(id: string, dir: string): boolean {\n const file = id.split(\"?\")[0].replaceAll(\"\\\\\", \"/\");\n if (file.includes(\"/node_modules/\")) return false;\n const prefix = dir.replaceAll(\"\\\\\", \"/\").replace(/\\/$/, \"\");\n return file.includes(`/${prefix}/`) || file.startsWith(`${prefix}/`);\n}\n\nexport function isHydratableComponentId(id: string, componentsDir: string): boolean {\n const file = id.split(\"?\")[0].replaceAll(\"\\\\\", \"/\");\n if (file.includes(\"/node_modules/\")) return false;\n return isHydratableComponentFile(file, componentsDir);\n}\n\nexport function isPagesDirFile(id: string, pagesDir: string): boolean {\n return isSourceDirFile(id, pagesDir);\n}\n\nexport function isLayoutsDirFile(id: string, layoutsDir: string): boolean {\n return isSourceDirFile(id, layoutsDir);\n}\n\nexport function isClientPageModule(id: string, code: string, pagesDir: string): boolean {\n return isPagesDirFile(id, pagesDir) && usesDefinePage(code);\n}\n","import { usesDefinePage } from \"../vino/definePage.ts\";\nimport { isHydratableComponentFile, isPageExt, isServerModuleFile } from \"./files.ts\";\nimport { isLayoutsDirFile, isPagesDirFile } from \"./match.ts\";\n\nexport const VINO_HMR_EVENT = \"vino:hmr\";\n\nexport type VinoHmrKind = \"component\" | \"client-page\" | \"ssr\" | \"layout\";\n\nexport function hmrAcceptSnippet(kind: \"component\" | \"client-page\", id: string): string {\n return `\nif (import.meta.hot) {\n import.meta.hot.accept((mod) => {\n globalThis.__VINO_HMR__?.({ kind: ${JSON.stringify(kind)}, id: ${JSON.stringify(id)}, mod })\n })\n}\n`;\n}\n\nexport function hmrRegistrySnippet(exportName: \"components\" | \"clientPages\"): string {\n return `\nif (import.meta.hot) {\n import.meta.hot.accept((mod) => {\n globalThis.__VINO_HMR__?.({ kind: \"registry\", ${exportName}: mod?.${exportName} })\n })\n}\n`;\n}\n\nexport function classifyHmrFile(\n file: string,\n options: {\n pagesDir: string;\n layoutsDir: string;\n componentsDir: string;\n clientPageFiles?: Iterable<string>;\n },\n): VinoHmrKind | undefined {\n const posix = file.split(\"?\")[0].replaceAll(\"\\\\\", \"/\");\n if (posix.includes(\"/node_modules/\")) return;\n const base = posix.split(\"/\").at(-1) ?? posix;\n if (!isPageExt(base) && !isServerModuleFile(posix)) return;\n\n if (isHydratableComponentFile(posix, options.componentsDir)) return \"component\";\n if (isLayoutsDirFile(posix, options.layoutsDir)) return \"layout\";\n if (!isPagesDirFile(posix, options.pagesDir)) return;\n if (isServerModuleFile(posix)) return \"ssr\";\n\n const clientFiles = new Set(\n [...(options.clientPageFiles ?? [])].map((entry) => entry.replaceAll(\"\\\\\", \"/\")),\n );\n if (clientFiles.has(posix)) return \"client-page\";\n return \"ssr\";\n}\n\nexport function clientPageFlagChanged(\n file: string,\n tree: { pages: { pageFile: string; isClientPage: boolean }[] } | undefined,\n code: string,\n): boolean {\n const posix = file.replaceAll(\"\\\\\", \"/\");\n const page = tree?.pages.find((entry) => entry.pageFile.replaceAll(\"\\\\\", \"/\") === posix);\n if (!page) return false;\n return usesDefinePage(code) !== page.isClientPage;\n}\n","import { DEFINE_SERVER_FN_CALL, SERVER_FN_KIND, usesDefineServerFn } from \"../vino/defineServerFn.ts\";\n\nconst CLIENT_STUB_ERROR = \"[vino] server function cannot run on the client\";\n\nexport function listModuleExports(code: string): { hasDefault: boolean; named: string[] } {\n const named = new Set<string>();\n let hasDefault = /(?:^|[\\n\\r;])\\s*export\\s+default\\b/.test(code);\n\n for (const m of code.matchAll(/\\bexport\\s+(?:async\\s+)?(?:function|class)\\s+([A-Za-z_$][\\w$]*)/g)) {\n named.add(m[1]);\n }\n for (const m of code.matchAll(/\\bexport\\s+(?:const|let|var)\\s+([A-Za-z_$][\\w$]*)/g)) {\n named.add(m[1]);\n }\n for (const m of code.matchAll(/\\bexport\\s*\\{([^}]+)\\}/g)) {\n for (const part of m[1].split(\",\")) {\n const bits = part.trim();\n if (!bits) continue;\n const asMatch = /\\bas\\s+([A-Za-z_$][\\w$]*)$/.exec(bits);\n const name = asMatch ? asMatch[1] : bits.split(/\\s+/)[0];\n if (name === \"default\") hasDefault = true;\n else if (name) named.add(name);\n }\n }\n\n return { hasDefault, named: [...named] };\n}\n\nfunction stubFn(id: string): string {\n return `Object.assign(function(){throw new Error(${JSON.stringify(CLIENT_STUB_ERROR)})},{kind:${JSON.stringify(SERVER_FN_KIND)},id:${JSON.stringify(id)}})`;\n}\n\n/** Replace a `*.server.*` module with client stubs of its exports (implementation stays on the server). */\nexport function stubServerModule(code: string, fileId: string): string {\n const { hasDefault, named } = listModuleExports(code);\n const lines: string[] = [];\n for (const name of named) {\n lines.push(`export const ${name} = ${stubFn(`${fileId}#${name}`)}`);\n }\n if (hasDefault || named.length === 0) {\n lines.push(`export default ${stubFn(`${fileId}#default`)}`);\n }\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction skipQuoted(code: string, start: number): number {\n const quote = code[start];\n let escaped = false;\n for (let i = start + 1; i < code.length; i++) {\n const ch = code[i];\n if (!escaped && ch === quote) return i + 1;\n escaped = !escaped && ch === \"\\\\\";\n }\n return code.length;\n}\n\nfunction findMatchingParen(code: string, openIndex: number): number {\n let depth = 0;\n for (let i = openIndex; i < code.length; i++) {\n const ch = code[i];\n const next = code[i + 1];\n if (ch === \"'\" || ch === '\"' || ch === \"`\") {\n i = skipQuoted(code, i) - 1;\n continue;\n }\n if (ch === \"/\" && next === \"/\") {\n const nl = code.indexOf(\"\\n\", i);\n if (nl < 0) return -1;\n i = nl;\n continue;\n }\n if (ch === \"/\" && next === \"*\") {\n const end = code.indexOf(\"*/\", i + 2);\n if (end < 0) return -1;\n i = end + 1;\n continue;\n }\n if (ch === \"(\") depth++;\n else if (ch === \")\") {\n depth--;\n if (depth === 0) return i;\n }\n }\n return -1;\n}\n\n/** True for the vino runtime that *defines* `defineServerFn`. */\nexport function isDefineServerFnImplementation(code: string): boolean {\n return /(?:^|[^\\w$])function\\s+defineServerFn\\s*\\(/.test(code);\n}\n\n/** Skip transforming this package's dist (and any `defineServerFn` implementation). */\nexport function skipServerFnTransform(file: string, code = \"\"): boolean {\n const normalized = file.replaceAll(\"\\\\\", \"/\");\n if (normalized.includes(\"/node_modules/\")) return true;\n if (normalized.includes(\"/vinojs/dist/\")) return true;\n if (/\\/dist\\/(?:vinojs|client|vite|component-wrap|compile-[^/]+)\\.m?js$/.test(normalized)) return true;\n return isDefineServerFnImplementation(code);\n}\n\n/**\n * Drop `defineServerFn` implementations from client source so handlers are not bundled.\n * The wrapper stays; later this is where an RPC stub id can be injected.\n */\nexport function stripServerFnHandlers(code: string, fileId = \"\"): string {\n if (!usesDefineServerFn(code) || isDefineServerFnImplementation(code)) return code;\n let out = \"\";\n let last = 0;\n DEFINE_SERVER_FN_CALL.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = DEFINE_SERVER_FN_CALL.exec(code))) {\n const open = match.index + match[0].length - 1;\n const close = findMatchingParen(code, open);\n if (close < 0) break;\n out += code.slice(last, open + 1);\n const id = fileId ? JSON.stringify(`${fileId}#fn`) : undefined;\n const stub = id\n ? `Object.assign(function(){throw new Error(${JSON.stringify(CLIENT_STUB_ERROR)})},{kind:${JSON.stringify(SERVER_FN_KIND)},id:${id}})`\n : `function(){throw new Error(${JSON.stringify(CLIENT_STUB_ERROR)})}`;\n out += stub;\n last = close;\n DEFINE_SERVER_FN_CALL.lastIndex = close;\n }\n out += code.slice(last);\n return out;\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { isAbsolute, join, relative } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { Plugin, ResolvedConfig, ViteDevServer } from \"vite\";\nimport {\n DEFAULT_COMPONENTS_DIR,\n DEFAULT_ENTRY,\n DEFAULT_LAYOUTS_DIR,\n DEFAULT_PAGES_DIR,\n VIRTUAL_ASSETS,\n VIRTUAL_CLIENT,\n VIRTUAL_CLIENT_PAGES,\n VIRTUAL_COMPONENTS,\n VIRTUAL_MANIFEST,\n VIRTUAL_SSR_HOOKS,\n} from \"../vino/constants.ts\";\nimport { usesDefineServerFn } from \"../vino/defineServerFn.ts\";\nimport { readPageDefinition } from \"../vino/definePage.ts\";\nimport { prerender } from \"../vino/prerender.ts\";\nimport { componentId, crawlPages, type CrawledTree } from \"./crawl.ts\";\nimport { isServerModuleFile } from \"./files.ts\";\nimport {\n classifyHmrFile,\n clientPageFlagChanged,\n hmrAcceptSnippet,\n hmrRegistrySnippet,\n VINO_HMR_EVENT,\n} from \"./hmr.ts\";\nimport { isClientPageModule, isHydratableComponentId } from \"./match.ts\";\nimport {\n skipServerFnTransform,\n stripServerFnHandlers,\n stubServerModule,\n} from \"./server-fn.ts\";\nimport type { PageConfig, VinoViteOptions } from \"../vino/types.ts\";\n\ninterface ResolvedVino {\n pagesDir: string;\n layoutsDir: string;\n componentsDir: string;\n entry: string;\n prerender: \"full\" | \"partial\" | false;\n clientRouting: boolean;\n client?: string;\n}\n\nconst RESOLVED = {\n manifest: `\\0${VIRTUAL_MANIFEST}`,\n components: `\\0${VIRTUAL_COMPONENTS}`,\n assets: `\\0${VIRTUAL_ASSETS}`,\n client: `\\0${VIRTUAL_CLIENT}`,\n clientPages: `\\0${VIRTUAL_CLIENT_PAGES}`,\n ssrHooks: `\\0${VIRTUAL_SSR_HOOKS}`,\n};\n\nconst WRAP = \"?vino-wrap\";\nconst ORIG = \"?vino-orig\";\n\nexport function applyParams(path: string, params: Record<string, string>): string {\n let url = path;\n for (const [key, value] of Object.entries(params)) {\n url = url.replace(`:${key}`, value);\n }\n if (!url.startsWith(\"/\")) url = `/${url}`;\n return url;\n}\n\nfunction resolveOptions(options: VinoViteOptions = {}): ResolvedVino {\n return {\n pagesDir: options.pagesDir ?? DEFAULT_PAGES_DIR,\n layoutsDir: options.layoutsDir ?? DEFAULT_LAYOUTS_DIR,\n componentsDir: options.componentsDir ?? DEFAULT_COMPONENTS_DIR,\n entry: options.entry ?? DEFAULT_ENTRY,\n prerender: options.prerender ?? \"partial\",\n clientRouting: options.clientRouting ?? true,\n client: options.client,\n };\n}\n\nfunction toPosix(p: string): string {\n return p.replaceAll(\"\\\\\", \"/\");\n}\n\nfunction importPath(abs: string): string {\n return JSON.stringify(toPosix(abs));\n}\n\nfunction generateManifest(tree: CrawledTree, defaults: PageConfig): string {\n const baked = JSON.stringify({\n clientRouting: defaults.clientRouting === true,\n prerender: defaults.prerender,\n });\n const pages = tree.pages.map((page) => {\n return `{\n id: ${JSON.stringify(page.id)},\n path: ${JSON.stringify(page.path)},\n pattern: ${JSON.stringify(page.pattern)},\n isClientPage: ${page.isClientPage},\n isStatic: ${page.isStatic},\n isCatchAll: ${page.isCatchAll},\n paramNames: ${JSON.stringify(page.paramNames)},\n config: ${baked},\n loadPage: () => import(${importPath(page.pageFile)}),\n ${page.isClientPage ? `loadClientPage: () => import(${importPath(page.pageFile)}),` : \"\"}\n loadLayouts: [${page.layouts.map((f) => `() => import(${importPath(f)})`).join(\", \")}],\n }`;\n });\n return `\nexport const manifest = {\n defaults: ${baked},\n pages: [${pages.join(\",\\n\")}],\n}\n`;\n}\n\nfunction generateComponents(tree: CrawledTree, root: string): string {\n const entries = tree.components.map(\n (file) => `${JSON.stringify(componentId(file, root))}: () => import(${importPath(file)})`,\n );\n return `export const components = {\\n${entries.join(\",\\n\")}\\n}\\n`;\n}\n\nfunction generateClientPages(tree: CrawledTree): string {\n const entries = tree.pages\n .filter((p) => p.isClientPage)\n .map(\n (p) => `${JSON.stringify(p.path)}: () => import(${importPath(p.pageFile)})`,\n );\n return `export const clientPages = {\\n${entries.join(\",\\n\")}\\n}\\n`;\n}\n\nfunction rewriteJsxToDom(code: string): string {\n return code\n .replaceAll(\"hono/jsx/jsx-runtime\", \"hono/jsx/dom/jsx-runtime\")\n .replaceAll(\"hono/jsx/jsx-dev-runtime\", \"hono/jsx/dom/jsx-dev-runtime\")\n .replaceAll(/from\\s*(['\"])hono\\/jsx\\1/g, \"from $1hono/jsx/dom$1\");\n}\n\nlet cachedTree: CrawledTree | undefined;\nlet cachedRoot: string | undefined;\n\nasync function treeFor(root: string, resolved: ResolvedVino): Promise<CrawledTree> {\n if (cachedTree && cachedRoot === root) return cachedTree;\n cachedTree = await crawlPages({\n root,\n pagesDir: resolved.pagesDir,\n componentsDir: resolved.componentsDir,\n layoutsDir: resolved.layoutsDir,\n });\n cachedRoot = root;\n return cachedTree;\n}\n\nfunction invalidateTree() {\n cachedTree = undefined;\n}\n\nfunction inWatchedDirs(file: string, resolved: ResolvedVino): boolean {\n const posix = toPosix(file);\n return [resolved.pagesDir, resolved.layoutsDir, resolved.componentsDir].some((dir) =>\n posix.includes(toPosix(dir)),\n );\n}\n\nfunction reloadRouteVirtuals(server: ViteDevServer) {\n for (const id of [RESOLVED.manifest, RESOLVED.components, RESOLVED.clientPages]) {\n const mod = server.moduleGraph.getModuleById(id);\n if (mod) void server.reloadModule(mod);\n }\n}\n\nfunction watchPages(server: ViteDevServer, resolved: ResolvedVino) {\n const dirs = [\n resolved.pagesDir,\n resolved.layoutsDir,\n resolved.componentsDir,\n ];\n for (const dir of dirs) server.watcher.add(join(server.config.root, dir));\n\n const onTreeChange = (file: string) => {\n if (!inWatchedDirs(file, resolved)) return;\n invalidateTree();\n reloadRouteVirtuals(server);\n };\n\n const onChange = (file: string) => {\n if (!inWatchedDirs(file, resolved)) return;\n try {\n const code = readFileSync(file, \"utf8\");\n if (!clientPageFlagChanged(file, cachedTree, code)) return;\n } catch {\n return;\n }\n invalidateTree();\n reloadRouteVirtuals(server);\n };\n\n server.watcher.on(\"add\", onTreeChange);\n server.watcher.on(\"unlink\", onTreeChange);\n server.watcher.on(\"change\", onChange);\n}\n\nfunction notifyBrowserHmr(server: ViteDevServer, kind: \"ssr\" | \"layout\") {\n const client = server.environments.client;\n setTimeout(() => {\n client?.hot.send({\n type: \"custom\",\n event: VINO_HMR_EVENT,\n data: { kind },\n });\n }, 0);\n}\n\n/**\n * Vite plugin: filesystem routes, hydratable components, client entry, and SSG.\n */\nexport function vino(options: VinoViteOptions = {}): Plugin[] {\n const resolved = resolveOptions(options);\n let config: ResolvedConfig;\n let command: \"build\" | \"serve\" = \"serve\";\n const clientScriptSrc = \"/assets/vino-client.js\";\n\n const configPlugin: Plugin = {\n name: \"vino:config\",\n config(_cfg, env) {\n command = env.command;\n // Bundle hono into the SSR graph so jsx-renderer RequestContext is a singleton\n // (Vite optimizeDeps otherwise duplicates createContext and breaks useRequestContext).\n return {\n resolve: { dedupe: [\"hono\"] },\n ssr: { noExternal: [\"vinojs\", \"hono\"] },\n optimizeDeps: { exclude: [\"vinojs\", \"hono\"] },\n };\n },\n configEnvironment(name) {\n if (name === \"ssr\") {\n return {\n resolve: { noExternal: [\"vinojs\", \"hono\"] },\n optimizeDeps: { exclude: [\"hono\"] },\n };\n }\n if (name === \"client\") {\n return {\n build: {\n rollupOptions: {\n input: {\n \"vino-client\": VIRTUAL_CLIENT,\n },\n output: {\n entryFileNames: (chunk) => {\n if (chunk.name === \"vino-client\") return \"assets/vino-client.js\";\n return \"assets/[name]-[hash].js\";\n },\n },\n },\n },\n };\n }\n },\n configResolved(c) {\n config = c;\n const detected = join(c.root, \"src/client.ts\");\n if (!resolved.client && existsSync(detected)) resolved.client = detected;\n },\n configureServer(server) {\n watchPages(server, resolved);\n },\n hotUpdate({ file, server }) {\n const kind = classifyHmrFile(file, {\n pagesDir: resolved.pagesDir,\n layoutsDir: resolved.layoutsDir,\n componentsDir: resolved.componentsDir,\n clientPageFiles: cachedTree?.pages.filter((page) => page.isClientPage).map((page) => page.pageFile),\n });\n if (!kind) return;\n if (kind === \"component\" || kind === \"client-page\") return;\n\n if (this.environment.name === \"client\") {\n if (!server.environments.ssr) notifyBrowserHmr(server, kind);\n return [];\n }\n\n if (this.environment.name === \"ssr\") notifyBrowserHmr(server, kind);\n },\n };\n\n const virtualPlugin: Plugin = {\n name: \"vino:virtual\",\n resolveId(id) {\n if (id === VIRTUAL_MANIFEST) return RESOLVED.manifest;\n if (id === VIRTUAL_COMPONENTS) return RESOLVED.components;\n if (id === VIRTUAL_ASSETS) return RESOLVED.assets;\n if (id === VIRTUAL_CLIENT) return RESOLVED.client;\n if (id === VIRTUAL_CLIENT_PAGES) return RESOLVED.clientPages;\n if (id === VIRTUAL_SSR_HOOKS) return RESOLVED.ssrHooks;\n },\n async load(id) {\n const root = config?.root ?? process.cwd();\n const isDev = command === \"serve\";\n if (id === RESOLVED.manifest) {\n return generateManifest(await treeFor(root, resolved), {\n clientRouting: resolved.clientRouting,\n prerender: resolved.prerender,\n });\n }\n if (id === RESOLVED.components) {\n const code = generateComponents(await treeFor(root, resolved), root);\n return isDev ? `${code}${hmrRegistrySnippet(\"components\")}` : code;\n }\n if (id === RESOLVED.clientPages) {\n const code = generateClientPages(await treeFor(root, resolved));\n return isDev ? `${code}${hmrRegistrySnippet(\"clientPages\")}` : code;\n }\n if (id === RESOLVED.assets) {\n return `export const isDev = ${isDev}\\nexport const clientScriptSrc = ${JSON.stringify(isDev ? \"/@id/virtual:vino/client\" : clientScriptSrc)}\\n`;\n }\n if (id === RESOLVED.ssrHooks) {\n return `\nexport function useState(initial) {\n const value = typeof initial === 'function' ? initial() : initial\n return [value, () => {}]\n}\nexport function useEffect() {}\nexport function useLayoutEffect() {}\nexport function useInsertionEffect() {}\nexport function useCallback(fn) { return fn }\nexport function useMemo(fn) { return fn() }\nexport function useRef(initial) { return { current: initial } }\nexport function useId() { return 'vino-ssr' }\nexport function useReducer(reducer, initial) {\n const value = typeof initial === 'function' ? initial() : initial\n return [value, () => {}]\n}\nexport * from 'hono/jsx'\n`;\n }\n if (id === RESOLVED.client) {\n const user = resolved.client;\n const userAbs = user ? (isAbsolute(user) ? user : join(root, user)) : undefined;\n const userImport = userAbs && existsSync(userAbs) ? `import ${importPath(userAbs)}\\n` : \"\";\n return `${userImport}import { createClient } from 'vinojs/client'\nconst vino = createClient()\nif (import.meta.hot) {\n import.meta.hot.accept()\n import.meta.hot.on(${JSON.stringify(VINO_HMR_EVENT)}, (data) => vino.hmr(data))\n}\n`;\n }\n },\n };\n\n const serverFnPlugin: Plugin = {\n name: \"vino:server-fn\",\n enforce: \"pre\",\n transform(code, id, extra) {\n if (extra?.ssr) return null;\n const file = id.split(\"?\")[0].replaceAll(\"\\\\\", \"/\");\n if (skipServerFnTransform(file, code)) return null;\n if (isServerModuleFile(file)) {\n return { code: stubServerModule(code, file), map: null };\n }\n if (!usesDefineServerFn(code)) return null;\n return { code: stripServerFnHandlers(code, file), map: null };\n },\n };\n\n const componentPlugin: Plugin = {\n name: \"vino:components\",\n enforce: \"pre\",\n async resolveId(source, importer, extra) {\n if (source.includes(ORIG)) return source.slice(0, source.indexOf(ORIG));\n if (source.includes(WRAP) || importer?.includes(WRAP) || importer?.includes(ORIG)) return;\n if (!importer || !extra?.ssr) return;\n const next = await this.resolve(source, importer, { skipSelf: true });\n if (!next) return;\n const file = next.id.split(\"?\")[0];\n if (isHydratableComponentId(file, resolved.componentsDir)) return `${file}${WRAP}`;\n },\n load(id) {\n if (!id.includes(WRAP)) return;\n const file = id.split(\"?\")[0];\n const root = config?.root ?? process.cwd();\n const cid = componentId(file, root);\n return `\nimport Component from ${JSON.stringify(file + ORIG)}\nimport { wrapComponent } from 'vinojs/component-wrap'\nexport default wrapComponent(Component, ${JSON.stringify(cid)}, 'default')\n`;\n },\n async transform(code, id, extra) {\n const file = id.split(\"?\")[0];\n const hydratable = isHydratableComponentId(file, resolved.componentsDir);\n const clientPage = isClientPageModule(id, code, resolved.pagesDir);\n if (!hydratable && !clientPage) return null;\n if (extra?.ssr) {\n const next = code.replaceAll(\n /from\\s*(['\"])hono\\/jsx(?:\\/dom)?\\1/g,\n `from '${VIRTUAL_SSR_HOOKS}'`,\n );\n return { code: next, map: null };\n }\n let next = rewriteJsxToDom(code);\n if (command === \"serve\") {\n if (hydratable) {\n next += hmrAcceptSnippet(\"component\", componentId(file, config?.root ?? process.cwd()));\n } else if (clientPage) {\n const tree = await treeFor(config?.root ?? process.cwd(), resolved);\n const page = tree.pages.find((entry) => toPosix(entry.pageFile) === toPosix(file));\n if (page) next += hmrAcceptSnippet(\"client-page\", page.path);\n }\n }\n return { code: next, map: null };\n },\n };\n\n const prerenderPlugin: Plugin = {\n name: \"vino:prerender\",\n apply: \"build\",\n enforce: \"post\",\n async closeBundle() {\n if (!resolved.prerender) return;\n const envName = (this as { environment?: { name?: string } }).environment?.name;\n // Client build runs last; writing HTML earlier would be wiped when client outDir is cleaned.\n if (envName && envName !== \"client\") return;\n const root = config.root;\n try {\n const ssrOutDir = config.environments?.ssr?.build?.outDir\n ? isAbsolute(config.environments.ssr.build.outDir)\n ? config.environments.ssr.build.outDir\n : join(root, config.environments.ssr.build.outDir)\n : join(root, \"dist\", \"ssr\");\n const clientOut = config.environments?.client?.build?.outDir\n ? isAbsolute(config.environments.client.build.outDir)\n ? config.environments.client.build.outDir\n : join(root, config.environments.client.build.outDir)\n : join(root, \"dist\", \"client\");\n const workerMain = join(ssrOutDir, \"index.js\");\n if (!existsSync(workerMain)) {\n console.warn(`[vino] prerender skipped: missing ${workerMain}`);\n return;\n }\n const appMod = (await import(pathToFileURL(workerMain).href)) as {\n default: { request: (input: string | Request, init?: RequestInit) => Promise<Response> };\n };\n const app = appMod.default;\n if (typeof app?.request !== \"function\") {\n console.warn(\"[vino] prerender skipped: worker has no request()\");\n return;\n }\n\n const tree = await treeFor(root, resolved);\n const viteManifestPath = join(ssrOutDir, \".vite\", \"manifest.json\");\n const viteManifest = existsSync(viteManifestPath)\n ? (JSON.parse(readFileSync(viteManifestPath, \"utf8\")) as Record<\n string,\n { file?: string }\n >)\n : {};\n\n const loadBuilt = async (absFile: string): Promise<unknown> => {\n const rel = toPosix(relative(root, absFile));\n const chunk = viteManifest[rel] ?? viteManifest[`/${rel}`];\n if (!chunk?.file) return undefined;\n return import(pathToFileURL(join(ssrOutDir, chunk.file)).href) as Promise<unknown>;\n };\n\n const urls: string[] = [];\n const urlModes: Record<string, \"full\" | \"partial\"> = {};\n for (const page of tree.pages) {\n const pageMod = await loadBuilt(page.pageFile);\n const inline = readPageDefinition(\n pageMod && typeof pageMod === \"object\"\n ? (pageMod as { default?: unknown }).default\n : undefined,\n );\n const pagePrerender = inline?.config?.prerender ?? resolved.prerender;\n if (pagePrerender === false) continue;\n\n const ssgParams = inline?.config?.ssgParams;\n const mode = pagePrerender === \"full\" ? \"full\" : \"partial\";\n if (page.isStatic) {\n const url = page.path;\n urls.push(url);\n urlModes[url] = mode;\n } else if (ssgParams) {\n const list = await ssgParams();\n for (const params of list) {\n const url = applyParams(page.path, params);\n urls.push(url);\n urlModes[url] = mode;\n }\n }\n }\n\n const result = await prerender({\n app,\n pages: [],\n urls,\n outDir: clientOut,\n mode: resolved.prerender,\n urlModes,\n });\n if (result.files.length) {\n console.info(`[vino] prerendered ${result.files.length} page(s) → ${clientOut}`);\n }\n } catch (err) {\n console.warn(\"[vino] prerender skipped:\", err);\n }\n },\n };\n\n return [configPlugin, virtualPlugin, serverFnPlugin, componentPlugin, prerenderPlugin];\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"vite.mjs","names":["toPosix","applyParams","applyParams","toPosix"],"sources":["../src/vite/compile.ts","../src/vite/prerender.ts","../src/vite/files.ts","../src/vite/crawl.ts","../src/vite/match.ts","../src/vite/hmr.ts","../src/vite/server-fn.ts","../src/vite/plugin.ts"],"sourcesContent":["export interface CompiledRoute {\n /** Filesystem-derived path using `:param` (no Hono regex). `/`, `/about`, `/blog/:slug`. */\n path: string;\n /** Hono route pattern (`:slug{.+}` for catch-all). */\n pattern: string;\n isCatchAll: boolean;\n isStatic: boolean;\n paramNames: string[];\n}\n\nconst GROUP_RE = /^\\([^)]+\\)$/;\nconst CATCH_ALL_RE = /^\\[\\.\\.\\.(.+)\\]$/;\nconst PARAM_RE = /^\\[([^\\]]+)\\]$/;\n\nfunction toPosix(relativePath: string): string {\n return relativePath.replaceAll(\"\\\\\", \"/\").replace(/^\\.\\//, \"\");\n}\n\nfunction stripExt(posixPath: string): string {\n return posixPath.replace(/\\.(tsx|ts|jsx|js|mjs)$/, \"\");\n}\n\n/**\n * Compile a pages-dir-relative file path to a Hono route.\n * `(group)` dirs are omitted, `[param]` becomes `:param`, `[...slug]` becomes `:slug{.+}`,\n * trailing `index` is dropped.\n */\nexport function compileFilePath(relativePath: string): CompiledRoute {\n const posix = toPosix(relativePath);\n const withoutExt = stripExt(posix);\n\n const rawSegs = withoutExt.split(\"/\").filter(Boolean);\n const segs = rawSegs.filter((seg) => !GROUP_RE.test(seg));\n if (segs.at(-1) === \"index\") segs.pop();\n\n const out: string[] = [];\n const paramNames: string[] = [];\n let isCatchAll = false;\n\n for (const seg of segs) {\n const catchAll = CATCH_ALL_RE.exec(seg);\n if (catchAll) {\n paramNames.push(catchAll[1]);\n out.push(`:${catchAll[1]}{.+}`);\n isCatchAll = true;\n continue;\n }\n const param = PARAM_RE.exec(seg);\n if (param && !param[1].startsWith(\"...\")) {\n paramNames.push(param[1]);\n out.push(`:${param[1]}`);\n continue;\n }\n out.push(seg);\n }\n\n const pattern = out.length === 0 ? \"/\" : `/${out.join(\"/\")}`;\n const path = pattern.replaceAll(\"{.+}\", \"\");\n const isStatic = paramNames.length === 0 && !isCatchAll;\n\n return { path, pattern, isCatchAll, isStatic, paramNames };\n}\n\nexport function pathSegments(path: string): string[] {\n return path.split(\"/\").filter(Boolean);\n}\n\nexport function pathDepth(path: string): number {\n return pathSegments(path).length;\n}\n\n/**\n * True if `parent` is `/` or a prefix of `child`.\n * A `:param` segment in `parent` matches any child segment; a static parent\n * segment does not match a param child segment.\n */\nexport function pathCovers(parent: string, child: string): boolean {\n if (parent === \"/\" || parent === \"\") return true;\n const a = pathSegments(parent);\n const b = pathSegments(child);\n if (a.length > b.length) return false;\n return a.every((seg, i) => {\n const other = b[i];\n if (seg === other) return true;\n if (seg.startsWith(\":\")) return true;\n return false;\n });\n}\n\nexport function applyParams(path: string, params: Record<string, string>): string {\n let url = path;\n for (const [key, value] of Object.entries(params)) {\n url = url.replace(`:${key}`, value);\n }\n if (!url.startsWith(\"/\")) url = `/${url}`;\n return url;\n}\n\nexport function urlToHtmlFile(url: string): string {\n const clean = url.split(\"?\")[0].split(\"#\")[0];\n if (clean === \"/\") return \"index.html\";\n const trimmed = clean.replace(/^\\//, \"\").replace(/\\/$/, \"\");\n if (clean.endsWith(\"/\")) return `${trimmed}/index.html`;\n return `${trimmed}.html`;\n}\n\nexport function routeRank(pattern: string): number {\n if (pattern.includes(\"{.+}\")) return 2;\n if (pattern.includes(\":\")) return 1;\n return 0;\n}\n\nexport function compareRoutes(a: { pattern: string }, b: { pattern: string }): number {\n const d = routeRank(a.pattern) - routeRank(b.pattern);\n if (d !== 0) return d;\n return b.pattern.length - a.pattern.length;\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { applyParams, urlToHtmlFile } from \"./compile.ts\";\nimport { loadMergedConfig } from \"../vino/config.ts\";\nimport type { ManifestPage, PageConfig } from \"../hydration/types.ts\";\n\nexport interface PrerenderApp {\n request: (input: string | Request, init?: RequestInit) => Promise<Response>;\n}\n\n/** Whether a page should be written during SSG. */\nexport function shouldPrerenderPage(\n pageConfig: PageConfig | undefined,\n globalPrerender: boolean,\n): boolean {\n if (pageConfig?.prerender === false) return false;\n if (pageConfig?.prerender === true) return true;\n return globalPrerender;\n}\n\nexport async function collectPrerenderUrls(\n pages: ManifestPage[],\n globalPrerender = true,\n): Promise<string[]> {\n const urls: string[] = [];\n for (const page of pages) {\n const pageMod = await page.loadPage();\n const config = loadMergedConfig(page, pageMod);\n if (!shouldPrerenderPage(config, globalPrerender)) continue;\n const ssgParams = config.ssgParams;\n if (!page.isStatic) {\n if (!ssgParams) continue;\n const list = await ssgParams();\n for (const params of list) urls.push(applyParams(page.path, params));\n continue;\n }\n urls.push(page.path === \"\" ? \"/\" : page.path);\n }\n return [...new Set(urls)];\n}\n\n/** Write full HTML documents for the given URLs (or all eligible pages). */\nexport async function prerender(options: {\n app: PrerenderApp;\n pages: ManifestPage[];\n outDir: string;\n urls?: string[];\n /** When true (default), collect URLs from pages that allow prerender. */\n enabled?: boolean;\n}): Promise<{ files: string[] }> {\n if (options.enabled === false && !options.urls?.length) return { files: [] };\n\n const urls =\n options.urls ?? (await collectPrerenderUrls(options.pages, options.enabled !== false));\n const files: string[] = [];\n for (const url of urls) {\n const res = await options.app.request(url);\n if (!res.ok) {\n console.warn(`[vino] skip prerender ${url} (${res.status})`);\n continue;\n }\n const html = await res.text();\n const rel = urlToHtmlFile(url);\n const dest = join(options.outDir, rel);\n await mkdir(dirname(dest), { recursive: true });\n await writeFile(dest, html);\n files.push(rel);\n }\n return { files };\n}\n","import { PAGE_EXTS } from \"../vino/constants.ts\";\n\nexport function stripKnownExt(fileName: string): string {\n for (const ext of PAGE_EXTS) {\n if (fileName.endsWith(ext)) return fileName.slice(0, -ext.length);\n }\n return fileName;\n}\n\nexport function isPageExt(fileName: string): boolean {\n if (fileName.endsWith(\".d.ts\")) return false;\n return PAGE_EXTS.some((ext) => fileName.endsWith(ext));\n}\n\n/** Colocated server modules (`[slug].server.ts`) — not filesystem routes. */\nexport function isServerModuleFile(filePath: string): boolean {\n const base = filePath.split(/[/\\\\]/).at(-1) ?? filePath;\n return /\\.server\\.(tsx|ts|jsx|js|mjs)$/.test(base);\n}\n\nexport function isIgnoredPageFile(fileName: string): boolean {\n const base = fileName.split(\"/\").at(-1) ?? fileName;\n if (base.startsWith(\".\")) return true;\n if (base.endsWith(\".d.ts\")) return true;\n if (isServerModuleFile(base)) return true;\n const name = stripKnownExt(base);\n if (name.startsWith(\"_\") || name.startsWith(\"+\")) return true;\n return false;\n}\n\nexport function isNamedComponentFile(filePath: string): boolean {\n return /\\.component\\.(tsx|ts|jsx|js|mjs)$/.test(filePath);\n}\n\nexport function isHydratableComponentFile(filePath: string, componentsDir: string): boolean {\n const posix = filePath.replaceAll(\"\\\\\", \"/\");\n const dir = componentsDir.replaceAll(\"\\\\\", \"/\").replace(/\\/$/, \"\");\n if (posix.includes(`/${dir}/`) || posix.startsWith(`${dir}/`) || posix.includes(`${dir}/`)) {\n const after = posix.split(`/${dir}/`).at(-1) ?? posix;\n if (after && isPageExt(after) && !isIgnoredPageFile(after)) return true;\n }\n if (isNamedComponentFile(posix)) return true;\n return false;\n}\n","import { readdir, readFile } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport {\n compileFilePath,\n compareRoutes,\n pathCovers,\n pathDepth,\n type CompiledRoute,\n} from \"./compile.ts\";\nimport { usesDefinePage } from \"../factory/definePage.ts\";\nimport { isIgnoredPageFile, isNamedComponentFile, isPageExt } from \"./files.ts\";\n\nexport type CrawledPage = CompiledRoute & {\n id: string;\n pageFile: string;\n isClientPage: boolean;\n layouts: string[];\n};\n\nexport interface CrawledWrapper {\n file: string;\n path: string;\n}\n\nexport interface CrawledTree {\n pages: CrawledPage[];\n components: string[];\n}\n\nfunction toPosix(p: string): string {\n return p.replaceAll(\"\\\\\", \"/\");\n}\n\nasync function walkFiles(dir: string): Promise<string[]> {\n const out: string[] = [];\n let entries;\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return out;\n }\n for (const entry of entries) {\n if (entry.name.startsWith(\".\")) continue;\n const full = join(dir, entry.name);\n if (entry.isDirectory()) {\n if (entry.name === \"node_modules\") continue;\n out.push(...(await walkFiles(full)));\n } else {\n out.push(full);\n }\n }\n return out;\n}\n\nexport async function crawlWrappers(dirAbs: string): Promise<CrawledWrapper[]> {\n const files = await walkFiles(dirAbs);\n const byPath = new Map<string, string>();\n for (const file of files) {\n const rel = toPosix(relative(dirAbs, file));\n const base = rel.split(\"/\").at(-1) ?? rel;\n if (!isPageExt(base) || isIgnoredPageFile(base)) continue;\n const compiled = compileFilePath(rel);\n byPath.set(compiled.path, file);\n }\n return [...byPath.entries()].map(([path, file]) => ({ path, file }));\n}\n\nexport function wrappersForPath(wrappers: CrawledWrapper[], pagePath: string): string[] {\n return wrappers\n .filter((w) => pathCovers(w.path, pagePath))\n .sort((a, b) => pathDepth(a.path) - pathDepth(b.path) || a.path.localeCompare(b.path))\n .map((w) => w.file);\n}\n\nexport async function crawlPages(options: {\n root: string;\n pagesDir: string;\n componentsDir: string;\n layoutsDir: string;\n}): Promise<CrawledTree> {\n const pagesAbs = join(options.root, options.pagesDir);\n const componentsAbs = join(options.root, options.componentsDir);\n const layoutsAbs = join(options.root, options.layoutsDir);\n const files = await walkFiles(pagesAbs);\n const compiledPages: { file: string; rel: string; compiled: CompiledRoute }[] = [];\n\n for (const file of files) {\n const rel = toPosix(relative(pagesAbs, file));\n const base = rel.split(\"/\").at(-1) ?? rel;\n if (!isPageExt(base)) continue;\n if (isNamedComponentFile(rel) || isIgnoredPageFile(base)) continue;\n compiledPages.push({ file, rel, compiled: compileFilePath(rel) });\n }\n\n const layouts = await crawlWrappers(layoutsAbs);\n\n const byPath = new Map<string, (typeof compiledPages)[number]>();\n for (const item of compiledPages) {\n byPath.set(item.compiled.path, item);\n }\n\n const pages: CrawledPage[] = [];\n for (const [urlPath, item] of byPath) {\n const compiled = item.compiled;\n const pageFile = item.file;\n const isClientPage = usesDefinePage(await readFile(pageFile, \"utf8\"));\n pages.push({\n ...compiled,\n path: urlPath,\n isClientPage,\n id: urlPath,\n pageFile,\n layouts: wrappersForPath(layouts, urlPath),\n });\n }\n\n pages.sort(compareRoutes);\n\n const componentFiles = [\n ...(await walkFiles(componentsAbs)),\n ...(await walkFiles(join(options.root, \"src\"))).filter((f) => isNamedComponentFile(toPosix(f))),\n ];\n const components = [...new Set(componentFiles)]\n .filter((file) => {\n const rel = toPosix(relative(options.root, file));\n const base = rel.split(\"/\").at(-1) ?? rel;\n return isPageExt(base) && !isIgnoredPageFile(base);\n })\n .sort();\n\n return { pages, components };\n}\n\nexport function componentId(absFile: string, root: string): string {\n const rel = toPosix(relative(root, absFile));\n return `/${rel}`;\n}\n","import { isHydratableComponentFile } from \"./files.ts\";\nimport { usesDefinePage } from \"../factory/definePage.ts\";\n\nexport function isSourceDirFile(id: string, dir: string): boolean {\n const file = id.split(\"?\")[0].replaceAll(\"\\\\\", \"/\");\n if (file.includes(\"/node_modules/\")) return false;\n const prefix = dir.replaceAll(\"\\\\\", \"/\").replace(/\\/$/, \"\");\n return file.includes(`/${prefix}/`) || file.startsWith(`${prefix}/`);\n}\n\nexport function isHydratableComponentId(id: string, componentsDir: string): boolean {\n const file = id.split(\"?\")[0].replaceAll(\"\\\\\", \"/\");\n if (file.includes(\"/node_modules/\")) return false;\n return isHydratableComponentFile(file, componentsDir);\n}\n\nexport function isPagesDirFile(id: string, pagesDir: string): boolean {\n return isSourceDirFile(id, pagesDir);\n}\n\nexport function isLayoutsDirFile(id: string, layoutsDir: string): boolean {\n return isSourceDirFile(id, layoutsDir);\n}\n\nexport function isClientPageModule(id: string, code: string, pagesDir: string): boolean {\n return isPagesDirFile(id, pagesDir) && usesDefinePage(code);\n}\n","import { usesDefinePage } from \"../factory/definePage.ts\";\nimport { isHydratableComponentFile, isPageExt, isServerModuleFile } from \"./files.ts\";\nimport { isLayoutsDirFile, isPagesDirFile } from \"./match.ts\";\n\nexport const VINO_HMR_EVENT = \"vino:hmr\";\n\nexport type VinoHmrKind = \"component\" | \"client-page\" | \"ssr\" | \"layout\";\n\nexport function hmrAcceptSnippet(kind: \"component\" | \"client-page\", id: string): string {\n return `\nif (import.meta.hot) {\n import.meta.hot.accept((mod) => {\n globalThis.__VINO_HMR__?.({ kind: ${JSON.stringify(kind)}, id: ${JSON.stringify(id)}, mod })\n })\n}\n`;\n}\n\nexport function hmrRegistrySnippet(exportName: \"components\" | \"clientPages\"): string {\n return `\nif (import.meta.hot) {\n import.meta.hot.accept((mod) => {\n globalThis.__VINO_HMR__?.({ kind: \"registry\", ${exportName}: mod?.${exportName} })\n })\n}\n`;\n}\n\nexport function classifyHmrFile(\n file: string,\n options: {\n pagesDir: string;\n layoutsDir: string;\n componentsDir: string;\n clientPageFiles?: Iterable<string>;\n },\n): VinoHmrKind | undefined {\n const posix = file.split(\"?\")[0].replaceAll(\"\\\\\", \"/\");\n if (posix.includes(\"/node_modules/\")) return;\n const base = posix.split(\"/\").at(-1) ?? posix;\n if (!isPageExt(base) && !isServerModuleFile(posix)) return;\n\n if (isHydratableComponentFile(posix, options.componentsDir)) return \"component\";\n if (isLayoutsDirFile(posix, options.layoutsDir)) return \"layout\";\n if (!isPagesDirFile(posix, options.pagesDir)) return;\n if (isServerModuleFile(posix)) return \"ssr\";\n\n const clientFiles = new Set(\n [...(options.clientPageFiles ?? [])].map((entry) => entry.replaceAll(\"\\\\\", \"/\")),\n );\n if (clientFiles.has(posix)) return \"client-page\";\n return \"ssr\";\n}\n\nexport function clientPageFlagChanged(\n file: string,\n tree: { pages: { pageFile: string; isClientPage: boolean }[] } | undefined,\n code: string,\n): boolean {\n const posix = file.replaceAll(\"\\\\\", \"/\");\n const page = tree?.pages.find((entry) => entry.pageFile.replaceAll(\"\\\\\", \"/\") === posix);\n if (!page) return false;\n return usesDefinePage(code) !== page.isClientPage;\n}\n","import { DEFINE_SERVER_FN_CALL, SERVER_FN_KIND, usesDefineServerFn } from \"../factory/defineServerFn.ts\";\n\nconst CLIENT_STUB_ERROR = \"[vino] server function cannot run on the client\";\n\nexport function listModuleExports(code: string): { hasDefault: boolean; named: string[] } {\n const named = new Set<string>();\n let hasDefault = /(?:^|[\\n\\r;])\\s*export\\s+default\\b/.test(code);\n\n for (const m of code.matchAll(/\\bexport\\s+(?:async\\s+)?(?:function|class)\\s+([A-Za-z_$][\\w$]*)/g)) {\n named.add(m[1]);\n }\n for (const m of code.matchAll(/\\bexport\\s+(?:const|let|var)\\s+([A-Za-z_$][\\w$]*)/g)) {\n named.add(m[1]);\n }\n for (const m of code.matchAll(/\\bexport\\s*\\{([^}]+)\\}/g)) {\n for (const part of m[1].split(\",\")) {\n const bits = part.trim();\n if (!bits) continue;\n const asMatch = /\\bas\\s+([A-Za-z_$][\\w$]*)$/.exec(bits);\n const name = asMatch ? asMatch[1] : bits.split(/\\s+/)[0];\n if (name === \"default\") hasDefault = true;\n else if (name) named.add(name);\n }\n }\n\n return { hasDefault, named: [...named] };\n}\n\nfunction stubFn(id: string): string {\n return `Object.assign(function(){throw new Error(${JSON.stringify(CLIENT_STUB_ERROR)})},{kind:${JSON.stringify(SERVER_FN_KIND)},id:${JSON.stringify(id)}})`;\n}\n\n/** Replace a `*.server.*` module with client stubs of its exports (implementation stays on the server). */\nexport function stubServerModule(code: string, fileId: string): string {\n const { hasDefault, named } = listModuleExports(code);\n const lines: string[] = [];\n for (const name of named) {\n lines.push(`export const ${name} = ${stubFn(`${fileId}#${name}`)}`);\n }\n if (hasDefault || named.length === 0) {\n lines.push(`export default ${stubFn(`${fileId}#default`)}`);\n }\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction skipQuoted(code: string, start: number): number {\n const quote = code[start];\n let escaped = false;\n for (let i = start + 1; i < code.length; i++) {\n const ch = code[i];\n if (!escaped && ch === quote) return i + 1;\n escaped = !escaped && ch === \"\\\\\";\n }\n return code.length;\n}\n\nfunction findMatchingParen(code: string, openIndex: number): number {\n let depth = 0;\n for (let i = openIndex; i < code.length; i++) {\n const ch = code[i];\n const next = code[i + 1];\n if (ch === \"'\" || ch === '\"' || ch === \"`\") {\n i = skipQuoted(code, i) - 1;\n continue;\n }\n if (ch === \"/\" && next === \"/\") {\n const nl = code.indexOf(\"\\n\", i);\n if (nl < 0) return -1;\n i = nl;\n continue;\n }\n if (ch === \"/\" && next === \"*\") {\n const end = code.indexOf(\"*/\", i + 2);\n if (end < 0) return -1;\n i = end + 1;\n continue;\n }\n if (ch === \"(\") depth++;\n else if (ch === \")\") {\n depth--;\n if (depth === 0) return i;\n }\n }\n return -1;\n}\n\n/** True for the vino runtime that *defines* `defineServerFn`. */\nexport function isDefineServerFnImplementation(code: string): boolean {\n return /(?:^|[^\\w$])function\\s+defineServerFn\\s*\\(/.test(code);\n}\n\n/** Skip transforming this package's dist (and any `defineServerFn` implementation). */\nexport function skipServerFnTransform(file: string, code = \"\"): boolean {\n const normalized = file.replaceAll(\"\\\\\", \"/\");\n if (normalized.includes(\"/node_modules/\")) return true;\n if (normalized.includes(\"/vinojs/dist/\")) return true;\n if (/\\/dist\\/(?:vinojs|client|vite|component-wrap|compile-[^/]+)\\.m?js$/.test(normalized)) return true;\n return isDefineServerFnImplementation(code);\n}\n\n/**\n * Drop `defineServerFn` implementations from client source so handlers are not bundled.\n * The wrapper stays; later this is where an RPC stub id can be injected.\n */\nexport function stripServerFnHandlers(code: string, fileId = \"\"): string {\n if (!usesDefineServerFn(code) || isDefineServerFnImplementation(code)) return code;\n let out = \"\";\n let last = 0;\n DEFINE_SERVER_FN_CALL.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = DEFINE_SERVER_FN_CALL.exec(code))) {\n const open = match.index + match[0].length - 1;\n const close = findMatchingParen(code, open);\n if (close < 0) break;\n out += code.slice(last, open + 1);\n const id = fileId ? JSON.stringify(`${fileId}#fn`) : undefined;\n const stub = id\n ? `Object.assign(function(){throw new Error(${JSON.stringify(CLIENT_STUB_ERROR)})},{kind:${JSON.stringify(SERVER_FN_KIND)},id:${id}})`\n : `function(){throw new Error(${JSON.stringify(CLIENT_STUB_ERROR)})}`;\n out += stub;\n last = close;\n DEFINE_SERVER_FN_CALL.lastIndex = close;\n }\n out += code.slice(last);\n return out;\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { isAbsolute, join, relative } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { Plugin, ResolvedConfig, ViteDevServer } from \"vite\";\nimport {\n DEFAULT_COMPONENTS_DIR,\n DEFAULT_ENTRY,\n DEFAULT_LAYOUTS_DIR,\n DEFAULT_PAGES_DIR,\n VIRTUAL_ASSETS,\n VIRTUAL_CLIENT,\n VIRTUAL_CLIENT_PAGES,\n VIRTUAL_COMPONENTS,\n VIRTUAL_MANIFEST,\n VIRTUAL_SSR_HOOKS,\n} from \"../vino/constants.ts\";\nimport { usesDefineServerFn } from \"../factory/defineServerFn.ts\";\nimport { readPageDefinition } from \"../factory/definePage.ts\";\nimport { prerender, shouldPrerenderPage } from \"./prerender.ts\";\nimport { componentId, crawlPages, type CrawledTree } from \"./crawl.ts\";\nimport { isServerModuleFile } from \"./files.ts\";\nimport {\n classifyHmrFile,\n clientPageFlagChanged,\n hmrAcceptSnippet,\n hmrRegistrySnippet,\n VINO_HMR_EVENT,\n} from \"./hmr.ts\";\nimport { isClientPageModule, isHydratableComponentId } from \"./match.ts\";\nimport {\n skipServerFnTransform,\n stripServerFnHandlers,\n stubServerModule,\n} from \"./server-fn.ts\";\nimport type { PageConfig, VinoViteOptions } from \"../hydration/types.ts\";\n\ninterface ResolvedVino {\n pagesDir: string;\n layoutsDir: string;\n componentsDir: string;\n entry: string;\n prerender: boolean;\n clientRouting: boolean;\n client?: string;\n}\n\nconst RESOLVED = {\n manifest: `\\0${VIRTUAL_MANIFEST}`,\n components: `\\0${VIRTUAL_COMPONENTS}`,\n assets: `\\0${VIRTUAL_ASSETS}`,\n client: `\\0${VIRTUAL_CLIENT}`,\n clientPages: `\\0${VIRTUAL_CLIENT_PAGES}`,\n ssrHooks: `\\0${VIRTUAL_SSR_HOOKS}`,\n};\n\nconst WRAP = \"?vino-wrap\";\nconst ORIG = \"?vino-orig\";\n\nexport function applyParams(path: string, params: Record<string, string>): string {\n let url = path;\n for (const [key, value] of Object.entries(params)) {\n url = url.replace(`:${key}`, value);\n }\n if (!url.startsWith(\"/\")) url = `/${url}`;\n return url;\n}\n\nfunction resolveOptions(options: VinoViteOptions = {}): ResolvedVino {\n return {\n pagesDir: options.pagesDir ?? DEFAULT_PAGES_DIR,\n layoutsDir: options.layoutsDir ?? DEFAULT_LAYOUTS_DIR,\n componentsDir: options.componentsDir ?? DEFAULT_COMPONENTS_DIR,\n entry: options.entry ?? DEFAULT_ENTRY,\n prerender: options.prerender === true,\n clientRouting: options.clientRouting ?? true,\n client: options.client,\n };\n}\n\nfunction toPosix(p: string): string {\n return p.replaceAll(\"\\\\\", \"/\");\n}\n\nfunction importPath(abs: string): string {\n return JSON.stringify(toPosix(abs));\n}\n\nfunction generateManifest(tree: CrawledTree, defaults: PageConfig): string {\n const baked = JSON.stringify({\n clientRouting: defaults.clientRouting === true,\n prerender: defaults.prerender,\n });\n const pages = tree.pages.map((page) => {\n return `{\n id: ${JSON.stringify(page.id)},\n path: ${JSON.stringify(page.path)},\n pattern: ${JSON.stringify(page.pattern)},\n isClientPage: ${page.isClientPage},\n isStatic: ${page.isStatic},\n isCatchAll: ${page.isCatchAll},\n paramNames: ${JSON.stringify(page.paramNames)},\n config: ${baked},\n loadPage: () => import(${importPath(page.pageFile)}),\n ${page.isClientPage ? `loadClientPage: () => import(${importPath(page.pageFile)}),` : \"\"}\n loadLayouts: [${page.layouts.map((f) => `() => import(${importPath(f)})`).join(\", \")}],\n }`;\n });\n return `\nexport const manifest = {\n defaults: ${baked},\n pages: [${pages.join(\",\\n\")}],\n}\n`;\n}\n\nfunction generateComponents(tree: CrawledTree, root: string): string {\n const entries = tree.components.map(\n (file) => `${JSON.stringify(componentId(file, root))}: () => import(${importPath(file)})`,\n );\n return `export const components = {\\n${entries.join(\",\\n\")}\\n}\\n`;\n}\n\nfunction generateClientPages(tree: CrawledTree): string {\n const entries = tree.pages\n .filter((p) => p.isClientPage)\n .map(\n (p) => `${JSON.stringify(p.path)}: () => import(${importPath(p.pageFile)})`,\n );\n return `export const clientPages = {\\n${entries.join(\",\\n\")}\\n}\\n`;\n}\n\nfunction rewriteJsxToClient(code: string, isDev: boolean): string {\n const jsxRuntime = isDev ? \"vinojs/jsx-dev-runtime\" : \"vinojs/jsx-runtime\";\n const jsxDevRuntime = \"vinojs/jsx-dev-runtime\";\n return (\n code\n // Bare specifiers (pre-resolve / build graph)\n .replaceAll(\"hono/jsx/jsx-runtime\", jsxRuntime)\n .replaceAll(\"hono/jsx/jsx-dev-runtime\", jsxDevRuntime)\n .replaceAll(\"hono/jsx/dom/jsx-runtime\", jsxRuntime)\n .replaceAll(\"hono/jsx/dom/jsx-dev-runtime\", jsxDevRuntime)\n // Vite may already have resolved to /@fs/.../hono/dist/jsx/*.js before our rewrite.\n .replace(\n /from\\s*([`'\"])[^`'\"]*hono[^`'\"]*\\/jsx\\/(?:dom\\/)?jsx-dev-runtime\\.js[^`'\"]*\\1/g,\n `from $1${jsxDevRuntime}$1`,\n )\n .replace(\n /from\\s*([`'\"])[^`'\"]*hono[^`'\"]*\\/jsx\\/(?:dom\\/)?jsx-runtime\\.js[^`'\"]*\\1/g,\n `from $1${jsxRuntime}$1`,\n )\n .replaceAll(/from\\s*(['\"])hono\\/jsx(?:\\/dom)?\\1/g, \"from $1vinojs/client$1\")\n );\n}\n\nlet cachedTree: CrawledTree | undefined;\nlet cachedRoot: string | undefined;\n\nasync function treeFor(root: string, resolved: ResolvedVino): Promise<CrawledTree> {\n if (cachedTree && cachedRoot === root) return cachedTree;\n cachedTree = await crawlPages({\n root,\n pagesDir: resolved.pagesDir,\n componentsDir: resolved.componentsDir,\n layoutsDir: resolved.layoutsDir,\n });\n cachedRoot = root;\n return cachedTree;\n}\n\nfunction invalidateTree() {\n cachedTree = undefined;\n}\n\nfunction inWatchedDirs(file: string, resolved: ResolvedVino): boolean {\n const posix = toPosix(file);\n return [resolved.pagesDir, resolved.layoutsDir, resolved.componentsDir].some((dir) =>\n posix.includes(toPosix(dir)),\n );\n}\n\nfunction reloadRouteVirtuals(server: ViteDevServer) {\n for (const id of [RESOLVED.manifest, RESOLVED.components, RESOLVED.clientPages]) {\n const mod = server.moduleGraph.getModuleById(id);\n if (mod) void server.reloadModule(mod);\n }\n}\n\nfunction watchPages(server: ViteDevServer, resolved: ResolvedVino) {\n const dirs = [\n resolved.pagesDir,\n resolved.layoutsDir,\n resolved.componentsDir,\n ];\n for (const dir of dirs) server.watcher.add(join(server.config.root, dir));\n\n const onTreeChange = (file: string) => {\n if (!inWatchedDirs(file, resolved)) return;\n invalidateTree();\n reloadRouteVirtuals(server);\n };\n\n const onChange = (file: string) => {\n if (!inWatchedDirs(file, resolved)) return;\n try {\n const code = readFileSync(file, \"utf8\");\n if (!clientPageFlagChanged(file, cachedTree, code)) return;\n } catch {\n return;\n }\n invalidateTree();\n reloadRouteVirtuals(server);\n };\n\n server.watcher.on(\"add\", onTreeChange);\n server.watcher.on(\"unlink\", onTreeChange);\n server.watcher.on(\"change\", onChange);\n}\n\nfunction notifyBrowserHmr(server: ViteDevServer, kind: \"ssr\" | \"layout\") {\n const client = server.environments.client;\n setTimeout(() => {\n client?.hot.send({\n type: \"custom\",\n event: VINO_HMR_EVENT,\n data: { kind },\n });\n }, 0);\n}\n\n/**\n * Vite plugin: filesystem routes, hydratable components, client entry, and SSG.\n */\nexport function vino(options: VinoViteOptions = {}): Plugin[] {\n const resolved = resolveOptions(options);\n let config: ResolvedConfig;\n let command: \"build\" | \"serve\" = \"serve\";\n const clientScriptSrc = \"/assets/vino-client.js\";\n\n const configPlugin: Plugin = {\n name: \"vino:config\",\n config(_cfg, env) {\n command = env.command;\n // Bundle hono into the SSR graph so jsx-renderer RequestContext is a singleton\n // (Vite optimizeDeps otherwise duplicates createContext and breaks useRequestContext).\n return {\n resolve: { dedupe: [\"hono\"] },\n ssr: { noExternal: [\"vinojs\", \"hono\"] },\n optimizeDeps: { exclude: [\"vinojs\", \"hono\"] },\n };\n },\n configEnvironment(name) {\n if (name === \"ssr\") {\n return {\n resolve: { noExternal: [\"vinojs\", \"hono\"] },\n optimizeDeps: { exclude: [\"hono\"] },\n };\n }\n if (name === \"client\") {\n // Client pages/islands must use vino's DOM jsx runtime. App tsconfig still\n // points at hono/jsx for SSR; aliasing here is more reliable than string-rewriting\n // source before Vite injects the jsx-runtime import.\n return {\n resolve: {\n alias: [\n { find: \"hono/jsx/jsx-dev-runtime\", replacement: \"vinojs/jsx-dev-runtime\" },\n { find: \"hono/jsx/jsx-runtime\", replacement: \"vinojs/jsx-runtime\" },\n { find: \"hono/jsx/dom/jsx-dev-runtime\", replacement: \"vinojs/jsx-dev-runtime\" },\n { find: \"hono/jsx/dom/jsx-runtime\", replacement: \"vinojs/jsx-runtime\" },\n { find: /^hono\\/jsx\\/dom$/, replacement: \"vinojs/client\" },\n { find: /^hono\\/jsx$/, replacement: \"vinojs/client\" },\n ],\n },\n build: {\n rollupOptions: {\n input: {\n \"vino-client\": VIRTUAL_CLIENT,\n },\n output: {\n entryFileNames: (chunk) => {\n if (chunk.name === \"vino-client\") return \"assets/vino-client.js\";\n return \"assets/[name]-[hash].js\";\n },\n },\n },\n },\n };\n }\n },\n configResolved(c) {\n config = c;\n const detected = join(c.root, \"src/client.ts\");\n if (!resolved.client && existsSync(detected)) resolved.client = detected;\n },\n configureServer(server) {\n watchPages(server, resolved);\n },\n hotUpdate({ file, server }) {\n const kind = classifyHmrFile(file, {\n pagesDir: resolved.pagesDir,\n layoutsDir: resolved.layoutsDir,\n componentsDir: resolved.componentsDir,\n clientPageFiles: cachedTree?.pages.filter((page) => page.isClientPage).map((page) => page.pageFile),\n });\n if (!kind) return;\n if (kind === \"component\" || kind === \"client-page\") return;\n\n if (this.environment.name === \"client\") {\n if (!server.environments.ssr) notifyBrowserHmr(server, kind);\n return [];\n }\n\n if (this.environment.name === \"ssr\") notifyBrowserHmr(server, kind);\n },\n };\n\n const virtualPlugin: Plugin = {\n name: \"vino:virtual\",\n resolveId(id) {\n if (id === VIRTUAL_MANIFEST) return RESOLVED.manifest;\n if (id === VIRTUAL_COMPONENTS) return RESOLVED.components;\n if (id === VIRTUAL_ASSETS) return RESOLVED.assets;\n if (id === VIRTUAL_CLIENT) return RESOLVED.client;\n if (id === VIRTUAL_CLIENT_PAGES) return RESOLVED.clientPages;\n if (id === VIRTUAL_SSR_HOOKS) return RESOLVED.ssrHooks;\n },\n async load(id) {\n const root = config?.root ?? process.cwd();\n const isDev = command === \"serve\";\n if (id === RESOLVED.manifest) {\n return generateManifest(await treeFor(root, resolved), {\n clientRouting: resolved.clientRouting,\n prerender: resolved.prerender,\n });\n }\n if (id === RESOLVED.components) {\n const code = generateComponents(await treeFor(root, resolved), root);\n return isDev ? `${code}${hmrRegistrySnippet(\"components\")}` : code;\n }\n if (id === RESOLVED.clientPages) {\n const code = generateClientPages(await treeFor(root, resolved));\n return isDev ? `${code}${hmrRegistrySnippet(\"clientPages\")}` : code;\n }\n if (id === RESOLVED.assets) {\n return `export const isDev = ${isDev}\\nexport const clientScriptSrc = ${JSON.stringify(isDev ? \"/@id/virtual:vino/client\" : clientScriptSrc)}\\n`;\n }\n if (id === RESOLVED.ssrHooks) {\n return `\nexport function useState(initial) {\n const value = typeof initial === 'function' ? initial() : initial\n return [value, () => {}]\n}\nexport function useEffect() {}\nexport function useLayoutEffect() {}\nexport function useInsertionEffect() {}\nexport function useCallback(fn) { return fn }\nexport function useMemo(fn) { return fn() }\nexport function useRef(initial) { return { current: initial } }\nexport function useId() { return 'vino-ssr' }\nexport function useReducer(reducer, initial) {\n const value = typeof initial === 'function' ? initial() : initial\n return [value, () => {}]\n}\nexport * from 'hono/jsx'\n`;\n }\n if (id === RESOLVED.client) {\n const user = resolved.client;\n const userAbs = user ? (isAbsolute(user) ? user : join(root, user)) : undefined;\n const userImport = userAbs && existsSync(userAbs) ? `import ${importPath(userAbs)}\\n` : \"\";\n return `${userImport}import { components } from '${VIRTUAL_COMPONENTS}'\nimport { clientPages } from '${VIRTUAL_CLIENT_PAGES}'\nimport { createClient } from 'vinojs/client'\nconst vino = createClient({ components, clientPages })\nif (import.meta.hot) {\n import.meta.hot.accept()\n import.meta.hot.on(${JSON.stringify(VINO_HMR_EVENT)}, (data) => vino.hmr(data))\n}\n`;\n }\n },\n };\n\n const serverFnPlugin: Plugin = {\n name: \"vino:server-fn\",\n enforce: \"pre\",\n transform(code, id, extra) {\n if (extra?.ssr) return null;\n const file = id.split(\"?\")[0].replaceAll(\"\\\\\", \"/\");\n if (skipServerFnTransform(file, code)) return null;\n if (isServerModuleFile(file)) {\n return { code: stubServerModule(code, file), map: null };\n }\n if (!usesDefineServerFn(code)) return null;\n return { code: stripServerFnHandlers(code, file), map: null };\n },\n };\n\n const componentPlugin: Plugin = {\n name: \"vino:components\",\n enforce: \"pre\",\n async resolveId(source, importer, extra) {\n if (source.includes(ORIG)) return source.slice(0, source.indexOf(ORIG));\n if (source.includes(WRAP) || importer?.includes(WRAP) || importer?.includes(ORIG)) return;\n if (!importer || !extra?.ssr) return;\n const next = await this.resolve(source, importer, { skipSelf: true });\n if (!next) return;\n const file = next.id.split(\"?\")[0];\n if (isHydratableComponentId(file, resolved.componentsDir)) return `${file}${WRAP}`;\n },\n load(id) {\n if (!id.includes(WRAP)) return;\n const file = id.split(\"?\")[0];\n const root = config?.root ?? process.cwd();\n const cid = componentId(file, root);\n return `\nimport Component from ${JSON.stringify(file + ORIG)}\nimport { wrapComponent } from 'vinojs/component-wrap'\nexport default wrapComponent(Component, ${JSON.stringify(cid)}, 'default')\n`;\n },\n async transform(code, id, extra) {\n const file = id.split(\"?\")[0];\n const hydratable = isHydratableComponentId(file, resolved.componentsDir);\n const clientPage = isClientPageModule(id, code, resolved.pagesDir);\n if (!hydratable && !clientPage) return null;\n if (extra?.ssr) {\n const next = code.replaceAll(\n /from\\s*(['\"])hono\\/jsx(?:\\/dom)?\\1/g,\n `from '${VIRTUAL_SSR_HOOKS}'`,\n );\n return { code: next, map: null };\n }\n let next = rewriteJsxToClient(code, command === \"serve\");\n if (command === \"serve\") {\n if (hydratable) {\n next += hmrAcceptSnippet(\"component\", componentId(file, config?.root ?? process.cwd()));\n } else if (clientPage) {\n const tree = await treeFor(config?.root ?? process.cwd(), resolved);\n const page = tree.pages.find((entry) => toPosix(entry.pageFile) === toPosix(file));\n if (page) next += hmrAcceptSnippet(\"client-page\", page.path);\n }\n }\n return { code: next, map: null };\n },\n };\n\n const prerenderPlugin: Plugin = {\n name: \"vino:prerender\",\n apply: \"build\",\n enforce: \"post\",\n async closeBundle() {\n if (!resolved.prerender) return;\n const envName = (this as { environment?: { name?: string } }).environment?.name;\n // Client build runs last; writing HTML earlier would be wiped when client outDir is cleaned.\n if (envName && envName !== \"client\") return;\n const root = config.root;\n try {\n const ssrOutDir = config.environments?.ssr?.build?.outDir\n ? isAbsolute(config.environments.ssr.build.outDir)\n ? config.environments.ssr.build.outDir\n : join(root, config.environments.ssr.build.outDir)\n : join(root, \"dist\", \"ssr\");\n const clientOut = config.environments?.client?.build?.outDir\n ? isAbsolute(config.environments.client.build.outDir)\n ? config.environments.client.build.outDir\n : join(root, config.environments.client.build.outDir)\n : join(root, \"dist\", \"client\");\n const workerMain = join(ssrOutDir, \"index.js\");\n if (!existsSync(workerMain)) {\n console.warn(`[vino] prerender skipped: missing ${workerMain}`);\n return;\n }\n const appMod = (await import(pathToFileURL(workerMain).href)) as {\n default: { request: (input: string | Request, init?: RequestInit) => Promise<Response> };\n };\n const app = appMod.default;\n if (typeof app?.request !== \"function\") {\n console.warn(\"[vino] prerender skipped: worker has no request()\");\n return;\n }\n\n const tree = await treeFor(root, resolved);\n const viteManifestPath = join(ssrOutDir, \".vite\", \"manifest.json\");\n const viteManifest = existsSync(viteManifestPath)\n ? (JSON.parse(readFileSync(viteManifestPath, \"utf8\")) as Record<\n string,\n { file?: string }\n >)\n : {};\n\n const loadBuilt = async (absFile: string): Promise<unknown> => {\n const rel = toPosix(relative(root, absFile));\n const chunk = viteManifest[rel] ?? viteManifest[`/${rel}`];\n if (!chunk?.file) return undefined;\n return import(pathToFileURL(join(ssrOutDir, chunk.file)).href) as Promise<unknown>;\n };\n\n const urls: string[] = [];\n for (const page of tree.pages) {\n const pageMod = await loadBuilt(page.pageFile);\n const inline = readPageDefinition(\n pageMod && typeof pageMod === \"object\"\n ? (pageMod as { default?: unknown }).default\n : undefined,\n );\n if (!shouldPrerenderPage(inline?.config, resolved.prerender)) continue;\n\n const ssgParams = inline?.config?.ssgParams;\n if (page.isStatic) {\n urls.push(page.path);\n } else if (ssgParams) {\n const list = await ssgParams();\n for (const params of list) {\n urls.push(applyParams(page.path, params));\n }\n }\n }\n\n const result = await prerender({\n app,\n pages: [],\n urls,\n outDir: clientOut,\n enabled: true,\n });\n if (result.files.length) {\n console.info(`[vino] prerendered ${result.files.length} page(s) → ${clientOut}`);\n }\n } catch (err) {\n console.warn(\"[vino] prerender skipped:\", err);\n }\n },\n };\n\n const clientJsxPlugin: Plugin = {\n name: \"vino:client-jsx\",\n enforce: \"post\",\n transform(code, id) {\n // After Vite injects jsx-runtime imports (often already resolved to /@fs/.../hono/...),\n // remap them to vino's DOM runtime so hydrate gets real nodes, not hono vnodes.\n if (this.environment?.name !== \"client\") return null;\n if (id.includes(\"node_modules\") && !id.includes(\"vino\")) return null;\n if (!code.includes(\"hono\") || !/jsx(?:-dev)?-runtime/.test(code)) return null;\n const next = rewriteJsxToClient(code, command === \"serve\");\n if (next === code) return null;\n return { code: next, map: null };\n },\n };\n\n return [configPlugin, virtualPlugin, serverFnPlugin, componentPlugin, clientJsxPlugin, prerenderPlugin];\n}\n"],"mappings":";;;;;;;;;AAUA,MAAM,WAAW;AACjB,MAAM,eAAe;AACrB,MAAM,WAAW;AAEjB,SAASA,UAAQ,cAA8B;CAC7C,OAAO,aAAa,WAAW,MAAM,GAAG,CAAC,CAAC,QAAQ,SAAS,EAAE;AAC/D;AAEA,SAAS,SAAS,WAA2B;CAC3C,OAAO,UAAU,QAAQ,0BAA0B,EAAE;AACvD;;;;;;AAOA,SAAgB,gBAAgB,cAAqC;CAKnE,MAAM,OAHa,SADLA,UAAQ,YACU,CAEP,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,OAAO,OAC1B,CAAC,CAAC,QAAQ,QAAQ,CAAC,SAAS,KAAK,GAAG,CAAC;CACxD,IAAI,KAAK,GAAG,EAAE,MAAM,SAAS,KAAK,IAAI;CAEtC,MAAM,MAAgB,CAAC;CACvB,MAAM,aAAuB,CAAC;CAC9B,IAAI,aAAa;CAEjB,KAAK,MAAM,OAAO,MAAM;EACtB,MAAM,WAAW,aAAa,KAAK,GAAG;EACtC,IAAI,UAAU;GACZ,WAAW,KAAK,SAAS,EAAE;GAC3B,IAAI,KAAK,IAAI,SAAS,GAAG,KAAK;GAC9B,aAAa;GACb;EACF;EACA,MAAM,QAAQ,SAAS,KAAK,GAAG;EAC/B,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC,WAAW,KAAK,GAAG;GACxC,WAAW,KAAK,MAAM,EAAE;GACxB,IAAI,KAAK,IAAI,MAAM,IAAI;GACvB;EACF;EACA,IAAI,KAAK,GAAG;CACd;CAEA,MAAM,UAAU,IAAI,WAAW,IAAI,MAAM,IAAI,IAAI,KAAK,GAAG;CACzD,MAAM,OAAO,QAAQ,WAAW,QAAQ,EAAE;CAC1C,MAAM,WAAW,WAAW,WAAW,KAAK,CAAC;CAE7C,OAAO;EAAE;EAAM;EAAS;EAAY;EAAU;CAAW;AAC3D;AAEA,SAAgB,aAAa,MAAwB;CACnD,OAAO,KAAK,MAAM,GAAG,CAAC,CAAC,OAAO,OAAO;AACvC;AAEA,SAAgB,UAAU,MAAsB;CAC9C,OAAO,aAAa,IAAI,CAAC,CAAC;AAC5B;;;;;;AAOA,SAAgB,WAAW,QAAgB,OAAwB;CACjE,IAAI,WAAW,OAAO,WAAW,IAAI,OAAO;CAC5C,MAAM,IAAI,aAAa,MAAM;CAC7B,MAAM,IAAI,aAAa,KAAK;CAC5B,IAAI,EAAE,SAAS,EAAE,QAAQ,OAAO;CAChC,OAAO,EAAE,OAAO,KAAK,MAAM;EAEzB,IAAI,QADU,EAAE,IACG,OAAO;EAC1B,IAAI,IAAI,WAAW,GAAG,GAAG,OAAO;EAChC,OAAO;CACT,CAAC;AACH;AAEA,SAAgBC,cAAY,MAAc,QAAwC;CAChF,IAAI,MAAM;CACV,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,GAC9C,MAAM,IAAI,QAAQ,IAAI,OAAO,KAAK;CAEpC,IAAI,CAAC,IAAI,WAAW,GAAG,GAAG,MAAM,IAAI;CACpC,OAAO;AACT;AAEA,SAAgB,cAAc,KAAqB;CACjD,MAAM,QAAQ,IAAI,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;CAC3C,IAAI,UAAU,KAAK,OAAO;CAC1B,MAAM,UAAU,MAAM,QAAQ,OAAO,EAAE,CAAC,CAAC,QAAQ,OAAO,EAAE;CAC1D,IAAI,MAAM,SAAS,GAAG,GAAG,OAAO,GAAG,QAAQ;CAC3C,OAAO,GAAG,QAAQ;AACpB;AAEA,SAAgB,UAAU,SAAyB;CACjD,IAAI,QAAQ,SAAS,MAAM,GAAG,OAAO;CACrC,IAAI,QAAQ,SAAS,GAAG,GAAG,OAAO;CAClC,OAAO;AACT;AAEA,SAAgB,cAAc,GAAwB,GAAgC;CACpF,MAAM,IAAI,UAAU,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO;CACpD,IAAI,MAAM,GAAG,OAAO;CACpB,OAAO,EAAE,QAAQ,SAAS,EAAE,QAAQ;AACtC;;;;ACzGA,SAAgB,oBACd,YACA,iBACS;CACT,IAAI,YAAY,cAAc,OAAO,OAAO;CAC5C,IAAI,YAAY,cAAc,MAAM,OAAO;CAC3C,OAAO;AACT;AAEA,eAAsB,qBACpB,OACA,kBAAkB,MACC;CACnB,MAAM,OAAiB,CAAC;CACxB,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,UAAU,MAAM,KAAK,SAAS;EACpC,MAAM,SAAS,iBAAiB,MAAM,OAAO;EAC7C,IAAI,CAAC,oBAAoB,QAAQ,eAAe,GAAG;EACnD,MAAM,YAAY,OAAO;EACzB,IAAI,CAAC,KAAK,UAAU;GAClB,IAAI,CAAC,WAAW;GAChB,MAAM,OAAO,MAAM,UAAU;GAC7B,KAAK,MAAM,UAAU,MAAM,KAAK,KAAKC,cAAY,KAAK,MAAM,MAAM,CAAC;GACnE;EACF;EACA,KAAK,KAAK,KAAK,SAAS,KAAK,MAAM,KAAK,IAAI;CAC9C;CACA,OAAO,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC;AAC1B;;AAGA,eAAsB,UAAU,SAOC;CAC/B,IAAI,QAAQ,YAAY,SAAS,CAAC,QAAQ,MAAM,QAAQ,OAAO,EAAE,OAAO,CAAC,EAAE;CAE3E,MAAM,OACJ,QAAQ,QAAS,MAAM,qBAAqB,QAAQ,OAAO,QAAQ,YAAY,KAAK;CACtF,MAAM,QAAkB,CAAC;CACzB,KAAK,MAAM,OAAO,MAAM;EACtB,MAAM,MAAM,MAAM,QAAQ,IAAI,QAAQ,GAAG;EACzC,IAAI,CAAC,IAAI,IAAI;GACX,QAAQ,KAAK,yBAAyB,IAAI,IAAI,IAAI,OAAO,EAAE;GAC3D;EACF;EACA,MAAM,OAAO,MAAM,IAAI,KAAK;EAC5B,MAAM,MAAM,cAAc,GAAG;EAC7B,MAAM,OAAO,KAAK,QAAQ,QAAQ,GAAG;EACrC,MAAM,MAAM,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;EAC9C,MAAM,UAAU,MAAM,IAAI;EAC1B,MAAM,KAAK,GAAG;CAChB;CACA,OAAO,EAAE,MAAM;AACjB;;;ACnEA,SAAgB,cAAc,UAA0B;CACtD,KAAK,MAAM,OAAO,WAChB,IAAI,SAAS,SAAS,GAAG,GAAG,OAAO,SAAS,MAAM,GAAG,CAAC,IAAI,MAAM;CAElE,OAAO;AACT;AAEA,SAAgB,UAAU,UAA2B;CACnD,IAAI,SAAS,SAAS,OAAO,GAAG,OAAO;CACvC,OAAO,UAAU,MAAM,QAAQ,SAAS,SAAS,GAAG,CAAC;AACvD;;AAGA,SAAgB,mBAAmB,UAA2B;CAC5D,MAAM,OAAO,SAAS,MAAM,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK;CAC/C,OAAO,iCAAiC,KAAK,IAAI;AACnD;AAEA,SAAgB,kBAAkB,UAA2B;CAC3D,MAAM,OAAO,SAAS,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK;CAC3C,IAAI,KAAK,WAAW,GAAG,GAAG,OAAO;CACjC,IAAI,KAAK,SAAS,OAAO,GAAG,OAAO;CACnC,IAAI,mBAAmB,IAAI,GAAG,OAAO;CACrC,MAAM,OAAO,cAAc,IAAI;CAC/B,IAAI,KAAK,WAAW,GAAG,KAAK,KAAK,WAAW,GAAG,GAAG,OAAO;CACzD,OAAO;AACT;AAEA,SAAgB,qBAAqB,UAA2B;CAC9D,OAAO,oCAAoC,KAAK,QAAQ;AAC1D;AAEA,SAAgB,0BAA0B,UAAkB,eAAgC;CAC1F,MAAM,QAAQ,SAAS,WAAW,MAAM,GAAG;CAC3C,MAAM,MAAM,cAAc,WAAW,MAAM,GAAG,CAAC,CAAC,QAAQ,OAAO,EAAE;CACjE,IAAI,MAAM,SAAS,IAAI,IAAI,EAAE,KAAK,MAAM,WAAW,GAAG,IAAI,EAAE,KAAK,MAAM,SAAS,GAAG,IAAI,EAAE,GAAG;EAC1F,MAAM,QAAQ,MAAM,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK;EAChD,IAAI,SAAS,UAAU,KAAK,KAAK,CAAC,kBAAkB,KAAK,GAAG,OAAO;CACrE;CACA,IAAI,qBAAqB,KAAK,GAAG,OAAO;CACxC,OAAO;AACT;;;ACdA,SAASC,UAAQ,GAAmB;CAClC,OAAO,EAAE,WAAW,MAAM,GAAG;AAC/B;AAEA,eAAe,UAAU,KAAgC;CACvD,MAAM,MAAgB,CAAC;CACvB,IAAI;CACJ,IAAI;EACF,UAAU,MAAM,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;CACtD,QAAQ;EACN,OAAO;CACT;CACA,KAAK,MAAM,SAAS,SAAS;EAC3B,IAAI,MAAM,KAAK,WAAW,GAAG,GAAG;EAChC,MAAM,OAAO,KAAK,KAAK,MAAM,IAAI;EACjC,IAAI,MAAM,YAAY,GAAG;GACvB,IAAI,MAAM,SAAS,gBAAgB;GACnC,IAAI,KAAK,GAAI,MAAM,UAAU,IAAI,CAAE;EACrC,OACE,IAAI,KAAK,IAAI;CAEjB;CACA,OAAO;AACT;AAEA,eAAsB,cAAc,QAA2C;CAC7E,MAAM,QAAQ,MAAM,UAAU,MAAM;CACpC,MAAM,yBAAS,IAAI,IAAoB;CACvC,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,MAAMA,UAAQ,SAAS,QAAQ,IAAI,CAAC;EAC1C,MAAM,OAAO,IAAI,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK;EACtC,IAAI,CAAC,UAAU,IAAI,KAAK,kBAAkB,IAAI,GAAG;EACjD,MAAM,WAAW,gBAAgB,GAAG;EACpC,OAAO,IAAI,SAAS,MAAM,IAAI;CAChC;CACA,OAAO,CAAC,GAAG,OAAO,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,WAAW;EAAE;EAAM;CAAK,EAAE;AACrE;AAEA,SAAgB,gBAAgB,UAA4B,UAA4B;CACtF,OAAO,SACJ,QAAQ,MAAM,WAAW,EAAE,MAAM,QAAQ,CAAC,CAAC,CAC3C,MAAM,GAAG,MAAM,UAAU,EAAE,IAAI,IAAI,UAAU,EAAE,IAAI,KAAK,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC,CAAC,CACrF,KAAK,MAAM,EAAE,IAAI;AACtB;AAEA,eAAsB,WAAW,SAKR;CACvB,MAAM,WAAW,KAAK,QAAQ,MAAM,QAAQ,QAAQ;CACpD,MAAM,gBAAgB,KAAK,QAAQ,MAAM,QAAQ,aAAa;CAC9D,MAAM,aAAa,KAAK,QAAQ,MAAM,QAAQ,UAAU;CACxD,MAAM,QAAQ,MAAM,UAAU,QAAQ;CACtC,MAAM,gBAA0E,CAAC;CAEjF,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,MAAMA,UAAQ,SAAS,UAAU,IAAI,CAAC;EAC5C,MAAM,OAAO,IAAI,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK;EACtC,IAAI,CAAC,UAAU,IAAI,GAAG;EACtB,IAAI,qBAAqB,GAAG,KAAK,kBAAkB,IAAI,GAAG;EAC1D,cAAc,KAAK;GAAE;GAAM;GAAK,UAAU,gBAAgB,GAAG;EAAE,CAAC;CAClE;CAEA,MAAM,UAAU,MAAM,cAAc,UAAU;CAE9C,MAAM,yBAAS,IAAI,IAA4C;CAC/D,KAAK,MAAM,QAAQ,eACjB,OAAO,IAAI,KAAK,SAAS,MAAM,IAAI;CAGrC,MAAM,QAAuB,CAAC;CAC9B,KAAK,MAAM,CAAC,SAAS,SAAS,QAAQ;EACpC,MAAM,WAAW,KAAK;EACtB,MAAM,WAAW,KAAK;EACtB,MAAM,eAAe,eAAe,MAAM,SAAS,UAAU,MAAM,CAAC;EACpE,MAAM,KAAK;GACT,GAAG;GACH,MAAM;GACN;GACA,IAAI;GACJ;GACA,SAAS,gBAAgB,SAAS,OAAO;EAC3C,CAAC;CACH;CAEA,MAAM,KAAK,aAAa;CAExB,MAAM,iBAAiB,CACrB,GAAI,MAAM,UAAU,aAAa,GACjC,IAAI,MAAM,UAAU,KAAK,QAAQ,MAAM,KAAK,CAAC,EAAA,CAAG,QAAQ,MAAM,qBAAqBA,UAAQ,CAAC,CAAC,CAAC,CAChG;CASA,OAAO;EAAE;EAAO,YARG,CAAC,GAAG,IAAI,IAAI,cAAc,CAAC,CAAC,CAC5C,QAAQ,SAAS;GAChB,MAAM,MAAMA,UAAQ,SAAS,QAAQ,MAAM,IAAI,CAAC;GAChD,MAAM,OAAO,IAAI,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK;GACtC,OAAO,UAAU,IAAI,KAAK,CAAC,kBAAkB,IAAI;EACnD,CAAC,CAAC,CACD,KAEsB;CAAE;AAC7B;AAEA,SAAgB,YAAY,SAAiB,MAAsB;CAEjE,OAAO,IADKA,UAAQ,SAAS,MAAM,OAAO,CAC7B;AACf;;;ACrIA,SAAgB,gBAAgB,IAAY,KAAsB;CAChE,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,WAAW,MAAM,GAAG;CAClD,IAAI,KAAK,SAAS,gBAAgB,GAAG,OAAO;CAC5C,MAAM,SAAS,IAAI,WAAW,MAAM,GAAG,CAAC,CAAC,QAAQ,OAAO,EAAE;CAC1D,OAAO,KAAK,SAAS,IAAI,OAAO,EAAE,KAAK,KAAK,WAAW,GAAG,OAAO,EAAE;AACrE;AAEA,SAAgB,wBAAwB,IAAY,eAAgC;CAClF,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,WAAW,MAAM,GAAG;CAClD,IAAI,KAAK,SAAS,gBAAgB,GAAG,OAAO;CAC5C,OAAO,0BAA0B,MAAM,aAAa;AACtD;AAEA,SAAgB,eAAe,IAAY,UAA2B;CACpE,OAAO,gBAAgB,IAAI,QAAQ;AACrC;AAEA,SAAgB,iBAAiB,IAAY,YAA6B;CACxE,OAAO,gBAAgB,IAAI,UAAU;AACvC;AAEA,SAAgB,mBAAmB,IAAY,MAAc,UAA2B;CACtF,OAAO,eAAe,IAAI,QAAQ,KAAK,eAAe,IAAI;AAC5D;;;ACtBA,MAAa,iBAAiB;AAI9B,SAAgB,iBAAiB,MAAmC,IAAoB;CACtF,OAAO;;;wCAG+B,KAAK,UAAU,IAAI,EAAE,QAAQ,KAAK,UAAU,EAAE,EAAE;;;;AAIxF;AAEA,SAAgB,mBAAmB,YAAkD;CACnF,OAAO;;;oDAG2C,WAAW,SAAS,WAAW;;;;AAInF;AAEA,SAAgB,gBACd,MACA,SAMyB;CACzB,MAAM,QAAQ,KAAK,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,WAAW,MAAM,GAAG;CACrD,IAAI,MAAM,SAAS,gBAAgB,GAAG;CAEtC,IAAI,CAAC,UADQ,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,KACrB,KAAK,CAAC,mBAAmB,KAAK,GAAG;CAEpD,IAAI,0BAA0B,OAAO,QAAQ,aAAa,GAAG,OAAO;CACpE,IAAI,iBAAiB,OAAO,QAAQ,UAAU,GAAG,OAAO;CACxD,IAAI,CAAC,eAAe,OAAO,QAAQ,QAAQ,GAAG;CAC9C,IAAI,mBAAmB,KAAK,GAAG,OAAO;CAKtC,IAAI,IAHoB,IACtB,CAAC,GAAI,QAAQ,mBAAmB,CAAC,CAAE,CAAC,CAAC,KAAK,UAAU,MAAM,WAAW,MAAM,GAAG,CAAC,CAEnE,CAAC,CAAC,IAAI,KAAK,GAAG,OAAO;CACnC,OAAO;AACT;AAEA,SAAgB,sBACd,MACA,MACA,MACS;CACT,MAAM,QAAQ,KAAK,WAAW,MAAM,GAAG;CACvC,MAAM,OAAO,MAAM,MAAM,MAAM,UAAU,MAAM,SAAS,WAAW,MAAM,GAAG,MAAM,KAAK;CACvF,IAAI,CAAC,MAAM,OAAO;CAClB,OAAO,eAAe,IAAI,MAAM,KAAK;AACvC;;;AC7DA,MAAM,oBAAoB;AAE1B,SAAgB,kBAAkB,MAAwD;CACxF,MAAM,wBAAQ,IAAI,IAAY;CAC9B,IAAI,aAAa,qCAAqC,KAAK,IAAI;CAE/D,KAAK,MAAM,KAAK,KAAK,SAAS,kEAAkE,GAC9F,MAAM,IAAI,EAAE,EAAE;CAEhB,KAAK,MAAM,KAAK,KAAK,SAAS,oDAAoD,GAChF,MAAM,IAAI,EAAE,EAAE;CAEhB,KAAK,MAAM,KAAK,KAAK,SAAS,yBAAyB,GACrD,KAAK,MAAM,QAAQ,EAAE,EAAE,CAAC,MAAM,GAAG,GAAG;EAClC,MAAM,OAAO,KAAK,KAAK;EACvB,IAAI,CAAC,MAAM;EACX,MAAM,UAAU,6BAA6B,KAAK,IAAI;EACtD,MAAM,OAAO,UAAU,QAAQ,KAAK,KAAK,MAAM,KAAK,CAAC,CAAC;EACtD,IAAI,SAAS,WAAW,aAAa;OAChC,IAAI,MAAM,MAAM,IAAI,IAAI;CAC/B;CAGF,OAAO;EAAE;EAAY,OAAO,CAAC,GAAG,KAAK;CAAE;AACzC;AAEA,SAAS,OAAO,IAAoB;CAClC,OAAO,4CAA4C,KAAK,UAAU,iBAAiB,EAAE,WAAW,KAAK,UAAU,cAAc,EAAE,MAAM,KAAK,UAAU,EAAE,EAAE;AAC1J;;AAGA,SAAgB,iBAAiB,MAAc,QAAwB;CACrE,MAAM,EAAE,YAAY,UAAU,kBAAkB,IAAI;CACpD,MAAM,QAAkB,CAAC;CACzB,KAAK,MAAM,QAAQ,OACjB,MAAM,KAAK,gBAAgB,KAAK,KAAK,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG;CAEpE,IAAI,cAAc,MAAM,WAAW,GACjC,MAAM,KAAK,kBAAkB,OAAO,GAAG,OAAO,SAAS,GAAG;CAE5D,OAAO,GAAG,MAAM,KAAK,IAAI,EAAE;AAC7B;AAEA,SAAS,WAAW,MAAc,OAAuB;CACvD,MAAM,QAAQ,KAAK;CACnB,IAAI,UAAU;CACd,KAAK,IAAI,IAAI,QAAQ,GAAG,IAAI,KAAK,QAAQ,KAAK;EAC5C,MAAM,KAAK,KAAK;EAChB,IAAI,CAAC,WAAW,OAAO,OAAO,OAAO,IAAI;EACzC,UAAU,CAAC,WAAW,OAAO;CAC/B;CACA,OAAO,KAAK;AACd;AAEA,SAAS,kBAAkB,MAAc,WAA2B;CAClE,IAAI,QAAQ;CACZ,KAAK,IAAI,IAAI,WAAW,IAAI,KAAK,QAAQ,KAAK;EAC5C,MAAM,KAAK,KAAK;EAChB,MAAM,OAAO,KAAK,IAAI;EACtB,IAAI,OAAO,OAAO,OAAO,QAAO,OAAO,KAAK;GAC1C,IAAI,WAAW,MAAM,CAAC,IAAI;GAC1B;EACF;EACA,IAAI,OAAO,OAAO,SAAS,KAAK;GAC9B,MAAM,KAAK,KAAK,QAAQ,MAAM,CAAC;GAC/B,IAAI,KAAK,GAAG,OAAO;GACnB,IAAI;GACJ;EACF;EACA,IAAI,OAAO,OAAO,SAAS,KAAK;GAC9B,MAAM,MAAM,KAAK,QAAQ,MAAM,IAAI,CAAC;GACpC,IAAI,MAAM,GAAG,OAAO;GACpB,IAAI,MAAM;GACV;EACF;EACA,IAAI,OAAO,KAAK;OACX,IAAI,OAAO,KAAK;GACnB;GACA,IAAI,UAAU,GAAG,OAAO;EAC1B;CACF;CACA,OAAO;AACT;;AAGA,SAAgB,+BAA+B,MAAuB;CACpE,OAAO,6CAA6C,KAAK,IAAI;AAC/D;;AAGA,SAAgB,sBAAsB,MAAc,OAAO,IAAa;CACtE,MAAM,aAAa,KAAK,WAAW,MAAM,GAAG;CAC5C,IAAI,WAAW,SAAS,gBAAgB,GAAG,OAAO;CAClD,IAAI,WAAW,SAAS,eAAe,GAAG,OAAO;CACjD,IAAI,qEAAqE,KAAK,UAAU,GAAG,OAAO;CAClG,OAAO,+BAA+B,IAAI;AAC5C;;;;;AAMA,SAAgB,sBAAsB,MAAc,SAAS,IAAY;CACvE,IAAI,CAAC,mBAAmB,IAAI,KAAK,+BAA+B,IAAI,GAAG,OAAO;CAC9E,IAAI,MAAM;CACV,IAAI,OAAO;CACX,sBAAsB,YAAY;CAClC,IAAI;CACJ,OAAQ,QAAQ,sBAAsB,KAAK,IAAI,GAAI;EACjD,MAAM,OAAO,MAAM,QAAQ,MAAM,EAAE,CAAC,SAAS;EAC7C,MAAM,QAAQ,kBAAkB,MAAM,IAAI;EAC1C,IAAI,QAAQ,GAAG;EACf,OAAO,KAAK,MAAM,MAAM,OAAO,CAAC;EAChC,MAAM,KAAK,SAAS,KAAK,UAAU,GAAG,OAAO,IAAI,IAAI,KAAA;EACrD,MAAM,OAAO,KACT,4CAA4C,KAAK,UAAU,iBAAiB,EAAE,WAAW,KAAK,UAAU,cAAc,EAAE,MAAM,GAAG,MACjI,8BAA8B,KAAK,UAAU,iBAAiB,EAAE;EACpE,OAAO;EACP,OAAO;EACP,sBAAsB,YAAY;CACpC;CACA,OAAO,KAAK,MAAM,IAAI;CACtB,OAAO;AACT;;;AC/EA,MAAM,WAAW;CACf,UAAU,KAAK;CACf,YAAY,KAAK;CACjB,QAAQ,KAAK;CACb,QAAQ,KAAK;CACb,aAAa,KAAK;CAClB,UAAU,KAAK;AACjB;AAEA,MAAM,OAAO;AACb,MAAM,OAAO;AAEb,SAAgB,YAAY,MAAc,QAAwC;CAChF,IAAI,MAAM;CACV,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,GAC9C,MAAM,IAAI,QAAQ,IAAI,OAAO,KAAK;CAEpC,IAAI,CAAC,IAAI,WAAW,GAAG,GAAG,MAAM,IAAI;CACpC,OAAO;AACT;AAEA,SAAS,eAAe,UAA2B,CAAC,GAAiB;CACnE,OAAO;EACL,UAAU,QAAQ,YAAA;EAClB,YAAY,QAAQ,cAAA;EACpB,eAAe,QAAQ,iBAAA;EACvB,OAAO,QAAQ,SAAA;EACf,WAAW,QAAQ,cAAc;EACjC,eAAe,QAAQ,iBAAiB;EACxC,QAAQ,QAAQ;CAClB;AACF;AAEA,SAAS,QAAQ,GAAmB;CAClC,OAAO,EAAE,WAAW,MAAM,GAAG;AAC/B;AAEA,SAAS,WAAW,KAAqB;CACvC,OAAO,KAAK,UAAU,QAAQ,GAAG,CAAC;AACpC;AAEA,SAAS,iBAAiB,MAAmB,UAA8B;CACzE,MAAM,QAAQ,KAAK,UAAU;EAC3B,eAAe,SAAS,kBAAkB;EAC1C,WAAW,SAAS;CACtB,CAAC;CAgBD,OAAO;;cAEK,MAAM;YAjBJ,KAAK,MAAM,KAAK,SAAS;EACrC,OAAO;YACC,KAAK,UAAU,KAAK,EAAE,EAAE;cACtB,KAAK,UAAU,KAAK,IAAI,EAAE;iBACvB,KAAK,UAAU,KAAK,OAAO,EAAE;sBACxB,KAAK,aAAa;kBACtB,KAAK,SAAS;oBACZ,KAAK,WAAW;oBAChB,KAAK,UAAU,KAAK,UAAU,EAAE;gBACpC,MAAM;+BACS,WAAW,KAAK,QAAQ,EAAE;QACjD,KAAK,eAAe,gCAAgC,WAAW,KAAK,QAAQ,EAAE,MAAM,GAAG;sBACzE,KAAK,QAAQ,KAAK,MAAM,gBAAgB,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE;;CAEzF,CAIc,CAAC,CAAC,KAAK,KAAK,EAAE;;;AAG9B;AAEA,SAAS,mBAAmB,MAAmB,MAAsB;CAInE,OAAO,gCAHS,KAAK,WAAW,KAC7B,SAAS,GAAG,KAAK,UAAU,YAAY,MAAM,IAAI,CAAC,EAAE,iBAAiB,WAAW,IAAI,EAAE,EAE5C,CAAC,CAAC,KAAK,KAAK,EAAE;AAC7D;AAEA,SAAS,oBAAoB,MAA2B;CAMtD,OAAO,iCALS,KAAK,MAClB,QAAQ,MAAM,EAAE,YAAY,CAAC,CAC7B,KACE,MAAM,GAAG,KAAK,UAAU,EAAE,IAAI,EAAE,iBAAiB,WAAW,EAAE,QAAQ,EAAE,EAE/B,CAAC,CAAC,KAAK,KAAK,EAAE;AAC9D;AAEA,SAAS,mBAAmB,MAAc,OAAwB;CAChE,MAAM,aAAa,QAAQ,2BAA2B;CACtD,MAAM,gBAAgB;CACtB,OACE,KAEG,WAAW,wBAAwB,UAAU,CAAC,CAC9C,WAAW,4BAA4B,aAAa,CAAC,CACrD,WAAW,4BAA4B,UAAU,CAAC,CAClD,WAAW,gCAAgC,aAAa,CAAC,CAEzD,QACC,kFACA,UAAU,cAAc,GAC1B,CAAC,CACA,QACC,8EACA,UAAU,WAAW,GACvB,CAAC,CACA,WAAW,uCAAuC,wBAAwB;AAEjF;AAEA,IAAI;AACJ,IAAI;AAEJ,eAAe,QAAQ,MAAc,UAA8C;CACjF,IAAI,cAAc,eAAe,MAAM,OAAO;CAC9C,aAAa,MAAM,WAAW;EAC5B;EACA,UAAU,SAAS;EACnB,eAAe,SAAS;EACxB,YAAY,SAAS;CACvB,CAAC;CACD,aAAa;CACb,OAAO;AACT;AAEA,SAAS,iBAAiB;CACxB,aAAa,KAAA;AACf;AAEA,SAAS,cAAc,MAAc,UAAiC;CACpE,MAAM,QAAQ,QAAQ,IAAI;CAC1B,OAAO;EAAC,SAAS;EAAU,SAAS;EAAY,SAAS;CAAa,CAAC,CAAC,MAAM,QAC5E,MAAM,SAAS,QAAQ,GAAG,CAAC,CAC7B;AACF;AAEA,SAAS,oBAAoB,QAAuB;CAClD,KAAK,MAAM,MAAM;EAAC,SAAS;EAAU,SAAS;EAAY,SAAS;CAAW,GAAG;EAC/E,MAAM,MAAM,OAAO,YAAY,cAAc,EAAE;EAC/C,IAAI,KAAK,OAAY,aAAa,GAAG;CACvC;AACF;AAEA,SAAS,WAAW,QAAuB,UAAwB;CACjE,MAAM,OAAO;EACX,SAAS;EACT,SAAS;EACT,SAAS;CACX;CACA,KAAK,MAAM,OAAO,MAAM,OAAO,QAAQ,IAAI,KAAK,OAAO,OAAO,MAAM,GAAG,CAAC;CAExE,MAAM,gBAAgB,SAAiB;EACrC,IAAI,CAAC,cAAc,MAAM,QAAQ,GAAG;EACpC,eAAe;EACf,oBAAoB,MAAM;CAC5B;CAEA,MAAM,YAAY,SAAiB;EACjC,IAAI,CAAC,cAAc,MAAM,QAAQ,GAAG;EACpC,IAAI;GACF,MAAM,OAAO,aAAa,MAAM,MAAM;GACtC,IAAI,CAAC,sBAAsB,MAAM,YAAY,IAAI,GAAG;EACtD,QAAQ;GACN;EACF;EACA,eAAe;EACf,oBAAoB,MAAM;CAC5B;CAEA,OAAO,QAAQ,GAAG,OAAO,YAAY;CACrC,OAAO,QAAQ,GAAG,UAAU,YAAY;CACxC,OAAO,QAAQ,GAAG,UAAU,QAAQ;AACtC;AAEA,SAAS,iBAAiB,QAAuB,MAAwB;CACvE,MAAM,SAAS,OAAO,aAAa;CACnC,iBAAiB;EACf,QAAQ,IAAI,KAAK;GACf,MAAM;GACN,OAAO;GACP,MAAM,EAAE,KAAK;EACf,CAAC;CACH,GAAG,CAAC;AACN;;;;AAKA,SAAgB,KAAK,UAA2B,CAAC,GAAa;CAC5D,MAAM,WAAW,eAAe,OAAO;CACvC,IAAI;CACJ,IAAI,UAA6B;CACjC,MAAM,kBAAkB;CAyTxB,OAAO;EAAC;GAtTN,MAAM;GACN,OAAO,MAAM,KAAK;IAChB,UAAU,IAAI;IAGd,OAAO;KACL,SAAS,EAAE,QAAQ,CAAC,MAAM,EAAE;KAC5B,KAAK,EAAE,YAAY,CAAC,UAAU,MAAM,EAAE;KACtC,cAAc,EAAE,SAAS,CAAC,UAAU,MAAM,EAAE;IAC9C;GACF;GACA,kBAAkB,MAAM;IACtB,IAAI,SAAS,OACX,OAAO;KACL,SAAS,EAAE,YAAY,CAAC,UAAU,MAAM,EAAE;KAC1C,cAAc,EAAE,SAAS,CAAC,MAAM,EAAE;IACpC;IAEF,IAAI,SAAS,UAIX,OAAO;KACL,SAAS,EACP,OAAO;MACL;OAAE,MAAM;OAA4B,aAAa;MAAyB;MAC1E;OAAE,MAAM;OAAwB,aAAa;MAAqB;MAClE;OAAE,MAAM;OAAgC,aAAa;MAAyB;MAC9E;OAAE,MAAM;OAA4B,aAAa;MAAqB;MACtE;OAAE,MAAM;OAAoB,aAAa;MAAgB;MACzD;OAAE,MAAM;OAAe,aAAa;MAAgB;KACtD,EACF;KACA,OAAO,EACL,eAAe;MACb,OAAO,EACL,eAAe,eACjB;MACA,QAAQ,EACN,iBAAiB,UAAU;OACzB,IAAI,MAAM,SAAS,eAAe,OAAO;OACzC,OAAO;MACT,EACF;KACF,EACF;IACF;GAEJ;GACA,eAAe,GAAG;IAChB,SAAS;IACT,MAAM,WAAW,KAAK,EAAE,MAAM,eAAe;IAC7C,IAAI,CAAC,SAAS,UAAU,WAAW,QAAQ,GAAG,SAAS,SAAS;GAClE;GACA,gBAAgB,QAAQ;IACtB,WAAW,QAAQ,QAAQ;GAC7B;GACA,UAAU,EAAE,MAAM,UAAU;IAC1B,MAAM,OAAO,gBAAgB,MAAM;KACjC,UAAU,SAAS;KACnB,YAAY,SAAS;KACrB,eAAe,SAAS;KACxB,iBAAiB,YAAY,MAAM,QAAQ,SAAS,KAAK,YAAY,CAAC,CAAC,KAAK,SAAS,KAAK,QAAQ;IACpG,CAAC;IACD,IAAI,CAAC,MAAM;IACX,IAAI,SAAS,eAAe,SAAS,eAAe;IAEpD,IAAI,KAAK,YAAY,SAAS,UAAU;KACtC,IAAI,CAAC,OAAO,aAAa,KAAK,iBAAiB,QAAQ,IAAI;KAC3D,OAAO,CAAC;IACV;IAEA,IAAI,KAAK,YAAY,SAAS,OAAO,iBAAiB,QAAQ,IAAI;GACpE;EA6OiB;EAAG;GAzOpB,MAAM;GACN,UAAU,IAAI;IACZ,IAAI,OAAA,yBAAyB,OAAO,SAAS;IAC7C,IAAI,OAAA,2BAA2B,OAAO,SAAS;IAC/C,IAAI,OAAA,uBAAuB,OAAO,SAAS;IAC3C,IAAI,OAAA,uBAAuB,OAAO,SAAS;IAC3C,IAAI,OAAA,6BAA6B,OAAO,SAAS;IACjD,IAAI,OAAA,0BAA0B,OAAO,SAAS;GAChD;GACA,MAAM,KAAK,IAAI;IACb,MAAM,OAAO,QAAQ,QAAQ,QAAQ,IAAI;IACzC,MAAM,QAAQ,YAAY;IAC1B,IAAI,OAAO,SAAS,UAClB,OAAO,iBAAiB,MAAM,QAAQ,MAAM,QAAQ,GAAG;KACrD,eAAe,SAAS;KACxB,WAAW,SAAS;IACtB,CAAC;IAEH,IAAI,OAAO,SAAS,YAAY;KAC9B,MAAM,OAAO,mBAAmB,MAAM,QAAQ,MAAM,QAAQ,GAAG,IAAI;KACnE,OAAO,QAAQ,GAAG,OAAO,mBAAmB,YAAY,MAAM;IAChE;IACA,IAAI,OAAO,SAAS,aAAa;KAC/B,MAAM,OAAO,oBAAoB,MAAM,QAAQ,MAAM,QAAQ,CAAC;KAC9D,OAAO,QAAQ,GAAG,OAAO,mBAAmB,aAAa,MAAM;IACjE;IACA,IAAI,OAAO,SAAS,QAClB,OAAO,wBAAwB,MAAM,mCAAmC,KAAK,UAAU,QAAQ,6BAA6B,eAAe,EAAE;IAE/I,IAAI,OAAO,SAAS,UAClB,OAAO;;;;;;;;;;;;;;;;;;IAmBT,IAAI,OAAO,SAAS,QAAQ;KAC1B,MAAM,OAAO,SAAS;KACtB,MAAM,UAAU,OAAQ,WAAW,IAAI,IAAI,OAAO,KAAK,MAAM,IAAI,IAAK,KAAA;KAEtE,OAAO,GADY,WAAW,WAAW,OAAO,IAAI,UAAU,WAAW,OAAO,EAAE,MAAM,GACnE,8BAA8B,mBAAmB;+BAC/C,qBAAqB;;;;;uBAK7B,KAAK,UAAU,cAAc,EAAE;;;IAGhD;GACF;EA0KgC;EAAG;GAtKnC,MAAM;GACN,SAAS;GACT,UAAU,MAAM,IAAI,OAAO;IACzB,IAAI,OAAO,KAAK,OAAO;IACvB,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,WAAW,MAAM,GAAG;IAClD,IAAI,sBAAsB,MAAM,IAAI,GAAG,OAAO;IAC9C,IAAI,mBAAmB,IAAI,GACzB,OAAO;KAAE,MAAM,iBAAiB,MAAM,IAAI;KAAG,KAAK;IAAK;IAEzD,IAAI,CAAC,mBAAmB,IAAI,GAAG,OAAO;IACtC,OAAO;KAAE,MAAM,sBAAsB,MAAM,IAAI;KAAG,KAAK;IAAK;GAC9D;EA2JgD;EAAG;GAvJnD,MAAM;GACN,SAAS;GACT,MAAM,UAAU,QAAQ,UAAU,OAAO;IACvC,IAAI,OAAO,SAAS,IAAI,GAAG,OAAO,OAAO,MAAM,GAAG,OAAO,QAAQ,IAAI,CAAC;IACtE,IAAI,OAAO,SAAS,IAAI,KAAK,UAAU,SAAS,IAAI,KAAK,UAAU,SAAS,IAAI,GAAG;IACnF,IAAI,CAAC,YAAY,CAAC,OAAO,KAAK;IAC9B,MAAM,OAAO,MAAM,KAAK,QAAQ,QAAQ,UAAU,EAAE,UAAU,KAAK,CAAC;IACpE,IAAI,CAAC,MAAM;IACX,MAAM,OAAO,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC;IAChC,IAAI,wBAAwB,MAAM,SAAS,aAAa,GAAG,OAAO,GAAG,OAAO;GAC9E;GACA,KAAK,IAAI;IACP,IAAI,CAAC,GAAG,SAAS,IAAI,GAAG;IACxB,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,CAAC;IAE3B,MAAM,MAAM,YAAY,MADX,QAAQ,QAAQ,QAAQ,IAAI,CACP;IAClC,OAAO;wBACW,KAAK,UAAU,OAAO,IAAI,EAAE;;0CAEV,KAAK,UAAU,GAAG,EAAE;;GAE1D;GACA,MAAM,UAAU,MAAM,IAAI,OAAO;IAC/B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,CAAC;IAC3B,MAAM,aAAa,wBAAwB,MAAM,SAAS,aAAa;IACvE,MAAM,aAAa,mBAAmB,IAAI,MAAM,SAAS,QAAQ;IACjE,IAAI,CAAC,cAAc,CAAC,YAAY,OAAO;IACvC,IAAI,OAAO,KAKT,OAAO;KAAE,MAJI,KAAK,WAChB,uCACA,SAAS,kBAAkB,EAEX;KAAG,KAAK;IAAK;IAEjC,IAAI,OAAO,mBAAmB,MAAM,YAAY,OAAO;IACvD,IAAI,YAAY,SAAS;KACvB,IAAI,YACF,QAAQ,iBAAiB,aAAa,YAAY,MAAM,QAAQ,QAAQ,QAAQ,IAAI,CAAC,CAAC;UACjF,IAAI,YAAY;MAErB,MAAM,QAAO,MADM,QAAQ,QAAQ,QAAQ,QAAQ,IAAI,GAAG,QAAQ,EAAA,CAChD,MAAM,MAAM,UAAU,QAAQ,MAAM,QAAQ,MAAM,QAAQ,IAAI,CAAC;MACjF,IAAI,MAAM,QAAQ,iBAAiB,eAAe,KAAK,IAAI;KAC7D;IACF;IACA,OAAO;KAAE,MAAM;KAAM,KAAK;IAAK;GACjC;EA0GiE;EAAG;GAdpE,MAAM;GACN,SAAS;GACT,UAAU,MAAM,IAAI;IAGlB,IAAI,KAAK,aAAa,SAAS,UAAU,OAAO;IAChD,IAAI,GAAG,SAAS,cAAc,KAAK,CAAC,GAAG,SAAS,MAAM,GAAG,OAAO;IAChE,IAAI,CAAC,KAAK,SAAS,MAAM,KAAK,CAAC,uBAAuB,KAAK,IAAI,GAAG,OAAO;IACzE,MAAM,OAAO,mBAAmB,MAAM,YAAY,OAAO;IACzD,IAAI,SAAS,MAAM,OAAO;IAC1B,OAAO;KAAE,MAAM;KAAM,KAAK;IAAK;GACjC;EAGkF;EAAG;GAtGrF,MAAM;GACN,OAAO;GACP,SAAS;GACT,MAAM,cAAc;IAClB,IAAI,CAAC,SAAS,WAAW;IACzB,MAAM,UAAW,KAA6C,aAAa;IAE3E,IAAI,WAAW,YAAY,UAAU;IACrC,MAAM,OAAO,OAAO;IACpB,IAAI;KACF,MAAM,YAAY,OAAO,cAAc,KAAK,OAAO,SAC/C,WAAW,OAAO,aAAa,IAAI,MAAM,MAAM,IAC7C,OAAO,aAAa,IAAI,MAAM,SAC9B,KAAK,MAAM,OAAO,aAAa,IAAI,MAAM,MAAM,IACjD,KAAK,MAAM,QAAQ,KAAK;KAC5B,MAAM,YAAY,OAAO,cAAc,QAAQ,OAAO,SAClD,WAAW,OAAO,aAAa,OAAO,MAAM,MAAM,IAChD,OAAO,aAAa,OAAO,MAAM,SACjC,KAAK,MAAM,OAAO,aAAa,OAAO,MAAM,MAAM,IACpD,KAAK,MAAM,QAAQ,QAAQ;KAC/B,MAAM,aAAa,KAAK,WAAW,UAAU;KAC7C,IAAI,CAAC,WAAW,UAAU,GAAG;MAC3B,QAAQ,KAAK,qCAAqC,YAAY;MAC9D;KACF;KAIA,MAAM,OAAM,MAHU,OAAO,cAAc,UAAU,CAAC,CAAC,MAAA,CAGpC;KACnB,IAAI,OAAO,KAAK,YAAY,YAAY;MACtC,QAAQ,KAAK,mDAAmD;MAChE;KACF;KAEA,MAAM,OAAO,MAAM,QAAQ,MAAM,QAAQ;KACzC,MAAM,mBAAmB,KAAK,WAAW,SAAS,eAAe;KACjE,MAAM,eAAe,WAAW,gBAAgB,IAC3C,KAAK,MAAM,aAAa,kBAAkB,MAAM,CAAC,IAIlD,CAAC;KAEL,MAAM,YAAY,OAAO,YAAsC;MAC7D,MAAM,MAAM,QAAQ,SAAS,MAAM,OAAO,CAAC;MAC3C,MAAM,QAAQ,aAAa,QAAQ,aAAa,IAAI;MACpD,IAAI,CAAC,OAAO,MAAM,OAAO,KAAA;MACzB,OAAO,OAAO,cAAc,KAAK,WAAW,MAAM,IAAI,CAAC,CAAC,CAAC;KAC3D;KAEA,MAAM,OAAiB,CAAC;KACxB,KAAK,MAAM,QAAQ,KAAK,OAAO;MAC7B,MAAM,UAAU,MAAM,UAAU,KAAK,QAAQ;MAC7C,MAAM,SAAS,mBACb,WAAW,OAAO,YAAY,WACzB,QAAkC,UACnC,KAAA,CACN;MACA,IAAI,CAAC,oBAAoB,QAAQ,QAAQ,SAAS,SAAS,GAAG;MAE9D,MAAM,YAAY,QAAQ,QAAQ;MAClC,IAAI,KAAK,UACP,KAAK,KAAK,KAAK,IAAI;WACd,IAAI,WAAW;OACpB,MAAM,OAAO,MAAM,UAAU;OAC7B,KAAK,MAAM,UAAU,MACnB,KAAK,KAAK,YAAY,KAAK,MAAM,MAAM,CAAC;MAE5C;KACF;KAEA,MAAM,SAAS,MAAM,UAAU;MAC7B;MACA,OAAO,CAAC;MACR;MACA,QAAQ;MACR,SAAS;KACX,CAAC;KACD,IAAI,OAAO,MAAM,QACf,QAAQ,KAAK,sBAAsB,OAAO,MAAM,OAAO,aAAa,WAAW;IAEnF,SAAS,KAAK;KACZ,QAAQ,KAAK,6BAA6B,GAAG;IAC/C;GACF;EAkBmG;CAAC;AACxG"}