@useavalon/avalon 0.3.2-canary.17 → 0.3.2-canary.21

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.
@@ -1 +1 @@
1
- export const INTEGRATION_BUILD_CONFIGS={preact:{name:`preact`,extensions:[`.tsx`,`.jsx`],optimizeDeps:[`preact`,`preact/hooks`,`preact/jsx-runtime`,`preact/jsx-dev-runtime`],ssrExternal:[],ssrNoExternal:[`preact`,`preact-render-to-string`],requiresPlugin:!1},vue:{name:`vue`,extensions:[`.vue`],optimizeDeps:[`vue`],ssrExternal:[],ssrNoExternal:[`vue`,`@vue/server-renderer`,`@vue/shared`],requiresPlugin:!0,pluginPackage:`@vitejs/plugin-vue`},solid:{name:`solid`,extensions:[`.tsx`,`.jsx`],optimizeDeps:[`solid-js`,`solid-js/web`,`solid-js/store`],ssrExternal:[],ssrNoExternal:[`solid-js`,`solid-js/web`,`solid-js/store`],requiresPlugin:!0,pluginPackage:`vite-plugin-solid`},svelte:{name:`svelte`,extensions:[`.svelte`],optimizeDeps:[`svelte`,`svelte/internal`,`svelte/store`,`svelte/animate`,`svelte/easing`,`svelte/motion`,`svelte/transition`],ssrExternal:[],ssrNoExternal:[`svelte`,`svelte/server`,`svelte/internal`,`svelte/store`],requiresPlugin:!0,pluginPackage:`@sveltejs/vite-plugin-svelte`},react:{name:`react`,extensions:[`.jsx`,`.tsx`],optimizeDeps:[`react`,`react/jsx-runtime`,`react/jsx-dev-runtime`,`react-dom`,`react-dom/client`],ssrExternal:[],ssrNoExternal:[`react`,`react-dom`,`react-dom/server`],requiresPlugin:!0,pluginPackage:`@vitejs/plugin-react`},lit:{name:`lit`,extensions:[`.ts`,`.js`],optimizeDeps:[`lit`,`lit/decorators.js`,`lit/directives/class-map.js`,`lit/directives/style-map.js`,`@lit/reactive-element`],ssrExternal:[],ssrNoExternal:[`lit`,`@lit-labs/ssr`,`@lit/reactive-element`,`lit-html`],requiresPlugin:!1}};export function getIntegrationBuildConfig(t){return INTEGRATION_BUILD_CONFIGS[t]}export function getOptimizeDepsForIntegrations(t){let n=new Set;for(let r of t){let t=INTEGRATION_BUILD_CONFIGS[r];t&&t.optimizeDeps.forEach(e=>n.add(e))}return Array.from(n)}export function getSSRNoExternalForIntegrations(t){let n=new Set;for(let r of t){let t=INTEGRATION_BUILD_CONFIGS[r];t&&t.ssrNoExternal.forEach(e=>n.add(e))}return Array.from(n)}export function integrationRequiresPlugin(t){return INTEGRATION_BUILD_CONFIGS[t]?.requiresPlugin??!1}export function getIntegrationPluginPackage(t){return INTEGRATION_BUILD_CONFIGS[t]?.pluginPackage}
1
+ export const INTEGRATION_BUILD_CONFIGS={preact:{name:`preact`,extensions:[`.tsx`,`.jsx`],optimizeDeps:[`preact`,`preact/hooks`,`preact/jsx-runtime`,`preact/jsx-dev-runtime`],ssrExternal:[],ssrNoExternal:[`preact`,`preact/hooks`,`preact/compat`,`preact/compat/server`,`preact-render-to-string`],requiresPlugin:!1},vue:{name:`vue`,extensions:[`.vue`],optimizeDeps:[`vue`],ssrExternal:[],ssrNoExternal:[`vue`,`@vue/server-renderer`,`@vue/shared`],requiresPlugin:!0,pluginPackage:`@vitejs/plugin-vue`},solid:{name:`solid`,extensions:[`.tsx`,`.jsx`],optimizeDeps:[`solid-js`,`solid-js/web`,`solid-js/store`],ssrExternal:[],ssrNoExternal:[`solid-js`,`solid-js/web`,`solid-js/store`],requiresPlugin:!0,pluginPackage:`vite-plugin-solid`},svelte:{name:`svelte`,extensions:[`.svelte`],optimizeDeps:[`svelte`,`svelte/internal`,`svelte/store`,`svelte/animate`,`svelte/easing`,`svelte/motion`,`svelte/transition`],ssrExternal:[],ssrNoExternal:[`svelte`,`svelte/server`,`svelte/internal`,`svelte/store`],requiresPlugin:!0,pluginPackage:`@sveltejs/vite-plugin-svelte`},react:{name:`react`,extensions:[`.jsx`,`.tsx`],optimizeDeps:[`react`,`react/jsx-runtime`,`react/jsx-dev-runtime`,`react-dom`,`react-dom/client`],ssrExternal:[],ssrNoExternal:[`react`,`react-dom`,`react-dom/client`,`react-dom/server`],requiresPlugin:!0,pluginPackage:`@vitejs/plugin-react`},lit:{name:`lit`,extensions:[`.ts`,`.js`],optimizeDeps:[`lit`,`lit/decorators.js`,`lit/directives/class-map.js`,`lit/directives/style-map.js`,`@lit/reactive-element`,`@lit-labs/ssr-client`,`@lit-labs/ssr-client/lit-element-hydrate-support.js`],ssrExternal:[],ssrNoExternal:[`lit`,`@lit-labs/ssr`,`@lit/reactive-element`,`lit-html`],requiresPlugin:!1},qwik:{name:`qwik`,extensions:[`.tsx`,`.jsx`],optimizeDeps:[],ssrExternal:[],ssrNoExternal:[`@builder.io/qwik`,`@builder.io/qwik/server`],requiresPlugin:!1}};export function getIntegrationBuildConfig(t){return INTEGRATION_BUILD_CONFIGS[t]}export function getOptimizeDepsForIntegrations(t){let n=new Set;for(let r of t){let t=INTEGRATION_BUILD_CONFIGS[r];t&&t.optimizeDeps.forEach(e=>n.add(e))}return Array.from(n)}export function getSSRNoExternalForIntegrations(t){let n=new Set;for(let r of t){let t=INTEGRATION_BUILD_CONFIGS[r];t&&t.ssrNoExternal.forEach(e=>n.add(e))}return Array.from(n)}export function integrationRequiresPlugin(t){return INTEGRATION_BUILD_CONFIGS[t]?.requiresPlugin??!1}export function getIntegrationPluginPackage(t){return INTEGRATION_BUILD_CONFIGS[t]?.pluginPackage}
@@ -1,4 +1,4 @@
1
1
  import{existsSync as e,readdirSync as t,readFileSync as n,statSync as r}from"node:fs";import{dirname as i,relative as a,resolve as o}from"node:path";export function islandClientBundlerPlugin(e,t,n){let r=process.cwd(),i=new Map,a=!1,o=c(e,r);for(let e of o)d(e,r,i);let s=`\0avalon-island-entry:`,l=!1,u=[],f={},p=`dist`;return{name:`avalon:island-client-bundler`,enforce:`pre`,configResolved(e){l=e.command===`serve`,a=e.command===`build`,u=e.resolve?.alias??[],f=e.define??{},p=e.build?.outDir??`dist`},resolveId(e){return e.startsWith(s)?e:null},load(e){if(!e.startsWith(s))return null;let t=e.slice(21),n=JSON.stringify(t);if(t.includes(`.qwik.`))return a?[`export * from ${n};`,`export { _hW } from "@builder.io/qwik";`].join(`
2
2
  `):[`export * from ${n};`,`export { _hW } from "@builder.io/qwik";`,`import __C from ${n};`,`export default __C;`,`if(typeof globalThis<"u")globalThis.__avalonIsland=__C;`].join(`
3
- `);let r=t.includes(`.lit.`),i=t.includes(`.solid.`),o=t.includes(`.preact.`),c=t.includes(`.react.`),l=t.includes(`.vue.`)||t.endsWith(`.vue`),u=t.includes(`.svelte.`)||t.endsWith(`.svelte`),d=[];if(r&&a&&d.push(`import "@useavalon/lit/client";`),d.push(`import __C from ${n};`,`var Component = __C;`,`export { Component as default, Component };`,`if(typeof globalThis<"u")globalThis.__avalonIsland=Component;`),a){let e={solid:`@useavalon/solid/client`,preact:`@useavalon/preact/client`,react:`@useavalon/react/client`,vue:`@useavalon/vue/client`,svelte:`@useavalon/svelte/client`,lit:`@useavalon/lit/client`},t=i?`solid`:o?`preact`:c?`react`:l?`vue`:u?`svelte`:r?`lit`:null;t&&e[t]?d.push(`export { hydrate as __hydrateIsland, mount as __mountIsland } from ${JSON.stringify(e[t])};`):d.push(`export { loadIntegrationModule } from "virtual:avalon/integration-loader";`)}return d.join(`
3
+ `);let r=t.includes(`.lit.`),i=t.includes(`.solid.`),o=t.includes(`.preact.`),c=t.includes(`.react.`),l=t.includes(`.vue.`)||t.endsWith(`.vue`),u=t.includes(`.svelte.`)||t.endsWith(`.svelte`),d=[];if(r&&a&&d.push(`import "@useavalon/lit/client";`),d.push(`import __C from ${n};`,`var Component = __C;`,`export { Component as default, Component };`,`if(typeof globalThis<"u")globalThis.__avalonIsland=Component;`),a){let e={solid:`@useavalon/solid/client`,preact:`@useavalon/preact/client`,react:`@useavalon/react/client`,vue:`@useavalon/vue/client`,svelte:`@useavalon/svelte/client`,lit:`@useavalon/lit/client`},t=i?`solid`:o?`preact`:c?`react`:l?`vue`:u?`svelte`:r?`lit`:null;t&&e[t]?d.push(`export { hydrate as __hydrateIsland, mount as __mountIsland, unmount as __unmountIsland } from ${JSON.stringify(e[t])};`):d.push(`export { loadIntegrationModule } from "virtual:avalon/integration-loader";`)}return d.join(`
4
4
  `)},async buildStart(){if(l)return;let t=this.environment;if(!(t&&t.name!==`client`)&&i.size>0){for(let[,e]of i)this.emitFile({type:`chunk`,id:s+e.filePath,fileName:`islands/${e.bundleKey}.js`,preserveSignature:`exports-only`});e.verbose&&console.log(`🏝️ Emitting ${i.size} island client bundles`)}},async closeBundle(){if(l||!a||i.size===0||globalThis.__avalonIslandsRebuilt)return;globalThis.__avalonIslandsRebuilt=!0;let{buildIsolatedIslands:e}=await import(`../post-build/isolated-island-builder.js`),t=new Map;for(let[e,n]of i){let r=n.filePath.includes(`.solid.`)?`solid`:n.filePath.includes(`.preact.`)?`preact`:n.filePath.includes(`.react.`)?`react`:n.filePath.includes(`.vue.`)||n.filePath.endsWith(`.vue`)?`vue`:n.filePath.includes(`.svelte.`)||n.filePath.endsWith(`.svelte`)?`svelte`:n.filePath.includes(`.lit.`)?`lit`:n.filePath.includes(`.qwik.`)?`qwik`:`preact`;t.set(e,{...n,framework:r})}await e(r,p,t,u,f,n?{treeshake:n}:void 0)}}}function c(n,r){let i=[];if(n.pagesDir){let t=o(r,n.pagesDir);e(t)&&i.push(t)}if(n.layoutsDir){let t=o(r,n.layoutsDir);e(t)&&i.push(t)}if(n.modules){let a=o(r,n.modules.dir);if(e(a))try{for(let n of t(a,{withFileTypes:!0}))if(n.isDirectory())for(let t of[`pages`,`layouts`,`components`]){let r=o(a,n.name,t);e(r)&&i.push(r)}}catch{}}return i}const l=[`.qwik.`];function u(e){return l.some(t=>e.includes(t))}function d(e,r,i){let a;try{a=t(e,{withFileTypes:!0})}catch{return}for(let t of a){let a=o(e,t.name);if(t.isDirectory()){d(a,r,i);continue}if(/\.(tsx?|jsx?|mdx?)$/.test(t.name))try{let e=n(a,`utf-8`),t=e.includes(`island=`)||e.includes(`island `),o=/import\s+\w+\s+from\s+['"][^'"]*\.qwik\.[^'"]*['"]/m.test(e);if(!t&&!o)continue;f(e,a,r,i)}catch{}}}function f(e,t,n,r){let i=/<([A-Z]\w*)\s[^>]*\bisland\s*[={]/g,o=/<([A-Z]\w*)\s[\s\S]{0,2000}?\bisland\s*[={]/g,s=new Set,c=null;for(c=i.exec(e);c!==null;c=i.exec(e))s.add(c[1]);for(c=o.exec(e);c!==null;c=o.exec(e))s.add(c[1]);let l=/import\s+(\w+)\s+from\s+['"]([^'"]+)['"]/g,d=new Set,f=[];for(c=l.exec(e);c!==null;c=l.exec(e))f.push([c[1],c[2]]),u(c[2])&&RegExp(`<${c[1]}[\\s/>]`).test(e)&&d.add(c[1]);if(!(s.size===0&&d.size===0))for(let[e,i]of f){if(!s.has(e)&&!d.has(e))continue;let o=p(i,t,n);if(!o)continue;let c=a(n,o).replaceAll(`\\`,`/`).replace(/\.(tsx?|jsx?)$/,``);r.has(o)||r.set(o,{filePath:o,bundleKey:c})}}function p(t,n,a,s=[]){let c;for(let n of s){let i=n.find;if(typeof i==`string`){if(t===i||t.startsWith(`${i}/`)){let s=t.slice(i.length);if(c=o(a,n.replacement+s),e(c)&&r(c).isFile())return c;for(let t of[`.tsx`,`.ts`,`.jsx`,`.js`,`.vue`,`.svelte`])if(e(c+t))return c+t}}else if(i instanceof RegExp&&i.test(t)){if(c=o(a,t.replace(i,n.replacement)),e(c)&&r(c).isFile())return c;for(let t of[`.tsx`,`.ts`,`.jsx`,`.js`,`.vue`,`.svelte`])if(e(c+t))return c+t}}if(t.startsWith(`@shared/`))c=o(a,`app/shared`,t.slice(8));else if(t.startsWith(`@modules/`))c=o(a,`app/modules`,t.slice(9));else if(t.startsWith(`@/`))c=o(a,`app`,t.slice(2));else if(t.startsWith(`.`))c=o(i(n),t);else return null;if(e(c)&&r(c).isFile())return c;for(let t of[`.tsx`,`.ts`,`.jsx`,`.js`,`.vue`,`.svelte`])if(e(c+t))return c+t;return null}
@@ -1,2 +1,2 @@
1
- import{dirname as e}from"node:path";import{islandSsrExpression as t}from"./island-ssr-flag.js";const n=[/['"]\.\.\/islands\//,/['"]\.\/islands\//,/['"]\.\.\/\.\.\/islands\//,/['"]\$islands\//,/['"]@\/islands\//,/['"]\/src\/islands\//];function r(e){let t=new Map,n=/import\s+([A-Z]\w*)\s+from\s+(['"][^'"]+['"])/g;for(let r=n.exec(e);r!==null;r=n.exec(e)){let e=r[1],n=r[2].slice(1,-1);t.set(e,n)}return t}function i(e){let t=new Set,n=/<([A-Z]\w*)\s+[^>]*\bisland\s*[={]/g;for(let r=n.exec(e);r!==null;r=n.exec(e))t.add(r[1]);let r=/(?:_?jsxs?(?:DEV)?)\s*\(\s*([A-Z]\w*)\s*,\s*\{[^}]*\bisland\s*:/g;for(let n=r.exec(e);n!==null;n=r.exec(e))t.add(n[1]);return t}function a(e,t){let n=[],a=r(e),o=i(e);for(let[e,r]of a){let i=`"${r}"`,a=t.some(e=>e.test(i)),s=o.has(e);(a||s)&&n.push({localName:e,importPath:r,islandPropUsage:s})}return n}function o(t,n,r=[]){if(t.startsWith(`/src/`)||t.startsWith(`/app/`)||t.startsWith(`/`))return t;for(let e of r){let n=e.find;if(typeof n==`string`){if(t===n||t.startsWith(`${n}/`)){let r=t.slice(n.length);return`${e.replacement.startsWith(`/`)?e.replacement:`/${e.replacement}`}${r}`}}else if(n instanceof RegExp&&n.test(t)){let r=e.replacement.startsWith(`/`)?e.replacement:`/${e.replacement}`;return t.replace(n,r)}}if(t.startsWith(`@/`))return`/app/${t.slice(2)}`;if(t.startsWith(`@shared/`))return`/app/shared/${t.slice(8)}`;if(t.startsWith(`@modules/`))return`/app/modules/${t.slice(9)}`;if(t.startsWith(`$components/`))return`/src/components/${t.slice(12)}`;if(t.startsWith(`$islands/`))return`/src/islands/${t.slice(9)}`;if(t.startsWith(`~/`))return`/src/${t.slice(2)}`;if(t.startsWith(`.`)){let r=n.replaceAll(`\\`,`/`),i=r.indexOf(`/app/`);if(i===-1&&(i=r.indexOf(`/src/`)),i!==-1){let n=e(r.slice(i)).split(`/`),a=t.split(`/`);for(let e of a)e===`..`?n.pop():e!==`.`&&n.push(e);return n.join(`/`)}}return t.includes(`/islands/`)?`/src/islands/${t.split(`/`).at(-1)}`:`/src/${t.split(`/`).pop()}`}function s(e){if(e.endsWith(`.vue`))return`vue`;if(e.endsWith(`.svelte`))return`svelte`;if(e.includes(`.solid.`))return`solid`;if(e.includes(`.lit.`))return`lit`;if(e.includes(`.qwik.`))return`qwik`;if(e.endsWith(`.tsx`)||e.endsWith(`.jsx`))return`preact`}function c(e,t){let n=t+1,r=1;for(;n<e.length&&r>0;){let t=e[n];t===`{`?(r++,n++):t===`}`?(r--,r>0&&n++):t===`'`||t===`"`||t==="`"?n=l(e,n):n++}return n<e.length?n+1:n}function l(e,t){let n=e[t];for(t++;t<e.length&&e[t]!==n;)e[t]===`\\`&&t++,t++;return t<e.length?t+1:t}function u(e,t){let n=t,r=0;for(;n<e.length&&e[n]!==`(`;)n++;if(n>=e.length)return t;for(;n<e.length;){let t=e[n];if(t===`(`)r++,n++;else if(t===`)`){if(r--,n++,r===0)return n}else t===`{`?n=c(e,n):t===`'`||t===`"`||t==="`"?n=l(e,n):n++}return n}function d(e){let t=e.match(/\bisland\s*:\s*/);if(!t)return null;let n=t.index+t[0].length,r;if(e[n]===`{`)r=c(e,n);else{let t=n,i=0;for(;t<e.length;){let n=e[t];if(n===`{`||n===`[`||n===`(`)i++,t++;else if(n===`}`||n===`]`||n===`)`){if(i===0)break;i--,t++}else if(n===`,`&&i===0)break;else t++}r=t}let i=e.slice(n,r).trim(),a=e.slice(0,t.index).trim(),o=e.slice(r).trim(),s=a;return o.startsWith(`,`)?s+=o.slice(1):s+=o,s=s.replace(/,\s*}$/,`}`).replace(/{\s*,/,`{`),{islandValue:i,otherProps:s}}function f(e,n,r,i){let a=RegExp(`(_?jsxs?(?:DEV)?)\\s*\\(\\s*${n}\\s*,`,`g`),o=``,s=0;for(let n=a.exec(e);n!==null;n=a.exec(e)){let a=n.index;n[1];let l=u(e,a),f=e.slice(a,l);if(!f.includes(`island`)){o+=e.slice(s,l),s=l;continue}let p=f.indexOf(`{`);if(p===-1){o+=e.slice(s,l),s=l;continue}let m=c(f,p),h=d(f.slice(p,m));if(!h){o+=e.slice(s,l),s=l;continue}let{islandValue:g,otherProps:_}=h,v=`(await __AvalonRenderIsland({ src: "${r}", ${i?`framework: "${i}",`:``} ...(${g}), ${_.trim()!==`{}`&&_.trim()!==``?`props: ${_},`:``} ssr: ${t(g)} }))`;o+=e.slice(s,a)+v,s=l}return o+=e.slice(s),o}export function mdxIslandTransform(e={}){let{islandPathPatterns:t=n,verbose:r=!1}=e,i=[];return{name:`avalon:mdx-island-transform`,enforce:`post`,configResolved(e){i=e.resolve?.alias??[]},transform(e,n){if(!n.endsWith(`.mdx`)&&!n.includes(`.mdx?`))return null;let c=a(e,t);if(c.length===0)return null;if(r){console.log(`[mdx-island-transform] Found ${c.length} island import(s) in ${n}`);for(let e of c)console.log(` - ${e.localName} from ${e.importPath}${e.islandPropUsage?` (island prop)`:` (islands dir)`}`)}let l=e;if(!(l.includes(`from "@useavalon/avalon"`)||l.includes(`from '@useavalon/avalon'`))){let e=/^(import\s.+?from\s+.+?\n)/m.exec(l);if(e){let t=l.indexOf(e[0])+e[0].length;l=l.slice(0,t)+`import { renderIsland as __AvalonRenderIsland } from "@useavalon/avalon";
2
- `+l.slice(t)}}for(let e of c){let t=o(e.importPath,n,i),r=s(t);l=f(l,e.localName,t,r)}for(let e of c){let t=RegExp(`import\\s+${e.localName}\\s+from\\s+(['"][^'"]+['"])`,`g`);l=l.replace(t,`import $1; // [mdx-island-transform] kept for CSS: ${e.localName}`)}return l=l.replace(/function\s+_createMdxContent\s*\(/g,`async function _createMdxContent(`),l=l.replace(/export\s+default\s+function\s+MDXContent\s*\(/g,`export default async function MDXContent(`),r&&console.log(`[mdx-island-transform] Transformed ${n}`),{code:l,map:null}}}}
1
+ import{dirname as e}from"node:path";import{islandSsrExpression as t}from"./island-ssr-flag.js";const n=[/['"]\.\.\/islands\//,/['"]\.\/islands\//,/['"]\.\.\/\.\.\/islands\//,/['"]\$islands\//,/['"]@\/islands\//,/['"]\/src\/islands\//];function r(e){let t=new Map,n=/import\s+([A-Z]\w*)\s+from\s+(['"][^'"]+['"])/g;for(let r=n.exec(e);r!==null;r=n.exec(e)){let e=r[1],n=r[2].slice(1,-1);t.set(e,n)}return t}function i(e,t){let n=1,r=1;for(;n<e.length&&r>0;){let i=e[n];if(r===1){let r=e.slice(n);if(r.startsWith(t)&&/^\s*:/.test(r.slice(t.length))){let t=e[n-1];if(n===1||!/\w/.test(t))return!0}}i===`{`||i===`(`||i===`[`?(r++,n++):i===`}`||i===`)`||i===`]`?(r--,n++):i===`'`||i===`"`||i==="`"?n=u(e,n):n++}return!1}function a(e){let t=new Set,n=/<([A-Z]\w*)\s+[^>]*\bisland\s*[={]/g;for(let r=n.exec(e);r!==null;r=n.exec(e))t.add(r[1]);let r=/(?:_?jsxs?(?:DEV)?)\s*\(\s*([A-Z]\w*)\s*,/g;for(let n=r.exec(e);n!==null;n=r.exec(e)){let r=n.index+n[0].length;for(;r<e.length&&/\s/.test(e[r]);)r++;if(e[r]!==`{`)continue;let a=l(e,r);i(e.slice(r,a),`island`)&&t.add(n[1])}return t}function o(e,t){let n=[],i=r(e),o=a(e);for(let[e,r]of i){let i=`"${r}"`,a=t.some(e=>e.test(i)),s=o.has(e);(a||s)&&n.push({localName:e,importPath:r,islandPropUsage:s})}return n}function s(t,n,r=[]){if(t.startsWith(`/src/`)||t.startsWith(`/app/`)||t.startsWith(`/`))return t;for(let e of r){let n=e.find;if(typeof n==`string`){if(t===n||t.startsWith(`${n}/`)){let r=t.slice(n.length);return`${e.replacement.startsWith(`/`)?e.replacement:`/${e.replacement}`}${r}`}}else if(n instanceof RegExp&&n.test(t)){let r=e.replacement.startsWith(`/`)?e.replacement:`/${e.replacement}`;return t.replace(n,r)}}if(t.startsWith(`@/`))return`/app/${t.slice(2)}`;if(t.startsWith(`@shared/`))return`/app/shared/${t.slice(8)}`;if(t.startsWith(`@modules/`))return`/app/modules/${t.slice(9)}`;if(t.startsWith(`$components/`))return`/src/components/${t.slice(12)}`;if(t.startsWith(`$islands/`))return`/src/islands/${t.slice(9)}`;if(t.startsWith(`~/`))return`/src/${t.slice(2)}`;if(t.startsWith(`.`)){let r=n.replaceAll(`\\`,`/`),i=r.indexOf(`/app/`);if(i===-1&&(i=r.indexOf(`/src/`)),i!==-1){let n=e(r.slice(i)).split(`/`),a=t.split(`/`);for(let e of a)e===`..`?n.pop():e!==`.`&&n.push(e);return n.join(`/`)}}return t.includes(`/islands/`)?`/src/islands/${t.split(`/`).at(-1)}`:`/src/${t.split(`/`).pop()}`}function c(e){if(e.endsWith(`.vue`))return`vue`;if(e.endsWith(`.svelte`))return`svelte`;if(e.includes(`.solid.`))return`solid`;if(e.includes(`.lit.`))return`lit`;if(e.includes(`.qwik.`))return`qwik`;if(e.includes(`.react.`))return`react`;if(e.endsWith(`.tsx`)||e.endsWith(`.jsx`))return`preact`}function l(e,t){let n=t+1,r=1;for(;n<e.length&&r>0;){let t=e[n];t===`{`?(r++,n++):t===`}`?(r--,r>0&&n++):t===`'`||t===`"`||t==="`"?n=u(e,n):n++}return n<e.length?n+1:n}function u(e,t){let n=e[t];for(t++;t<e.length&&e[t]!==n;)e[t]===`\\`&&t++,t++;return t<e.length?t+1:t}function d(e,t){let n=t,r=0;for(;n<e.length&&e[n]!==`(`;)n++;if(n>=e.length)return t;for(;n<e.length;){let t=e[n];if(t===`(`)r++,n++;else if(t===`)`){if(r--,n++,r===0)return n}else t===`{`?n=l(e,n):t===`'`||t===`"`||t==="`"?n=u(e,n):n++}return n}function f(e){let t=e.match(/\bisland\s*:\s*/);if(!t)return null;let n=t.index+t[0].length,r;if(e[n]===`{`)r=l(e,n);else{let t=n,i=0;for(;t<e.length;){let n=e[t];if(n===`{`||n===`[`||n===`(`)i++,t++;else if(n===`}`||n===`]`||n===`)`){if(i===0)break;i--,t++}else if(n===`,`&&i===0)break;else t++}r=t}let i=e.slice(n,r).trim(),a=e.slice(0,t.index).trim(),o=e.slice(r).trim(),s=a;return o.startsWith(`,`)?s+=o.slice(1):s+=o,s=s.replace(/,\s*}$/,`}`).replace(/{\s*,/,`{`),{islandValue:i,otherProps:s}}function p(e,n,r,i){let a=RegExp(`(_?jsxs?(?:DEV)?)\\s*\\(\\s*${n}\\s*,`,`g`),o=``,s=0;for(let c=a.exec(e);c!==null;c=a.exec(e)){let a=c.index;c[1];let u=d(e,a),p=e.slice(a,u);if(!p.includes(`island`)){o+=e.slice(s,u),s=u;continue}let m=p.indexOf(`{`);if(m===-1){o+=e.slice(s,u),s=u;continue}let h=l(p,m),g=f(p.slice(m,h));if(!g){o+=e.slice(s,u),s=u;continue}let{islandValue:_,otherProps:v}=g,y=i?`framework: "${i}",`:``,b=v.trim()!==`{}`&&v.trim()!==``?`props: ${v},`:``,x=`(await __AvalonRenderIsland({ src: "${r}", ${y} ${/\bclientOnly\s*:\s*true\b/.test(_)?``:`component: ${n},`} ...(${_}), ${b} ssr: ${t(_)} }))`;o+=e.slice(s,a)+x,s=u}return o+=e.slice(s),o}export function mdxIslandTransform(e={}){let{islandPathPatterns:t=n,verbose:r=!1}=e,i=[];return{name:`avalon:mdx-island-transform`,enforce:`post`,configResolved(e){i=e.resolve?.alias??[]},transform(e,n){if(!n.endsWith(`.mdx`)&&!n.includes(`.mdx?`))return null;let a=o(e,t);if(a.length===0)return null;if(r){console.log(`[mdx-island-transform] Found ${a.length} island import(s) in ${n}`);for(let e of a)console.log(` - ${e.localName} from ${e.importPath}${e.islandPropUsage?` (island prop)`:` (islands dir)`}`)}let l=e;if(!(l.includes(`from "@useavalon/avalon"`)||l.includes(`from '@useavalon/avalon'`))){let e=/^(import\s.+?from\s+.+?\n)/m.exec(l);if(e){let t=l.indexOf(e[0])+e[0].length;l=l.slice(0,t)+`import { renderIsland as __AvalonRenderIsland } from "@useavalon/avalon";
2
+ `+l.slice(t)}}for(let e of a){let t=s(e.importPath,n,i),r=c(t);l=p(l,e.localName,t,r)}return l=l.replace(/function\s+_createMdxContent\s*\(/g,`async function _createMdxContent(`),l=l.replace(/export\s+default\s+function\s+MDXContent\s*\(/g,`export default async function MDXContent(`),r&&console.log(`[mdx-island-transform] Transformed ${n}`),{code:l,map:null}}}}
@@ -1 +1 @@
1
- export async function createMDXPlugin(e={}){let{remarkPlugins:t=[],rehypePlugins:n=[],development:r=!1,jsxImportSource:i=`preact`,syntaxHighlighting:a=!0}=e;try{let{default:e}=await import(`@mdx-js/rollup`),{default:o}=await import(`remark-frontmatter`),{default:s}=await import(`remark-mdx-frontmatter`),{default:c}=await import(`remark-gfm`),l=[];if(a)try{let{default:e}=await import(`rehype-highlight`);l.push(e)}catch{console.warn(`[avalon:mdx] rehype-highlight not installed, syntax highlighting disabled. Install it with: npm install rehype-highlight`)}l.push(...n);let u=e({remarkPlugins:[o,s,c,...t],rehypePlugins:l,jsxImportSource:i,development:r,format:`mdx`});return u.sharedDuringBuild=!0,[u]}catch(e){let t=e instanceof Error?e.message:String(e);return console.error(`❌ Failed to configure MDX plugin:`,t),console.warn(`💡 Install missing dependencies or check import map`),console.warn(`⚠️ MDX plugin disabled - .mdx files will not be processed`),[]}}
1
+ import e from"rehype-highlight";export async function createMDXPlugin(t={}){let{remarkPlugins:n=[],rehypePlugins:r=[],development:i=!1,jsxImportSource:a=`preact`,syntaxHighlighting:o=!0}=t;try{let{default:t}=await import(`@mdx-js/rollup`),{default:s}=await import(`remark-frontmatter`),{default:c}=await import(`remark-mdx-frontmatter`),{default:l}=await import(`remark-gfm`),u=[];o&&u.push(e),u.push(...r);let d=t({remarkPlugins:[s,c,l,...n],rehypePlugins:u,jsxImportSource:a,development:i,format:`mdx`});return d.sharedDuringBuild=!0,[d]}catch(e){let t=e instanceof Error?e.message:String(e);return console.error(`❌ Failed to configure MDX plugin:`,t),console.warn(`💡 Install missing dependencies or check import map`),console.warn(`⚠️ MDX plugin disabled - .mdx files will not be processed`),[]}}
@@ -26,7 +26,8 @@ export declare function setHydrationLoader(loader: HydrationLoader | null): void
26
26
  */
27
27
  export declare function scanAndHydrate(root?: ParentNode): void;
28
28
  /**
29
- * Dispose every island under `root`: observers, idle timers, and framework roots.
30
- * No skip list — the client router extracts persist nodes *before* calling this.
29
+ * Dispose islands under `root`: observers, idle timers, and framework roots.
30
+ * Nodes inside `[data-router-persist]` stay mounted so persist chrome can
31
+ * remain in the old view-transition snapshot.
31
32
  */
32
33
  export declare function disposeIslands(root?: ParentNode): Promise<void>;
@@ -1 +1 @@
1
- import{executeCustomDirective as e,hasClientDirective as t}from"./custom-directives.js";const n=new WeakMap;let r=null;export function setHydrationLoader(e){r=e}async function a(){return r||import(`virtual:avalon/integration-loader`)}function o(e,t){let r=n.get(e)??[];r.push(t),n.set(e,r)}function s(e){let t=n.get(e);if(t){for(let e of t)try{e()}catch(e){console.warn(`[avalon] Island cleanup failed:`,e)}n.delete(e)}}function c(e,t){let n=e.default;if(!n){let t=Object.keys(e).filter(e=>e!==`default`);for(let r of t){let t=e[r];if(typeof t==`function`){n=t;break}}n||=e}if(!n)throw Error(`Component ${t} has no default export`);return n}async function l(e,t){if(e.dataset.hydrated)return;let n=e.dataset.src;if(!n){console.warn(`Island missing data-src attribute`);return}try{let r=e.dataset.props?JSON.parse(e.dataset.props):{},i=await a();t===`lit`&&await(i.preLitHydration?.()??i.loadIntegrationModule(`lit`).then(e=>e.preLitHydration?.()));let o=c(i.loadComponent?await i.loadComponent(n):await import(n),n),s=await i.loadIntegrationModule(t),l=e.dataset.renderStrategy===`client-only`,u=l?s.mount:s.hydrate,d=l?`mount`:`hydrate`;if(!u||typeof u!=`function`)throw Error(`Integration ${t} does not export a ${d} function`);await u(e,o,r),e.dataset.hydrated=`true`}catch(r){let i=r instanceof Error?r.message:String(r);console.error(`Hydration error for ${t} island ${n}:`,r),e.dataset.hydrationStatus=`failed`,e.dataset.renderStrategy=`ssr-only`,e.dispatchEvent(new CustomEvent(`hydration-error`,{detail:{framework:t,src:n,error:i,timestamp:Date.now()},bubbles:!0}))}}function u(e,t){try{let n=new IntersectionObserver(r=>{r[0]?.isIntersecting&&(l(e,t),n.disconnect())},{rootMargin:`50px`,threshold:0});n.observe(e.firstElementChild||e),o(e,()=>n.disconnect())}catch(n){console.error(`Failed to setup intersection observer:`,n),l(e,t)}}function d(e,t){let n=[`click`,`touchstart`,`mouseenter`,`focusin`],r=!1,i=e.firstElementChild||e,a=()=>{if(!r){r=!0;for(let e of n)i.removeEventListener(e,a);l(e,t)}};try{for(let e of n)i.addEventListener(e,a,{once:!0,passive:!0});o(e,()=>{r=!0;for(let e of n)i.removeEventListener(e,a)})}catch(n){console.error(`Failed to setup interaction observer:`,n),l(e,t)}}function f(e,t){try{if(`requestIdleCallback`in globalThis){let n=globalThis.requestIdleCallback(()=>{l(e,t)},{timeout:5e3});o(e,()=>globalThis.cancelIdleCallback?.(n));return}let n=setTimeout(()=>{l(e,t)},200);o(e,()=>clearTimeout(n))}catch(n){console.error(`Failed to setup idle callback:`,n),l(e,t)}}function p(e,t,n){try{let r=globalThis.matchMedia(n);if(r.matches){l(e,t);return}let i=n=>{n.matches&&(l(e,t),r.removeEventListener(`change`,i))};r.addEventListener(`change`,i),o(e,()=>r.removeEventListener(`change`,i))}catch(r){console.error(`Failed to setup media query:`,n,r),l(e,t)}}function m(n){let r=n.dataset.framework,i=n.dataset.condition||`on:client`,a=n.dataset.renderStrategy;if(r&&a!==`ssr-only`&&!n.dataset.hydrated){if(i===`on:client`){l(n,r);return}if(i===`on:visible`){u(n,r);return}if(i===`on:interaction`){d(n,r);return}if(i===`on:idle`){f(n,r);return}if(i.startsWith(`media:`)){p(n,r,i.slice(6));return}if(n.dataset.customDirective||n.dataset.directiveScript||t(i)){e(n,i,()=>{l(n,r)})||(console.warn(`[avalon] Unknown hydration condition: "${i}". Hydrating immediately.`),l(n,r));return}l(n,r)}}export function scanAndHydrate(e=document){let t=e.querySelectorAll(`[data-framework]`);for(let e of t)try{m(e)}catch(e){console.error(`Error processing island:`,e)}}export async function disposeIslands(e=document){let t=[...e.querySelectorAll(`[data-framework]`)],n=t.length>0?await a():null;for(let e of t){s(e);let t=e.dataset.framework;if(t&&n)try{let r=await n.loadIntegrationModule(t);typeof r.unmount==`function`&&await r.unmount(e)}catch(e){console.warn(`[avalon] Failed to unmount ${t} island:`,e)}delete e.dataset.hydrated,delete e.dataset.hydrationStatus,delete e.dataset.hydrationError,delete e.dataset.litHydrated}}
1
+ import{executeCustomDirective as e,hasClientDirective as t}from"./custom-directives.js";const n=new WeakMap;let r=null;export function setHydrationLoader(e){r=e}async function a(){return r||import(`virtual:avalon/integration-loader`)}function o(e,t){let r=n.get(e)??[];r.push(t),n.set(e,r)}function s(e){let t=n.get(e);if(t){for(let e of t)try{e()}catch(e){console.warn(`[avalon] Island cleanup failed:`,e)}n.delete(e)}}function c(e,t){let n=e.default;if(!n){let t=Object.keys(e).filter(e=>e!==`default`);for(let r of t){let t=e[r];if(typeof t==`function`){n=t;break}}n||=e}if(!n)throw Error(`Component ${t} has no default export`);return n}function l(e,t){let n=t?e.__mountIsland:e.__hydrateIsland;return typeof n==`function`?n:void 0}async function u(e,t){return e.loadComponent?await e.loadComponent(t):await import(t)}async function d(e,t,n){let r=e.dataset.src;if(r)try{let t=(await u(n,r)).__unmountIsland;if(typeof t==`function`){await t(e);return}}catch{}let i=await n.loadIntegrationModule(t);typeof i.unmount==`function`&&await i.unmount(e)}async function f(e,t){if(e.dataset.hydrated)return;let n=e.dataset.src;if(!n){console.warn(`Island missing data-src attribute`);return}try{let r=e.dataset.props?JSON.parse(e.dataset.props):{},i=await a();t===`lit`&&await(i.preLitHydration?.()??i.loadIntegrationModule(`lit`).then(e=>e.preLitHydration?.()));let o=await u(i,n),s=c(o,n),d=e.dataset.renderStrategy===`client-only`,f=d?`mount`:`hydrate`,p=l(o,d);if(!p){let e=await i.loadIntegrationModule(t);p=d?e.mount:e.hydrate}if(!p||typeof p!=`function`)throw Error(`Integration ${t} does not export a ${f} function`);await p(e,s,r),e.dataset.hydrated=`true`}catch(r){let i=r instanceof Error?r.message:String(r);console.error(`Hydration error for ${t} island ${n}:`,r),e.dataset.hydrationStatus=`failed`,e.dataset.renderStrategy=`ssr-only`,e.dispatchEvent(new CustomEvent(`hydration-error`,{detail:{framework:t,src:n,error:i,timestamp:Date.now()},bubbles:!0}))}}function p(e,t){try{let n=new IntersectionObserver(r=>{r[0]?.isIntersecting&&(f(e,t),n.disconnect())},{rootMargin:`50px`,threshold:0});n.observe(e.firstElementChild||e),o(e,()=>n.disconnect())}catch(n){console.error(`Failed to setup intersection observer:`,n),f(e,t)}}function m(e,t){let n=[`click`,`touchstart`,`mouseenter`,`focusin`],r=!1,i=e.firstElementChild||e,a=()=>{if(!r){r=!0;for(let e of n)i.removeEventListener(e,a);f(e,t)}};try{for(let e of n)i.addEventListener(e,a,{once:!0,passive:!0});o(e,()=>{r=!0;for(let e of n)i.removeEventListener(e,a)})}catch(n){console.error(`Failed to setup interaction observer:`,n),f(e,t)}}function h(e,t){try{if(`requestIdleCallback`in globalThis){let n=globalThis.requestIdleCallback(()=>{f(e,t)},{timeout:5e3});o(e,()=>globalThis.cancelIdleCallback?.(n));return}let n=setTimeout(()=>{f(e,t)},200);o(e,()=>clearTimeout(n))}catch(n){console.error(`Failed to setup idle callback:`,n),f(e,t)}}function g(e,t,n){try{let r=globalThis.matchMedia(n);if(r.matches){f(e,t);return}let i=n=>{n.matches&&(f(e,t),r.removeEventListener(`change`,i))};r.addEventListener(`change`,i),o(e,()=>r.removeEventListener(`change`,i))}catch(r){console.error(`Failed to setup media query:`,n,r),f(e,t)}}function _(n){let r=n.dataset.framework,i=n.dataset.condition||`on:client`,a=n.dataset.renderStrategy;if(r&&a!==`ssr-only`&&!n.dataset.hydrated){if(i===`on:client`){f(n,r);return}if(i===`on:visible`){p(n,r);return}if(i===`on:interaction`){m(n,r);return}if(i===`on:idle`){h(n,r);return}if(i.startsWith(`media:`)){g(n,r,i.slice(6));return}if(n.dataset.customDirective||n.dataset.directiveScript||t(i)){e(n,i,()=>{f(n,r)})||(console.warn(`[avalon] Unknown hydration condition: "${i}". Hydrating immediately.`),f(n,r));return}f(n,r)}}export function scanAndHydrate(e=document){let t=e.querySelectorAll(`[data-framework]`);for(let e of t)try{_(e)}catch(e){console.error(`Error processing island:`,e)}}export async function disposeIslands(e=document){let t=[...e.querySelectorAll(`[data-framework]`)].filter(e=>!e.closest?.(`[data-router-persist]`)),n=t.length>0?await a():null;for(let e of t){s(e);let t=e.dataset.framework;if(t&&n)try{await d(e,t,n)}catch(e){console.warn(`[avalon] Failed to unmount ${t} island:`,e)}delete e.dataset.hydrated,delete e.dataset.hydrationStatus,delete e.dataset.hydrationError,delete e.dataset.litHydrated}}
@@ -11,7 +11,7 @@ export { eligibleNavigationUrl, isModifiedClick } from "./eligibility.ts";
11
11
  export type { HistoryKind, NavigateOptions } from "./events.ts";
12
12
  export { ROUTER_EVENTS } from "./events.ts";
13
13
  export { prefetch } from "./prefetch.ts";
14
- export { reconcileHead, replaceBody } from "./swap.ts";
14
+ export { reconcileHead, replaceBody, replaceOutlets } from "./swap.ts";
15
15
  export type { ViewTransitionMode } from "./transitions.ts";
16
16
  /**
17
17
  * Programmatic client navigation. Falls back to a full page load on failure.
@@ -1 +1 @@
1
- import{disposeIslands as e,scanAndHydrate as t}from"../hydrate-runtime.js";import{bootServerIslands as n}from"../server-islands-boot.js";import{announceRoute as r,applyScroll as i,readScroll as a,restoreFocus as o}from"./a11y.js";import{clickModifiersFromEvent as s,eligibleNavigationUrl as c,linkAttributesFromAnchor as l}from"./eligibility.js";import{dispatchAfterSwap as u,dispatchBeforeNavigate as d,dispatchBeforeSwap as f,dispatchNavigationError as p,dispatchPageLoad as m,setNavigating as h}from"./events.js";import{applyGetSearchParams as g,eligibleFormNavigation as _,formSubmitFromEvent as v}from"./forms.js";import{ClientNavigationDisabledError as y,currentDocumentDisablesClientNavigation as b,documentDisablesClientNavigation as x,headerDisablesClientNavigation as S,htmlDisablesClientNavigation as C}from"./opt-out.js";import{extractPersisted as w,leftoverPersisted as T,restorePersisted as E}from"./persist.js";import{getCachedOrInflight as D,installPrefetchListeners as O,putCachedDocument as k,ROUTER_FETCH_HEADERS as A}from"./prefetch.js";import{copyHtmlAttributes as j,isHtmlResponse as M,parseHtmlDocument as N,reconcileHead as P,replaceBody as F}from"./swap.js";import{viewTransitionFromDataset as I,withViewTransition as L}from"./transitions.js";export{disposeIslands,scanAndHydrate}from"../hydrate-runtime.js";export{eligibleNavigationUrl,isModifiedClick}from"./eligibility.js";export{ROUTER_EVENTS}from"./events.js";export{prefetch}from"./prefetch.js";export{reconcileHead,replaceBody}from"./swap.js";let R=!1,z=!1,B=null;function V(){return location.pathname+location.search+location.hash}function H(){let e={...history.state,avalon:!0,scroll:a()};history.replaceState(e,``)}async function U(t,n){let r=T(t,n);if(r.length===0)return;let i=document.createDocumentFragment();for(let e of r)i.appendChild(e);await e(i)}function W(e,t,n){if(n)return;let r={avalon:!0,scroll:{x:0,y:0}};if(e===`replace`){history.replaceState(r,``,t);return}history.pushState(r,``,t)}function G(e,t){return I(t?.dataset.routerTransition)??I(e.dataset.routerTransition)}async function K(i,a,s,c,l){let d=V(),p=a.pathname+a.search+a.hash;if(x(i))throw new y(p);f({from:d,to:p,newDocument:i});let h=w(document.body);await e(document.body),await L(async()=>{P(document,i),j(document,i),F(document,i),await U(h,E(document.body,h)),W(s,p,c)},l),u({from:d,to:p}),t(document.body),await n(document.body),r(document.title),o(),m(p)}async function q(e,t){let n=new URL(e,location.href),r=D(n),i=r instanceof Promise?await r:r;if(i){if(C(i.html))throw new y(i.finalUrl);return{doc:N(i.html),finalUrl:new URL(i.finalUrl,location.href)}}let a=await fetch(e,{headers:A,redirect:`follow`,signal:t}),o=await Y(a),s=new URL(a.url||e,location.href);return k(n,o,s.href),{doc:N(o),finalUrl:s}}async function J(e,t,n){let r=await fetch(e.href,{method:`POST`,body:t,headers:A,redirect:`follow`,signal:n}),i=await Y(r),a=new URL(r.url||e.href,location.href);return{doc:N(i),finalUrl:a}}async function Y(e){if(S(e.headers))throw new y(e.url);if(!M(e.headers.get(`content-type`)))throw Error(`Non-HTML response (${e.headers.get(`content-type`)??`unknown`})`);let t=await e.text();if(C(t))throw new y(e.url);return t}async function X(e,t,n,r){if(z&&B?.abort(),b())throw new y(e.href);let i=t.history??(n?`auto`:`push`),a=V(),o=e.pathname+e.search+e.hash;if(!n&&!d({from:a,to:o,history:i}))return;n||H(),z=!0,h(!0),B=new AbortController;let s=B.signal;try{let{doc:a,finalUrl:o}=await(r?r(s):q(e.href,s));await K(a,o,i===`auto`?`push`:i,n,t.viewTransition),Z(e,n,t.scroll)}catch(e){if(s.aborted)return;throw e instanceof y||p(o,e),e}finally{s.aborted||(z=!1,h(!1))}}function Z(e,t,n){if(t){let t=history.state;i(t?.scroll??`top`,e.hash);return}n!==!1&&i(`top`,e.hash)}function Q(e){location.assign(e)}export async function navigate(e,t={}){let n=typeof e==`string`?new URL(e,location.href):e;if(n.origin!==location.origin){Q(n.href);return}try{await X(n,t,!1)}catch{Q(n.href)}}function $(e){if(e.defaultPrevented||b())return;let t=e.target;if(!(t instanceof Element))return;let n=t.closest(`a`);if(!(n instanceof HTMLAnchorElement)||n.closest(`svg`))return;let r=c(l(n),s(e),location);r&&(e.preventDefault(),navigate(r,{viewTransition:G(n)}).catch(()=>Q(r.href)))}function ee(e){if(e.defaultPrevented||b())return;let t=e.target;if(!(t instanceof HTMLFormElement))return;let n=e.submitter instanceof HTMLElement?e.submitter:null,r=_(v(t,n),location);if(!r)return;e.preventDefault();let i=G(t,n);if(r.method===`GET`){navigate(g(r.url,t,n),{viewTransition:i}).catch(()=>{t.submit()});return}let a=n instanceof HTMLButtonElement||n instanceof HTMLInputElement?new FormData(t,n):new FormData(t);X(r.url,{history:`push`,viewTransition:i},!1,e=>J(r.url,a,e)).catch(()=>{t.submit()})}function te(){let e=new URL(location.href);X(e,{history:`auto`},!0).catch(()=>Q(e.href))}function ne(e){return c(l(e),{defaultPrevented:!1,button:0,metaKey:!1,ctrlKey:!1,shiftKey:!1,altKey:!1},location)}export function installClientRouter(){R||typeof document>`u`||(R=!0,history.scrollRestoration=`manual`,document.addEventListener(`click`,$),document.addEventListener(`submit`,ee),window.addEventListener(`popstate`,te),O(ne))}installClientRouter();
1
+ import{disposeIslands as e,scanAndHydrate as t}from"../hydrate-runtime.js";import{bootServerIslands as n}from"../server-islands-boot.js";import{announceRoute as r,applyScroll as i,readScroll as a,restoreFocus as o}from"./a11y.js";import{clickModifiersFromEvent as s,eligibleNavigationUrl as c,linkAttributesFromAnchor as l}from"./eligibility.js";import{dispatchAfterSwap as u,dispatchBeforeNavigate as d,dispatchBeforeSwap as f,dispatchNavigationError as p,dispatchPageLoad as m,setNavigating as h}from"./events.js";import{applyGetSearchParams as g,eligibleFormNavigation as _,formSubmitFromEvent as v}from"./forms.js";import{ClientNavigationDisabledError as y,currentDocumentDisablesClientNavigation as b,documentDisablesClientNavigation as x,headerDisablesClientNavigation as S,htmlDisablesClientNavigation as C}from"./opt-out.js";import{clearViewTransitionGeometry as w,extractPersisted as T,leftoverPersisted as E,restorePersisted as ee}from"./persist.js";import{getCachedOrInflight as te,installPrefetchListeners as ne,putCachedDocument as re,ROUTER_FETCH_HEADERS as D}from"./prefetch.js";import{copyHtmlAttributes as O,isHtmlResponse as k,parseHtmlDocument as A,reconcileHead as j,replaceBody as M,replaceOutlets as N}from"./swap.js";import{skipInFlightViewTransition as P,viewTransitionFromDataset as F,withViewTransition as I}from"./transitions.js";export{disposeIslands,scanAndHydrate}from"../hydrate-runtime.js";export{eligibleNavigationUrl,isModifiedClick}from"./eligibility.js";export{ROUTER_EVENTS}from"./events.js";export{prefetch}from"./prefetch.js";export{reconcileHead,replaceBody,replaceOutlets}from"./swap.js";let L=!1,R=!1,z=null,B=0,V=Promise.resolve();function H(){return location.pathname+location.search+location.hash}function ie(){let e={...history.state,avalon:!0,scroll:a()};history.replaceState(e,``)}function U(e){let t=document.createDocumentFragment();for(let n of e)t.appendChild(n);return t}async function W(t,n){let r=E(t,n);if(r.length===0)return;let i=document.createDocumentFragment();for(let e of r)i.appendChild(e);await e(i)}function G(e,t,n){if(n)return;let r={avalon:!0,scroll:{x:0,y:0}};if(e===`replace`){history.replaceState(r,``,t);return}history.pushState(r,``,t)}function K(e,t){return e.history??(t?`auto`:`push`)}function q(e,t){return F(t?.dataset.routerTransition)??F(e.dataset.routerTransition)}async function J(e,t,n,r,i){let a=H(),o=t.pathname+t.search+t.hash;if(x(e))throw new y(o);let s=++B;P();let c,l=V;V=new Promise(e=>{c=e});try{if(await l,s!==B)return;await Y(e,{from:a,to:o,historyKind:n,isPop:r,viewTransition:i,generation:s})}finally{c()}}async function Y(i,a){let{from:s,to:c,historyKind:l,isPop:d,viewTransition:p,generation:h}=a;if(f({from:s,to:c,newDocument:i}),h!==B)return;let g=null;await I(()=>{if(h!==B)return;j(document,i),O(document,i);let e=N(document,i);if(e)g=e;else{g=document.body;let e=T(document.body);M(document,i),W(e,ee(document.body,e))}G(l,c,d)},p),h===B&&(g&&await e(Array.isArray(g)?U(g):g),w(document.body),u({from:s,to:c}),t(document.body),await n(document.body),r(document.title),o(),m(c))}async function ae(e,t){let n=new URL(e,location.href),r=te(n),i=r instanceof Promise?await r:r;if(i){if(C(i.html))throw new y(i.finalUrl);return{doc:A(i.html),finalUrl:new URL(i.finalUrl,location.href)}}let a=await fetch(e,{cache:`no-store`,headers:D,redirect:`follow`,signal:t}),o=await X(a),s=new URL(a.url||e,location.href);return re(n,o,s.href),{doc:A(o),finalUrl:s}}async function oe(e,t,n){let r=await fetch(e.href,{method:`POST`,body:t,headers:D,redirect:`follow`,signal:n}),i=await X(r),a=new URL(r.url||e.href,location.href);return{doc:A(i),finalUrl:a}}async function X(e){if(S(e.headers))throw new y(e.url);if(!k(e.headers.get(`content-type`)))throw Error(`Non-HTML response (${e.headers.get(`content-type`)??`unknown`})`);let t=await e.text();if(C(t))throw new y(e.url);return t}async function Z(e,t,n,r){if(R&&z?.abort(),b())throw new y(e.href);let i=K(t,n),a=H(),o=e.pathname+e.search+e.hash;if(!n&&!d({from:a,to:o,history:i}))return;n||ie(),R=!0,h(!0),z=new AbortController;let s=z.signal;try{let{doc:a,finalUrl:o}=await(r?r(s):ae(e.href,s));if(s.aborted||(await J(a,o,i===`auto`?`push`:i,n,t.viewTransition),s.aborted))return;se(e,n,t.scroll)}catch(e){if(s.aborted)return;throw e instanceof y||p(o,e),e}finally{s.aborted||(R=!1,h(!1))}}function se(e,t,n){if(t){let t=history.state;i(t?.scroll??`top`,e.hash);return}n!==!1&&i(`top`,e.hash)}function Q(e){location.assign(e)}export async function navigate(e,t={}){let n=typeof e==`string`?new URL(e,location.href):e;if(n.origin!==location.origin){Q(n.href);return}try{await Z(n,t,!1)}catch{Q(n.href)}}function ce(e){if(e.defaultPrevented||b())return;let t=e.target;if(!(t instanceof Element))return;let n=t.closest(`a`);if(!(n instanceof HTMLAnchorElement)||n.closest(`svg`))return;let r=c(l(n),s(e),location);r&&(e.preventDefault(),navigate(r,{viewTransition:q(n)}).catch(()=>Q(r.href)))}function le(e){if(e.defaultPrevented||b())return;let t=e.target;if(!(t instanceof HTMLFormElement))return;let n=e.submitter instanceof HTMLElement?e.submitter:null,r=_(v(t,n),location);if(!r)return;e.preventDefault();let i=q(t,n);if(r.method===`GET`){navigate(g(r.url,t,n),{viewTransition:i}).catch(()=>{t.submit()});return}let a=n instanceof HTMLButtonElement||n instanceof HTMLInputElement?new FormData(t,n):new FormData(t);Z(r.url,{history:`push`,viewTransition:i},!1,e=>oe(r.url,a,e)).catch(()=>{t.submit()})}function $(){let e=new URL(location.href);Z(e,{history:`auto`},!0).catch(()=>Q(e.href))}function ue(e){return c(l(e),{defaultPrevented:!1,button:0,metaKey:!1,ctrlKey:!1,shiftKey:!1,altKey:!1},location)}export function installClientRouter(){L||typeof document>`u`||(L=!0,history.scrollRestoration=`manual`,document.addEventListener(`click`,ce),document.addEventListener(`submit`,le),window.addEventListener(`popstate`,$),ne(ue))}installClientRouter();
@@ -7,6 +7,7 @@
7
7
  * is document-oriented.
8
8
  */
9
9
  export declare function persistKeyOf(el: HTMLElement): string | null;
10
+ export declare function hasPersistedNodes(root: ParentNode): boolean;
10
11
  /**
11
12
  * Detach persist nodes from `root` so a body swap does not destroy them.
12
13
  * Duplicate keys keep the first node. Nested persist nodes are ignored
@@ -19,3 +20,5 @@ export declare function extractPersisted(root: ParentNode): Map<string, HTMLElem
19
20
  */
20
21
  export declare function restorePersisted(root: ParentNode, saved: Map<string, HTMLElement>): Set<string>;
21
22
  export declare function leftoverPersisted(saved: Map<string, HTMLElement>, restored: Set<string>): HTMLElement[];
23
+ /** View Transitions can leave captured geometry on persist chrome. */
24
+ export declare function clearViewTransitionGeometry(root: ParentNode): void;
@@ -1 +1 @@
1
- const e=`[data-router-persist]`,t=new Set([`qwik`]);export function persistKeyOf(e){let t=e.dataset.routerPersist;if(t==null)return null;let n=t.trim();return n.length>0?n:null}function r(t){return!!t.parentElement?.closest(e)}function i(e){return e.dataset.framework&&t.has(e.dataset.framework)?!0:!!e.querySelector(`[data-framework='qwik']`)}function a(t){return[...t.querySelectorAll(e)].filter(e=>!r(e)&&persistKeyOf(e))}export function extractPersisted(e){let t=new Map;for(let r of a(e)){let e=persistKeyOf(r);!e||t.has(e)||i(r)||(t.set(e,r),r.remove())}return t}export function restorePersisted(e,t){let r=new Set;if(t.size===0)return r;for(let i of a(e)){let e=persistKeyOf(i);if(!e)continue;let a=t.get(e);!a||a===i||(i.replaceWith(a),r.add(e))}return r}export function leftoverPersisted(e,t){return[...e].filter(([e])=>!t.has(e)).map(([,e])=>e)}
1
+ const e=`[data-router-persist]`,t=new Set([`qwik`]);export function persistKeyOf(e){let t=e.dataset.routerPersist;if(t==null)return null;let n=t.trim();return n.length>0?n:null}function r(t){return!!t.parentElement?.closest(e)}function i(e){return e.dataset.framework&&t.has(e.dataset.framework)?!0:!!e.querySelector(`[data-framework='qwik']`)}function a(t){return[...t.querySelectorAll(e)].filter(e=>!r(e)&&persistKeyOf(e))}export function hasPersistedNodes(e){return a(e).length>0}export function extractPersisted(e){let t=new Map;for(let r of a(e)){let e=persistKeyOf(r);!e||t.has(e)||i(r)||(t.set(e,r),r.remove())}return t}export function restorePersisted(e,t){let r=new Set;if(t.size===0)return r;for(let i of a(e)){let e=persistKeyOf(i);if(!e)continue;let a=t.get(e);!a||a===i||(i.replaceWith(a),r.add(e))}return r}export function leftoverPersisted(e,t){return[...e].filter(([e])=>!t.has(e)).map(([,e])=>e)}const o=[`width`,`height`,`transform`,`translate`,`scale`,`top`,`left`,`right`,`bottom`,`inset`,`opacity`];export function clearViewTransitionGeometry(e){for(let t of a(e)){for(let e of o)t.style.getPropertyValue(e)&&t.style.removeProperty(e);t.getAttribute(`style`)===``&&t.removeAttribute(`style`)}}
@@ -1 +1 @@
1
- import{currentDocumentDisablesClientNavigation as e,headerDisablesClientNavigation as t,htmlDisablesClientNavigation as n}from"./opt-out.js";import{isHtmlResponse as r}from"./swap.js";const i=new Set([`slow-2g`,`2g`]);export const ROUTER_FETCH_HEADERS={Accept:`text/html`,"Avalon-Router":`1`};const o=new Map,s=new Map;export function cacheKeyFromUrl(e){return`${e.origin}${e.pathname}${e.search}`}export function clearPrefetchCache(){o.clear(),s.clear()}function l(){let e=navigator.connection;return e?e.saveData?!1:!i.has(e.effectiveType??``):!0}export function getCachedDocument(e,t=Date.now()){let n=cacheKeyFromUrl(e),r=o.get(n);return r?r.expiresAt<=t?(o.delete(n),null):r:null}export function getCachedOrInflight(e){return getCachedDocument(e)||(s.get(cacheKeyFromUrl(e))??null)}export function putCachedDocument(e,t,n,r=3e4,i=Date.now()){let a={html:t,expiresAt:i+r,finalUrl:n};if(o.set(cacheKeyFromUrl(e),a),n&&n!==e.href)try{o.set(cacheKeyFromUrl(new URL(n)),a)}catch{}}async function d(e,i){let o=cacheKeyFromUrl(e),c=getCachedDocument(e);if(c)return c;let l=s.get(o);if(l!==void 0)return l;let u=(async()=>{try{let o=await fetch(e.href,{headers:ROUTER_FETCH_HEADERS,redirect:`follow`,signal:i});if(!r(o.headers.get(`content-type`))||t(o.headers))return null;let s=await o.text();return n(s)?null:(putCachedDocument(e,s,o.url||e.href),getCachedDocument(e))}catch{return null}finally{s.delete(o)}})();return s.set(o,u),u}export async function prefetch(t){if(e()||!l())return;let n=typeof t==`string`?new URL(t,location.href):t;n.origin===location.origin&&await d(n)}function f(e){return!(e.dataset.routerPrefetch===`false`||e.dataset.routerReload!=null)}function p(e){let t=e.target;if(!(t instanceof Element))return null;let n=t.closest(`a`);return n instanceof HTMLAnchorElement?n:null}export function installPrefetchListeners(t){let n,r=null;function i(i){if(e()||!l()||!f(i))return;let a=t(i);if(!a)return;r?.abort(),n!==void 0&&clearTimeout(n),r=new AbortController;let o=r.signal;n=setTimeout(()=>{d(a,o)},80)}function a(){n!==void 0&&clearTimeout(n),n=void 0,r?.abort(),r=null}function o(e){let t=p(e);t&&i(t)}function s(e){let t=p(e);if(!t)return;let n=e.relatedTarget;n instanceof Node&&t.contains(n)||a()}return document.addEventListener(`pointerenter`,o,!0),document.addEventListener(`focusin`,o,!0),document.addEventListener(`pointerleave`,s,!0),()=>{a(),document.removeEventListener(`pointerenter`,o,!0),document.removeEventListener(`focusin`,o,!0),document.removeEventListener(`pointerleave`,s,!0)}}
1
+ import{currentDocumentDisablesClientNavigation as e,headerDisablesClientNavigation as t,htmlDisablesClientNavigation as n}from"./opt-out.js";import{isHtmlResponse as r}from"./swap.js";const i=new Set([`slow-2g`,`2g`]);export const ROUTER_FETCH_HEADERS={Accept:`text/html`,"Avalon-Router":`1`};const o=new Map,s=new Map;export function cacheKeyFromUrl(e){return`${e.origin}${e.pathname}${e.search}`}export function clearPrefetchCache(){o.clear(),s.clear()}function l(){let e=navigator.connection;return e?e.saveData?!1:!i.has(e.effectiveType??``):!0}export function getCachedDocument(e,t=Date.now()){let n=cacheKeyFromUrl(e),r=o.get(n);return r?r.expiresAt<=t?(o.delete(n),null):r:null}export function getCachedOrInflight(e){return getCachedDocument(e)||(s.get(cacheKeyFromUrl(e))??null)}export function putCachedDocument(e,t,n,r=3e4,i=Date.now()){let a={html:t,expiresAt:i+r,finalUrl:n};if(o.set(cacheKeyFromUrl(e),a),n&&n!==e.href)try{o.set(cacheKeyFromUrl(new URL(n)),a)}catch{}}async function d(e,i){let o=cacheKeyFromUrl(e),c=getCachedDocument(e);if(c)return c;let l=s.get(o);if(l!==void 0)return l;let u=(async()=>{try{let o=await fetch(e.href,{cache:`no-store`,headers:ROUTER_FETCH_HEADERS,redirect:`follow`,signal:i});if(!r(o.headers.get(`content-type`))||t(o.headers))return null;let s=await o.text();return n(s)?null:(putCachedDocument(e,s,o.url||e.href),getCachedDocument(e))}catch{return null}finally{s.delete(o)}})();return s.set(o,u),u}export async function prefetch(t){if(e()||!l())return;let n=typeof t==`string`?new URL(t,location.href):t;n.origin===location.origin&&await d(n)}function f(e){return!(e.dataset.routerPrefetch===`false`||e.dataset.routerReload!=null)}function p(e){let t=e.target;if(!(t instanceof Element))return null;let n=t.closest(`a`);return n instanceof HTMLAnchorElement?n:null}import.meta.hot&&import.meta.hot.on(`vite:beforeUpdate`,()=>{clearPrefetchCache()});export function installPrefetchListeners(t){let n,r=null;function i(i){if(e()||!l()||!f(i))return;let a=t(i);if(!a)return;r?.abort(),n!==void 0&&clearTimeout(n),r=new AbortController;let o=r.signal;n=setTimeout(()=>{d(a,o)},80)}function a(){n!==void 0&&clearTimeout(n),n=void 0,r?.abort(),r=null}function o(e){let t=p(e);t&&i(t)}function s(e){let t=p(e);if(!t)return;let n=e.relatedTarget;n instanceof Node&&t.contains(n)||a()}return document.addEventListener(`pointerenter`,o,!0),document.addEventListener(`focusin`,o,!0),document.addEventListener(`pointerleave`,s,!0),()=>{a(),document.removeEventListener(`pointerenter`,o,!0),document.removeEventListener(`focusin`,o,!0),document.removeEventListener(`pointerleave`,s,!0)}}
@@ -5,6 +5,8 @@
5
5
  * Page-specific SSR `<style>` tags (`data-universal-ssr`, `data-avalon-ssr-css`,
6
6
  * hashed `style[data-avalon-css]`) are copied from the next document.
7
7
  * Framework/dev markers (`data-avalon-*`, Vite client) are kept.
8
+ * Runtime-injected stylesheets marked `data-router-persist` stay in head —
9
+ * they are not in the next SSR document (Pagefind UI, etc.).
8
10
  * Script tags in the next document are not executed — server islands are
9
11
  * booted by the shared runtime after the swap.
10
12
  */
@@ -16,6 +18,14 @@ export declare function copyHtmlAttributes(current: Document, next: Document): v
16
18
  * consumed those templates; this is a no-op when `host.shadowRoot` exists.
17
19
  */
18
20
  export declare function attachDeclarativeShadowRoots(root: ParentNode): void;
21
+ export declare function outletKeyOf(el: HTMLElement): string | null;
22
+ /**
23
+ * Swap `[data-router-outlet]` regions when both documents share the same keys.
24
+ * Shared chrome (sidebar, header) stays in place so view transitions can
25
+ * crossfade only the page. Returns the detached outgoing nodes, or `null`
26
+ * when a full body replace is required.
27
+ */
28
+ export declare function replaceOutlets(current: Document, next: Document): HTMLElement[] | null;
19
29
  export declare function replaceBody(current: Document, next: Document): void;
20
30
  export declare function parseHtmlDocument(html: string): Document;
21
31
  export declare function isHtmlResponse(contentType: string | null): boolean;
@@ -1 +1 @@
1
- const e=/\/@vite\/client|\/src\/client\/main|entry-client|client\/router/,t=new Set([`icon`,`canonical`,`alternate`,`preload`]),n=`style[data-universal-ssr], style[data-avalon-ssr-css]`,r=new Set([`lang`,`data-router-navigating`,`style`,`data-router-transition`]);function i(e,t){return e.getAttribute(t)}function a(e){return e.getAttribute(`href`)||e.href}function o(e){return(i(e,`rel`)||``).toLowerCase()}function s(e){return e instanceof HTMLElement}function c(e){return`dataset`in e?e.dataset.avalonCss??``:``}function l(t){if(s(t)&&(t.dataset.avalonCss!=null||t.dataset.avalonBase!=null))return!0;if(t.tagName===`SCRIPT`){let n=i(t,`src`)??``;return e.test(n)}return t.tagName===`STYLE`&&s(t)&&t.dataset.avalonSsrCss!=null}function u(e){if(i(e,`charset`))return`charset`;let t=i(e,`name`);if(t)return`name:${t}`;let n=i(e,`property`);if(n)return`property:${n}`;let r=i(e,`http-equiv`);return r?`http-equiv:${r}`:`misc:${e.outerHTML}`}function d(e,t){let n=e.head.querySelectorAll(`meta`),r=[...t.head.querySelectorAll(`meta`)],a=new Set(r.map(e=>u(e)));for(let e of n)i(e,`charset`)||a.has(u(e))||e.remove();let o=new Set([...e.head.querySelectorAll(`meta`)].map(e=>u(e)));for(let t of r){if(i(t,`charset`))continue;let n=u(t);if(o.has(n)){[...e.head.querySelectorAll(`meta`)].find(e=>u(e)===n)?.replaceWith(e.importNode(t,!0));continue}e.head.appendChild(e.importNode(t,!0))}}function f(e){let t=[...e.head.querySelectorAll(`link`)],n=new Map,r=[];for(let e of t){let t=o(e);t===`stylesheet`||t===`preload`&&i(e,`as`)===`style`?n.set(a(e),e):r.push(e)}return{nextStyles:n,nextOther:r,nextLinks:t}}function p(e,t){s(e)&&e.dataset.avalonCss!=null||t.has(a(e))||e.remove()}function m(e,t){return t.some(t=>o(t)===`modulepreload`&&a(t)===e)}function h(e,t,n){for(let r of e.head.querySelectorAll(`link`)){let e=o(r);if(e===`stylesheet`){p(r,t);continue}l(r)||e===`modulepreload`&&!m(a(r),n)&&r.remove()}}function g(e,t){let n=new Set([...e.head.querySelectorAll(`link[rel="stylesheet"]`)].map(e=>a(e)));for(let[r,i]of t)n.has(r)||e.head.appendChild(e.importNode(i,!0))}function _(e,n){for(let n of e.head.querySelectorAll(`link`)){let e=o(n);e===`stylesheet`||e===`modulepreload`||l(n)||t.has(e)&&n.remove()}for(let r of n){let n=o(r);if(n===`modulepreload`){let t=a(r);[...e.head.querySelectorAll(`link[rel="modulepreload"]`)].some(e=>a(e)===t)||e.head.appendChild(e.importNode(r,!0));continue}t.has(n)&&e.head.appendChild(e.importNode(r,!0))}}export function reconcileHead(e,t){e.title=t.title,d(e,t);let{nextStyles:n,nextOther:r,nextLinks:i}=f(t);h(e,n,i),g(e,n),_(e,r),v(e,t)}function v(e,t){for(let t of e.head.querySelectorAll(n))t.remove();for(let r of t.head.querySelectorAll(n))e.head.appendChild(e.importNode(r,!0));let r=new Set([...e.head.querySelectorAll(`style[data-avalon-css]`)].map(e=>c(e)));for(let n of t.head.querySelectorAll(`style[data-avalon-css]`)){let t=c(n);!t||r.has(t)||(e.head.appendChild(e.importNode(n,!0)),r.add(t))}}export function copyHtmlAttributes(e,t){let n=t.documentElement,i=e.documentElement;i.lang=n.lang;for(let e of n.getAttributeNames()){if(r.has(e))continue;let t=n.getAttribute(e);t!==null&&i.setAttribute(e,t)}n.dataset.clientNavigation!==`false`&&delete i.dataset.clientNavigation}export function attachDeclarativeShadowRoots(e){let t=[...e.querySelectorAll(`template[shadowrootmode]`)];for(let e of t){let t=e.parentElement;if(!t)continue;if(t.shadowRoot){e.remove();continue}let n=e.getAttribute(`shadowrootmode`)===`closed`?`closed`:`open`;try{t.attachShadow({mode:n}).appendChild(e.content),e.remove()}catch{}}}export function replaceBody(e,t){e.body.replaceWith(e.adoptNode(t.body)),attachDeclarativeShadowRoots(e.body)}export function parseHtmlDocument(e){return new DOMParser().parseFromString(e,`text/html`)}export function isHtmlResponse(e){return e?e.toLowerCase().includes(`text/html`):!1}
1
+ const e=/\/@vite\/client|\/src\/client\/main|entry-client|client\/router/,t=new Set([`icon`,`canonical`,`alternate`,`preload`]),n=`style[data-universal-ssr], style[data-avalon-ssr-css]`,r=new Set([`lang`,`data-router-navigating`,`style`,`data-router-transition`]);function i(e,t){return e.getAttribute(t)}function a(e){return e.getAttribute(`href`)||e.href}function o(e){return(i(e,`rel`)||``).toLowerCase()}function s(e){return typeof HTMLElement<`u`&&e instanceof HTMLElement}function c(e){return`dataset`in e?e.dataset.avalonCss??``:``}function l(e){let t=i(e,`data-router-persist`);if(t==null)return null;let n=t.trim();return n.length>0?n:null}function u(t){if(l(t)||s(t)&&(t.dataset.avalonCss!=null||t.dataset.avalonBase!=null))return!0;if(t.tagName===`SCRIPT`){let n=i(t,`src`)??``;return e.test(n)}return t.tagName===`STYLE`&&s(t)&&t.dataset.avalonSsrCss!=null}function d(e){if(i(e,`charset`))return`charset`;let t=i(e,`name`);if(t)return`name:${t}`;let n=i(e,`property`);if(n)return`property:${n}`;let r=i(e,`http-equiv`);return r?`http-equiv:${r}`:`misc:${e.outerHTML}`}function f(e,t){let n=e.head.querySelectorAll(`meta`),r=[...t.head.querySelectorAll(`meta`)],a=new Set(r.map(e=>d(e)));for(let e of n)i(e,`charset`)||a.has(d(e))||e.remove();let o=new Set([...e.head.querySelectorAll(`meta`)].map(e=>d(e)));for(let t of r){if(i(t,`charset`))continue;let n=d(t);if(o.has(n)){[...e.head.querySelectorAll(`meta`)].find(e=>d(e)===n)?.replaceWith(e.importNode(t,!0));continue}e.head.appendChild(e.importNode(t,!0))}}function p(e){let t=[...e.head.querySelectorAll(`link`)],n=new Map,r=[];for(let e of t){let t=o(e);t===`stylesheet`||t===`preload`&&i(e,`as`)===`style`?n.set(a(e),e):r.push(e)}return{nextStyles:n,nextOther:r,nextLinks:t}}function m(e,t){u(e)||t.has(a(e))||e.remove()}function h(e,t){return t.some(t=>o(t)===`modulepreload`&&a(t)===e)}function g(e,t,n){for(let r of e.head.querySelectorAll(`link`)){let e=o(r);if(e===`stylesheet`){m(r,t);continue}u(r)||e===`modulepreload`&&!h(a(r),n)&&r.remove()}}function _(e,t){let n=new Set([...e.head.querySelectorAll(`link[rel="stylesheet"]`)].map(e=>a(e)));for(let[r,i]of t)n.has(r)||e.head.appendChild(e.importNode(i,!0))}function v(e,n){for(let n of e.head.querySelectorAll(`link`)){let e=o(n);e===`stylesheet`||e===`modulepreload`||u(n)||t.has(e)&&n.remove()}for(let r of n){let n=o(r);if(n===`modulepreload`){let t=a(r);[...e.head.querySelectorAll(`link[rel="modulepreload"]`)].some(e=>a(e)===t)||e.head.appendChild(e.importNode(r,!0));continue}t.has(n)&&e.head.appendChild(e.importNode(r,!0))}}export function reconcileHead(e,t){e.title=t.title,f(e,t);let{nextStyles:n,nextOther:r,nextLinks:i}=p(t);g(e,n,i),_(e,n),v(e,r),y(e,t)}function y(e,t){for(let t of e.head.querySelectorAll(n))t.remove();for(let r of t.head.querySelectorAll(n))e.head.appendChild(e.importNode(r,!0));let r=new Set([...e.head.querySelectorAll(`style[data-avalon-css]`)].map(e=>c(e)));for(let n of t.head.querySelectorAll(`style[data-avalon-css]`)){let t=c(n);!t||r.has(t)||(e.head.appendChild(e.importNode(n,!0)),r.add(t))}}export function copyHtmlAttributes(e,t){let n=t.documentElement,i=e.documentElement;i.lang=n.lang;for(let e of n.getAttributeNames()){if(r.has(e))continue;let t=n.getAttribute(e);t!==null&&i.setAttribute(e,t)}n.dataset.clientNavigation!==`false`&&delete i.dataset.clientNavigation}export function attachDeclarativeShadowRoots(e){let t=[...e.querySelectorAll(`template[shadowrootmode]`)];for(let e of t){let t=e.parentElement;if(!t)continue;if(t.shadowRoot){e.remove();continue}let n=e.getAttribute(`shadowrootmode`)===`closed`?`closed`:`open`;try{t.attachShadow({mode:n}).appendChild(e.content),e.remove()}catch{}}}export function outletKeyOf(e){let t=e.dataset.routerOutlet;if(t==null)return null;let n=t.trim();return n.length>0?n:null}function b(e){let t=new Map;for(let n of e.querySelectorAll(`[data-router-outlet]`)){let e=outletKeyOf(n);if(!e||t.has(e))return null;t.set(e,n)}return t.size>0?t:null}export function replaceOutlets(e,t){let n=b(e),r=b(t.body);if(!n||!r||n.size!==r.size)return null;for(let e of n.keys())if(!r.has(e))return null;let i=[];for(let[t,a]of n){let n=r.get(t);if(!n)return null;i.push(a),a.replaceWith(e.adoptNode(n))}return attachDeclarativeShadowRoots(e.body),i}export function replaceBody(e,t){e.body.replaceWith(e.adoptNode(t.body)),attachDeclarativeShadowRoots(e.body)}export function parseHtmlDocument(e){return new DOMParser().parseFromString(e,`text/html`)}export function isHtmlResponse(e){return e?e.toLowerCase().includes(`text/html`):!1}
@@ -4,6 +4,9 @@
4
4
  * On by default when the API exists. `false` skips the animation; a string
5
5
  * names it for CSS (`html[data-router-transition]` and, where supported,
6
6
  * `startViewTransition({ types })`). Reduced motion always skips the API.
7
+ *
8
+ * Only one transition may be active. A new navigation skips the in-flight
9
+ * one so `startViewTransition` is not called in an invalid state.
7
10
  */
8
11
  export type ViewTransitionMode = boolean | string;
9
12
  export interface ResolvedViewTransition {
@@ -14,4 +17,6 @@ export declare function prefersReducedMotion(): boolean;
14
17
  /** `data-router-transition` on a link, form, or submitter. Absent → default. */
15
18
  export declare function viewTransitionFromDataset(raw: string | undefined): ViewTransitionMode | undefined;
16
19
  export declare function resolveViewTransition(mode?: ViewTransitionMode): ResolvedViewTransition;
20
+ /** Abort the active view transition so a newer navigation can swap. */
21
+ export declare function skipInFlightViewTransition(): void;
17
22
  export declare function withViewTransition(update: () => void | Promise<void>, mode?: ViewTransitionMode): Promise<void>;
@@ -1 +1 @@
1
- export function prefersReducedMotion(){return!!globalThis.matchMedia?.(`(prefers-reduced-motion: reduce)`)?.matches}export function viewTransitionFromDataset(e){if(!(e==null||e===``))return e===`false`?!1:e===`true`?!0:e}export function resolveViewTransition(e){return e===!1||e===`false`?{enabled:!1}:typeof e==`string`&&e!==``&&e!==`true`?{enabled:!0,type:e}:{enabled:!0}}function r(e,t){let n=document,r=n.startViewTransition?.bind(n);if(r){if(t)try{return r({update:e,types:[t]})}catch{}return r(e)}}export async function withViewTransition(t,i){let{enabled:a,type:o}=resolveViewTransition(i);if(!a||prefersReducedMotion()){await t();return}let s=!1,c=async()=>{s||(s=!0,await t())},l=document.documentElement,u=o?l.dataset.routerTransition:void 0;o&&(l.dataset.routerTransition=o);try{let e=r(c,o);if(!e){await c();return}await e.finished}catch{await c()}finally{o&&(u===void 0?delete l.dataset.routerTransition:l.dataset.routerTransition=u)}}
1
+ export function prefersReducedMotion(){return!!globalThis.matchMedia?.(`(prefers-reduced-motion: reduce)`)?.matches}export function viewTransitionFromDataset(e){if(!(e==null||e===``))return e===`false`?!1:e===`true`?!0:e}export function resolveViewTransition(e){return e===!1||e===`false`?{enabled:!1}:typeof e==`string`&&e!==``&&e!==`true`?{enabled:!0,type:e}:{enabled:!0}}let r=null,i=!1;const a=[];function o(){if(!i){i=!0;return}return new Promise(e=>{a.push(()=>{i=!0,e()})})}function s(){let e=a.shift();if(e){e();return}i=!1}function c(){let e=r;if(!e)return null;r=null;try{e.skipTransition?.()}catch{}return e}export function skipInFlightViewTransition(){let e=c();e&&e.finished.catch(()=>{})}function u(){let e=c();if(e)return e.finished.catch(()=>{})}function d(e,t){let n=document,r=n.startViewTransition?.bind(n);if(r)try{if(t)try{return r({update:e,types:[t]})}catch{}return r(e)}catch{return}}export async function withViewTransition(t,i){let{enabled:a,type:c}=resolveViewTransition(i);if(!a||prefersReducedMotion()){await t();return}let l=!1,f=async()=>{l||(l=!0,await t())},p=document.documentElement,m=c?p.dataset.routerTransition:void 0;c&&(p.dataset.routerTransition=c);let h=o();h&&await h;let g;try{let e=u();e&&await e,g=d(f,c),g&&(r=g,g.finished.catch(()=>{}))}finally{s()}try{if(!g){await f();return}try{await g.finished}catch{await f()}finally{r===g&&(r=null)}}catch{await f()}finally{c&&(m===void 0?delete p.dataset.routerTransition:p.dataset.routerTransition=m)}}
@@ -11,5 +11,6 @@
11
11
  */
12
12
  /**
13
13
  * Register all built-in custom directives.
14
+ * Safe to call more than once — later calls are a no-op.
14
15
  */
15
16
  export declare function registerBuiltinDirectives(): void;
@@ -1 +1 @@
1
- import{registerHydrationDirective as e}from"./hydration-directives.js";export function registerBuiltinDirectives(){e(`on:delay`,{name:`on:delay`,script:(e,t,n)=>{setTimeout(t,Number.parseInt(n||`1000`,10))}}),e(`on:event`,{name:`on:event`,script:(e,t,n)=>{if(!n){t();return}let r=()=>{document.removeEventListener(n,r),t()};document.addEventListener(n,r,{once:!0})}}),e(`on:scroll`,{name:`on:scroll`,script:(e,t,n)=>{let r=Number.parseInt(n||`100`,10),i=()=>{globalThis.scrollY>=r&&(globalThis.removeEventListener(`scroll`,i),t())};globalThis.addEventListener(`scroll`,i,{passive:!0}),globalThis.scrollY>=r&&(globalThis.removeEventListener(`scroll`,i),t())}}),e(`on:match`,{name:`on:match`,script:(e,t,n)=>{if(!n){t();return}let r=globalThis.matchMedia(n);if(r.matches){t();return}let i=e=>{e.matches&&(r.removeEventListener(`change`,i),t())};r.addEventListener(`change`,i)}})}
1
+ import{isCustomDirective as e,registerHydrationDirective as t}from"./hydration-directives.js";export function registerBuiltinDirectives(){e(`on:delay`)||(t(`on:delay`,{name:`on:delay`,script:(e,t,n)=>{setTimeout(t,Number.parseInt(n||`1000`,10))}}),t(`on:event`,{name:`on:event`,script:(e,t,n)=>{if(!n){t();return}let r=()=>{document.removeEventListener(n,r),t()};document.addEventListener(n,r,{once:!0})}}),t(`on:scroll`,{name:`on:scroll`,script:(e,t,n)=>{let r=Number.parseInt(n||`100`,10),i=()=>{globalThis.scrollY>=r&&(globalThis.removeEventListener(`scroll`,i),t())};globalThis.addEventListener(`scroll`,i,{passive:!0}),globalThis.scrollY>=r&&(globalThis.removeEventListener(`scroll`,i),t())}}),t(`on:match`,{name:`on:match`,script:(e,t,n)=>{if(!n){t();return}let r=globalThis.matchMedia(n);if(r.matches){t();return}let i=e=>{e.matches&&(r.removeEventListener(`change`,i),t())};r.addEventListener(`change`,i)}}))}
@@ -1,4 +1,4 @@
1
1
  import{minifyCSS as e}from"./css-utils.js";import{injectFrameworkBaseCSS as t}from"./framework-base-css.js";import{getUniversalCSS as n}from"./universal-css-collector.js";function r(e){let t=0;for(let n of e)n===`{`?t++:n===`}`&&t--;return t}function i(e,t,n){let r=e.replaceAll(/\s+/g,` `).trim();if(r.startsWith(`/*`)&&r.endsWith(`*/`)){n.push(e.trimEnd());return}t.has(r)||(t.add(r),n.push(e.trimEnd()))}export function deduplicateCSSRules(e){if(!e.trim())return``;let t=new Set,n=e.split(`
2
2
  `),a=[],o=``,s=0;for(let e of n)s+=r(e),o+=`${e}\n`,s<=0&&o.trim()&&(i(o,t,a),o=``,s=0);return o.trim()&&a.push(o.trimEnd()),a.join(`
3
- `)}export function extractCriticalCSS(t=!0){let r=n(t);if(!r.trim())return``;let i=e(deduplicateCSSRules(r));return i.trim()?`<style data-critical-css="true">${i}</style>`:``}export function deferNonCriticalStylesheets(e){let t=/<link\s+([^>]*rel=["']stylesheet["'][^>]*)>/gi,n=[/syntax-highlight/i,/hljs/i,/prism/i,/highlight\.js/i];return e.replaceAll(t,(t,r,i)=>{if(e.slice(Math.max(0,i-32),i).toLowerCase().includes(`<noscript`))return t;let a=r.replace(/\s*\/\s*$/,``).trim();if(/\bmedia\s*=/i.test(a)||/data-critical/i.test(a))return t;let o=/href=["']([^"']+)["']/i.exec(a);if(!o)return t;let s=o[1],c=s.startsWith(`https://`)||s.startsWith(`http://`),l=/data-defer/i.test(a),u=!c&&n.some(e=>e.test(s));return!c&&!l&&!u?t:`${`<link ${a.replace(/\s*data-defer(?:=["'][^"']*["'])?\s*/gi,` `).trim()} media="print" onload="this.media='all'">`}\n${`<noscript><link rel="stylesheet" href="${s}"></noscript>`}`})}export function inlineCriticalCSS(e){let n=t(e),r=extractCriticalCSS(!0);return r&&n.includes(`</head>`)&&(n=n.replace(`</head>`,`${r}\n</head>`)),n=deferNonCriticalStylesheets(n),n=l(n),n}function l(e){let t=/href=["'](https:\/\/fonts\.googleapis\.com\/css2[^"']+)["']/gi,n=new Set,r;for(r=t.exec(e);r!==null;r=t.exec(e))n.add(r[1]);if(n.size===0)return e;let i=[];for(let t of n){let n=t.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`);new RegExp(String.raw`<link\s+[^>]*rel=["']preload["'][^>]*href=["']${n}["'][^>]*>`,`i`).test(e)||i.push(`<link rel="preload" href="${t}" as="style">`)}if(i.length===0)return e;let a=i.join(`
3
+ `)}export function extractCriticalCSS(t=!0){let r=n(t);if(!r.trim())return``;let i=e(deduplicateCSSRules(r));return i.trim()?`<style data-critical-css="true">${i}</style>`:``}export function deferNonCriticalStylesheets(e){return e.replaceAll(/<link\s+([^>]*rel=["']stylesheet["'][^>]*)>/gi,(t,n,r)=>{if(e.slice(Math.max(0,r-32),r).toLowerCase().includes(`<noscript`))return t;let i=n.replace(/\s*\/\s*$/,``).trim();if(/\bmedia\s*=/i.test(i)||/data-critical/i.test(i))return t;let a=/href=["']([^"']+)["']/i.exec(i);if(!a)return t;let o=a[1],s=o.startsWith(`https://`)||o.startsWith(`http://`),c=/data-defer/i.test(i);return!s&&!c?t:`${`<link ${i.replace(/\s*data-defer(?:=["'][^"']*["'])?\s*/gi,` `).trim()} media="print" onload="this.media='all'">`}\n${`<noscript><link rel="stylesheet" href="${o}"></noscript>`}`})}export function inlineCriticalCSS(e){let n=t(e),r=extractCriticalCSS(!0);return r&&n.includes(`</head>`)&&(n=n.replace(`</head>`,`${r}\n</head>`)),n=deferNonCriticalStylesheets(n),n=l(n),n}function l(e){let t=/href=["'](https:\/\/fonts\.googleapis\.com\/css2[^"']+)["']/gi,n=new Set,r;for(r=t.exec(e);r!==null;r=t.exec(e))n.add(r[1]);if(n.size===0)return e;let i=[];for(let t of n){let n=t.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`);new RegExp(String.raw`<link\s+[^>]*rel=["']preload["'][^>]*href=["']${n}["'][^>]*>`,`i`).test(e)||i.push(`<link rel="preload" href="${t}" as="style">`)}if(i.length===0)return e;let a=i.join(`
4
4
  `);return e.includes(`</title>`)?e.replace(`</title>`,`</title>\n${a}`):e}
@@ -1 +1 @@
1
- const e=new Map;export function registerHydrationDirective(t,n){e.has(t)&&console.warn(`[avalon] Hydration directive "${t}" is already registered. Overwriting.`),e.set(t,n)}export function unregisterHydrationDirective(t){return e.delete(t)}export function isCustomDirective(t){return e.has(t)}export function getDirective(t){return e.get(t)}export function getRegisteredDirectives(){return[...e.keys()]}export function serializeDirectiveScript(t){let n=e.get(t);return n?typeof n.script==`string`?n.script:n.script.toString():null}export function clearDirectives(){e.clear()}
1
+ const e=new Map;export function registerHydrationDirective(t,n){e.has(t)||e.set(t,n)}export function unregisterHydrationDirective(t){return e.delete(t)}export function isCustomDirective(t){return e.has(t)}export function getDirective(t){return e.get(t)}export function getRegisteredDirectives(){return[...e.keys()]}export function serializeDirectiveScript(t){let n=e.get(t);return n?typeof n.script==`string`?n.script:n.script.toString():null}export function clearDirectives(){e.clear()}
@@ -56,4 +56,6 @@ export interface PostBuildOptions {
56
56
  * Exported for unit tests.
57
57
  */
58
58
  export declare function patchSSRBundleCSS(ssrBundlePath: string, distDir: string, cwd: string): boolean;
59
+ /** True when the built server lives under Netlify's functions tree. */
60
+ export declare function isNetlifyHandler(serverEntryPath: string): boolean;
59
61
  export declare function runPostBuild(options?: PostBuildOptions): Promise<void>;
@@ -1,7 +1,7 @@
1
1
  import{copyFileSync as e,cpSync as t,existsSync as n,mkdirSync as r,readdirSync as i,readFileSync as a,statSync as o,unlinkSync as s,writeFileSync as c}from"node:fs";import{basename as l,dirname as u,join as d,relative as f}from"node:path";import{patchCloudflareWorkerOutput as p}from"./cloudflare-worker-patch.js";import{fetchHandlerWrapperSource as m}from"./fetch-handler-wrapper.js";function h(e,t,r=[]){if(!n(e))return r;for(let n of i(e,{withFileTypes:!0})){let i=d(e,n.name);n.isDirectory()?h(i,t,r):t(n.name)&&r.push(i)}return r}function g(e){try{return o(e).isFile()}catch{return!1}}function _(e){let t=d(e,`dist`,`_worker.js`);if(g(t))return t;if(!n(t))return null;for(let e of[`index.js`,`index.mjs`]){let n=d(t,e);if(g(n))return n}return null}function v(e){let t=d(e,`dist`,`_worker.js`,`_ssr`,`ssr.mjs`);return g(t)?t:null}function y(e){if(!n(e))return!1;let t=a(e,`utf-8`);return t.length<500&&!t.includes(`data-framework`)&&!t.includes(`avalon`)}function b(e){for(let t of[`dist/index.html`,`.netlify/functions-internal/server/public/index.html`,`.output/public/index.html`]){let r=d(e,t);y(r)?(s(r),console.log(`[cleanup] Removed stale Vite template ${t}`)):n(r)&&console.log(`[cleanup] Kept ${t} (not a Vite template)`)}}function x(e){return e.replaceAll(/\/\*[\s\S]*?\*\//g,``).replaceAll(/\s+/g,` `).replaceAll(/\s*([{}:;,])\s*/g,`$1`).trim()}export function patchSSRBundleCSS(e,t,r){if(!g(e))return!1;let i=[d(t,`assets`),d(r,`.netlify`,`functions-internal`,`server`,`public`,`assets`),d(r,`.output`,`public`,`assets`)].find(e=>n(e));if(!i)return!1;let o=h(i,e=>e.endsWith(`.css`)).filter(e=>{let t=(e.split(`/`).pop()||``).toLowerCase();return t.includes(`_isolated-island-entry`)?!1:!!(t.startsWith(`entry-client`)||t.startsWith(`index-`))}).map(e=>`/assets${e.substring(i.length).replaceAll(`\\`,`/`)}`);if(!o.some(e=>/\/index-[^/]+\.css$/.test(e))){let e=h(i,e=>e.endsWith(`.css`)).filter(e=>(e.split(`/`).pop()||``).toLowerCase().startsWith(`ssr-index`)).map(e=>`/assets${e.substring(i.length).replaceAll(`\\`,`/`)}`);o.push(...e)}console.log(`[patch] Found ${o.length} CSS files in ${i}`);let s=a(e,`utf-8`),l=[{re:/"css"\s*:\s*\[((?:\s*\{\s*"href"\s*:\s*"[^"]+"\s*\}\s*,?)*)\]/,hrefRe:/"href"\s*:\s*"([^"]+)"/g,formatEntry:e=>`{ "href": "${e}" }`,rebuild:(e,t)=>{let n=e.trim().replace(/,\s*$/,``);return`"css": [${[...n?[n]:[],...t].join(`, `)}]`}},{re:/css:\[(\{href:`[^`]+`\}(?:,\{href:`[^`]+`\})*)\]/,hrefRe:/href:`([^`]+)`/g,formatEntry:e=>`{href:\`${e}\`}`,rebuild:(e,t)=>`css:[${e},${t.join(`,`)}]`},{re:/css:\[(\{href:"[^"]+"\}(?:,\{href:"[^"]+"\})*)\]/,hrefRe:/href:"([^"]+)"/g,formatEntry:e=>`{href:"${e}"}`,rebuild:(e,t)=>`css:[${e},${t.join(`,`)}]`}];for(let{re:t,hrefRe:n,formatEntry:r,rebuild:i}of l){let a=t.exec(s);if(!a)continue;let l=new Set([...a[1].matchAll(n)].map(e=>e[1])),u=o.filter(e=>!l.has(e));if(u.length===0)return console.log(`[patch] All CSS already included`),!0;let d=u.map(r);return s=s.replace(a[0],i(a[1],d)),c(e,s),console.log(`[patch] ✅ Added ${u.length} CSS files to SSR bundle`),!0}return console.warn(`[patch] Could not find CSS array in SSR bundle`),!1}function C(e,t){let o=d(t,`assets`);if(n(o)&&i(o).some(e=>e.startsWith(`entry-client`)&&e.endsWith(`.css`))){console.log(`[ssr-css] Skipped — client build already includes entry-client CSS`);return}let s=[d(e,`node_modules`,`.nitro`,`vite`,`services`,`ssr`,`assets`)];for(let o of s){if(!n(o))continue;let s=i(o).filter(e=>e.endsWith(`.css`));if(s.length===0)continue;let l=[d(t,`assets`),d(e,`.output`,`public`,`assets`),d(e,`.netlify`,`functions-internal`,`server`,`public`,`assets`)];for(let e of l){r(e,{recursive:!0});for(let t of s){let n=a(d(o,t),`utf-8`);n=x(n),c(d(e,`ssr-${t}`),n)}}let u=`ssr-${s[0]}`,f=d(l.find(e=>n(e))||l[0],u),p=n(f)?a(f).length:0;console.log(`[ssr-css] Copied SSR CSS → /assets/${u} (${p} bytes, minified)`);let m=[d(e,`.output`,`server`,`index.mjs`),d(e,`.netlify`,`functions-internal`,`server`,`main.mjs`)];for(let e of m){if(!n(e))continue;let t=a(e,`utf-8`),r=`/assets/${u}`;if(t.includes(r))continue;let i=/"\/assets\/[^"]+\.css":\{type:`text\/css[^}]+\}/.exec(t);if(i){let n=new Date().toISOString(),a=`,"${r}":{type:\`text/css; charset=utf-8\`,etag:\`${`"${p.toString(16)}-ssr"`}\`,mtime:\`${n}\`,size:${p},path:\`../public/assets/${u}\`}`;t=t.replace(i[0],i[0]+a),c(e,t),console.log(`[ssr-css] ✅ Patched asset manifest in ${e}`)}}return}console.log(`[ssr-css] No SSR CSS files found`)}async function w(e,t){let r=d(t,`islands`);if(!n(r)){console.log(`[islands] No islands directory found, skipping isolation`);return}let i=h(r,e=>e.endsWith(`.js`)&&!e.endsWith(`.js.map`));if(!i.some(e=>{let t=a(e,`utf-8`);return t.includes(`from"../`)||t.includes(`from'../`)})){console.log(`[islands] All islands are self-contained`);return}try{let{buildIsolatedIslands:r}=await import(`./isolated-island-builder.js`),o=new Map;for(let r of i){let i=f(t,r).replaceAll(`\\`,`/`).replace(/^islands\//,``).replace(/\.js$/,``),s=a(r,`utf-8`),c=`preact`;i.includes(`.solid`)?c=`solid`:i.includes(`.vue`)||i.endsWith(`.vue`)?c=`vue`:i.includes(`.svelte`)||i.endsWith(`.svelte`)?c=`svelte`:i.includes(`.lit`)?c=`lit`:i.includes(`.qwik`)?c=`qwik`:i.includes(`.react`)?c=`react`:i.includes(`.preact`)&&(c=`preact`);let l=/from["']((?:\/|\.\/)[^"']+\.(tsx|ts|jsx|js|vue|svelte))["']/i.exec(s),u;if(l&&!l[1].includes(`/assets/`)&&!l[1].startsWith(`../`))u=l[1];else{let t=i;u=[`${t}.tsx`,`${t}.ts`,`${t}.jsx`,`${t}.js`,`${t}`].find(t=>n(d(e,t)))??`${t}.tsx`}u.startsWith(`src/islands/`)&&(u=u.slice(12)),u.startsWith(`/`)||(u=`/${u}`),o.set(i,{filePath:u,bundleKey:i,framework:c})}await r(e,t,o,[],{})}catch{console.warn(`[islands] Isolated rebuild failed, falling back to inline-islands`);try{let{inlineIslandChunks:e}=await import(`./inline-islands.js`);await e(t,{verbose:!0})}catch(e){console.error(`[islands] Inline fallback also failed:`,e)}}}function T(e,r){let i=d(r,`islands`);if(!n(i))return;let a=[d(e,`.output`,`public`),d(e,`.netlify`,`functions-internal`,`server`,`public`)];for(let e of a)n(e)&&t(i,d(e,`islands`),{recursive:!0,force:!0});console.log(`[islands] Synced isolated islands to output directories`)}function E(e){let t=d(e,`islands`);if(!n(t))return;let r=h(t,e=>e.endsWith(`.js`)&&!e.endsWith(`.js.map`));if(r.length===0)return;let i=[];for(let t of r){let n=t.substring(e.length).replaceAll(`\\`,`/`);i.push(`${n} ${n} 200`)}let o=d(e,`_redirects`),s=n(o)?a(o,`utf-8`):``;c(o,s?`${s}\n${i.join(`
2
2
  `)}`:i.join(`
3
- `)),console.log(`[redirects] Generated ${i.length} island redirect(s)`)}function D(e,a){let o=d(e,`node_modules`,`@useavalon`);if(!n(o))return;let s=[d(a,`adapters`),d(e,`.output`,`public`,`adapters`),d(e,`.netlify`,`functions-internal`,`server`,`public`,`adapters`)];for(let e of s){if(!n(u(e)))continue;let a=i(o).map(e=>d(o,e,`client`)).filter(e=>n(e));for(let n of a){let i=d(e,n.split(`/`).at(-2)||``);r(i,{recursive:!0}),t(n,i,{recursive:!0,force:!0})}}console.log(`[adapters] Copied framework adapters to output directories`)}function O(e){let i=d(e,`.netlify`,`functions-internal`),a=d(e,`.netlify`,`v1`,`functions`);n(i)&&(r(a,{recursive:!0}),t(i,a,{recursive:!0,force:!0}),console.log(`[netlify] Copied server function to v1 API paths`))}function k(e){if(!n(e))return!1;let t=a(e,`utf-8`);return t.includes(`netlify`)||t.includes(`lambda`)}function A(e,t){let n=d(u(e),`_prerender-server.mjs`);return c(n,m(`./${l(e)}`,t)),n}function j(e){let t=/<a\s+[^>]*href=["']([^"']+)["'][^>]*>/gi,n=[],r;for(r=t.exec(e);r!==null;r=t.exec(e)){let e=r[1],t=e.indexOf(`#`);t!==-1&&(e=e.substring(0,t));let i=e.indexOf(`?`);i!==-1&&(e=e.substring(0,i)),e&&e.startsWith(`/`)&&!e.startsWith(`//`)&&!e.includes(`.`)&&n.push(e)}return n}async function M(t,i,o,l,p=!1){let m=_(t),h=[d(t,`.netlify`,`functions-internal`,`server`,`server.mjs`),d(t,`.netlify`,`v1`,`functions`,`server`,`server.mjs`),d(t,`.output`,`server`,`index.mjs`),...m?[m]:[]].find(e=>n(e));if(!h){console.log(`[prerender] No server entry found, skipping prerender`);return}let v=[d(t,`.output`,`public`),i].find(e=>n(e));if(!v){console.log(`[prerender] No output directory found, skipping prerender`);return}let y={routes:o.routes??[`/`],crawlLinks:o.crawlLinks??!0,ignore:o.ignore??[],failOnError:o.failOnError??!1,concurrency:o.concurrency??4,autoSubfolderIndex:o.autoSubfolderIndex??!0,retry:o.retry??3,retryDelay:o.retryDelay??500},b=`http://localhost:${l}`,x=k(h),S=m!==null&&h===m,C=h;if(x){let e=d(u(h),`main.mjs`);if(!n(e)){console.error(`[prerender] Netlify handler detected but main.mjs not found`);return}C=A(e,l),console.log(`[prerender] Netlify handler detected — using wrapper`)}else S&&(C=A(h,l),console.log(`[prerender] Cloudflare worker detected — using wrapper`));{let e=[h,d(u(h),`main.mjs`)].filter(e=>g(e));for(let n of e){let e=a(n,`utf-8`),r=/"\/[^"]*\.html":\{[^}]+\},?/g,i=e.length;e=e.replaceAll(r,``),i!==e.length&&(c(n,e),console.log(`[prerender] Patched ${f(t,n)}: removed HTML asset entries`))}}console.log(`[prerender] Starting prerender with server: ${f(t,C)}`);let{spawn:w}=await import(`node:child_process`),T;try{T=w(`node`,[C],{env:{...process.env,PORT:String(l),NITRO_PORT:String(l),HOST:`127.0.0.1`,NITRO_HOST:`127.0.0.1`,NODE_ENV:`production`},stdio:[`ignore`,`pipe`,`pipe`]}),T.stdout?.on(`data`,e=>{let t=e.toString().trim();t&&console.log(`[prerender:server] ${t}`)}),T.stderr?.on(`data`,e=>{let t=e.toString().trim();t&&console.error(`[prerender:server:err] ${t}`)});let e=Date.now(),t=!1;for(;Date.now()-e<15e3;){try{let e=await fetch(`${b}/`);if(e.ok||e.status<500){t=!0;break}}catch{}await new Promise(e=>setTimeout(e,200))}if(!t)throw Error(`Server did not become ready within 15s`);console.log(`[prerender] Server ready at ${b}`)}catch(e){T?.kill(`SIGKILL`),console.error(`[prerender] Failed to start server:`,e.message);return}let E=new Set,D=[...y.routes],O=[],M=[];function N(e){for(let t of y.ignore)if(typeof t==`string`&&e===t||typeof t==`string`&&t.endsWith(`/**`)&&e.startsWith(t.slice(0,-2)))return!0;return!1}try{for(;D.length>0;){let e=D.splice(0,y.concurrency);await Promise.all(e.map(async e=>{let t=e.endsWith(`/`)&&e!==`/`?e.slice(0,-1):e;if(E.has(t)||(E.add(t),N(t)))return;let n=null;for(let e=1;e<=y.retry;e++)try{let e=await fetch(`${b}${t}`);n={html:await e.text(),status:e.status};break}catch{e<y.retry&&await new Promise(e=>setTimeout(e,y.retryDelay))}if(!n){M.push({route:t,error:`Failed after ${y.retry} attempts`});return}if(n.status>=400){M.push({route:t,error:`Returned ${n.status}`});return}let i=y.autoSubfolderIndex?d(t,`index.html`):`${t}.html`,a=d(v,i);r(u(a),{recursive:!0});let o=n.html.replace(`<!DOCTYPE html>`,`<!DOCTYPE html>
4
- <!-- SSG: prerendered at build time -->`).replaceAll(/<link rel="stylesheet" href="\/assets\/[^"]*\.css">\n?/g,e=>e.includes(`_isolated-island-entry`)?``:e);if(p||(o=o.replaceAll(/<script type="module" src="\/assets\/entry-client[^"]*\.js"><\/script>\n?/g,``)),(/\/assets\/(?:ssr-)?index-[^"]+\.css/.test(o)||/<style data-inlined-from="\/assets\/(?:ssr-)?index-/.test(o))&&(o=o.replaceAll(/<link rel="stylesheet" href="\/assets\/entry-client[^"]*\.css">\n?/g,``)),p||(o=o.replaceAll(/<link rel="modulepreload" href="\/assets\/entry-client[^"]*\.js">\n?/g,``)),c(a,o),O.push(t),console.log(`[prerender] ✅ ${t} → ${i}`),y.crawlLinks)for(let e of j(n.html)){let t=e.endsWith(`/`)&&e!==`/`?e.slice(0,-1):e;!E.has(t)&&!N(t)&&D.push(t)}}))}}finally{console.log(`[prerender] Shutting down server...`),T?.kill(`SIGKILL`)}if(console.log(`[prerender] Done: ${O.length} page(s) prerendered`+(M.length>0?`, ${M.length} error(s)`:``)),x||S){let e=d(u(h),`_prerender-server.mjs`);n(e)&&(s(e),console.log(`[prerender] Cleaned up wrapper script`))}if(O.length>0){let a=[i,d(t,`.netlify`,`functions-internal`,`server`,`public`),d(t,`.netlify`,`v1`,`functions`,`server`,`public`)].filter(e=>e!==v&&n(u(e)));for(let t of a)for(let i of O){let a=d(i,`index.html`),o=d(v,a),s=d(t,a);n(o)&&(r(u(s),{recursive:!0}),e(o,s))}a.length>0&&console.log(`[prerender] Copied prerendered HTML to ${a.length} additional output dir(s)`)}}function N(e,t){let r={},i=d(t,`island-deps.json`);if(n(i))try{r=JSON.parse(a(i,`utf-8`))}catch{}let o=d(e,`.output`,`public`);if(Object.keys(r).length===0&&n(o)){let e=h(d(o,`islands`),e=>e.endsWith(`.js`)&&!e.endsWith(`.js.map`));for(let t of e){let e=`/${t.substring(o.length+1).replaceAll(`\\`,`/`)}`,n=a(t,`utf-8`),i=/\bfrom\s*["']([^"']+)["']|import\s*["']([^"']+)["']/g,s=[],c;for(c=i.exec(n);c!==null;c=i.exec(n)){let t=c[1]||c[2];if(t&&(t.includes(`/assets/`)||t.startsWith(`.`))){let n=(t.startsWith(`.`)?`/${d(u(e.slice(1)),t).replaceAll(`\\`,`/`).replace(/^\/+/,``)}`:t).split(`/`).filter(Boolean),r=[];for(let e of n)e===`..`?r.pop():e!==`.`&&r.push(e);s.push(`/${r.join(`/`)}`)}}s.length>0&&(r[e]=s)}}if(Object.keys(r).length===0)return;let s=[d(e,`.output`,`public`),t],l=0;for(let e of s){if(!n(e))continue;let t=h(e,e=>e===`index.html`);for(let e of t){let t=a(e,`utf-8`),n=new Set;for(let[e,i]of Object.entries(r))if(t.includes(e))for(let e of i)t.includes(`href="${e}"`)||n.add(e);if(n.size===0)continue;let i=Array.from(n).map(e=>`<link rel="modulepreload" href="${e}">`).join(`
5
- `);t.includes(`</head>`)&&(t=t.replace(`</head>`,`${i}\n</head>`),c(e,t),l++)}}l>0&&console.log(`[modulepreload] ✅ Injected dependency preloads into ${l} HTML file(s)`)}const P=[/syntax-highlight/i,/hljs/i,/prism/i,/highlight\.js/i];function F(e,t){let r=[d(e,`.output`,`public`),t],i=L(r),o=0;for(let e of r){if(!n(e))continue;let t=h(e,e=>e===`index.html`);for(let e of t){let t=a(e,`utf-8`),n=t;t=R(t,i),t=I(t),t=z(t),t=B(t),t!==n&&(c(e,t),o++)}}o>0&&console.log(`[post-build] Optimized ${o} HTML file(s) — deferred non-critical CSS, added font preload hints`)}function I(e){if(!e.includes(`</head>`)||!e.includes(`<body`))return e;let t=e.indexOf(`</head>`),n=e.indexOf(`<body`);if(t===-1||n===-1||n<t)return e;let r=e.substring(n),i=new Set,a=[],o=``,s=0,c=0;for(;c<r.length;){if(r[c]===`<`){if(r.startsWith(`<template`,c)){s++;let e=r.indexOf(`>`,c);if(e===-1)break;o+=r.substring(c,e+1),c=e+1;continue}if(r.startsWith(`</template>`,c)){s=Math.max(0,s-1),o+=`</template>`,c+=11;continue}if(s===0&&r.startsWith(`<style`,c)){let e=r.indexOf(`</style>`,c);if(e===-1)break;let t=r.substring(c,e+8),n=/<style[^>]*>([\s\S]*?)<\/style>/.exec(t);if(n){let e=n[1].replaceAll(/\s+/g,` `).trim();e&&!i.has(e)&&(i.add(e),a.push(`<style>${e}</style>`))}c=e+8;continue}}o+=r[c],c++}return a.length===0?e:`${e.substring(0,t)}\n${a.join(`
6
- `)}\n</head>${o}`}function L(e){let t=new Map;for(let r of e){let e=d(r,`assets`);if(n(e))for(let n of i(e))n.endsWith(`.css`)&&t.set(`/assets/${n}`,a(d(e,n),`utf-8`))}return t}function R(e,t){let n=/<link\s+rel="stylesheet"\s+href="(\/assets\/(?:ssr-)?index-[^"]+\.css)">/i.exec(e);if(!n)return e;let r=n[1],i=t.get(r);if(!i)return e;if(Buffer.byteLength(i,`utf-8`)<=14336){let t=`<style data-inlined-from="${r}">${i}</style>`;return e.replace(n[0],t)}let a=`<link rel="preload" href="${r}" as="style">`;return e.includes(`</title>`)&&!e.includes(`preload" href="${r}"`)&&(e=e.replace(`</title>`,`</title>\n${a}`)),e}function z(e){return e.replaceAll(/<link\s+([^>]*rel=["']stylesheet["'][^>]*)>/gi,(t,n,r)=>{if(e.slice(Math.max(0,r-32),r).toLowerCase().includes(`<noscript`))return t;let i=n.replace(/\s*\/\s*$/,``).trim();if(/\bmedia\s*=/i.test(i)||/data-critical/i.test(i))return t;let a=/href=["']([^"']+)["']/i.exec(i);if(!a)return t;let o=a[1],s=o.startsWith(`https://`)||o.startsWith(`http://`),c=!s&&P.some(e=>e.test(o));return!s&&!c?t:`<link ${i} media="print" onload="this.media='all'">\n<noscript><link ${i}></noscript>`})}function B(e){let t=/href=["'](https:\/\/fonts\.googleapis\.com\/css2[^"']+)["']/gi,n=new Set,r;for(r=t.exec(e);r!==null;r=t.exec(e))n.add(r[1]);if(n.size===0)return e;let i=[];for(let t of n){let n=t.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`);new RegExp(String.raw`<link\s+[^>]*rel=["']preload["'][^>]*href=["']${n}["'][^>]*>`,`i`).test(e)||i.push(`<link rel="preload" href="${t}" as="style">`)}if(i.length===0)return e;let a=i.join(`
7
- `);return e.includes(`</title>`)?e.replace(`</title>`,`</title>\n${a}`):e}async function V(e){let{promisify:t}=await import(`node:util`),r=await import(`node:zlib`),i=t(r.brotliCompress),o=t(r.gzip),s=[d(e,`.output`,`public`),d(e,`.netlify`,`functions-internal`,`server`,`public`)],l=e=>e.endsWith(`.js`)||e.endsWith(`.css`)||e.endsWith(`.html`)||e.endsWith(`.svg`)||e.endsWith(`.txt`)||e.endsWith(`.xml`)||e.endsWith(`.json`),u=0;for(let e of s){if(!n(e))continue;let t=h(e,e=>l(e)&&!e.endsWith(`.map`));for(let e of t){let t=a(e);if(!(t.length<256))try{let[n,a]=await Promise.all([i(t,{params:{[r.constants.BROTLI_PARAM_QUALITY]:11}}),o(t,{level:9})]);c(`${e}.br`,n),c(`${e}.gz`,a),u++}catch{}}}u>0&&console.log(`[compress] ✅ Compressed ${u} public asset(s) (brotli + gzip)`)}function H(e){let t=[d(e,`.output`,`server`,`index.mjs`),d(e,`.netlify`,`functions-internal`,`server`,`index.mjs`)],r=d(e,`.output`,`public`);if(!n(r))return;let i=U(r);if(i.length===0)return;let a=0;for(let e of t)W(e,i,r)&&a++;a>0&&console.log(`[manifest] ✅ Registered ${i.length} prerendered HTML file(s) in Nitro asset manifest`)}function U(e){let t=h(e,e=>e===`index.html`||e===`index.html.br`||e===`index.html.gz`||e===`index.html.zst`),n=[],r=new Date().toISOString();for(let i of t){let t=`/${i.substring(e.length+1).replaceAll(`\\`,`/`)}`,o=a(i).length,s=`"${o.toString(16)}-prerender"`,c=``;t.endsWith(`.br`)?c=`br`:t.endsWith(`.gz`)?c=`gzip`:t.endsWith(`.zst`)&&(c=`zstd`);let l=`"${t}":{type:\`text/html; charset=utf-8\``;c&&(l+=`,encoding:\`${c}\``),l+=`,etag:\`${s}\`,mtime:\`${r}\`,size:${o},path:\`../public${t}\`}`,n.push(l)}return n}function W(e,t,r){if(!n(e))return!1;let i=a(e,`utf-8`),o=/("\/favicon\.ico":\{[^}]+\})/.exec(i);if(!o)return!1;let s=t.filter(e=>{let t=/^"([^"]+)"/.exec(e);return t&&!i.includes(`"${t[1]}":{`)});s.length>0&&(i=i.replace(o[0],`${o[0]},${s.join(`,`)}`));let l=G(r),u="u===`/favicon.ico`&&d.unshift({data:e})";for(let e of l){if(i.includes(`route:\`${e}\``))continue;let t=`[{name:\`headers\`,route:\`${e}\`,handler:x,options:{"Cache-Control":\`public, max-age=0, must-revalidate\`}}]`;i=i.replace(u,`${u};u===\`${e}\`&&d.unshift({data:${t}})`)}return c(e,i),s.length>0||l.length>0}function G(e){let t=[];if(!n(e))return t;for(let r of i(e,{withFileTypes:!0}))!r.isDirectory()&&r.name===`index.html`?t.push(`/`):r.isDirectory()&&n(d(e,r.name,`index.html`))&&t.push(`/${r.name}`);return t}export async function runPostBuild(e={}){let t=e.cwd??process.cwd(),n=d(t,`dist`),r=e.prerenderPort??13172;b(t),C(t,n);for(let e of[d(t,`.netlify`,`functions-internal`,`server`,`_ssr`,`ssr.mjs`),d(t,`.netlify`,`v1`,`functions`,`server`,`_ssr`,`ssr.mjs`),d(t,`.output`,`server`,`_ssr`,`ssr.mjs`),v(t)])e&&g(e)&&(console.log(`[patch] Patching ${e}`),patchSSRBundleCSS(e,n,t));await w(t,n),T(t,n),E(n),D(t,n),O(t),p(t),e.prerender!==!1&&await M(t,n,e.prerender??{},r,e.clientRouter),N(t,n),F(t,n),await V(t),H(t),console.log(`[post-build] ✅ Complete`)}
3
+ `)),console.log(`[redirects] Generated ${i.length} island redirect(s)`)}function D(e,a){let o=d(e,`node_modules`,`@useavalon`);if(!n(o))return;let s=[d(a,`adapters`),d(e,`.output`,`public`,`adapters`),d(e,`.netlify`,`functions-internal`,`server`,`public`,`adapters`)];for(let e of s){if(!n(u(e)))continue;let a=i(o).map(e=>d(o,e,`client`)).filter(e=>n(e));for(let n of a){let i=d(e,n.split(`/`).at(-2)||``);r(i,{recursive:!0}),t(n,i,{recursive:!0,force:!0})}}console.log(`[adapters] Copied framework adapters to output directories`)}function O(e){let i=d(e,`.netlify`,`functions-internal`),a=d(e,`.netlify`,`v1`,`functions`);n(i)&&(r(a,{recursive:!0}),t(i,a,{recursive:!0,force:!0}),console.log(`[netlify] Copied server function to v1 API paths`))}export function isNetlifyHandler(e){return e.split(/[/\\]/).includes(`.netlify`)}function k(e,t){let n=d(u(e),`_prerender-server.mjs`);return c(n,m(`./${l(e)}`,t)),n}function A(e){let t=/<a\s+[^>]*href=["']([^"']+)["'][^>]*>/gi,n=[],r;for(r=t.exec(e);r!==null;r=t.exec(e)){let e=r[1],t=e.indexOf(`#`);t!==-1&&(e=e.substring(0,t));let i=e.indexOf(`?`);i!==-1&&(e=e.substring(0,i)),e&&e.startsWith(`/`)&&!e.startsWith(`//`)&&!e.includes(`.`)&&n.push(e)}return n}async function j(t,i,o,l,p=!1){let m=_(t),h=[...m?[m]:[],d(t,`.netlify`,`functions-internal`,`server`,`server.mjs`),d(t,`.netlify`,`v1`,`functions`,`server`,`server.mjs`),d(t,`.output`,`server`,`index.mjs`)].find(e=>n(e));if(!h){console.log(`[prerender] No server entry found, skipping prerender`);return}let v=[d(t,`.output`,`public`),i].find(e=>n(e));if(!v){console.log(`[prerender] No output directory found, skipping prerender`);return}let y={routes:o.routes??[`/`],crawlLinks:o.crawlLinks??!0,ignore:o.ignore??[],failOnError:o.failOnError??!1,concurrency:o.concurrency??4,autoSubfolderIndex:o.autoSubfolderIndex??!0,retry:o.retry??3,retryDelay:o.retryDelay??500},b=`http://localhost:${l}`,x=m!==null&&h===m,S=h;if(x)S=k(h,l),console.log(`[prerender] Cloudflare worker detected — using wrapper`);else if(isNetlifyHandler(h)){let e=d(u(h),`main.mjs`);if(!n(e)){console.error(`[prerender] Netlify handler detected but main.mjs not found`);return}S=k(e,l),console.log(`[prerender] Netlify handler detected — using wrapper`)}{let e=[h,d(u(h),`main.mjs`)].filter(e=>g(e));for(let n of e){let e=a(n,`utf-8`),r=/"\/[^"]*\.html":\{[^}]+\},?/g,i=e.length;e=e.replaceAll(r,``),i!==e.length&&(c(n,e),console.log(`[prerender] Patched ${f(t,n)}: removed HTML asset entries`))}}console.log(`[prerender] Starting prerender with server: ${f(t,S)}`);let{spawn:C}=await import(`node:child_process`),w;try{w=C(`node`,[S],{env:{...process.env,PORT:String(l),NITRO_PORT:String(l),HOST:`127.0.0.1`,NITRO_HOST:`127.0.0.1`,NODE_ENV:`production`},stdio:[`ignore`,`pipe`,`pipe`]}),w.stdout?.on(`data`,e=>{let t=e.toString().trim();t&&console.log(`[prerender:server] ${t}`)}),w.stderr?.on(`data`,e=>{let t=e.toString().trim();t&&console.error(`[prerender:server:err] ${t}`)});let e=Date.now(),t=!1;for(;Date.now()-e<15e3;){try{let e=await fetch(`${b}/`);if(e.ok||e.status<500){t=!0;break}}catch{}await new Promise(e=>setTimeout(e,200))}if(!t)throw Error(`Server did not become ready within 15s`);console.log(`[prerender] Server ready at ${b}`)}catch(e){w?.kill(`SIGKILL`),console.error(`[prerender] Failed to start server:`,e.message);return}let T=new Set,E=[...y.routes],D=[],O=[];function j(e){for(let t of y.ignore)if(typeof t==`string`&&e===t||typeof t==`string`&&t.endsWith(`/**`)&&e.startsWith(t.slice(0,-2)))return!0;return!1}try{for(;E.length>0;){let e=E.splice(0,y.concurrency);await Promise.all(e.map(async e=>{let t=e.endsWith(`/`)&&e!==`/`?e.slice(0,-1):e;if(T.has(t)||(T.add(t),j(t)))return;let n=null;for(let e=1;e<=y.retry;e++)try{let e=await fetch(`${b}${t}`);n={html:await e.text(),status:e.status};break}catch{e<y.retry&&await new Promise(e=>setTimeout(e,y.retryDelay))}if(!n){O.push({route:t,error:`Failed after ${y.retry} attempts`});return}if(n.status>=400){O.push({route:t,error:`Returned ${n.status}`});return}let i=y.autoSubfolderIndex?d(t,`index.html`):`${t}.html`,a=d(v,i);r(u(a),{recursive:!0});let o=n.html.replace(`<!DOCTYPE html>`,`<!DOCTYPE html>
4
+ <!-- SSG: prerendered at build time -->`).replaceAll(/<link rel="stylesheet" href="\/assets\/[^"]*\.css">\n?/g,e=>e.includes(`_isolated-island-entry`)?``:e);if(p||(o=o.replaceAll(/<script type="module" src="\/assets\/entry-client[^"]*\.js"><\/script>\n?/g,``)),(/\/assets\/(?:ssr-)?index-[^"]+\.css/.test(o)||/<style data-inlined-from="\/assets\/(?:ssr-)?index-/.test(o))&&(o=o.replaceAll(/<link rel="stylesheet" href="\/assets\/entry-client[^"]*\.css">\n?/g,``)),p||(o=o.replaceAll(/<link rel="modulepreload" href="\/assets\/entry-client[^"]*\.js">\n?/g,``)),c(a,o),D.push(t),console.log(`[prerender] ✅ ${t} → ${i}`),y.crawlLinks)for(let e of A(n.html)){let t=e.endsWith(`/`)&&e!==`/`?e.slice(0,-1):e;!T.has(t)&&!j(t)&&E.push(t)}}))}}finally{console.log(`[prerender] Shutting down server...`),w?.kill(`SIGKILL`)}if(console.log(`[prerender] Done: ${D.length} page(s) prerendered`+(O.length>0?`, ${O.length} error(s)`:``)),x||isNetlifyHandler(h)){let e=d(u(h),`_prerender-server.mjs`);n(e)&&(s(e),console.log(`[prerender] Cleaned up wrapper script`))}if(D.length>0){let a=[i,d(t,`.netlify`,`functions-internal`,`server`,`public`),d(t,`.netlify`,`v1`,`functions`,`server`,`public`)].filter(e=>e!==v&&n(u(e)));for(let t of a)for(let i of D){let a=d(i,`index.html`),o=d(v,a),s=d(t,a);n(o)&&(r(u(s),{recursive:!0}),e(o,s))}a.length>0&&console.log(`[prerender] Copied prerendered HTML to ${a.length} additional output dir(s)`)}}function M(e,t){let r={},i=d(t,`island-deps.json`);if(n(i))try{r=JSON.parse(a(i,`utf-8`))}catch{}let o=d(e,`.output`,`public`);if(Object.keys(r).length===0&&n(o)){let e=h(d(o,`islands`),e=>e.endsWith(`.js`)&&!e.endsWith(`.js.map`));for(let t of e){let e=`/${t.substring(o.length+1).replaceAll(`\\`,`/`)}`,n=a(t,`utf-8`),i=/\bfrom\s*["']([^"']+)["']|import\s*["']([^"']+)["']/g,s=[],c;for(c=i.exec(n);c!==null;c=i.exec(n)){let t=c[1]||c[2];if(t&&(t.includes(`/assets/`)||t.startsWith(`.`))){let n=(t.startsWith(`.`)?`/${d(u(e.slice(1)),t).replaceAll(`\\`,`/`).replace(/^\/+/,``)}`:t).split(`/`).filter(Boolean),r=[];for(let e of n)e===`..`?r.pop():e!==`.`&&r.push(e);s.push(`/${r.join(`/`)}`)}}s.length>0&&(r[e]=s)}}if(Object.keys(r).length===0)return;let s=[d(e,`.output`,`public`),t],l=0;for(let e of s){if(!n(e))continue;let t=h(e,e=>e===`index.html`);for(let e of t){let t=a(e,`utf-8`),n=new Set;for(let[e,i]of Object.entries(r))if(t.includes(e))for(let e of i)t.includes(`href="${e}"`)||n.add(e);if(n.size===0)continue;let i=Array.from(n).map(e=>`<link rel="modulepreload" href="${e}">`).join(`
5
+ `);t.includes(`</head>`)&&(t=t.replace(`</head>`,`${i}\n</head>`),c(e,t),l++)}}l>0&&console.log(`[modulepreload] ✅ Injected dependency preloads into ${l} HTML file(s)`)}const N=[];function P(e,t){let r=[d(e,`.output`,`public`),t],i=I(r),o=0;for(let e of r){if(!n(e))continue;let t=h(e,e=>e===`index.html`);for(let e of t){let t=a(e,`utf-8`),n=t;t=L(t,i),t=F(t),t=R(t),t=z(t),t!==n&&(c(e,t),o++)}}o>0&&console.log(`[post-build] Optimized ${o} HTML file(s) — deferred non-critical CSS, added font preload hints`)}function F(e){if(!e.includes(`</head>`)||!e.includes(`<body`))return e;let t=e.indexOf(`</head>`),n=e.indexOf(`<body`);if(t===-1||n===-1||n<t)return e;let r=e.substring(n),i=new Set,a=[],o=``,s=0,c=0;for(;c<r.length;){if(r[c]===`<`){if(r.startsWith(`<template`,c)){s++;let e=r.indexOf(`>`,c);if(e===-1)break;o+=r.substring(c,e+1),c=e+1;continue}if(r.startsWith(`</template>`,c)){s=Math.max(0,s-1),o+=`</template>`,c+=11;continue}if(s===0&&r.startsWith(`<style`,c)){let e=r.indexOf(`</style>`,c);if(e===-1)break;let t=r.substring(c,e+8),n=/<style[^>]*>([\s\S]*?)<\/style>/.exec(t);if(n){let e=n[1].replaceAll(/\s+/g,` `).trim();e&&!i.has(e)&&(i.add(e),a.push(`<style>${e}</style>`))}c=e+8;continue}}o+=r[c],c++}return a.length===0?e:`${e.substring(0,t)}\n${a.join(`
6
+ `)}\n</head>${o}`}function I(e){let t=new Map;for(let r of e){let e=d(r,`assets`);if(n(e))for(let n of i(e))n.endsWith(`.css`)&&t.set(`/assets/${n}`,a(d(e,n),`utf-8`))}return t}function L(e,t){let n=/<link\s+rel="stylesheet"\s+href="(\/assets\/(?:ssr-)?index-[^"]+\.css)">/i.exec(e);if(!n)return e;let r=n[1],i=t.get(r);if(!i)return e;if(Buffer.byteLength(i,`utf-8`)<=14336){let t=`<style data-inlined-from="${r}">${i}</style>`;return e.replace(n[0],t)}let a=`<link rel="preload" href="${r}" as="style">`;return e.includes(`</title>`)&&!e.includes(`preload" href="${r}"`)&&(e=e.replace(`</title>`,`</title>\n${a}`)),e}function R(e){return e.replaceAll(/<link\s+([^>]*rel=["']stylesheet["'][^>]*)>/gi,(t,n,r)=>{if(e.slice(Math.max(0,r-32),r).toLowerCase().includes(`<noscript`))return t;let i=n.replace(/\s*\/\s*$/,``).trim();if(/\bmedia\s*=/i.test(i)||/data-critical/i.test(i))return t;let a=/href=["']([^"']+)["']/i.exec(i);if(!a)return t;let o=a[1],s=o.startsWith(`https://`)||o.startsWith(`http://`),c=!s&&N.some(e=>e.test(o));return!s&&!c?t:`<link ${i} media="print" onload="this.media='all'">\n<noscript><link ${i}></noscript>`})}function z(e){let t=/href=["'](https:\/\/fonts\.googleapis\.com\/css2[^"']+)["']/gi,n=new Set,r;for(r=t.exec(e);r!==null;r=t.exec(e))n.add(r[1]);if(n.size===0)return e;let i=[];for(let t of n){let n=t.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`);new RegExp(String.raw`<link\s+[^>]*rel=["']preload["'][^>]*href=["']${n}["'][^>]*>`,`i`).test(e)||i.push(`<link rel="preload" href="${t}" as="style">`)}if(i.length===0)return e;let a=i.join(`
7
+ `);return e.includes(`</title>`)?e.replace(`</title>`,`</title>\n${a}`):e}async function B(e){let{promisify:t}=await import(`node:util`),r=await import(`node:zlib`),i=t(r.brotliCompress),o=t(r.gzip),s=[d(e,`.output`,`public`),d(e,`.netlify`,`functions-internal`,`server`,`public`)],l=e=>e.endsWith(`.js`)||e.endsWith(`.css`)||e.endsWith(`.html`)||e.endsWith(`.svg`)||e.endsWith(`.txt`)||e.endsWith(`.xml`)||e.endsWith(`.json`),u=0;for(let e of s){if(!n(e))continue;let t=h(e,e=>l(e)&&!e.endsWith(`.map`));for(let e of t){let t=a(e);if(!(t.length<256))try{let[n,a]=await Promise.all([i(t,{params:{[r.constants.BROTLI_PARAM_QUALITY]:11}}),o(t,{level:9})]);c(`${e}.br`,n),c(`${e}.gz`,a),u++}catch{}}}u>0&&console.log(`[compress] ✅ Compressed ${u} public asset(s) (brotli + gzip)`)}function V(e){let t=[d(e,`.output`,`server`,`index.mjs`),d(e,`.netlify`,`functions-internal`,`server`,`index.mjs`)],r=d(e,`.output`,`public`);if(!n(r))return;let i=H(r);if(i.length===0)return;let a=0;for(let e of t)U(e,i,r)&&a++;a>0&&console.log(`[manifest] ✅ Registered ${i.length} prerendered HTML file(s) in Nitro asset manifest`)}function H(e){let t=h(e,e=>e===`index.html`||e===`index.html.br`||e===`index.html.gz`||e===`index.html.zst`),n=[],r=new Date().toISOString();for(let i of t){let t=`/${i.substring(e.length+1).replaceAll(`\\`,`/`)}`,o=a(i).length,s=`"${o.toString(16)}-prerender"`,c=``;t.endsWith(`.br`)?c=`br`:t.endsWith(`.gz`)?c=`gzip`:t.endsWith(`.zst`)&&(c=`zstd`);let l=`"${t}":{type:\`text/html; charset=utf-8\``;c&&(l+=`,encoding:\`${c}\``),l+=`,etag:\`${s}\`,mtime:\`${r}\`,size:${o},path:\`../public${t}\`}`,n.push(l)}return n}function U(e,t,r){if(!n(e))return!1;let i=a(e,`utf-8`),o=/("\/favicon\.ico":\{[^}]+\})/.exec(i);if(!o)return!1;let s=t.filter(e=>{let t=/^"([^"]+)"/.exec(e);return t&&!i.includes(`"${t[1]}":{`)});s.length>0&&(i=i.replace(o[0],`${o[0]},${s.join(`,`)}`));let l=W(r),u="u===`/favicon.ico`&&d.unshift({data:e})";for(let e of l){if(i.includes(`route:\`${e}\``))continue;let t=`[{name:\`headers\`,route:\`${e}\`,handler:x,options:{"Cache-Control":\`public, max-age=0, must-revalidate\`}}]`;i=i.replace(u,`${u};u===\`${e}\`&&d.unshift({data:${t}})`)}return c(e,i),s.length>0||l.length>0}function W(e){let t=[];if(!n(e))return t;for(let r of i(e,{withFileTypes:!0}))!r.isDirectory()&&r.name===`index.html`?t.push(`/`):r.isDirectory()&&n(d(e,r.name,`index.html`))&&t.push(`/${r.name}`);return t}export async function runPostBuild(e={}){let t=e.cwd??process.cwd(),n=d(t,`dist`),r=e.prerenderPort??13172;b(t),C(t,n);for(let e of[d(t,`.netlify`,`functions-internal`,`server`,`_ssr`,`ssr.mjs`),d(t,`.netlify`,`v1`,`functions`,`server`,`_ssr`,`ssr.mjs`),d(t,`.output`,`server`,`_ssr`,`ssr.mjs`),v(t)])e&&g(e)&&(console.log(`[patch] Patching ${e}`),patchSSRBundleCSS(e,n,t));await w(t,n),T(t,n),E(n),D(t,n),O(t),p(t),e.prerender!==!1&&await j(t,n,e.prerender??{},r,e.clientRouter),M(t,n),P(t,n),await B(t),V(t),console.log(`[post-build] ✅ Complete`)}
@@ -1,3 +1,3 @@
1
1
  import{existsSync as e,statSync as t}from"node:fs";import{resolve as n}from"node:path";export const DEFAULT_TREESHAKE_CONFIG={annotations:!0,moduleSideEffects:!0,propertyReadSideEffects:!1,unknownGlobalSideEffects:!1,manualPureFunctions:[]};export function mergeTreeshakeConfig(e,t){return{annotations:t.annotations??e.annotations,moduleSideEffects:t.moduleSideEffects??e.moduleSideEffects,propertyReadSideEffects:t.propertyReadSideEffects??e.propertyReadSideEffects,unknownGlobalSideEffects:t.unknownGlobalSideEffects??e.unknownGlobalSideEffects,manualPureFunctions:[...e.manualPureFunctions,...t.manualPureFunctions??[]]}}const a={solid:`@useavalon/solid/client`,preact:`@useavalon/preact/client`,react:`@useavalon/react/client`,vue:`@useavalon/vue/client`,svelte:`@useavalon/svelte/client`};export function generateWrapperCode(e,t){let n=JSON.stringify(e);if(t===`qwik`)return[`export * from ${n};`,`export { _hW } from "@builder.io/qwik";`].join(`
2
- `);let r=a[t],i=[`import __C from ${n};`,`var Component = __C;`,`export { Component as default, Component };`,`if(typeof globalThis<"u")globalThis.__avalonIsland=Component;`];return r&&i.push(`export { hydrate as __hydrateIsland, mount as __mountIsland } from ${JSON.stringify(r)};`),i.join(`
2
+ `);let r=a[t],i=[`import __C from ${n};`,`var Component = __C;`,`export { Component as default, Component };`,`if(typeof globalThis<"u")globalThis.__avalonIsland=Component;`];return r&&i.push(`export { hydrate as __hydrateIsland, mount as __mountIsland, unmount as __unmountIsland } from ${JSON.stringify(r)};`),i.join(`
3
3
  `)}export function generateIntegrationLoaderForFramework(e){let t=a[e];return t?`export { hydrate, mount } from ${JSON.stringify(t)};`:`export {};`}async function c(e,t){let n=[],{resolve:r}=await import(`node:path`),{existsSync:i}=await import(`node:fs`),{pathToFileURL:a}=await import(`node:url`),o={solid:{pkg:`vite-plugin-solid`,esmEntry:`dist/esm/index.mjs`},vue:{pkg:`@vitejs/plugin-vue`,esmEntry:`dist/index.mjs`},svelte:{pkg:`@sveltejs/vite-plugin-svelte`,esmEntry:`src/index.js`}}[e];if(!o)return n;try{let s=null,c=t;for(let e=0;e<8;e++){let e=r(c,`node_modules`,o.pkg,o.esmEntry);if(i(e)){s=e;break}for(let e of[`solid`,`vue`,`svelte`,`preact`,`react`,`lit`]){let t=r(c,`packages`,`integrations`,e,`node_modules`,o.pkg,o.esmEntry);if(i(t)){s=t;break}}if(s)break;c=r(c,`..`)}if(!s)throw Error(`Cannot find package '${o.pkg}'`);let l=await import(a(s).href);switch(e){case`solid`:n.push((l.default??l)({ssr:!1,hot:!1}));break;case`vue`:n.push((l.default??l)());break;case`svelte`:n.push((l.svelte??l.default)());break}}catch(t){console.warn(` ⚠ Could not load ${e} plugin: ${t instanceof Error?t.message:t}`)}return n}async function l(e){let{createRequire:t}=await import(`node:module`),{existsSync:n}=await import(`node:fs`),r=t(`${e}/package.json`),i=e=>{try{let t=r.resolve(e);return t.endsWith(`.js`)&&n(t.replace(/\.js$/,`.mjs`))?t.replace(/\.js$/,`.mjs`):t}catch{return null}},a={preact:i(`preact`),"preact/hooks":i(`preact/hooks`),"preact/compat":i(`preact/compat`),"preact/compat/client":i(`preact/compat/client`),"preact/compat/server":i(`preact/compat/server`),"preact/jsx-runtime":i(`preact/jsx-runtime`),react:i(`preact/compat`),"react/jsx-runtime":i(`preact/jsx-runtime`),"react/jsx-dev-runtime":i(`preact/jsx-runtime`),"react-dom":i(`preact/compat`),"react-dom/client":i(`preact/compat/client`),"react-dom/server":i(`preact/compat/server`)};return{name:`avalon:isolated-preact-compat`,enforce:`pre`,resolveId(e){return a[e]??null}}}export async function buildIsolatedIslands(a,u,d,f,p,m){if(d.size===0)return[];let{build:h}=await import(`vite`),g=new Set([`qwik`,`lit`,`preact`,`react`]),_=[...d.values()].filter(e=>!g.has(e.framework));console.log(`🏝️ Building ${_.length} island(s) in isolation (${d.size-_.length} skipped)...`);let v=performance.now(),y=m?.treeshake?mergeTreeshakeConfig(DEFAULT_TREESHAKE_CONFIG,m.treeshake):DEFAULT_TREESHAKE_CONFIG,b=[];for(let[,r]of d){let{filePath:i,bundleKey:d,framework:m}=r,g=`islands/${d}.js`;if(m===`qwik`||m===`lit`||m===`preact`||m===`react`){b.push({island:g,success:!0,skipped:!0});continue}let _=generateWrapperCode(i,m),v=`\0isolated-island-entry`,x=`\0virtual:avalon/integration-loader`;try{let r=await c(m,a),i=await l(a),o=performance.now(),S=await h({configFile:!1,root:a,logLevel:`silent`,plugins:[{name:`avalon:isolated-island-virtual`,resolveId(e){return e===v?e:e===`virtual:avalon/integration-loader`||e===x?x:null},load(e){return e===v?_:e===x?generateIntegrationLoaderForFramework(m):null}},i,...r],build:{write:!0,outDir:n(a,u),emptyOutDir:!1,minify:`oxc`,target:`es2022`,rollupOptions:{input:v,output:{format:`es`,entryFileNames:g},preserveEntrySignatures:`exports-only`,treeshake:y}},resolve:{alias:f},define:{...p,__DEV__:`false`,__PROD__:`true`,"process.env.NODE_ENV":`"production"`}}),C=performance.now()-o,w=n(a,u,g),T=e(w)?t(w).size:0,E=[],D=Array.isArray(S)?S:[S];for(let e of D)if(e&&`output`in e)for(let t of e.output)t.type===`chunk`&&t.fileName!==g&&E.push(`/${t.fileName}`);b.push({island:g,success:!0,size:T,elapsedMs:C,deps:E}),console.log(` ✅ ${d} (${m}): ${(T/1024).toFixed(1)} KiB`),C>2e3&&console.warn(` ⚠ ${d} (${m}): build took ${C.toFixed(0)}ms (>2s)`)}catch(e){let t=e instanceof Error?e.message:String(e);console.error(` ❌ ${d} (${m}): ${t}`),b.push({island:g,success:!1,error:t})}}let x=((performance.now()-v)/1e3).toFixed(1),S=b.filter(e=>e.success&&!e.skipped).length,C=b.filter(e=>e.skipped).length,w=b.filter(e=>!e.success).length,T=`🏝️ Done in ${x}s: ${S} built`;C&&(T+=`, ${C} skipped`),w&&(T+=`, ${w} failed`),console.log(T);let E={};for(let e of b)e.success&&e.deps&&e.deps.length>0&&(E[`/${e.island}`]=e.deps);if(Object.keys(E).length>0){let e=n(a,u,`island-deps.json`),{writeFileSync:t}=await import(`node:fs`);t(e,JSON.stringify(E))}return b}
@@ -1,12 +1,11 @@
1
1
  /**
2
2
  * Type augmentation for the `island` prop on island components.
3
3
  *
4
- * When importing a component from the islands directory and using it in a page,
5
- * you can pass an `island` prop to control hydration behavior. The Vite transform
6
- * plugin intercepts this at build time and converts it to a renderIsland() call.
4
+ * When using a component in a page with the `island` prop, the Vite transform
5
+ * intercepts it at build time and converts it to a renderIsland() call.
7
6
  *
8
7
  * Usage:
9
- * import Counter from '../islands/Counter.tsx';
8
+ * import Counter from '../components/Counter.tsx';
10
9
  * <Counter island={{ condition: 'on:interaction' }} someProp={42} />
11
10
  *
12
11
  * Custom directives:
@@ -13,13 +13,19 @@ export interface LayoutCssEntry {
13
13
  isRoot: boolean;
14
14
  skipRoot: boolean;
15
15
  }
16
- /** Resolve a relative or root-absolute specifier to an existing file. */
17
- export declare function resolveProjectImport(fromFile: string, spec: string, cwd: string): string | null;
16
+ export interface CssGraphAlias {
17
+ find: string | RegExp;
18
+ replacement: string;
19
+ }
20
+ /** Same fallbacks as `mdx-island-transform` so MDX `import X from '@shared/…'` reaches CSS. */
21
+ export declare function defaultCssGraphAliases(cwd: string): CssGraphAlias[];
22
+ /** Resolve a relative, root-absolute, or aliased specifier to an existing file. */
23
+ export declare function resolveProjectImport(fromFile: string, spec: string, cwd: string, aliases?: CssGraphAlias[]): string | null;
18
24
  /**
19
25
  * Collect `/`-rooted CSS hrefs reachable from `entryFile` via static imports
20
26
  * and CSS `@import`. Skips `node_modules`.
21
27
  */
22
- export declare function collectCssHrefsFromEntry(entryFile: string, cwd: string): string[];
28
+ export declare function collectCssHrefsFromEntry(entryFile: string, cwd: string, aliases?: CssGraphAlias[]): string[];
23
29
  /**
24
30
  * Build the per-route CSS table used by `virtual:avalon/layouts` in development.
25
31
  */
@@ -31,4 +37,5 @@ export declare function buildDevCssRouteTable(options: {
31
37
  }>;
32
38
  layouts: LayoutCssEntry[];
33
39
  globalCSS: string[];
40
+ aliases?: CssGraphAlias[];
34
41
  }): DevCssRouteTable;
@@ -1 +1 @@
1
- import{readFileSync as e,statSync as t}from"node:fs";import{dirname as n,extname as r,join as i,relative as a,resolve as o}from"node:path";import{stripTrailingSlash as s}from"../render/dev-css-select.js";export{matchPathPattern,selectDevCssHrefs}from"../render/dev-css-select.js";const c=[`.tsx`,`.ts`,`.jsx`,`.js`,`.mjs`,`.cjs`,`.vue`,`.svelte`,`.mdx`,`.md`,`.css`,`.scss`,`.sass`,`.less`,`.styl`,`.stylus`],l=new Set([`.css`,`.scss`,`.sass`,`.less`,`.styl`,`.stylus`]),u=c.map(e=>`index${e}`),d=/(?:from|import)\s+['"]([^'"]+)['"]/g,f=/import\s*\(\s*['"]([^'"]+)['"]\s*\)/g,p=/@import\s+(?:url\s*\(\s*)?['"]([^'"]+)['"]/g;function m(e){return l.has(r(e.split(`?`)[0]).toLowerCase())}function h(e,t){let n=a(e,t).replaceAll(`\\`,`/`);return n.startsWith(`/`)?n:`/${n}`}function g(e){let n=e.split(`?`)[0];try{if(!t(n).isFile())return null}catch{return null}return n}function _(e){for(let t of e){let e=g(t);if(e)return e}return null}export function resolveProjectImport(e,t,a){let s=t.split(`?`)[0].split(`#`)[0];if(!s||/^(https?:|data:|virtual:)/i.test(s)||s.startsWith(`\0`)||!(s.startsWith(`.`)||s.startsWith(`/`)))return null;let l=s.startsWith(`/`)?i(a,s.slice(1)):o(n(e),s);return g(l)||(r(l)?null:_([...c.map(e=>l+e),...u.map(e=>i(l,e))]))}function v(e,t){return[...e.matchAll(t)].flatMap(e=>e[1]?[e[1]]:[])}function y(e,t){return t?v(e,p):[...v(e,d),...v(e,f),...v(e,p)]}function b(e){return e.includes(`/node_modules/`)||e.includes(`\\node_modules\\`)}function x(t){try{return e(t,`utf8`)}catch{return null}}export function collectCssHrefsFromEntry(e,t){let n=[],r=new Set,i=[o(e)];for(;i.length>0;){let e=i.pop();if(!e||r.has(e)||b(e))continue;r.add(e);let a=x(e);if(a===null)continue;let o=m(e);o&&n.push(h(t,e));for(let n of y(a,o)){let a=resolveProjectImport(e,n,t);a&&!r.has(a)&&i.push(a)}}return S(n)}function S(e){return[...new Set(e)]}function C(...e){return S(e.flat())}function w(e,t){if(t===`/`)return!0;let n=s(e),r=s(t);return n===r||n.startsWith(`${r}/`)}function T(e,t){let n=[];for(let r of t){let t=r.startsWith(`/`)?r:`/${r}`,i=g(o(e,t.slice(1)));if(i){n.push(...collectCssHrefsFromEntry(i,e));continue}n.push(t)}return S(n)}function E(e,t,n,r){let i=collectCssHrefsFromEntry(e.filePath,t),a=r.filter(t=>w(e.pattern,t.prefix)),o=a.some(e=>!e.isRoot&&e.skipRoot),s=a.filter(e=>!(e.isRoot&&o)).flatMap(e=>e.hrefs);return{pattern:e.pattern,pageHrefs:C(n,i),hrefs:C(n,s,i)}}export function buildDevCssRouteTable(e){let t=T(e.cwd,e.globalCSS),n=e.layouts.map(t=>({...t,hrefs:collectCssHrefsFromEntry(t.filePath,e.cwd)}));return{globalHrefs:t,fallbackHrefs:C(t,C(...n.filter(e=>e.isRoot).map(e=>e.hrefs))),routes:e.routes.map(r=>E(r,e.cwd,t,n))}}
1
+ import{readFileSync as e,statSync as t}from"node:fs";import{dirname as n,extname as r,join as i,relative as a,resolve as o}from"node:path";import{stripTrailingSlash as s}from"../render/dev-css-select.js";export{matchPathPattern,selectDevCssHrefs}from"../render/dev-css-select.js";const c=[`.tsx`,`.ts`,`.jsx`,`.js`,`.mjs`,`.cjs`,`.vue`,`.svelte`,`.mdx`,`.md`,`.css`,`.scss`,`.sass`,`.less`,`.styl`,`.stylus`],l=new Set([`.css`,`.scss`,`.sass`,`.less`,`.styl`,`.stylus`]),u=c.map(e=>`index${e}`),d=/(?:from|import)\s+['"]([^'"]+)['"]/g,f=/import\s*\(\s*['"]([^'"]+)['"]\s*\)/g,p=/@import\s+(?:url\s*\(\s*)?['"]([^'"]+)['"]/g;function m(e){return l.has(r(e.split(`?`)[0]).toLowerCase())}function h(e,t){let n=a(e,t).replaceAll(`\\`,`/`);return n.startsWith(`/`)?n:`/${n}`}function g(e){let n=e.split(`?`)[0];try{if(!t(n).isFile())return null}catch{return null}return n}function _(e){for(let t of e){let e=g(t);if(e)return e}return null}export function defaultCssGraphAliases(e){return[{find:`@shared`,replacement:i(e,`app/shared`)},{find:`@modules`,replacement:i(e,`app/modules`)},{find:`@/`,replacement:`${i(e,`app`)}/`},{find:`$islands`,replacement:i(e,`src/islands`)},{find:`$components`,replacement:i(e,`src/components`)},{find:`~/`,replacement:`${i(e,`src`)}/`}]}function v(e,t,n){if(e===t)return n;let r=t.endsWith(`/`)?t:`${t}/`;if(!e.startsWith(r))return null;let i=e.slice(r.length);return n.endsWith(`/`)?`${n}${i}`:i?`${n}/${i}`:n}function y(e,t){for(let n of t){let t=n.find;if(typeof t==`string`){let r=v(e,t,n.replacement);if(r)return r;continue}if(t.test(e))return e.replace(t,n.replacement)}return null}function b(e){return g(e)||(r(e.split(`?`)[0])?null:_([...c.map(t=>e+t),...u.map(t=>i(e,t))]))}export function resolveProjectImport(e,t,r,a=[]){let s=t.split(`?`)[0].split(`#`)[0];if(!s||/^(https?:|data:|virtual:)/i.test(s)||s.startsWith(`\0`))return null;let c=y(s,[...a,...defaultCssGraphAliases(r)]);return c?b(c):s.startsWith(`.`)||s.startsWith(`/`)?b(s.startsWith(`/`)?i(r,s.slice(1)):o(n(e),s)):null}function x(e,t){return[...e.matchAll(t)].flatMap(e=>e[1]?[e[1]]:[])}function S(e,t){return t?x(e,p):[...x(e,d),...x(e,f),...x(e,p)]}function C(e){return e.includes(`/node_modules/`)||e.includes(`\\node_modules\\`)}function w(t){try{return e(t,`utf8`)}catch{return null}}export function collectCssHrefsFromEntry(e,t,n=[]){let r=[],i=new Set,a=[o(e)];for(;a.length>0;){let e=a.pop();if(!e||i.has(e)||C(e))continue;i.add(e);let o=w(e);if(o===null)continue;let s=m(e);s&&r.push(h(t,e));for(let r of S(o,s)){let o=resolveProjectImport(e,r,t,n);o&&!i.has(o)&&!C(o)&&a.push(o)}}return T(r)}function T(e){return[...new Set(e)]}function E(...e){return T(e.flat())}function D(e,t){if(t===`/`)return!0;let n=s(e),r=s(t);return n===r||n.startsWith(`${r}/`)}function O(e,t){let n=[];for(let r of t){let t=r.startsWith(`/`)?r:`/${r}`,i=g(o(e,t.slice(1)));if(i){n.push(...collectCssHrefsFromEntry(i,e));continue}n.push(t)}return T(n)}function k(e,t,n,r,i){let a=collectCssHrefsFromEntry(e.filePath,t,i),o=r.filter(t=>D(e.pattern,t.prefix)),s=o.some(e=>!e.isRoot&&e.skipRoot),c=o.filter(e=>!(e.isRoot&&s)).flatMap(e=>e.hrefs);return{pattern:e.pattern,pageHrefs:E(n,a),hrefs:E(n,c,a)}}export function buildDevCssRouteTable(e){let t=e.aliases??[],n=O(e.cwd,e.globalCSS),r=e.layouts.map(n=>({...n,hrefs:collectCssHrefsFromEntry(n.filePath,e.cwd,t)}));return{globalHrefs:n,fallbackHrefs:E(n,E(...r.filter(e=>e.isRoot).map(e=>e.hrefs))),routes:e.routes.map(i=>k(i,e.cwd,n,r,t))}}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Framework Vite defaults derived from `core` + `integrations`.
3
+ *
4
+ * Users should not copy aliases, optimizeDeps, or ssr.noExternal into their
5
+ * config — Avalon applies them from the frameworks they actually enabled.
6
+ */
7
+ import type { SSROptions, UserConfig } from "vite";
8
+ export interface FrameworkViteDefaultsOptions {
9
+ integrations: readonly string[];
10
+ core?: "preact" | "react";
11
+ command: "serve" | "build";
12
+ root?: string;
13
+ nitroPreset?: string;
14
+ /** Override package resolution (tests). Returns an ESM path or undefined. */
15
+ resolvePackage?: (specifier: string) => string | undefined;
16
+ }
17
+ /**
18
+ * Map a bare specifier to the Preact package Avalon should pin, or null
19
+ * when this id is not part of the compat rewrite.
20
+ */
21
+ export declare function mapPreactCompatId(id: string, core?: "preact" | "react"): string | null;
22
+ /** Absolute Preact pins belong on SSR always, and on the client production build. */
23
+ export declare function shouldResolvePreactCompat(env: string | undefined, command: string | undefined): boolean;
24
+ export declare function asNoExternalList(value: SSROptions["noExternal"]): Array<string | RegExp>;
25
+ /**
26
+ * Vite config fragment Avalon merges in `config()`. Safe to call with a
27
+ * stub `resolvePackage` in tests.
28
+ */
29
+ export declare function getFrameworkViteDefaults(options: FrameworkViteDefaultsOptions): UserConfig;
@@ -0,0 +1 @@
1
+ import{createRequire as e}from"node:module";import{join as t}from"node:path";import{getOptimizeDepsForIntegrations as n,getSSRNoExternalForIntegrations as r}from"../build/integration-config.js";const i=`@builder.io/qwik`,a=[`preact`,`preact/hooks`,`preact/compat`,`preact/compat/server`,`preact/compat/client`],o=[{find:/^react$/,spec:`preact/compat`},{find:/^react\/jsx-runtime$/,spec:`preact/jsx-runtime`},{find:/^react\/jsx-dev-runtime$/,spec:`preact/jsx-runtime`},{find:/^react-dom$/,spec:`preact/compat`},{find:/^react-dom\/server$/,spec:`preact/compat/server`},{find:/^react-dom\/client$/,spec:`preact/compat/client`}],s={react:`preact/compat`,"react/jsx-runtime":`preact/jsx-runtime`,"react/jsx-dev-runtime":`preact/jsx-runtime`,"react-dom":`preact/compat`,"react-dom/server":`preact/compat/server`,"react-dom/client":`preact/compat/client`},c=new Set([...a,`preact/jsx-runtime`,`preact/jsx-dev-runtime`]);export function mapPreactCompatId(e,t=`preact`){return c.has(e)?e:t===`react`?null:s[e]??null}export function shouldResolvePreactCompat(e,t){return e===`ssr`||e===`nitro`?!0:t===`build`}const u=[{find:/^vue$/,replacement:`vue/dist/vue.runtime.esm-bundler.js`},{find:/^@vue\/shared$/,replacement:`@vue/shared/dist/shared.esm-bundler.js`},{find:/^@vue\/runtime-core$/,replacement:`@vue/runtime-core/dist/runtime-core.esm-bundler.js`},{find:/^@vue\/runtime-dom$/,replacement:`@vue/runtime-dom/dist/runtime-dom.esm-bundler.js`},{find:/^@vue\/reactivity$/,replacement:`@vue/reactivity/dist/reactivity.esm-bundler.js`},{find:/^@vue\/server-renderer$/,replacement:`@vue/server-renderer/dist/server-renderer.esm-bundler.js`}];function d(e){let t=e.replaceAll(`/`,String.raw`\/`);return RegExp(`^${t}$`)}export function asNoExternalList(e){return Array.isArray(e)?e:!e||e===!0?[]:[e]}function f(n,r){try{return e(t(n,`package.json`)).resolve(r).replace(/\.js$/,`.mjs`)}catch{return}}function p(e,t,n){n&&e.push({find:t,replacement:n})}function m(e,t){let n=new Set(e);return n.add(t),[...n]}function h(e,t,n){let r=[];if(t===`preact`||e.includes(`preact`))for(let e of a)p(r,d(e),n(e));if(t===`preact`)for(let{find:e,spec:t}of o)p(r,e,n(t));return e.includes(`vue`)&&r.push(...u),r}function g(e,t){let n={__DEV__:e===`serve`,__PROD__:e===`build`,global:`globalThis`,"process.env.NODE_ENV":JSON.stringify(e===`serve`?`development`:`production`)};return t.includes(`vue`)?(n.__VUE_OPTIONS_API__=!0,n.__VUE_PROD_DEVTOOLS__=e===`serve`,n):n}function _(e,t){let n=r(e.filter(e=>e!==`solid`));e.includes(`vue`)&&!n.includes(`estree-walker`)&&n.push(`estree-walker`);let i={noExternal:n};e.includes(`solid`)&&(i.resolve={conditions:[`node`]});let a=t?.startsWith(`cloudflare`)??!1;return(e.includes(`solid`)||a)&&(i.target=`webworker`),i}export function getFrameworkViteDefaults(e){let t=e.core??`preact`,r=e.root??process.cwd(),a=e.resolvePackage??(e=>f(r,e)),o=m(e.integrations,t),s=new Set(n(o));t===`react`&&(s.add(`react-dom/server`),s.add(`react/jsx-runtime`));let c=[];o.includes(`qwik`)&&(s.delete(i),s.delete(`${i}/server`),c.push(i));let l=h(e.integrations,t,a);return{define:g(e.command,e.integrations),resolve:l.length>0?{alias:l}:void 0,optimizeDeps:{include:[...s],exclude:c},ssr:_(o,e.nitroPreset)}}
@@ -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{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{createImagePlugin as h}from"./image-optimization.js";import{activateIntegrations as g,activateSingleIntegration as _}from"./integration-activator.js";import{islandSidecarPlugin as v}from"./island-sidecar-plugin.js";import{createNitroIntegration as y}from"./nitro-integration.js";import{serverIslandsPlugin as b}from"./server-islands-plugin.js";import{STUB_BUILD_TIME_MODULE as x,shouldStubBuildTimeSpecifier as S}from"./stub-build-time-packages.js";import{formatValidationResults as C,validateActiveIntegrations as w}from"./validation.js";export async function collectIntegrationPlugins(e,t=!1){let n=[],r=[];for(let i of e){let e=await T(i,t);i===`lit`?r.push(...e):n.push(...e)}return[...r,...n]}async function T(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 E(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 D(e){if(!e.lazyIntegrations||e.integrations.length===0)return[...e.integrations];let t=await E(e);return t.size===0?[...e.integrations]:Array.from(t)}async function O(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 k(e,t,n){let{plugins:r,nitroOptions:i}=y(e,t);return globalThis.__nitroConfig=i,{plugins:r,options:i}}async function A(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 _(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 j(e,t){if(!e.validateIntegrations||t.size===0)return;let n=w(t,e.showWarnings);n.allValid||(console.error(C(n)),e.showWarnings&&console.warn(` ⚠️ Some integrations have validation issues.`))}export async function avalon(a){let o,l,u=new Set,_=f(a,!0),y=await D(_);y.length>0&&await g({..._,integrations:y},u);let C=await O(_),w=await h(_.image,_.verbose),T=[];u.size>0&&(T=await collectIntegrationPlugins(u,_.verbose));let E=[];if(a?.nitro){let{plugins:e}=k(_,a.nitro,_.verbose);E=e}let M=v({verbose:_.verbose}),N=b({verbose:_.verbose}),P=e(import.meta.url),F=null;try{F=n(t(P.resolve(`@useavalon/avalon/client`)),`main.js`)}catch{}let I=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`])),L={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=y.flatMap(e=>n[e]??[]);a?.core===`react`&&r.push(`react-dom/server`,`react/jsx-runtime`);let i=t===`build`&&!a?.clientRouter;return{define:{__AVALON_PER_ISLAND__:JSON.stringify(i)},oxc:{exclude:[/node_modules\/@useavalon\/.*\.tsx?$/]},ssr:{noExternal:[/^@useavalon\//]},optimizeDeps:{exclude:[`@useavalon/avalon`,...y.map(e=>`@useavalon/${e}`)],include:r},...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`&&F)return F;if(I.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 A(o,l?.root,u),j(o,u)},configureServer(e){globalThis.__viteDevServer=e}},R=T.filter(e=>e.name?.includes(`lit`)),z=T.filter(e=>!e.name?.includes(`lit`)),B,V=t=>{try{return B||=e(n(l?.root??process.cwd(),`package.json`)),B.resolve(t).replace(/\.js$/,`.mjs`)}catch{return}},H=new Set([`preact`,`preact/hooks`,`preact/compat`,`preact/compat/server`,`preact/compat/client`]);return[{name:`avalon:preact-compat-resolver`,enforce:`pre`,resolveId(e){let t=this.environment?.name;return t!==`ssr`&&t!==`nitro`||!H.has(e)?null:V(e)??null}},{name:`avalon:stub-build-time-plugins`,enforce:`pre`,resolveId(e){let t=this.environment?.name;if(!(t!==`ssr`&&t!==`nitro`)&&S(e))return`\0stub:${e}`},load(e){if(e.startsWith(`\0stub:`))return x;let t=this.environment?.name;if(!(t!==`ssr`&&t!==`nitro`)&&S(e))return x}},s({pagesDir:_.pagesDir,layoutsDir:_.layoutsDir,modules:_.modules,verbose:_.verbose}),r(_,a?.nitro),i(_,a?.nitro),...w,...R,...C,L,M,N,...E,...z]}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}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@useavalon/avalon",
3
- "version": "0.3.2-canary.17",
3
+ "version": "0.3.2-canary.21",
4
4
  "description": "Multi-framework islands architecture for the modern web",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -149,8 +149,7 @@
149
149
  "peerDependencies": {
150
150
  "vite": "^8.0.0",
151
151
  "nitro": "^3.0.260311-beta",
152
- "vite-imagetools": "^7.0.0",
153
- "rehype-highlight": "^7.0.0"
152
+ "vite-imagetools": "^7.0.0"
154
153
  },
155
154
  "peerDependenciesMeta": {
156
155
  "nitro": {
@@ -161,14 +160,12 @@
161
160
  },
162
161
  "vite-imagetools": {
163
162
  "optional": true
164
- },
165
- "rehype-highlight": {
166
- "optional": true
167
163
  }
168
164
  },
169
165
  "dependencies": {
170
166
  "@mdx-js/rollup": "^3.0.0",
171
- "@useavalon/core": "^0.3.2-canary.17",
167
+ "rehype-highlight": "^7.0.0",
168
+ "@useavalon/core": "^0.3.2-canary.21",
172
169
  "h3": "^2.0.1-rc.16",
173
170
  "marked": "^17.0.4",
174
171
  "oxc-parser": "^0.120.0",