@useavalon/avalon 0.1.12 → 0.1.13
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.
- package/mod.ts +302 -0
- package/package.json +9 -17
- package/src/build/integration-bundler-plugin.ts +116 -0
- package/src/build/integration-config.ts +168 -0
- package/src/build/integration-detection-plugin.ts +117 -0
- package/src/build/integration-resolver-plugin.ts +90 -0
- package/src/build/island-manifest.ts +269 -0
- package/src/build/island-types-generator.ts +476 -0
- package/src/build/mdx-island-transform.ts +464 -0
- package/src/build/mdx-plugin.ts +98 -0
- package/src/build/page-island-transform.ts +598 -0
- package/src/build/prop-extractors/index.ts +21 -0
- package/src/build/prop-extractors/lit.ts +140 -0
- package/src/build/prop-extractors/qwik.ts +16 -0
- package/src/build/prop-extractors/solid.ts +125 -0
- package/src/build/prop-extractors/svelte.ts +194 -0
- package/src/build/prop-extractors/vue.ts +111 -0
- package/src/build/sidecar-file-manager.ts +104 -0
- package/src/build/sidecar-renderer.ts +30 -0
- package/src/client/adapters/index.ts +21 -0
- package/src/client/components.ts +35 -0
- package/src/client/css-hmr-handler.ts +344 -0
- package/src/client/framework-adapter.ts +462 -0
- package/src/client/hmr-coordinator.ts +396 -0
- package/src/client/hmr-error-overlay.js +533 -0
- package/src/client/main.js +824 -0
- package/src/components/Image.tsx +123 -0
- package/src/components/IslandErrorBoundary.tsx +145 -0
- package/src/components/LayoutDataErrorBoundary.tsx +141 -0
- package/src/components/LayoutErrorBoundary.tsx +127 -0
- package/src/components/PersistentIsland.tsx +52 -0
- package/src/components/StreamingErrorBoundary.tsx +233 -0
- package/src/components/StreamingLayout.tsx +538 -0
- package/src/core/components/component-analyzer.ts +192 -0
- package/src/core/components/component-detection.ts +508 -0
- package/src/core/components/enhanced-framework-detector.ts +500 -0
- package/src/core/components/framework-registry.ts +563 -0
- package/src/core/content/mdx-processor.ts +46 -0
- package/src/core/integrations/index.ts +19 -0
- package/src/core/integrations/loader.ts +125 -0
- package/src/core/integrations/registry.ts +175 -0
- package/src/core/islands/island-persistence.ts +325 -0
- package/src/core/islands/island-state-serializer.ts +258 -0
- package/src/core/islands/persistent-island-context.tsx +80 -0
- package/src/core/islands/use-persistent-state.ts +68 -0
- package/src/core/layout/enhanced-layout-resolver.ts +322 -0
- package/src/core/layout/layout-cache-manager.ts +485 -0
- package/src/core/layout/layout-composer.ts +357 -0
- package/src/core/layout/layout-data-loader.ts +516 -0
- package/src/core/layout/layout-discovery.ts +243 -0
- package/src/core/layout/layout-matcher.ts +299 -0
- package/src/core/layout/layout-types.ts +110 -0
- package/src/core/modules/framework-module-resolver.ts +273 -0
- package/src/islands/component-analysis.ts +213 -0
- package/src/islands/css-utils.ts +565 -0
- package/src/islands/discovery/index.ts +80 -0
- package/src/islands/discovery/registry.ts +340 -0
- package/src/islands/discovery/resolver.ts +477 -0
- package/src/islands/discovery/scanner.ts +386 -0
- package/src/islands/discovery/types.ts +117 -0
- package/src/islands/discovery/validator.ts +544 -0
- package/src/islands/discovery/watcher.ts +368 -0
- package/src/islands/framework-detection.ts +428 -0
- package/src/islands/integration-loader.ts +490 -0
- package/src/islands/island.tsx +565 -0
- package/src/islands/render-cache.ts +550 -0
- package/src/islands/types.ts +80 -0
- package/src/islands/universal-css-collector.ts +157 -0
- package/src/islands/universal-head-collector.ts +137 -0
- package/src/layout-system.ts +218 -0
- package/src/middleware/discovery.ts +268 -0
- package/src/middleware/executor.ts +315 -0
- package/src/middleware/index.ts +76 -0
- package/src/middleware/types.ts +99 -0
- package/src/nitro/build-config.ts +576 -0
- package/src/nitro/config.ts +483 -0
- package/src/nitro/error-handler.ts +636 -0
- package/src/nitro/index.ts +173 -0
- package/src/nitro/island-manifest.ts +584 -0
- package/src/nitro/middleware-adapter.ts +260 -0
- package/src/nitro/renderer.ts +1471 -0
- package/src/nitro/route-discovery.ts +439 -0
- package/src/nitro/types.ts +321 -0
- package/src/render/collect-css.ts +198 -0
- package/src/render/error-pages.ts +79 -0
- package/src/render/isolated-ssr-renderer.ts +654 -0
- package/src/render/ssr.ts +1030 -0
- package/src/schemas/api.ts +30 -0
- package/src/schemas/core.ts +64 -0
- package/src/schemas/index.ts +212 -0
- package/src/schemas/layout.ts +279 -0
- package/src/schemas/routing/index.ts +38 -0
- package/src/schemas/routing.ts +376 -0
- package/src/types/as-island.ts +20 -0
- package/src/types/layout.ts +285 -0
- package/src/types/routing.ts +555 -0
- package/src/types/types.ts +5 -0
- package/src/utils/dev-logger.ts +299 -0
- package/src/utils/fs.ts +151 -0
- package/src/vite-plugin/auto-discover.ts +551 -0
- package/src/vite-plugin/config.ts +266 -0
- package/src/vite-plugin/errors.ts +127 -0
- package/src/vite-plugin/image-optimization.ts +156 -0
- package/src/vite-plugin/integration-activator.ts +126 -0
- package/src/vite-plugin/island-sidecar-plugin.ts +176 -0
- package/src/vite-plugin/module-discovery.ts +189 -0
- package/src/vite-plugin/nitro-integration.ts +1354 -0
- package/src/vite-plugin/plugin.ts +403 -0
- package/src/vite-plugin/types.ts +327 -0
- package/src/vite-plugin/validation.ts +228 -0
- package/dist/mod.js +0 -1
- package/dist/src/build/integration-bundler-plugin.js +0 -1
- package/dist/src/build/integration-config.js +0 -1
- package/dist/src/build/integration-detection-plugin.js +0 -1
- package/dist/src/build/integration-resolver-plugin.js +0 -1
- package/dist/src/build/island-manifest.js +0 -1
- package/dist/src/build/island-types-generator.js +0 -5
- package/dist/src/build/mdx-island-transform.js +0 -2
- package/dist/src/build/mdx-plugin.js +0 -1
- package/dist/src/build/page-island-transform.js +0 -3
- package/dist/src/build/prop-extractors/index.js +0 -1
- package/dist/src/build/prop-extractors/lit.js +0 -1
- package/dist/src/build/prop-extractors/qwik.js +0 -1
- package/dist/src/build/prop-extractors/solid.js +0 -1
- package/dist/src/build/prop-extractors/svelte.js +0 -1
- package/dist/src/build/prop-extractors/vue.js +0 -1
- package/dist/src/build/sidecar-file-manager.js +0 -1
- package/dist/src/build/sidecar-renderer.js +0 -6
- package/dist/src/client/adapters/index.js +0 -1
- package/dist/src/client/components.js +0 -1
- package/dist/src/client/css-hmr-handler.js +0 -1
- package/dist/src/client/framework-adapter.js +0 -13
- package/dist/src/client/hmr-coordinator.js +0 -1
- package/dist/src/client/hmr-error-overlay.js +0 -214
- package/dist/src/client/main.js +0 -39
- package/dist/src/components/Image.js +0 -1
- package/dist/src/components/IslandErrorBoundary.js +0 -1
- package/dist/src/components/LayoutDataErrorBoundary.js +0 -1
- package/dist/src/components/LayoutErrorBoundary.js +0 -1
- package/dist/src/components/PersistentIsland.js +0 -1
- package/dist/src/components/StreamingErrorBoundary.js +0 -1
- package/dist/src/components/StreamingLayout.js +0 -29
- package/dist/src/core/components/component-analyzer.js +0 -1
- package/dist/src/core/components/component-detection.js +0 -5
- package/dist/src/core/components/enhanced-framework-detector.js +0 -1
- package/dist/src/core/components/framework-registry.js +0 -1
- package/dist/src/core/content/mdx-processor.js +0 -1
- package/dist/src/core/integrations/index.js +0 -1
- package/dist/src/core/integrations/loader.js +0 -1
- package/dist/src/core/integrations/registry.js +0 -1
- package/dist/src/core/islands/island-persistence.js +0 -1
- package/dist/src/core/islands/island-state-serializer.js +0 -1
- package/dist/src/core/islands/persistent-island-context.js +0 -1
- package/dist/src/core/islands/use-persistent-state.js +0 -1
- package/dist/src/core/layout/enhanced-layout-resolver.js +0 -1
- package/dist/src/core/layout/layout-cache-manager.js +0 -1
- package/dist/src/core/layout/layout-composer.js +0 -1
- package/dist/src/core/layout/layout-data-loader.js +0 -1
- package/dist/src/core/layout/layout-discovery.js +0 -1
- package/dist/src/core/layout/layout-matcher.js +0 -1
- package/dist/src/core/layout/layout-types.js +0 -1
- package/dist/src/core/modules/framework-module-resolver.js +0 -1
- package/dist/src/islands/component-analysis.js +0 -1
- package/dist/src/islands/css-utils.js +0 -17
- package/dist/src/islands/discovery/index.js +0 -1
- package/dist/src/islands/discovery/registry.js +0 -1
- package/dist/src/islands/discovery/resolver.js +0 -2
- package/dist/src/islands/discovery/scanner.js +0 -1
- package/dist/src/islands/discovery/types.js +0 -1
- package/dist/src/islands/discovery/validator.js +0 -18
- package/dist/src/islands/discovery/watcher.js +0 -1
- package/dist/src/islands/framework-detection.js +0 -1
- package/dist/src/islands/integration-loader.js +0 -1
- package/dist/src/islands/island.js +0 -1
- package/dist/src/islands/render-cache.js +0 -1
- package/dist/src/islands/types.js +0 -1
- package/dist/src/islands/universal-css-collector.js +0 -5
- package/dist/src/islands/universal-head-collector.js +0 -2
- package/dist/src/layout-system.js +0 -1
- package/dist/src/middleware/discovery.js +0 -1
- package/dist/src/middleware/executor.js +0 -1
- package/dist/src/middleware/index.js +0 -1
- package/dist/src/middleware/types.js +0 -1
- package/dist/src/nitro/build-config.js +0 -1
- package/dist/src/nitro/config.js +0 -1
- package/dist/src/nitro/error-handler.js +0 -198
- package/dist/src/nitro/index.js +0 -1
- package/dist/src/nitro/island-manifest.js +0 -2
- package/dist/src/nitro/middleware-adapter.js +0 -1
- package/dist/src/nitro/renderer.js +0 -183
- package/dist/src/nitro/route-discovery.js +0 -1
- package/dist/src/nitro/types.js +0 -1
- package/dist/src/render/collect-css.js +0 -3
- package/dist/src/render/error-pages.js +0 -48
- package/dist/src/render/isolated-ssr-renderer.js +0 -1
- package/dist/src/render/ssr.js +0 -90
- package/dist/src/schemas/api.js +0 -1
- package/dist/src/schemas/core.js +0 -1
- package/dist/src/schemas/index.js +0 -1
- package/dist/src/schemas/layout.js +0 -1
- package/dist/src/schemas/routing/index.js +0 -1
- package/dist/src/schemas/routing.js +0 -1
- package/dist/src/types/as-island.js +0 -1
- package/dist/src/types/layout.js +0 -1
- package/dist/src/types/routing.js +0 -1
- package/dist/src/types/types.js +0 -1
- package/dist/src/utils/dev-logger.js +0 -12
- package/dist/src/utils/fs.js +0 -1
- package/dist/src/vite-plugin/auto-discover.js +0 -1
- package/dist/src/vite-plugin/config.js +0 -1
- package/dist/src/vite-plugin/errors.js +0 -1
- package/dist/src/vite-plugin/image-optimization.js +0 -45
- package/dist/src/vite-plugin/integration-activator.js +0 -1
- package/dist/src/vite-plugin/island-sidecar-plugin.js +0 -1
- package/dist/src/vite-plugin/module-discovery.js +0 -1
- package/dist/src/vite-plugin/nitro-integration.js +0 -42
- package/dist/src/vite-plugin/plugin.js +0 -1
- package/dist/src/vite-plugin/types.js +0 -1
- package/dist/src/vite-plugin/validation.js +0 -2
- /package/{dist/src → src}/client/types/framework-runtime.d.ts +0 -0
- /package/{dist/src → src}/client/types/vite-hmr.d.ts +0 -0
- /package/{dist/src → src}/client/types/vite-virtual-modules.d.ts +0 -0
- /package/{dist/src → src}/layout-system.d.ts +0 -0
- /package/{dist/src → src}/types/image.d.ts +0 -0
- /package/{dist/src → src}/types/index.d.ts +0 -0
- /package/{dist/src → src}/types/island-jsx.d.ts +0 -0
- /package/{dist/src → src}/types/island-prop.d.ts +0 -0
- /package/{dist/src → src}/types/mdx.d.ts +0 -0
- /package/{dist/src → src}/types/urlpattern.d.ts +0 -0
- /package/{dist/src → src}/types/vite-env.d.ts +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{FALLBACK_PROPS as e}from"./vue.js";export function extractSvelteProps(t){try{let i=n(t);if(i===null)return{propsType:e,fallback:!0};let a=r(i);if(a!==null)return{propsType:a,fallback:!1};let s=o(i);return s===null?{propsType:e,fallback:!0}:{propsType:s,fallback:!1}}catch{return console.warn(`[avalon] Failed to extract Svelte props — falling back to Record<string, unknown>`),{propsType:e,fallback:!0}}}function n(e){let t=new RegExp(/<script\b[^>]*>([\s\S]*?)<\/script>/i).exec(e);return t?t[1]:null}function r(e){let t=new RegExp(/let\s+(?:\{[^}]*\}|\w+)\s*:\s*([\s\S]*?)\s*=\s*\$props\s*\(\s*\)/).exec(e);if(!t)return null;let n=t[1].trim();return n.length===0?null:n.startsWith(`{`)?s(n)?n:(console.warn(`[avalon] Unbalanced braces in Svelte $props() type — falling back`),null):i(e,n)}function i(e,t){let n=new RegExp(String.raw`interface\s+${c(t)}\s*\{`).exec(e);if(n){let t=a(e,n.index+n[0].length-1);if(t!==null)return t}let r=new RegExp(String.raw`type\s+${c(t)}\s*=\s*\{`).exec(e);if(r){let t=a(e,r.index+r[0].length-1);if(t!==null)return t}return null}function a(e,t){if(e[t]!==`{`)return null;let n=0,r=t;for(;r<e.length;){if(e[r]===`{`)n++;else if(e[r]===`}`&&(n--,n===0))return e.slice(t,r+1).trim();r++}return null}function o(e){let t=/export\s+let\s+(\w+)\s*:\s*([^;=]+)/g,n=[],r;for(;(r=t.exec(e))!==null;){let e=r[1].trim(),t=r[2].trim();e&&t&&n.push(`${e}: ${t}`)}return n.length===0?null:`{ ${n.join(`; `)} }`}function s(e){let t=0;for(let n of e)if(n===`{`?t++:n===`}`&&t--,t<0)return!1;return t===0}function c(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export const FALLBACK_PROPS=`Record<string, unknown>`;export function extractVueProps(t){try{let r=n(t);if(r===null)return{propsType:FALLBACK_PROPS,fallback:!0};let a=i(r);return a===null?{propsType:FALLBACK_PROPS,fallback:!0}:{propsType:a,fallback:!1}}catch{return console.warn(`[avalon] Failed to extract Vue props — falling back to Record<string, unknown>`),{propsType:FALLBACK_PROPS,fallback:!0}}}function n(e){let t=new RegExp(/<script\b[^>]*\bsetup\b[^>]*>([\s\S]*?)<\/script>/i).exec(e);return t?t[1]:null}function r(e){let t=0;for(let n of e)if(n===`{`?t++:n===`}`&&t--,t<0)return!1;return t===0}function i(e){let t=e.indexOf(`defineProps<`);if(t===-1)return null;let n=t+12,i=1,a=n;for(;a<e.length&&i>0;){let t=e[a];t===`<`?i++:t===`>`&&i--,i>0&&a++}if(i!==0)return console.warn(`[avalon] Unbalanced angle brackets in defineProps<...> — falling back`),null;let o=e.slice(n,a).trim();return o.length===0?null:r(o)?o:(console.warn(`[avalon] Unbalanced braces in defineProps type — falling back`),null)}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import e from"node:path";import{readFile as t,writeFile as n,unlink as r,stat as i}from"node:fs/promises";const a=[`.solid.tsx`,`.qwik.tsx`,`.lit.ts`,`.svelte`,`.vue`],o=new Set([`.lit.ts`,`.solid.tsx`,`.qwik.tsx`]);export function getSidecarPath(t){let n=e.dirname(t),r=e.basename(t);for(let t of a)if(r.endsWith(t)){let i=r.slice(0,-t.length);if(o.has(t)){let r=t.endsWith(`.ts`)?t.slice(0,-3):t.slice(0,-4);return e.join(n,`${i}${r}.d.ts`)}return e.join(n,`${i}.d${t}.ts`)}let i=e.extname(t),s=r.slice(0,-i.length);return e.join(n,`${s}.d${i}.ts`)}export async function isSidecarFresh(e,t){try{let[n,r]=await Promise.all([i(e),i(t)]);return r.mtimeMs>=n.mtimeMs}catch{return!1}}export async function writeSidecarIfChanged(e,r){try{if(await t(e,`utf-8`)===r)return!1}catch{}return await n(e,r,`utf-8`),!0}export async function deleteSidecar(e){try{return await r(e),!0}catch{return!1}}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export const SIDECAR_HEADER=`// Auto-generated by avalon — do not edit`;export function renderSidecarContent(e){return`// Auto-generated by avalon — do not edit
|
|
2
|
-
import type { ComponentType } from 'preact';
|
|
3
|
-
import type { IslandDirective } from '@useavalon/avalon';
|
|
4
|
-
declare const component: ComponentType<${e} & { island?: IslandDirective }>;
|
|
5
|
-
export default component;
|
|
6
|
-
`}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export{BaseFrameworkAdapter,AdapterRegistry}from"../framework-adapter.js";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export{PersistentIsland}from"../components/PersistentIsland.js";export{usePersistentIslandContext,PersistentIslandProvider,createPersistentIslandContext}from"../core/islands/persistent-island-context.js";export{usePersistentState}from"../core/islands/use-persistent-state.js";export{IslandPersistence,defaultIslandPersistence}from"../core/islands/island-persistence.js";export{IslandStateSerializer}from"../core/islands/island-state-serializer.js";export{IslandErrorBoundary,withIslandErrorBoundary}from"../components/IslandErrorBoundary.js";export{LayoutErrorBoundary}from"../components/LayoutErrorBoundary.js";export{LayoutDataErrorBoundary}from"../components/LayoutDataErrorBoundary.js";export{StreamingErrorBoundary,withStreamingErrorBoundary}from"../components/StreamingErrorBoundary.js";export{StreamingLayout,StreamingSuspense,withStreaming,useStreamingState}from"../components/StreamingLayout.js";export{Image}from"../components/Image.js";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export class CSSHMRHandler{cssModuleMap=new Map;styleElementMap=new Map;handleCSSUpdate(e){let t=this.classifyCSSUpdate(e);switch(t.type){case`global`:this.handleGlobalCSSUpdate(t);break;case`module`:this.handleCSSModuleUpdate(t);break;case`scoped`:this.handleScopedCSSUpdate(t);break}}classifyCSSUpdate(e){let t=e.path||e.acceptedPath;return t.includes(`.module.css`)||t.includes(`.module.scss`)?{type:`module`,path:t,timestamp:e.timestamp}:t.includes(`.svelte`)||t.includes(`.vue`)?{type:`scoped`,path:t,timestamp:e.timestamp}:{type:`global`,path:t,timestamp:e.timestamp}}handleGlobalCSSUpdate(e){try{let t=this.styleElementMap.get(e.path);t&&(t.remove(),this.styleElementMap.delete(e.path));let n=document.querySelector(`style[data-vite-dev-id*="${this.getFileId(e.path)}"]`);n&&this.styleElementMap.set(e.path,n),this.dispatchCSSUpdateEvent(e,!0)}catch(t){throw console.error(`Failed to update global CSS: ${e.path}`,t),this.dispatchCSSUpdateEvent(e,!1,t),t}}handleCSSModuleUpdate(e){try{let t=this.findIslandsUsingCSSModule(e.path);if(t.length===0)return;for(let n of t)this.triggerIslandRerender(n,e);this.dispatchCSSUpdateEvent(e,!0)}catch(t){throw console.error(`[HMR] Failed to update CSS module: ${e.path}`,t),this.dispatchCSSUpdateEvent(e,!1,t),t}}handleScopedCSSUpdate(e){try{if(this.findIslandsUsingComponent(e.path).length===0)return;this.dispatchCSSUpdateEvent(e,!0)}catch(t){throw console.error(`[HMR] Failed to update scoped CSS: ${e.path}`,t),this.dispatchCSSUpdateEvent(e,!1,t),t}}findIslandsUsingCSSModule(e){let t=[],n=this.normalizePath(e),r=this.cssModuleMap.get(n);if(r)return Array.from(r);let i=document.querySelectorAll(`[data-src]`);for(let n of i){let r=n.getAttribute(`data-src`);r&&this.getDirectory(r)===this.getDirectory(e)&&t.push(n)}return t.length>0&&this.cssModuleMap.set(n,new Set(t)),t}findIslandsUsingComponent(e){let t=[],n=this.normalizePath(e),r=document.querySelectorAll(`[data-src]`);for(let e of r){let r=e.getAttribute(`data-src`);if(!r)continue;let i=this.normalizePath(r);(i===n||i.includes(n))&&t.push(e)}return t}triggerIslandRerender(e,t){e.dispatchEvent(new CustomEvent(`css-module-update`,{detail:{cssPath:t.path,timestamp:t.timestamp},bubbles:!0}));let n=e.getAttribute(`data-src`);n&&e.dispatchEvent(new CustomEvent(`hmr-update-required`,{detail:{src:n,reason:`css-module-update`,cssPath:t.path},bubbles:!0}))}dispatchCSSUpdateEvent(e,t,n){let r=new CustomEvent(`css-hmr-update`,{detail:{type:e.type,path:e.path,timestamp:e.timestamp,success:t,error:n?.message},bubbles:!0});document.dispatchEvent(r)}normalizePath(e){return e.replace(/\\/g,`/`).replace(/^\//,``).replace(/\?.*$/,``).replace(/#.*$/,``)}getDirectory(e){let t=this.normalizePath(e),n=t.lastIndexOf(`/`);return n>=0?t.substring(0,n):``}getFileId(e){return this.normalizePath(e)}clearCache(){this.cssModuleMap.clear(),this.styleElementMap.clear()}registerCSSModuleUsage(e,t){let n=this.normalizePath(e);this.cssModuleMap.has(n)||this.cssModuleMap.set(n,new Set),this.cssModuleMap.get(n).add(t)}}let t=null;export function getCSSHMRHandler(){return t||=new CSSHMRHandler,t}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export class AdapterRegistry{adapters=new Map;register(e,t){let n=e.toLowerCase();if(!t)throw Error(`Cannot register null/undefined adapter for framework: ${e}`);if(!t.name)throw Error(`Adapter for framework ${e} must have a name property`);if(typeof t.canHandle!=`function`)throw Error(`Adapter for framework ${e} must implement canHandle method`);if(typeof t.preserveState!=`function`)throw Error(`Adapter for framework ${e} must implement preserveState method`);if(typeof t.update!=`function`)throw Error(`Adapter for framework ${e} must implement update method`);if(typeof t.restoreState!=`function`)throw Error(`Adapter for framework ${e} must implement restoreState method`);if(typeof t.handleError!=`function`)throw Error(`Adapter for framework ${e} must implement handleError method`);this.adapters.has(n)&&console.warn(`Overwriting existing HMR adapter for framework: ${e}`),this.adapters.set(n,t)}get(e){return this.adapters.get(e.toLowerCase())}has(e){return this.adapters.has(e.toLowerCase())}getRegisteredFrameworks(){return Array.from(this.adapters.keys())}findAdapter(e){for(let t of this.adapters.values())if(t.canHandle(e))return t}unregister(e){let t=e.toLowerCase();return this.adapters.delete(t)}clear(){this.adapters.clear()}get size(){return this.adapters.size}}export class BaseFrameworkAdapter{preserveState(e){try{return{framework:this.name,timestamp:Date.now(),data:{},dom:this.captureDOMState(e)}}catch(e){return console.warn(`Failed to preserve state for ${this.name}:`,e),null}}restoreState(e,t){try{t.dom&&this.restoreDOMState(e,t.dom)}catch(e){console.warn(`Failed to restore state for ${this.name}:`,e)}}handleError(e,t){console.error(`HMR error in ${this.name} island:`,t);let n=document.createElement(`div`);n.className=`hmr-error-indicator`,n.style.cssText=`
|
|
2
|
-
position: absolute;
|
|
3
|
-
top: 0;
|
|
4
|
-
left: 0;
|
|
5
|
-
right: 0;
|
|
6
|
-
background: #ff4444;
|
|
7
|
-
color: white;
|
|
8
|
-
padding: 8px;
|
|
9
|
-
font-size: 12px;
|
|
10
|
-
font-family: monospace;
|
|
11
|
-
z-index: 10000;
|
|
12
|
-
border-bottom: 2px solid #cc0000;
|
|
13
|
-
`,n.textContent=`HMR Error: ${t.message}`;let r=e.querySelector(`.hmr-error-indicator`);r&&r.remove(),e.style.position=`relative`,e.insertBefore(n,e.firstChild),e.setAttribute(`data-hmr-error`,`true`),e.setAttribute(`data-hmr-error-message`,t.message)}captureDOMState(e){let t={};(e.querySelectorAll(`[data-preserve-scroll]`).length>0||e.scrollTop>0||e.scrollLeft>0)&&(t.scrollPosition={x:e.scrollLeft,y:e.scrollTop});let n=document.activeElement;if(n&&e.contains(n)){let e=this.getElementSelector(n);e&&(t.focusedElement=e)}let r=e.querySelectorAll(`input, textarea, select`);return r.length>0&&(t.formValues={},r.forEach((e,n)=>{let r=e,i=r.name||r.id||`element-${n}`;r.type===`checkbox`||r.type===`radio`?t.formValues[i]=r.checked:t.formValues[i]=r.value})),t}restoreDOMState(e,t){if(t){if(t.scrollPosition&&(e.scrollLeft=t.scrollPosition.x,e.scrollTop=t.scrollPosition.y),t.focusedElement)try{let n=e.querySelector(t.focusedElement);n&&typeof n.focus==`function`&&n.focus()}catch(e){console.warn(`Failed to restore focus:`,e)}t.formValues&&e.querySelectorAll(`input, textarea, select`).forEach((e,n)=>{let r=e,i=r.name||r.id||`element-${n}`,a=t.formValues[i];a!==void 0&&(r.type===`checkbox`||r.type===`radio`?r.checked=a:r.value=a)})}}getElementSelector(e){if(e.id)return`#${e.id}`;let t=e.getAttribute(`name`);if(t)return`[name="${t}"]`;let n=e.parentElement;if(n){let t=Array.from(n.children).indexOf(e);return`${e.tagName.toLowerCase()}:nth-child(${t+1})`}return null}}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{AdapterRegistry as e}from"./framework-adapter.js";import{getCSSHMRHandler as t}from"./css-hmr-handler.js";export class HMRCoordinator{registry=new e;stateSnapshots=new Map;updateQueue=new Set;isProcessing=!1;initialize(){import.meta.hot&&(import.meta.hot.accept(),import.meta.hot.on(`vite:beforeUpdate`,e=>{this.handleUpdate(e)}),import.meta.hot.on(`vite:beforeFullReload`,()=>{this.handleBeforeFullReload()}),import.meta.hot.on(`vite:error`,e=>{console.error(`[HMR] error:`,e),this.handleError(e)}),document.addEventListener(`hmr-update-required`,e=>{let{src:t,reason:n}=e.detail;n===`css-module-update`&&(this.updateQueue.add(this.normalizePath(t)),this.isProcessing||this.processUpdateQueue().catch(e=>{console.error(`[HMR] Failed to process CSS module update:`,e)}))}))}registerAdapter(e,t){this.registry.register(e,t)}getRegistry(){return this.registry}async handleUpdate(e){if(e.type!==`update`||!e.updates)return;let t=[],n=[];for(let r of e.updates)r.type===`css-update`?t.push(r):n.push(r);this.processCSSUpdates(t),this.queueJSUpdates(n),!this.isProcessing&&this.updateQueue.size>0&&await this.processUpdateQueue()}processCSSUpdates(e){if(e.length===0)return;let n=t();for(let t of e)try{n.handleCSSUpdate(t)}catch(e){console.error(`[HMR] CSS update failed:`,e)}}queueJSUpdates(e){for(let t of e){let e=this.normalizePath(t.path||t.acceptedPath);this.isIslandModule(e)&&this.updateQueue.add(e)}}async processUpdateQueue(){if(this.updateQueue.size!==0){this.isProcessing=!0;try{let e=Array.from(this.updateQueue);this.updateQueue.clear();for(let t of e){let e=this.findAffectedIslands(t);for(let t of e)try{await this.updateIsland(t)}catch(e){console.error(`[HMR] Failed to update island:`,e)}}}finally{this.isProcessing=!1}}}findAffectedIslands(e){let t=[],n=this.normalizePath(e),r=document.querySelectorAll(`[data-src]`);for(let e of r){let r=e.dataset.src;if(!r)continue;let i=this.normalizePath(r);(i===n||i.endsWith(n)||n.endsWith(i)||i.split(`/`).pop()===n.split(`/`).pop())&&t.push(e)}return t}async updateIsland(e){let t=e.dataset.framework,n=e.dataset.src,r=e.dataset.props;if(!t||!n){console.warn(`[HMR] Island missing framework or src attribute`,e);return}let i=this.registry.get(t.toLowerCase());if(!i){console.warn(`[HMR] No adapter registered for framework: ${t}`);return}try{let a=r?JSON.parse(r):{},o=i.preserveState(e);o&&this.stateSnapshots.set(this.getIslandId(e),o),delete e.dataset.hydrated,delete e.dataset.hydrationStatus,e.querySelector(`.hydration-error-indicator, .hmr-error-indicator`)?.remove();let s=Date.now(),c=await import(n.includes(`?`)?`${n}&t=${s}`:`${n}?t=${s}`),l=this.resolveComponent(c,n);await i.update(e,l,a),o&&(i.restoreState(e,o),this.stateSnapshots.delete(this.getIslandId(e))),e.dataset.hydrated=`true`,e.dispatchEvent(new CustomEvent(`hmr-update`,{detail:{framework:t,src:n,timestamp:Date.now(),success:!0},bubbles:!0}))}catch(r){throw console.error(`[HMR] Failed to update ${t} island ${n}:`,r),i.handleError(e,r),e.dispatchEvent(new CustomEvent(`hmr-error`,{detail:{framework:t,src:n,error:r.message,timestamp:Date.now()},bubbles:!0})),r}}resolveComponent(e,t){if(e.default)return e.default;for(let t of Object.keys(e)){if(t===`default`)continue;let n=e[t];if(typeof n==`function`&&n.prototype)return n}throw Error(`Component ${t} has no default export`)}handleBeforeFullReload(){let e=document.querySelectorAll(`[data-hydrated="true"]`),t={};for(let n of e){let e=n.dataset.framework,r=n.dataset.src;if(!e||!r)continue;let i=this.registry.get(e.toLowerCase());if(!i)continue;let a=i.preserveState(n);a&&(t[r]=a)}try{sessionStorage.setItem(`__avalon_hmr_states__`,JSON.stringify(t))}catch(e){console.warn(`[HMR] Failed to save states:`,e)}}handleError(e){let t=Error(e.err.message);t.stack=e.err.stack,console.error(`[HMR] Error:`,t),globalThis.window!==void 0&&import(`./hmr-error-overlay.js`).then(({showHMRErrorOverlay:n})=>{n({framework:`unknown`,src:`unknown`,error:t,filePath:e.err.id||e.err.loc?.file||`unknown`,line:e.err.loc?.line,column:e.err.loc?.column})}).catch(()=>{console.error(`[HMR] Failed to show error overlay`)})}normalizePath(e){return e.replaceAll(`\\`,`/`).replace(/^\//,``).replace(/\?.*$/,``).replace(/#.*$/,``).replace(/^src\//,``)}isIslandModule(e){return e.includes(`/islands/`)||e.includes(`\\islands\\`)}getIslandId(e){let t=e.dataset.src??``;return`${e.dataset.framework??``}:${t}:${Array.from(document.querySelectorAll(`[data-src="${t}"]`)).indexOf(e)}`}}let r=null;export function getHMRCoordinator(){return r??=new HMRCoordinator,r}export function initializeHMR(){import.meta.hot&&getHMRCoordinator().initialize()}
|
|
@@ -1,214 +0,0 @@
|
|
|
1
|
-
export function showHMRErrorOverlay({framework:e,src:a,error:o,filePath:s,line:c,column:l}){removeHMRErrorOverlay();let u=document.createElement(`div`);u.id=`avalon-hmr-error-overlay`,u.style.cssText=`
|
|
2
|
-
position: fixed;
|
|
3
|
-
top: 0;
|
|
4
|
-
left: 0;
|
|
5
|
-
right: 0;
|
|
6
|
-
bottom: 0;
|
|
7
|
-
background: rgba(0, 0, 0, 0.85);
|
|
8
|
-
z-index: 99999;
|
|
9
|
-
display: flex;
|
|
10
|
-
align-items: center;
|
|
11
|
-
justify-content: center;
|
|
12
|
-
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
|
13
|
-
backdrop-filter: blur(4px);
|
|
14
|
-
`;let d=document.createElement(`div`);d.style.cssText=`
|
|
15
|
-
background: #1a1a2e;
|
|
16
|
-
border-radius: 12px;
|
|
17
|
-
max-width: 700px;
|
|
18
|
-
width: 90%;
|
|
19
|
-
max-height: 80vh;
|
|
20
|
-
overflow: auto;
|
|
21
|
-
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
|
|
22
|
-
border: 1px solid rgba(255, 255, 255, 0.1);
|
|
23
|
-
`;let f=document.createElement(`div`);f.style.cssText=`
|
|
24
|
-
background: linear-gradient(135deg, #e74c3c, #c0392b);
|
|
25
|
-
padding: 16px 20px;
|
|
26
|
-
display: flex;
|
|
27
|
-
align-items: center;
|
|
28
|
-
justify-content: space-between;
|
|
29
|
-
border-radius: 12px 12px 0 0;
|
|
30
|
-
`;let p=document.createElement(`div`);p.style.cssText=`
|
|
31
|
-
display: flex;
|
|
32
|
-
align-items: center;
|
|
33
|
-
gap: 10px;
|
|
34
|
-
color: white;
|
|
35
|
-
font-weight: 600;
|
|
36
|
-
font-size: 16px;
|
|
37
|
-
`,p.innerHTML=`
|
|
38
|
-
<span style="font-size: 20px;">⚠️</span>
|
|
39
|
-
<span>HMR Update Failed</span>
|
|
40
|
-
`;let m=document.createElement(`button`);m.style.cssText=`
|
|
41
|
-
background: rgba(255, 255, 255, 0.2);
|
|
42
|
-
border: none;
|
|
43
|
-
color: white;
|
|
44
|
-
width: 28px;
|
|
45
|
-
height: 28px;
|
|
46
|
-
border-radius: 6px;
|
|
47
|
-
cursor: pointer;
|
|
48
|
-
font-size: 18px;
|
|
49
|
-
display: flex;
|
|
50
|
-
align-items: center;
|
|
51
|
-
justify-content: center;
|
|
52
|
-
transition: background 0.2s;
|
|
53
|
-
`,m.textContent=`×`,m.onmouseover=()=>m.style.background=`rgba(255, 255, 255, 0.3)`,m.onmouseout=()=>m.style.background=`rgba(255, 255, 255, 0.2)`,m.onclick=removeHMRErrorOverlay,f.appendChild(p),f.appendChild(m);let h=document.createElement(`div`);h.style.cssText=`
|
|
54
|
-
padding: 20px;
|
|
55
|
-
color: #e0e0e0;
|
|
56
|
-
`;let g=document.createElement(`div`);g.style.cssText=`
|
|
57
|
-
background: rgba(255, 255, 255, 0.05);
|
|
58
|
-
border-radius: 8px;
|
|
59
|
-
padding: 12px 16px;
|
|
60
|
-
margin-bottom: 16px;
|
|
61
|
-
font-family: 'SF Mono', Monaco, 'Cascadia Code', monospace;
|
|
62
|
-
font-size: 13px;
|
|
63
|
-
`;let _=s||a,v=c?`:${c}${l?`:${l}`:``}`:``;g.innerHTML=`
|
|
64
|
-
<div style="color: #888; font-size: 11px; text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 6px;">
|
|
65
|
-
Component
|
|
66
|
-
</div>
|
|
67
|
-
<div style="color: #61dafb; word-break: break-all;">
|
|
68
|
-
${n(_)}${v}
|
|
69
|
-
</div>
|
|
70
|
-
<div style="margin-top: 8px; color: #888; font-size: 11px; text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 6px;">
|
|
71
|
-
Framework
|
|
72
|
-
</div>
|
|
73
|
-
<div style="color: #a78bfa;">
|
|
74
|
-
${n(e)}
|
|
75
|
-
</div>
|
|
76
|
-
`;let y=document.createElement(`div`);y.style.cssText=`
|
|
77
|
-
margin-bottom: 16px;
|
|
78
|
-
`;let b=document.createElement(`div`);b.style.cssText=`
|
|
79
|
-
color: #888;
|
|
80
|
-
font-size: 11px;
|
|
81
|
-
text-transform: uppercase;
|
|
82
|
-
letter-spacing: 0.5px;
|
|
83
|
-
margin-bottom: 8px;
|
|
84
|
-
`,b.textContent=`Error Message`;let x=document.createElement(`div`);if(x.style.cssText=`
|
|
85
|
-
background: rgba(231, 76, 60, 0.1);
|
|
86
|
-
border: 1px solid rgba(231, 76, 60, 0.3);
|
|
87
|
-
border-radius: 8px;
|
|
88
|
-
padding: 12px 16px;
|
|
89
|
-
color: #ff6b6b;
|
|
90
|
-
font-family: 'SF Mono', Monaco, 'Cascadia Code', monospace;
|
|
91
|
-
font-size: 13px;
|
|
92
|
-
white-space: pre-wrap;
|
|
93
|
-
word-break: break-word;
|
|
94
|
-
`,x.textContent=o.message||String(o),y.appendChild(b),y.appendChild(x),o.stack){let e=document.createElement(`div`);e.style.cssText=`
|
|
95
|
-
margin-bottom: 16px;
|
|
96
|
-
`;let t=document.createElement(`div`);t.style.cssText=`
|
|
97
|
-
color: #888;
|
|
98
|
-
font-size: 11px;
|
|
99
|
-
text-transform: uppercase;
|
|
100
|
-
letter-spacing: 0.5px;
|
|
101
|
-
margin-bottom: 8px;
|
|
102
|
-
display: flex;
|
|
103
|
-
align-items: center;
|
|
104
|
-
justify-content: space-between;
|
|
105
|
-
`;let n=document.createElement(`span`);n.textContent=`Stack Trace`;let i=document.createElement(`button`);i.style.cssText=`
|
|
106
|
-
background: rgba(255, 255, 255, 0.1);
|
|
107
|
-
border: none;
|
|
108
|
-
color: #888;
|
|
109
|
-
padding: 4px 8px;
|
|
110
|
-
border-radius: 4px;
|
|
111
|
-
cursor: pointer;
|
|
112
|
-
font-size: 11px;
|
|
113
|
-
`,i.textContent=`Show`,t.appendChild(n),t.appendChild(i);let a=document.createElement(`div`);a.style.cssText=`
|
|
114
|
-
background: rgba(0, 0, 0, 0.3);
|
|
115
|
-
border-radius: 8px;
|
|
116
|
-
padding: 12px 16px;
|
|
117
|
-
color: #888;
|
|
118
|
-
font-family: 'SF Mono', Monaco, 'Cascadia Code', monospace;
|
|
119
|
-
font-size: 11px;
|
|
120
|
-
white-space: pre-wrap;
|
|
121
|
-
word-break: break-word;
|
|
122
|
-
max-height: 200px;
|
|
123
|
-
overflow: auto;
|
|
124
|
-
display: none;
|
|
125
|
-
`,a.textContent=r(o.stack),i.onclick=()=>{let e=a.style.display===`none`;a.style.display=e?`block`:`none`,i.textContent=e?`Hide`:`Show`},e.appendChild(t),e.appendChild(a),h.appendChild(e)}let S=i(o,e);if(S.length>0){let e=document.createElement(`div`);e.style.cssText=`
|
|
126
|
-
background: rgba(46, 204, 113, 0.1);
|
|
127
|
-
border: 1px solid rgba(46, 204, 113, 0.3);
|
|
128
|
-
border-radius: 8px;
|
|
129
|
-
padding: 12px 16px;
|
|
130
|
-
`;let t=document.createElement(`div`);t.style.cssText=`
|
|
131
|
-
color: #2ecc71;
|
|
132
|
-
font-size: 12px;
|
|
133
|
-
font-weight: 600;
|
|
134
|
-
margin-bottom: 8px;
|
|
135
|
-
display: flex;
|
|
136
|
-
align-items: center;
|
|
137
|
-
gap: 6px;
|
|
138
|
-
`,t.innerHTML=`<span>💡</span><span>Suggestions</span>`;let n=document.createElement(`ul`);n.style.cssText=`
|
|
139
|
-
margin: 0;
|
|
140
|
-
padding-left: 20px;
|
|
141
|
-
color: #a0a0a0;
|
|
142
|
-
font-size: 13px;
|
|
143
|
-
line-height: 1.6;
|
|
144
|
-
`;for(let e of S){let t=document.createElement(`li`);t.textContent=e,n.appendChild(t)}e.appendChild(t),e.appendChild(n),h.appendChild(e)}let C=document.createElement(`div`);C.style.cssText=`
|
|
145
|
-
padding: 12px 20px;
|
|
146
|
-
border-top: 1px solid rgba(255, 255, 255, 0.1);
|
|
147
|
-
display: flex;
|
|
148
|
-
justify-content: space-between;
|
|
149
|
-
align-items: center;
|
|
150
|
-
font-size: 12px;
|
|
151
|
-
color: #666;
|
|
152
|
-
`;let w=document.createElement(`span`);w.textContent=`${new Date().toLocaleTimeString()}`;let T=document.createElement(`div`);T.style.cssText=`
|
|
153
|
-
display: flex;
|
|
154
|
-
gap: 8px;
|
|
155
|
-
`;let E=document.createElement(`button`);E.style.cssText=`
|
|
156
|
-
background: #3498db;
|
|
157
|
-
border: none;
|
|
158
|
-
color: white;
|
|
159
|
-
padding: 6px 12px;
|
|
160
|
-
border-radius: 6px;
|
|
161
|
-
cursor: pointer;
|
|
162
|
-
font-size: 12px;
|
|
163
|
-
font-weight: 500;
|
|
164
|
-
`,E.textContent=`Reload Page`,E.onclick=()=>globalThis.location.reload();let D=document.createElement(`button`);D.style.cssText=`
|
|
165
|
-
background: rgba(255, 255, 255, 0.1);
|
|
166
|
-
border: none;
|
|
167
|
-
color: #888;
|
|
168
|
-
padding: 6px 12px;
|
|
169
|
-
border-radius: 6px;
|
|
170
|
-
cursor: pointer;
|
|
171
|
-
font-size: 12px;
|
|
172
|
-
`,D.textContent=`Dismiss`,D.onclick=removeHMRErrorOverlay,T.appendChild(D),T.appendChild(E),C.appendChild(w),C.appendChild(T),h.insertBefore(g,h.firstChild),h.insertBefore(y,h.children[1]),d.appendChild(f),d.appendChild(h),d.appendChild(C),u.appendChild(d);let O=e=>{e.key===`Escape`&&removeHMRErrorOverlay()};document.addEventListener(`keydown`,O),u._keydownHandler=O,document.body.appendChild(u)}export function removeHMRErrorOverlay(){let e=document.getElementById(`avalon-hmr-error-overlay`);e&&(e._keydownHandler&&document.removeEventListener(`keydown`,e._keydownHandler),e.remove())}function n(e){let t=document.createElement(`div`);return t.textContent=e,t.innerHTML}function r(e){return e.split(`
|
|
173
|
-
`).map(e=>e.trim()).filter(e=>e.length>0).join(`
|
|
174
|
-
`)}function i(e,t){let n=[],r=e.message?.toLowerCase()||``;switch(r.includes(`no default export`)&&(n.push(`Ensure your component has a default export`),n.push(`Check that the export statement is correct: export default ComponentName`)),(r.includes(`cannot find module`)||r.includes(`module not found`))&&(n.push(`Check that the import path is correct`),n.push(`Verify the file exists at the specified location`),n.push(`Check for typos in the file name or path`)),(r.includes(`syntax error`)||r.includes(`unexpected token`))&&(n.push(`Check for syntax errors in your component`),n.push(`Ensure all brackets and parentheses are properly closed`)),(r.includes(`hydration`)||r.includes(`mismatch`))&&(n.push(`Ensure server and client render the same initial content`),n.push(`Check for browser-only code that runs during SSR`)),t){case`vue`:r.includes(`template`)&&n.push(`Check your Vue template syntax`);break;case`svelte`:r.includes(`compile`)&&(n.push(`Check your Svelte component syntax`),n.push(`Ensure reactive statements use $: prefix`));break;case`solid`:(r.includes(`signal`)||r.includes(`reactive`))&&n.push(`Check your Solid.js signal usage`);break;case`lit`:(r.includes(`custom element`)||r.includes(`define`))&&n.push(`Ensure your Lit element is properly decorated with @customElement`);break}return n.length===0&&(n.push(`Check the browser console for more details`),n.push(`Try reloading the page`)),n}export function showHMRToast({message:e,type:t=`info`,duration:r=3e3}){let i=document.getElementById(`avalon-hmr-toast`);i&&i.remove();let a={success:{bg:`#2ecc71`,icon:`✓`},error:{bg:`#e74c3c`,icon:`✕`},info:{bg:`#3498db`,icon:`ℹ`}},{bg:o,icon:s}=a[t]||a.info,c=document.createElement(`div`);c.id=`avalon-hmr-toast`,c.style.cssText=`
|
|
175
|
-
position: fixed;
|
|
176
|
-
bottom: 20px;
|
|
177
|
-
right: 20px;
|
|
178
|
-
background: ${o};
|
|
179
|
-
color: white;
|
|
180
|
-
padding: 12px 16px;
|
|
181
|
-
border-radius: 8px;
|
|
182
|
-
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
183
|
-
font-size: 13px;
|
|
184
|
-
display: flex;
|
|
185
|
-
align-items: center;
|
|
186
|
-
gap: 8px;
|
|
187
|
-
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
|
|
188
|
-
z-index: 99998;
|
|
189
|
-
animation: slideIn 0.3s ease;
|
|
190
|
-
`,c.innerHTML=`
|
|
191
|
-
<span style="font-weight: bold;">${s}</span>
|
|
192
|
-
<span>${n(e)}</span>
|
|
193
|
-
`;let l=document.createElement(`style`);l.textContent=`
|
|
194
|
-
@keyframes slideIn {
|
|
195
|
-
from {
|
|
196
|
-
transform: translateX(100%);
|
|
197
|
-
opacity: 0;
|
|
198
|
-
}
|
|
199
|
-
to {
|
|
200
|
-
transform: translateX(0);
|
|
201
|
-
opacity: 1;
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
@keyframes slideOut {
|
|
205
|
-
from {
|
|
206
|
-
transform: translateX(0);
|
|
207
|
-
opacity: 1;
|
|
208
|
-
}
|
|
209
|
-
to {
|
|
210
|
-
transform: translateX(100%);
|
|
211
|
-
opacity: 0;
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
`,c.appendChild(l),document.body.appendChild(c),setTimeout(()=>{c.style.animation=`slideOut 0.3s ease`,setTimeout(()=>c.remove(),300)},r)}
|
package/dist/src/client/main.js
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
document.readyState===`loading`?document.addEventListener(`DOMContentLoaded`,e):e();function e(){let e=document.querySelectorAll(`[data-framework]`);e.length!==0&&e.forEach(e=>{try{let o=e.dataset.framework,s=e.dataset.condition||`on:client`;if(e.dataset.renderStrategy===`ssr-only`||!t(e,s))return;s===`on:client`?c(e,o):s===`on:visible`?n(e,o):s===`on:interaction`?r(e,o):s===`on:idle`?i(e,o):s.startsWith(`media:`)?a(e,o,s.slice(6)):c(e,o)}catch(t){console.error(`Error processing island:`,t),l(e,e.dataset.framework||`unknown`,e.dataset.src||`unknown`,t)}})}function t(e,t){if(!t||t===`on:client`)return!0;if(t.startsWith(`media:`)){let e=t.slice(6);try{return globalThis.matchMedia(e).matches}catch(t){return console.error(`Invalid media query:`,e,t),!0}}return t===`on:visible`||t===`on:interaction`||t===`on:idle`||console.warn(`Unknown hydration condition:`,t),!0}function n(e,t){try{let n=new IntersectionObserver(r=>{r[0].isIntersecting&&(c(e,t),n.disconnect())},{rootMargin:`50px`,threshold:0});n.observe(e)}catch(n){console.error(`Failed to setup intersection observer:`,n),c(e,t)}}function r(e,t){let n=[`click`,`touchstart`,`mouseenter`,`focusin`],r=!1,i=()=>{r||(r=!0,n.forEach(t=>{e.removeEventListener(t,i)}),c(e,t))};try{n.forEach(t=>{e.addEventListener(t,i,{once:!0,passive:!0})})}catch(n){console.error(`Failed to setup interaction observer:`,n),c(e,t)}}function i(e,t){try{`requestIdleCallback`in globalThis?globalThis.requestIdleCallback(()=>{c(e,t)},{timeout:5e3}):document.readyState===`complete`?setTimeout(()=>{c(e,t)},200):globalThis.addEventListener(`load`,()=>{setTimeout(()=>{c(e,t)},200)},{once:!0})}catch(n){console.error(`Failed to setup idle callback:`,n),c(e,t)}}function a(e,t,n){try{let r=globalThis.matchMedia(n);if(r.matches){c(e,t);return}let i=n=>{n.matches&&(c(e,t),r.removeEventListener(`change`,i))};r.addEventListener(`change`,i)}catch(r){console.error(`Failed to setup media query:`,n,r),c(e,t)}}async function o(e){switch(e){case`preact`:return import(`/@useavalon/preact/client`);case`react`:return import(`/@useavalon/react/client`);case`vue`:return import(`/@useavalon/vue/client`);case`svelte`:return import(`/@useavalon/svelte/client`);case`solid`:return import(`/@useavalon/solid/client`);case`lit`:return import(`/@useavalon/lit/client`);case`qwik`:return import(`/@useavalon/qwik/client`);default:throw Error(`Unknown framework: ${e}`)}}function s(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`&&t.prototype){n=t;break}}n||=e}if(!n)throw Error(`Component ${t} has no default export`);return n}async function c(e,t){if(e.dataset.hydrated)return;let n=e.dataset.src,r=e.dataset.props;if(!n){console.warn(`Island missing data-src attribute`);return}try{let i=r?JSON.parse(r):{};t===`lit`&&await import(`/@useavalon/lit/client`);let a=s(await import(n),n);try{let n=await o(t);if(!n.hydrate||typeof n.hydrate!=`function`)throw Error(`Integration ${t} does not export a hydrate function`);n.hydrate(e,a,i),e.dataset.hydrated=`true`}catch(r){import.meta.env?.DEV&&console.error(`Integration hydration failed for ${t}: ${n}`,r),e.dataset.hydrationStatus=`failed`,e.dataset.hydrationError=r.message,e.dispatchEvent(new CustomEvent(`hydration-error`,{detail:{framework:t,src:n,error:r.message,timestamp:Date.now(),hydrationType:`integration-level`},bubbles:!0}))}}catch(r){console.error(`❌ Critical error hydrating ${t} island ${n}:`,r),l(e,t,n,r)}}function l(e,t,n,r){console.error(`Hydration error for ${t} island:`,{src:n,error:r.message,stack:r.stack}),e.dataset.hydrationStatus=`failed`,e.dataset.renderStrategy=`ssr-only`,e.classList.add(`hydration-failed`),e.dispatchEvent(new CustomEvent(`hydration-error`,{detail:{framework:t,src:n,error:r.message,timestamp:Date.now()},bubbles:!0})),d()&&u(e,t,n,r)}function u(e,t,n,r){let i=document.createElement(`div`);i.className=`hydration-error-indicator`,i.style.cssText=`
|
|
2
|
-
position: absolute;
|
|
3
|
-
top: 0;
|
|
4
|
-
right: 0;
|
|
5
|
-
background: #ff4444;
|
|
6
|
-
color: white;
|
|
7
|
-
padding: 4px 8px;
|
|
8
|
-
font-size: 11px;
|
|
9
|
-
font-family: monospace;
|
|
10
|
-
border-radius: 0 0 0 4px;
|
|
11
|
-
z-index: 9999;
|
|
12
|
-
cursor: pointer;
|
|
13
|
-
box-shadow: 0 2px 4px rgba(0,0,0,0.2);
|
|
14
|
-
`,i.textContent=`❌ ${t}`,i.title=`Hydration failed: ${n}\n${r.message}\nClick for details`,i.addEventListener(`click`,()=>{alert(`Hydration Error\n\nFramework: ${t}\nComponent: ${n}\n\nError: ${r.message}\n\nStack:\n${r.stack}`)}),globalThis.getComputedStyle(e).position===`static`&&(e.style.position=`relative`),e.appendChild(i)}function d(){return import.meta.env?.DEV||import.meta.env?.MODE===`development`||globalThis.location?.hostname===`localhost`||globalThis.location?.hostname===`127.0.0.1`}function f(e){let t=e.dataset.framework,n=e.dataset.src;if(!n)return null;let r={framework:t,src:n,props:e.dataset.props,scrollPosition:{x:globalThis.scrollX,y:globalThis.scrollY},focusedElement:document.activeElement?.id||null};try{t===`vue`&&e.__vue__?r.vueData=structuredClone(e.__vue__.$data||{}):t===`svelte`&&e.__svelte__?r.svelteState=e.__svelte__:t===`lit`&&e.tagName?.includes(`-`)&&(e.querySelector(`[data-lit-element]`)||e)._$litElement$&&(r.litProperties={})}catch(e){console.warn(`Failed to preserve island state:`,e)}return r}function p(e,t){if(t)try{if(t.scrollPosition&&globalThis.scrollTo(t.scrollPosition.x,t.scrollPosition.y),t.focusedElement){let e=document.getElementById(t.focusedElement);e&&e.focus()}e.dataset.framework===`vue`&&t.vueData&&e.__vue__&&Object.assign(e.__vue__.$data,t.vueData)}catch(e){console.warn(`Failed to restore island state:`,e)}}async function m(e,t,n,r){let i=e.dataset.props,a=i?JSON.parse(i):{};t===`lit`&&await import(`/@useavalon/lit/client`);let c=s(await import(n),r),l=await o(t);if(!l.hydrate||typeof l.hydrate!=`function`)throw Error(`Integration ${t} does not export a hydrate function`);l.hydrate(e,c,a),e.dataset.hydrated=`true`}function h(e,t,n,r){let i=e.querySelector(`.hmr-error-indicator`);i&&i.remove();let a=document.createElement(`div`);a.className=`hmr-error-indicator`,a.style.cssText=`
|
|
15
|
-
position: absolute;
|
|
16
|
-
top: 0;
|
|
17
|
-
left: 0;
|
|
18
|
-
right: 0;
|
|
19
|
-
background: linear-gradient(135deg, #ff6b6b, #ee5a5a);
|
|
20
|
-
color: white;
|
|
21
|
-
padding: 8px 12px;
|
|
22
|
-
font-size: 12px;
|
|
23
|
-
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, monospace;
|
|
24
|
-
z-index: 10000;
|
|
25
|
-
box-shadow: 0 2px 8px rgba(0,0,0,0.3);
|
|
26
|
-
display: flex;
|
|
27
|
-
align-items: center;
|
|
28
|
-
gap: 8px;
|
|
29
|
-
`;let o=document.createElement(`span`);o.textContent=`⚠️`,o.style.fontSize=`14px`;let s=document.createElement(`span`);s.style.flex=`1`,s.innerHTML=`<strong>HMR Failed:</strong> ${r.message.slice(0,100)}${r.message.length>100?`...`:``}`;let c=document.createElement(`button`);c.textContent=`×`,c.style.cssText=`
|
|
30
|
-
background: rgba(255,255,255,0.2);
|
|
31
|
-
border: none;
|
|
32
|
-
color: white;
|
|
33
|
-
width: 20px;
|
|
34
|
-
height: 20px;
|
|
35
|
-
border-radius: 50%;
|
|
36
|
-
cursor: pointer;
|
|
37
|
-
font-size: 14px;
|
|
38
|
-
line-height: 1;
|
|
39
|
-
`,c.onclick=()=>a.remove(),a.appendChild(o),a.appendChild(s),a.appendChild(c),globalThis.getComputedStyle(e).position===`static`&&(e.style.position=`relative`),e.insertBefore(a,e.firstChild)}import.meta.hot&&(import.meta.hot.accept(),import(`./hmr-coordinator.js`).then(async({initializeHMR:e,getHMRCoordinator:t})=>{e();let n=t(),r=new Set;document.querySelectorAll(`[data-framework]`).forEach(e=>{let t=e.dataset.framework;t&&r.add(t)});let i={react:()=>import(`/@useavalon/react/client/hmr`).then(e=>e.reactAdapter),preact:()=>import(`/@useavalon/preact/client/hmr`).then(e=>e.preactAdapter),vue:()=>import(`/@useavalon/vue/client/hmr`).then(e=>e.vueAdapter),svelte:()=>import(`/@useavalon/svelte/client/hmr`).then(e=>e.svelteAdapter),solid:()=>import(`/@useavalon/solid/client/hmr`).then(e=>e.solidAdapter),lit:()=>import(`/@useavalon/lit/client/hmr`).then(e=>e.litAdapter),qwik:()=>import(`/@useavalon/qwik/client/hmr`).then(e=>e.qwikAdapter)};for(let e of r){let t=i[e];if(t)try{let r=await t();n.registerAdapter(e,r)}catch(t){console.warn(`[HMR] Failed to load adapter for ${e}:`,t)}}}).catch(e=>{console.error(`[HMR] Failed to initialize:`,e)}),_());async function g(e,t,n,r){try{let{showHMRErrorOverlay:e}=await import(`./hmr-error-overlay.js`);e({framework:t,src:n,error:r,filePath:n})}catch{h(e,t,n,r)}}function _(){if(!import.meta.hot)return;let e=new Map;async function t(e){let t=e.replaceAll(`\\`,`/`),r=document.querySelectorAll(`[data-src*="${t}"], [data-src$="${t}"]`);if(r.length===0){let e=document.querySelectorAll(`[data-src]`);for(let r of e){let e=r.dataset.src;e&&(e.includes(t)||t.includes(e.replace(/^\//,``)))&&await n(r)}return}for(let e of r)await n(e)}async function n(t){let n=t.dataset.framework,r=t.dataset.src;if(!(!r||!n))try{let i=f(t);e.set(r,i),delete t.dataset.hydrated,delete t.dataset.hydrationStatus;let a=t.querySelector(`.hydration-error-indicator`);a&&a.remove();let o=Date.now();await m(t,n,r.includes(`?`)?`${r}&t=${o}`:`${r}?t=${o}`,r);let s=e.get(r);s&&(p(t,s),e.delete(r)),t.dispatchEvent(new CustomEvent(`hmr-update`,{detail:{framework:n,src:r,timestamp:Date.now(),success:!0},bubbles:!0}))}catch(e){console.error(`[HMR] Failed for ${n} island ${r}:`,e),t.dispatchEvent(new CustomEvent(`hmr-error`,{detail:{framework:n,src:r,error:e.message,timestamp:Date.now()},bubbles:!0})),d()&&g(t,n,r,e)}}import.meta.hot.on(`vite:beforeUpdate`,e=>{for(let n of e.updates||[]){let e=n.path||n.acceptedPath;e&&(e.includes(`/islands/`)||e.includes(`\\islands\\`))&&t(e)}}),import.meta.hot.on(`vite:beforeFullReload`,()=>{let e=document.querySelectorAll(`[data-hydrated="true"]`),t={};for(let n of e){let e=n.dataset.src;e&&(t[e]=f(n))}try{sessionStorage.setItem(`__avalon_hmr_states__`,JSON.stringify(t))}catch{}});try{let e=sessionStorage.getItem(`__avalon_hmr_states__`);if(e){let t=JSON.parse(e);sessionStorage.removeItem(`__avalon_hmr_states__`),setTimeout(()=>{for(let[e,n]of Object.entries(t)){let t=document.querySelector(`[data-src="${e}"]`);t&&n&&p(t,n)}},100)}}catch{}}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{jsx as e}from"react/jsx-runtime";function t(e){return/\s\d+w/.test(e)}export function Image({src:n,alt:r,sizes:i,loading:a=`lazy`,decoding:o=`async`,width:s,height:c,className:l,style:u}){let d,f,p,m;return typeof n==`object`&&n?(d=n.src,f=n.srcset,p=n.width,m=n.height):typeof n==`string`&&(t(n)?(f=n,d=n.split(`,`)[0]?.trim().split(` `)[0]):d=n),e(`img`,{src:d,srcSet:f,sizes:i,alt:r,loading:a,decoding:o,width:s??p,height:c??m,className:l,style:u})}export default Image;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Component as e}from"preact";import{jsx as t,jsxs as n}from"react/jsx-runtime";export class IslandErrorBoundary extends e{constructor(e){super(e),this.state={hasError:!1,error:null,errorInfo:null}}static getDerivedStateFromError(e){return{hasError:!0,error:e}}componentDidCatch(e,t){let n={layoutPath:`island:${this.props.islandId}`,errorType:`island`,timestamp:Date.now(),componentStack:t.componentStack,errorBoundary:`IslandErrorBoundary`};if(this.setState({errorInfo:n}),this.props.onError&&this.props.onError(e,n),typeof Deno<`u`&&Deno.env.get(`NODE_ENV`)===`development`&&console.error(`Island Error [${this.props.islandId}]:`,e),!this.props.isolateError)throw e}handleRemoveIsland=()=>{let e=document.querySelector(`[data-island-id="${this.props.islandId}"]`);e&&e.remove()};handleReloadIsland=()=>{this.setState({hasError:!1,error:null,errorInfo:null})};renderFallback(){let{error:e}=this.state,{fallback:r,islandId:i}=this.props;if(r&&e)return r(e,i);let a=typeof Deno<`u`&&Deno.env.get(`NODE_ENV`)===`development`;return t(`div`,{class:`island-error-boundary`,"data-island-error":i,children:n(`div`,{class:`island-error-container`,children:[n(`div`,{class:`island-error-header`,children:[t(`span`,{class:`island-error-icon`,children:`⚠️`}),t(`span`,{class:`island-error-title`,children:`Island Error`})]}),n(`p`,{class:`island-error-message`,children:[`An error occurred in island "`,i,`". The rest of the page should work normally.`]}),n(`div`,{class:`island-error-actions`,children:[t(`button`,{onClick:this.handleReloadIsland,class:`island-reload-button`,children:`Reload Island`}),t(`button`,{onClick:this.handleRemoveIsland,class:`island-remove-button`,children:`Remove Island`})]}),a&&e&&n(`details`,{class:`island-error-details`,children:[t(`summary`,{children:`Error Details (Development)`}),n(`div`,{class:`island-error-info`,children:[n(`p`,{children:[t(`strong`,{children:`Island ID:`}),` `,i]}),n(`p`,{children:[t(`strong`,{children:`Error:`}),` `,e.message]})]}),t(`pre`,{class:`island-error-stack`,children:e.stack})]})]})})}render(){return this.state.hasError?this.renderFallback():this.props.children}}export function withIslandErrorBoundary(e,n,i){return function(a){return t(IslandErrorBoundary,{islandId:n,fallback:i?.fallback,isolateError:i?.isolateError??!0,onError:i?.onError,children:t(e,{...a})})}}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Component as e}from"preact";import{jsx as t,jsxs as n}from"react/jsx-runtime";export class LayoutDataErrorBoundary extends e{maxRetries=3;constructor(e){super(e),this.state={hasError:!1,error:null,errorInfo:null,retryCount:0,isRetrying:!1,fallbackData:e.fallbackData||null}}static getDerivedStateFromError(e){return{hasError:!0,error:e}}componentDidCatch(e,t){let n={layoutPath:this.props.layoutPath,errorType:`loader`,timestamp:Date.now(),componentStack:t.componentStack,errorBoundary:`LayoutDataErrorBoundary`};this.setState({errorInfo:n}),this.props.onError&&this.props.onError(e,n)}handleRetry=async()=>{if(!(this.state.retryCount>=this.maxRetries||!this.props.retryLoader)){this.setState({isRetrying:!0});try{let e=await this.props.retryLoader();this.setState({hasError:!1,error:null,errorInfo:null,retryCount:this.state.retryCount+1,isRetrying:!1,fallbackData:e})}catch(e){this.setState({retryCount:this.state.retryCount+1,isRetrying:!1,error:e instanceof Error?e:Error(String(e))})}}};handleUseFallback=()=>{this.state.fallbackData&&this.setState({hasError:!1,error:null,errorInfo:null})};renderErrorUI(){let{error:e,retryCount:r,isRetrying:i,fallbackData:a}=this.state,o=r<this.maxRetries&&this.props.retryLoader,s=a!==null,c=typeof Deno<`u`&&Deno.env.get(`NODE_ENV`)===`development`;return t(`div`,{class:`layout-data-error-boundary`,children:n(`div`,{class:`error-container`,children:[t(`h3`,{children:`Data Loading Error`}),n(`p`,{children:[`Failed to load data for layout: `,this.props.layoutPath]}),n(`div`,{class:`error-actions`,children:[o&&t(`button`,{onClick:this.handleRetry,disabled:i,class:`retry-button`,children:i?`Retrying...`:`Retry (${this.maxRetries-r} left)`}),s&&t(`button`,{onClick:this.handleUseFallback,class:`fallback-button`,children:`Use Cached Data`})]}),c&&e&&n(`details`,{class:`error-details`,children:[t(`summary`,{children:`Error Details (Development)`}),n(`div`,{class:`error-info`,children:[n(`p`,{children:[t(`strong`,{children:`Error:`}),` `,e.message]}),n(`p`,{children:[t(`strong`,{children:`Layout:`}),` `,this.props.layoutPath]}),n(`p`,{children:[t(`strong`,{children:`Retry Count:`}),` `,r]})]}),t(`pre`,{class:`error-stack`,children:e.stack})]})]})})}render(){return this.state.hasError?this.renderErrorUI():this.props.children}}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Component as e}from"preact";import{jsxs as t,jsx as n}from"react/jsx-runtime";export class LayoutErrorBoundary extends e{maxRetries=3;constructor(e){super(e),this.state={hasError:!1,error:null,errorInfo:null,retryCount:0}}static getDerivedStateFromError(e){return{hasError:!0,error:e}}componentDidCatch(e,t){let n={layoutPath:this.props.layoutPath||`unknown`,errorType:this.props.errorType||`component`,timestamp:Date.now(),componentStack:t.componentStack,errorBoundary:this.constructor.name};this.setState({errorInfo:n}),this.props.onError&&this.props.onError(e,n),typeof Deno<`u`&&Deno.env.get(`NODE_ENV`)===`development`&&(console.error(`Layout Error Boundary caught an error:`,e),console.error(`Error Info:`,n),console.error(`Component Stack:`,t.componentStack))}handleRetry=()=>{this.state.retryCount<this.maxRetries&&this.setState({hasError:!1,error:null,errorInfo:null,retryCount:this.state.retryCount+1})};renderFallback(){let{error:e}=this.state,{fallback:r}=this.props;return r&&e?r(e,this.handleRetry):n(`div`,{class:`layout-error-boundary`,children:t(`div`,{class:`error-container`,children:[n(`h2`,{children:`Something went wrong`}),n(`p`,{children:`An error occurred while rendering this layout.`}),this.state.retryCount<this.maxRetries&&t(`button`,{onClick:this.handleRetry,class:`retry-button`,children:[`Try Again (`,this.maxRetries-this.state.retryCount,` attempts left)`]}),typeof Deno<`u`&&Deno.env.get(`NODE_ENV`)===`development`&&t(`details`,{class:`error-details`,children:[n(`summary`,{children:`Error Details (Development)`}),n(`pre`,{children:e?.stack}),this.state.errorInfo&&t(`div`,{children:[t(`p`,{children:[n(`strong`,{children:`Layout Path:`}),` `,this.state.errorInfo.layoutPath]}),t(`p`,{children:[n(`strong`,{children:`Error Type:`}),` `,this.state.errorInfo.errorType]}),t(`p`,{children:[n(`strong`,{children:`Timestamp:`}),` `,new Date(this.state.errorInfo.timestamp).toISOString()]})]})]})]})})}render(){return this.state.hasError?this.renderFallback():this.props.children}}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{PersistentIslandProvider as e}from"../core/islands/persistent-island-context.js";import{defaultIslandPersistence as t}from"../core/islands/island-persistence.js";import{jsx as n}from"preact/jsx-runtime";export function PersistentIsland({persistentId:r,children:i,persistence:a=t}){return n(e,{persistentId:r,persistence:a,children:n(`div`,{"data-persistent-id":r,children:i})})}export default PersistentIsland;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Component as e}from"preact";import{jsx as t,jsxs as n}from"react/jsx-runtime";export class StreamingErrorBoundary extends e{constructor(e){super(e),this.state={hasError:!1,error:null,errorInfo:null}}static getDerivedStateFromError(e){return{hasError:!0,error:e}}componentDidCatch(e,t){if(this.setState({errorInfo:t}),console.error(`[StreamingErrorBoundary] Caught error:`,{componentId:this.props.componentId,error:e.message,stack:e.stack,componentStack:t.componentStack}),this.props.onError&&this.props.onError(e,t),!this.props.isolateError)throw e}handleRetry=()=>{this.setState({hasError:!1,error:null,errorInfo:null})};renderFallback(){let{error:e}=this.state,{fallback:r,componentId:i}=this.props;if(r&&e)return r(e,this.handleRetry);let a=typeof Deno<`u`&&Deno.env.get(`DENO_ENV`)!==`production`;return n(`div`,{class:`streaming-error-boundary`,"data-error-boundary":`true`,"data-component-id":i,style:{background:`#fff3cd`,border:`2px solid #ffc107`,borderRadius:`8px`,padding:`20px`,margin:`20px 0`,fontFamily:`system-ui, -apple-system, sans-serif`},children:[n(`div`,{class:`error-boundary-header`,style:{display:`flex`,alignItems:`center`,gap:`10px`,marginBottom:`10px`},children:[t(`span`,{style:{fontSize:`24px`},children:`⚠️`}),t(`h3`,{style:{margin:0,color:`#856404`},children:`Component Error`})]}),t(`p`,{style:{margin:`10px 0`,color:`#856404`},children:`An error occurred while rendering this component. The rest of the page should work normally.`}),t(`button`,{onClick:this.handleRetry,style:{background:`#ffc107`,border:`none`,borderRadius:`4px`,padding:`8px 16px`,cursor:`pointer`,fontWeight:`bold`,color:`#856404`,marginTop:`10px`},children:`Retry`}),a&&e&&n(`details`,{style:{marginTop:`15px`},children:[t(`summary`,{style:{cursor:`pointer`,color:`#856404`,fontWeight:`bold`},children:`Error Details (Development Mode)`}),n(`div`,{style:{marginTop:`10px`},children:[i&&n(`p`,{children:[t(`strong`,{children:`Component ID:`}),` `,i]}),n(`p`,{children:[t(`strong`,{children:`Error:`}),` `,e.message]}),e.stack&&t(`pre`,{style:{background:`#f5f5f5`,padding:`10px`,borderRadius:`4px`,overflowX:`auto`,fontSize:`12px`,marginTop:`10px`},children:e.stack}),this.state.errorInfo?.componentStack&&n(`div`,{children:[t(`p`,{children:t(`strong`,{children:`Component Stack:`})}),t(`pre`,{style:{background:`#f5f5f5`,padding:`10px`,borderRadius:`4px`,overflowX:`auto`,fontSize:`12px`,marginTop:`10px`},children:this.state.errorInfo.componentStack})]})]})]})]})}render(){return this.state.hasError?this.renderFallback():this.props.children}}export function withStreamingErrorBoundary(e,n){return function(i){return t(StreamingErrorBoundary,{componentId:n?.componentId,fallback:n?.fallback,isolateError:n?.isolateError??!0,onError:n?.onError,children:t(e,{...i})})}}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import{Component as e}from"preact";import{useState as t,useEffect as n,useRef as r}from"preact/hooks";import{jsxs as i,jsx as a}from"react/jsx-runtime";export function StreamingLayout(e){let{component:o,componentProps:c={},children:l,fallback:u,priority:d=`medium`,isReady:f,timeout:p=5e3,onError:m,onLoadingChange:h}=e;if(typeof window>`u`)return l;let[g,_]=t({isReady:!1,isLoading:!0,error:null,hasTimedOut:!1}),v=r(),y=r(!0);return n(()=>()=>{y.current=!1},[]),n(()=>{if(!f){_(e=>({...e,isReady:!0,isLoading:!1})),h?.(!1);return}let e=!1;return(async()=>{try{p>0&&(v.current=setTimeout(()=>{!e&&y.current&&(_(e=>({...e,hasTimedOut:!0,isLoading:!1})),h?.(!1))},p));let t=await f();if(e||!y.current)return;v.current&&clearTimeout(v.current),_(e=>({...e,isReady:t,isLoading:!1,hasTimedOut:!1})),h?.(!1)}catch(t){if(e||!y.current)return;v.current&&clearTimeout(v.current),_(e=>({...e,error:t,isLoading:!1})),h?.(!1)}})(),()=>{e=!0,v.current&&clearTimeout(v.current)}},[f,p,h]),g.error?m?m(g.error):i(`div`,{class:`streaming-error`,"data-priority":d,children:[i(`p`,{children:[`Failed to load component: `,g.error.message]}),a(`button`,{onClick:()=>{_({isReady:!1,isLoading:!0,error:null,hasTimedOut:!1}),h?.(!0)},children:`Retry`})]}):g.hasTimedOut?a(`div`,{class:`streaming-timeout`,"data-priority":d,children:u||i(`div`,{class:`timeout-message`,children:[a(`p`,{children:`Component loading timed out`}),a(`button`,{onClick:()=>{_({isReady:!1,isLoading:!0,error:null,hasTimedOut:!1}),h?.(!0)},children:`Retry`})]})}):g.isLoading||!g.isReady?a(`div`,{class:`streaming-loading`,"data-priority":d,children:u||a(s,{priority:d})}):a(`div`,{class:`streaming-ready`,"data-priority":d,children:a(o,{...c,children:l})})}function s({priority:e}){return i(`div`,{class:`streaming-skeleton ${`skeleton-${e}`}`,children:[i(`div`,{class:`skeleton-content`,children:[a(`div`,{class:`skeleton-line skeleton-line-1`}),a(`div`,{class:`skeleton-line skeleton-line-2`}),a(`div`,{class:`skeleton-line skeleton-line-3`})]}),a(`style`,{children:`
|
|
2
|
-
.streaming-skeleton {
|
|
3
|
-
padding: 1rem;
|
|
4
|
-
border-radius: 0.5rem;
|
|
5
|
-
background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
|
|
6
|
-
background-size: 200% 100%;
|
|
7
|
-
animation: skeleton-loading 1.5s infinite;
|
|
8
|
-
}
|
|
9
|
-
.skeleton-content {
|
|
10
|
-
display: flex;
|
|
11
|
-
flex-direction: column;
|
|
12
|
-
gap: 0.5rem;
|
|
13
|
-
}
|
|
14
|
-
.skeleton-line {
|
|
15
|
-
height: 1rem;
|
|
16
|
-
background: rgba(255, 255, 255, 0.8);
|
|
17
|
-
border-radius: 0.25rem;
|
|
18
|
-
}
|
|
19
|
-
.skeleton-line-1 { width: 100%; }
|
|
20
|
-
.skeleton-line-2 { width: 75%; }
|
|
21
|
-
.skeleton-line-3 { width: 50%; }
|
|
22
|
-
.skeleton-high { border-left: 4px solid #ef4444; }
|
|
23
|
-
.skeleton-medium { border-left: 4px solid #f59e0b; }
|
|
24
|
-
.skeleton-low { border-left: 4px solid #10b981; }
|
|
25
|
-
@keyframes skeleton-loading {
|
|
26
|
-
0% { background-position: 200% 0; }
|
|
27
|
-
100% { background-position: -200% 0; }
|
|
28
|
-
}
|
|
29
|
-
`})]})}export function StreamingSuspense(e){let{fallback:o,children:c,priority:u=`medium`,timeout:d=5e3,onError:f}=e,[p,m]=t(!0),[h,g]=t(null),[_,v]=t(!1),y=r(),b=r(!0);n(()=>()=>{b.current=!1},[]),n(()=>(d>0&&(y.current=setTimeout(()=>{b.current&&p&&(v(!0),m(!1))},d)),()=>{y.current&&clearTimeout(y.current)}),[d,p]);let x=e=>{g(e),m(!1),y.current&&clearTimeout(y.current)};return h?f?f(h):i(`div`,{class:`streaming-suspense-error`,"data-priority":u,children:[i(`p`,{children:[`Suspense boundary error: `,h.message]}),a(`button`,{onClick:()=>{g(null),m(!0),v(!1)},children:`Retry`})]}):_?a(`div`,{class:`streaming-suspense-timeout`,"data-priority":u,children:o||i(`div`,{class:`suspense-timeout-message`,children:[a(`p`,{children:`Suspense boundary timed out`}),a(`button`,{onClick:()=>{v(!1),m(!0)},children:`Retry`})]})}):p?a(`div`,{class:`streaming-suspense-loading`,"data-priority":u,children:o||a(s,{priority:u})}):a(`div`,{class:`streaming-suspense-ready`,"data-priority":u,children:a(l,{onError:x,children:c})})}class l extends e{constructor(e){super(e),this.state={hasError:!1}}static getDerivedStateFromError(e){return{hasError:!0,error:e}}componentDidCatch(e,t){console.error(`StreamingErrorBoundary caught an error:`,e,t),this.props.onError?.(e)}render(){return this.state.hasError?i(`div`,{class:`streaming-error-boundary`,children:[a(`p`,{children:`Something went wrong in streaming component.`}),a(`button`,{onClick:()=>this.setState({hasError:!1,error:void 0}),children:`Retry`})]}):this.props.children}}export function withStreaming(e,t={}){return function(n){return a(StreamingLayout,{component:e,componentProps:n,priority:`medium`,...t})}}export function useStreamingState(e,r=5e3){let[i,a]=t({isReady:!1,isLoading:!0,error:null,hasTimedOut:!1});n(()=>{if(!e){a(e=>({...e,isReady:!0,isLoading:!1}));return}let t=!1,n;return(async()=>{try{r>0&&(n=setTimeout(()=>{t||a(e=>({...e,hasTimedOut:!0,isLoading:!1}))},r));let i=await e();if(t)return;n&&clearTimeout(n),a(e=>({...e,isReady:i,isLoading:!1,hasTimedOut:!1}))}catch(e){if(t)return;n&&clearTimeout(n),a(t=>({...t,error:e,isLoading:!1}))}})(),()=>{t=!0,n&&clearTimeout(n)}},[e,r]);let o=()=>{a({isReady:!1,isLoading:!0,error:null,hasTimedOut:!1})};return{...i,retry:o}}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{analyzeComponent as e,shouldHydrateComponent as t,createComponentMetadata as n}from"./component-detection.js";export async function analyzeComponentFile(r,i={}){try{let{readFile:a}=await import(`node:fs/promises`),o=await a(r,`utf-8`),s=e(r,o),l=t(s,i),u=n(r,o,s);return i.logDecisions&&c(r,s,l),{metadata:u,decision:l,analysis:s}}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`Failed to analyze component ${r}: ${t}`)}}export function analyzeComponentContent(r,i,a={}){let o=e(r,i),s=t(o,a),l=n(r,i,o);return a.logDecisions&&c(r,o,s),{metadata:l,decision:s,analysis:o}}export async function analyzeComponents(e,t={}){let n=new Map;for(let i of e)try{let e=await analyzeComponentFile(i,t);n.set(i,e)}catch(e){let t=e instanceof Error?e.message:String(e);console.error(`Failed to analyze ${i}:`,t)}return n}export async function shouldHydrate(e,t={}){try{return(await analyzeComponentFile(e,t)).decision.shouldHydrate}catch(t){let n=t instanceof Error?t.message:String(t);return console.error(`Error checking hydration for ${e}:`,n),!0}}export async function getComponentFramework(e){try{return(await analyzeComponentFile(e)).analysis.framework}catch(t){let n=t instanceof Error?t.message:String(t);return console.error(`Error detecting framework for ${e}:`,n),`unknown`}}function c(e,t,n){let r=t.framework.toUpperCase(),i=n.shouldHydrate?`HYDRATE`:`SSR-ONLY`;console.log(`[Component Analysis] ${e}`),console.log(` Framework: ${r}`),console.log(` Has Script: ${t.hasScript}`),console.log(` Has Hydrate Function: ${t.hasHydrateFunction}`),console.log(` Strategy: ${i}`),console.log(` Reason: ${n.reason}`),n.warnings&&n.warnings.length>0&&(console.log(` Warnings:`),n.warnings.forEach(e=>console.log(` - ${e}`))),console.log(``)}export function generateAnalysisSummary(e){let t={total:e.size,byFramework:{},byStrategy:{},withWarnings:0};for(let[,n]of e){let e=n.analysis.framework;t.byFramework[e]=(t.byFramework[e]||0)+1;let r=n.decision.shouldHydrate?`hydrate`:`ssr-only`;t.byStrategy[r]=(t.byStrategy[r]||0)+1,n.decision.warnings&&n.decision.warnings.length>0&&t.withWarnings++}return t}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
const e={vue:{fileExtensions:[`.vue`],scriptTags:[`<script>`,`<script setup>`,`<script lang="ts">`,`<script setup lang="ts">`],hydratePatterns:[`hydrate`,`mount`,`createApp`,`Vue.createApp`],imports:[`vue`,`@vue/`,`vue/`]},svelte:{fileExtensions:[`.svelte`],scriptTags:[`<script>`,`<script lang="ts">`,`<script context="module">`],hydratePatterns:[`hydrate`,`mount`,`$:`,`onMount`],imports:[`svelte`,`svelte/`]},solid:{fileExtensions:[`.tsx`,`.jsx`,`.solid.tsx`,`.solid.jsx`],scriptTags:[],hydratePatterns:[`hydrate`,`render`,`createSignal`,`createEffect`],imports:[`solid-js`,`solid-js/web`]},preact:{fileExtensions:[`.tsx`,`.jsx`,`.preact.tsx`,`.preact.jsx`],scriptTags:[],hydratePatterns:[`hydrate`,`render`],imports:[`preact`,`preact/hooks`]},react:{fileExtensions:[`.tsx`,`.jsx`,`.react.tsx`,`.react.jsx`],scriptTags:[],hydratePatterns:[`hydrate`,`render`],imports:[`react`,`react-dom`]},lit:{fileExtensions:[`.ts`,`.js`],scriptTags:[],hydratePatterns:[`LitElement`,`customElement`,`@customElement`],imports:[`lit`,`lit-element`,`lit/`]},qwik:{fileExtensions:[`.tsx`,`.jsx`,`.qwik.tsx`,`.qwik.jsx`],scriptTags:[],hydratePatterns:[`component$`,`useSignal`,`useStore`,`useTask$`,`useVisibleTask$`],imports:[`@builder.io/qwik`,`@builder.io/qwik/`]}};function t(e){return e.includes(`.solid.`)?`solid`:e.includes(`.preact.`)?`preact`:e.includes(`.react.`)?`react`:e.includes(`.qwik.`)?`qwik`:null}function n(e,t){return e.endsWith(`.vue`)?`vue`:e.endsWith(`.svelte`)?`svelte`:(e.endsWith(`.ts`)||e.endsWith(`.js`))&&(t.includes(`lit`)||t.includes(`LitElement`)||t.includes(`@customElement`))?`lit`:e.endsWith(`.tsx`)||e.endsWith(`.jsx`)?r(t):null}function r(e){return e.includes(`solid-js`)||e.includes(`from "solid-js"`)||e.includes(`from 'solid-js'`)?`solid`:e.includes(`@builder.io/qwik`)||e.includes(`from "@builder.io/qwik"`)||e.includes(`from '@builder.io/qwik'`)?`qwik`:e.includes(`preact`)||e.includes(`from "preact"`)||e.includes(`from 'preact'`)?`preact`:e.includes(`react`)&&!e.includes(`preact`)?`react`:`preact`}export function detectFramework(e,r){return t(e)??n(e,r)??i(r)}function i(t){for(let[n,r]of Object.entries(e))if(r.imports.some(e=>t.includes(e)))return n;return`unknown`}export function hasScriptSection(e,t){switch(t){case`vue`:return/<script[^>]*>/i.test(e);case`svelte`:return e.includes(`<script>`)||e.includes(`<script `)||e.includes(`<script
|
|
2
|
-
`)||e.includes(`<script `);case`solid`:case`preact`:case`react`:case`qwik`:return e.includes(`function`)||e.includes(`=>`)||e.includes(`const`)||e.includes(`let`);case`lit`:return e.includes(`class`)||e.includes(`LitElement`)||e.includes(`@customElement`);default:return e.includes(`<script>`)||e.includes(`function`)||e.includes(`=>`)}}export function hasHydrateFunction(t,n){if(!e[n])return!1;if([`export function hydrate`,`export const hydrate`,`function hydrate(`,`const hydrate =`,`let hydrate =`,`var hydrate =`].some(e=>t.toLowerCase().includes(e.toLowerCase())))return!0;switch(n){case`vue`:return t.includes(`createApp`)&&t.includes(`mount`);case`svelte`:return t.includes(`import`)&&t.includes(`hydrate`)&&(t.includes(`svelte`)||t.includes(`hydrate(`));case`solid`:return t.includes(`hydrate`)&&t.includes(`solid-js`)||t.includes(`render`)&&t.includes(`solid-js/web`);case`preact`:return t.includes(`hydrate`)&&t.includes(`preact`)||t.includes(`render`)&&t.includes(`preact`);case`react`:return t.includes(`hydrate`)&&t.includes(`react`)||t.includes(`render`)&&t.includes(`react-dom`);case`qwik`:return t.includes(`component$`)||t.includes(`@builder.io/qwik`);default:return!1}}export function extractVueScript(e){return o(e)}export function extractSvelteScript(e){return o(e)}function o(e){let t=/<script[^>]*>([\s\S]*?)<\/script>/gi,n=[],r;for(;(r=t.exec(e))!==null;)n.push(r[0]);return n.join(`
|
|
3
|
-
`)}const s=/^\s*return\s*\(/;function c(e){return e.split(`
|
|
4
|
-
`).filter(e=>{let t=e.trim();return!t.startsWith(`<`)&&!t.startsWith(`</`)&&!s.exec(t)}).join(`
|
|
5
|
-
`)}export function extractSolidScript(e){return c(e)}export function extractPreactScript(e){return c(e)}export function extractReactScript(e){return c(e)}export function analyzeComponent(e,t){let n=detectFramework(e,t),r=hasScriptSection(t,n),i=r?hasHydrateFunction(t,n):!1,a;if(r)switch(n){case`svelte`:a=l(t,i);break;case`solid`:case`preact`:case`react`:a=`hydrate`;break;case`qwik`:a=`hydrate`;break;case`vue`:a=i?`hydrate`:`ssr-only`;break;default:a=i?`hydrate`:`ssr-only`;break}else a=`ssr-only`;return{hasScript:r,hasHydrateFunction:i,framework:n,recommendedStrategy:a}}function l(e,t){if(t)return`hydrate`;let n=`on:.onclick.onchange.oninput.onsubmit.onkeydown.onkeyup.onmousedown.onmouseup.bind:.$:.$state.$derived.$effect.$props.onMount.onDestroy.beforeUpdate.afterUpdate.tick.writable.readable.derived.get(.set(.update(.subscribe(`.split(`.`).some(t=>e.includes(t));return[`export let`].some(t=>e.includes(t))&&!n?`ssr-only`:`hydrate`}const u={solid:`SolidJS component detected - uses integration system`,preact:`preact component with script content - likely needs hydration`,react:`react component with script content - likely needs hydration`,svelte:`Svelte component with script section - uses Svelte hydration system`,vue:`Vue component with script section - uses Vue integration system`,lit:`Lit component detected - Web Components require client-side registration`,qwik:`Qwik component detected - uses resumability instead of hydration`};export function shouldHydrateComponent(e,t={}){if(t.forceSSROnly)return{shouldHydrate:!1,reason:`Explicitly configured for SSR-only rendering`};if(t.detectScripts===!1)return{shouldHydrate:!0,reason:`Script detection disabled, defaulting to hydration`};if(!e.hasScript)return{shouldHydrate:!1,reason:`No script section detected, using SSR-only rendering`};let n=u[e.framework];return n?{shouldHydrate:!0,reason:n}:e.hasHydrateFunction?{shouldHydrate:!0,reason:`Component has script section with explicit hydration functions`}:{shouldHydrate:!1,reason:`Component has script section but no explicit hydrate function, using SSR-only`,warnings:[`Component has script section but no clear hydrate function detected`]}}export function createComponentMetadata(e,t,n){let r=`medium`;return n.framework!==`unknown`&&n.hasScript&&n.hasHydrateFunction||n.framework!==`unknown`&&!n.hasScript?r=`high`:n.framework===`unknown`&&(r=`low`),{path:e,framework:n.framework===`unknown`?`vue`:n.framework,hasScript:n.hasScript,hasHydrateFunction:n.hasHydrateFunction,renderStrategy:n.recommendedStrategy,detectionConfidence:r}}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export class EnhancedFrameworkDetector{frameworkRegistry;constructor(e){this.frameworkRegistry=new Map;let t=e||this.getDefaultFrameworkConfigs();Object.entries(t).forEach(([e,t])=>{this.frameworkRegistry.set(e,t)})}detectFramework(e,t){let n=this.extractDetectionCriteria(e,t),r=[],i=[];if(e.includes(`.solid.`))return r.push(`Explicit Solid naming convention (.solid.tsx/.solid.jsx)`),{framework:`solid`,confidence:`high`,evidence:r,warnings:i};if(e.includes(`.preact.`))return r.push(`Explicit Preact naming convention (.preact.tsx/.preact.jsx)`),{framework:`preact`,confidence:`high`,evidence:r,warnings:i};if(e.includes(`.react.`))return r.push(`Explicit React naming convention (.react.tsx/.react.jsx)`),{framework:`react`,confidence:`high`,evidence:r,warnings:i};if(e.includes(`.lit.`))return r.push(`Explicit Lit naming convention (.lit.ts/.lit.js)`),{framework:`lit`,confidence:`high`,evidence:r,warnings:i};if(e.includes(`.qwik.`))return r.push(`Explicit Qwik naming convention (.qwik.tsx/.qwik.jsx)`),{framework:`qwik`,confidence:`high`,evidence:r,warnings:i};let a=new Map;for(let[e,t]of this.frameworkRegistry){let i=this.calculateFrameworkScore(n,t,r);a.set(e,i)}let o=Array.from(a.entries()).sort(([,e],[,t])=>t-e),[s,c]=o[0]||[`unknown`,0],[l,u]=o[1]||[`unknown`,0],d;return c>=3&&c-u>=2?d=`high`:c>=2?d=`medium`:(d=`low`,i.push(`Framework detection has low confidence - consider adding explicit JSX import source or use naming convention (.solid.tsx, .preact.tsx)`)),c===u&&c>0&&(i.push(`Ambiguous detection between ${s} and ${l} - consider using naming convention`),d=`low`),{framework:c>0?s:`unknown`,confidence:d,evidence:r,warnings:i}}extractDetectionCriteria(e,t){return{fileExtension:this.getFileExtension(e),jsxImportSource:this.parseJSXImportSource(t),imports:this.extractImportStatements(t),content:t}}calculateFrameworkScore(e,t,n){let r=0;e.jsxImportSource&&t.jsxImportSources.includes(e.jsxImportSource)&&(r+=3,n.push(`JSX import source: @jsxImportSource ${e.jsxImportSource}`));for(let i of t.detectionPatterns.imports)e.imports.some(e=>i.test(e))&&(r+=2,n.push(`Framework import detected: ${i.source}`));for(let i of t.detectionPatterns.content)i.test(e.content)&&(r+=1,n.push(`Framework-specific content pattern: ${i.source}`));return t.fileExtensions.includes(e.fileExtension)&&(r+=.5,n.push(`File extension: ${e.fileExtension}`)),r}parseJSXImportSource(e){let t=/@jsxImportSource\s+([^\s*]+)/.exec(e);if(t)return t[1]}extractImportStatements(e){let t=[],n=/from\s+['"]([^'"]+)['"]/g,r=/import\s+['"]([^'"]+)['"]/g,i=/require\s*\(\s*['"]([^'"]+)['"]\s*\)/g,a;for(;(a=n.exec(e))!==null;)t.push(a[1]);for(;(a=r.exec(e))!==null;)t.push(a[1]);for(;(a=i.exec(e))!==null;)t.push(a[1]);return t}getFileExtension(e){if(e.includes(`.solid.`))return`.solid.tsx`;if(e.includes(`.preact.`))return`.preact.tsx`;if(e.includes(`.react.`))return`.react.tsx`;if(e.includes(`.lit.`))return`.lit.ts`;let t=e.lastIndexOf(`.`);return t===-1?``:e.substring(t)}getDefaultFrameworkConfigs(){return{preact:{name:`preact`,fileExtensions:[`.tsx`,`.jsx`,`.preact.tsx`,`.preact.jsx`],jsxImportSources:[`preact`],ssrModules:[`preact-render-to-string`],hydrationModules:[`preact`],detectionPatterns:{imports:[/^preact$/,/^preact\//,/preact-render-to-string/],content:[/\buseState\b/,/\buseEffect\b/,/\buseCallback\b/,/\buseMemo\b/,/\buseRef\b/,/from\s+['"]preact['"]/],jsxPragmas:[`@jsxImportSource preact`]}},solid:{name:`solid`,fileExtensions:[`.tsx`,`.jsx`,`.solid.tsx`,`.solid.jsx`],jsxImportSources:[`solid-js`],ssrModules:[`solid-js/web`],hydrationModules:[`solid-js/web`],detectionPatterns:{imports:[/^solid-js$/,/^solid-js\//,/solid-js\/web/],content:[/\bcreateSignal\b/,/\bcreateEffect\b/,/\bcreateMemo\b/,/\bcreateResource\b/,/\bonMount\b/,/\bonCleanup\b/,/from\s+['"]solid-js['"]/],jsxPragmas:[`@jsxImportSource solid-js`]}},vue:{name:`vue`,fileExtensions:[`.vue`],jsxImportSources:[`vue`],ssrModules:[`vue/server-renderer`],hydrationModules:[`vue`],detectionPatterns:{imports:[/^vue$/,/^@vue\//,/vue\/server-renderer/],content:[/<template>/,/<script>/,/<style>/,/\bref\b/,/\breactive\b/,/\bcomputed\b/,/\bwatchEffect\b/,/from\s+['"]vue['"]/],jsxPragmas:[`@jsxImportSource vue`]}},svelte:{name:`svelte`,fileExtensions:[`.svelte`],jsxImportSources:[`svelte`],ssrModules:[`svelte/server`],hydrationModules:[`svelte`],detectionPatterns:{imports:[/^svelte$/,/^svelte\//,/svelte\/store/],content:[/<script>/,/<style>/,/\$:/,/\bonMount\b/,/\bafterUpdate\b/,/\bbeforeUpdate\b/,/from\s+['"]svelte['"]/],jsxPragmas:[`@jsxImportSource svelte`]}},react:{name:`react`,fileExtensions:[`.jsx`,`.tsx`,`.react.jsx`,`.react.tsx`],jsxImportSources:[`react`],ssrModules:[`react-dom/server`],hydrationModules:[`react-dom/client`],detectionPatterns:{imports:[/^react$/,/^react\//,/^react-dom$/,/^react-dom\//,/from\s+['"]react['"]/,/from\s+['"]react\/[^'"]+['"]/,/from\s+['"]react-dom['"]/],content:[/\buseState\b/,/\buseEffect\b/,/\buseContext\b/,/\buseReducer\b/,/\buseCallback\b/,/\buseMemo\b/,/\buseRef\b/,/\buseTransition\b/,/\buseDeferredValue\b/,/\buseId\b/,/\buseImperativeHandle\b/,/\buseLayoutEffect\b/,/["']use client["']/,/["']use server["']/,/from\s+['"]react['"]/,/import\s+.*\s+from\s+['"]react['"]/],jsxPragmas:[`@jsxImportSource react`]}},lit:{name:`lit`,fileExtensions:[`.ts`,`.js`,`.lit.ts`,`.lit.js`],jsxImportSources:[`lit`],ssrModules:[`@lit-labs/ssr`],hydrationModules:[`lit`],detectionPatterns:{imports:[/^lit$/,/^lit\//,/^@lit\//,/^@lit-labs\/ssr/,/from\s+['"]lit['"]/,/from\s+['"]lit\/[^'"]+['"]/,/from\s+['"]@lit\/[^'"]+['"]/],content:[/\bLitElement\b/,/\bcustomElement\b/,/@customElement/,/@property/,/@state/,/@query/,/@queryAll/,/\bhtml`/,/\bcss`/,/extends\s+LitElement/,/from\s+['"]lit['"]/,/import\s+.*\s+from\s+['"]lit['"]/],jsxPragmas:[`@jsxImportSource lit`]}},qwik:{name:`qwik`,fileExtensions:[`.tsx`,`.jsx`,`.qwik.tsx`,`.qwik.jsx`],jsxImportSources:[`@builder.io/qwik`],ssrModules:[`@builder.io/qwik/server`],hydrationModules:[`@builder.io/qwik`],detectionPatterns:{imports:[/^@builder\.io\/qwik$/,/^@builder\.io\/qwik\//,/from\s+['"]@builder\.io\/qwik['"]/,/from\s+['"]@builder\.io\/qwik\/[^'"]+['"]/],content:[/\bcomponent\$/,/\buseSignal\b/,/\buseStore\b/,/\buseTask\$/,/\buseVisibleTask\$/,/\buseResource\$/,/\buseContext\b/,/\buseContextProvider\b/,/\$\(\s*\(/,/from\s+['"]@builder\.io\/qwik['"]/,/import\s+.*\s+from\s+['"]@builder\.io\/qwik['"]/],jsxPragmas:[`@jsxImportSource @builder.io/qwik`]}}}}addFrameworkConfig(e,t){this.frameworkRegistry.set(e,t)}getFrameworkConfigs(){return new Map(this.frameworkRegistry)}validateFrameworkConfig(e){let t=[];return(!e.name||e.name.trim()===``)&&t.push(`Framework name is required`),(!e.fileExtensions||e.fileExtensions.length===0)&&t.push(`At least one file extension is required`),(!e.detectionPatterns.imports||e.detectionPatterns.imports.length===0)&&t.push(`At least one import pattern is required for detection`),(!e.ssrModules||e.ssrModules.length===0)&&t.push(`At least one SSR module is required`),(!e.hydrationModules||e.hydrationModules.length===0)&&t.push(`At least one hydration module is required`),t}}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export class FrameworkRegistry{frameworks;config;constructor(e={}){this.frameworks=new Map,this.config={enableValidation:!0,allowCustomFrameworks:!0,defaultFramework:`unknown`,...e},this.initializeDefaultFrameworks()}registerFramework(e,t){let n=this.validateFrameworkConfig(t);return this.config.enableValidation&&!n.isValid?n:!this.config.allowCustomFrameworks&&!this.isDefaultFramework(e)?{isValid:!1,errors:[`Custom framework '${e}' not allowed`],warnings:[]}:(this.frameworks.set(e,{...t}),{isValid:!0,errors:[],warnings:n.warnings})}getFramework(e){return this.frameworks.get(e)}getAllFrameworks(){return new Map(this.frameworks)}getFrameworksByExtension(e){let t=[];for(let[n,r]of this.frameworks)r.fileExtensions.includes(e)&&t.push(n);return t}getFrameworksByJSXImportSource(e){let t=[];for(let[n,r]of this.frameworks)r.jsxImportSources.includes(e)&&t.push(n);return t}unregisterFramework(e){return this.isDefaultFramework(e)?!1:this.frameworks.delete(e)}updateFramework(e,t){let n=this.frameworks.get(e);if(!n)return{isValid:!1,errors:[`Framework '${e}' not found`],warnings:[]};let r={...n,...t},i=this.validateFrameworkConfig(r);return this.config.enableValidation&&!i.isValid?i:(this.frameworks.set(e,r),{isValid:!0,errors:[],warnings:i.warnings})}validateFrameworkConfig(e){let t=[],n=[];return this.validateRequiredFields(e,t,n),this.validateDetectionPatterns(e,t,n),this.validateCrossFrameworkConflicts(e,n),{isValid:t.length===0,errors:t,warnings:n}}validateRequiredFields(e,t,n){if((!e.name||e.name.trim()===``)&&t.push(`Framework name is required and cannot be empty`),!e.fileExtensions||e.fileExtensions.length===0)t.push(`At least one file extension is required`);else for(let n of e.fileExtensions)n.startsWith(`.`)||t.push(`File extension '${n}' must start with a dot`);(!e.jsxImportSources||e.jsxImportSources.length===0)&&n.push(`No JSX import sources defined - detection may be less accurate`),(!e.ssrModules||e.ssrModules.length===0)&&t.push(`At least one SSR module is required`),(!e.hydrationModules||e.hydrationModules.length===0)&&t.push(`At least one hydration module is required`)}validateDetectionPatterns(e,t,n){if(!e.detectionPatterns){t.push(`Detection patterns are required`);return}(!e.detectionPatterns.imports||e.detectionPatterns.imports.length===0)&&t.push(`At least one import pattern is required for detection`),(!e.detectionPatterns.content||e.detectionPatterns.content.length===0)&&n.push(`No content patterns defined - detection may be less accurate`),(!e.detectionPatterns.jsxPragmas||e.detectionPatterns.jsxPragmas.length===0)&&n.push(`No JSX pragmas defined - detection may be less accurate`)}validateCrossFrameworkConflicts(e,t){if(!(!e.fileExtensions||!e.jsxImportSources)){for(let[n,r]of this.frameworks)if(n!==e.name){if(r.fileExtensions){let i=e.fileExtensions.filter(e=>r.fileExtensions.includes(e));i.length>0&&t.push(`File extensions ${i.join(`, `)} overlap with framework '${n}'`)}if(r.jsxImportSources){let i=e.jsxImportSources.filter(e=>r.jsxImportSources.includes(e));i.length>0&&t.push(`JSX import sources ${i.join(`, `)} overlap with framework '${n}'`)}}}}isDefaultFramework(e){return[`preact`,`solid`,`vue`,`svelte`,`react`,`lit`,`qwik`].includes(e)}initializeDefaultFrameworks(){let e=this.getDefaultFrameworkConfigs();for(let[t,n]of Object.entries(e))this.frameworks.set(t,n)}getDefaultFrameworkConfigs(){return{preact:{name:`preact`,fileExtensions:[`.tsx`,`.jsx`],jsxImportSources:[`preact`],ssrModules:[`preact-render-to-string`],hydrationModules:[`preact`],detectionPatterns:{imports:[/^preact$/,/^preact\//,/preact-render-to-string/],content:[/\buseState\b/,/\buseEffect\b/,/\buseCallback\b/,/\buseMemo\b/,/\buseRef\b/,/\buseContext\b/,/\buseReducer\b/,/from\s+['"]preact['"]/,/import\s+.*\s+from\s+['"]preact['"]/],jsxPragmas:[`@jsxImportSource preact`]}},solid:{name:`solid`,fileExtensions:[`.tsx`,`.jsx`],jsxImportSources:[`solid-js`],ssrModules:[`solid-js/web`],hydrationModules:[`solid-js/web`],detectionPatterns:{imports:[/^solid-js$/,/^solid-js\//,/solid-js\/web/,/solid-js\/store/],content:[/\bcreateSignal\b/,/\bcreateEffect\b/,/\bcreateMemo\b/,/\bcreateResource\b/,/\bcreateStore\b/,/\bonMount\b/,/\bonCleanup\b/,/\bShow\b/,/\bFor\b/,/from\s+['"]solid-js['"]/,/import\s+.*\s+from\s+['"]solid-js['"]/],jsxPragmas:[`@jsxImportSource solid-js`]}},vue:{name:`vue`,fileExtensions:[`.vue`],jsxImportSources:[`vue`],ssrModules:[`vue/server-renderer`],hydrationModules:[`vue`],detectionPatterns:{imports:[/^vue$/,/^@vue\//,/vue\/server-renderer/,/vue\/composition-api/],content:[/<template>/,/<script>/,/<style>/,/\bref\b/,/\breactive\b/,/\bcomputed\b/,/\bwatchEffect\b/,/\bwatch\b/,/\bonMounted\b/,/\bonUnmounted\b/,/from\s+['"]vue['"]/,/import\s+.*\s+from\s+['"]vue['"]/],jsxPragmas:[`@jsxImportSource vue`]}},svelte:{name:`svelte`,fileExtensions:[`.svelte`],jsxImportSources:[`svelte`],ssrModules:[`svelte/server`],hydrationModules:[`svelte`],detectionPatterns:{imports:[/^svelte$/,/^svelte\//,/svelte\/store/,/svelte\/motion/,/svelte\/transition/],content:[/<script>/,/<style>/,/\$:/,/\bonMount\b/,/\bafterUpdate\b/,/\bbeforeUpdate\b/,/\bonDestroy\b/,/\btick\b/,/from\s+['"]svelte['"]/,/import\s+.*\s+from\s+['"]svelte['"]/],jsxPragmas:[`@jsxImportSource svelte`]}},react:{name:`react`,fileExtensions:[`.jsx`,`.tsx`],jsxImportSources:[`react`],ssrModules:[`react-dom/server`],hydrationModules:[`react-dom/client`],detectionPatterns:{imports:[/^react$/,/^react\//,/^react-dom$/,/^react-dom\//,/from\s+['"]react['"]/,/from\s+['"]react\/[^'"]+['"]/,/from\s+['"]react-dom['"]/],content:[/\buseState\b/,/\buseEffect\b/,/\buseContext\b/,/\buseReducer\b/,/\buseCallback\b/,/\buseMemo\b/,/\buseRef\b/,/\buseTransition\b/,/\buseDeferredValue\b/,/\buseId\b/,/\buseImperativeHandle\b/,/\buseLayoutEffect\b/,/["']use client["']/,/["']use server["']/,/from\s+['"]react['"]/,/import\s+.*\s+from\s+['"]react['"]/],jsxPragmas:[`@jsxImportSource react`]}},lit:{name:`lit`,fileExtensions:[`.ts`,`.js`],jsxImportSources:[`lit`],ssrModules:[`@lit-labs/ssr`],hydrationModules:[`lit`],detectionPatterns:{imports:[/^lit$/,/^lit\//,/^@lit\//,/^@lit-labs\/ssr/,/from\s+['"]lit['"]/,/from\s+['"]lit\/[^'"]+['"]/,/from\s+['"]@lit\/[^'"]+['"]/],content:[/\bLitElement\b/,/\bcustomElement\b/,/@customElement/,/@property/,/@state/,/@query/,/@queryAll/,/\bhtml`/,/\bcss`/,/extends\s+LitElement/,/from\s+['"]lit['"]/,/import\s+.*\s+from\s+['"]lit['"]/],jsxPragmas:[`@jsxImportSource lit`]}},qwik:{name:`qwik`,fileExtensions:[`.tsx`,`.jsx`],jsxImportSources:[`@builder.io/qwik`],ssrModules:[`@builder.io/qwik/server`],hydrationModules:[`@builder.io/qwik`],detectionPatterns:{imports:[/^@builder\.io\/qwik$/,/^@builder\.io\/qwik\//,/from\s+['"]@builder\.io\/qwik['"]/,/from\s+['"]@builder\.io\/qwik\/[^'"]+['"]/],content:[/\bcomponent\$/,/\buseSignal\b/,/\buseStore\b/,/\buseTask\$/,/\buseVisibleTask\$/,/\buseResource\$/,/\buseContext\b/,/\$\(\s*\(/,/from\s+['"]@builder\.io\/qwik['"]/,/import\s+.*\s+from\s+['"]@builder\.io\/qwik['"]/],jsxPragmas:[`@jsxImportSource @builder.io/qwik`]}}}}exportConfig(){let e={};for(let[t,n]of this.frameworks)e[t]={...n};return e}importConfig(e){let t=[];for(let[n,r]of Object.entries(e)){let e=this.registerFramework(n,r);t.push(e)}return t}reset(){this.frameworks.clear(),this.initializeDefaultFrameworks()}getStats(){let e=new Set([`preact`,`solid`,`vue`,`svelte`,`react`,`lit`,`qwik`]),t=Array.from(this.frameworks.keys()).filter(t=>e.has(t)).length,n=new Set;for(let e of this.frameworks.values())e.fileExtensions.forEach(e=>n.add(e));return{totalFrameworks:this.frameworks.size,defaultFrameworks:t,customFrameworks:this.frameworks.size-t,supportedExtensions:Array.from(n).sort((e,t)=>e.localeCompare(t))}}}export const defaultFrameworkRegistry=new FrameworkRegistry;export function createFrameworkConfig(e,t){return{name:e,fileExtensions:t.fileExtensions,jsxImportSources:t.jsxImportSources||[],ssrModules:t.ssrModules,hydrationModules:t.hydrationModules,detectionPatterns:{imports:t.importPatterns.map(e=>typeof e==`string`?new RegExp(e):e),content:(t.contentPatterns||[]).map(e=>typeof e==`string`?new RegExp(e):e),jsxPragmas:t.jsxPragmas||[]}}}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{extname as e}from"node:path";import{readFile as t}from"node:fs/promises";import{h as n}from"preact";import{marked as r}from"marked";export class MDXProcessor{async processMDXFile(e){try{let i=await t(e,`utf-8`);return{default:()=>n(`div`,{dangerouslySetInnerHTML:{__html:r(i)}})}}catch(t){throw Error(`Failed to process MDX file ${e}: ${t instanceof Error?t.message:String(t)}`)}}static isMDXFile(t){let n=e(t);return n===`.mdx`||n===`.md`}}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export{IntegrationRegistry,registry}from"./registry.js";export{loadIntegration,detectAndLoadIntegration,detectFrameworkFromPath,detectFrameworkFromContent,preloadIntegrations,getLoadedIntegrations,clearIntegrationCache,isIntegrationLoaded}from"./loader.js";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{registry as e}from"./registry.js";const t=new Map;export async function loadIntegration(n){if(t.has(n))return t.get(n);let r=await e.load(n);return t.set(n,r),r}export async function detectAndLoadIntegration(e){return await loadIntegration(detectFrameworkFromPath(e))}export function detectFrameworkFromPath(e){return e.endsWith(`.vue`)?`vue`:e.endsWith(`.svelte`)?`svelte`:e.includes(`.solid.`)?`solid`:e.includes(`.qwik.`)?`qwik`:`preact`}export function detectFrameworkFromContent(e,t){let n=detectFrameworkFromPath(e);return n!==`preact`||!t?n:t.includes(`solid-js`)?`solid`:t.includes(`@builder.io/qwik`)?`qwik`:(t.includes(`preact`),`preact`)}export async function preloadIntegrations(e){await Promise.all(e.map(e=>loadIntegration(e)))}export function getLoadedIntegrations(){return Array.from(t.values())}export function clearIntegrationCache(){t.clear()}export function isIntegrationLoaded(e){return t.has(e)}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{dirname as e,join as t}from"node:path";import{statSync as n}from"node:fs";function r(){let r=process.cwd();for(let i=0;i<10;i++){try{if(n(t(r,`packages`,`integrations`)).isDirectory())return r}catch{}let i=e(r);if(i===r)break;r=i}return process.cwd()}export class IntegrationRegistry{integrations=new Map;loadingPromises=new Map;register(e){if(!e.name)throw Error(`Integration must have a name`);this.integrations.set(e.name,e)}get(e){return this.integrations.get(e)}has(e){return this.integrations.has(e)}async load(e){let t=this.integrations.get(e);if(t)return t;let n=this.loadingPromises.get(e);if(n)return n;let r=this.loadIntegration(e);this.loadingPromises.set(e,r);try{let e=await r;return this.register(e),e}finally{this.loadingPromises.delete(e)}}async loadIntegration(e){let n=`${e}Integration`;try{let t=await import(`@useavalon/${e}`),r=t[n]||t.default;if(r)return r}catch{}try{let i=await import(`file://${t(r(),`packages`,`integrations`,e,`mod.ts`)}`),a=i[n]||i.default;if(a)return a}catch{}throw Error(`Failed to load integration for framework '${e}'. Make sure @useavalon/${e} is installed.\nInstall it with: bun add @useavalon/${e}`)}getAll(){return Array.from(this.integrations.values())}getAllNames(){return Array.from(this.integrations.keys())}unregister(e){return this.integrations.delete(e)}clear(){this.integrations.clear(),this.loadingPromises.clear()}get size(){return this.integrations.size}}globalThis.__avalonIntegrationRegistry??=new IntegrationRegistry;export const registry=globalThis.__avalonIntegrationRegistry;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{IslandStateSerializer as e}from"./island-state-serializer.js";export class IslandPersistence{storageType;keyPrefix;storage=null;constructor(e={}){this.storageType=e.storageType||`session`,this.keyPrefix=e.keyPrefix||`island-state`,typeof window<`u`&&(this.storage=this.storageType===`session`?sessionStorage:localStorage)}saveState(t,n){if(!this.storage){console.warn(`Island persistence: Storage not available (server-side or unsupported browser)`);return}try{let r=this.getStorageKey(t),i=e.serialize({state:n,timestamp:Date.now(),version:`1.0`});this.storage.setItem(r,i),console.log(`Island state saved for ${t}`)}catch(e){console.error(`Failed to save island state for ${t}:`,e)}}loadState(t){if(!this.storage)return console.warn(`Island persistence: Storage not available (server-side or unsupported browser)`),null;try{let n=this.getStorageKey(t),r=this.storage.getItem(n);if(!r)return null;let i=e.deserialize(r);return!i.state||!i.timestamp||!i.version?(console.warn(`Invalid island state format for ${t}, clearing...`),this.clearState(t),null):(console.log(`Island state loaded for ${t}`),i.state)}catch(e){return console.error(`Failed to load island state for ${t}:`,e),this.clearState(t),null}}clearState(e){if(this.storage)try{let t=this.getStorageKey(e);this.storage.removeItem(t),console.log(`Island state cleared for ${e}`)}catch(t){console.error(`Failed to clear island state for ${e}:`,t)}}hasState(e){if(!this.storage)return!1;try{let t=this.getStorageKey(e);return this.storage.getItem(t)!==null}catch(t){return console.error(`Failed to check island state for ${e}:`,t),!1}}getStoredIds(){if(!this.storage)return[];try{let e=[],t=this.keyPrefix.length+1;for(let n=0;n<this.storage.length;n++){let r=this.storage.key(n);r&&r.startsWith(this.keyPrefix+`:`)&&e.push(r.substring(t))}return e}catch(e){return console.error(`Failed to get stored island IDs:`,e),[]}}clearAllStates(){if(this.storage)try{let e=[];for(let t=0;t<this.storage.length;t++){let n=this.storage.key(t);n&&n.startsWith(this.keyPrefix+`:`)&&e.push(n)}e.forEach(e=>this.storage.removeItem(e)),console.log(`Cleared ${e.length} island states`)}catch(e){console.error(`Failed to clear all island states:`,e)}}getStorageKey(e){return`${this.keyPrefix}:${e}`}getConfig(){return{storageType:this.storageType,keyPrefix:this.keyPrefix,available:this.storage!==null}}getStorageStats(){if(!this.storage)return{totalKeys:0,islandKeys:0,estimatedSize:0};try{let e=0,t=0;for(let n=0;n<this.storage.length;n++){let r=this.storage.key(n);if(r&&r.startsWith(this.keyPrefix+`:`)){e++;let n=this.storage.getItem(r);n&&(t+=r.length+n.length)}}return{totalKeys:this.storage.length,islandKeys:e,estimatedSize:t}}catch(e){return console.error(`Failed to get storage stats:`,e),{totalKeys:0,islandKeys:0,estimatedSize:0}}}replacer(e,t){return t instanceof Date?{__type:`Date`,__value:t.toISOString()}:t instanceof RegExp?{__type:`RegExp`,__value:{source:t.source,flags:t.flags}}:t instanceof Map?{__type:`Map`,__value:Array.from(t.entries())}:t instanceof Set?{__type:`Set`,__value:Array.from(t.values())}:typeof t==`function`?(console.warn(`Function found in island state at key "${e}", converting to null`),null):t===void 0?null:t}reviver(e,t){if(t&&typeof t==`object`){let e=t;if(e.__type&&e.__value!==void 0)switch(e.__type){case`Date`:return new Date(e.__value);case`RegExp`:{let t=e.__value;return new RegExp(t.source,t.flags)}case`Map`:return new Map(e.__value);case`Set`:return new Set(e.__value);default:return console.warn(`Unknown special type "${e.__type}" in serialized state`),e.__value}}return t}}export const defaultIslandPersistence=new IslandPersistence({storageType:`session`,keyPrefix:`island-state`});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export class IslandStateSerializer{static serialize(t){try{let n=IslandStateSerializer.transformForSerialization(t);return JSON.stringify(n)}catch(e){throw console.error(`Failed to serialize island state:`,e),Error(`State serialization failed: ${e instanceof Error?e.message:String(e)}`)}}static deserialize(t){try{return JSON.parse(t,IslandStateSerializer.reviver)}catch(e){throw console.error(`Failed to deserialize island state:`,e),Error(`State deserialization failed: ${e instanceof Error?e.message:String(e)}`)}}static transformForSerialization(t){if(t===null)return t;if(t===void 0)return null;if(t instanceof Date)return{__type:`Date`,__value:t.toISOString()};if(t instanceof RegExp)return{__type:`RegExp`,__value:{source:t.source,flags:t.flags}};if(t instanceof Map)return{__type:`Map`,__value:Array.from(t.entries()).map(([t,n])=>[IslandStateSerializer.transformForSerialization(t),IslandStateSerializer.transformForSerialization(n)])};if(t instanceof Set)return{__type:`Set`,__value:Array.from(t.values()).map(t=>IslandStateSerializer.transformForSerialization(t))};if(typeof t==`function`)return console.warn(`Function found in island state, converting to null`),null;if(Array.isArray(t))return t.map(t=>IslandStateSerializer.transformForSerialization(t));if(typeof t==`object`){let n={},r=t;for(let t in r)Object.hasOwn(r,t)&&(n[t]=IslandStateSerializer.transformForSerialization(r[t]));return n}return t}static reviver(e,t){if(t&&typeof t==`object`){let e=t;if(e.__type&&e.__value!==void 0)switch(e.__type){case`Date`:return new Date(e.__value);case`RegExp`:{let t=e.__value;return new RegExp(t.source,t.flags)}case`Map`:return new Map(e.__value);case`Set`:return new Set(e.__value);case`undefined`:return null;default:return console.warn(`Unknown special type "${typeof e.__type==`string`?e.__type:`non-string`}" in serialized state`),e.__value}}return t}static validate(e){let t=[];try{let n=this.serialize(e),r=new Blob([n]).size,i=5*1024*1024;r>i&&t.push(`Serialized state size (${Math.round(r/1024)}KB) exceeds recommended limit (${Math.round(i/1024)}KB)`),this.deserialize(n)}catch(e){t.push(e instanceof Error?e.message:String(e))}return{valid:t.length===0,errors:t}}static getSize(e){try{let t=this.serialize(e),n=new Blob([t]).size,r=n/1024,i=r/1024,a;return a=i>=1?`${i.toFixed(2)} MB`:r>=1?`${r.toFixed(2)} KB`:`${n} bytes`,{bytes:n,kilobytes:r,megabytes:i,readable:a}}catch(e){return console.error(`Failed to calculate state size:`,e),{bytes:0,kilobytes:0,megabytes:0,readable:`0 bytes`}}}static clone(e){try{let t=this.serialize(e);return this.deserialize(t)}catch(t){return console.error(`Failed to clone island state:`,t),{...e}}}static equals(e,t){try{return this.serialize(e)===this.serialize(t)}catch(e){return console.error(`Failed to compare island states:`,e),!1}}static sanitize(e){try{let t=this.serialize(e);return this.deserialize(t)}catch(e){return console.error(`Failed to sanitize island state:`,e),{}}}}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{createContext as e}from"preact";import{useContext as t}from"preact/hooks";import{defaultIslandPersistence as n}from"./island-persistence.js";import{jsx as r}from"react/jsx-runtime";export const PersistentIslandContextProvider=e(null);export function createPersistentIslandContext(e,t=n){return{saveState:n=>{t.saveState(e,n)},loadState:()=>t.loadState(e),clearState:()=>{t.clearState(e)}}}export function usePersistentIslandContext(){let e=t(PersistentIslandContextProvider);if(!e)throw Error(`usePersistentIslandContext must be used within a PersistentIsland component`);return e}export function PersistentIslandProvider({persistentId:e,children:t,persistence:i=n}){let a=createPersistentIslandContext(e,i);return r(PersistentIslandContextProvider.Provider,{value:a,children:t})}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{useState as e,useEffect as t,useCallback as n}from"preact/hooks";import{IslandStateSerializer as r}from"./island-state-serializer.js";export function usePersistentState(i,a,o){let s=o?.storage??`session`,c=`avalon-island:${i}`,[l,u]=e(()=>{if(typeof window>`u`)return a;try{let e=(s===`local`?localStorage:sessionStorage).getItem(c);return e===null?a:r.deserialize(e).v??a}catch{return a}});return t(()=>{if(!(typeof window>`u`))try{(s===`local`?localStorage:sessionStorage).setItem(c,r.serialize({v:l}))}catch{}},[l,c,s]),[l,n(e=>{u(t=>typeof e==`function`?e(t):e)},[]),n(()=>{if(u(a),!(typeof window>`u`))try{(s===`local`?localStorage:sessionStorage).removeItem(c)}catch{}},[a,c,s])]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{render as e}from"preact-render-to-string";import{LayoutDiscovery as t}from"./layout-discovery.js";import{LayoutMatcher as n}from"./layout-matcher.js";import{LayoutComposer as r}from"./layout-composer.js";import{LayoutDataLoader as i}from"./layout-data-loader.js";import{LayoutCacheManager as a,defaultCacheConfig as o}from"./layout-cache-manager.js";function s(e,t){return e(t)}export class EnhancedLayoutResolver{layoutDiscovery;layoutMatcher;layoutComposer;layoutDataLoader;cache;cacheManager;options;constructor(e){this.options={baseDirectory:e.baseDirectory,filePattern:e.filePattern||`_layout.tsx`,excludeDirectories:e.excludeDirectories||[`node_modules`,`.git`,`dist`],enableWatching:e.enableWatching||!1,developmentMode:e.developmentMode||!1,enableCaching:e.enableCaching??!0,cacheTTL:e.cacheTTL||300*1e3,maxCacheSize:e.maxCacheSize||1e3,enableMetrics:e.enableMetrics??!0,enableDebugInfo:e.enableDebugInfo||!1},this.layoutDiscovery=new t(this.options),this.layoutMatcher=new n({developmentMode:this.options.developmentMode}),this.layoutComposer=new r(this.options),this.layoutDataLoader=new i({developmentMode:this.options.developmentMode,enableParallelLoading:!0,continueOnError:!0}),this.cache={resolved:new Map,handlers:new Map,data:new Map,ttl:new Map},this.cacheManager=new a({...o,defaultTtl:this.options.cacheTTL,maxEntries:this.options.maxCacheSize,enableStats:this.options.enableMetrics})}async resolveLayouts(e,t,n){let r=performance.now(),i=this.generateCacheKey(e,t,n);if(this.options.enableCaching){let t=this.cacheManager.getResolvedLayout(i);if(t)return this.options.developmentMode&&console.log(`[EnhancedLayoutResolver] Cache hit for route: ${e}`),{...t,metadata:{...t.metadata,cacheHit:!0}}}let a=[],o=[];try{o=await this.layoutComposer.resolveLayouts(e,t);let r=await this.layoutDataLoader.loadLayoutData(o,n),{errors:i}=this.layoutDataLoader.processLoadingResults(r,o);a.push(...i)}catch(t){a.push({layoutPath:e,errorType:`rendering`,timestamp:Date.now()}),this.options.developmentMode&&console.warn(`[EnhancedLayoutResolver] Error resolving layouts:`,t)}let s=performance.now()-r,c={handlers:o,dataLoaders:o.map(e=>e.loader).filter(e=>e!==void 0),errorBoundaries:[],streamingComponents:[],metadata:{totalLayouts:o.length,resolutionTime:s,cacheHit:!1}};if(this.options.enableCaching){this.cacheManager.setResolvedLayout(i,c);for(let e of o)this.cacheManager.addDependency(i,e.path)}return this.options.developmentMode&&(a.length>0&&console.warn(`[EnhancedLayoutResolver] ${a.length} error(s) during layout resolution for ${e}`),console.log(`[EnhancedLayoutResolver] Resolved ${o.length} layouts for ${e} in ${s.toFixed(2)}ms`)),c}async resolveAndRender(e,t,n){let r=await this.resolveLayouts(e,t,n);this.options.developmentMode&&console.log(`[EnhancedLayoutResolver] Rendering ${r.handlers.length} layouts for ${e}`);let i=await this.layoutDataLoader.loadLayoutData(r.handlers,n),{data:a}=this.layoutDataLoader.processLoadingResults(i,r.handlers);return this.options.developmentMode&&this.renderLayoutsToString(r,t,n,a),r}renderLayoutsToString(t,n,r,i=[]){try{let a=n.default??(()=>null);for(let e=t.handlers.length-1;e>=0;e--){let r=t.handlers[e].component,o=a,c=i[e]||{};a=e=>s(r,{...e,data:c,frontmatter:n.frontmatter,children:s(o,e)})}return e(s(a,{children:null,data:{},route:{path:new URL(r.request.url).pathname,params:r.params,query:r.query}}))}catch(e){return this.options.developmentMode&&console.warn(`[EnhancedLayoutResolver] Rendering failed:`,e),``}}getCachedResolution(e){return this.cacheManager.getResolvedLayout(e)}invalidateCacheByFilePath(e){return this.cacheManager.invalidateByFilePath(e)}clearCache(){this.cacheManager.clear(),this.cache.resolved.clear(),this.cache.handlers.clear(),this.cache.data.clear(),this.cache.ttl.clear(),this.layoutDiscovery.clearCache(),this.layoutComposer.clearCache()}setCaching(e){this.options.enableCaching=e,e||this.clearCache()}generateCacheKey(e,t,n){return`${e}:${t.layoutConfig?JSON.stringify(t.layoutConfig):``}:${n.request.method}:${n.request.url}`}getResolverStats(){let e=this.cacheManager.getStats(),t=this.layoutDiscovery.getCacheStats();return{cacheSize:e.totalEntries,cacheHitRate:this.cacheManager.getHitRate(),totalResolutions:e.hits+e.misses,averageResolutionTime:0,errorCount:0,cacheStats:e,discoveryStats:t}}updateOptions(e){Object.assign(this.options,e),e.developmentMode!==void 0&&this.layoutDataLoader.updateOptions({developmentMode:e.developmentMode})}getOptions(){return{...this.options}}getLayoutDiscovery(){return this.layoutDiscovery}getLayoutMatcher(){return this.layoutMatcher}getLayoutComposer(){return this.layoutComposer}getLayoutDataLoader(){return this.layoutDataLoader}getCacheManager(){return this.cacheManager}destroy(){this.cacheManager.destroy()}}export function createEnhancedLayoutResolver(e){return new EnhancedLayoutResolver(e)}export const EnhancedLayoutResolverUtils={createBasicConfig(e,t=!1){return{baseDirectory:e,developmentMode:t,enableCaching:!0,enableMetrics:t,enableDebugInfo:t}},createProductionConfig(e){return{baseDirectory:e,developmentMode:!1,enableCaching:!0,enableMetrics:!1,enableDebugInfo:!1}}};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export class LayoutCacheManager{resolvedLayouts=new Map;layoutHandlers=new Map;layoutData=new Map;dependencyGraph=new Map;accessOrder=new Map;accessCounter=0;stats={hits:0,misses:0,evictions:0,totalEntries:0,memoryUsage:0};cleanupTimer;constructor(e){this.config=e,process.env.NODE_ENV!==`test`&&this.startCleanupTimer()}setResolvedLayout(e,t,n){let r={value:t,timestamp:Date.now(),ttl:n||this.config.defaultTtl,accessCount:0,lastAccessed:Date.now()};this.resolvedLayouts.set(e,r),this.updateAccessOrder(e),this.updateStats(),this.enforceMaxEntries()}getResolvedLayout(e){let t=this.resolvedLayouts.get(e);return t?this.isExpired(t)?(this.resolvedLayouts.delete(e),this.accessOrder.delete(e),this.stats.misses++,this.stats.evictions++,null):(t.accessCount++,t.lastAccessed=Date.now(),this.updateAccessOrder(e),this.stats.hits++,t.value):(this.stats.misses++,null)}setLayoutHandler(e,t,n){let r={value:t,timestamp:Date.now(),ttl:n||this.config.defaultTtl,accessCount:0,lastAccessed:Date.now()};this.layoutHandlers.set(e,r),this.updateAccessOrder(e),this.updateStats(),this.enforceMaxEntries()}getLayoutHandler(e){let t=this.layoutHandlers.get(e);return t?this.isExpired(t)?(this.layoutHandlers.delete(e),this.accessOrder.delete(e),this.stats.misses++,this.stats.evictions++,null):(t.accessCount++,t.lastAccessed=Date.now(),this.updateAccessOrder(e),this.stats.hits++,t.value):(this.stats.misses++,null)}setLayoutData(e,t,n){let r={value:t,timestamp:Date.now(),ttl:n||this.config.defaultTtl,accessCount:0,lastAccessed:Date.now()};this.layoutData.set(e,r),this.updateAccessOrder(e),this.updateStats(),this.enforceMaxEntries()}getLayoutData(e){let t=this.layoutData.get(e);return t?this.isExpired(t)?(this.layoutData.delete(e),this.accessOrder.delete(e),this.stats.misses++,this.stats.evictions++,null):(t.accessCount++,t.lastAccessed=Date.now(),this.updateAccessOrder(e),this.stats.hits++,t.value):(this.stats.misses++,null)}invalidateResolvedLayout(e){let t=this.resolvedLayouts.delete(e);return this.accessOrder.delete(e),this.invalidateDependents(e),t}invalidateLayoutHandler(e){let t=this.layoutHandlers.delete(e);return this.accessOrder.delete(e),this.invalidateDependents(e),t}invalidateLayoutData(e){let t=this.layoutData.delete(e);return this.accessOrder.delete(e),this.invalidateDependents(e),t}invalidateByFilePath(e){let t=0,n=this.normalizePath(e);for(let e of this.resolvedLayouts.keys())this.isKeyAffectedByPath(e,n)&&(this.resolvedLayouts.delete(e),this.accessOrder.delete(e),t++);for(let e of this.layoutHandlers.keys())this.isKeyAffectedByPath(e,n)&&(this.layoutHandlers.delete(e),this.accessOrder.delete(e),t++);for(let e of this.layoutData.keys())this.isKeyAffectedByPath(e,n)&&(this.layoutData.delete(e),this.accessOrder.delete(e),t++);return this.updateStats(),t}addDependency(e,t){this.dependencyGraph.has(t)||this.dependencyGraph.set(t,new Set),this.dependencyGraph.get(t).add(e)}removeDependency(e,t){let n=this.dependencyGraph.get(t);n&&(n.delete(e),n.size===0&&this.dependencyGraph.delete(t))}invalidateByPattern(e){let t=0;for(let n of this.resolvedLayouts.keys())e.test(n)&&(this.resolvedLayouts.delete(n),t++);for(let n of this.layoutHandlers.keys())e.test(n)&&(this.layoutHandlers.delete(n),t++);for(let n of this.layoutData.keys())e.test(n)&&(this.layoutData.delete(n),t++);return this.updateStats(),t}clear(){this.resolvedLayouts.clear(),this.layoutHandlers.clear(),this.layoutData.clear(),this.dependencyGraph.clear(),this.accessOrder.clear(),this.accessCounter=0,this.resetStats()}getStats(){return this.updateStats(),{...this.stats}}getHitRate(){let e=this.stats.hits+this.stats.misses;return e===0?0:this.stats.hits/e}isExpired(e){return Date.now()-e.timestamp>e.ttl}invalidateDependents(e){let t=this.dependencyGraph.get(e);if(t){for(let e of t)this.resolvedLayouts.delete(e),this.layoutHandlers.delete(e),this.layoutData.delete(e),this.accessOrder.delete(e),this.invalidateDependents(e);this.dependencyGraph.delete(e)}}normalizePath(e){return e.replaceAll(`\\`,`/`).toLowerCase()}isKeyAffectedByPath(e,t){let n=e.toLowerCase();return n.includes(t)||n.includes(t.replace(`_layout.tsx`,``))||n.includes(t.replace(`.tsx`,``))}updateAccessOrder(e){this.accessOrder.set(e,++this.accessCounter)}updateStats(){this.config.enableStats&&(this.stats.totalEntries=this.resolvedLayouts.size+this.layoutHandlers.size+this.layoutData.size,this.stats.memoryUsage=this.estimateMemoryUsage())}estimateMemoryUsage(){let e=0;for(let[t,n]of this.resolvedLayouts)e+=t.length*2,e+=JSON.stringify(n.value).length*2,e+=64;for(let[t]of this.layoutHandlers)e+=t.length*2,e+=256,e+=64;for(let[t,n]of this.layoutData)e+=t.length*2,e+=JSON.stringify(n.value).length*2,e+=64;return e}enforceMaxEntries(){let e=this.resolvedLayouts.size+this.layoutHandlers.size+this.layoutData.size;if(e<=this.config.maxEntries)return;let t=Array.from(this.accessOrder.entries()).sort((e,t)=>e[1]-t[1]).map(([e])=>e),n=e-this.config.maxEntries,r=0;for(let e of t){if(r>=n)break;let t=!1;this.resolvedLayouts.has(e)&&(this.resolvedLayouts.delete(e),t=!0),this.layoutHandlers.has(e)&&(this.layoutHandlers.delete(e),t=!0),this.layoutData.has(e)&&(this.layoutData.delete(e),t=!0),t&&(this.accessOrder.delete(e),this.stats.evictions++,r++)}}startCleanupTimer(){this.cleanupTimer&&clearInterval(this.cleanupTimer),this.cleanupTimer=setInterval(()=>{this.cleanup()},this.config.cleanupInterval)}cleanup(){let e=Date.now();for(let[t,n]of this.resolvedLayouts)e-n.timestamp>n.ttl&&(this.resolvedLayouts.delete(t),this.accessOrder.delete(t),this.stats.evictions++);for(let[t,n]of this.layoutHandlers)e-n.timestamp>n.ttl&&(this.layoutHandlers.delete(t),this.accessOrder.delete(t),this.stats.evictions++);for(let[t,n]of this.layoutData)e-n.timestamp>n.ttl&&(this.layoutData.delete(t),this.accessOrder.delete(t),this.stats.evictions++);for(let e of this.accessOrder.keys())!this.resolvedLayouts.has(e)&&!this.layoutHandlers.has(e)&&!this.layoutData.has(e)&&this.accessOrder.delete(e);this.updateStats()}resetStats(){this.stats={hits:0,misses:0,evictions:0,totalEntries:0,memoryUsage:0}}destroy(){this.cleanupTimer&&=(clearInterval(this.cleanupTimer),void 0),this.clear()}}export const defaultCacheConfig={defaultTtl:300*1e3,maxEntries:1e3,cleanupInterval:60*1e3,enableStats:!0,enableCompression:!0,intelligentInvalidation:!0,preloadThreshold:.8};export const layoutCache=new LayoutCacheManager(defaultCacheConfig);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{resolve as e,relative as t}from"node:path";import{statSync as n}from"node:fs";import r from"node:process";import{LayoutDiscovery as i}from"./layout-discovery.js";function a(e){return/^[A-Za-z]:[\\/]/.test(e)?`file:///${e.replaceAll(`\\`,`/`)}`:e}function o(e){try{return n(e),!0}catch{return!1}}function s(e){return new RegExp(e.replaceAll(`*`,`.*`))}export class LayoutComposer{layoutDiscovery;customLayoutCache=new Map;developmentMode;constructor(e){this.layoutDiscovery=new i(e),this.developmentMode=e.developmentMode||!1}async resolveLayouts(e,t){try{let n=t.layoutConfig;if(!n)return await this.layoutDiscovery.buildLayoutChain(new URL(`http://localhost${e}`));if(n.replaceLayout)return this.developmentMode&&console.log(`[LayoutComposer] Replacing all layouts for route: ${e}`),await this.handleReplaceLayout(e,n);let r=await this.layoutDiscovery.buildLayoutChain(new URL(`http://localhost${e}`));return await this.applyConfiguration(r,n)}catch(t){return this.developmentMode&&console.warn(`[LayoutComposer] Error resolving layouts for ${e}: ${t instanceof Error?t.message:String(t)}`),await this.layoutDiscovery.buildLayoutChain(new URL(`http://localhost${e}`))}}async applyConfiguration(e,t){let n=[...e];return t.onlyLayouts&&t.onlyLayouts.length>0&&(n=await this.applyOnlyLayouts(n,t.onlyLayouts)),t.skipLayouts&&t.skipLayouts.length>0&&(n=this.applySkipLayouts(n,t.skipLayouts)),t.customLayout&&(n=await this.addCustomLayout(n,t.customLayout)),n}async handleReplaceLayout(e,t){if(t.customLayout){let e=await this.loadCustomLayout(t.customLayout);return e?[e]:[]}return[]}matchesLayoutPattern(e,n){if(n.includes(`*`)){let i=s(n);return i.test(e.path)||i.test(t(r.cwd(),e.path))}return e.path===n||e.path.endsWith(n)||t(r.cwd(),e.path)===n||t(r.cwd(),e.path).endsWith(n)}applySkipLayouts(e,n){return e.filter(e=>{let i=n.some(t=>this.matchesLayoutPattern(e,t));return i&&this.developmentMode&&console.log(`[LayoutComposer] Skipping layout: ${t(r.cwd(),e.path)}`),!i})}async applyOnlyLayouts(e,n){let i=[];for(let a of n){let n=e.filter(e=>this.matchesLayoutPattern(e,a));if(n.length>0)i.push(...n),this.developmentMode&&console.log(`[LayoutComposer] Kept layouts from onlyLayouts: ${n.map(e=>t(r.cwd(),e.path)).join(`, `)}`);else{let e=await this.loadCustomLayout(a);e&&(i.push(e),this.developmentMode&&console.log(`[LayoutComposer] Added custom layout from onlyLayouts: ${a}`))}}return i.sort((e,t)=>e.priority-t.priority),i}async addCustomLayout(e,n){try{let i=await this.loadCustomLayout(n);if(!i)return this.developmentMode&&console.warn(`[LayoutComposer] Failed to load custom layout: ${n}`),e;let a={...i,priority:Math.max(...e.map(e=>e.priority),0)+10},o=[...e,a];return o.sort((e,t)=>e.priority-t.priority),this.developmentMode&&console.log(`[LayoutComposer] Added custom layout: ${t(r.cwd(),n)}`),o}catch(t){return this.developmentMode&&console.warn(`[LayoutComposer] Error adding custom layout ${n}: ${t instanceof Error?t.message:String(t)}`),e}}resolveLayoutPath(t){if(t.startsWith(`/`)||t.startsWith(`file://`)||/^[A-Za-z]:[\\/]/.test(t))return t;let n=this.layoutDiscovery.getOptions().baseDirectory;return[e(t),e(`src`,t),e(`src/pages`,t),e(`src/layouts`,t),e(n,`..`,t),e(n,t)].find(e=>o(e))||t}async loadCustomLayout(e){if(this.customLayoutCache.has(e))return this.customLayoutCache.get(e);try{let t=this.resolveLayoutPath(e);if(!o(t))return this.developmentMode&&console.warn(`[LayoutComposer] Custom layout file not found: ${t}`),null;let n=await import(a(t));if(!n.default||typeof n.default!=`function`)return this.developmentMode&&console.warn(`[LayoutComposer] Custom layout file does not export a default component: ${t}`),null;let r={component:n.default,loader:n.layoutLoader,path:t,priority:1e3};return this.customLayoutCache.set(e,r),r}catch(t){return this.developmentMode&&console.warn(`[LayoutComposer] Failed to load custom layout ${e}: ${t instanceof Error?t.message:String(t)}`),null}}validateLayoutConfig(e){let t=[];return e.replaceLayout&&e.onlyLayouts&&e.onlyLayouts.length>0&&t.push(`replaceLayout and onlyLayouts cannot be used together`),e.replaceLayout&&e.skipLayouts&&e.skipLayouts.length>0&&t.push(`replaceLayout and skipLayouts cannot be used together`),e.skipLayouts&&!Array.isArray(e.skipLayouts)&&t.push(`skipLayouts must be an array of strings`),e.onlyLayouts&&!Array.isArray(e.onlyLayouts)&&t.push(`onlyLayouts must be an array of strings`),e.customLayout&&typeof e.customLayout!=`string`&&t.push(`customLayout must be a string path`),{valid:t.length===0,errors:t}}getCompositionStats(){return{customLayoutCacheSize:this.customLayoutCache.size,discoveryStats:this.layoutDiscovery.getCacheStats()}}clearCache(){this.customLayoutCache.clear(),this.layoutDiscovery.clearCache()}clearCustomLayoutCache(){this.customLayoutCache.clear()}getLayoutDiscovery(){return this.layoutDiscovery}setDevelopmentMode(e){this.developmentMode=e}isDevelopmentMode(){return this.developmentMode}}
|