vinojs 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/dist/client.mjs +1 -1
  2. package/dist/{compile-Lxl_tdxL.mjs → compile-glNMkyyx.mjs} +3 -47
  3. package/dist/compile-glNMkyyx.mjs.map +1 -0
  4. package/dist/{definePage-Ba4r-TFh.mjs → definePage--9Pz7rHs.mjs} +29 -7
  5. package/dist/definePage--9Pz7rHs.mjs.map +1 -0
  6. package/dist/defineServerFn-H-bz7xBX.mjs +47 -0
  7. package/dist/defineServerFn-H-bz7xBX.mjs.map +1 -0
  8. package/dist/factory-AHIdhfy4.d.mts +143 -0
  9. package/dist/factory-AHIdhfy4.d.mts.map +1 -0
  10. package/dist/factory.d.mts +2 -0
  11. package/dist/factory.mjs +35 -0
  12. package/dist/factory.mjs.map +1 -0
  13. package/dist/vino.d.mts +4 -103
  14. package/dist/vino.d.mts.map +1 -1
  15. package/dist/vino.mjs +5 -3
  16. package/dist/vino.mjs.map +1 -1
  17. package/dist/vite.mjs +3 -2
  18. package/dist/vite.mjs.map +1 -1
  19. package/package.json +5 -1
  20. package/dist/compile-Lxl_tdxL.mjs.map +0 -1
  21. package/dist/definePage-Ba4r-TFh.mjs.map +0 -1
  22. package/examples/basic/dist/client/.assetsignore +0 -2
  23. package/examples/basic/dist/client/about.html +0 -1
  24. package/examples/basic/dist/client/admin.html +0 -1
  25. package/examples/basic/dist/client/assets/Counter-BvqMZKON.js +0 -1
  26. package/examples/basic/dist/client/assets/_slug_-CYpOSbrn.js +0 -1
  27. package/examples/basic/dist/client/assets/about-BZXRzUyv.js +0 -1
  28. package/examples/basic/dist/client/assets/admin-DRE7uh2s.js +0 -1
  29. package/examples/basic/dist/client/assets/client-B6nFkut5.js +0 -1
  30. package/examples/basic/dist/client/assets/client-pages-Bc6cNZAm.js +0 -2
  31. package/examples/basic/dist/client/assets/components-DX9r6vHn.js +0 -1
  32. package/examples/basic/dist/client/assets/components-DsWJ6F73.js +0 -2
  33. package/examples/basic/dist/client/assets/counter-DBpvln_F.js +0 -1
  34. package/examples/basic/dist/client/assets/dom-B5sHIJ1E.js +0 -1
  35. package/examples/basic/dist/client/assets/honoto-9UtdLp4J.js +0 -33
  36. package/examples/basic/dist/client/assets/honoto-client-DEh86_WZ.css +0 -1
  37. package/examples/basic/dist/client/assets/honoto-client.js +0 -2
  38. package/examples/basic/dist/client/assets/hooks-Cz6AT21d.js +0 -1
  39. package/examples/basic/dist/client/assets/jsx-dev-runtime-92VDsVyo.js +0 -1
  40. package/examples/basic/dist/client/counter.html +0 -1
  41. package/examples/basic/dist/client/index.html +0 -1
  42. package/examples/basic/dist/client/jobs.html +0 -1
  43. package/examples/basic/dist/ssr/.vite/manifest.json +0 -140
  44. package/examples/basic/dist/ssr/assets/_slug_-CY3-kffX.js +0 -46
  45. package/examples/basic/dist/ssr/assets/about-CTDjNhkO.js +0 -15
  46. package/examples/basic/dist/ssr/assets/admin-DvS-UGJx.js +0 -26
  47. package/examples/basic/dist/ssr/assets/constants-UoriGYcX-CUecBFMT.js +0 -6
  48. package/examples/basic/dist/ssr/assets/counter-DfIbc9Sp.js +0 -30
  49. package/examples/basic/dist/ssr/assets/honoto-CA313cVy.js +0 -2129
  50. package/examples/basic/dist/ssr/assets/jobs-D9hh-UO9.js +0 -42
  51. package/examples/basic/dist/ssr/assets/jsx-CgYLQazd.js +0 -1080
  52. package/examples/basic/dist/ssr/assets/jsx-dev-runtime-BlUda7H8.js +0 -742
  53. package/examples/basic/dist/ssr/assets/jsx-renderer-CzZcZPnS.js +0 -65
  54. package/examples/basic/dist/ssr/assets/layout-DYvLwr2u.js +0 -53
  55. package/examples/basic/dist/ssr/assets/pages-DB6jeyrt.js +0 -53
  56. package/examples/basic/dist/ssr/assets/rolldown-runtime-D7D4PA-g.js +0 -13
  57. package/examples/basic/dist/ssr/assets/ssr-hooks-CBQr0cdH.js +0 -7
  58. package/examples/basic/dist/ssr/index.js +0 -22
  59. package/examples/basic/dist/ssr/wrangler.json +0 -1
  60. package/examples/full/dist/client/.assetsignore +0 -2
  61. package/examples/full/dist/client/assets/BookmarkButton-py0xGxgl.js +0 -1
  62. package/examples/full/dist/client/assets/_slug_-DZUFsE9O.js +0 -1
  63. package/examples/full/dist/client/assets/auth-client-D2Wtuobe.js +0 -1
  64. package/examples/full/dist/client/assets/bun-sqlite-dialect-C7ftEUSI-CsHdUKBY.js +0 -1
  65. package/examples/full/dist/client/assets/client-B6nFkut5.js +0 -1
  66. package/examples/full/dist/client/assets/client-pages-fshKs747.js +0 -2
  67. package/examples/full/dist/client/assets/components-DX9r6vHn.js +0 -1
  68. package/examples/full/dist/client/assets/components-S_-rWrKi.js +0 -2
  69. package/examples/full/dist/client/assets/d1-sqlite-dialect-BZmaVTp8-FPCaMZqX.js +0 -1
  70. package/examples/full/dist/client/assets/default-query-compiler-CUdqIu1h.js +0 -1
  71. package/examples/full/dist/client/assets/dist-BoGTNvkC.js +0 -1
  72. package/examples/full/dist/client/assets/dom-DCd3wYW7.js +0 -1
  73. package/examples/full/dist/client/assets/factory-Bgf4EtLx.js +0 -8
  74. package/examples/full/dist/client/assets/honoto-client-BSvNAnxN.css +0 -1
  75. package/examples/full/dist/client/assets/honoto-client.js +0 -2
  76. package/examples/full/dist/client/assets/hooks-Cz6AT21d.js +0 -1
  77. package/examples/full/dist/client/assets/jsx-dev-runtime-92VDsVyo.js +0 -1
  78. package/examples/full/dist/client/assets/kysely-adapter-BHhasAnc.js +0 -1
  79. package/examples/full/dist/client/assets/kysely-migration-tables-DFfmKhq--U5ujlMwE.js +0 -1
  80. package/examples/full/dist/client/assets/node-sqlite-dialect-DJDXH5Ot.js +0 -1
  81. package/examples/full/dist/client/assets/pages-CUQx6Eus.js +0 -1
  82. package/examples/full/dist/client/assets/saved-jIi74ncJ.js +0 -1
  83. package/examples/full/dist/client/assets/session-B-accyM3.js +0 -611
  84. package/examples/full/dist/client/assets/sign-in-BelI3gSs.js +0 -1
  85. package/examples/full/dist/client/assets/sign-up-pR94lfdu.js +0 -1
  86. package/examples/full/dist/client/index.html +0 -1
  87. package/examples/full/dist/client/saved.html +0 -1
  88. package/examples/full/dist/client/sign-in.html +0 -1
  89. package/examples/full/dist/client/sign-up.html +0 -1
  90. package/examples/full/dist/ssr/.dev.vars +0 -1
  91. package/examples/full/dist/ssr/.vite/manifest.json +0 -219
  92. package/examples/full/dist/ssr/assets/BookmarkButton-KS7z5_vi.js +0 -298
  93. package/examples/full/dist/ssr/assets/_slug_-rRStRaAN.js +0 -89
  94. package/examples/full/dist/ssr/assets/auth-DSFZ4iak.js +0 -31434
  95. package/examples/full/dist/ssr/assets/auth-client-BFSBVoML.js +0 -894
  96. package/examples/full/dist/ssr/assets/bun-sqlite-dialect-C7ftEUSI-BeXpIqKl.js +0 -162
  97. package/examples/full/dist/ssr/assets/compiled-query-DmoyCh28.js +0 -8410
  98. package/examples/full/dist/ssr/assets/d1-sqlite-dialect-BZmaVTp8-CjJdvL94.js +0 -114
  99. package/examples/full/dist/ssr/assets/default-query-compiler-D7xOzCCJ.js +0 -1727
  100. package/examples/full/dist/ssr/assets/dist-LmmDoNdk.js +0 -6832
  101. package/examples/full/dist/ssr/assets/dist-kFDN1l4Z.js +0 -342
  102. package/examples/full/dist/ssr/assets/factory-AD6s9SIW.js +0 -2079
  103. package/examples/full/dist/ssr/assets/jsx-renderer-mMLf5XLN.js +0 -1926
  104. package/examples/full/dist/ssr/assets/kysely-adapter-BCLenpM8.js +0 -2
  105. package/examples/full/dist/ssr/assets/kysely-migration-tables-DFfmKhq--BtVr6hRe.js +0 -17
  106. package/examples/full/dist/ssr/assets/layout-mVA7qP4j.js +0 -44
  107. package/examples/full/dist/ssr/assets/node-sqlite-dialect-D-wtYAD7.js +0 -162
  108. package/examples/full/dist/ssr/assets/pages-Do5kR_Ia.js +0 -147
  109. package/examples/full/dist/ssr/assets/saved-Dr4pP6B5.js +0 -111
  110. package/examples/full/dist/ssr/assets/session-BvIpX7tr.js +0 -13
  111. package/examples/full/dist/ssr/assets/sign-in-22pzTnJE.js +0 -115
  112. package/examples/full/dist/ssr/assets/sign-up-CN4j8Qg1.js +0 -117
  113. package/examples/full/dist/ssr/assets/sqlite-adapter-DVlms5wO.js +0 -79
  114. package/examples/full/dist/ssr/index.js +0 -97
  115. package/examples/full/dist/ssr/wrangler.json +0 -1
package/dist/vite.mjs CHANGED
@@ -1,6 +1,7 @@
1
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-Ba4r-TFh.mjs";
3
- import { a as pathDepth, c as SERVER_FN_KIND, f as usesDefineServerFn, i as pathCovers, n as compareRoutes, o as urlToHtmlFile, p as loadMergedConfig, r as compileFilePath, s as DEFINE_SERVER_FN_CALL, t as applyParams$1 } from "./compile-Lxl_tdxL.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";
4
5
  import { existsSync, readFileSync } from "node:fs";
5
6
  import { dirname, isAbsolute, join, relative } from "node:path";
6
7
  import { pathToFileURL } from "node:url";
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":["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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vinojs",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Hono + Vite meta-framework: file routing, SSR, SSG, and hono/jsx hydration designed for Cloudflare Workers.",
5
5
  "keywords": [
6
6
  "cloudflare",
@@ -22,6 +22,10 @@
22
22
  "types": "./dist/vino.d.mts",
23
23
  "import": "./dist/vino.mjs"
24
24
  },
