@useavalon/avalon 0.3.2-canary.8 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/dist/mod.d.ts +1 -1
  2. package/dist/mod.js +1 -1
  3. package/dist/src/build/integration-config.js +1 -1
  4. package/dist/src/build/island-client-bundler.js +1 -1
  5. package/dist/src/build/island-manifest.d.ts +3 -0
  6. package/dist/src/build/island-manifest.js +1 -1
  7. package/dist/src/build/island-ssr-flag.d.ts +14 -0
  8. package/dist/src/build/island-ssr-flag.js +1 -0
  9. package/dist/src/build/mdx-island-transform.js +2 -2
  10. package/dist/src/build/mdx-plugin.js +1 -1
  11. package/dist/src/build/page-island-await.d.ts +18 -0
  12. package/dist/src/build/page-island-await.js +2 -0
  13. package/dist/src/build/page-island-transform.d.ts +3 -1
  14. package/dist/src/build/page-island-transform.js +2 -2
  15. package/dist/src/client/css-hmr-handler.d.ts +7 -90
  16. package/dist/src/client/css-hmr-handler.js +1 -1
  17. package/dist/src/client/custom-directives.js +1 -1
  18. package/dist/src/client/hmr-coordinator.d.ts +0 -1
  19. package/dist/src/client/hmr-coordinator.js +1 -1
  20. package/dist/src/client/hmr-error-overlay.d.ts +18 -0
  21. package/dist/src/client/hydrate-runtime.d.ts +33 -0
  22. package/dist/src/client/hydrate-runtime.js +1 -0
  23. package/dist/src/client/hydration-mode.d.ts +11 -0
  24. package/dist/src/client/hydration-mode.js +1 -0
  25. package/dist/src/client/main-slim.js +1 -0
  26. package/dist/src/client/main.js +2 -15
  27. package/dist/src/client/router/a11y.d.ts +9 -0
  28. package/dist/src/client/router/a11y.js +1 -0
  29. package/dist/src/client/router/eligibility.d.ts +32 -0
  30. package/dist/src/client/router/eligibility.js +1 -0
  31. package/dist/src/client/router/events.d.ts +33 -0
  32. package/dist/src/client/router/events.js +1 -0
  33. package/dist/src/client/router/forms.d.ts +25 -0
  34. package/dist/src/client/router/forms.js +1 -0
  35. package/dist/src/client/router/index.d.ts +20 -0
  36. package/dist/src/client/router/index.js +1 -0
  37. package/dist/src/client/router/opt-out.d.ts +30 -0
  38. package/dist/src/client/router/opt-out.js +1 -0
  39. package/dist/src/client/router/persist.d.ts +24 -0
  40. package/dist/src/client/router/persist.js +1 -0
  41. package/dist/src/client/router/prefetch.d.ts +25 -0
  42. package/dist/src/client/router/prefetch.js +1 -0
  43. package/dist/src/client/router/swap.d.ts +31 -0
  44. package/dist/src/client/router/swap.js +1 -0
  45. package/dist/src/client/router/transitions.d.ts +22 -0
  46. package/dist/src/client/router/transitions.js +1 -0
  47. package/dist/src/client/server-islands-boot.d.ts +12 -0
  48. package/dist/src/client/server-islands-boot.js +1 -0
  49. package/dist/src/client/types/vite-virtual-modules.d.ts +7 -0
  50. package/dist/src/islands/builtin-directives.d.ts +1 -0
  51. package/dist/src/islands/builtin-directives.js +1 -1
  52. package/dist/src/islands/critical-css.js +1 -1
  53. package/dist/src/islands/framework-base-css.d.ts +5 -1
  54. package/dist/src/islands/framework-base-css.js +1 -1
  55. package/dist/src/islands/hydration-directives.js +1 -1
  56. package/dist/src/islands/island.d.ts +24 -3
  57. package/dist/src/islands/island.js +1 -1
  58. package/dist/src/islands/per-island-script.js +1 -1
  59. package/dist/src/islands/types.d.ts +6 -0
  60. package/dist/src/nitro/renderer.d.ts +2 -1
  61. package/dist/src/nitro/renderer.js +20 -20
  62. package/dist/src/nitro/types.d.ts +5 -0
  63. package/dist/src/post-build/cloudflare-worker-patch.d.ts +32 -0
  64. package/dist/src/post-build/cloudflare-worker-patch.js +1 -0
  65. package/dist/src/post-build/fetch-handler-wrapper.d.ts +1 -0
  66. package/dist/src/post-build/fetch-handler-wrapper.js +56 -0
  67. package/dist/src/post-build/index.d.ts +16 -0
  68. package/dist/src/post-build/index.js +6 -51
  69. package/dist/src/post-build/isolated-island-builder.js +2 -2
  70. package/dist/src/render/collect-css.d.ts +29 -0
  71. package/dist/src/render/collect-css.js +3 -3
  72. package/dist/src/render/dev-css-select.d.ts +40 -0
  73. package/dist/src/render/dev-css-select.js +5 -0
  74. package/dist/src/schemas/routing/index.d.ts +2 -0
  75. package/dist/src/schemas/routing.d.ts +1 -0
  76. package/dist/src/schemas/routing.js +1 -1
  77. package/dist/src/server-islands/encryption.js +1 -1
  78. package/dist/src/server-islands/endpoint.js +3 -3
  79. package/dist/src/server-islands/renderer.js +6 -5
  80. package/dist/src/server-islands/route.d.ts +3 -1
  81. package/dist/src/server-islands/route.js +1 -1
  82. package/dist/src/types/island-prop.d.ts +28 -9
  83. package/dist/src/types/virtual-modules.d.ts +26 -6
  84. package/dist/src/types/vite-env.d.ts +4 -0
  85. package/dist/src/vite-plugin/config.js +1 -1
  86. package/dist/src/vite-plugin/dev-css-graph.d.ts +41 -0
  87. package/dist/src/vite-plugin/dev-css-graph.js +1 -0
  88. package/dist/src/vite-plugin/dev-css-hmr.d.ts +42 -0
  89. package/dist/src/vite-plugin/dev-css-hmr.js +2 -0
  90. package/dist/src/vite-plugin/dev-css-modules.d.ts +8 -0
  91. package/dist/src/vite-plugin/dev-css-modules.js +1 -0
  92. package/dist/src/vite-plugin/framework-vite-defaults.d.ts +29 -0
  93. package/dist/src/vite-plugin/framework-vite-defaults.js +1 -0
  94. package/dist/src/vite-plugin/nitro-integration.d.ts +4 -0
  95. package/dist/src/vite-plugin/nitro-integration.js +20 -20
  96. package/dist/src/vite-plugin/plugin.d.ts +2 -0
  97. package/dist/src/vite-plugin/plugin.js +1 -1
  98. package/dist/src/vite-plugin/server-islands-plugin.js +1 -1
  99. package/dist/src/vite-plugin/ssr-dom-shim-module.d.ts +27 -0
  100. package/dist/src/vite-plugin/ssr-dom-shim-module.js +121 -0
  101. package/dist/src/vite-plugin/stub-build-time-packages.d.ts +16 -0
  102. package/dist/src/vite-plugin/stub-build-time-packages.js +2 -0
  103. package/dist/src/vite-plugin/types.d.ts +12 -0
  104. package/package.json +13 -7