25
+ "./factory": {
26
+ "types": "./dist/factory.d.mts",
27
+ "import": "./dist/factory.mjs"
28
+ },
25
29
  "./client": {
26
30
  "types": "./dist/client.d.mts",
27
31
  "import": "./dist/client.mjs"
@@ -1 +0,0 @@
1
- {"version":3,"file":"compile-Lxl_tdxL.mjs","names":[],"sources":["../src/vino/config.ts","../src/vino/defineServerFn.ts","../src/vino/compile.ts"],"sourcesContent":["import { readPageDefinition } from \"./definePage.ts\";\nimport type { DataLoader, ManifestPage, PageConfig, PageModule } from \"./types.ts\";\n\nexport function loadMergedConfig(page: ManifestPage, pageMod?: PageModule): PageConfig {\n const merged: PageConfig = { ...page.config };\n const inline = readPageDefinition(pageMod?.default)?.config;\n if (inline) Object.assign(merged, inline);\n return merged;\n}\n\nexport async function loadMergedData(\n _page: ManifestPage,\n c: Parameters<DataLoader>[0],\n pageMod?: PageModule,\n): Promise<unknown> {\n const fn = readPageDefinition(pageMod?.default)?.data;\n if (!fn) return undefined;\n return await fn(c);\n}\n","import type { Context, Env } from \"hono\";\n\nexport const SERVER_FN_KIND = \"vino:server-fn\" as const;\n\nexport type ServerFnHandler<T = unknown, E extends Env = Env> = (\n c: Context<E, string>,\n) => T | Promise<T>;\n\n/**\n * A server-only function. Callable as a `definePage({ data })` loader\n */\nexport type ServerFn<T = unknown, E extends Env = Env> = ServerFnHandler<T, E> & {\n readonly kind: typeof SERVER_FN_KIND;\n};\n\nexport function isServerFn(value: unknown): value is ServerFn {\n return typeof value === \"function\" && (value as ServerFn).kind === SERVER_FN_KIND;\n}\n\nexport function readServerFn(value: unknown): ServerFn | undefined {\n return isServerFn(value) ? value : undefined;\n}\n\n/** Call-site of `defineServerFn(...)`, not `function defineServerFn(`. */\nexport const DEFINE_SERVER_FN_CALL =\n /(?<!function\\s)(?<![$\\w])defineServerFn\\s*(?:<[^>]*>\\s*)?\\(/g;\n\n/** True when source *calls* `defineServerFn(...)`. */\nexport function usesDefineServerFn(code: string): boolean {\n DEFINE_SERVER_FN_CALL.lastIndex = 0;\n return DEFINE_SERVER_FN_CALL.test(code);\n}\n\n/**\n * Mark a function as server-only.\n *\n * Pass the result to `definePage({ data })` (or `defineServerPage`) as a\n * loader. The same function can later be imported and invoked\n *\n * @example\n * // [slug].server.ts\n * export default defineServerFn(c => {\n * const slug = c.req.param(\"slug\") ?? \"\"\n * return { slug }\n * })\n *\n * @example\n * // [slug].tsx\n * import data from \"./[slug].server\"\n * export default definePage({ data, render: ({ data }) => <h1>{data.slug}</h1> })\n */\nexport function defineServerFn<T, E extends Env = Env>(fn: ServerFnHandler<T, E>): ServerFn<T, E> {\n function serverFn(c: Context<E, string>) {\n return fn(c);\n }\n Object.defineProperty(serverFn, \"kind\", {\n value: SERVER_FN_KIND,\n enumerable: true,\n });\n return serverFn as ServerFn<T, E>;\n}\n","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"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"definePage-Ba4r-TFh.mjs","names":[],"sources":["../src/vino/definePage.ts"],"sourcesContent":["import type { ServerFn } from \"./defineServerFn.ts\";\nimport type { DataLoader, PageConfig, PageProps, VinoHtml } from \"./types.ts\";\n\nexport const PAGE_KIND = \"vino:page\" as const;\nexport const SERVER_PAGE_KIND = \"vino:server-page\" as const;\n\nexport type PageRender<Data = unknown> = (props: PageProps<Data>) => VinoHtml;\n\nexport interface DefinePageOptions<Data = unknown> {\n /** JSX page component. Alias: `page`. */\n render?: PageRender<Data>;\n page?: PageRender<Data>;\n /** Loader or `defineServerFn(...)` (including a default import from `*.server.ts`). */\n data?: DataLoader | ServerFn<Data>;\n config?: PageConfig;\n}\n\nexport interface PageDefinition<Data = unknown> {\n readonly kind: typeof PAGE_KIND | typeof SERVER_PAGE_KIND;\n readonly client: boolean;\n readonly render: PageRender<Data>;\n readonly data?: DataLoader | ServerFn<Data>;\n readonly config?: PageConfig;\n}\n\nexport function isPageDefinition(value: unknown): value is PageDefinition {\n if (value === null || (typeof value !== \"object\" && typeof value !== \"function\")) return false;\n const candidate = value as PageDefinition;\n return (\n (candidate.kind === PAGE_KIND || candidate.kind === SERVER_PAGE_KIND) &&\n typeof candidate.render === \"function\"\n );\n}\n\nexport function isClientPageDefinition(value: unknown): value is PageDefinition {\n return isPageDefinition(value) && value.kind === PAGE_KIND;\n}\n\nexport function isServerPageDefinition(value: unknown): value is PageDefinition {\n return isPageDefinition(value) && value.kind === SERVER_PAGE_KIND;\n}\n\nexport function readPageDefinition(value: unknown): PageDefinition | undefined {\n return isPageDefinition(value) ? value : undefined;\n}\n\nexport function resolvePageRender(value: unknown): PageRender | undefined {\n if (isPageDefinition(value)) return value.render;\n if (typeof value === \"function\") return value as PageRender;\n return undefined;\n}\n\n/** True when source calls `definePage(...)` (hydratable pages). */\nexport function usesDefinePage(code: string): boolean {\n return /(?:^|[^\\w$])definePage\\s*(?:<[^>]*>\\s*)?\\(/.test(code);\n}\n\nfunction pageDefinition<Data>(\n page: PageRender<Data> | DefinePageOptions<Data>,\n kind: typeof PAGE_KIND | typeof SERVER_PAGE_KIND,\n fnName: string,\n): PageDefinition<Data> {\n if (typeof page === \"function\") {\n return { kind, client: kind === PAGE_KIND, render: page };\n }\n const render = page.render ?? page.page;\n if (typeof render !== \"function\") {\n throw new TypeError(`[vino] ${fnName}() requires a JSX function or { render }`);\n }\n return {\n kind,\n client: kind === PAGE_KIND,\n render,\n data: page.data,\n config: page.config,\n };\n}\n\n/**\n * Declare a page that SSRs with `hono/jsx`, then hydrates `#vino-page` with `hono/jsx/dom`.\n *\n * @example\n * export default definePage(() => {\n * const [n, setN] = useState(0)\n * return <button onClick={() => setN(n + 1)}>{n}</button>\n * })\n */\nexport function definePage<Data = unknown>(page: PageRender<Data>): PageDefinition<Data>;\n\n/**\n * Declare a hydratable page as `{ render, data?, config? }`.\n *\n * @example\n * export default definePage({\n * config: { prerender: 'full', clientRouting: true },\n * data: async (c) => ({ title: 'Hello' }),\n * render: ({ data }) => <h1>{data.title}</h1>,\n * })\n *\n * @example\n * import data from './[slug].server'\n * export default definePage({ data, render: ({ data }) => <h1>{data.title}</h1> })\n */\nexport function definePage<D extends DataLoader | ServerFn>(options: {\n render: PageRender<Awaited<ReturnType<D>>>;\n page?: PageRender<Awaited<ReturnType<D>>>;\n data?: D;\n config?: PageConfig;\n}): PageDefinition<Awaited<ReturnType<D>>>;\nexport function definePage<Data = unknown>(options: DefinePageOptions<Data>): PageDefinition<Data>;\nexport function definePage<Data = unknown>(\n page: PageRender<Data> | DefinePageOptions<Data>,\n): PageDefinition<Data> {\n return pageDefinition(page, PAGE_KIND, \"definePage\");\n}\n\n/**\n * Declare a page that SSRs only. The output is never hydrated.\n *\n * @example\n * export default defineServerPage(() => <h1>About</h1>)\n */\nexport function defineServerPage<Data = unknown>(page: PageRender<Data>): PageDefinition<Data>;\nexport function defineServerPage<D extends DataLoader | ServerFn>(options: {\n render: PageRender<Awaited<ReturnType<D>>>;\n page?: PageRender<Awaited<ReturnType<D>>>;\n data?: D;\n config?: PageConfig;\n}): PageDefinition<Awaited<ReturnType<D>>>;\nexport function defineServerPage<Data = unknown>(\n options: DefinePageOptions<Data>,\n): PageDefinition<Data>;\nexport function defineServerPage<Data = unknown>(\n page: PageRender<Data> | DefinePageOptions<Data>,\n): PageDefinition<Data> {\n return pageDefinition(page, SERVER_PAGE_KIND, \"defineServerPage\");\n}\n"],"mappings":";AAGA,MAAa,YAAY;AACzB,MAAa,mBAAmB;AAqBhC,SAAgB,iBAAiB,OAAyC;CACxE,IAAI,UAAU,QAAS,OAAO,UAAU,YAAY,OAAO,UAAU,YAAa,OAAO;CACzF,MAAM,YAAY;CAClB,QACG,UAAU,SAAA,eAAsB,UAAU,SAAA,uBAC3C,OAAO,UAAU,WAAW;AAEhC;AAEA,SAAgB,uBAAuB,OAAyC;CAC9E,OAAO,iBAAiB,KAAK,KAAK,MAAM,SAAA;AAC1C;AAEA,SAAgB,uBAAuB,OAAyC;CAC9E,OAAO,iBAAiB,KAAK,KAAK,MAAM,SAAA;AAC1C;AAEA,SAAgB,mBAAmB,OAA4C;CAC7E,OAAO,iBAAiB,KAAK,IAAI,QAAQ,KAAA;AAC3C;AAEA,SAAgB,kBAAkB,OAAwC;CACxE,IAAI,iBAAiB,KAAK,GAAG,OAAO,MAAM;CAC1C,IAAI,OAAO,UAAU,YAAY,OAAO;AAE1C;;AAGA,SAAgB,eAAe,MAAuB;CACpD,OAAO,6CAA6C,KAAK,IAAI;AAC/D;AAEA,SAAS,eACP,MACA,MACA,QACsB;CACtB,IAAI,OAAO,SAAS,YAClB,OAAO;EAAE;EAAM,QAAQ,SAAS;EAAW,QAAQ;CAAK;CAE1D,MAAM,SAAS,KAAK,UAAU,KAAK;CACnC,IAAI,OAAO,WAAW,YACpB,MAAM,IAAI,UAAU,UAAU,OAAO,yCAAyC;CAEhF,OAAO;EACL;EACA,QAAQ,SAAS;EACjB;EACA,MAAM,KAAK;EACX,QAAQ,KAAK;CACf;AACF;AAkCA,SAAgB,WACd,MACsB;CACtB,OAAO,eAAe,MAAM,WAAW,YAAY;AACrD;AAkBA,SAAgB,iBACd,MACsB;CACtB,OAAO,eAAe,MAAM,kBAAkB,kBAAkB;AAClE"}
@@ -1,2 +0,0 @@
1
- wrangler.json
2
- .dev.vars
@@ -1 +0,0 @@
1
- <!DOCTYPE html><html><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>Honoto</title></head><body class="bg-[#f6f4ef] text-[#111]"><nav class="flex gap-4 p-4 bg-[#1c1917]"><a href="/" class="text-[#fafaf9] no-underline border-transparent border-b-2 hover:b-b-current ">Home</a><a href="/about" class="text-[#fafaf9] no-underline border-transparent border-b-2 hover:b-b-current b-b-current">About</a><a href="/jobs" class="text-[#fafaf9] no-underline border-transparent border-b-2 hover:b-b-current ">Jobs</a><a href="/blog/hello" class="text-[#fafaf9] no-underline border-transparent border-b-2 hover:b-b-current ">Blog</a><a href="/counter" class="text-[#fafaf9] no-underline border-transparent border-b-2 hover:b-b-current ">Counter</a><a href="/admin" class="text-[#fafaf9] no-underline border-transparent border-b-2 hover:b-b-current ">Admin</a></nav><div id="honoto-page"><main class="max-w-4xl mx-auto p-4"><h1>About</h1><p>This page is fully rendered on the server.</p><p>Meaning that the page is never hydrated on the client.</p></main></div><script id="__HONOTO__" type="application/json">{"path":"/about","params":{},"clientRouting":true,"clientPage":null,"partial":false}</script><script type="module" src="/assets/honoto-client.js"></script></body></html>
@@ -1 +0,0 @@
1
- <!DOCTYPE html><html><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>Honoto</title></head><body class="bg-[#f6f4ef] text-[#111]"><nav class="flex gap-4 p-4 bg-[#1c1917]"><a href="/" class="text-[#fafaf9] no-underline border-transparent border-b-2 hover:b-b-current ">Home</a><a href="/about" class="text-[#fafaf9] no-underline border-transparent border-b-2 hover:b-b-current ">About</a><a href="/jobs" class="text-[#fafaf9] no-underline border-transparent border-b-2 hover:b-b-current ">Jobs</a><a href="/blog/hello" class="text-[#fafaf9] no-underline border-transparent border-b-2 hover:b-b-current ">Blog</a><a href="/counter" class="text-[#fafaf9] no-underline border-transparent border-b-2 hover:b-b-current ">Counter</a><a href="/admin" class="text-[#fafaf9] no-underline border-transparent border-b-2 hover:b-b-current b-b-current">Admin</a></nav><div id="honoto-page"><main class="max-w-4xl mx-auto p-4"><h1>Admin</h1><p>This page hydrates, with MPA navigation (clientRouting: false).</p><button type="button" class="bg-[#1c1917] text-[#fafaf9] px-4 py-2 rounded-md hover:bg-[#2b2826]">Show panel</button></main></div><script id="__HONOTO__" type="application/json">{"path":"/admin","params":{},"clientRouting":false,"clientPage":"/admin","partial":false}</script><script type="module" src="/assets/honoto-client.js"></script></body></html>
@@ -1 +0,0 @@
1
- import{_ as e}from"./hooks-Cz6AT21d.js";import"./dom-B5sHIJ1E.js";import{t}from"./jsx-dev-runtime-92VDsVyo.js";function n({initial:n=0}){let[r,i]=e(n);return t(`button`,{type:`button`,onClick:()=>i(r+1),class:`bg-[#1c1917] text-[#fafaf9] px-4 py-2 rounded-md hover:bg-[#2b2826]`,children:[`Count: `,r]})}export{n as default};
@@ -1 +0,0 @@
1
- import{n as e}from"./honoto-client.js";import{t}from"./jsx-dev-runtime-92VDsVyo.js";import"./honoto-9UtdLp4J.js";var n={hello:{title:`Hello Honoto`,body:`First post.`},world:{title:`World`,body:`Second post.`}},r=e({data(e){let t=e.req.param(`slug`)??``;return n[t]||{slug:t,title:`Missing`,body:`Unknown post.`}},page({data:e}){return t(`h1`,{children:e.title})},render({data:e,params:n}){return t(`main`,{class:`max-w-4xl mx-auto p-4`,children:[t(`p`,{children:t(`small`,{children:[`- /blog/`,n.slug]})}),t(`h1`,{class:`text-lg font-bold`,children:e.title}),t(`p`,{class:`text-sm text-gray-500`,children:e.body})]})}});export{r as default};
@@ -1 +0,0 @@
1
- import{r as e}from"./honoto-client.js";import{t}from"./jsx-dev-runtime-92VDsVyo.js";import"./honoto-9UtdLp4J.js";var n=e(()=>t(`main`,{class:`max-w-4xl mx-auto p-4`,children:[t(`h1`,{children:`About`}),t(`p`,{children:`This page is fully rendered on the server.`}),t(`p`,{children:`Meaning that the page is never hydrated on the client.`})]}));export{n as default};
@@ -1 +0,0 @@
1
- import{_ as e}from"./hooks-Cz6AT21d.js";import{n as t}from"./honoto-client.js";import"./dom-B5sHIJ1E.js";import{t as n}from"./jsx-dev-runtime-92VDsVyo.js";import"./honoto-9UtdLp4J.js";var r=t({config:{clientRouting:!1},render(){let[t,r]=e(!1);return n(`main`,{class:`max-w-4xl mx-auto p-4`,children:[n(`h1`,{children:`Admin`}),n(`p`,{children:`This page hydrates, with MPA navigation (clientRouting: false).`}),n(`button`,{type:`button`,onClick:()=>r(!t),class:`bg-[#1c1917] text-[#fafaf9] px-4 py-2 rounded-md hover:bg-[#2b2826]`,children:[t?`Hide`:`Show`,` panel`]}),t?n(`p`,{children:`Interactive admin panel.`}):null]})}});export{r as default};
@@ -1 +0,0 @@
1
- import{D as e,S as t,_ as n}from"./hooks-Cz6AT21d.js";var r=(r,i={})=>{let a;return Object.keys(i).length>0&&console.warn(`createRoot options are not supported yet`),{render(i){if(a===null)throw Error(`Cannot update an unmounted root`);a?a(i):e(t({tag:()=>{let[e,t]=n(i);return a=t,e},props:{}}),r)},unmount(){a?.(null),a=null}}},i=(e,t,n={})=>{let i=r(e,n);return i.render(t),i},a={createRoot:r,hydrateRoot:i};export{r as createRoot,a as default,i as hydrateRoot};
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/counter-DBpvln_F.js","assets/hooks-Cz6AT21d.js","assets/honoto-client.js","assets/honoto-client-DEh86_WZ.css","assets/dom-B5sHIJ1E.js","assets/components-DX9r6vHn.js","assets/jsx-dev-runtime-92VDsVyo.js","assets/honoto-9UtdLp4J.js","assets/admin-DRE7uh2s.js","assets/_slug_-CYpOSbrn.js"])))=>i.map(i=>d[i]);
2
- import{t as e}from"./honoto-client.js";var t={"/counter":()=>e(()=>import(`./counter-DBpvln_F.js`),__vite__mapDeps([0,1,2,3,4,5,6,7])),"/admin":()=>e(()=>import(`./admin-DRE7uh2s.js`),__vite__mapDeps([8,1,2,3,4,5,6,7])),"/blog/:slug":()=>e(()=>import(`./_slug_-CYpOSbrn.js`),__vite__mapDeps([9,2,3,6,1,7,5]))};export{t as clientPages};
@@ -1 +0,0 @@
1
- import{C as e,F as t,H as n,I as r,J as i,L as a,Q as o,R as s,T as c,U as l,W as u,_ as d,a as f,m as p,o as m,z as h}from"./hooks-Cz6AT21d.js";var g=l({pending:!1,data:null,method:null,action:null}),_=new Set,v=e=>{_.add(e),e.finally(()=>_.delete(e))},y=()=>n(g),b=(e,t)=>{let[n,r]=d(e);return _.size>0?Promise.all(_).finally(()=>{r(e)}):r(e),[n,m(e=>{r(n=>t(n,e))},[])]},x=(e,t,n)=>{let[r,a]=d(t),o=async t=>{a(await e(r,t))};return o[i]=n,[r,o]},S=o({button:()=>L,clearCache:()=>C,composeRef:()=>w,form:()=>P,input:()=>I,link:()=>j,meta:()=>M,script:()=>k,style:()=>A,title:()=>O}),C=()=>{T=Object.create(null),E=Object.create(null)},w=(e,t)=>p(()=>n=>{let r;e&&(typeof e==`function`?r=e(n)||(()=>{e(null)}):e&&`current`in e&&(e.current=n,r=()=>{e.current=null}));let i=t(n);return()=>{i?.(),r?.()}},[e]),T=Object.create(null),E=Object.create(null),D=(n,i,a,o,s)=>{if(i?.itemProp)return{tag:n,props:i,type:n,ref:i.ref};let c=document.head,{onLoad:l,onError:u,precedence:d,blocking:p,...g}=i,_=null,v=!1,y=r[n],b=h(n,o),x=e=>e.getAttribute(`rel`)===`stylesheet`&&e.getAttribute(`data-precedence`)!==null,S;if(b){let e=c.querySelectorAll(n);LOOP:for(let t of e)if(!(n===`link`&&!x(t))){for(let e of y)if(t.getAttribute(e)===i[e]){_=t;break LOOP}}if(!_){let e=y.reduce((e,t)=>i[t]===void 0?e:`${e}-${t}-${i[t]}`,n);v=!E[e],_=E[e]||=(()=>{let e=document.createElement(n);for(let t of y)i[t]!==void 0&&e.setAttribute(t,i[t]);return i.rel&&e.setAttribute(`rel`,i.rel),e})()}}else S=c.querySelectorAll(n);d=o?d??``:void 0,o&&(g[t]=d);let C=m(e=>{if(b){if(n===`link`&&d!==void 0){let r=!1;for(let i of c.querySelectorAll(n)){let n=i.getAttribute(t);if(n===null){c.insertBefore(e,i);return}if(r&&n!==d){c.insertBefore(e,i);return}n===d&&(r=!0)}c.appendChild(e);return}let r=!1;for(let t of c.querySelectorAll(n)){if(r&&t.getAttribute(`data-precedence`)!==d){c.insertBefore(e,t);return}t.getAttribute(`data-precedence`)===d&&(r=!0)}c.appendChild(e)}else if(n===`link`)c.contains(e)||c.appendChild(e);else if(S){let t=!1;for(let n of S)if(n===e){t=!0;break}t||c.insertBefore(e,c.contains(S[0])?S[0]:c.querySelector(n)),S=void 0}},[b,d,n]),D=w(i.ref,e=>{let t=y[0];if(a===2&&(e.innerHTML=``),(v||S)&&C(e),!u&&!l||!t)return;let n=T[e.getAttribute(t)]||=new Promise((t,n)=>{e.addEventListener(`load`,t),e.addEventListener(`error`,n)});l&&(n=n.then(l)),u&&(n=n.catch(u)),n.catch(()=>{})});if(s&&p===`render`){let e=r[n][0];if(e&&i[e]){let t=i[e],n=T[t]||=new Promise((e,t)=>{C(_),_.addEventListener(`load`,e),_.addEventListener(`error`,t)});f(n)}}let O={tag:n,type:n,props:{...g,ref:D},ref:D};return O.p=a,_&&(O.e=_),e(O,c)},O=e=>{let t=c();return(t&&n(t))?.endsWith(`svg`)?{tag:`title`,props:e,type:`title`,ref:e.ref}:D(`title`,e,void 0,!1,!1)},k=e=>!e||[`src`,`async`].some(t=>!e[t])?{tag:`script`,props:e,type:`script`,ref:e.ref}:D(`script`,e,1,!1,!0),A=e=>!e||![`href`,`precedence`].every(t=>t in e)?{tag:`style`,props:e,type:`style`,ref:e.ref}:(e[`data-href`]=e.href,delete e.href,D(`style`,e,2,!0,!0)),j=e=>!e||[`onLoad`,`onError`].some(t=>t in e)||e.rel===`stylesheet`&&(!(`precedence`in e)||`disabled`in e)?{tag:`link`,props:e,type:`link`,ref:e.ref}:D(`link`,e,1,s(e),!0),M=e=>D(`meta`,e,void 0,!1,!1),N=Symbol(),P=e=>{let{action:t,...n}=e;typeof t!=`function`&&(n.action=t);let[r,i]=d([null,!1]),a=m(async e=>{let n=e.isTrusted?t:e.detail[N];if(typeof n!=`function`)return;e.preventDefault();let r=new FormData(e.target);i([r,!0]);let a=n(r);a instanceof Promise&&(v(a),await a),i([null,!0])},[]),o=w(e.ref,e=>(e.addEventListener(`submit`,a),()=>{e.removeEventListener(`submit`,a)})),[s,c]=r;return r[1]=!1,{tag:g,props:{value:{pending:s!==null,data:s,method:s?`post`:null,action:s?t:null},children:{tag:`form`,props:{...n,ref:o},type:`form`,ref:o}},f:c}},F=(e,{formAction:t,...n})=>{if(typeof t==`function`){let e=m(e=>{e.preventDefault(),e.currentTarget.form.dispatchEvent(new CustomEvent(`submit`,{detail:{[N]:t}}))},[]);n.ref=w(n.ref,t=>(t.addEventListener(`click`,e),()=>{t.removeEventListener(`click`,e)}))}return{tag:e,props:n,type:e,ref:n.ref}},I=e=>F(`input`,e),L=e=>F(`button`,e);Object.assign(a,{title:O,script:k,style:A,link:j,meta:M,form:P,input:I,button:L});var R=(e,t,n)=>(typeof e==`string`&&S[e]&&(e=S[e]),{tag:e,type:e,props:t,key:n,ref:t.ref}),z=e=>R(``,e,void 0),B=(({children:e,fallback:t,fallbackRender:n,onError:r})=>{let i=z({children:e});return i[u]=e=>{if(e instanceof Promise)throw e;return r?.(e),n?.(e)||t},i}),V=(({children:e,fallback:t})=>{let n=z({children:e});return n[u]=(e,n)=>{if(!(e instanceof Promise))throw e;return e.finally(n),t},n});export{x as a,R as i,V as n,y as o,z as r,b as s,B as t};
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/Counter-BvqMZKON.js","assets/hooks-Cz6AT21d.js","assets/dom-B5sHIJ1E.js","assets/components-DX9r6vHn.js","assets/jsx-dev-runtime-92VDsVyo.js"])))=>i.map(i=>d[i]);
2
- import{t as e}from"./honoto-client.js";var t={"/src/components/Counter.tsx":()=>e(()=>import(`./Counter-BvqMZKON.js`),__vite__mapDeps([0,1,2,3,4]))};export{t as components};
@@ -1 +0,0 @@
1
- import{_ as e}from"./hooks-Cz6AT21d.js";import{n as t}from"./honoto-client.js";import"./dom-B5sHIJ1E.js";import{t as n}from"./jsx-dev-runtime-92VDsVyo.js";import"./honoto-9UtdLp4J.js";var r=Object.assign(function(){throw Error(`[honoto] server function cannot run on the client`)},{kind:`honoto:server-fn`,id:`/home/chris/workspace/proto/vino/examples/basic/src/pages/counter.server.ts#default`}),i=t({data:r,render({data:t}){let[r,i]=e(t.count);return n(`main`,{class:`max-w-4xl mx-auto p-4`,children:[n(`h1`,{children:`Counter`}),n(`p`,{children:`This whole page hydrates with hono/jsx/dom.`}),n(`button`,{type:`button`,onClick:()=>i(r+1),class:`bg-[#1c1917] text-[#fafaf9] px-4 py-2 rounded-md hover:bg-[#2b2826]`,children:[`Count: `,r]})]})}});export{i as default};
@@ -1 +0,0 @@
1
- import{C as e,E as t,G as n,H as r,M as i,N as a,P as o,U as s,_ as c,a as l,b as u,c as d,d as f,f as p,g as m,h,i as g,k as _,l as v,m as y,n as b,o as x,p as S,r as C,s as w,t as T,u as E,v as D,w as O,y as k}from"./hooks-Cz6AT21d.js";import{a as A,i as j,n as M,o as N,r as P,s as F,t as I}from"./components-DX9r6vHn.js";var L=(e,t,...n)=>{let r=t?{...t}:{};n.length&&(r.children=n.length===1?n[0]:n);let i;return`key`in r&&(i=r.key,delete r.key),j(e,r,i)},R=(e,t,...n)=>j(e.tag,{...e.props,...t,children:n.length?n:e.props.children},e.key),z=(e,t=a)=>{let r=(t=>e(t));return r[n]=t,r},B={version:i,useState:c,useEffect:v,useRef:m,useCallback:x,use:l,startTransition:C,useTransition:k,useDeferredValue:d,startViewTransition:g,useViewTransition:u,useMemo:y,useLayoutEffect:S,useInsertionEffect:p,useReducer:h,useId:E,useDebugValue:w,createRef:T,forwardRef:b,useImperativeHandle:f,useSyncExternalStore:D,useFormStatus:N,useActionState:A,useOptimistic:F,Suspense:M,ErrorBoundary:I,createContext:s,useContext:r,memo:z,isValidElement:_,createElement:L,cloneElement:R,Children:o,Fragment:P,StrictMode:P,flushSync:O,createPortal:e};export{o as Children,I as ErrorBoundary,P as Fragment,P as StrictMode,M as Suspense,R as cloneElement,s as createContext,L as createElement,L as jsx,e as createPortal,T as createRef,B as default,O as flushSync,b as forwardRef,_ as isValidElement,z as memo,t as render,C as startTransition,g as startViewTransition,l as use,A as useActionState,x as useCallback,r as useContext,w as useDebugValue,d as useDeferredValue,v as useEffect,N as useFormStatus,E as useId,f as useImperativeHandle,p as useInsertionEffect,S as useLayoutEffect,y as useMemo,F as useOptimistic,h as useReducer,m as useRef,c as useState,D as useSyncExternalStore,k as useTransition,u as useViewTransition,i as version};
@@ -1,33 +0,0 @@
1
- import{A as e,B as t,H as n,K as r,O as i,V as a,X as o,Y as s,Z as c,q as l,x as u}from"./hooks-Cz6AT21d.js";import{n as d,t as f}from"./components-DX9r6vHn.js";var p=a(null),m=0,h=async({children:e,fallback:r})=>{Array.isArray(e)||(e=[e]);let i=n(p)?.scriptNonce,a=[],d={[l]:[0,[]]},f=()=>{u.pop()};try{d[l][0]=0,u.push([[],d]),a=e.map(e=>e==null||typeof e==`boolean`?``:e.toString())}catch(n){if(n instanceof Promise){let r=t();a=[n.then(()=>r(()=>(d[l][0]=0,u.push([[],d]),_(e).finally(f))))]}else throw n}finally{f()}if(a.some(e=>e instanceof Promise)){let e=m++,t=await r.toString();return o(`<template id="H:${e}"></template>${t}<!--/$-->`,[...t.callbacks||[],({phase:t,buffer:n,context:r})=>{if(t!==s.BeforeStream)return Promise.all(a).then(async a=>{a=a.flat();let l=a.join(``);n&&(n[0]=n[0].replace(RegExp(`<template id="H:${e}"></template>.*?<!--/\\$-->`),l));let u=n?``:`<template data-hono-target="H:${e}">${l}</template><script${i?` nonce="${i}"`:``}>
2
- ((d,c,n) => {
3
- c=d.currentScript.previousSibling
4
- d=d.getElementById('H:${e}')
5
- if(!d)return
6
- do{n=d.nextSibling;n.remove()}while(n.nodeType!=8||n.nodeValue!='/$')
7
- d.replaceWith(c.content)
8
- })(document)
9
- <\/script>`,d=a.map(e=>e.callbacks||[]).flat();return d.length?(t===s.Stream&&(u=await c(u,s.BeforeStream,!0,r)),o(u,d)):u})}])}return o(a.join(``))};h[r]=d,new TextEncoder;var g=0,_=async e=>{try{return e.flat().map(e=>e==null||typeof e==`boolean`?``:e.toString())}catch(n){if(n instanceof Promise){let r=t();return await n,r(()=>_(e))}throw n}},v=e=>{if(e==null||typeof e==`boolean`)return``;if(typeof e==`string`)return e;{let t=e.toString();return t instanceof Promise?t:o(t)}},y=async({children:r,fallback:a,fallbackRender:l,onError:u})=>{if(!r)return o(``);Array.isArray(r)||(r=[r]);let d=n(p)?.scriptNonce,f,m=()=>f||=t(),h,y=()=>h||=(async()=>{let e=await a;if(typeof e==`string`)return e;{let t=await m()(()=>e?.toString());if(typeof t==`string`)return o(t,t.callbacks||e?.callbacks)}})(),b=async t=>{let n=await y();return m()(async()=>{u?.(t);let r=n===void 0?l&&e(i,{},l(t))||``:n,a=await i({children:r}).toString();return o(a,a.callbacks||r.callbacks)})},x=[];try{x=r.map(v)}catch(e){let t=m();x=e instanceof Promise?[e.then(()=>t(()=>_(r))).catch(e=>b(e))]:[await b(e)]}if(x.some(e=>e instanceof Promise)){m();let e=g++,t=RegExp(`(<template id="E:${e}"></template>.*?)(.*?)(<!--E:${e}-->)`),n=!1,r=async({error:r,buffer:i})=>{if(n)return``;n=!0;let a=await b(r),s=a.callbacks;return i?(i[0]=i[0].replace(t,a),s?.length?o(``,s):``):o(`<template data-hono-target="E:${e}">${a}</template><script>
10
- ((d,c,n) => {
11
- c=d.currentScript.previousSibling
12
- d=d.getElementById('E:${e}')
13
- if(!d)return
14
- do{n=d.nextSibling;n.remove()}while(n.nodeType!=8||n.nodeValue!='E:${e}')
15
- d.replaceWith(c.content)
16
- })(document)
17
- <\/script>`,s)},i,a=Promise.all(x).catch(e=>i=e);return o(`<template id="E:${e}"></template><!--E:${e}-->`,[({phase:n,buffer:l,context:u})=>{if(n!==s.BeforeStream)return a.then(async a=>{if(i)throw i;a=a.flat();let f=a.join(``),p=l?``:`<template data-hono-target="E:${e}">${f}</template><script${d?` nonce="${d}"`:``}>
18
- ((d,c) => {
19
- c=d.currentScript.previousSibling
20
- d=d.getElementById('E:${e}')
21
- if(!d)return
22
- d.parentElement.insertBefore(c.content,d.nextSibling)
23
- })(document)
24
- <\/script>`;if(a.every(e=>!e.callbacks?.length))return l&&(l[0]=l[0].replace(t,f)),p;l&&(l[0]=l[0].replace(t,(e,t,n,r)=>`${t}${f}${r}`));let m=a.map(e=>e.callbacks||[]).flat();n===s.Stream&&(p=await c(p,s.BeforeStream,!0,u));let h=0,g=m.map(n=>(...i)=>n(...i)?.then(n=>(h++,l?(h===m.length&&(l[0]=l[0].replace(t,(e,t,n)=>n)),l[0]+=n,o(``,n.callbacks)):o(n+(h===m.length?`<script>
25
- ((d,c,n) => {
26
- d=d.getElementById('E:${e}')
27
- if(!d)return
28
- n=d.nextSibling
29
- while(n.nodeType!=8||n.nodeValue!='E:${e}'){n=n.nextSibling}
30
- n.remove()
31
- d.remove()
32
- })(document)
33
- <\/script>`:``),n.callbacks))).catch(e=>r({error:e,buffer:l})));return o(p,g)}).catch(e=>r({error:e,buffer:l}))}])}return i({children:x})};y[r]=f,a(null);
@@ -1 +0,0 @@
1
- @supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--un-bg-opacity:100%;--un-text-opacity:100%}}@property --un-text-opacity{syntax:"<percentage>";inherits:false;initial-value:100%}@property --un-bg-opacity{syntax:"<percentage>";inherits:false;initial-value:100%}:root,:host{--spacing:.25rem;--radius-md:.375rem;--container-4xl:56rem;--fontWeight-bold:700;--colors-gray-500:oklch(55.1% .027 264.364);--text-lg-fontSize:1.125rem;--text-lg-lineHeight:1.75rem;--text-sm-fontSize:.875rem;--text-sm-lineHeight:1.25rem;--font-sans:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--default-font-family:var(--font-sans);--default-monoFont-family:var(--font-mono)}*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-featureSettings,normal);font-variation-settings:var(--default-font-variationSettings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-monoFont-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-monoFont-featureSettings,normal);font-variation-settings:var(--default-monoFont-variationSettings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden~=until-found])){display:none!important}.text-lg{font-size:var(--text-lg-fontSize);line-height:var(--un-leading,var(--text-lg-lineHeight))}.text-sm{font-size:var(--text-sm-fontSize);line-height:var(--un-leading,var(--text-sm-lineHeight))}.text-\[\#111\]{color:color-mix(in oklab, #111 var(--un-text-opacity), transparent)}.text-\[\#fafaf9\]{color:color-mix(in oklab, #fafaf9 var(--un-text-opacity), transparent)}.text-gray-500{color:color-mix(in srgb, var(--colors-gray-500) var(--un-text-opacity), transparent)}.font-bold{--un-font-weight:var(--fontWeight-bold);font-weight:var(--fontWeight-bold)}.mx-auto{margin-inline:auto}.p-4{padding:calc(var(--spacing) * 4)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-2{padding-block:calc(var(--spacing) * 2)}.border-b-2{border-bottom-width:2px}.border-transparent{border-color:#0000}.b-b-current,.hover\:b-b-current:hover{border-bottom-color:currentColor}.rounded-md{border-radius:var(--radius-md)}.bg-\[\#1c1917\]{background-color:color-mix(in oklab, #1c1917 var(--un-bg-opacity), transparent)}.bg-\[\#f6f4ef\]{background-color:color-mix(in oklab, #f6f4ef var(--un-bg-opacity), transparent)}.hover\:bg-\[\#2b2826\]:hover{background-color:color-mix(in oklab, #2b2826 var(--un-bg-opacity), transparent)}.no-underline{text-decoration:none}.flex{display:flex}.gap-4{gap:calc(var(--spacing) * 4)}.max-w-4xl{max-width:var(--container-4xl)}@supports (color:color-mix(in lab, red, red)){.text-gray-500{color:color-mix(in oklab, var(--colors-gray-500) var(--un-text-opacity), transparent)}}
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/client-B6nFkut5.js","assets/hooks-Cz6AT21d.js","assets/dom-B5sHIJ1E.js","assets/components-DX9r6vHn.js"])))=>i.map(i=>d[i]);
2
- var e=`honoto-page`,t=`__HONOTO__`,n=`honoto:page`;function r(e){if(e===null||typeof e!=`object`&&typeof e!=`function`)return!1;let t=e;return(t.kind===`honoto:page`||t.kind===`honoto:server-page`)&&typeof t.render==`function`}function i(e){if(r(e))return e.render;if(typeof e==`function`)return e}function a(e,t,r){if(typeof e==`function`)return{kind:t,client:t===n,render:e};let i=e.render??e.page;if(typeof i!=`function`)throw TypeError(`[honoto] ${r}() requires a JSX function or { render }`);return{kind:t,client:t===n,render:i,data:e.data,config:e.config}}function o(e){return a(e,n,`definePage`)}function s(e){return a(e,`honoto:server-page`,`defineServerPage`)}var c=function(e){return`/`+e},l={},u=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=c(t,n),t=s(t),t in l)return;l[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:`modulepreload`,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},d=new Map,f=null,p,m,h,g=[],_=globalThis;function v(e){h?h(e):g.push(e)}_.__HONOTO_HMR__=v;function y(e){h=e;let t=g.splice(0);for(let n of t)e(n)}function b(){for(let[e,t]of d)e.isConnected||(t.root?.unmount(),d.delete(e));f&&!f.el.isConnected&&(f.root?.unmount(),f=null)}function x(e=document){let n=e.querySelector(`#${t}`);if(!n?.textContent)return null;try{return JSON.parse(n.textContent)}catch{return null}}function S(e){let n=document.getElementById(t);n||(n=document.createElement(`script`),n.id=t,n.type=`application/json`,document.body.appendChild(n)),n.textContent=JSON.stringify(e).replaceAll(`<`,`\\u003c`)}async function C(){let[{hydrateRoot:e},{createElement:t}]=await Promise.all([u(()=>import(`./client-B6nFkut5.js`),__vite__mapDeps([0,1])),u(()=>import(`./dom-B5sHIJ1E.js`),__vite__mapDeps([2,1,3]))]);return{hydrateRoot:e,createElement:t}}async function w(){return p??=(await u(async()=>{let{components:e}=await import(`./components-DsWJ6F73.js`);return{components:e}},[])).components,p}async function T(){return m??=(await u(async()=>{let{clientPages:e}=await import(`./client-pages-Bc6cNZAm.js`);return{clientPages:e}},[])).clientPages,m}function E(e,t,n,r){return e.createElement?e.createElement(n,r):t(n,r)}async function D(e,t,n,r){if(r)return r.render(n),r;if(e.hydrate)return await e.hydrate(n,t),null;let{hydrateRoot:i}=await C();return i(t,n)}async function O(e,t=document){let n=await w(),{createElement:r}=await C(),i=t.querySelectorAll(`honoto-component`);for(let t of i){let i=t.getAttribute(`data-component`),a=t.getAttribute(`data-export`)??`default`,o=t.getAttribute(`data-props`)??`{}`;if(!i)continue;let s=n[i];if(!s){console.warn(`[honoto] missing hydratable component ${i}`);continue}let c=(await s())[a];if(typeof c!=`function`)continue;let l=JSON.parse(o),u=E(e,r,c,l),f=d.get(t);f?.root&&f.root.unmount();let p=await D(e,t,u,null);d.set(t,{id:i,exportName:a,props:l,root:p})}}async function k(t,n){if(!t.clientPage)return;let r=document.getElementById(e);if(!r)return;let i=(await T())[t.clientPage];if(!i)return;let a=await i();await A(t.clientPage,a,t,n,r)}async function A(e,t,n,r,a){let o=i(t.default);if(!o)return;let{createElement:s}=await C(),c=E(r,s,o,{data:n.data,params:n.params}),l=f?.el===a?f.root:null;f&&f.el!==a&&f.root?.unmount(),f={el:a,path:e,root:await D(r,a,c,l)}}async function j(e,t,n){let{createElement:r}=await C();for(let[i,a]of d){if(a.id!==e)continue;if(!i.isConnected){a.root?.unmount(),d.delete(i);continue}let o=t[a.exportName];typeof o==`function`&&(a.root=await D(n,i,E(n,r,o,a.props),a.root))}}async function M(t,n,r){let i=x();if(!i?.clientPage||i.clientPage!==t)return;let a=document.getElementById(e);a&&await A(t,n,i,r,a)}function N(e){let t=document.querySelectorAll(`nav a[href]`);for(let n of t){if(!(n instanceof HTMLAnchorElement))continue;let t=n.getAttribute(`href`);!t||t.startsWith(`http`)||(t===e||t!==`/`&&(e===t||e.startsWith(`${t}/`))?n.setAttribute(`aria-current`,`page`):n.removeAttribute(`aria-current`))}}async function P(e,t){return b(),t&&await k(t,e),await O(e,document.getElementById(`honoto-page`)??document),t?.path&&N(t.path),t}function F(t){let n=new DOMParser().parseFromString(`<!DOCTYPE html><html><body>${t}</body></html>`,`text/html`),r=x(n);return{slot:n.getElementById(e),payload:r,title:r?.title}}async function I(e){let t=new URL(e,location.href);return F(await(await fetch(t.href,{headers:{"X-Honoto-Nav":`1`}})).text())}async function L(t,n,r,i){let{slot:a,payload:o,title:s}=i;if(o?.clientRouting===!1&&n)return location.href=t,o;let c=document.getElementById(e);c&&a?c.replaceWith(a):a&&document.body.appendChild(a),o&&S(o),s?document.title=s:o?.title&&(document.title=o.title);let l=new URL(t,location.href);return n&&history.pushState({honoto:!0},``,l.href),P(r,o??x())}async function R(e,t,n){return L(e,t,n,await I(e))}async function z(t,n){if(!n?.partial)return n;let r=document.getElementById(e);if(!r)return n;if(r.childNodes.length>0)return P(t,{...n,partial:!1});let i=await I(location.href);return L(location.href,!1,t,i)}function B(e,t){t?.clientRouting&&(document.addEventListener(`click`,t=>{let n=t.target;if(!(n instanceof Element))return;let r=n.closest(`a`);!r||!H(r)||V(t)||document.getElementById(`honoto-page`)&&(t.preventDefault(),R(r.href,!0,e))}),window.addEventListener(`popstate`,()=>{R(location.href,!1,e)}))}function V(e){return e.metaKey||e.ctrlKey||e.shiftKey||e.altKey||e.button!==0}function H(e){return!(e.hasAttribute(`download`)||e.target&&e.target!==`_self`||e.origin!==location.origin||e.getAttribute(`rel`)?.includes(`external`))}async function U(e,t){if(e.kind===`registry`){e.components&&(p=e.components),e.clientPages&&(m=e.clientPages);return}if(e.kind===`layout`){location.reload();return}if(e.kind===`ssr`){if(!document.getElementById(`honoto-page`)){location.reload();return}await R(location.href,!1,t);return}if(e.kind===`component`&&e.mod){await j(e.id,e.mod,t);return}e.kind===`client-page`&&e.mod&&await M(e.id,e.mod,t)}function W(e={}){let t=t=>{U(t,e)};return y(t),{ready:(async()=>{let t=x();return t=t?.partial?await z(e,t)??t:await P(e,t)??t,B(e,t),t})(),hmr:t}}W();export{o as n,s as r,u as t};
@@ -1 +0,0 @@
1
- var e=Object.defineProperty,t=(t,n)=>{let r={};for(var i in t)e(r,i,{get:t[i],enumerable:!0});return n||e(r,Symbol.toStringTag,{value:`Module`}),r},n={Stringify:1,BeforeStream:2,Stream:3},r=(e,t)=>{let n=new String(e);return n.isEscaped=!0,n.callbacks=t,n},i=/[&<>'"]/,a=async(e,t)=>{let n=``;t||=[];let i=await Promise.all(e);for(let e=i.length-1;n+=i[e],e--,!(e<0);e--){let r=i[e];typeof r==`object`&&t.push(...r.callbacks||[]);let a=r.isEscaped;if(r=await(typeof r==`object`?r.toString():r),typeof r==`object`&&t.push(...r.callbacks||[]),r.isEscaped??a)n+=r;else{let e=[n];o(r,e),n=e[0]}}return r(n,t)},o=(e,t)=>{let n=e.search(i);if(n===-1){t[0]+=e;return}let r,a,o=0;for(a=n;a<e.length;a++){switch(e.charCodeAt(a)){case 34:r=`&quot;`;break;case 39:r=`&#39;`;break;case 38:r=`&amp;`;break;case 60:r=`&lt;`;break;case 62:r=`&gt;`;break;default:continue}t[0]+=e.substring(o,a)+r,o=a+1}t[0]+=e.substring(o,a)},s=e=>{let t=e.callbacks;if(!t?.length)return e;let r=[e],i={};return t.forEach(e=>e({phase:n.Stringify,buffer:r,context:i})),r[0]},c=async(e,t,n,i,a)=>{typeof e==`object`&&!(e instanceof String)&&(e instanceof Promise||(e=e.toString()),e instanceof Promise&&(e=await e));let o=e.callbacks;if(!o?.length)return Promise.resolve(e);a?a[0]+=e:a=[e];let s=Promise.all(o.map(e=>e({phase:t,buffer:a,context:i}))).then(e=>Promise.all(e.filter(Boolean).map(e=>c(e,t,!1,i,a))).then(()=>a[0]));return n?r(await s,o):s},l=Symbol(`RENDERER`),u=Symbol(`ERROR_HANDLER`),d=Symbol(`STASH`),ee=Symbol(`INTERNAL`),te=Symbol(`MEMO`),f=Symbol(`PERMALINK`),ne=e=>(e[ee]=!0,e),re=e=>({value:t,children:n})=>{if(!n)return;let r={children:[{tag:ne(()=>{e.push(t)}),props:{}}]};Array.isArray(n)?r.children.push(...n.flat()):r.children.push(n),r.children.push({tag:ne(()=>{e.pop()}),props:{}});let i={tag:``,props:r,type:``};return i[u]=t=>{throw e.pop(),t},i},ie=e=>{let t=[e],n=re(t);return n.values=t,n.Provider=n,p.push(n),n},p=[],ae=!1,m,h,g=0,_=!1,oe=()=>{if(ae)return m;ae=!0;let e=globalThis,t;for(let n of[()=>e.process?.getBuiltinModule?.(`node:async_hooks`)?.AsyncLocalStorage,()=>e.process?.mainModule?.require?.(`node:async_hooks`)?.AsyncLocalStorage]){try{t=n()}catch{}if(t)break}return t&&(m=new t),m},v=()=>oe()?.getStore()||h,se=()=>{g>0&&!_&&(_=!0,console.warn(`hono/jsx: AsyncLocalStorage is unavailable in this runtime, so useContext() after an await in an async component falls back to the context default value during server-side rendering. To get provided values across await boundaries, use a runtime with AsyncLocalStorage (Node.js >= 20.16, Deno, Bun, or Cloudflare Workers with the nodejs_compat flag).`))},ce=(e,t)=>{if(!e)return se(),t.values;let n=e.get(t);return n||(n=[t.values[0]],e.set(t,n)),n},le=(e,t)=>{if(!e)return se(),t.values.at(-1);let n=e.get(t);return n?.length?n.at(-1):t.values[0]},ue=e=>(e?p.filter(t=>e.has(t)):p).map(t=>[t,le(e,t)]),de=(e,t,n)=>y(()=>{let t=v(),r=n.map(([e,n])=>{let r=ce(t,e);return r.push(n),r}),i=()=>{r.forEach(e=>{e.pop()})};try{let t=e();return t instanceof Promise?t.finally(i):(i(),t)}catch(e){throw i(),e}},t),y=(e,t)=>{if(v())return e();let n=t??new WeakMap,r=oe();if(r)return r.run(n,e);h=n;let i;try{i=e()}finally{h=void 0}return!_&&i instanceof Promise&&(g++,i=i.finally(()=>{g--})),i},fe=()=>{let e=v(),t=ue(e);return n=>de(n,e,t)},pe=e=>{let t=[e],n=(e=>{let t=ce(v(),n);t.push(e.value);let i;try{i=e.children?(Array.isArray(e.children)?new Xe(``,{},e.children):e.children).toString():``}catch(e){throw t.pop(),e}return i instanceof Promise?i.finally(()=>t.pop()).then(e=>r(e,e.callbacks)):(t.pop(),r(i))});return n.values=t,n.Provider=n,n[l]=re(t),p.push(n),n},b=e=>le(v(),e),me={title:[],script:[`src`],style:[`data-href`],link:[`href`],meta:[`name`,`httpEquiv`,`charset`,`itemProp`]},he={},ge=`data-precedence`,_e=e=>e.rel===`stylesheet`&&`precedence`in e,ve=(e,t)=>e===`link`?t:me[e].length>0,x=e=>Array.isArray(e)?e:[e],ye={map:(e,t)=>x(e).map(t),forEach:(e,t)=>{x(e).forEach(t)},count:e=>x(e).length,only:e=>{let t=x(e);if(t.length!==1)throw Error(`Children.only() expects only one child`);return t[0]},toArray:x},S=t({button:()=>je,form:()=>Oe,input:()=>Ae,link:()=>Te,meta:()=>Ee,script:()=>Ce,style:()=>we,title:()=>Se}),be=new WeakMap,xe=(e,t,n,r)=>({buffer:i,context:a})=>{if(!i)return;let o=be.get(a)||{};be.set(a,o);let s=o[e]||=[],c=!1,l=me[e],u=ve(e,r!==void 0);if(u){LOOP:for(let[,t]of s)if(e!==`link`||t.rel===`stylesheet`&&t[`data-precedence`]!==void 0){for(let e of l)if((t?.[e]??null)===n?.[e]){c=!0;break LOOP}}}if(c?i[0]=i[0].replaceAll(t,``):u||e===`link`?s.push([t,n,r]):s.unshift([t,n,r]),i[0].indexOf(`</head>`)!==-1){let t;if(e===`link`||r!==void 0){let e=[];t=s.map(([t,,n],r)=>{if(n===void 0)return[t,2**53-1,r];let i=e.indexOf(n);return i===-1&&(e.push(n),i=e.length-1),[t,i,r]}).sort((e,t)=>e[1]-t[1]||e[2]-t[2]).map(([e])=>e)}else t=s.map(([e])=>e);t.forEach(e=>{i[0]=i[0].replaceAll(e,``)}),i[0]=i[0].replace(/(?=<\/head>)/,t.join(``))}},C=(e,t,n)=>r(new M(e,n,x(t??[])).toString()),w=(e,t,n,i)=>{if(`itemProp`in n)return C(e,t,n);let{precedence:a,blocking:o,...s}=n;a=i?a??``:void 0,i&&(s[ge]=a);let c=new M(e,s,x(t||[])).toString();return c instanceof Promise?c.then(t=>r(t,[...t.callbacks||[],xe(e,t,s,a)])):r(c,[xe(e,c,s,a)])},Se=({children:e,...t})=>{let n=A();if(n){let r=b(n);if(r===`svg`||r===`head`)return new M(`title`,t,x(e??[]))}return w(`title`,e,t,!1)},Ce=({children:e,...t})=>{let n=A();return[`src`,`async`].some(e=>!t[e])||n&&b(n)===`head`?C(`script`,e,t):w(`script`,e,t,!1)},we=({children:e,...t})=>[`href`,`precedence`].every(e=>e in t)?(t[`data-href`]=t.href,delete t.href,w(`style`,e,t,!0)):C(`style`,e,t),Te=({children:e,...t})=>[`onLoad`,`onError`].some(e=>e in t)||t.rel===`stylesheet`&&(!(`precedence`in t)||`disabled`in t)?C(`link`,e,t):w(`link`,e,t,_e(t)),Ee=({children:e,...t})=>{let n=A();return n&&b(n)===`head`?C(`meta`,e,t):w(`meta`,e,t,!1)},De=(e,{children:t,...n})=>new M(e,n,x(t??[])),Oe=e=>(typeof e.action==`function`&&(e.action=f in e.action?e.action[f]:void 0),De(`form`,e)),ke=(e,t)=>(typeof t.formAction==`function`&&(t.formAction=f in t.formAction?t.formAction[f]:void 0),De(e,t)),Ae=e=>ke(`input`,e),je=e=>ke(`button`,e),Me=new Map([[`className`,`class`],[`htmlFor`,`for`],[`crossOrigin`,`crossorigin`],[`httpEquiv`,`http-equiv`],[`itemProp`,`itemprop`],[`fetchPriority`,`fetchpriority`],[`noModule`,`nomodule`],[`formAction`,`formaction`]]),T=e=>Me.get(e)||e,Ne=/[\s"'<>/=`\\\x00-\x1f\x7f-\x9f]/,E=new Set,Pe=1024,Fe=/^[!?]|[\s"'<>/=`\\\x00-\x1f\x7f-\x9f]/,Ie=new Set,Le=256,D=(e,t,n)=>{e.size>=t&&e.clear(),e.add(n)},Re=e=>Ie.has(e)?!0:typeof e==`string`?e.length===0||!Fe.test(e)&&(D(Ie,Le,e),!0):!1,ze=e=>{if(E.has(e))return!0;let t=e.length;if(t===0)return!1;for(let n=0;n<t;n++){let t=e.charCodeAt(n);if(!(t>=97&&t<=122||t>=65&&t<=90||t>=48&&t<=57||t===45||t===95||t===46||t===58))return!Ne.test(e)&&(D(E,Pe,e),!0)}return D(E,Pe,e),!0},Be=/[\s"'():;\\/\[\]{}\x00-\x1f\x7f-\x9f]/,O=new Set,Ve=1024,He=e=>{if(O.has(e))return!0;let t=e.length;if(t===0)return!1;for(let n=0;n<t;n++){let t=e.charCodeAt(n);if(!(t>=97&&t<=122||t>=65&&t<=90||t>=48&&t<=57||t===45||t===95))return!Be.test(e)&&(D(O,Ve,e),!0)}return D(O,Ve,e),!0},Ue=/[;"'\\/\[\](){}]/,We=e=>{if(!Ue.test(e))return!1;let t=0,n=[];for(let r=0,i=e.length;r<i;r++){let a=e.charCodeAt(r);if(a===92){if(r===i-1)return!0;r++}else if(t!==0){if(a===10||a===12||a===13)return!0;a===t&&(t=0)}else if(a===47&&e.charCodeAt(r+1)===42){let t=e.indexOf(`*/`,r+2);if(t===-1)return!0;r=t+1}else if(a===34||a===39)t=a;else if(a===40)n.push(41);else if(a===91)n.push(93);else if(a===123||a===125)return!0;else if(a===41||a===93){if(n[n.length-1]!==a)return!0;n.pop()}else if(a===59&&n.length===0)return!0}return t!==0||n.length!==0},Ge=(e,t)=>{for(let[n,r]of Object.entries(e)){let e=n[0]===`-`||!/[A-Z]/.test(n)?n:n.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`);if(!He(e))continue;if(r==null){t(e,null);continue}let i;if(typeof r==`number`)i=e.match(/^(?:a|border-im|column(?:-c|s)|flex(?:$|-[^b])|grid-(?:ar|[^a])|font-w|li|or|sca|st|ta|wido|z)|ty$/)?`${r}`:`${r}px`;else if(typeof r==`string`){if(We(r))continue;i=r}else continue;t(e,i)}},k=void 0,A=()=>k,Ke=e=>/[A-Z]/.test(e)&&e.match(/^(?:al|basel|clip(?:Path|Rule)$|co|do|fill|fl|fo|gl|let|lig|i|marker[EMS]|o|pai|pointe|sh|st[or]|text[^L]|tr|u|ve|w)/)?e.replace(/([A-Z])/g,`-$1`).toLowerCase():e,qe=[`area`,`base`,`br`,`col`,`embed`,`hr`,`img`,`input`,`keygen`,`link`,`meta`,`param`,`source`,`track`,`wbr`],Je=`allowfullscreen.async.autofocus.autoplay.checked.controls.default.defer.disabled.download.formnovalidate.hidden.inert.ismap.itemscope.loop.multiple.muted.nomodule.novalidate.open.playsinline.readonly.required.reversed.selected`.split(`.`),Ye=(e,t)=>e.then(e=>{if(!Array.isArray(e)&&!(e instanceof M))return e;let n=Array.isArray(e)?e:[e],i=()=>{let e=[``];return j(n,e),e.length===1?r(e[0],e.callbacks):a(e,e.callbacks)};return t?t(i):y(i)}),j=(e,t)=>{for(let n=0,r=e.length;n<r;n++){let r=e[n];if(typeof r==`string`)o(r,t);else if(typeof r==`boolean`||r==null)continue;else if(r instanceof M)r.toStringToBuffer(t);else if(typeof r==`number`)t[0]+=r;else if(r.isEscaped){t[0]+=r;let e=r.callbacks;e&&(t.callbacks||=[],t.callbacks.push(...e))}else r instanceof Promise?t.unshift(``,r):j(r,t)}},M=class{tag;props;key;children;isEscaped=!0;constructor(e,t,n){if(typeof e!=`function`&&!Re(e))throw Error(`Invalid JSX tag name: ${e}`);this.tag=e,this.props=t,this.children=n}get type(){return this.tag}get ref(){return this.props.ref||null}toString(){return y(()=>{let e=[``];return this.toStringToBuffer(e),e.length===1?`callbacks`in e?s(r(e[0],e.callbacks)).toString():e[0]:a(e,e.callbacks)})}toStringToBuffer(e){let t=this.tag,n=this.props,{children:i}=this;e[0]+=`<${t}`;let a=t===`svg`||k&&b(k)===`svg`?e=>Ke(T(e)):e=>T(e);for(let[s,c]of Object.entries(n))if(s=a(s),ze(s)&&s!==`children`){if(s===`style`&&typeof c==`object`){let t=``;Ge(c,(e,n)=>{n!=null&&(t+=`${t?`;`:``}${e}:${n}`)}),e[0]+=` style="`,o(t,e),e[0]+=`"`}else if(typeof c==`string`)e[0]+=` ${s}="`,o(c,e),e[0]+=`"`;else if(c!=null){if(typeof c==`number`||c.isEscaped)e[0]+=` ${s}="${c}"`;else if(typeof c==`boolean`&&Je.includes(s))c&&(e[0]+=` ${s}=""`);else if(s===`dangerouslySetInnerHTML`){if(i.length>0)throw Error("Can only set one of `children` or `props.dangerouslySetInnerHTML`.");i=[r(c.__html)]}else if(c instanceof Promise)e[0]+=` ${s}="`,e.unshift(`"`,c);else if(typeof c==`function`){if(!s.startsWith(`on`)&&s!==`ref`)throw Error(`Invalid prop '${s}' of type 'function' supplied to '${t}'.`)}else e[0]+=` ${s}="`,o(c.toString(),e),e[0]+=`"`}}if(qe.includes(t)&&i.length===0){e[0]+=`/>`;return}e[0]+=`>`,j(i,e),e[0]+=`</${t}>`}},N=class extends M{toStringToBuffer(e){let{children:t}=this,n={...this.props};t.length&&(n.children=t.length===1?t[0]:t);let r=this.tag.call(null,n);typeof r!=`boolean`&&r!=null&&(r instanceof Promise?p.length===0?e.unshift(``,Ye(r)):e.unshift(``,Ye(r,fe())):r instanceof M?r.toStringToBuffer(e):Array.isArray(r)?j(r,e):typeof r==`number`||r.isEscaped?(e[0]+=r,r.callbacks&&(e.callbacks||=[],e.callbacks.push(...r.callbacks))):o(r,e))}},Xe=class extends M{toStringToBuffer(e){j(this.children,e)}},Ze=(e,t,...n)=>{t??={},n.length&&(t.children=n.length===1?n[0]:n);let r=t.key;delete t.key;let i=$e(e,t,n);return i.key=r,i},Qe=!1,$e=(e,t,n)=>{if(!Qe){for(let e in he)S[e][l]=he[e];Qe=!0}return typeof e==`function`?new N(e,t,n):S[e]?new N(S[e],t,n):e===`svg`||e===`head`?(k||=pe(``),new M(e,t,[new N(k,{value:e},n)])):new M(e,t,n)},et=(e,t)=>{if(e===t)return!0;let n=Object.keys(e).sort(),r=Object.keys(t).sort();if(n.length!==r.length)return!1;for(let i=0,a=n.length;i<a;i++)if(n[i]===`children`&&r[i]===`children`&&!e.children?.length&&!t.children?.length)continue;else if(e[n[i]]!==t[n[i]])return!1;return!0},tt=({children:e})=>new Xe(``,{children:e},Array.isArray(e)?e:e?[e]:[]),nt=e=>!!(e&&typeof e==`object`&&`tag`in e&&`props`in e),rt=`19.0.0-hono-jsx`,P=`_hp`,it={Change:`Input`,DoubleClick:`DblClick`},at={svg:`2000/svg`,math:`1998/Math/MathML`},F=[],I=new WeakMap,L=void 0,ot=()=>L,R=e=>`t`in e,z={onClick:[`click`,!1]},st=e=>{if(!e.startsWith(`on`))return;if(z[e])return z[e];let t=e.match(/^on([A-Z][a-zA-Z]+?(?:PointerCapture)?)(Capture)?$/);if(t){let[,n,r]=t;return z[e]=[(it[n]||n).toLowerCase(),!!r]}},ct=(e,t)=>L&&e instanceof SVGElement&&/[A-Z]/.test(t)&&(t in e.style||t.match(/^(?:o|pai|str|u|ve)/))?t.replace(/([A-Z])/g,`-$1`).toLowerCase():t,lt=e=>e==null||e===!1?null:e,ut=(e,t)=>{`value`in t&&(e.value=lt(t.value),!e.multiple&&e.selectedIndex===-1&&(e.selectedIndex=0))},dt=e=>e instanceof DOMException&&e.name===`InvalidCharacterError`,ft=(e,t,n)=>{t||={};for(let r in t){let i=t[r];if(r!==`children`&&(!n||n[r]!==i)){r=T(r);let t=st(r);if(t){if(n?.[r]!==i&&(n&&e.removeEventListener(t[0],n[r],t[1]),i!=null)){if(typeof i!=`function`)throw Error(`Event handler for "${r}" is not a function`);e.addEventListener(t[0],i,t[1])}}else if(r===`dangerouslySetInnerHTML`&&i)e.innerHTML=i.__html;else if(r===`ref`){let t;typeof i==`function`?t=i(e)||(()=>i(null)):i&&`current`in i&&(i.current=e,t=()=>i.current=null),I.set(e,t)}else if(r===`style`){let t=e.style;typeof i==`string`?t.cssText=i:(t.cssText=``,i!=null&&Ge(i,t.setProperty.bind(t)))}else{if(r===`value`){let t=e.nodeName;if(t===`SELECT`)continue;if((t===`INPUT`||t===`TEXTAREA`)&&(e.value=lt(i),t===`TEXTAREA`)){e.textContent=i;continue}}else(r===`checked`&&e.nodeName===`INPUT`||r===`selected`&&e.nodeName===`OPTION`)&&(e[r]=i);let t=ct(e,r);try{i==null||i===!1?e.removeAttribute(t):i===!0?e.setAttribute(t,``):typeof i==`string`||typeof i==`number`?e.setAttribute(t,i):e.setAttribute(t,i.toString())}catch(e){if(!dt(e))throw e}}}}if(n)for(let r in n){let i=n[r];if(r!==`children`&&!(r in t)){r=T(r);let t=st(r);if(t)e.removeEventListener(t[0],i,t[1]);else if(r===`ref`)I.get(e)?.();else try{e.removeAttribute(ct(e,r))}catch(e){if(!dt(e))throw e}}}},pt=(e,t)=>{t[d][0]=0,F.push([e,t]);let n=t.tag[l]||t.tag,r=n.defaultProps?{...n.defaultProps,...t.props}:t.props;try{return[n.call(null,r)]}finally{F.pop()}},mt=(e,t,n,r,i)=>{e.vR?.length&&(r.push(...e.vR),delete e.vR),typeof e.tag==`function`&&e[d][1][1]?.forEach(e=>i.push(e)),e.vC.forEach(e=>{if(R(e))n.push(e);else if(typeof e.tag==`function`||e.tag===``){e.c=t;let a=n.length;if(mt(e,t,n,r,i),e.s){for(let e=a;e<n.length;e++)n[e].s=!0;e.s=!1}}else n.push(e),e.vR?.length&&(r.push(...e.vR),delete e.vR)})},ht=e=>{for(;e&&(e.tag===P||!e.e);)e=e.tag===P||!e.vC?.[0]?e.nN:e.vC[0];return e?.e},gt=e=>{R(e)||(e[d]?.[1][1]?.forEach(e=>e[2]?.()),I.get(e.e)?.(),e.p===2&&e.vC?.forEach(e=>e.p=2),e.vC?.forEach(gt)),e.p||(e.e?.remove(),delete e.e),typeof e.tag==`function`&&(W.delete(e),V.delete(e),delete e[d][3],e.a=!0)},B=(e,t,n)=>{e.c=t,yt(e,t,n)},_t=(e,t)=>{if(t){for(let n=0,r=e.length;n<r;n++)if(e[n]===t)return n}},vt=Symbol(),yt=(e,t,n)=>{let r=[],i=[],a=[];mt(e,t,r,i,a),i.forEach(gt);let o=n?void 0:t.childNodes,s,c=null;if(n)s=-1;else if(!o.length)s=0;else{let t=_t(o,ht(e.nN));t===void 0?s=_t(o,r.find(e=>e.tag!==P&&e.e)?.e)??-1:(c=o[t],s=t),s===-1&&(n=!0)}for(let e=0,i=r.length;e<i;e++,s++){let i=r[e],a;if(i.s&&i.e)a=i.e,i.s=!1;else{let e=n||!i.e;R(i)?(i.e&&i.d&&(i.e.textContent=i.t),i.d=!1,a=i.e||=document.createTextNode(i.t)):(a=i.e||=i.n?document.createElementNS(i.n,i.tag):document.createElement(i.tag),ft(a,i.props,i.pP),yt(i,a,e),i.tag===`select`&&ut(a,i.props))}i.tag===P?s--:n?a.parentNode||t.appendChild(a):o[s]!==a&&o[s-1]!==a&&(o[s+1]===a?t.appendChild(o[s]):t.insertBefore(a,c||o[s]||null))}if(e.pP&&=void 0,a.length){let e=[],t=[];a.forEach(([,n,,r,i])=>{n&&e.push(n),r&&t.push(r),i?.()}),e.forEach(e=>e()),t.length&&requestAnimationFrame(()=>{t.forEach(e=>e())})}},bt=(e,t)=>!!(e&&e.length===t.length&&e.every((e,n)=>e[1]===t[n][1])),V=new WeakMap,H=(e,t,n)=>{let r=!n&&t.pC;n&&(t.pC||=t.vC);let i;try{n||=typeof t.tag==`function`?pt(e,t):x(t.props.children),n[0]?.tag===``&&n[0][u]&&(i=n[0][u],e[5].push([e,i,t]));let a=r?[...t.pC]:t.vC?[...t.vC]:void 0,o=[],s;for(let r=0;r<n.length;r++){if(Array.isArray(n[r])){n.splice(r,1,...n[r].flat(1/0)),r--;continue}let i=U(n[r]);if(i){typeof i.tag==`function`&&!i.tag[ee]&&(p.length>0&&(i[d][2]=p.map(e=>[e,e.values.at(-1)])),e[5]?.length&&(i[d][3]=e[5].at(-1)));let n;if(a&&a.length){let e=a.findIndex(R(i)?e=>R(e):i.key===void 0?e=>e.tag===i.tag:e=>e.key===i.key&&e.tag===i.tag);e!==-1&&(n=a[e],a.splice(e,1))}if(n){if(R(i))n.t!==i.t&&(n.t=i.t,n.d=!0),i=n;else{let e=n.pP=n.props;if(n.props=i.props,n.f||=i.f||t.f,typeof i.tag==`function`){let t=n[d][2];n[d][2]=i[d][2]||[],n[d][3]=i[d][3],!n.f&&((n.o||n)===i.o||n.tag[te]?.(e,n.props))&&bt(t,n[d][2])&&(n.s=!0)}i=n}}else if(!R(i)&&L){let e=b(L);e&&(i.n=e)}if(!R(i)&&!i.s&&(H(e,i),delete i.f),o.push(i),s&&!s.s&&!i.s)for(let e=s;e&&!R(e);e=e.vC?.at(-1))e.nN=i;s=i}}t.vR=r?[...t.vC,...a||[]]:a||[],t.vC=o,r&&delete t.pC}catch(n){if(t.f=!0,n===vt){if(i)return;throw n}let[r,a,o]=t[d]?.[3]||[];if(a){let t=()=>K([0,!1,e[2]],o),i=V.get(o)||[];i.push(t),V.set(o,i);let s=a(n,()=>{let e=V.get(o);if(e){let n=e.indexOf(t);if(n!==-1)return e.splice(n,1),t()}});if(s){if(e[0]===1)e[1]=!0;else if(H(e,o,[s]),(a.length===1||e!==r)&&o.c){B(o,o.c,!1);return}throw vt}}throw n}finally{i&&e[5].pop()}},U=e=>{if(e!=null&&typeof e!=`boolean`){if(typeof e==`string`||typeof e==`number`)return{t:e.toString(),d:!0};if(`vR`in e&&(e={tag:e.tag,props:e.props,key:e.key,f:e.f,type:e.tag,ref:e.props.ref,o:e.o||e}),typeof e.tag==`function`)e[d]=[0,[]];else{let t=at[e.tag];t&&(L||=ie(``),e.props.children=[{tag:L,props:{value:e.n=`http://www.w3.org/${t}`,children:e.props.children}}])}return e}},xt=(e,t,n)=>{e.c===t&&(e.c=n,e.vC.forEach(e=>xt(e,t,n)))},St=(e,t)=>{t[d][2]?.forEach(([e,t])=>{e.values.push(t)});try{H(e,t,void 0)}catch{return}if(t.a){delete t.a;return}t[d][2]?.forEach(([e])=>{e.values.pop()}),(e[0]!==1||!e[1])&&B(t,t.c,!1)},W=new WeakMap,G=[],K=async(e,t)=>{e[5]||=[];let n=W.get(t);n&&n[0](void 0);let r,i=new Promise(e=>r=e);if(W.set(t,[r,()=>{e[2]?e[2](e,t,e=>{St(e,t)}).then(()=>r(t)):(St(e,t),r(t))}]),G.length)G.at(-1).add(t);else{await Promise.resolve();let e=W.get(t);e&&(W.delete(t),e[1]())}return i},Ct=(e,t)=>{let n=[];n[5]=[],n[4]=!0,H(n,e,void 0),n[4]=!1;let r=document.createDocumentFragment();B(e,r,!0),xt(e,r,t),t.replaceChildren(r)},wt=(e,t)=>{Ct(U({tag:``,props:{children:e}}),t)},Tt=e=>{let t=new Set;G.push(t),e(),t.forEach(e=>{let t=W.get(e);t&&(W.delete(e),t[1]())}),G.pop()},Et=(e,t,n)=>({tag:P,props:{children:e},key:n,e:t,p:1}),Dt=0,Ot=2,kt=3,At=4,jt=new WeakMap,Mt=(e,t)=>!e||!t||e.length!==t.length||t.some((t,n)=>t!==e[n]),q=void 0,Nt=e=>document?.startViewTransition?document.startViewTransition(e):(e(),{finished:Promise.resolve()}),J=void 0,Pt=(e,t,n)=>{let r=[!0,!1],i=t.vC;return Nt(()=>{i===t.vC&&(q=r,n(e),q=void 0,i=t.vC)}).finished.then(()=>{r[1]&&i===t.vC&&(r[0]=!1,q=r,n(e),q=void 0)})},Ft=e=>{J=Pt;try{e()}finally{J=void 0}},It=()=>F.at(-1)?(q&&(q[1]=!0),[!!q?.[0],Ft]):[!1,()=>{}],Y=[],Lt=(e,t)=>{let n,r=new Promise(e=>n=e);Y.push([e,r]);try{let e=t();e instanceof Promise?e.then(n,n):n()}finally{Y.pop()}},Rt=e=>{Lt(1,e)},zt=e=>{Lt(2,e)},Bt=()=>{let e=F.at(-1);if(!e)return[!1,()=>{}];let[t,n]=X(),[r,i]=X();if(t)throw t[0];let a=Gt(e=>{zt(()=>{i(e=>!e);let t=e();return t instanceof Promise&&(t=t.catch(e=>{n([e])})),t})},[r]),[o]=e;return[o[0]===2,a]},Vt=(e,...t)=>{let[n,r]=X(t.length?[t[0],t[0]]:[e,e]);return Object.is(n[1],e)?n[1]:(Y.push([3,Promise.resolve()]),J=async(t,r,i)=>{i(t),n[0]=e},r([n[0],e]),J=void 0,Y.pop(),n[0])},X=e=>{let t=()=>typeof e==`function`?e():e,n=F.at(-1);if(!n)return[t(),()=>{}];let[,r]=n,i=r[d][1][Dt]||=[],a=r[d][0]++;return i[a]||=[t(),e=>{let t=J,n=i[a];if(typeof e==`function`&&(e=e(n[0])),!Object.is(e,n[0])){if(n[0]=e,Y.length){let[e,n]=Y.at(-1);Promise.all([e===3?r:K([e,!1,t],r),n]).then(([n])=>{if(!n||e!==2&&e!==3)return;let r=n.vC;requestAnimationFrame(()=>{setTimeout(()=>{r===n.vC&&K([+(e===3),!1,t],n)})})})}else K([0,!1,t],r)}}]},Ht=(e,t,n)=>{let r=Gt(t=>{a(n=>e(n,t))},[e]),[i,a]=X(()=>n?n(t):t);return[i,r]},Z=(e,t,n)=>{let r=F.at(-1);if(!r)return;let[,i]=r,a=i[d][1][1]||=[],o=i[d][0]++,[s,,c]=a[o]||=[];if(Mt(s,n)){c&&c();let r=()=>{i[e]=void 0,i[2]=t()},i=[n,void 0,void 0,void 0,void 0];i[e]=r,a[o]=i}},Q=(e,t)=>Z(3,e,t),Ut=(e,t)=>Z(1,e,t),Wt=(e,t)=>Z(4,e,t),Gt=(e,t)=>{let n=F.at(-1);if(!n)return e;let[,r]=n,i=r[d][1][Ot]||=[],a=r[d][0]++,o=i[a];return Mt(o?.[1],t)?i[a]=[e,t]:e=i[a][0],e};function $(e){let t=F.at(-1);if(!t)return{current:e};let[,n]=t,r=n[d][1][At]||=[],i=n[d][0]++;return r[i]||={current:e}}var Kt=e=>{let t=jt.get(e);if(t){if(t.length===2)throw t[1];return t[0]}throw e.then(t=>jt.set(e,[t]),t=>jt.set(e,[void 0,t])),e},qt=(e,t)=>{let n=F.at(-1);if(!n)return e();let[,r]=n,i=r[d][1][kt]||=[],a=r[d][0]++,o=i[a];return Mt(o?.[1],t)&&(i[a]=[e(),t]),i[a][0]},Jt=0,Yt=()=>qt(()=>`:r${(Jt++).toString(32)}:`,[]),Xt=(e,t)=>{},Zt=()=>({current:null}),Qt=e=>t=>{let{ref:n,...r}=t;return e(r,n)},$t=(e,t,n)=>{Q(()=>(e.current=t(),()=>{e.current=null}),n)},en=(e,t,n)=>{let r=F.at(-1);if(!r){if(!n)throw Error(`getServerSnapshot is required for server side rendering`);return n()}let i=r[0][4]&&n?n():t(),[,a]=X(0),o=$([i,t]);o.current=[i,t];let s=$(null);return Q(()=>{let t=()=>a(e=>e+1);s.current?.(),s.current=e(t);let[n,r]=o.current;Object.is(n,r())||t()},[e]),Q(()=>()=>s.current?.(),[]),i};export{Ze as A,fe as B,Et as C,Ct as D,wt as E,ge as F,te as G,b as H,me as I,f as J,l as K,he as L,rt as M,et as N,tt as O,ye as P,t as Q,_e as R,U as S,ot as T,ie as U,pe as V,u as W,r as X,n as Y,c as Z,X as _,Kt as a,It as b,Vt as c,$t as d,Wt as f,$ as g,Ht as h,Ft as i,$e as j,nt as k,Q as l,qt as m,Qt as n,Gt as o,Ut as p,d as q,Rt as r,Xt as s,Zt as t,Yt as u,en as v,Tt as w,F as x,Bt as y,ve as z};
@@ -1 +0,0 @@
1
- import{j as e}from"./hooks-Cz6AT21d.js";function t(t,n,r){let i;if(!n||!(`children`in n))i=e(t,n,[]);else{let r=n.children;i=Array.isArray(r)?e(t,n,r):e(t,n,[r])}return i.key=r,i}export{t};
@@ -1 +0,0 @@
1
- <!DOCTYPE html><html><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>Honoto</title></head><body class="bg-[#f6f4ef] text-[#111]"><nav class="flex gap-4 p-4 bg-[#1c1917]"><a href="/" class="text-[#fafaf9] no-underline border-transparent border-b-2 hover:b-b-current ">Home</a><a href="/about" class="text-[#fafaf9] no-underline border-transparent border-b-2 hover:b-b-current ">About</a><a href="/jobs" class="text-[#fafaf9] no-underline border-transparent border-b-2 hover:b-b-current ">Jobs</a><a href="/blog/hello" class="text-[#fafaf9] no-underline border-transparent border-b-2 hover:b-b-current ">Blog</a><a href="/counter" class="text-[#fafaf9] no-underline border-transparent border-b-2 hover:b-b-current b-b-current">Counter</a><a href="/admin" class="text-[#fafaf9] no-underline border-transparent border-b-2 hover:b-b-current ">Admin</a></nav><div id="honoto-page"><main class="max-w-4xl mx-auto p-4"><h1>Counter</h1><p>This whole page hydrates with hono/jsx/dom.</p><button type="button" class="bg-[#1c1917] text-[#fafaf9] px-4 py-2 rounded-md hover:bg-[#2b2826]">Count: 5</button></main></div><script id="__HONOTO__" type="application/json">{"path":"/counter","params":{},"data":{"count":5},"clientRouting":true,"clientPage":"/counter","partial":false}</script><script type="module" src="/assets/honoto-client.js"></script></body></html>
@@ -1 +0,0 @@
1
- <!DOCTYPE html><html><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>Honoto</title></head><body class="bg-[#f6f4ef] text-[#111]"><nav class="flex gap-4 p-4 bg-[#1c1917]"><a href="/" class="text-[#fafaf9] no-underline border-transparent border-b-2 hover:b-b-current b-b-current">Home</a><a href="/about" class="text-[#fafaf9] no-underline border-transparent border-b-2 hover:b-b-current ">About</a><a href="/jobs" class="text-[#fafaf9] no-underline border-transparent border-b-2 hover:b-b-current ">Jobs</a><a href="/blog/hello" class="text-[#fafaf9] no-underline border-transparent border-b-2 hover:b-b-current ">Blog</a><a href="/counter" class="text-[#fafaf9] no-underline border-transparent border-b-2 hover:b-b-current ">Counter</a><a href="/admin" class="text-[#fafaf9] no-underline border-transparent border-b-2 hover:b-b-current ">Admin</a></nav><div id="honoto-page"><main class="max-w-4xl mx-auto p-4"><h1>Honoto</h1><p>Home page with a hydratable counter widget.</p><honoto-component data-component="/src/components/Counter.tsx" data-export="default" data-props="{&quot;initial&quot;:3}"><button type="button" class="bg-[#1c1917] text-[#fafaf9] px-4 py-2 rounded-md hover:bg-[#2b2826]">Count: 3</button></honoto-component></main></div><script id="__HONOTO__" type="application/json">{"path":"/","params":{},"clientRouting":true,"clientPage":null,"partial":false}</script><script type="module" src="/assets/honoto-client.js"></script></body></html>
@@ -1 +0,0 @@
1
- <!DOCTYPE html><html><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>Honoto</title></head><body class="bg-[#f6f4ef] text-[#111]"><nav class="flex gap-4 p-4 bg-[#1c1917]"><a href="/" class="text-[#fafaf9] no-underline border-transparent border-b-2 hover:b-b-current ">Home</a><a href="/about" class="text-[#fafaf9] no-underline border-transparent border-b-2 hover:b-b-current ">About</a><a href="/jobs" class="text-[#fafaf9] no-underline border-transparent border-b-2 hover:b-b-current b-b-current">Jobs</a><a href="/blog/hello" class="text-[#fafaf9] no-underline border-transparent border-b-2 hover:b-b-current ">Blog</a><a href="/counter" class="text-[#fafaf9] no-underline border-transparent border-b-2 hover:b-b-current ">Counter</a><a href="/admin" class="text-[#fafaf9] no-underline border-transparent border-b-2 hover:b-b-current ">Admin</a></nav><div id="honoto-page"><main class="max-w-4xl mx-auto p-4"><h1>Jobs</h1><p>Routed from (marketing)/jobs.tsx — the group folder is not in the URL.</p><h2 class="text-lg font-bold">Available Jobs</h2><p><ul><li><a href="/jobs/1">Job 1</a></li></ul></p><h2>Apply for a Job</h2><p><form action="/jobs/apply" method="post"><input type="text" name="name" placeholder="Your Name"/><input type="email" name="email" placeholder="Your Email"/><button type="submit">Apply</button></form></p></main></div><script id="__HONOTO__" type="application/json">{"path":"/jobs","params":{},"clientRouting":true,"clientPage":null,"partial":false}</script><script type="module" src="/assets/honoto-client.js"></script></body></html>