@@ -1,31 +1,31 @@
1
- import{existsSync as e,readdirSync as t,readFileSync as n,rmSync as r}from"node:fs";import{stat as i}from"node:fs/promises";import{createRequire as a}from"node:module";import{dirname as o,join as s,relative as c,resolve as l}from"node:path";import{nitro as u}from"nitro/vite";import{isRunnableDevEnvironment as d}from"vite";import{generateActionTypes as f}from"../build/actions-types-generator.js";import{createCronDevSchedulerPlugin as p}from"../cron/dev-scheduler.js";import{getUniversalCSSForHead as m}from"../islands/universal-css-collector.js";import{getUniversalHeadForInjection as h,injectSolidHydrationScriptIfNeeded as g}from"../islands/universal-head-collector.js";import{clearMiddlewareCache as _,discoverScopedMiddleware as v,executeScopedMiddleware as y}from"../middleware/index.js";import{createNitroConfig as b}from"../nitro/config.js";import{createIslandManifestPlugin as x,createNitroBuildPlugin as S,createSourceMapConfig as C,createSourceMapPlugin as w}from"../nitro/index.js";import{collectCssFromModuleGraph as T,injectSsrCss as E}from"../render/collect-css.js";import{generateErrorPage as D,generateFallback404 as O}from"../render/error-pages.js";import{generateComponentId as ee}from"../server-islands/manifest.js";import{resolveToRelativePath as te}from"./server-islands-plugin.js";function ne(e){let t=se(e),r=Object.entries(t),i=`export const serverIslandManifest = ${JSON.stringify(t)};\n\n`;i+=`export const serverIslandLoaders = {
1
+ import{existsSync as e,readdirSync as t,readFileSync as n,rmSync as r}from"node:fs";import{stat as i}from"node:fs/promises";import{createRequire as a}from"node:module";import{dirname as o,join as s}from"node:path";import{nitro as c}from"nitro/vite";import{isRunnableDevEnvironment as l}from"vite";import{generateActionTypes as u}from"../build/actions-types-generator.js";import{clientEntryImportLines as d,resolveHydrationMode as f}from"../client/hydration-mode.js";import{createCronDevSchedulerPlugin as p}from"../cron/dev-scheduler.js";import{getUniversalCSSForHead as m}from"../islands/universal-css-collector.js";import{getUniversalHeadForInjection as h,injectSolidHydrationScriptIfNeeded as g}from"../islands/universal-head-collector.js";import{clearMiddlewareCache as _,discoverScopedMiddleware as v,executeScopedMiddleware as y}from"../middleware/index.js";import{createNitroConfig as b}from"../nitro/config.js";import{createIslandManifestPlugin as x,createNitroBuildPlugin as S,createSourceMapConfig as C,createSourceMapPlugin as ee}from"../nitro/index.js";import{collectCssFromModuleGraph as w,injectSsrCss as T}from"../render/collect-css.js";import{generateErrorPage as E,generateFallback404 as D}from"../render/error-pages.js";import{generateComponentId as te}from"../server-islands/manifest.js";import{buildDevCssRouteTable as ne}from"./dev-css-graph.js";import{createDevCssHmrPlugin as re,generateDevCssHmrModule as ie}from"./dev-css-hmr.js";import{resolveToRelativePath as ae}from"./server-islands-plugin.js";import{SSR_DOM_VIRTUAL_ID as O,ssrDomShimModuleSource as k}from"./ssr-dom-shim-module.js";function oe(e){let t=de(e),r=Object.entries(t),i=`export const serverIslandManifest = ${JSON.stringify(t)};\n\n`;i+=`export const serverIslandLoaders = {
2
2
  `;for(let[e,t]of r)i+=` ${JSON.stringify(e)}: () => import(${JSON.stringify(t)}),\n`;i+=`};
3
3
 
4
- `;let a={};for(let[t,i]of r)if(i.endsWith(`.svelte`))try{let r=n(s(e,i.startsWith(`/`)?i.slice(1):i),`utf8`).match(/<style[^>]*>([\s\S]*?)<\/style>/);r&&(a[t]=r[1].trim())}catch{}return i+=`export const serverIslandCSS = ${JSON.stringify(a)};\n`,i}function k(e,t){return new Promise((n,r)=>{let i=[],a=e=>i.push(e),o=()=>{l(),n(Buffer.concat(i).toString(`utf8`))},s=e=>{l(),r(e)},c=setTimeout(()=>{l(),r(Error(t))},15e3);function l(){clearTimeout(c),e.off(`data`,a),e.off(`end`,o),e.off(`error`,s)}e.on(`data`,a),e.on(`end`,o),e.on(`error`,s)})}const A=/^[ \t]*import\s+([A-Z]\w*)\s+from\s+(['"][^'"]+['"])/gm,re=new Set([`node_modules`,`dist`,`.output`,`.netlify`,`.vercel`,`.cloudflare`,`.wrangler`,`.firebase`,`.amplify-hosting`,`.git`]);function ie(e,t){return new RegExp(String.raw`<${t}\s[\s\S]*?\bserver\s*[={/>]`).test(e)}function ae(e,t){return!(!/\.(tsx|jsx)$/.test(e)||/\.(test|spec)\.[jt]sx$/.test(e)||t.includes(`__tests__`))}function j(e,n){let r;try{r=t(e,{withFileTypes:!0})}catch{return}for(let t of r){let r=s(e,t.name);t.isDirectory()?re.has(t.name)||j(r,n):t.isFile()&&ae(t.name,r)&&n.push(r)}}function oe(e,t,n,r){A.lastIndex=0;let i=A.exec(t);for(;i!==null;i=A.exec(t)){let a=i[1],o=i[2].slice(1,-1);if(!ie(t,a))continue;let s=te(o,e,n),c=ee(s);c in r||(r[c]=s)}}function se(t){let r={},i=[];for(let n of[`app`,`src`]){let r=s(t,n);e(r)&&j(r,i)}for(let e of i){let i;try{i=n(e,`utf8`)}catch{continue}/\bserver\s*[={/>]/.test(i)&&oe(e,i,t,r)}return r}function M(t){let n=[`ts`,`tsx`,`js`,`jsx`,`mts`,`mjs`];for(let r of[`app`,`src`])for(let i of n){let n=`/${r}/actions/index.${i}`;if(e(s(t,n.slice(1))))return n}}function ce(e){let t=M(e);return t?`export { server } from ${JSON.stringify(t)};\n`:`export const server = {};
5
- `}function le(){return[`import { createActionClient } from "@useavalon/avalon/actions";`,`export const actions = createActionClient();`,`export default actions;`,``].join(`
6
- `)}function ue(e,t){try{let n;if(e.startsWith(`dev.`)){let t=e.slice(4);n=Buffer.from(t,`base64url`).toString(`utf8`)}else n=t(e);let r=JSON.parse(n),i,a;return r.__island&&(i=r.__island,delete r.__island),r.__src&&(a=r.__src,delete r.__src),{ok:!0,props:r,srcPath:a,islandMeta:i}}catch{return{ok:!1}}}function de(e,t,n,r){let i=e.split(`/`)[2]?.split(`?`)[0]||``,a=t.elementId??`si-${i}`,o=t.componentSrc??n,s=JSON.stringify(r),c=t.condition??`on:client`,l=t.framework??`preact`;return`<script type="module">
7
- import{hydrateServerIsland}from"/@fs${N(`src/client/server-island-hydrate.ts`)}";
4
+ `;let a={};for(let[t,i]of r)if(i.endsWith(`.svelte`))try{let r=n(s(e,i.startsWith(`/`)?i.slice(1):i),`utf8`).match(/<style[^>]*>([\s\S]*?)<\/style>/);r&&(a[t]=r[1].trim())}catch{}return i+=`export const serverIslandCSS = ${JSON.stringify(a)};\n`,i}function A(e,t){return new Promise((n,r)=>{let i=[],a=e=>i.push(e),o=()=>{l(),n(Buffer.concat(i).toString(`utf8`))},s=e=>{l(),r(e)},c=setTimeout(()=>{l(),r(Error(t))},15e3);function l(){clearTimeout(c),e.off(`data`,a),e.off(`end`,o),e.off(`error`,s)}e.on(`data`,a),e.on(`end`,o),e.on(`error`,s)})}const j=/^[ \t]*import\s+([A-Z]\w*)\s+from\s+(['"][^'"]+['"])/gm,se=new Set([`node_modules`,`dist`,`.output`,`.netlify`,`.vercel`,`.cloudflare`,`.wrangler`,`.firebase`,`.amplify-hosting`,`.git`]);function ce(e,t){return new RegExp(String.raw`<${t}\s[\s\S]*?\bserver\s*[={/>]`).test(e)}function le(e,t){return!(!/\.(tsx|jsx)$/.test(e)||/\.(test|spec)\.[jt]sx$/.test(e)||t.includes(`__tests__`))}function M(e,n){let r;try{r=t(e,{withFileTypes:!0})}catch{return}for(let t of r){let r=s(e,t.name);t.isDirectory()?se.has(t.name)||M(r,n):t.isFile()&&le(t.name,r)&&n.push(r)}}function ue(e,t,n,r){j.lastIndex=0;let i=j.exec(t);for(;i!==null;i=j.exec(t)){let a=i[1],o=i[2].slice(1,-1);if(!ce(t,a))continue;let s=ae(o,e,n),c=te(s);c in r||(r[c]=s)}}function de(t){let r={},i=[];for(let n of[`app`,`src`]){let r=s(t,n);e(r)&&M(r,i)}for(let e of i){let i;try{i=n(e,`utf8`)}catch{continue}/\bserver\s*[={/>]/.test(i)&&ue(e,i,t,r)}return r}function N(t){let n=[`ts`,`tsx`,`js`,`jsx`,`mts`,`mjs`];for(let r of[`app`,`src`])for(let i of n){let n=`/${r}/actions/index.${i}`;if(e(s(t,n.slice(1))))return n}}function fe(e){let t=N(e);return t?`export { server } from ${JSON.stringify(t)};\n`:`export const server = {};
5
+ `}function pe(){return[`import { createActionClient } from "@useavalon/avalon/actions";`,`export const actions = createActionClient();`,`export default actions;`,``].join(`
6
+ `)}function me(e,t){try{let n;if(e.startsWith(`dev.`)){let t=e.slice(4);n=Buffer.from(t,`base64url`).toString(`utf8`)}else n=t(e);let r=JSON.parse(n),i,a;return r.__island&&(i=r.__island,delete r.__island),r.__src&&(a=r.__src,delete r.__src),{ok:!0,props:r,srcPath:a,islandMeta:i}}catch{return{ok:!1}}}function he(e,t,n,r){let i=e.split(`/`)[2]?.split(`?`)[0]||``,a=t.elementId??`si-${i}`,o=t.componentSrc??n,s=JSON.stringify(r),c=t.condition??`on:client`,l=t.framework??`preact`;return`<script type="module">
7
+ import{hydrateServerIsland}from"/@fs${P(`src/client/server-island-hydrate.ts`)}";
8
8
  hydrateServerIsland(${JSON.stringify(a)},${JSON.stringify(o)},${s},${JSON.stringify(c)},${JSON.stringify(l)});
9
- <\/script>`}function N(t){let n=s(o(a(import.meta.url).resolve(`@useavalon/avalon`)),t);if(t.endsWith(`.ts`)&&!e(n)){let t=n.replace(/\.ts$/,`.js`);if(e(t))return t}return n}function fe(t,n){let r=s(o(a(s(process.cwd(),`package.json`)).resolve(`@useavalon/${t}`)),n);if(n.endsWith(`.ts`)&&!e(r)){let t=r.replace(/\.ts$/,`.js`);if(e(t))return t}return r}export const VIRTUAL_MODULE_IDS={PAGE_ROUTES:`virtual:avalon/page-routes`,PAGE_LOADER:`virtual:avalon/page-loader`,ISLAND_MANIFEST:`virtual:avalon/island-manifest`,RUNTIME_CONFIG:`virtual:avalon/runtime-config`,CONFIG:`virtual:avalon/config`,LAYOUTS:`virtual:avalon/layouts`,ASSETS:`virtual:avalon/assets`,RENDERER:`virtual:avalon/renderer`,CLIENT_ENTRY:`virtual:avalon/client-entry`,INTEGRATION_LOADER:`virtual:avalon/integration-loader`,ACTIONS:`virtual:avalon/actions`};export const RESOLVED_VIRTUAL_IDS={PAGE_ROUTES:`\0${VIRTUAL_MODULE_IDS.PAGE_ROUTES}`,PAGE_LOADER:`\0${VIRTUAL_MODULE_IDS.PAGE_LOADER}`,ISLAND_MANIFEST:`\0${VIRTUAL_MODULE_IDS.ISLAND_MANIFEST}`,RUNTIME_CONFIG:`\0${VIRTUAL_MODULE_IDS.RUNTIME_CONFIG}`,CONFIG:`\0${VIRTUAL_MODULE_IDS.CONFIG}`,LAYOUTS:`\0${VIRTUAL_MODULE_IDS.LAYOUTS}`,ASSETS:`\0${VIRTUAL_MODULE_IDS.ASSETS}`,RENDERER:`\0${VIRTUAL_MODULE_IDS.RENDERER}`,CLIENT_ENTRY:`\0${VIRTUAL_MODULE_IDS.CLIENT_ENTRY}`,INTEGRATION_LOADER:`\0${VIRTUAL_MODULE_IDS.INTEGRATION_LOADER}`,ACTIONS:`\0${VIRTUAL_MODULE_IDS.ACTIONS}`};function pe(e){return e===`react`?[]:[/^react/,/^react-dom/]}function me(e){return e===`react`?[`import { createElement as h } from 'react';`,`import { renderToString as preactRenderToString } from 'react-dom/server';`]:[`import { h } from 'preact';`,`import preactRenderToString from 'preact-render-to-string';`]}function he(e){return e===`react`?[`import { setShellRenderToString, setShellElementFactory } from '@useavalon/avalon/render/shell-engine';`,`import { renderToString as __reactRenderToString } from 'react-dom/server';`,`import { createElement as __reactCreateElement, Fragment as __reactFragment } from 'react';`,`setShellRenderToString((vnode) => __reactRenderToString(vnode));`,`setShellElementFactory(__reactCreateElement, __reactFragment);`]:[]}function ge(e){return e===`react`?`@useavalon/react/client`:`@useavalon/preact/client`}function _e(e){let t=N(`src/core/integrations/registry.ts`),n=[`solid`,`vue`,`svelte`,`lit`].filter(t=>e.includes(t));return`${[`import { registry } from "${t}";`,...n.map(e=>`import { ${e}Integration } from "@useavalon/${e}";`),...n.map(e=>`if (${e}Integration) registry.register(${e}Integration);`)].join(`
10
- `)}\n`}export function createNitroIntegration(e,t={}){let n=b(t,e),r=process.cwd(),i=N(`src/server-islands/route.ts`),a=N(`src/actions/route.ts`),o={preset:n.preset,serverDir:t.serverDir??n.serverDir??`./server`,routeRules:n.routeRules,runtimeConfig:n.runtimeConfig,compatibilityDate:n.compatibilityDate,scanDirs:[`.`],noExternals:[`estree-walker`,/^@useavalon\//,/^estree-util/,/^preact/,...pe(e.core),/^vue/,/^@vue\//],handlers:[{route:`/_server-islands/**`,handler:i},{route:`/_actions/**`,handler:a}],virtual:{"virtual:server-island-manifest":()=>ne(r),"virtual:avalon-actions-manifest":()=>ce(r),"virtual:server-island-key":()=>{let e=process.env.AVALON_KEY??``;return`export const serverIslandKey = ${JSON.stringify(e)};\n`},"virtual:server-island-integrations":()=>_e(e.integrations)}};t.renderer===!1?o.renderer=!1:n.renderer&&(o.renderer=n.renderer),n.publicRuntimeConfig&&(o.publicRuntimeConfig=n.publicRuntimeConfig),n.publicAssets&&(o.publicAssets=n.publicAssets),n.compressPublicAssets&&(o.compressPublicAssets=n.compressPublicAssets),n.serverEntry&&(o.serverEntry=n.serverEntry);let s=process.argv.includes(`build`)||process.env.NODE_ENV===`production`;n.experimentalTasks&&s&&(o.experimental={...o.experimental,tasks:!0},n.tasks&&Object.keys(n.tasks).length>0&&(o.tasks=n.tasks),n.scheduledTasks&&Object.keys(n.scheduledTasks).length>0&&(o.scheduledTasks=n.scheduledTasks));let c=n.traceDeps??[];o.traceDeps=[...new Set([`undici`,...c])],n.prerender&&(o.prerender={routes:[],crawlLinks:!1});let l=u(o),d=createNitroCoordinationPlugin({avalonConfig:e,nitroConfig:t,verbose:e.verbose}),f=createVirtualModulesPlugin({avalonConfig:e,nitroConfig:t,verbose:e.verbose}),m=S(e,t),h=x(e,{verbose:e.verbose,generatePreloadHints:!0}),g=w(C(t.preset??`node_server`,e.isDev)),_=p(t.cron,e.verbose);return{nitroOptions:n,plugins:[...Array.isArray(l)?l:[l],d,f,m,h,g,_]}}export function createNitroCoordinationPlugin(e){let{avalonConfig:t,verbose:n}=e;return{name:`avalon:nitro-coordination`,enforce:`pre`,config(e,{command:t}){if(t===`serve`)return{server:{watch:{ignored:[`**/.output/**`,`**/dist/**`,`**/.netlify/**`,`**/.vercel/**`,`**/.cloudflare/**`,`**/.wrangler/**`,`**/.firebase/**`,`**/.amplify-hosting/**`]},fs:{deny:[`.output`,`dist`,`.netlify`,`.vercel`,`.cloudflare`,`.wrangler`,`.firebase`,`.amplify-hosting`]}}}},configResolved(e){globalThis.__avalonHydrationMode=e.command===`serve`?`entry-client`:`per-island`;try{f(e.root||process.cwd())}catch{}},configureServer(e){globalThis.__viteDevServer=e;let i=e.config.root||process.cwd(),a=e=>{if(e.includes(`/actions/`))try{f(i)}catch{}};e.watcher.on(`add`,a),e.watcher.on(`unlink`,a);let o=e.config.root||process.cwd(),c=e.config.build?.outDir?s(o,e.config.build.outDir):s(o,`dist`);try{r(c,{recursive:!0,force:!0})}catch{}try{r(s(o,`.output`),{recursive:!0,force:!0})}catch{}let l=!1,u=new Promise(t=>{let n=()=>{(e.environments?.nitro)?.devServer?.entry||l?(l=!0,t()):setTimeout(n,50)};setTimeout(n,100),setTimeout(()=>{l=!0,t()},15e3)});e.middlewares.use(async(e,t,n)=>{if(l)return n();let r=e.url||`/`;if(r.startsWith(`/@`)||r.startsWith(`/__`)||/\/[^/]+\.[a-z0-9]+(\?|$)/i.test(r))return n();await u,n()});let p=null;async function m(){return p||=await v({baseDir:`${e.config.root||process.cwd()}/src`,devMode:!1}),p}function h(){p=null}Se(e,t,n,h),m().catch(e=>{console.warn(`[middleware] Failed to discover middleware:`,e)});let g=e.environments?.ssr,_=!!g&&d(g);_&&be(e,t.integrations,n).catch(e=>{console.error(`[prewarm] Core modules pre-warm failed:`,e)}),e.middlewares.use(async(n,r,i)=>{let a=n.url||`/`;if(!a.startsWith(`/_server-islands/`)||!_)return i();try{let{decrypt:i}=await e.ssrLoadModule(N(`src/server-islands/encryption.ts`)),{h:o,renderToString:s}=await H(e,t.core),c=new URL(a,`http://${n.headers.host||`localhost`}`).searchParams.get(`p`)||``;if(!c&&n.method===`POST`&&(c=await k(n,`Timed out reading server island request body`)),!c){r.statusCode=400,r.setHeader(`Content-Type`,`text/plain`),r.end(`Missing encrypted props`);return}let l=ue(c,i);if(!l.ok){r.statusCode=400,r.setHeader(`Content-Type`,`text/plain`),r.end(`Bad Request: decryption failed`);return}let{props:u,srcPath:d,islandMeta:f}=l;if(!d){r.statusCode=404,r.setHeader(`Content-Type`,`text/plain`),r.end(`Component not found (no __src in payload)`);return}let p=(await e.ssrLoadModule(d)).default;if(typeof p!=`function`){r.statusCode=500,r.setHeader(`Content-Type`,`text/plain`),r.end(`Module "${d}" does not export a default component function`);return}let m=s(o(p,u));f&&(m+=de(a,f,d,u)),r.statusCode=200,r.setHeader(`Content-Type`,`text/html`),r.setHeader(`Cache-Control`,`private, no-store`),r.end(m)}catch(e){console.error(`[server-islands] Dev handler error:`,e),r.statusCode=500,r.setHeader(`Content-Type`,`text/plain`),r.end(`Server island render failed: ${e instanceof Error?e.message:String(e)}`)}}),e.middlewares.use(async(t,n,r)=>{let i=t.url||`/`;if(!i.startsWith(`/_actions/`)||!_)return r();try{let r=M(e.config.root||process.cwd()),[a,o,s]=await Promise.all([e.ssrLoadModule(N(`src/actions/endpoint.ts`)),e.ssrLoadModule(N(`src/actions/registry.ts`)),r?e.ssrLoadModule(r):Promise.resolve({server:{}})]),c=o.flattenActions(s.server),l=a.defineActionHandler({registry:c,isDev:!0}),u=new URL(i,`http://${t.headers.host||`localhost`}`),d=(t.method||`GET`).toUpperCase(),f;d===`POST`&&(f=await k(t,`Timed out reading action request body`));let p=await l({url:u,web:{request:new Request(u,{method:d,headers:t.headers,body:f})},context:{}});n.statusCode=p.status,p.headers.forEach((e,t)=>{n.setHeader(t,e)}),n.end(await p.text())}catch(e){console.error(`[actions] Dev handler error:`,e),n.statusCode=500,n.setHeader(`Content-Type`,`application/json`),n.end(JSON.stringify({error:{code:`INTERNAL_SERVER_ERROR`,message:e instanceof Error?e.message:String(e)}}))}}),e.middlewares.use(async(r,i,a)=>{if(!_)return a();let o=r.url||`/`;if(o.endsWith(`.html`)&&(o=o.slice(0,-5)||`/`),o===`/index`&&(o=`/`),o.startsWith(`/@`)||o.startsWith(`/__`)||o.startsWith(`/node_modules/`)||o.startsWith(`/src/client/`)||o.startsWith(`/packages/`)||o.includes(`.`)&&!o.endsWith(`/`)||o.startsWith(`/api/`))return a();try{if(await ve(e,o,r,i,m,n)||await Be(e,o,t,i))return;let a=await Ve(e,o,t);if(a){i.statusCode=200,i.setHeader(`Content-Type`,`text/html`),i.end(a);return}await ye(e,o,i,t)}catch(e){console.error(`[SSR Error]`,e),i.statusCode=500,i.setHeader(`Content-Type`,`text/html`),i.end(D(e))}})},buildStart(){}}}async function ve(e,t,n,r,i,a){let o=performance.now(),s=await i();if(s.length===0)return!1;let c={};for(let[e,t]of Object.entries(n.headers))typeof t==`string`?c[e]=t:Array.isArray(t)&&(c[e]=t.join(`, `));let l=`http://${n.headers.host||`localhost`}${t}`,u=await y({url:l,method:n.method||`GET`,path:t,node:{req:n,res:r},req:new Request(l,{method:n.method||`GET`,headers:c}),context:{}},s,{devMode:!1}),d=performance.now()-o;return d>100&&console.warn(`⚠️ Slow middleware: ${d.toFixed(0)}ms for ${t}`),u?(r.statusCode=u.status,u.headers.forEach((e,t)=>{r.setHeader(t,e)}),r.end(await u.text()),!0):!1}async function ye(e,t,n,r){try{let{discoverErrorPages:i,getErrorPageModule:a,generateDefaultErrorPage:o}=await import(`../nitro/error-handler.js`),s=a(404,await i({isDev:r.isDev,pagesDir:r.pagesDir,loadPageModule:async t=>await e.ssrLoadModule(t)}));if(s?.default&&typeof s.default==`function`){let{renderToHtml:e}=await import(`../render/ssr.js`),r=s.default,i=await e({component:()=>r({statusCode:404,message:`Page not found: ${t}`,url:t})},{});n.statusCode=404,n.setHeader(`Content-Type`,`text/html`),n.end(i);return}let c=o(404,`Page not found: ${t}`,r.isDev);n.statusCode=404,n.setHeader(`Content-Type`,`text/html`),n.end(c)}catch{n.statusCode=404,n.setHeader(`Content-Type`,`text/html`),n.end(O(t))}}async function be(e,t,n){let r=performance.now(),i=[{path:N(`src/render/ssr.ts`),assignTo:`ssr`},{path:N(`src/core/layout/enhanced-layout-resolver.ts`),assignTo:`layout`},{path:N(`src/middleware/index.ts`),assignTo:null},...t.map(e=>({path:fe(e,`server/renderer.ts`),assignTo:null}))],a=(await Promise.allSettled(i.map(async({path:t,assignTo:n})=>{let r=await e.ssrLoadModule(t);n===`ssr`&&(B=r),n===`layout`&&(V=r)}))).filter(e=>e.status===`fulfilled`).length,o=performance.now()-r;n&&a>0&&console.log(`🔥 SSR ready in ${o.toFixed(0)}ms (${a}/${i.length} core modules)`)}export function createVirtualModulesPlugin(e){let{avalonConfig:n,nitroConfig:r,verbose:i}=e,a=null,o=s,u=c,d=l,f=process.cwd(),p=[];function m(e){try{let n=t(e,{withFileTypes:!0});for(let t of n){let n=o(e,t.name);if(t.isDirectory()&&t.name!==`node_modules`&&!t.name.startsWith(`.`))m(n);else if(t.isFile()&&t.name.endsWith(`.css`)){let e=u(f,n).replaceAll(`\\`,`/`);p.push(e.startsWith(`/`)?e:`/${e}`)}}}catch{}}function h(){p.length=0;for(let e of r.globalCSS??[])p.push(e.startsWith(`/`)?e:`/${e}`);n.modules&&m(d(f,n.modules.dir)),m(d(f,n.layoutsDir));let e=d(f,n.layoutsDir,`..`);e!==f&&e!==d(f,n.layoutsDir)&&e.startsWith(f)&&m(e)}return n.isDev&&h(),{name:`avalon:nitro-virtual-modules`,enforce:`pre`,resolveId(e){return e===VIRTUAL_MODULE_IDS.PAGE_ROUTES?RESOLVED_VIRTUAL_IDS.PAGE_ROUTES:e===VIRTUAL_MODULE_IDS.PAGE_LOADER?RESOLVED_VIRTUAL_IDS.PAGE_LOADER:e===VIRTUAL_MODULE_IDS.ISLAND_MANIFEST?RESOLVED_VIRTUAL_IDS.ISLAND_MANIFEST:e===VIRTUAL_MODULE_IDS.RUNTIME_CONFIG?RESOLVED_VIRTUAL_IDS.RUNTIME_CONFIG:e===VIRTUAL_MODULE_IDS.CONFIG?RESOLVED_VIRTUAL_IDS.CONFIG:e===VIRTUAL_MODULE_IDS.LAYOUTS?RESOLVED_VIRTUAL_IDS.LAYOUTS:e===VIRTUAL_MODULE_IDS.ASSETS?RESOLVED_VIRTUAL_IDS.ASSETS:e===VIRTUAL_MODULE_IDS.RENDERER?RESOLVED_VIRTUAL_IDS.RENDERER:e===VIRTUAL_MODULE_IDS.CLIENT_ENTRY?RESOLVED_VIRTUAL_IDS.CLIENT_ENTRY:e===VIRTUAL_MODULE_IDS.INTEGRATION_LOADER?RESOLVED_VIRTUAL_IDS.INTEGRATION_LOADER:e===VIRTUAL_MODULE_IDS.ACTIONS?RESOLVED_VIRTUAL_IDS.ACTIONS:null},async load(e){return e===RESOLVED_VIRTUAL_IDS.PAGE_ROUTES?await Ce(n,i):e===RESOLVED_VIRTUAL_IDS.PAGE_LOADER?await we(n,i):e===RESOLVED_VIRTUAL_IDS.ISLAND_MANIFEST?Te():e===RESOLVED_VIRTUAL_IDS.RUNTIME_CONFIG?Ee(n,r):e===RESOLVED_VIRTUAL_IDS.CONFIG?generateConfigModule(n,r):e===RESOLVED_VIRTUAL_IDS.LAYOUTS?(a||=await De(n,r,p),a):e===RESOLVED_VIRTUAL_IDS.ASSETS?Oe(r):e===RESOLVED_VIRTUAL_IDS.RENDERER?ke(n):e===RESOLVED_VIRTUAL_IDS.CLIENT_ENTRY?await Me(n,r):e===RESOLVED_VIRTUAL_IDS.INTEGRATION_LOADER?generateIntegrationLoaderModule(n):e===RESOLVED_VIRTUAL_IDS.ACTIONS?le():null},handleHotUpdate({file:e,server:t}){let{isPage:n,isComponent:r,isLayout:i,isCss:o}=R(e);(n||r||i||o)&&(n&&(F(t,RESOLVED_VIRTUAL_IDS.PAGE_ROUTES),F(t,RESOLVED_VIRTUAL_IDS.PAGE_LOADER),I(t)),i&&(a=null,h(),P(t,RESOLVED_VIRTUAL_IDS.LAYOUTS),P(t,RESOLVED_VIRTUAL_IDS.CLIENT_ENTRY)),setTimeout(()=>{t.ws.send({type:`full-reload`,path:`*`})},500)),xe(e)&&P(t,RESOLVED_VIRTUAL_IDS.CONFIG)}}}function P(e,t){let n=e.moduleGraph.getModuleById(t);n&&e.moduleGraph.invalidateModule(n)}function F(e,t){P(e,t);let n=e.environments;if(n)for(let e of Object.values(n)){let n=e.moduleGraph;if(n)try{let e=n.getModuleById(t);e&&n.invalidateModule(e)}catch{}}}async function I(e){let t=e.environments?.nitro;if(t)try{await t.devServer?.reloadRoutes?.()}catch{}}function L(e){F(e,RESOLVED_VIRTUAL_IDS.PAGE_ROUTES),F(e,RESOLVED_VIRTUAL_IDS.PAGE_LOADER),I(e),setTimeout(()=>{e.ws.send({type:`full-reload`,path:`*`})},500)}function R(e){let t=e.endsWith(`.css`);return{isPage:e.includes(`/pages/`)&&!t,isComponent:e.includes(`/components/`)&&/\.[tj]sx?$/.test(e),isLayout:(e.includes(`/layouts/`)||e.includes(`_layout`))&&/\.[tj]sx?$/.test(e),isCss:t}}function xe(e){return e.includes(`vite.config`)||e.includes(`avalon.config`)||e.includes(`nitro.config`)}function Se(e,t,n,r){e.watcher.on(`change`,e=>{e.includes(`_middleware`)&&(_(),r?.()),(e.includes(`/render/`)||e.includes(`/layout/`)||e.includes(`/islands/`))&&(B=null,V=null),(e.includes(`/layouts/`)||e.includes(`_layout`))&&globalThis.__avalonLayoutResolver?.clearCache?.()}),e.watcher.on(`add`,t=>{t.includes(`_middleware`)&&(_(),r?.()),isPageFile(t)&&L(e)}),e.watcher.on(`unlink`,t=>{t.includes(`_middleware`)&&(_(),r?.()),isPageFile(t)&&L(e)})}export function isPageFile(e){return R(e).isPage}async function Ce(e,t){try{let{getAllPageDirs:t}=await import(`./module-discovery.js`),{discoverPageRoutesFromMultipleDirs:n}=await import(`../nitro/route-discovery.js`),r=await n(await t(e.pagesDir,e.modules,process.cwd()),{developmentMode:e.isDev});return`export const pageRoutes = ${JSON.stringify(r,null,2)};\nexport default pageRoutes;\n`}catch{return`export const pageRoutes = [];
9
+ <\/script>`}function P(t){let n=s(o(a(import.meta.url).resolve(`@useavalon/avalon`)),t);if(t.endsWith(`.ts`)&&!e(n)){let t=n.replace(/\.ts$/,`.js`);if(e(t))return t}return n}function ge(t,n){let r=s(o(a(s(process.cwd(),`package.json`)).resolve(`@useavalon/${t}`)),n);if(n.endsWith(`.ts`)&&!e(r)){let t=r.replace(/\.ts$/,`.js`);if(e(t))return t}return r}export const VIRTUAL_MODULE_IDS={PAGE_ROUTES:`virtual:avalon/page-routes`,PAGE_LOADER:`virtual:avalon/page-loader`,ISLAND_MANIFEST:`virtual:avalon/island-manifest`,RUNTIME_CONFIG:`virtual:avalon/runtime-config`,CONFIG:`virtual:avalon/config`,LAYOUTS:`virtual:avalon/layouts`,ASSETS:`virtual:avalon/assets`,RENDERER:`virtual:avalon/renderer`,CLIENT_ENTRY:`virtual:avalon/client-entry`,DEV_CSS_HMR:`virtual:avalon/dev-css-hmr`,INTEGRATION_LOADER:`virtual:avalon/integration-loader`,ACTIONS:`virtual:avalon/actions`,SSR_DOM:O};export const RESOLVED_VIRTUAL_IDS={PAGE_ROUTES:`\0${VIRTUAL_MODULE_IDS.PAGE_ROUTES}`,PAGE_LOADER:`\0${VIRTUAL_MODULE_IDS.PAGE_LOADER}`,ISLAND_MANIFEST:`\0${VIRTUAL_MODULE_IDS.ISLAND_MANIFEST}`,RUNTIME_CONFIG:`\0${VIRTUAL_MODULE_IDS.RUNTIME_CONFIG}`,CONFIG:`\0${VIRTUAL_MODULE_IDS.CONFIG}`,LAYOUTS:`\0${VIRTUAL_MODULE_IDS.LAYOUTS}`,ASSETS:`\0${VIRTUAL_MODULE_IDS.ASSETS}`,RENDERER:`\0${VIRTUAL_MODULE_IDS.RENDERER}`,CLIENT_ENTRY:`\0${VIRTUAL_MODULE_IDS.CLIENT_ENTRY}`,DEV_CSS_HMR:`\0${VIRTUAL_MODULE_IDS.DEV_CSS_HMR}`,INTEGRATION_LOADER:`\0${VIRTUAL_MODULE_IDS.INTEGRATION_LOADER}`,ACTIONS:`\0${VIRTUAL_MODULE_IDS.ACTIONS}`,SSR_DOM:`\0${VIRTUAL_MODULE_IDS.SSR_DOM}`};function _e(e){return e===`react`?[]:[/^react/,/^react-dom/]}function ve(e){return e===`react`?[`import { createElement as h } from 'react';`,`import { renderToString as preactRenderToString } from 'react-dom/server';`]:[`import { h } from 'preact';`,`import preactRenderToString from 'preact-render-to-string';`]}function ye(e){return e===`react`?[`import { setShellRenderToString, setShellElementFactory } from '@useavalon/avalon/render/shell-engine';`,`import { renderToString as __reactRenderToString } from 'react-dom/server';`,`import { createElement as __reactCreateElement, Fragment as __reactFragment } from 'react';`,`setShellRenderToString((vnode) => __reactRenderToString(vnode));`,`setShellElementFactory(__reactCreateElement, __reactFragment);`]:[]}function be(e){return e===`react`?`@useavalon/react/client`:`@useavalon/preact/client`}function xe(e){let t=P(`src/core/integrations/registry.ts`),n=[`solid`,`vue`,`svelte`,`lit`].filter(t=>e.includes(t));return`${[...n.includes(`lit`)?[`import "${O}";`]:[],`import { registry } from "${t}";`,...n.map(e=>`import { ${e}Integration } from "@useavalon/${e}";`),`let registered = false;`,`export function ensureServerIslandIntegrations() {`,` if (registered) return;`,` registered = true;`,...n.map(e=>` if (${e}Integration) registry.register(${e}Integration);`),`}`].join(`
10
+ `)}\n`}function Se(e,t,n,r,i,a){let o={preset:e.preset,serverDir:t.serverDir??e.serverDir??`./server`,routeRules:e.routeRules,runtimeConfig:e.runtimeConfig,compatibilityDate:e.compatibilityDate,scanDirs:[`.`],noExternals:[`estree-walker`,/^@useavalon\//,/^estree-util/,/^preact/,..._e(r.core),/^vue/,/^@vue\//],handlers:[{route:`/_server-islands/**`,handler:i},{route:`/_actions/**`,handler:a}],virtual:{"virtual:server-island-manifest":()=>oe(n),"virtual:avalon-actions-manifest":()=>fe(n),"virtual:server-island-key":()=>{let e=process.env.AVALON_KEY??``;return`export const serverIslandKey = ${JSON.stringify(e)};\n`},"virtual:server-island-integrations":()=>xe(r.integrations),[O]:()=>k()},traceDeps:[...new Set([`undici`,...e.traceDeps??[]])]};return Ee(o,e,t),o}function Ce(e,t,n){if(n.renderer===!1){e.renderer=!1;return}t.renderer&&(e.renderer=t.renderer)}function we(){return process.argv.includes(`build`)||process.env.NODE_ENV===`production`}function Te(e,t){t.experimentalTasks&&we()&&(e.experimental={...e.experimental,tasks:!0},t.tasks&&Object.keys(t.tasks).length>0&&(e.tasks=t.tasks),t.scheduledTasks&&Object.keys(t.scheduledTasks).length>0&&(e.scheduledTasks=t.scheduledTasks))}function Ee(e,t,n){Ce(e,t,n),t.publicRuntimeConfig&&(e.publicRuntimeConfig=t.publicRuntimeConfig),t.publicAssets&&(e.publicAssets=t.publicAssets),t.compressPublicAssets&&(e.compressPublicAssets=t.compressPublicAssets),t.serverEntry&&(e.serverEntry=t.serverEntry),Te(e,t),t.prerender&&(e.prerender={routes:[],crawlLinks:!1})}export function createNitroIntegration(e,t={}){let n=b(t,e),r=c(Se(n,t,process.cwd(),e,P(`src/server-islands/route.ts`),P(`src/actions/route.ts`))),i=createNitroCoordinationPlugin({avalonConfig:e,nitroConfig:t,verbose:e.verbose}),a=createVirtualModulesPlugin({avalonConfig:e,nitroConfig:t,verbose:e.verbose}),o=S(e,t),s=x(e,{verbose:e.verbose,generatePreloadHints:!0}),l=ee(C(t.preset??`node_server`,e.isDev)),u=p(t.cron,e.verbose);return{nitroOptions:n,plugins:[re(),...Array.isArray(r)?r:[r],i,a,o,s,l,u]}}export function createNitroCoordinationPlugin(e){let{avalonConfig:t,verbose:n}=e;return{name:`avalon:nitro-coordination`,enforce:`pre`,config(e,{command:t}){if(t===`serve`)return{server:{watch:{ignored:[`**/.output/**`,`**/dist/**`,`**/.netlify/**`,`**/.vercel/**`,`**/.cloudflare/**`,`**/.wrangler/**`,`**/.firebase/**`,`**/.amplify-hosting/**`]},fs:{deny:[`.output`,`dist`,`.netlify`,`.vercel`,`.cloudflare`,`.wrangler`,`.firebase`,`.amplify-hosting`]}}}},configResolved(e){let t=e.command===`serve`,n=!!globalThis.__avalonConfig?.clientRouter;globalThis.__avalonHydrationMode=f(t,n),globalThis.__avalonIsDev=t;try{u(e.root||process.cwd())}catch{}},configureServer(e){globalThis.__viteDevServer=e;let i=e.config.root||process.cwd(),a=e=>{if(e.includes(`/actions/`))try{u(i)}catch{}};e.watcher.on(`add`,a),e.watcher.on(`unlink`,a);let o=e.config.root||process.cwd(),c=e.config.build?.outDir?s(o,e.config.build.outDir):s(o,`dist`);try{r(c,{recursive:!0,force:!0})}catch{}try{r(s(o,`.output`),{recursive:!0,force:!0})}catch{}let d=!1,f=new Promise(t=>{let n=()=>{(e.environments?.nitro)?.devServer?.entry||d?(d=!0,t()):setTimeout(n,50)};setTimeout(n,100),setTimeout(()=>{d=!0,t()},15e3)});e.middlewares.use(async(e,t,n)=>{if(d)return n();let r=e.url||`/`;if(r.startsWith(`/@`)||r.startsWith(`/__`)||/\/[^/]+\.[a-z0-9]+(\?|$)/i.test(r))return n();await f,n()});let p=null;async function m(){return p||=await v({baseDir:`${e.config.root||process.cwd()}/src`,devMode:!1}),p}function h(){p=null}je(e,t,n,h),m().catch(e=>{console.warn(`[middleware] Failed to discover middleware:`,e)});let g=e.environments?.ssr,_=!!g&&l(g);_&&ke(e,t.integrations,n).catch(e=>{console.error(`[prewarm] Core modules pre-warm failed:`,e)}),e.middlewares.use(async(n,r,i)=>{let a=n.url||`/`;if(!a.startsWith(`/_server-islands/`)||!_)return i();try{let{decrypt:i}=await e.ssrLoadModule(P(`src/server-islands/encryption.ts`)),{h:o,renderToString:s}=await U(e,t.core),c=new URL(a,`http://${n.headers.host||`localhost`}`).searchParams.get(`p`)||``;if(!c&&n.method===`POST`&&(c=await A(n,`Timed out reading server island request body`)),!c){r.statusCode=400,r.setHeader(`Content-Type`,`text/plain`),r.end(`Missing encrypted props`);return}let l=me(c,i);if(!l.ok){r.statusCode=400,r.setHeader(`Content-Type`,`text/plain`),r.end(`Bad Request: decryption failed`);return}let{props:u,srcPath:d,islandMeta:f}=l;if(!d){r.statusCode=404,r.setHeader(`Content-Type`,`text/plain`),r.end(`Component not found (no __src in payload)`);return}let p=(await e.ssrLoadModule(d)).default;if(typeof p!=`function`){r.statusCode=500,r.setHeader(`Content-Type`,`text/plain`),r.end(`Module "${d}" does not export a default component function`);return}let m=s(o(p,u));f&&(m+=he(a,f,d,u)),r.statusCode=200,r.setHeader(`Content-Type`,`text/html`),r.setHeader(`Cache-Control`,`private, no-store`),r.end(m)}catch(e){console.error(`[server-islands] Dev handler error:`,e),r.statusCode=500,r.setHeader(`Content-Type`,`text/plain`),r.end(`Server island render failed: ${e instanceof Error?e.message:String(e)}`)}}),e.middlewares.use(async(t,n,r)=>{let i=t.url||`/`;if(!i.startsWith(`/_actions/`)||!_)return r();try{let r=N(e.config.root||process.cwd()),[a,o,s]=await Promise.all([e.ssrLoadModule(P(`src/actions/endpoint.ts`)),e.ssrLoadModule(P(`src/actions/registry.ts`)),r?e.ssrLoadModule(r):Promise.resolve({server:{}})]),c=o.flattenActions(s.server),l=a.defineActionHandler({registry:c,isDev:!0}),u=new URL(i,`http://${t.headers.host||`localhost`}`),d=(t.method||`GET`).toUpperCase(),f;d===`POST`&&(f=await A(t,`Timed out reading action request body`));let p=await l({url:u,web:{request:new Request(u,{method:d,headers:t.headers,body:f})},context:{}});n.statusCode=p.status,p.headers.forEach((e,t)=>{n.setHeader(t,e)}),n.end(await p.text())}catch(e){console.error(`[actions] Dev handler error:`,e),n.statusCode=500,n.setHeader(`Content-Type`,`application/json`),n.end(JSON.stringify({error:{code:`INTERNAL_SERVER_ERROR`,message:e instanceof Error?e.message:String(e)}}))}}),e.middlewares.use(async(r,i,a)=>{if(!_)return a();let o=r.url||`/`;if(o.endsWith(`.html`)&&(o=o.slice(0,-5)||`/`),o===`/index`&&(o=`/`),o.startsWith(`/@`)||o.startsWith(`/__`)||o.startsWith(`/node_modules/`)||o.startsWith(`/src/client/`)||o.startsWith(`/packages/`)||o.includes(`.`)&&!o.endsWith(`/`)||o.startsWith(`/api/`))return a();try{if(await De(e,o,r,i,m,n)||await Ye(e,o,t,i))return;let a=await Xe(e,o,t);if(a){i.statusCode=200,i.setHeader(`Content-Type`,`text/html`),i.end(a);return}await Oe(e,o,i,t)}catch(e){console.error(`[SSR Error]`,e),i.statusCode=500,i.setHeader(`Content-Type`,`text/html`),i.end(E(e))}})},buildStart(){}}}async function De(e,t,n,r,i,a){let o=performance.now(),s=await i();if(s.length===0)return!1;let c={};for(let[e,t]of Object.entries(n.headers))typeof t==`string`?c[e]=t:Array.isArray(t)&&(c[e]=t.join(`, `));let l=`http://${n.headers.host||`localhost`}${t}`,u=await y({url:l,method:n.method||`GET`,path:t,node:{req:n,res:r},req:new Request(l,{method:n.method||`GET`,headers:c}),context:{}},s,{devMode:!1}),d=performance.now()-o;return d>100&&console.warn(`⚠️ Slow middleware: ${d.toFixed(0)}ms for ${t}`),u?(r.statusCode=u.status,u.headers.forEach((e,t)=>{r.setHeader(t,e)}),r.end(await u.text()),!0):!1}async function Oe(e,t,n,r){try{let{discoverErrorPages:i,getErrorPageModule:a,generateDefaultErrorPage:o}=await import(`../nitro/error-handler.js`),s=a(404,await i({isDev:r.isDev,pagesDir:r.pagesDir,loadPageModule:async t=>await e.ssrLoadModule(t)}));if(s?.default&&typeof s.default==`function`){let{renderToHtml:e}=await import(`../render/ssr.js`),r=s.default,i=await e({component:()=>r({statusCode:404,message:`Page not found: ${t}`,url:t})},{});n.statusCode=404,n.setHeader(`Content-Type`,`text/html`),n.end(i);return}let c=o(404,`Page not found: ${t}`,r.isDev);n.statusCode=404,n.setHeader(`Content-Type`,`text/html`),n.end(c)}catch{n.statusCode=404,n.setHeader(`Content-Type`,`text/html`),n.end(D(t))}}async function ke(e,t,n){let r=performance.now(),i=[{path:P(`src/render/ssr.ts`),assignTo:`ssr`},{path:P(`src/core/layout/enhanced-layout-resolver.ts`),assignTo:`layout`},{path:P(`src/middleware/index.ts`),assignTo:null},...t.map(e=>({path:ge(e,`server/renderer.ts`),assignTo:null}))],a=(await Promise.allSettled(i.map(async({path:t,assignTo:n})=>{let r=await e.ssrLoadModule(t);n===`ssr`&&(V=r),n===`layout`&&(H=r)}))).filter(e=>e.status===`fulfilled`).length,o=performance.now()-r;n&&a>0&&console.log(`🔥 SSR ready in ${o.toFixed(0)}ms (${a}/${i.length} core modules)`)}export function createVirtualModulesPlugin(e){let{avalonConfig:t,nitroConfig:n,verbose:r}=e,i=null;return{name:`avalon:nitro-virtual-modules`,enforce:`pre`,resolveId(e){return e===VIRTUAL_MODULE_IDS.PAGE_ROUTES?RESOLVED_VIRTUAL_IDS.PAGE_ROUTES:e===VIRTUAL_MODULE_IDS.PAGE_LOADER?RESOLVED_VIRTUAL_IDS.PAGE_LOADER:e===VIRTUAL_MODULE_IDS.ISLAND_MANIFEST?RESOLVED_VIRTUAL_IDS.ISLAND_MANIFEST:e===VIRTUAL_MODULE_IDS.RUNTIME_CONFIG?RESOLVED_VIRTUAL_IDS.RUNTIME_CONFIG:e===VIRTUAL_MODULE_IDS.CONFIG?RESOLVED_VIRTUAL_IDS.CONFIG:e===VIRTUAL_MODULE_IDS.LAYOUTS?RESOLVED_VIRTUAL_IDS.LAYOUTS:e===VIRTUAL_MODULE_IDS.ASSETS?RESOLVED_VIRTUAL_IDS.ASSETS:e===VIRTUAL_MODULE_IDS.RENDERER?RESOLVED_VIRTUAL_IDS.RENDERER:e===VIRTUAL_MODULE_IDS.CLIENT_ENTRY?RESOLVED_VIRTUAL_IDS.CLIENT_ENTRY:e===VIRTUAL_MODULE_IDS.DEV_CSS_HMR?RESOLVED_VIRTUAL_IDS.DEV_CSS_HMR:e===VIRTUAL_MODULE_IDS.INTEGRATION_LOADER?RESOLVED_VIRTUAL_IDS.INTEGRATION_LOADER:e===VIRTUAL_MODULE_IDS.ACTIONS?RESOLVED_VIRTUAL_IDS.ACTIONS:e===VIRTUAL_MODULE_IDS.SSR_DOM?RESOLVED_VIRTUAL_IDS.SSR_DOM:null},async load(e){return e===RESOLVED_VIRTUAL_IDS.PAGE_ROUTES?await Me(t,r):e===RESOLVED_VIRTUAL_IDS.PAGE_LOADER?await Ne(t,r):e===RESOLVED_VIRTUAL_IDS.ISLAND_MANIFEST?Pe():e===RESOLVED_VIRTUAL_IDS.RUNTIME_CONFIG?Fe(t,n):e===RESOLVED_VIRTUAL_IDS.CONFIG?generateConfigModule(t,n):e===RESOLVED_VIRTUAL_IDS.LAYOUTS?(i||=await Ie(t,n),i):e===RESOLVED_VIRTUAL_IDS.ASSETS?Le(n):e===RESOLVED_VIRTUAL_IDS.RENDERER?Re(t):e===RESOLVED_VIRTUAL_IDS.CLIENT_ENTRY?await Ve(t,n):e===RESOLVED_VIRTUAL_IDS.DEV_CSS_HMR?ie():e===RESOLVED_VIRTUAL_IDS.INTEGRATION_LOADER?generateIntegrationLoaderModule(t):e===RESOLVED_VIRTUAL_IDS.ACTIONS?pe():e===RESOLVED_VIRTUAL_IDS.SSR_DOM?k():null},handleHotUpdate({file:e,server:t}){let{isPage:n,isComponent:r,isLayout:a,isCss:o}=z(e);o&&(i=null),n&&(I(t,RESOLVED_VIRTUAL_IDS.PAGE_ROUTES),I(t,RESOLVED_VIRTUAL_IDS.PAGE_LOADER),L(t)),(n||r||a)&&(i=null,I(t,RESOLVED_VIRTUAL_IDS.LAYOUTS),a&&F(t,RESOLVED_VIRTUAL_IDS.CLIENT_ENTRY),setTimeout(()=>{t.ws.send({type:`full-reload`,path:`*`})},500)),Ae(e)&&F(t,RESOLVED_VIRTUAL_IDS.CONFIG)}}}function F(e,t){let n=e.moduleGraph.getModuleById(t);n&&e.moduleGraph.invalidateModule(n)}function I(e,t){F(e,t);let n=e.environments;if(n)for(let e of Object.values(n)){let n=e.moduleGraph;if(n)try{let e=n.getModuleById(t);e&&n.invalidateModule(e)}catch{}}}async function L(e){let t=e.environments?.nitro;if(t)try{t.devServer?.sendMessage?.({type:`full-reload`}),await t.devServer?.reloadRoutes?.()}catch{}}function R(e){I(e,RESOLVED_VIRTUAL_IDS.PAGE_ROUTES),I(e,RESOLVED_VIRTUAL_IDS.PAGE_LOADER),L(e),setTimeout(()=>{e.ws.send({type:`full-reload`,path:`*`})},500)}function z(e){let t=e.endsWith(`.css`);return{isPage:e.includes(`/pages/`)&&!t,isComponent:e.includes(`/components/`)&&/\.[tj]sx?$/.test(e),isLayout:(e.includes(`/layouts/`)||e.includes(`_layout`))&&/\.[tj]sx?$/.test(e),isCss:t}}function Ae(e){return e.includes(`vite.config`)||e.includes(`avalon.config`)||e.includes(`nitro.config`)}function je(e,t,n,r){e.watcher.on(`change`,e=>{e.includes(`_middleware`)&&(_(),r?.()),(e.includes(`/render/`)||e.includes(`/layout/`)||e.includes(`/islands/`))&&(V=null,H=null),(e.includes(`/layouts/`)||e.includes(`_layout`))&&globalThis.__avalonLayoutResolver?.clearCache?.()}),e.watcher.on(`add`,t=>{t.includes(`_middleware`)&&(_(),r?.()),isPageFile(t)&&R(e)}),e.watcher.on(`unlink`,t=>{t.includes(`_middleware`)&&(_(),r?.()),isPageFile(t)&&R(e)})}export function isPageFile(e){return z(e).isPage}async function Me(e,t){try{let{getAllPageDirs:t}=await import(`./module-discovery.js`),{discoverPageRoutesFromMultipleDirs:n}=await import(`../nitro/route-discovery.js`),r=await n(await t(e.pagesDir,e.modules,process.cwd()),{developmentMode:e.isDev});return`export const pageRoutes = ${JSON.stringify(r,null,2)};\nexport default pageRoutes;\n`}catch{return`export const pageRoutes = [];
11
11
  export default pageRoutes;
12
- `}}async function we(e,t){try{let{getAllPageDirs:t}=await import(`./module-discovery.js`),{discoverPageRoutesFromMultipleDirs:n}=await import(`../nitro/route-discovery.js`),{relative:r}=await import(`node:path`),i=process.cwd(),a=await n(await t(e.pagesDir,e.modules,i),{developmentMode:e.isDev}),o=[],s=[];for(let e=0;e<a.length;e++){let t=a[e],n=`page_${e}`,c=r(i,t.filePath).replaceAll(`\\`,`/`),l=c.startsWith(`/`)?c:`/${c}`;o.push(`import * as ${n} from '${l}';`),s.push(` { pattern: ${JSON.stringify(t.pattern)}, params: ${JSON.stringify(t.params)}, module: ${n} }`)}return[...o,``,`const routes = [`,s.join(`,
12
+ `}}async function Ne(e,t){try{let{getAllPageDirs:t}=await import(`./module-discovery.js`),{discoverPageRoutesFromMultipleDirs:n}=await import(`../nitro/route-discovery.js`),{relative:r}=await import(`node:path`),i=process.cwd(),a=await n(await t(e.pagesDir,e.modules,i),{developmentMode:e.isDev}),o=[],s=[];for(let e=0;e<a.length;e++){let t=a[e],n=`page_${e}`,c=r(i,t.filePath).replaceAll(`\\`,`/`),l=c.startsWith(`/`)?c:`/${c}`;o.push(`import * as ${n} from '${l}';`),s.push(` { pattern: ${JSON.stringify(t.pattern)}, params: ${JSON.stringify(t.params)}, module: ${n} }`)}return[...o,``,`const routes = [`,s.join(`,
13
13
  `),`];`,``,`/**`,` * Match a pathname against discovered routes and return the page module.`,` * Uses the same pattern matching as Avalon's route discovery.`,` */`,`/**`,` * Match a pathname against discovered routes, returning the matched`,` * page module AND the extracted dynamic route params (e.g. { id: "123" }).`,` */`,`export function loadPage(pathname) {`,` const cleanPath = pathname.split('?')[0];`,` for (const route of routes) {`,` const m = matchRoute(cleanPath, route.pattern);`,` if (m.matched) return { module: route.module, params: m.params };`,` }`,` return null;`,`}`,``,`/**`,` * Match one pattern and capture dynamic segments:`,` * /users/:id vs /users/123 -> { id: "123" }`,` * /blog/** vs /blog/a/b -> { slug: "a/b" }`,` */`,`function matchRoute(pathname, pattern) {`,String.raw` const normPath = pathname === '/' ? '/' : pathname.replace(/\/$/, '');`,String.raw` const normPattern = pattern === '/' ? '/' : pattern.replace(/\/$/, '');`,` if (normPath === normPattern) return { matched: true, params: {} };`,` const patternParts = normPattern.split('/');`,` const pathParts = normPath.split('/');`,` const params = {};`,` for (let i = 0; i < patternParts.length; i++) {`,` const seg = patternParts[i];`,` if (seg === '**') {`,` params.slug = pathParts.slice(i).join('/');`,` return { matched: true, params };`,` }`,` if (i >= pathParts.length) return { matched: false, params: {} };`,` if (seg.startsWith(':')) params[seg.slice(1)] = pathParts[i];`,` else if (seg !== pathParts[i]) return { matched: false, params: {} };`,` }`,` if (pathParts.length > patternParts.length) return { matched: false, params: {} };`,` return { matched: true, params };`,`}`,``,`export default { loadPage, routes };`,``].join(`
14
14
  `)}catch(e){return console.error(`[page-loader] Failed to generate page loader:`,e),`export function loadPage() { return null; }
15
15
  export default { loadPage, routes: [] };
16
- `}}function Te(){return`export const islandManifest = { islands: {}, clientEntry: "", css: [] };
16
+ `}}function Pe(){return`export const islandManifest = { islands: {}, clientEntry: "", css: [] };
17
17
  export default islandManifest;
18
- `}function Ee(e,t){let n={avalon:{streaming:t.streaming??!0,pagesDir:e.pagesDir,layoutsDir:e.layoutsDir,isDev:e.isDev},...t.runtimeConfig};return`export const runtimeConfig = ${JSON.stringify(n,null,2)};\nexport function useRuntimeConfig() { return runtimeConfig; }\nexport default runtimeConfig;\n`}export function generateConfigModule(e,t){let n=globalThis.__avalonConfig?.isDev??e.isDev,r={streaming:t.streaming??!0,pagesDir:e.pagesDir,layoutsDir:e.layoutsDir,isDev:n,...t.runtimeConfig};return`globalThis.__avalonHydrationMode = "${n?`entry-client`:`per-island`}";\nconst config = ${JSON.stringify(r,null,2)};\nexport function useAvalonConfig() { return config; }\nexport default config;\n`}async function De(e,t,n){let{getAllLayoutDirs:r}=await import(`./module-discovery.js`),{relative:i,resolve:a}=await import(`node:path`),{stat:o,readFile:c}=await import(`node:fs/promises`),l=process.cwd(),u=await r(e.layoutsDir,e.modules,l),d=[],f=0,p=a(l,e.layoutsDir);for(let{dir:t,prefix:n}of u){let r=s(t,`_layout.tsx`);try{if(!(await o(r)).isFile())continue}catch{continue}let a=i(l,r).replaceAll(`\\`,`/`),c=a.startsWith(`/`)?a:`/${a}`,u=t.startsWith(p),m=u&&!e.modules?`RootLayout`:`Layout_${f}`;d.push({prefix:n,importPath:c,varName:m,isShared:u,filePath:r}),f++}let m=d.filter(e=>e.isShared),h=d.filter(e=>!e.isShared),g=new Map;for(let e of h)try{let t=(await c(e.filePath,`utf8`)).match(/layoutConfig\s*=\s*{[\s\S]*?skipLayouts\s*:\s*\[([^\]]*)\]/)?.[1]??``,n=/['"`]_layout['"`]/.test(t);g.set(e.importPath,n)}catch{g.set(e.importPath,!1)}let _=d.map(e=>`import ${e.varName} from '${e.importPath}';`),v=h.toSorted((e,t)=>t.prefix.length-e.prefix.length).map(e=>{let t=e.prefix===`/`,n=g.get(e.importPath)??!1,r=t||n;return` { prefix: ${JSON.stringify(e.prefix)}, Layout: ${e.varName}, skipRoot: ${r} }`}),y=m.length>0?m[0].varName:`null`,b=JSON.stringify(n);return[`// Auto-generated by Avalon — do not edit`,...me(e.core),`import { getUniversalCSSForHead } from '@useavalon/avalon/islands/universal-css-collector';`,`import { getUniversalHeadForInjection, injectSolidHydrationScriptIfNeeded } from '@useavalon/avalon/islands/universal-head-collector';`,..._,``,`const RootLayoutComponent = ${y};`,`const _cssLinks = ${b};`,``,`const moduleLayouts = [`,v.join(`,
19
- `),`];`,``,`function getLayoutsForPath(pathname) {`,` for (const entry of moduleLayouts) {`,` if (entry.prefix === '/' ? pathname === '/' : pathname.startsWith(entry.prefix)) {`,` return entry;`,` }`,` }`,` return null;`,`}`,``,`function injectUniversalAssets(html) {`,` // In dev, inject <link> tags for all discovered CSS files.`,` // The ?direct suffix makes Vite return raw CSS (text/css) instead`,` // of a JS module wrapper, so <link rel="stylesheet"> works.`,` if (process.env.NODE_ENV !== 'production' && _cssLinks.length > 0) {`,` var links = _cssLinks.map(function(href) {`,` return '<link rel="stylesheet" href="' + href + '?direct">';`,String.raw` }).join('\n');`,` if (html.includes('</head>')) {`,String.raw` html = html.replace('</head>', links + '\n</head>');`,` }`,` }`,` const universalCSS = getUniversalCSSForHead(true);`,` if (universalCSS && html.includes('</head>')) {`,String.raw` html = html.replace('</head>', universalCSS + '\n</head>');`,` }`,` const universalHead = getUniversalHeadForInjection(true);`,` if (universalHead && html.includes('</head>')) {`,String.raw` html = html.replace('</head>', universalHead + '\n</head>');`,` }`,` html = injectSolidHydrationScriptIfNeeded(html);`,` return html;`,`}`,``,`export async function wrapWithLayouts(pageHtml, pageModule, context, injectAssets) {`,` const pathname = context.url.pathname;`,` const frontmatter = {`,` ...(pageModule.frontmatter || {}),`,` ...(pageModule.metadata || {}),`,` currentPath: pathname,`,` };`,` const pageLayoutConfig = pageModule.layoutConfig;`,` const skipAll = pageLayoutConfig?.skipLayouts?.includes('_layout');`,``,` const layoutEntry = getLayoutsForPath(pathname);`,` const routeInfo = { path: pathname, params: context.params, query: context.url.searchParams };`,` let html;`,``,` if (!layoutEntry || skipAll) {`,` if (RootLayoutComponent && !skipAll) {`,` const rootProps = {`,` children: h('avalon-page', { id: 'app', dangerouslySetInnerHTML: { __html: pageHtml } }),`,` frontmatter,`,` data: {},`,` route: routeInfo,`,` };`,` const rootResult = RootLayoutComponent(rootProps);`,` const resolvedRoot = rootResult instanceof Promise ? await rootResult : rootResult;`,String.raw` html = '<!DOCTYPE html>\n' + preactRenderToString(resolvedRoot);`,` } else {`,` // skipAll is true — page provides its own HTML shell or needs a minimal one`,` if (pageHtml.trimStart().startsWith('<html')) {`,String.raw` html = '<!DOCTYPE html>\n' + pageHtml;`,` } else {`,` const title = String(frontmatter.title || 'Avalon');`,` html = [`,` '<!DOCTYPE html>',`,` '<html lang="en">',`,` '<head>',`,` '<meta charset="utf-8">',`,` '<meta name="viewport" content="width=device-width, initial-scale=1">',`,` '<title>' + title + '</title>',`,` '</head>',`,` '<body>',`,` '<div id="app">' + pageHtml + '</div>',`,` '</body>',`,` '</html>',`,String.raw` ].join('\n');`,` }`,` }`,` } else {`,` const layoutProps = {`,` children: h('avalon-page', { dangerouslySetInnerHTML: { __html: pageHtml } }),`,` frontmatter,`,` data: {},`,` route: routeInfo,`,` };`,` const layoutResult = layoutEntry.Layout(layoutProps);`,` const resolvedLayout = layoutResult instanceof Promise ? await layoutResult : layoutResult;`,` let wrappedHtml = preactRenderToString(resolvedLayout);`,``,` // If the layout provides its own HTML shell (starts with <html),`,` // skip root wrapping regardless of skipRoot flag — the layout IS the document.`,` const layoutProvidesShell = wrappedHtml.trimStart().startsWith('<html');`,``,` if (!layoutProvidesShell && !layoutEntry.skipRoot && RootLayoutComponent) {`,` const rootProps = {`,` children: h('avalon-page', { dangerouslySetInnerHTML: { __html: wrappedHtml } }),`,` frontmatter,`,` data: {},`,` route: routeInfo,`,` };`,` const rootResult = RootLayoutComponent(rootProps);`,` const resolvedRoot = rootResult instanceof Promise ? await rootResult : rootResult;`,` wrappedHtml = preactRenderToString(resolvedRoot);`,` }`,``,String.raw` html = '<!DOCTYPE html>\n' + wrappedHtml;`,` }`,``,` if (injectAssets) {`,` html = injectAssets(html);`,` }`,` return injectUniversalAssets(html);`,`}`,``,`export default { wrapWithLayouts };`,``].join(`
20
- `)}function Oe(e){let t=e.clientEntry??`app/entry-client`;return[`// Auto-generated by Avalon — do not edit`,`// @ts-ignore — virtual import resolved by Nitro's Vite assets plugin at build time`,`import clientAssets from '${t.startsWith(`/`)?t:`/${t}`}?assets=client';`,``,`function buildAssetTags() {`,` const cssLinks = (clientAssets?.css ?? [])`,` .filter(attr => {`,` const href = attr.href || '';`,` // The SSR build produces ssr-index-*.css containing all global, reset,`,` // token, and layout CSS module styles. The client build may also emit`,` // entry-client-*.css (a subset) and index-*.css. To avoid duplicates,`,` // prefer ssr-index when it exists; otherwise fall back to the others.`,` var hasSsrIndex = (clientAssets?.css ?? []).some(function(a) { return (a.href || '').includes('ssr-index'); });`,` if (hasSsrIndex) return href.includes('ssr-index');`,` if (href.includes('entry-client') && href.endsWith('.css')) return true;`,String.raw` if (/\/index-[^/]+\.css$/.test(href)) return true;`,` return false;`,` })`,` .map(attr => '<link rel="stylesheet" href="' + attr.href + '">')`,String.raw` .join('\n');`,` const jsPreloads = (clientAssets?.js ?? [])`,` .map(attr => '<link rel="modulepreload" href="' + attr.href + '">')`,String.raw` .join('\n');`,` const entryScript = clientAssets?.entry`,` ? '<script type="module" src="' + clientAssets.entry + '"><\/script>'`,` : '';`,` return { cssLinks, jsPreloads, entryScript };`,`}`,``,`export function injectAssets(html) {`,` const { cssLinks, jsPreloads, entryScript } = buildAssetTags();`,` if (html.includes('</head>')) {`,String.raw` html = html.replace('</head>', cssLinks + '\n' + jsPreloads + '\n</head>');`,` }`,` if (html.includes('</body>')) {`,String.raw` html = html.replace('</body>', entryScript + '\n</body>');`,` }`,` return html;`,`}`,``,`export { clientAssets };`,`export default { injectAssets, clientAssets };`,``].join(`
21
- `)}function ke(e){let t=Array.isArray(e.integrations)?e.integrations:[],n=[],r=[];for(let e of t){let t=`${e}Integration`;n.push(`import { ${t} } from '@useavalon/${e}';`),r.push(`registry.register(${t});`)}let i=he(e.core);return[`// Auto-generated by Avalon — do not edit`,`import { createNitroRenderer } from '@useavalon/avalon/nitro/renderer';`,`import { registerBuiltinDirectives } from '@useavalon/avalon';`,`import { registry } from '@useavalon/avalon/islands/integration-registry';`,`import avalonConfig from 'virtual:avalon/config';`,`import { loadPage } from 'virtual:avalon/page-loader';`,`import { wrapWithLayouts } from 'virtual:avalon/layouts';`,`import { injectAssets } from 'virtual:avalon/assets';`,...n,``,...i,``,`// Pre-register framework integrations for SSR`,...r,``,`// Register built-in custom hydration directives (on:delay, on:scroll, etc.)`,`registerBuiltinDirectives();`,``,`// Set hydration mode flag — intentionally duplicated from virtual:avalon/config`,`// for module-load-order resilience (config import may be tree-shaken or deferred).`,`globalThis.__avalonHydrationMode = avalonConfig.isDev ? "entry-client" : "per-island";`,``,`export default createNitroRenderer({`,` avalonConfig,`,` isDev: avalonConfig.isDev,`,` resolvePageRoute: async (pathname) => {`,` const match = loadPage(pathname);`,` if (!match || !('default' in match.module)) return null;`,` return { filePath: '[virtual:' + pathname + ']', pattern: pathname, params: match.params };`,` },`,` loadPageModule: async (filePath) => {`,String.raw` const m = filePath.match(/^\[virtual:(.+)\]$/);`,` const pathname = m ? m[1] : filePath;`,` const match = loadPage(pathname);`,` if (match) return match.module;`,` return { default: () => null, metadata: { title: 'Avalon' } };`,` },`,` wrapWithLayouts: (pageHtml, pageModule, context) =>`,` wrapWithLayouts(pageHtml, pageModule, context, injectAssets),`,`});`,``].join(`
22
- `)}async function Ae(e,t){let{readdir:n}=await import(`node:fs/promises`),{relative:r,join:i}=await import(`node:path`),a=[];for(let{dir:o}of e){let e;try{e=await n(o,{withFileTypes:!0})}catch{continue}for(let n of e){if(!n.isFile()||!n.name.endsWith(`.css`))continue;let e=r(t,i(o,n.name)).replaceAll(`\\`,`/`);a.push(e.startsWith(`/`)?e:`/${e}`)}}return a}function je(e){if(e.length===0)return[];let t=[`// Layout CSS (auto-discovered)`],n=0;for(let r of e)r.includes(`.module.`)?(t.push(`import _lcss${n} from '${r}';`),n++):t.push(`import '${r}';`);return t}async function Me(e,t){let{getAllLayoutDirs:n}=await import(`./module-discovery.js`),r=process.cwd(),i=await Ae(await n(e.layoutsDir,e.modules,r),r),a=globalThis.__avalonConfig?.isDev??e.isDev?`@useavalon/avalon/client/main`:`@useavalon/avalon/client/main-slim`,o=[`// Auto-generated by Avalon — do not edit`,`// Island hydration runtime`];(globalThis.__avalonHydrationMode??`entry-client`)===`entry-client`?o.push(`import '${a}';`):o.push(`// Per-island hydration mode — no shared runtime needed`),o.push(``);let s=t.globalCSS??[];for(let e of s){let t=e.startsWith(`/`)?e:`/${e}`;o.push(`// Global CSS`,`import '${t}';`)}return s.length>0&&o.push(``),o.push(...je(i),``),o.join(`
23
- `)}function Ne(){return[`// --- Inlined Solid adapter (production) ---`,`// Eliminates a separate chunk + network request for the Solid client adapter.`,`// Only imports hydrate/createComponent — no render() fallback (saves ~1-2 KiB).`,`function _ensureHydrationContext() {`,` if (!globalThis._$HY) {`,` globalThis._$HY = { events: [], completed: new WeakSet(), r: {}, fe() {} };`,` }`,`}`,``,`async function _solidHydrate(container, Component, props) {`,` if (!container) throw new Error("Container element is required for hydration");`,` if (!Component || typeof Component !== "function") {`,` throw new Error("Invalid Solid component: expected function, got " + typeof Component);`,` }`,` var el = container;`,` var renderId = el.dataset.solidRenderId || el.dataset.renderId;`,` var { hydrate: solidHydrate, createComponent } = await import("solid-js/web");`,` _ensureHydrationContext();`,` solidHydrate(function() { return createComponent(Component, props || {}); }, el, { renderId: renderId || "" });`,`}`,``,`var _solidModule = { hydrate: _solidHydrate };`,``]}function Pe(e,t,n){let r=[];for(let i of e){let e=t[i];e&&(i===`solid`&&!n?r.push(` case "solid":`,` return _solidModule;`):i===`react`?r.push(` case "react":`):r.push(` case "${i}":`,` return import("${e}");`))}return e.includes(`react`)&&!e.includes(`preact`)&&r.push(` return import("${t.react}");`),r}function Fe(e,t){let n=[];for(let r of e){let e=t[r];e&&n.push(` case "${r}":`,` return import("${e}").then(m => m.${r}Adapter);`)}return n}export function generateIntegrationLoaderModule(e){let t=(e.integrations??[]).map(e=>typeof e==`string`?e:e.name),n={preact:`@useavalon/preact/client`,react:ge(e.core),vue:`@useavalon/vue/client`,svelte:`@useavalon/svelte/client`,solid:`@useavalon/solid/client`,lit:`@useavalon/lit/client`,qwik:`@useavalon/qwik/client`},r={preact:`@useavalon/preact/client/hmr`,react:`@useavalon/react/client/hmr`,vue:`@useavalon/vue/client/hmr`,svelte:`@useavalon/svelte/client/hmr`,solid:`@useavalon/solid/client/hmr`,lit:`@useavalon/lit/client/hmr`,qwik:`@useavalon/qwik/client/hmr`},i=t.includes(`lit`),a=t.includes(`solid`),o=(globalThis.__avalonConfig?.isDev??e.isDev)===!0,s=[`// Auto-generated by Avalon — only includes configured integrations`,``];return a&&!o&&s.push(...Ne()),s.push(`// --- loadIntegrationModule ---`,`export async function loadIntegrationModule(framework) {`,` switch (framework) {`,...Pe(t,n,o),` default:`," throw new Error(`Unknown or unconfigured framework: ${framework}`);",` }`,`}`,``,`// --- Lit hydration pre-load (only if Lit is configured) ---`),i?s.push(`export async function preLitHydration() {`,` await import("@useavalon/lit/client");`,`}`):s.push(`export async function preLitHydration() {}`),s.push(``,`// --- HMR adapter loader ---`,`export async function loadHMRAdapter(framework) {`,` switch (framework) {`,...Fe(t,r),` default: return null;`,` }`,`}`),s.join(`
24
- `)}export function getViteDevServer(){return globalThis.__viteDevServer}export function getAvalonConfig(){return globalThis.__avalonConfig}export function isDevelopmentMode(){return globalThis.__avalonConfig?.isDev??!0}const z=`<!--AVALON_STREAM_BOUNDARY-->`;let B=null,V=null;async function H(e,t){if(t===`react`){let e=await import(`react`),t=await import(`react-dom/server`),n=e.default??e,r=t.default??t;return{h:e.createElement??n.createElement,renderToString:t.renderToString??r.renderToString}}let n=await e.ssrLoadModule(`preact`),r=await e.ssrLoadModule(`preact-render-to-string`);return{h:n.h,renderToString:r.render??r.default}}function U(e){return e.split(`/`).pop()?.replace(/\.[^.]+$/,``)||``}async function W(e,t,n){let r=[];for(let n of t){let t=await e.ssrLoadModule(n);r.push({file:n,module:t})}for(let r of t){let t=await T(e,r);n.push(...t)}return r}async function G(e,t,n,r){let i=[],a=[];for(let o of e){let e=o.module.default;if(!(!e||typeof e!=`function`))try{let s=e({...t,children:n(`div`,null,`test`)}),c=r(s instanceof Promise?await s:s);c.trim().startsWith(`<html`)||c.includes(`<!DOCTYPE`)?i.push(o):a.push(o)}catch{a.push(o)}}return{shellLayouts:i,wrapperLayouts:a}}async function Ie(e,t,n,r){try{let i=e({...t,children:n(`div`,{dangerouslySetInnerHTML:{__html:z}})});return r(i instanceof Promise?await i:i)}catch{return null}}function Le(e,t){let n=e;if(t.length>0){let e=`<style data-avalon-ssr-css>${t.join(`
25
- `)}</style>`;n.includes(`</head>`)?n=n.replace(`</head>`,`${e}\n</head>`):n+=e}n.trim().toLowerCase().startsWith(`<!doctype`)||(n=`<!DOCTYPE html>\n${n}`);let r=m(!0);r&&n.includes(`</head>`)&&(n=n.replace(`</head>`,`${r}\n</head>`));let i=h(!0);return i&&n.includes(`</head>`)&&(n=n.replace(`</head>`,`${i}\n</head>`)),g(n)}async function K(e,t,n){try{let n=typeof e==`function`?e():e;return t(n instanceof Promise?await n:n)}catch(e){return console.error(`${n} Error rendering page component:`,e),`<div>Error rendering page</div>`}}async function q(e,t,n,r,i,a){let o=e;for(let{module:e}of t){let t=e.default;if(!(!t||typeof t!=`function`))try{let e=t({...n,children:r(`div`,{dangerouslySetInnerHTML:{__html:o}})});o=i(e instanceof Promise?await e:e)}catch(e){console.error(`${a} Error rendering wrapper layout:`,e)}}return o}async function Re(e,t,n,r,i){if(t.length===0)return e;let{module:a}=t.at(-1),o=a.default;if(!o||typeof o!=`function`)return e;try{let t=o({...n,children:r(`div`,{dangerouslySetInnerHTML:{__html:e}})});return i(t instanceof Promise?await t:t)}catch(t){return console.error(`[SSR] Error rendering shell layout:`,t),e}}function ze(e){if(e.includes(`/src/client/main.js`)||e.includes(`/@vite/client`))return e;let t=e.lastIndexOf(`</body>`);return t===-1?e:e.slice(0,t)+`
18
+ `}function Fe(e,t){let n={avalon:{streaming:t.streaming??!0,pagesDir:e.pagesDir,layoutsDir:e.layoutsDir,isDev:e.isDev},...t.runtimeConfig};return`export const runtimeConfig = ${JSON.stringify(n,null,2)};\nexport function useRuntimeConfig() { return runtimeConfig; }\nexport default runtimeConfig;\n`}export function generateConfigModule(e,t){let n=globalThis.__avalonConfig?.isDev??e.isDev,r=!!(globalThis.__avalonConfig?.clientRouter??e.clientRouter),i=f(n,r),a={streaming:t.streaming??!0,pagesDir:e.pagesDir,layoutsDir:e.layoutsDir,isDev:n,clientRouter:r,...t.runtimeConfig};return`globalThis.__avalonHydrationMode = "${i}";\nglobalThis.__avalonIsDev = ${n};\nconst config = ${JSON.stringify(a,null,2)};\nexport function useAvalonConfig() { return config; }\nexport default config;\n`}async function Ie(e,t){let{getAllLayoutDirs:n}=await import(`./module-discovery.js`),{relative:r,resolve:i}=await import(`node:path`),{stat:a,readFile:o}=await import(`node:fs/promises`),c=process.cwd(),l=await n(e.layoutsDir,e.modules,c),u=[],d=0,f=i(c,e.layoutsDir);for(let{dir:t,prefix:n}of l){let i=s(t,`_layout.tsx`);try{if(!(await a(i)).isFile())continue}catch{continue}let o=r(c,i).replaceAll(`\\`,`/`),l=o.startsWith(`/`)?o:`/${o}`,p=t.startsWith(f),m=p&&!e.modules?`RootLayout`:`Layout_${d}`;u.push({prefix:n,importPath:l,varName:m,isShared:p,filePath:i}),d++}let p=u.filter(e=>e.isShared),m=u.filter(e=>!e.isShared),h=new Map;for(let e of m)try{let t=(await o(e.filePath,`utf8`)).match(/layoutConfig\s*=\s*{[\s\S]*?skipLayouts\s*:\s*\[([^\]]*)\]/)?.[1]??``,n=/['"`]_layout['"`]/.test(t);h.set(e.importPath,n)}catch{h.set(e.importPath,!1)}let g=u.map(e=>`import ${e.varName} from '${e.importPath}';`),_=m.toSorted((e,t)=>t.prefix.length-e.prefix.length).map(e=>{let t=e.prefix===`/`,n=h.get(e.importPath)??!1,r=t||n;return` { prefix: ${JSON.stringify(e.prefix)}, Layout: ${e.varName}, skipRoot: ${r} }`}),v=p.length>0?p[0].varName:`null`,y=`{"routes":[],"fallbackHrefs":[],"globalHrefs":[]}`;if(e.isDev){let{getAllPageDirs:n}=await import(`./module-discovery.js`),{discoverPageRoutesFromMultipleDirs:r}=await import(`../nitro/route-discovery.js`),i=await r(await n(e.pagesDir,e.modules,c),{developmentMode:e.isDev}),a=ne({cwd:c,globalCSS:t.globalCSS??[],routes:i.map(e=>({pattern:e.pattern,filePath:e.filePath})),layouts:u.map(e=>({prefix:e.prefix,filePath:e.filePath,isRoot:e.isShared,skipRoot:h.get(e.importPath)??!1}))});y=JSON.stringify(a)}return[`// Auto-generated by Avalon — do not edit`,...ve(e.core),`import { getUniversalCSSForHead } from '@useavalon/avalon/islands/universal-css-collector';`,`import { getUniversalHeadForInjection, injectSolidHydrationScriptIfNeeded } from '@useavalon/avalon/islands/universal-head-collector';`,`import { appendDevCssLinks, layoutPrefixMatches, selectDevCssHrefs } from '@useavalon/avalon/render/dev-css-select';`,...g,``,`const RootLayoutComponent = ${v};`,`const _cssTable = ${y};`,``,`const moduleLayouts = [`,_.join(`,
19
+ `),`];`,``,`function getLayoutsForPath(pathname) {`,` return moduleLayouts.find((entry) => layoutPrefixMatches(pathname, entry.prefix)) ?? null;`,`}`,``,`function injectUniversalAssets(html, pathname, skipLayouts) {`,` if (process.env.NODE_ENV !== 'production') {`,` var hrefs = selectDevCssHrefs(_cssTable, pathname, skipLayouts);`,` html = appendDevCssLinks(html, hrefs);`,` }`,` const universalCSS = getUniversalCSSForHead(true);`,` if (universalCSS && html.includes('</head>')) {`,String.raw` html = html.replace('</head>', universalCSS + '\n</head>');`,` }`,` const universalHead = getUniversalHeadForInjection(true);`,` if (universalHead && html.includes('</head>')) {`,String.raw` html = html.replace('</head>', universalHead + '\n</head>');`,` }`,` html = injectSolidHydrationScriptIfNeeded(html);`,` return html;`,`}`,``,`export async function wrapWithLayouts(pageHtml, pageModule, context, injectAssets) {`,` const pathname = context.url.pathname;`,` const frontmatter = {`,` ...(pageModule.frontmatter || {}),`,` ...(pageModule.metadata || {}),`,` currentPath: pathname,`,` };`,` const pageLayoutConfig = pageModule.layoutConfig;`,` const skipAll = pageLayoutConfig?.skipLayouts?.includes('_layout');`,``,` const layoutEntry = getLayoutsForPath(pathname);`,` const routeInfo = { path: pathname, params: context.params, query: context.url.searchParams };`,` let html;`,``,` if (!layoutEntry || skipAll) {`,` if (RootLayoutComponent && !skipAll) {`,` const rootProps = {`,` children: h('avalon-page', { id: 'app', dangerouslySetInnerHTML: { __html: pageHtml } }),`,` frontmatter,`,` data: {},`,` route: routeInfo,`,` };`,` const rootResult = RootLayoutComponent(rootProps);`,` const resolvedRoot = rootResult instanceof Promise ? await rootResult : rootResult;`,String.raw` html = '<!DOCTYPE html>\n' + preactRenderToString(resolvedRoot);`,` } else {`,` // skipAll is true — page provides its own HTML shell or needs a minimal one`,` if (pageHtml.trimStart().startsWith('<html')) {`,String.raw` html = '<!DOCTYPE html>\n' + pageHtml;`,` } else {`,` const title = String(frontmatter.title || 'Avalon');`,` html = [`,` '<!DOCTYPE html>',`,` '<html lang="en">',`,` '<head>',`,` '<meta charset="utf-8">',`,` '<meta name="viewport" content="width=device-width, initial-scale=1">',`,` '<title>' + title + '</title>',`,` '</head>',`,` '<body>',`,` '<div id="app">' + pageHtml + '</div>',`,` '</body>',`,` '</html>',`,String.raw` ].join('\n');`,` }`,` }`,` } else {`,` const layoutProps = {`,` children: h('avalon-page', { dangerouslySetInnerHTML: { __html: pageHtml } }),`,` frontmatter,`,` data: {},`,` route: routeInfo,`,` };`,` const layoutResult = layoutEntry.Layout(layoutProps);`,` const resolvedLayout = layoutResult instanceof Promise ? await layoutResult : layoutResult;`,` let wrappedHtml = preactRenderToString(resolvedLayout);`,``,` // If the layout provides its own HTML shell (starts with <html),`,` // skip root wrapping regardless of skipRoot flag — the layout IS the document.`,` const layoutProvidesShell = wrappedHtml.trimStart().startsWith('<html');`,``,` if (!layoutProvidesShell && !layoutEntry.skipRoot && RootLayoutComponent) {`,` const rootProps = {`,` children: h('avalon-page', { dangerouslySetInnerHTML: { __html: wrappedHtml } }),`,` frontmatter,`,` data: {},`,` route: routeInfo,`,` };`,` const rootResult = RootLayoutComponent(rootProps);`,` const resolvedRoot = rootResult instanceof Promise ? await rootResult : rootResult;`,` wrappedHtml = preactRenderToString(resolvedRoot);`,` }`,``,String.raw` html = '<!DOCTYPE html>\n' + wrappedHtml;`,` }`,``,` if (injectAssets) {`,` html = injectAssets(html);`,` }`,` return injectUniversalAssets(html, pathname, skipAll);`,`}`,``,`export default { wrapWithLayouts };`,``].join(`
20
+ `)}function Le(e){let t=e.clientEntry??`app/entry-client`;return[`// Auto-generated by Avalon — do not edit`,`// @ts-ignore — virtual import resolved by Nitro's Vite assets plugin at build time`,`import clientAssets from '${t.startsWith(`/`)?t:`/${t}`}?assets=client';`,``,`function buildAssetTags() {`,` const cssLinks = (clientAssets?.css ?? [])`,` .filter(attr => {`,` const href = attr.href || '';`,` // The SSR build produces ssr-index-*.css containing all global, reset,`,` // token, and layout CSS module styles. The client build may also emit`,` // entry-client-*.css (a subset) and index-*.css. To avoid duplicates,`,` // prefer ssr-index when it exists; otherwise fall back to the others.`,` var hasSsrIndex = (clientAssets?.css ?? []).some(function(a) { return (a.href || '').includes('ssr-index'); });`,` if (hasSsrIndex) return href.includes('ssr-index');`,` if (href.includes('entry-client') && href.endsWith('.css')) return true;`,String.raw` if (/\/index-[^/]+\.css$/.test(href)) return true;`,` return false;`,` })`,` .map(attr => '<link rel="stylesheet" href="' + attr.href + '">')`,String.raw` .join('\n');`,` const jsPreloads = (clientAssets?.js ?? [])`,` .map(attr => '<link rel="modulepreload" href="' + attr.href + '">')`,String.raw` .join('\n');`,` const entryScript = clientAssets?.entry`,` ? '<script type="module" src="' + clientAssets.entry + '"><\/script>'`,` : '';`,` return { cssLinks, jsPreloads, entryScript };`,`}`,``,`export function injectAssets(html) {`,` const { cssLinks, jsPreloads, entryScript } = buildAssetTags();`,` if (html.includes('</head>')) {`,String.raw` html = html.replace('</head>', cssLinks + '\n' + jsPreloads + '\n</head>');`,` }`,` if (html.includes('</body>')) {`,String.raw` html = html.replace('</body>', entryScript + '\n</body>');`,` }`,` return html;`,`}`,``,`export { clientAssets };`,`export default { injectAssets, clientAssets };`,``].join(`
21
+ `)}function Re(e){let t=Array.isArray(e.integrations)?e.integrations:[],n=[],r=[];for(let e of t){let t=`${e}Integration`;n.push(`import { ${t} } from '@useavalon/${e}';`),r.push(`registry.register(${t});`)}let i=ye(e.core);return[`// Auto-generated by Avalon — do not edit`,...t.includes(`lit`)?[`import "${O}";`]:[],`import { createNitroRenderer } from '@useavalon/avalon/nitro/renderer';`,`import { registerBuiltinDirectives } from '@useavalon/avalon';`,`import { registry } from '@useavalon/avalon/islands/integration-registry';`,`import avalonConfig from 'virtual:avalon/config';`,`import { loadPage } from 'virtual:avalon/page-loader';`,`import { wrapWithLayouts } from 'virtual:avalon/layouts';`,`import { injectAssets } from 'virtual:avalon/assets';`,...n,``,...i,``,`// Pre-register framework integrations for SSR`,...r,``,`// Register built-in custom hydration directives (on:delay, on:scroll, etc.)`,`registerBuiltinDirectives();`,``,`// Set hydration mode flag — intentionally duplicated from virtual:avalon/config`,`// for module-load-order resilience (config import may be tree-shaken or deferred).`,`globalThis.__avalonHydrationMode = (avalonConfig.isDev || avalonConfig.clientRouter) ? "entry-client" : "per-island";`,`globalThis.__avalonIsDev = avalonConfig.isDev;`,``,`export default createNitroRenderer({`,` avalonConfig,`,` isDev: avalonConfig.isDev,`,` resolvePageRoute: async (pathname) => {`,` const match = loadPage(pathname);`,` if (!match || !('default' in match.module)) return null;`,` return { filePath: '[virtual:' + pathname + ']', pattern: pathname, params: match.params };`,` },`,` loadPageModule: async (filePath) => {`,String.raw` const m = filePath.match(/^\[virtual:(.+)\]$/);`,` const pathname = m ? m[1] : filePath;`,` const match = loadPage(pathname);`,` if (match) return match.module;`,` return { default: () => null, metadata: { title: 'Avalon' } };`,` },`,` wrapWithLayouts: (pageHtml, pageModule, context) =>`,` wrapWithLayouts(pageHtml, pageModule, context, injectAssets),`,`});`,``].join(`
22
+ `)}async function ze(e,t){let{readdir:n}=await import(`node:fs/promises`),{relative:r,join:i}=await import(`node:path`),a=[];for(let{dir:o}of e){let e;try{e=await n(o,{withFileTypes:!0})}catch{continue}for(let n of e){if(!n.isFile()||!n.name.endsWith(`.css`))continue;let e=r(t,i(o,n.name)).replaceAll(`\\`,`/`);a.push(e.startsWith(`/`)?e:`/${e}`)}}return a}function Be(e){if(e.length===0)return[];let t=[`// Layout CSS (auto-discovered)`],n=0;for(let r of e)r.includes(`.module.`)?(t.push(`import _lcss${n} from '${r}';`),n++):t.push(`import '${r}';`);return t}async function Ve(e,t){let{getAllLayoutDirs:n}=await import(`./module-discovery.js`),r=process.cwd(),i=await ze(await n(e.layoutsDir,e.modules,r),r),a=globalThis.__avalonConfig?.isDev??e.isDev,o=[`// Auto-generated by Avalon — do not edit`,`// Island hydration runtime`,...d(a,!!(globalThis.__avalonConfig?.clientRouter??e.clientRouter))];a&&o.push(`import '${VIRTUAL_MODULE_IDS.DEV_CSS_HMR}';`),o.push(``);let s=t.globalCSS??[];for(let e of s){let t=e.startsWith(`/`)?e:`/${e}`;o.push(`// Global CSS`,`import '${t}';`)}return s.length>0&&o.push(``),o.push(...Be(i),``),o.join(`
23
+ `)}function He(){return[`// --- Inlined Solid adapter (production) ---`,`// Eliminates a separate chunk + network request for the Solid client adapter.`,`function _ensureHydrationContext() {`,` if (!globalThis._$HY) {`,` globalThis._$HY = { events: [], completed: new WeakSet(), r: {}, fe() {} };`,` }`,`}`,``,`async function _solidHydrate(container, Component, props) {`,` if (!container) throw new Error("Container element is required for hydration");`,` if (!Component || typeof Component !== "function") {`,` throw new Error("Invalid Solid component: expected function, got " + typeof Component);`,` }`,` var el = container;`,` var renderId = el.dataset.solidRenderId || el.dataset.renderId;`,` var { hydrate: solidHydrate, createComponent } = await import("solid-js/web");`,` _ensureHydrationContext();`,` var dispose = solidHydrate(function() { return createComponent(Component, props || {}); }, el, { renderId: renderId || "" });`,` if (typeof dispose === "function") _solidDisposers.set(container, dispose);`,`}`,``,`async function _solidMount(container, Component, props) {`,` if (!container) throw new Error("Container element is required for mount");`,` if (!Component || typeof Component !== "function") {`,` throw new Error("Invalid Solid component: expected function, got " + typeof Component);`,` }`,` var { render: solidRender, createComponent } = await import("solid-js/web");`,` var dispose = solidRender(function() { return createComponent(Component, props || {}); }, container);`,` if (typeof dispose === "function") _solidDisposers.set(container, dispose);`,`}`,``,`function _solidUnmount(container) {`,` var dispose = _solidDisposers.get(container);`,` if (dispose) { dispose(); _solidDisposers.delete(container); }`,`}`,``,`var _solidDisposers = new WeakMap();`,`var _solidModule = { hydrate: _solidHydrate, mount: _solidMount, unmount: _solidUnmount };`,``]}function Ue(e,t,n){let r=[];for(let i of e){let e=t[i];e&&(i===`solid`&&!n?r.push(` case "solid":`,` return _solidModule;`):i===`react`?r.push(` case "react":`):r.push(` case "${i}":`,` return import("${e}");`))}return e.includes(`react`)&&!e.includes(`preact`)&&r.push(` return import("${t.react}");`),r}function We(e,t){let n=[];for(let r of e){let e=t[r];e&&n.push(` case "${r}":`,` return import("${e}").then(m => m.${r}Adapter);`)}return n}export function generateIntegrationLoaderModule(e){let t=(e.integrations??[]).map(e=>typeof e==`string`?e:e.name),n={preact:`@useavalon/preact/client`,react:be(e.core),vue:`@useavalon/vue/client`,svelte:`@useavalon/svelte/client`,solid:`@useavalon/solid/client`,lit:`@useavalon/lit/client`,qwik:`@useavalon/qwik/client`},r={preact:`@useavalon/preact/client/hmr`,react:`@useavalon/react/client/hmr`,vue:`@useavalon/vue/client/hmr`,svelte:`@useavalon/svelte/client/hmr`,solid:`@useavalon/solid/client/hmr`,lit:`@useavalon/lit/client/hmr`,qwik:`@useavalon/qwik/client/hmr`},i=t.includes(`lit`),a=t.includes(`solid`),o=(globalThis.__avalonConfig?.isDev??e.isDev)===!0,s=[`// Auto-generated by Avalon — only includes configured integrations`,``];return a&&!o&&s.push(...He()),s.push(`// --- loadIntegrationModule ---`,`export async function loadIntegrationModule(framework) {`,` switch (framework) {`,...Ue(t,n,o),` default:`," throw new Error(`Unknown or unconfigured framework: ${framework}`);",` }`,`}`,``,`// --- Lit hydration pre-load (only if Lit is configured) ---`),i?s.push(`export async function preLitHydration() {`,` await import("@useavalon/lit/client");`,`}`):s.push(`export async function preLitHydration() {}`),s.push(``,`// --- HMR adapter loader ---`,`export async function loadHMRAdapter(framework) {`,` switch (framework) {`,...We(t,r),` default: return null;`,` }`,`}`),s.join(`
24
+ `)}export function getViteDevServer(){return globalThis.__viteDevServer}export function getAvalonConfig(){return globalThis.__avalonConfig}export function isDevelopmentMode(){return globalThis.__avalonConfig?.isDev??!0}const B=`<!--AVALON_STREAM_BOUNDARY-->`;let V=null,H=null;async function U(e,t){if(t===`react`){let e=await import(`react`),t=await import(`react-dom/server`),n=e.default??e,r=t.default??t;return{h:e.createElement??n.createElement,renderToString:t.renderToString??r.renderToString}}let n=await e.ssrLoadModule(`preact`),r=await e.ssrLoadModule(`preact-render-to-string`);return{h:n.h,renderToString:r.render??r.default}}function W(e){return e.split(`/`).pop()?.replace(/\.[^.]+$/,``)||``}async function G(e,t,n){let r=[];for(let n of t){let t=await e.ssrLoadModule(n);r.push({file:n,module:t})}for(let r of t){let t=await w(e,r);n.push(...t)}return r}async function K(e,t,n,r){let i=[],a=[];for(let o of e){let e=o.module.default;if(!(!e||typeof e!=`function`))try{let s=e({...t,children:n(`div`,null,`test`)}),c=r(s instanceof Promise?await s:s);c.trim().startsWith(`<html`)||c.includes(`<!DOCTYPE`)?i.push(o):a.push(o)}catch{a.push(o)}}return{shellLayouts:i,wrapperLayouts:a}}async function Ge(e,t,n,r){try{let i=e({...t,children:n(`div`,{dangerouslySetInnerHTML:{__html:B}})});return r(i instanceof Promise?await i:i)}catch{return null}}function Ke(e,t){let n=e;if(t.length>0){let e=`<style data-avalon-ssr-css>${t.join(`
25
+ `)}</style>`;n.includes(`</head>`)?n=n.replace(`</head>`,`${e}\n</head>`):n+=e}n.trim().toLowerCase().startsWith(`<!doctype`)||(n=`<!DOCTYPE html>\n${n}`);let r=m(!0);r&&n.includes(`</head>`)&&(n=n.replace(`</head>`,`${r}\n</head>`));let i=h(!0);return i&&n.includes(`</head>`)&&(n=n.replace(`</head>`,`${i}\n</head>`)),g(n)}async function q(e,t,n){try{let n=typeof e==`function`?e():e;return t(n instanceof Promise?await n:n)}catch(e){return console.error(`${n} Error rendering page component:`,e),`<div>Error rendering page</div>`}}async function J(e,t,n,r,i,a){let o=e;for(let{module:e}of t){let t=e.default;if(!(!t||typeof t!=`function`))try{let e=t({...n,children:r(`div`,{dangerouslySetInnerHTML:{__html:o}})});o=i(e instanceof Promise?await e:e)}catch(e){console.error(`${a} Error rendering wrapper layout:`,e)}}return o}async function qe(e,t,n,r,i){if(t.length===0)return e;let{module:a}=t.at(-1),o=a.default;if(!o||typeof o!=`function`)return e;try{let t=o({...n,children:r(`div`,{dangerouslySetInnerHTML:{__html:e}})});return i(t instanceof Promise?await t:t)}catch(t){return console.error(`[SSR] Error rendering shell layout:`,t),e}}function Je(e){if(e.includes(`/src/client/main.js`)||e.includes(`/@vite/client`))return e;let t=e.lastIndexOf(`</body>`);return t===-1?e:e.slice(0,t)+`
26
26
  <script type="module" src="/@vite/client"><\/script>
27
27
  <script type="module" src="/src/client/main.js"><\/script>
28
- `+e.slice(t)}async function Be(e,t,n,r){if(!n.modules)return!1;let i=t.split(`?`)[0],a=await Q(i,n,e);if(!a)return!1;try{let t=await e.ssrLoadModule(a),o=t.default;if(!o)return!1;let s=t.layoutConfig,c=await T(e,a),l=await W(e,await Y(i,e),c);if(l.length===0)return!1;let{h:u,renderToString:d}=await H(e,n.core),f=s?.skipLayouts||[],p=l.filter(({file:e})=>!f.includes(U(e))),m=t.frontmatter,h=t.metadata,g={children:null,frontmatter:{...m,...h,currentPath:i},params:{},url:i},{shellLayouts:_,wrapperLayouts:v}=await G(p,g,u,d);if(_.length===0)return!1;let{module:y}=_.at(-1),b=y.default;if(!b||typeof b!=`function`)return!1;let x=await Ie(b,g,u,d);if(x===null)return!1;let S=x.indexOf(z);if(S===-1)return!1;let C=x.slice(0,S),w=x.slice(S+29),E=Le(C,c);r.statusCode=200,r.setHeader(`Content-Type`,`text/html; charset=utf-8`),r.setHeader(`Transfer-Encoding`,`chunked`),r.setHeader(`X-Avalon-Streaming`,`1`),r.flushHeaders(),r.write(E);let D=await K(o,d,`[SSR Streaming]`);if(D.trim().startsWith(`<!DOCTYPE html>`)||D.trim().startsWith(`<html`))return r.end(D),!0;let O=ze(await q(D,v,g,u,d,`[SSR Streaming]`)+w);return r.end(O),!0}catch(e){return r.headersSent?(r.end(`<div>Streaming SSR error: ${e.message}</div></body></html>`),!0):!1}}async function Ve(e,t,n){let r=t.split(`?`)[0],i=await Q(r,n,e);if(!i)return null;try{let t=await e.ssrLoadModule(i),a=t.default;if(!a)return console.warn(`[SSR] Page ${i} has no default export`),null;let o=await T(e,i),s=await W(e,await Y(r,e),o),c;return c=n.modules&&s.length>0?await He(a,t,s,r,n,e):await Je(a,t,r,n,e),o.length>0&&(c=E(c,o)),c}catch(e){throw console.error(`[SSR] Error rendering ${i}:`,e),e}}async function He(e,t,n,r,i,a){let{h:o,renderToString:s}=await H(a,i.core),c=t.layoutConfig?.skipLayouts||[],l=n.filter(({file:e})=>!c.includes(U(e))),u=await K(e,s,`[SSR]`);if(u.trim().startsWith(`<!DOCTYPE html>`)||u.trim().startsWith(`<html`))return J(u);let d=t.frontmatter,f=t.metadata,p={children:null,frontmatter:{...d,...f,currentPath:r},params:{},url:r},{shellLayouts:m,wrapperLayouts:h}=await G(l,p,o,s),g=await Re(await q(u,h,p,o,s,`[SSR]`),m,p,o,s);if(g.trim().startsWith(`<!DOCTYPE html>`)||g.trim().startsWith(`<html`))return J(g);let _=t.metadata||{},v=_.title||`Avalon App`,y=_.description||``;return`<!DOCTYPE html>
28
+ `+e.slice(t)}async function Ye(e,t,n,r){if(!n.modules)return!1;let i=t.split(`?`)[0],a=await $e(i,n,e);if(!a)return!1;try{let t=await e.ssrLoadModule(a),o=t.default;if(!o)return!1;let s=t.layoutConfig,c=await w(e,a),l=await G(e,await X(i,e),c);if(l.length===0)return!1;let{h:u,renderToString:d}=await U(e,n.core),f=s?.skipLayouts||[],p=l.filter(({file:e})=>!f.includes(W(e))),m=t.frontmatter,h=t.metadata,g={children:null,frontmatter:{...m,...h,currentPath:i},params:{},url:i},{shellLayouts:_,wrapperLayouts:v}=await K(p,g,u,d);if(_.length===0)return!1;let{module:y}=_.at(-1),b=y.default;if(!b||typeof b!=`function`)return!1;let x=await Ge(b,g,u,d);if(x===null)return!1;let S=x.indexOf(B);if(S===-1)return!1;let C=x.slice(0,S),ee=x.slice(S+29),T=Ke(C,c);r.statusCode=200,r.setHeader(`Content-Type`,`text/html; charset=utf-8`),r.setHeader(`Transfer-Encoding`,`chunked`),r.setHeader(`X-Avalon-Streaming`,`1`),r.flushHeaders(),r.write(T);let E=await q(o,d,`[SSR Streaming]`);if(E.trim().startsWith(`<!DOCTYPE html>`)||E.trim().startsWith(`<html`))return r.end(E),!0;let D=Je(await J(E,v,g,u,d,`[SSR Streaming]`)+ee);return r.end(D),!0}catch(e){return r.headersSent?(r.end(`<div>Streaming SSR error: ${e.message}</div></body></html>`),!0):!1}}async function Xe(e,t,n){let r=t.split(`?`)[0],i=await $e(r,n,e);if(!i)return null;try{let t=await e.ssrLoadModule(i),a=t.default;if(!a)return console.warn(`[SSR] Page ${i} has no default export`),null;let o=await w(e,i),s=await G(e,await X(r,e),o),c;return c=n.modules&&s.length>0?await Ze(a,t,s,r,n,e):await it(a,t,r,n,e),o.length>0&&(c=T(c,o)),c}catch(e){throw console.error(`[SSR] Error rendering ${i}:`,e),e}}async function Ze(e,t,n,r,i,a){let{h:o,renderToString:s}=await U(a,i.core),c=t.layoutConfig?.skipLayouts||[],l=n.filter(({file:e})=>!c.includes(W(e))),u=await q(e,s,`[SSR]`);if(u.trim().startsWith(`<!DOCTYPE html>`)||u.trim().startsWith(`<html`))return Y(u);let d=t.frontmatter,f=t.metadata,p={children:null,frontmatter:{...d,...f,currentPath:r},params:{},url:r},{shellLayouts:m,wrapperLayouts:h}=await K(l,p,o,s),g=await qe(await J(u,h,p,o,s,`[SSR]`),m,p,o,s);if(g.trim().startsWith(`<!DOCTYPE html>`)||g.trim().startsWith(`<html`))return Y(g);let _=t.metadata||{},v=_.title||`Avalon App`,y=_.description||``;return`<!DOCTYPE html>
29
29
  <html lang="en">
30
30
  <head>
31
31
  <meta charset="utf-8">
@@ -38,12 +38,12 @@ export default islandManifest;
38
38
  ${g}
39
39
  <script type="module" src="/src/client/main.js"><\/script>
40
40
  </body>
41
- </html>`}function J(e){let t=e;if(t.trim().toLowerCase().startsWith(`<!doctype`)||(t=`<!DOCTYPE html>\n${t}`),!t.includes(`data-universal-ssr="true"`)){let e=m(!0);e&&t.includes(`</head>`)&&(t=t.replace(`</head>`,`${e}\n</head>`))}let n=h(!0);if(n&&t.includes(`</head>`)&&(t=t.replace(`</head>`,`${n}\n</head>`)),t=g(t),t.includes(`/src/client/main.js`)||t.includes(`/@vite/client`))return t;let r=t.lastIndexOf(`</body>`);return r===-1?t+`
41
+ </html>`}function Y(e){let t=e;if(t.trim().toLowerCase().startsWith(`<!doctype`)||(t=`<!DOCTYPE html>\n${t}`),!t.includes(`data-universal-ssr="true"`)){let e=m(!0);e&&t.includes(`</head>`)&&(t=t.replace(`</head>`,`${e}\n</head>`))}let n=h(!0);if(n&&t.includes(`</head>`)&&(t=t.replace(`</head>`,`${n}\n</head>`)),t=g(t),t.includes(`/src/client/main.js`)||t.includes(`/@vite/client`))return t;let r=t.lastIndexOf(`</body>`);return r===-1?t+`
42
42
  <script type="module" src="/@vite/client"><\/script>
43
43
  <script type="module" src="/src/client/main.js"><\/script>`:t.slice(0,r)+`
44
44
  <script type="module" src="/@vite/client"><\/script>
45
45
  <script type="module" src="/src/client/main.js"><\/script>
46
- `+t.slice(r)}async function Y(e,t){let n=t.config.root||process.cwd(),r=globalThis.__avalonConfig,a=`_layout.tsx`,o=[],s=e.split(`/`).filter(Boolean),c=[``];for(let e=0;e<s.length;e++)c.push(`/${s.slice(0,e+1).join(`/`)}`);async function l(e){try{if((await i(e)).isFile()){let t=e.slice(n.length);o.includes(t)||o.push(t)}}catch{}}if(r?.layoutsDir&&await l(`${`${n}/${r.layoutsDir}`}/${a}`),r?.modules){let e=`${n}/${r.modules.dir}`,t=r.modules.layoutsDirName,i=s[0]||``,o=[`home`,`root`,`main`,`index`];if(!i||o.includes(i.toLowerCase()))for(let n of o)await l(`${e}/${n}/${t}/${a}`);else await l(`${e}/${i}/${t}/${a}`)}let u=`${n}/src/layouts`;for(let e of c)await l(e===``?`${u}/${a}`:`${u}${e}/${a}`);return o}async function X(e,t){try{if((await i(`${e}/${t}`)).isFile())return`/${t}`}catch{}return null}async function Z(e,t,n){for(let r of n){let n=await X(e,`${t}${r}`);if(n)return n}if(!t.endsWith(`/index`))for(let r of n){let n=await X(e,`${t}/index${r}`);if(n)return n}return null}function Ue(e,t,n){let r=t.split(`/`).filter(Boolean),i=r[0]||``,a=[`home`,`root`,`main`,`index`],o,s;if(!i||a.includes(i.toLowerCase()))o=`home`,s=n;else{o=i;let e=r.slice(1);s=e.length>0?`/${e.join(`/`)}`:`/index`}return`${e.dir}/${o}/${e.pagesDirName}${s}`}async function Q(e,t,n){let r=e;r.endsWith(`/`)&&r!==`/`&&(r=r.slice(0,-1)),r===`/`&&(r=`/index`);let i=[`.tsx`,`.ts`,`.jsx`,`.js`,`.mdx`,`.md`],a=n.config.root||process.cwd();if(t.modules){let n=await Z(a,Ue(t.modules,e,r),i);if(n)return n}return Z(a,`${t.pagesDir}${r}`,i)}function We(e,t,n){if(globalThis.__avalonLayoutResolver)return;let r=e.EnhancedLayoutResolver,i=t.layoutsDir||`src/layouts`;globalThis.__avalonLayoutResolver=new r({baseDirectory:`${n}/${i}`,filePattern:`_layout.tsx`,excludeDirectories:[`node_modules`,`.git`,`dist`,`build`],enableWatching:!0,developmentMode:!1,enableCaching:!0,cacheTTL:60*1e3,maxCacheSize:100,enableStreaming:!0,enableErrorBoundaries:!0,enableMetrics:!1,enableDebugInfo:!1,modulesDir:t.modules?`${n}/${t.modules.dir}`:void 0,modulesLayoutsDirName:t.modules?.layoutsDirName})}async function Ge(e,t,n,r){try{let{renderToString:r}=await H(t,n.core);return typeof e==`function`?r(e()):``}catch{return`<p>Loading page: ${$(r)}</p>`}}async function Ke(e,t,n,r,i,a,o){if(!e.renderToHtmlWithLayouts||!t.EnhancedLayoutResolver||!t.EnhancedLayoutResolverUtils)return null;try{We(t,r,i.config.root||process.cwd());let s=`http://localhost${a}`,c={params:{},query:{},url:s,request:{method:`GET`,url:s,headers:new Headers}};return await e.renderToHtmlWithLayouts(n,globalThis.__avalonLayoutResolver,c,a,{title:o.title||`Avalon App`},void 0,{suppressWarnings:!0})}catch{return null}}async function qe(e,t,n,r,i,a){try{B||=await i.ssrLoadModule(N(`src/render/ssr.ts`));let o=B;V||=await i.ssrLoadModule(N(`src/core/layout/enhanced-layout-resolver.ts`));let s=V,c={component:()=>typeof e==`function`?e():e,options:{title:a.title||`Avalon App`},frontmatter:t.frontmatter},l=await Ke(o,s,c,r,i,n,a);if(l!==null)return l;if(o.renderToHtml)return await o.renderToHtml(c,{title:a.title||`Avalon App`},void 0,{suppressWarnings:!0})}catch{}return null}async function Je(e,t,n,r,i){let a=t.metadata||{},o=await qe(e,t,n,r,i,a);if(o!==null)return o;let s=a.title||`Avalon App`,c=a.description||``,l=await Ge(e,i,r,n);return`<!DOCTYPE html>
46
+ `+t.slice(r)}async function X(e,t){let n=t.config.root||process.cwd(),r=globalThis.__avalonConfig,a=`_layout.tsx`,o=[],s=e.split(`/`).filter(Boolean),c=[``];for(let e=0;e<s.length;e++)c.push(`/${s.slice(0,e+1).join(`/`)}`);async function l(e){try{if((await i(e)).isFile()){let t=e.slice(n.length);o.includes(t)||o.push(t)}}catch{}}if(r?.layoutsDir&&await l(`${`${n}/${r.layoutsDir}`}/${a}`),r?.modules){let e=`${n}/${r.modules.dir}`,t=r.modules.layoutsDirName,i=s[0]||``,o=[`home`,`root`,`main`,`index`];if(!i||o.includes(i.toLowerCase()))for(let n of o)await l(`${e}/${n}/${t}/${a}`);else await l(`${e}/${i}/${t}/${a}`)}let u=`${n}/src/layouts`;for(let e of c)await l(e===``?`${u}/${a}`:`${u}${e}/${a}`);return o}async function Z(e,t){try{if((await i(`${e}/${t}`)).isFile())return`/${t}`}catch{}return null}async function Q(e,t,n){for(let r of n){let n=await Z(e,`${t}${r}`);if(n)return n}if(!t.endsWith(`/index`))for(let r of n){let n=await Z(e,`${t}/index${r}`);if(n)return n}return null}function Qe(e,t,n){let r=t.split(`/`).filter(Boolean),i=r[0]||``,a=[`home`,`root`,`main`,`index`],o,s;if(!i||a.includes(i.toLowerCase()))o=`home`,s=n;else{o=i;let e=r.slice(1);s=e.length>0?`/${e.join(`/`)}`:`/index`}return`${e.dir}/${o}/${e.pagesDirName}${s}`}async function $e(e,t,n){let r=e;r.endsWith(`/`)&&r!==`/`&&(r=r.slice(0,-1)),r===`/`&&(r=`/index`);let i=[`.tsx`,`.ts`,`.jsx`,`.js`,`.mdx`,`.md`],a=n.config.root||process.cwd();if(t.modules){let n=await Q(a,Qe(t.modules,e,r),i);if(n)return n}return Q(a,`${t.pagesDir}${r}`,i)}function et(e,t,n){if(globalThis.__avalonLayoutResolver)return;let r=e.EnhancedLayoutResolver,i=t.layoutsDir||`src/layouts`;globalThis.__avalonLayoutResolver=new r({baseDirectory:`${n}/${i}`,filePattern:`_layout.tsx`,excludeDirectories:[`node_modules`,`.git`,`dist`,`build`],enableWatching:!0,developmentMode:!1,enableCaching:!0,cacheTTL:60*1e3,maxCacheSize:100,enableStreaming:!0,enableErrorBoundaries:!0,enableMetrics:!1,enableDebugInfo:!1,modulesDir:t.modules?`${n}/${t.modules.dir}`:void 0,modulesLayoutsDirName:t.modules?.layoutsDirName})}async function tt(e,t,n,r){try{let{renderToString:r}=await U(t,n.core);return typeof e==`function`?r(e()):``}catch{return`<p>Loading page: ${$(r)}</p>`}}async function nt(e,t,n,r,i,a,o){if(!e.renderToHtmlWithLayouts||!t.EnhancedLayoutResolver||!t.EnhancedLayoutResolverUtils)return null;try{et(t,r,i.config.root||process.cwd());let s=`http://localhost${a}`,c={params:{},query:{},url:s,request:{method:`GET`,url:s,headers:new Headers}};return await e.renderToHtmlWithLayouts(n,globalThis.__avalonLayoutResolver,c,a,{title:o.title||`Avalon App`},void 0,{suppressWarnings:!0})}catch{return null}}async function rt(e,t,n,r,i,a){try{V||=await i.ssrLoadModule(P(`src/render/ssr.ts`));let o=V;H||=await i.ssrLoadModule(P(`src/core/layout/enhanced-layout-resolver.ts`));let s=H,c={component:()=>typeof e==`function`?e():e,options:{title:a.title||`Avalon App`},frontmatter:t.frontmatter},l=await nt(o,s,c,r,i,n,a);if(l!==null)return l;if(o.renderToHtml)return await o.renderToHtml(c,{title:a.title||`Avalon App`},void 0,{suppressWarnings:!0})}catch{}return null}async function it(e,t,n,r,i){let a=t.metadata||{},o=await rt(e,t,n,r,i,a);if(o!==null)return o;let s=a.title||`Avalon App`,c=a.description||``,l=await tt(e,i,r,n);return`<!DOCTYPE html>
47
47
  <html lang="en">
48
48
  <head>
49
49
  <meta charset="utf-8">
@@ -18,6 +18,8 @@ declare global {
18
18
  var __nitroConfig: NitroConfigOutput | undefined;
19
19
  /** Hydration mode — automatically set: "entry-client" in dev (HMR), "per-island" in production */
20
20
  var __avalonHydrationMode: "entry-client" | "per-island" | undefined;
21
+ /** True when Vite is serving (dev). Independent of hydration mode so production + clientRouter still uses hashed island URLs. */
22
+ var __avalonIsDev: boolean | undefined;
21
23
  }
22
24
  /**
23
25
  * Collects Vite plugins from all activated integrations.
@@ -1 +1 @@
1
- import{createRequire as e}from"node:module";import{dirname as t,join as n}from"node:path";import{islandClientBundlerPlugin as r}from"../build/island-client-bundler.js";import{islandCodeSplittingPlugin as i}from"../build/island-code-splitting.js";import{mdxIslandTransform as a}from"../build/mdx-island-transform.js";import{createMDXPlugin as o}from"../build/mdx-plugin.js";import{pageIslandTransform as s}from"../build/page-island-transform.js";import{registry as c}from"../core/integrations/registry.js";import{discoverIntegrationsFromIslandUsage as l}from"./auto-discover.js";import{checkDirectoriesExist as u,resolveConfig as d}from"./config.js";import{createImagePlugin as f}from"./image-optimization.js";import{activateIntegrations as p,activateSingleIntegration as m}from"./integration-activator.js";import{islandSidecarPlugin as h}from"./island-sidecar-plugin.js";import{createNitroIntegration as g}from"./nitro-integration.js";import{serverIslandsPlugin as _}from"./server-islands-plugin.js";import{formatValidationResults as v,validateActiveIntegrations as y}from"./validation.js";export async function collectIntegrationPlugins(e,t=!1){let n=[],r=[];for(let i of e){let e=await b(i,t);i===`lit`?r.push(...e):n.push(...e)}return[...r,...n]}async function b(e,t){let n=c.get(e);if(!n||typeof n.vitePlugin!=`function`)return[];try{let e=await n.vitePlugin();return(Array.isArray(e)?e:[e]).filter(e=>e!=null)}catch(t){return console.warn(`[avalon] Failed to load vite plugin for ${e}:`,t instanceof Error?t.message:t),[]}}async function x(e,t){let n=new Set;try{let r=await l(e.pagesDir,e.layoutsDir,t,e.modules?.dir);for(let t of r)e.integrations.includes(t)&&n.add(t)}catch{for(let t of e.integrations)n.add(t)}return n}async function S(e){if(!e.lazyIntegrations||e.integrations.length===0)return[...e.integrations];let t=await x(e);return t.size===0?[...e.integrations]:Array.from(t)}async function C(e){try{let t=await o({jsxImportSource:e.mdx.jsxImportSource,syntaxHighlighting:e.mdx.syntaxHighlighting,remarkPlugins:e.mdx.remarkPlugins,rehypePlugins:e.mdx.rehypePlugins,development:!0});return t.push(a({verbose:e.verbose})),t}catch(t){return e.showWarnings&&console.warn(`⚠️ Could not configure MDX plugin:`,t),[]}}function w(e,t,n){let{plugins:r,nitroOptions:i}=g(e,t);return globalThis.__nitroConfig=i,{plugins:r,options:i}}async function T(e,t,n){if(e.autoDiscoverIntegrations)try{let r=await l(e.pagesDir,e.layoutsDir,t,e.modules?.dir);for(let t of r)if(!n.has(t))try{await m(t,n,e.verbose)}catch(n){e.showWarnings&&console.warn(` ⚠️ Could not auto-load integration: ${t}`,n)}}catch(t){e.showWarnings&&console.warn(` ⚠️ Auto-discovery failed:`,t)}}function E(e,t){if(!e.validateIntegrations||t.size===0)return;let n=y(t,e.showWarnings);n.allValid||(console.error(v(n)),e.showWarnings&&console.warn(` ⚠️ Some integrations have validation issues.`))}export async function avalon(a){let o,c,l=new Set,m=d(a,!0),g=await S(m);g.length>0&&await p({...m,integrations:g},l);let v=await C(m),y=await f(m.image,m.verbose),b=[];l.size>0&&(b=await collectIntegrationPlugins(l,m.verbose));let x=[];if(a?.nitro){let{plugins:e}=w(m,a.nitro,m.verbose);x=e}let D=h({verbose:m.verbose}),O=_({verbose:m.verbose}),k=e(import.meta.url),A=null;try{A=n(t(k.resolve(`@useavalon/avalon/client`)),`main.js`)}catch{}let j=new Set([`preact`,`react`,`vue`,`svelte`,`solid`,`lit`,`qwik`].flatMap(e=>[`/@useavalon/${e}/client`,`/@useavalon/${e}/client/hmr`,`@useavalon/${e}/client`,`@useavalon/${e}/client/hmr`])),M={name:`avalon`,enforce:`pre`,config(e,{command:t}){let n={preact:[`preact`,`preact/hooks`],react:[`react`,`react-dom`,`react-dom/client`],vue:[`vue`],svelte:[`svelte`,`svelte/internal`],solid:[`solid-js`,`solid-js/web`],lit:[`lit`,`@lit-labs/ssr-client`],qwik:[`@builder.io/qwik`]},r=g.flatMap(e=>n[e]??[]);return a?.core===`react`&&r.push(`react-dom/server`,`react/jsx-runtime`),{define:{__AVALON_PER_ISLAND__:JSON.stringify(t===`build`)},oxc:{exclude:[/node_modules\/@useavalon\/.*\.tsx?$/]},ssr:{noExternal:[/^@useavalon\//]},optimizeDeps:{exclude:[`@useavalon/avalon`,...g.map(e=>`@useavalon/${e}`)],include:r}}},configResolved(e){c=e,o=d(a,e.command===`serve`),globalThis.__avalonConfig=o,u(o,e.root)},async resolveId(e){if(e===`/src/client/main.js`&&A)return A;if(j.has(e)){let t=e.startsWith(`/`)?e.slice(1):e;return(await this.resolve(t))?.id??null}return null},async transform(e,t){if(t.includes(`@useavalon/`)&&/\.tsx?$/.test(t)){let{transform:n}=await import(`oxc-transform`),r=await n(t,e,{sourcemap:!0,typescript:{onlyRemoveTypeImports:!1}});return{code:r.code,map:r.map,moduleType:`js`}}},async buildStart(){await T(o,c?.root,l),E(o,l)},configureServer(e){globalThis.__viteDevServer=e}},N=b.filter(e=>e.name?.includes(`lit`)),P=b.filter(e=>!e.name?.includes(`lit`)),F,I=t=>{try{return F||=e(n(c?.root??process.cwd(),`package.json`)),F.resolve(t).replace(/\.js$/,`.mjs`)}catch{return}},L=new Set([`preact`,`preact/hooks`,`preact/compat`,`preact/compat/server`,`preact/compat/client`]),R={name:`avalon:preact-compat-resolver`,enforce:`pre`,resolveId(e){let t=this.environment?.name;return t!==`ssr`&&t!==`nitro`||!L.has(e)?null:I(e)??null}},z=[`@preact/preset-vite`,`@vitejs/plugin-react`,`@vitejs/plugin-vue`,`@sveltejs/vite-plugin-svelte`,`vite-plugin-solid`,`@builder.io/qwik/optimizer`,`vite-prerender-plugin`];return[R,{name:`avalon:stub-build-time-plugins`,enforce:`pre`,resolveId(e){let t=this.environment?.name;if(!(t!==`ssr`&&t!==`nitro`)&&z.some(t=>e===t||e.startsWith(`${t}/`)))return`\0stub:${e}`},load(e){if(e.startsWith(`\0stub:`))return`export default function() { return []; }; export {};`}},s({pagesDir:m.pagesDir,layoutsDir:m.layoutsDir,modules:m.modules,verbose:m.verbose}),r(m,a?.nitro),i(m,a?.nitro),...y,...N,...v,M,D,O,...x,...P]}export function getResolvedConfig(){return globalThis.__avalonConfig}export function getPagesDir(){return globalThis.__avalonConfig?.pagesDir??`src/pages`}export function getLayoutsDir(){return globalThis.__avalonConfig?.layoutsDir??`src/layouts`}export function getNitroConfig(){return globalThis.__nitroConfig}export function isNitroEnabled(){return globalThis.__nitroConfig!==void 0}
1
+ import{createRequire as e}from"node:module";import{dirname as t,join as n}from"node:path";import{islandClientBundlerPlugin as r}from"../build/island-client-bundler.js";import{islandCodeSplittingPlugin as i}from"../build/island-code-splitting.js";import{mdxIslandTransform as a}from"../build/mdx-island-transform.js";import{createMDXPlugin as o}from"../build/mdx-plugin.js";import{pageIslandTransform as s}from"../build/page-island-transform.js";import{resolveHydrationMode as c}from"../client/hydration-mode.js";import{registry as l}from"../core/integrations/registry.js";import{discoverIntegrationsFromIslandUsage as u}from"./auto-discover.js";import{checkDirectoriesExist as d,resolveConfig as f}from"./config.js";import{shouldSetDevScopedName as p,stableDevScopedName as m}from"./dev-css-modules.js";import{asNoExternalList as h,getFrameworkViteDefaults as g,mapPreactCompatId as _,shouldResolvePreactCompat as v}from"./framework-vite-defaults.js";import{createImagePlugin as y}from"./image-optimization.js";import{activateIntegrations as b,activateSingleIntegration as x}from"./integration-activator.js";import{islandSidecarPlugin as S}from"./island-sidecar-plugin.js";import{createNitroIntegration as C}from"./nitro-integration.js";import{serverIslandsPlugin as w}from"./server-islands-plugin.js";import{STUB_BUILD_TIME_MODULE as T,shouldStubBuildTimeSpecifier as E}from"./stub-build-time-packages.js";import{formatValidationResults as D,validateActiveIntegrations as O}from"./validation.js";export async function collectIntegrationPlugins(e,t=!1){let n=[],r=[];for(let i of e){let e=await k(i,t);i===`lit`?r.push(...e):n.push(...e)}return[...r,...n]}async function k(e,t){let n=l.get(e);if(!n||typeof n.vitePlugin!=`function`)return[];try{let e=await n.vitePlugin();return(Array.isArray(e)?e:[e]).filter(e=>e!=null)}catch(t){return console.warn(`[avalon] Failed to load vite plugin for ${e}:`,t instanceof Error?t.message:t),[]}}async function A(e,t){let n=new Set;try{let r=await u(e.pagesDir,e.layoutsDir,t,e.modules?.dir);for(let t of r)e.integrations.includes(t)&&n.add(t)}catch{for(let t of e.integrations)n.add(t)}return n}async function j(e){if(!e.lazyIntegrations||e.integrations.length===0)return[...e.integrations];let t=await A(e);return t.size===0?[...e.integrations]:Array.from(t)}async function M(e){try{let t=await o({jsxImportSource:e.mdx.jsxImportSource,syntaxHighlighting:e.mdx.syntaxHighlighting,remarkPlugins:e.mdx.remarkPlugins,rehypePlugins:e.mdx.rehypePlugins,development:!0});return t.push(a({verbose:e.verbose})),t}catch(t){return e.showWarnings&&console.warn(`⚠️ Could not configure MDX plugin:`,t),[]}}function N(e,t,n){let{plugins:r,nitroOptions:i}=C(e,t);return globalThis.__nitroConfig=i,{plugins:r,options:i}}async function P(e,t,n){if(e.autoDiscoverIntegrations)try{let r=await u(e.pagesDir,e.layoutsDir,t,e.modules?.dir);for(let t of r)if(!n.has(t))try{await x(t,n,e.verbose)}catch(n){e.showWarnings&&console.warn(` ⚠️ Could not auto-load integration: ${t}`,n)}}catch(t){e.showWarnings&&console.warn(` ⚠️ Auto-discovery failed:`,t)}}function F(e,t){if(!e.validateIntegrations||t.size===0)return;let n=O(t,e.showWarnings);n.allValid||(console.error(D(n)),e.showWarnings&&console.warn(` ⚠️ Some integrations have validation issues.`))}export async function avalon(a){let o,l,u=new Set,x=f(a,!0),C=await j(x);C.length>0&&await b({...x,integrations:C},u);let D=await M(x),O=await y(x.image,x.verbose),k=[];u.size>0&&(k=await collectIntegrationPlugins(u,x.verbose));let A=[];if(a?.nitro){let{plugins:e}=N(x,a.nitro,x.verbose);A=e}let I=S({verbose:x.verbose}),L=w({verbose:x.verbose}),R=e(import.meta.url),z=null;try{z=n(t(R.resolve(`@useavalon/avalon/client`)),`main.js`)}catch{}let B=new Set([`preact`,`react`,`vue`,`svelte`,`solid`,`lit`,`qwik`].flatMap(e=>[`/@useavalon/${e}/client`,`/@useavalon/${e}/client/hmr`,`@useavalon/${e}/client`,`@useavalon/${e}/client/hmr`])),V={name:`avalon`,enforce:`pre`,config(e,{command:t}){let n=g({integrations:C,core:a?.core??`preact`,command:t,root:e.root,nitroPreset:a?.nitro?.preset}),r=t===`build`&&!a?.clientRouter,i=h(n.ssr?.noExternal);return{define:{__AVALON_PER_ISLAND__:JSON.stringify(r),...n.define},oxc:{exclude:[/node_modules\/@useavalon\/.*\.tsx?$/]},ssr:{...n.ssr,noExternal:[/^@useavalon\//,...i]},optimizeDeps:{exclude:[`@useavalon/avalon`,...C.map(e=>`@useavalon/${e}`),...n.optimizeDeps?.exclude??[]],include:n.optimizeDeps?.include??[]},resolve:n.resolve,...t===`serve`&&p(e.css?.modules)?{css:{modules:{generateScopedName:m}}}:{}}},configResolved(e){l=e;let t=e.command===`serve`;o=f(a,t),globalThis.__avalonConfig=o,globalThis.__avalonHydrationMode=c(t,o.clientRouter),globalThis.__avalonIsDev=t,d(o,e.root)},async resolveId(e){if(e===`/src/client/main.js`&&z)return z;if(B.has(e)){let t=e.startsWith(`/`)?e.slice(1):e;return(await this.resolve(t))?.id??null}return null},async transform(e,t){if(t.includes(`@useavalon/`)&&/\.tsx?$/.test(t)){let{transform:n}=await import(`oxc-transform`),r=await n(t,e,{sourcemap:!0,typescript:{onlyRemoveTypeImports:!1}});return{code:r.code,map:r.map,moduleType:`js`}}},async buildStart(){await P(o,l?.root,u),F(o,u)},configureServer(e){globalThis.__viteDevServer=e}},H=k.filter(e=>e.name?.includes(`lit`)),U=k.filter(e=>!e.name?.includes(`lit`)),W,G=t=>{try{return W||=e(n(l?.root??process.cwd(),`package.json`)),W.resolve(t).replace(/\.js$/,`.mjs`)}catch{return}};return[{name:`avalon:preact-compat-resolver`,enforce:`pre`,resolveId(e){let t=this,n=t.environment?.name,r=t.environment?.config?.command;if(!v(n,r))return null;let i=_(e,a?.core??`preact`);return i?G(i)??null:null}},{name:`avalon:stub-build-time-plugins`,enforce:`pre`,resolveId(e){let t=this.environment?.name;if(!(t!==`ssr`&&t!==`nitro`)&&E(e))return`\0stub:${e}`},load(e){if(e.startsWith(`\0stub:`))return T;let t=this.environment?.name;if(!(t!==`ssr`&&t!==`nitro`)&&E(e))return T}},s({pagesDir:x.pagesDir,layoutsDir:x.layoutsDir,modules:x.modules,verbose:x.verbose}),r(x,a?.nitro),i(x,a?.nitro),...O,...H,...D,V,I,L,...A,...U]}export function getResolvedConfig(){return globalThis.__avalonConfig}export function getPagesDir(){return globalThis.__avalonConfig?.pagesDir??`src/pages`}export function getLayoutsDir(){return globalThis.__avalonConfig?.layoutsDir??`src/layouts`}export function getNitroConfig(){return globalThis.__nitroConfig}export function isNitroEnabled(){return globalThis.__nitroConfig!==void 0}
@@ -1,3 +1,3 @@
1
- import{dirname as e,relative as t,resolve as n}from"node:path";import{generateKey as r,getKey as i}from"../server-islands/encryption.js";import{addToManifest as a,clearManifest as o,generateComponentId as s,getManifest as c}from"../server-islands/manifest.js";const l=`virtual:server-island-manifest`,u=`\0`+l,d=`virtual:server-island-key`,f=`\0`+d,p=/<([A-Z][a-zA-Z0-9_$]*)\s[\s\S]*?\bserver\s*[={/>]/;function m(e){let t=[],n=/^[ \t]*import\s+([A-Z]\w*)\s+from\s+(['"][^'"]+['"])/gm,r=null;for(r=n.exec(e);r!==null;r=n.exec(e))t.push({localName:r[1],importPath:r[2].slice(1,-1)});return t}function h(e,t){return new RegExp(String.raw`<${t}\s[\s\S]*?\bserver\s*[={/>]`).test(e)}export function resolveToRelativePath(r,i,a){return r.startsWith(`/src/`)||r.startsWith(`/app/`)?r:r.startsWith(`@/`)?`/app/${r.slice(2)}`:r.startsWith(`@shared/`)?`/app/shared/${r.slice(8)}`:r.startsWith(`@modules/`)?`/app/modules/${r.slice(9)}`:r.startsWith(`~/`)?`/src/${r.slice(2)}`:r.startsWith(`$components/`)?`/src/components/${r.slice(12)}`:r.startsWith(`$islands/`)?`/src/islands/${r.slice(9)}`:r.startsWith(`.`)?`/`+t(a,n(e(i),r)).replaceAll(`\\`,`/`):r}export function serverIslandsPlugin(e={}){let t,n,g=!!process.env.AVALON_KEY;return{name:`avalon:server-islands`,enforce:`pre`,config(){process.env.AVALON_KEY||(process.env.AVALON_KEY=r())},configResolved(e){t=e.root},buildStart(){o(),n=i(),e.verbose&&console.log(`[avalon:server-islands] Encryption key source: ${g?`AVALON_KEY env var`:`generated per-build`}`)},resolveId(e){return e===l?u:e===d?f:e===`virtual:server-island-integrations`?`\0virtual:server-island-integrations`:null},load(e){if(e===`\0virtual:server-island-integrations`)return`export {};`;if(e===u){let e=c(),t=Object.entries(e),n=`export const serverIslandManifest = ${JSON.stringify(e)};\n\n`;n+=`export const serverIslandLoaders = {
1
+ import{dirname as e,relative as t,resolve as n}from"node:path";import{generateKey as r,getKey as i}from"../server-islands/encryption.js";import{addToManifest as a,clearManifest as o,generateComponentId as s,getManifest as c}from"../server-islands/manifest.js";const l=`virtual:server-island-manifest`,u=`\0`+l,d=`virtual:server-island-key`,f=`\0`+d,p=/<([A-Z][a-zA-Z0-9_$]*)\s[\s\S]*?\bserver\s*[={/>]/;function m(e){let t=[],n=/^[ \t]*import\s+([A-Z]\w*)\s+from\s+(['"][^'"]+['"])/gm,r=null;for(r=n.exec(e);r!==null;r=n.exec(e))t.push({localName:r[1],importPath:r[2].slice(1,-1)});return t}function h(e,t){return new RegExp(String.raw`<${t}\s[\s\S]*?\bserver\s*[={/>]`).test(e)}export function resolveToRelativePath(r,i,a){return r.startsWith(`/src/`)||r.startsWith(`/app/`)?r:r.startsWith(`@/`)?`/app/${r.slice(2)}`:r.startsWith(`@shared/`)?`/app/shared/${r.slice(8)}`:r.startsWith(`@modules/`)?`/app/modules/${r.slice(9)}`:r.startsWith(`~/`)?`/src/${r.slice(2)}`:r.startsWith(`$components/`)?`/src/components/${r.slice(12)}`:r.startsWith(`$islands/`)?`/src/islands/${r.slice(9)}`:r.startsWith(`.`)?`/`+t(a,n(e(i),r)).replaceAll(`\\`,`/`):r}export function serverIslandsPlugin(e={}){let t,n,g=!!process.env.AVALON_KEY;return{name:`avalon:server-islands`,enforce:`pre`,config(){process.env.AVALON_KEY||(process.env.AVALON_KEY=r())},configResolved(e){t=e.root},buildStart(){o(),n=i(),e.verbose&&console.log(`[avalon:server-islands] Encryption key source: ${g?`AVALON_KEY env var`:`generated per-build`}`)},resolveId(e){return e===l?u:e===d?f:null},load(e){if(e===u){let e=c(),t=Object.entries(e),n=`export const serverIslandManifest = ${JSON.stringify(e)};\n\n`;n+=`export const serverIslandLoaders = {
2
2
  `;for(let[e,r]of t)n+=` ${JSON.stringify(e)}: () => import(${JSON.stringify(r)}),\n`;return n+=`};
3
3
  `,n}return e===f?`export const serverIslandKey = ${JSON.stringify(n)};`:null},transform(n,r){if(!/\.(tsx|jsx)$/.test(r)||r.includes(`node_modules`)||!p.test(n))return null;let i=m(n);if(i.length===0)return null;for(let o of i)if(h(n,o.localName)){let n=resolveToRelativePath(o.importPath,r,t),i=s(n);a(i,n),e.verbose&&console.log(`[avalon:server-islands] Registered: ${o.localName} → ${i} (${n})`)}return null},generateBundle(){let t=c(),n=Object.keys(t).length;n>0&&e.verbose&&console.log(`[avalon:server-islands] Manifest contains ${n} server island(s)`)}}}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Separate module so ESM evaluates this stub before `@useavalon/lit`
3
+ * (and `lit-html`, which reads `document` at module eval). Imports in the
4
+ * same file are hoisted together; a dedicated first import is the only
5
+ * ordering guarantee.
6
+ *
7
+ * Prefer `@lit-labs/ssr-dom-shim` for HTMLElement / customElements so Lit SSR
8
+ * can emit declarative shadow DOM. A no-op `customElements.define` left Lit
9
+ * islands as empty tags until client hydration.
10
+ *
11
+ * Cloudflare's on-disk `_dom_stub.mjs` cannot use bare package imports (the
12
+ * Pages worker has no node_modules). Use {@link ssrDomStubFileSource} there.
13
+ */
14
+ export declare const SSR_DOM_VIRTUAL_ID = "virtual:avalon/ssr-dom";
15
+ /**
16
+ * Nitro virtual module + prerender Node wrapper: real ssr-dom-shim classes.
17
+ * Rolldown / Node resolve `@lit-labs/ssr-dom-shim` from the project graph.
18
+ * CSSStyleSheet must exist before CustomElementRegistry.define runs Lit
19
+ * finalizeStyles (constructable stylesheets).
20
+ */
21
+ export declare function ssrDomShimModuleSource(): string;
22
+ /**
23
+ * Self-contained stub for Cloudflare `_dom_stub.mjs` (no bare imports).
24
+ * Keeps a working customElements Map so dynamic Lit SSR in the Worker does not
25
+ * fall back to empty tags when the real shim package is unavailable.
26
+ */
27
+ export declare function ssrDomStubFileSource(): string;
@@ -0,0 +1,121 @@
1
+ export const SSR_DOM_VIRTUAL_ID=`virtual:avalon/ssr-dom`;function e(){return`
2
+ if (typeof globalThis.CSSStyleSheet === "undefined") {
3
+ globalThis.CSSStyleSheet = class CSSStyleSheet {
4
+ constructor() { this.cssRules = []; }
5
+ replaceSync() {}
6
+ replace() { return Promise.resolve(this); }
7
+ insertRule() { return 0; }
8
+ deleteRule() {}
9
+ };
10
+ }
11
+ if (typeof globalThis.document === "undefined") {
12
+ const createEl = () => ({
13
+ nodeType: 1,
14
+ childNodes: [],
15
+ attributes: {},
16
+ style: {},
17
+ setAttribute() {},
18
+ getAttribute() { return null; },
19
+ appendChild(c) { return c; },
20
+ addEventListener() {},
21
+ removeEventListener() {},
22
+ });
23
+ globalThis.document = {
24
+ createComment() { return { nodeType: 8 }; },
25
+ createTextNode(t) { return { nodeType: 3, data: t }; },
26
+ createElement() { return createEl(); },
27
+ createElementNS() { return createEl(); },
28
+ createTreeWalker() { return { nextNode() { return null; } }; },
29
+ createDocumentFragment() { return createEl(); },
30
+ implementation: { createHTMLDocument() { return globalThis.document; } },
31
+ body: createEl(),
32
+ head: createEl(),
33
+ documentElement: createEl(),
34
+ };
35
+ }
36
+ if (typeof globalThis.Node === "undefined") {
37
+ globalThis.Node = class Node {};
38
+ }
39
+ `}export function ssrDomShimModuleSource(){return`
40
+ ${e()}
41
+ import {
42
+ CustomElementRegistry,
43
+ CustomEvent as ShimCustomEvent,
44
+ Element as ShimElement,
45
+ Event as ShimEvent,
46
+ EventTarget as ShimEventTarget,
47
+ HTMLElement as ShimHTMLElement,
48
+ } from "@lit-labs/ssr-dom-shim";
49
+
50
+ globalThis.HTMLElement = ShimHTMLElement;
51
+ globalThis.Element = ShimElement;
52
+ globalThis.EventTarget = ShimEventTarget;
53
+ globalThis.Event = ShimEvent;
54
+ globalThis.CustomEvent = ShimCustomEvent;
55
+ globalThis.customElements = new CustomElementRegistry();
56
+ `}export function ssrDomStubFileSource(){return`
57
+ if (typeof globalThis.HTMLElement === "undefined") {
58
+ globalThis.HTMLElement = class HTMLElement {};
59
+ }
60
+ if (typeof globalThis.Element === "undefined") {
61
+ globalThis.Element = class Element {};
62
+ }
63
+ if (typeof globalThis.EventTarget === "undefined") {
64
+ globalThis.EventTarget = class EventTarget {
65
+ addEventListener() {}
66
+ removeEventListener() {}
67
+ dispatchEvent() { return true; }
68
+ };
69
+ }
70
+ if (typeof globalThis.Event === "undefined") {
71
+ globalThis.Event = class Event { constructor(type) { this.type = type; } };
72
+ }
73
+ if (typeof globalThis.CustomEvent === "undefined") {
74
+ globalThis.CustomEvent = class CustomEvent extends Event {
75
+ constructor(type, init) { super(type); this.detail = init?.detail; }
76
+ };
77
+ }
78
+ if (typeof globalThis.customElements === "undefined") {
79
+ const registry = new Map();
80
+ globalThis.customElements = {
81
+ define(name, ctor) { registry.set(name, ctor); },
82
+ get(name) { return registry.get(name); },
83
+ whenDefined(name) {
84
+ const ctor = registry.get(name);
85
+ return ctor ? Promise.resolve(ctor) : Promise.resolve();
86
+ },
87
+ getName(ctor) {
88
+ for (const [name, registered] of registry) {
89
+ if (registered === ctor) return name;
90
+ }
91
+ return null;
92
+ },
93
+ };
94
+ } else if (typeof globalThis.customElements.get === "function") {
95
+ const probeName = "avalon-ce-probe";
96
+ try {
97
+ const Probe = class extends globalThis.HTMLElement {};
98
+ globalThis.customElements.define(probeName, Probe);
99
+ if (globalThis.customElements.get(probeName) !== Probe) {
100
+ const registry = new Map();
101
+ globalThis.customElements = {
102
+ define(name, ctor) { registry.set(name, ctor); },
103
+ get(name) { return registry.get(name); },
104
+ whenDefined(name) {
105
+ const ctor = registry.get(name);
106
+ return ctor ? Promise.resolve(ctor) : Promise.resolve();
107
+ },
108
+ getName(ctor) {
109
+ for (const [name, registered] of registry) {
110
+ if (registered === ctor) return name;
111
+ }
112
+ return null;
113
+ },
114
+ };
115
+ }
116
+ } catch {
117
+ /* leave existing registry */
118
+ }
119
+ }
120
+ ${e()}
121
+ `}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Specifiers that must not be bundled into SSR / Nitro / Cloudflare workers.
3
+ *
4
+ * The `@useavalon/avalon` barrel re-exports the Vite plugin, so Cloudflare's
5
+ * worker pass inlines transform-time deps: oxc-parser (wasm32-wasi), Vite
6
+ * itself (chokidar → fsevents.node), and integration Vite plugins.
7
+ */
8
+ /** True when this import must be replaced by a stub in the SSR/Nitro graph. */
9
+ export declare function shouldStubBuildTimeSpecifier(id: string): boolean;
10
+ /**
11
+ * Stub module source. Named exports exist so Rolldown does not fail
12
+ * `import { parseSync } from "oxc-parser"` or
13
+ * `import { isRunnableDevEnvironment } from "vite"` when the barrel is inlined.
14
+ * These functions are never called at request time.
15
+ */
16
+ export declare const STUB_BUILD_TIME_MODULE: string;
@@ -0,0 +1,2 @@
1
+ const e=[`@preact/preset-vite`,`@vitejs/plugin-react`,`@vitejs/plugin-vue`,`@sveltejs/vite-plugin-svelte`,`vite-plugin-solid`,`@builder.io/qwik/optimizer`,`vite-prerender-plugin`],t=[`chokidar`,`fsevents`],n=[`oxc-parser`,`oxc-transform`,`oxc-minify`],r=[`@oxc-parser/`,`@oxc-transform/`,`@oxc-minify/`];function i(e,t){return e===t||e.startsWith(`${t}/`)}export function shouldStubBuildTimeSpecifier(a){return(a.split(`?`)[0]??a).endsWith(`.node`)||e.some(e=>i(a,e))||t.some(e=>i(a,e))||n.some(e=>i(a,e))?!0:r.some(e=>a.startsWith(e))}export const STUB_BUILD_TIME_MODULE=[`const noop = () => ({});`,`export default noop;`,`export const parseSync = noop;`,`export const visitorKeys = {};`,`export const transform = noop;`,`export const minify = noop;`,`export const isRunnableDevEnvironment = () => false;`,`export const watch = () => ({ on() {}, close() {} });`,`export const FSWatcher = class {};`].join(`
2
+ `);
@@ -264,6 +264,17 @@ export interface AvalonPluginConfig {
264
264
  * @default true
265
265
  */
266
266
  lazyIntegrations?: boolean;
267
+ /**
268
+ * Opt-in client navigation over SSR HTML.
269
+ *
270
+ * When true, internal same-origin GET links fetch the next server-rendered
271
+ * document and swap it in without a full reload. Off by default so pages
272
+ * ship no extra client JS. Progressive enhancement: the site still works
273
+ * with JavaScript disabled.
274
+ *
275
+ * @default false
276
+ */
277
+ clientRouter?: boolean;
267
278
  }
268
279
  /**
269
280
  * Fully resolved MDX configuration with defaults applied
@@ -298,6 +309,7 @@ export interface ResolvedAvalonConfig {
298
309
  validateIntegrations: boolean;
299
310
  showWarnings: boolean;
300
311
  lazyIntegrations: boolean;
312
+ clientRouter: boolean;
301
313
  isDev: boolean;
302
314
  }
303
315
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@useavalon/avalon",
3
- "version": "0.3.2-canary.8",
3
+ "version": "0.4.0",
4
4
  "description": "Multi-framework islands architecture for the modern web",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -63,6 +63,10 @@
63
63
  "types": "./dist/src/client/main-slim.d.ts",
64
64
  "default": "./dist/src/client/main-slim.js"
65
65
  },
66
+ "./client/router": {
67
+ "types": "./dist/src/client/router/index.d.ts",
68
+ "default": "./dist/src/client/router/index.js"
69
+ },
66
70
  "./client/strategies": {
67
71
  "types": "./dist/src/client/strategies.d.ts",
68
72
  "default": "./dist/src/client/strategies.js"
@@ -117,6 +121,10 @@
117
121
  "types": "./dist/src/render/collect-css.d.ts",
118
122
  "default": "./dist/src/render/collect-css.js"
119
123
  },
124
+ "./render/dev-css-select": {
125
+ "types": "./dist/src/render/dev-css-select.d.ts",
126
+ "default": "./dist/src/render/dev-css-select.js"
127
+ },
120
128
  "./render/shell-engine": {
121
129
  "types": "./dist/src/render/shell-engine.d.ts",
122
130
  "default": "./dist/src/render/shell-engine.js"
@@ -141,8 +149,7 @@
141
149
  "peerDependencies": {
142
150
  "vite": "^8.0.0",
143
151
  "nitro": "^3.0.260311-beta",
144
- "vite-imagetools": "^7.0.0",
145
- "rehype-highlight": "^7.0.0"
152
+ "vite-imagetools": "^7.0.0"
146
153
  },
147
154
  "peerDependenciesMeta": {
148
155
  "nitro": {
@@ -153,16 +160,15 @@
153
160
  },
154
161
  "vite-imagetools": {
155
162
  "optional": true
156
- },
157
- "rehype-highlight": {
158
- "optional": true
159
163
  }
160
164
  },
161
165
  "dependencies": {
162
- "@useavalon/core": "^0.3.2-canary.8",
163
166
  "@mdx-js/rollup": "^3.0.0",
167
+ "rehype-highlight": "^7.0.0",
168
+ "@useavalon/core": "^0.4.0",
164
169
  "h3": "^2.0.1-rc.16",
165
170
  "marked": "^17.0.4",
171
+ "oxc-parser": "^0.120.0",
166
172
  "oxc-transform": "^0.117.0",
167
173
  "preact": "10.28.4",
168
174
  "preact-render-to-string": "6.6.6",