@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.
Files changed (230) hide show
  1. package/mod.ts +302 -0
  2. package/package.json +9 -17
  3. package/src/build/integration-bundler-plugin.ts +116 -0
  4. package/src/build/integration-config.ts +168 -0
  5. package/src/build/integration-detection-plugin.ts +117 -0
  6. package/src/build/integration-resolver-plugin.ts +90 -0
  7. package/src/build/island-manifest.ts +269 -0
  8. package/src/build/island-types-generator.ts +476 -0
  9. package/src/build/mdx-island-transform.ts +464 -0
  10. package/src/build/mdx-plugin.ts +98 -0
  11. package/src/build/page-island-transform.ts +598 -0
  12. package/src/build/prop-extractors/index.ts +21 -0
  13. package/src/build/prop-extractors/lit.ts +140 -0
  14. package/src/build/prop-extractors/qwik.ts +16 -0
  15. package/src/build/prop-extractors/solid.ts +125 -0
  16. package/src/build/prop-extractors/svelte.ts +194 -0
  17. package/src/build/prop-extractors/vue.ts +111 -0
  18. package/src/build/sidecar-file-manager.ts +104 -0
  19. package/src/build/sidecar-renderer.ts +30 -0
  20. package/src/client/adapters/index.ts +21 -0
  21. package/src/client/components.ts +35 -0
  22. package/src/client/css-hmr-handler.ts +344 -0
  23. package/src/client/framework-adapter.ts +462 -0
  24. package/src/client/hmr-coordinator.ts +396 -0
  25. package/src/client/hmr-error-overlay.js +533 -0
  26. package/src/client/main.js +824 -0
  27. package/src/components/Image.tsx +123 -0
  28. package/src/components/IslandErrorBoundary.tsx +145 -0
  29. package/src/components/LayoutDataErrorBoundary.tsx +141 -0
  30. package/src/components/LayoutErrorBoundary.tsx +127 -0
  31. package/src/components/PersistentIsland.tsx +52 -0
  32. package/src/components/StreamingErrorBoundary.tsx +233 -0
  33. package/src/components/StreamingLayout.tsx +538 -0
  34. package/src/core/components/component-analyzer.ts +192 -0
  35. package/src/core/components/component-detection.ts +508 -0
  36. package/src/core/components/enhanced-framework-detector.ts +500 -0
  37. package/src/core/components/framework-registry.ts +563 -0
  38. package/src/core/content/mdx-processor.ts +46 -0
  39. package/src/core/integrations/index.ts +19 -0
  40. package/src/core/integrations/loader.ts +125 -0
  41. package/src/core/integrations/registry.ts +175 -0
  42. package/src/core/islands/island-persistence.ts +325 -0
  43. package/src/core/islands/island-state-serializer.ts +258 -0
  44. package/src/core/islands/persistent-island-context.tsx +80 -0
  45. package/src/core/islands/use-persistent-state.ts +68 -0
  46. package/src/core/layout/enhanced-layout-resolver.ts +322 -0
  47. package/src/core/layout/layout-cache-manager.ts +485 -0
  48. package/src/core/layout/layout-composer.ts +357 -0
  49. package/src/core/layout/layout-data-loader.ts +516 -0
  50. package/src/core/layout/layout-discovery.ts +243 -0
  51. package/src/core/layout/layout-matcher.ts +299 -0
  52. package/src/core/layout/layout-types.ts +110 -0
  53. package/src/core/modules/framework-module-resolver.ts +273 -0
  54. package/src/islands/component-analysis.ts +213 -0
  55. package/src/islands/css-utils.ts +565 -0
  56. package/src/islands/discovery/index.ts +80 -0
  57. package/src/islands/discovery/registry.ts +340 -0
  58. package/src/islands/discovery/resolver.ts +477 -0
  59. package/src/islands/discovery/scanner.ts +386 -0
  60. package/src/islands/discovery/types.ts +117 -0
  61. package/src/islands/discovery/validator.ts +544 -0
  62. package/src/islands/discovery/watcher.ts +368 -0
  63. package/src/islands/framework-detection.ts +428 -0
  64. package/src/islands/integration-loader.ts +490 -0
  65. package/src/islands/island.tsx +565 -0
  66. package/src/islands/render-cache.ts +550 -0
  67. package/src/islands/types.ts +80 -0
  68. package/src/islands/universal-css-collector.ts +157 -0
  69. package/src/islands/universal-head-collector.ts +137 -0
  70. package/src/layout-system.ts +218 -0
  71. package/src/middleware/discovery.ts +268 -0
  72. package/src/middleware/executor.ts +315 -0
  73. package/src/middleware/index.ts +76 -0
  74. package/src/middleware/types.ts +99 -0
  75. package/src/nitro/build-config.ts +576 -0
  76. package/src/nitro/config.ts +483 -0
  77. package/src/nitro/error-handler.ts +636 -0
  78. package/src/nitro/index.ts +173 -0
  79. package/src/nitro/island-manifest.ts +584 -0
  80. package/src/nitro/middleware-adapter.ts +260 -0
  81. package/src/nitro/renderer.ts +1471 -0
  82. package/src/nitro/route-discovery.ts +439 -0
  83. package/src/nitro/types.ts +321 -0
  84. package/src/render/collect-css.ts +198 -0
  85. package/src/render/error-pages.ts +79 -0
  86. package/src/render/isolated-ssr-renderer.ts +654 -0
  87. package/src/render/ssr.ts +1030 -0
  88. package/src/schemas/api.ts +30 -0
  89. package/src/schemas/core.ts +64 -0
  90. package/src/schemas/index.ts +212 -0
  91. package/src/schemas/layout.ts +279 -0
  92. package/src/schemas/routing/index.ts +38 -0
  93. package/src/schemas/routing.ts +376 -0
  94. package/src/types/as-island.ts +20 -0
  95. package/src/types/layout.ts +285 -0
  96. package/src/types/routing.ts +555 -0
  97. package/src/types/types.ts +5 -0
  98. package/src/utils/dev-logger.ts +299 -0
  99. package/src/utils/fs.ts +151 -0
  100. package/src/vite-plugin/auto-discover.ts +551 -0
  101. package/src/vite-plugin/config.ts +266 -0
  102. package/src/vite-plugin/errors.ts +127 -0
  103. package/src/vite-plugin/image-optimization.ts +156 -0
  104. package/src/vite-plugin/integration-activator.ts +126 -0
  105. package/src/vite-plugin/island-sidecar-plugin.ts +176 -0
  106. package/src/vite-plugin/module-discovery.ts +189 -0
  107. package/src/vite-plugin/nitro-integration.ts +1354 -0
  108. package/src/vite-plugin/plugin.ts +403 -0
  109. package/src/vite-plugin/types.ts +327 -0
  110. package/src/vite-plugin/validation.ts +228 -0
  111. package/dist/mod.js +0 -1
  112. package/dist/src/build/integration-bundler-plugin.js +0 -1
  113. package/dist/src/build/integration-config.js +0 -1
  114. package/dist/src/build/integration-detection-plugin.js +0 -1
  115. package/dist/src/build/integration-resolver-plugin.js +0 -1
  116. package/dist/src/build/island-manifest.js +0 -1
  117. package/dist/src/build/island-types-generator.js +0 -5
  118. package/dist/src/build/mdx-island-transform.js +0 -2
  119. package/dist/src/build/mdx-plugin.js +0 -1
  120. package/dist/src/build/page-island-transform.js +0 -3
  121. package/dist/src/build/prop-extractors/index.js +0 -1
  122. package/dist/src/build/prop-extractors/lit.js +0 -1
  123. package/dist/src/build/prop-extractors/qwik.js +0 -1
  124. package/dist/src/build/prop-extractors/solid.js +0 -1
  125. package/dist/src/build/prop-extractors/svelte.js +0 -1
  126. package/dist/src/build/prop-extractors/vue.js +0 -1
  127. package/dist/src/build/sidecar-file-manager.js +0 -1
  128. package/dist/src/build/sidecar-renderer.js +0 -6
  129. package/dist/src/client/adapters/index.js +0 -1
  130. package/dist/src/client/components.js +0 -1
  131. package/dist/src/client/css-hmr-handler.js +0 -1
  132. package/dist/src/client/framework-adapter.js +0 -13
  133. package/dist/src/client/hmr-coordinator.js +0 -1
  134. package/dist/src/client/hmr-error-overlay.js +0 -214
  135. package/dist/src/client/main.js +0 -39
  136. package/dist/src/components/Image.js +0 -1
  137. package/dist/src/components/IslandErrorBoundary.js +0 -1
  138. package/dist/src/components/LayoutDataErrorBoundary.js +0 -1
  139. package/dist/src/components/LayoutErrorBoundary.js +0 -1
  140. package/dist/src/components/PersistentIsland.js +0 -1
  141. package/dist/src/components/StreamingErrorBoundary.js +0 -1
  142. package/dist/src/components/StreamingLayout.js +0 -29
  143. package/dist/src/core/components/component-analyzer.js +0 -1
  144. package/dist/src/core/components/component-detection.js +0 -5
  145. package/dist/src/core/components/enhanced-framework-detector.js +0 -1
  146. package/dist/src/core/components/framework-registry.js +0 -1
  147. package/dist/src/core/content/mdx-processor.js +0 -1
  148. package/dist/src/core/integrations/index.js +0 -1
  149. package/dist/src/core/integrations/loader.js +0 -1
  150. package/dist/src/core/integrations/registry.js +0 -1
  151. package/dist/src/core/islands/island-persistence.js +0 -1
  152. package/dist/src/core/islands/island-state-serializer.js +0 -1
  153. package/dist/src/core/islands/persistent-island-context.js +0 -1
  154. package/dist/src/core/islands/use-persistent-state.js +0 -1
  155. package/dist/src/core/layout/enhanced-layout-resolver.js +0 -1
  156. package/dist/src/core/layout/layout-cache-manager.js +0 -1
  157. package/dist/src/core/layout/layout-composer.js +0 -1
  158. package/dist/src/core/layout/layout-data-loader.js +0 -1
  159. package/dist/src/core/layout/layout-discovery.js +0 -1
  160. package/dist/src/core/layout/layout-matcher.js +0 -1
  161. package/dist/src/core/layout/layout-types.js +0 -1
  162. package/dist/src/core/modules/framework-module-resolver.js +0 -1
  163. package/dist/src/islands/component-analysis.js +0 -1
  164. package/dist/src/islands/css-utils.js +0 -17
  165. package/dist/src/islands/discovery/index.js +0 -1
  166. package/dist/src/islands/discovery/registry.js +0 -1
  167. package/dist/src/islands/discovery/resolver.js +0 -2
  168. package/dist/src/islands/discovery/scanner.js +0 -1
  169. package/dist/src/islands/discovery/types.js +0 -1
  170. package/dist/src/islands/discovery/validator.js +0 -18
  171. package/dist/src/islands/discovery/watcher.js +0 -1
  172. package/dist/src/islands/framework-detection.js +0 -1
  173. package/dist/src/islands/integration-loader.js +0 -1
  174. package/dist/src/islands/island.js +0 -1
  175. package/dist/src/islands/render-cache.js +0 -1
  176. package/dist/src/islands/types.js +0 -1
  177. package/dist/src/islands/universal-css-collector.js +0 -5
  178. package/dist/src/islands/universal-head-collector.js +0 -2
  179. package/dist/src/layout-system.js +0 -1
  180. package/dist/src/middleware/discovery.js +0 -1
  181. package/dist/src/middleware/executor.js +0 -1
  182. package/dist/src/middleware/index.js +0 -1
  183. package/dist/src/middleware/types.js +0 -1
  184. package/dist/src/nitro/build-config.js +0 -1
  185. package/dist/src/nitro/config.js +0 -1
  186. package/dist/src/nitro/error-handler.js +0 -198
  187. package/dist/src/nitro/index.js +0 -1
  188. package/dist/src/nitro/island-manifest.js +0 -2
  189. package/dist/src/nitro/middleware-adapter.js +0 -1
  190. package/dist/src/nitro/renderer.js +0 -183
  191. package/dist/src/nitro/route-discovery.js +0 -1
  192. package/dist/src/nitro/types.js +0 -1
  193. package/dist/src/render/collect-css.js +0 -3
  194. package/dist/src/render/error-pages.js +0 -48
  195. package/dist/src/render/isolated-ssr-renderer.js +0 -1
  196. package/dist/src/render/ssr.js +0 -90
  197. package/dist/src/schemas/api.js +0 -1
  198. package/dist/src/schemas/core.js +0 -1
  199. package/dist/src/schemas/index.js +0 -1
  200. package/dist/src/schemas/layout.js +0 -1
  201. package/dist/src/schemas/routing/index.js +0 -1
  202. package/dist/src/schemas/routing.js +0 -1
  203. package/dist/src/types/as-island.js +0 -1
  204. package/dist/src/types/layout.js +0 -1
  205. package/dist/src/types/routing.js +0 -1
  206. package/dist/src/types/types.js +0 -1
  207. package/dist/src/utils/dev-logger.js +0 -12
  208. package/dist/src/utils/fs.js +0 -1
  209. package/dist/src/vite-plugin/auto-discover.js +0 -1
  210. package/dist/src/vite-plugin/config.js +0 -1
  211. package/dist/src/vite-plugin/errors.js +0 -1
  212. package/dist/src/vite-plugin/image-optimization.js +0 -45
  213. package/dist/src/vite-plugin/integration-activator.js +0 -1
  214. package/dist/src/vite-plugin/island-sidecar-plugin.js +0 -1
  215. package/dist/src/vite-plugin/module-discovery.js +0 -1
  216. package/dist/src/vite-plugin/nitro-integration.js +0 -42
  217. package/dist/src/vite-plugin/plugin.js +0 -1
  218. package/dist/src/vite-plugin/types.js +0 -1
  219. package/dist/src/vite-plugin/validation.js +0 -2
  220. /package/{dist/src → src}/client/types/framework-runtime.d.ts +0 -0
  221. /package/{dist/src → src}/client/types/vite-hmr.d.ts +0 -0
  222. /package/{dist/src → src}/client/types/vite-virtual-modules.d.ts +0 -0
  223. /package/{dist/src → src}/layout-system.d.ts +0 -0
  224. /package/{dist/src → src}/types/image.d.ts +0 -0
  225. /package/{dist/src → src}/types/index.d.ts +0 -0
  226. /package/{dist/src → src}/types/island-jsx.d.ts +0 -0
  227. /package/{dist/src → src}/types/island-prop.d.ts +0 -0
  228. /package/{dist/src → src}/types/mdx.d.ts +0 -0
  229. /package/{dist/src → src}/types/urlpattern.d.ts +0 -0
  230. /package/{dist/src → src}/types/vite-env.d.ts +0 -0
@@ -1 +0,0 @@
1
- export class LayoutDataLoadingError extends Error{constructor(e,t,n){super(e),this.layoutPath=t,this.originalError=n,this.name=`LayoutDataLoadingError`}}export class LayoutDataLoader{options;constructor(e={}){this.options={timeout:e.timeout??5e3,enableParallelLoading:e.enableParallelLoading??!0,continueOnError:e.continueOnError??!0,developmentMode:e.developmentMode??!1,maxRetries:e.maxRetries??2,retryDelay:e.retryDelay??1e3}}async loadLayoutData(e,t){let n=e.filter(e=>e.loader);return n.length===0?[]:this.options.enableParallelLoading?await this.loadDataInParallel(n,t):await this.loadDataSequentially(n,t)}async loadDataInParallel(t,n){let r=Math.min(t.length,5),i=[];for(let a=0;a<t.length;a+=r){let o=t.slice(a,a+r),s=o.map(e=>this.loadSingleLayoutData(e,n));if(this.options.continueOnError){let t=(await Promise.allSettled(s)).map((t,n)=>{if(t.status===`fulfilled`)return t.value;{let r=o[n];return{success:!1,data:{},error:new LayoutDataLoadingError(`Layout data loading failed: ${t.reason}`,r.path,t.reason instanceof Error?t.reason:Error(String(t.reason))),loadingTime:0,layoutPath:r.path}}});i.push(...t)}else try{let e=await Promise.all(s);i.push(...e)}catch(e){throw e}}return i}async loadDataSequentially(t,n){let r=[];for(let i of t)try{let e=await this.loadSingleLayoutData(i,n);if(r.push(e),!this.options.continueOnError&&!e.success)break}catch(t){let n={success:!1,data:{},error:new LayoutDataLoadingError(`Layout data loading failed: ${t instanceof Error?t.message:String(t)}`,i.path,t instanceof Error?t:Error(String(t))),loadingTime:0,layoutPath:i.path};if(r.push(n),!this.options.continueOnError)break}return r}async loadSingleLayoutData(t,n){if(!t.loader)return{success:!0,data:{},loadingTime:0,layoutPath:t.path};let r,i=0;for(;i<=this.options.maxRetries;){let e=performance.now();try{let r=await this.executeLoaderWithTimeout(t.loader,n),i=performance.now()-e;return this.options.developmentMode&&console.log(`[Layout] Loaded data for ${t.path} in ${i.toFixed(2)}ms`),{success:!0,data:r,loadingTime:i,layoutPath:t.path}}catch(e){r=e instanceof Error?e:Error(String(e)),i++,this.options.developmentMode&&console.warn(`[Layout] Data loading attempt ${i} failed for ${t.path}: ${r.message}`),i<=this.options.maxRetries&&await this.delay(this.options.retryDelay)}}return{success:!1,data:{},error:new LayoutDataLoadingError(`Layout data loading failed after ${this.options.maxRetries+1} attempts: ${r?.message}`,t.path,r),loadingTime:0,layoutPath:t.path}}executeLoaderWithTimeout(e,t){return new Promise((n,r)=>{let i=setTimeout(()=>{r(Error(`Layout data loading timed out after ${this.options.timeout}ms`))},this.options.timeout);Promise.resolve(e(t)).then(e=>{clearTimeout(i),n(e)}).catch(e=>{clearTimeout(i),r(e)})})}createEnhancedContext(e,t){let n={...e,state:new Map(e.state)};return n.state.set(`parentLayoutData`,t),n}processLoadingResults(e,t){let n=[],r=[],i=new Map;return e.forEach(e=>{i.set(e.layoutPath,e)}),t.forEach(e=>{let t=i.get(e.path);t?t.success?n.push(t.data):(n.push({}),t.error&&(r.push({layoutPath:e.path,errorType:`loader`,timestamp:Date.now()}),this.options.developmentMode&&console.error(`[Layout] Data loading error for ${e.path}:`,t.error))):n.push({})}),{data:n,errors:r}}createFallbackData(e,t){return{__layoutError:!0,__layoutPath:e,__errorMessage:t.message,__errorType:`data-loading`,__timestamp:Date.now()}}validateLayoutData(t,n){if(t==null)return{};if(typeof t!=`object`)throw new LayoutDataLoadingError(`Layout loader must return an object, got ${typeof t}`,n);if(Array.isArray(t))throw new LayoutDataLoadingError(`Layout loader must return an object, not an array`,n);return t}delay(e){return new Promise(t=>setTimeout(t,e))}async preloadLayoutData(e,t,n=`medium`){let r=e.filter(e=>e.loader);if(r.length===0)return;let i=this.options.timeout;switch(n){case`high`:this.options.timeout=i*.5;break;case`low`:this.options.timeout=i*2;break}try{let e=await this.loadDataInParallel(r,t);if(this.options.developmentMode){let t=e.filter(e=>e.success).length;console.log(`[LayoutDataLoader] Preloaded ${t}/${e.length} layouts (priority: ${n})`)}}catch(e){this.options.developmentMode&&console.warn(`[LayoutDataLoader] Preload failed:`,e)}finally{this.options.timeout=i}}getOptions(){return{...this.options}}updateOptions(e){Object.assign(this.options,e)}}export const defaultLayoutDataLoader=new LayoutDataLoader;export function createLayoutDataLoader(e={}){return new LayoutDataLoader(e)}export async function loadSingleLayoutData(e,n,r={}){return(await new LayoutDataLoader(r).loadLayoutData([e],n))[0]||{success:!0,data:{},loadingTime:0,layoutPath:e.path}}export function mergeLayoutData(...e){let t={};for(let n of e)n&&typeof n==`object`&&!Array.isArray(n)&&Object.assign(t,n);return t}export function getParentLayoutData(e){let t=e.state.get(`parentLayoutData`);return Array.isArray(t)?t:[]}
@@ -1 +0,0 @@
1
- import{join as e,resolve as t,relative as n}from"node:path";import{statSync as r}from"node:fs";function i(e){return/^[A-Za-z]:[\\/]/.test(e)?`file:///${e.replaceAll(`\\`,`/`)}`:e}function a(e){try{return r(e),!0}catch{return!1}}function o(e){let t=e.split(`/`).filter(Boolean),n=[``];for(let e=0;e<t.length;e++)n.push(`/`+t.slice(0,e+1).join(`/`));return n}export class LayoutDiscovery{layoutCache=new Map;routeCache=new Map;baseDirectory;filePattern;developmentMode;constructor(e){this.baseDirectory=t(e.baseDirectory),this.filePattern=e.filePattern||`_layout.tsx`,this.developmentMode=e.developmentMode||!1,this.developmentMode&&console.log(`[LayoutDiscovery] baseDirectory=${this.baseDirectory}, filePattern=${this.filePattern}`)}discoverLayouts(t){let n=`layouts-${t}`;if(this.routeCache.has(n))return Promise.resolve(this.routeCache.get(n));let r=[],i=o(t);for(let t of i){let n=e(t===``?this.baseDirectory:e(this.baseDirectory,t),this.filePattern);if(a(n)){let e=t===``?0:t.split(`/`).filter(Boolean).length;r.push({pattern:new URLPattern({pathname:e===0?`*`:`${t}/*`}),layoutPath:n,priority:e*10,type:e===0?`root`:`nested`,depth:e})}}return r.sort((e,t)=>e.priority-t.priority),this.routeCache.set(n,r),Promise.resolve(r)}async buildLayoutChain(e){let t=await this.discoverLayouts(e.pathname),n=[];for(let e of t)try{let t=await this.loadLayout(e.layoutPath);t&&n.push(t)}catch(t){this.developmentMode&&console.warn(`[Layout] Failed to load ${e.layoutPath}: ${t instanceof Error?t.message:String(t)}`)}return n}async buildLayoutChainWithData(e,t){let n=await this.buildLayoutChain(e),r=[],i=[];for(let e of n)if(e.loader)try{let n=await e.loader(t);r.push(n)}catch(t){this.developmentMode&&console.warn(`[Layout] Data loader error for ${e.path}:`,t),i.push({layoutPath:e.path,errorType:`loader`,timestamp:Date.now()}),r.push({})}else r.push({});return{handlers:n,data:r,errors:i}}async loadLayout(e){if(this.layoutCache.has(e))return this.layoutCache.get(e);try{let t=await import(i(e));if(!t.default||typeof t.default!=`function`)return this.developmentMode&&console.warn(`[Layout] No default export in ${e}`),null;let r=n(this.baseDirectory,e).split(`/`).filter(Boolean),a=Math.max(0,(r.length-1)*10),o={component:t.default,loader:t.layoutLoader,path:e,priority:a};return this.layoutCache.set(e,o),o}catch(t){return this.developmentMode&&console.warn(`[Layout] Failed to load ${e}: ${t instanceof Error?t.message:String(t)}`),null}}clearCache(){this.layoutCache.clear(),this.routeCache.clear()}clearLayoutCache(e){this.layoutCache.delete(e),this.routeCache.clear()}getCacheStats(){return{layoutCount:this.layoutCache.size,routeCacheCount:this.routeCache.size}}getOptions(){return{baseDirectory:this.baseDirectory,filePattern:this.filePattern,developmentMode:this.developmentMode}}}
@@ -1 +0,0 @@
1
- export class BuiltInLayoutRules{static API_ROUTES_SKIP_LAYOUTS={matches:e=>e.path.startsWith(`/api/`),apply:!1,priority:100};static MOBILE_LAYOUT_DETECTION={matches:(e,t)=>{let n=e.headers.get(`user-agent`)?.toLowerCase()||``,r=/mobile|android|iphone|ipad|phone|tablet/i.test(n);return t?.includes(`/mobile/`)??!1?!r:r},apply:!1,priority:50};static HEADER_BASED_SKIP={matches:e=>{let t=e.headers.get(`x-skip-layout`);return t===`true`||t===`1`},apply:!1,priority:90};static ADMIN_LAYOUT_RESTRICTION={matches:(e,t)=>t?.includes(`/admin/`)?!e.path.startsWith(`/admin/`):!1,apply:!1,priority:60};static getAllRules(){return[this.API_ROUTES_SKIP_LAYOUTS,this.MOBILE_LAYOUT_DETECTION,this.HEADER_BASED_SKIP,this.ADMIN_LAYOUT_RESTRICTION]}}export class LayoutMatcher{rules=[];developmentMode;constructor(e={}){this.developmentMode=e.developmentMode||!1,this.addBuiltInRules()}addRule(e){if(!e.matches||typeof e.matches!=`function`)throw Error(`Layout rule must have a valid matches function`);if(typeof e.apply!=`boolean`)throw TypeError(`Layout rule must have a boolean apply property`);if(typeof e.priority!=`number`)throw TypeError(`Layout rule must have a numeric priority`);this.rules.push(e),this.sortRulesByPriority(),this.developmentMode&&console.log(`[LayoutMatcher] Added rule with priority ${e.priority}`)}removeRule(e){let t=this.rules.indexOf(e);t>-1&&(this.rules.splice(t,1),this.developmentMode&&console.log(`[LayoutMatcher] Removed rule with priority ${e.priority}`))}shouldApplyLayout(e,t){try{let n=this.getMatchingRules(t,e);if(n.length===0)return!0;let r=this.resolveRuleConflicts(n);return this.developmentMode&&console.log(`[LayoutMatcher] Layout ${e} for route ${t.path}: ${r?`APPLY`:`SKIP`} (${n.length} rules matched)`),r}catch(t){return this.developmentMode&&console.warn(`[LayoutMatcher] Error evaluating rules for layout ${e}: ${t instanceof Error?t.message:String(t)}`),!0}}getRules(){return[...this.rules]}clearRules(){this.rules=[],this.developmentMode&&console.log(`[LayoutMatcher] Cleared all rules`)}addBuiltInRules(){for(let t of BuiltInLayoutRules.getAllRules())this.rules.push(t);this.sortRulesByPriority(),this.developmentMode&&console.log(`[LayoutMatcher] Added ${this.rules.length} built-in rules`)}sortRulesByPriority(){this.rules.sort((e,t)=>t.priority-e.priority)}getMatchingRules(e,t){let n=[];for(let r of this.rules)try{r.matches(e,t)&&n.push(r)}catch(e){this.developmentMode&&console.warn(`[LayoutMatcher] Error in rule evaluation: ${e instanceof Error?e.message:String(e)}`)}return n}resolveRuleConflicts(e){if(e.length===0)return!0;if(e.length===1)return e[0].apply;let t=new Map;for(let n of e)t.has(n.priority)||t.set(n.priority,[]),t.get(n.priority).push(n);let n=Array.from(t.keys()).sort((e,t)=>t-e),r=t.get(n[0]);return r.length===1?r[0].apply:this.resolveEqualPriorityConflicts(r)}resolveEqualPriorityConflicts(e){let t=e.filter(e=>e.apply).length,n=e.filter(e=>!e.apply).length;return n>t?(this.developmentMode&&console.log(`[LayoutMatcher] Conflict resolution: SKIP`),!1):t>n?(this.developmentMode&&console.log(`[LayoutMatcher] Conflict resolution: APPLY`),!0):(this.developmentMode&&console.log(`[LayoutMatcher] Conflict resolution: SKIP (tie-breaker)`),!1)}static createCustomRule(e,t,n=10){return{matches:e,apply:t,priority:n}}static createPathRule(e,t,n=10){return{matches:typeof e==`string`?t=>t.path.includes(e):t=>e.test(t.path),apply:t,priority:n}}static createHeaderRule(e,t,n,r=10){return{matches:n=>{let r=n.headers.get(e.toLowerCase());return r?typeof t==`string`?r===t:t.test(r):!1},apply:n,priority:r}}static createMethodRule(e,t,n=10){let r=new Set((Array.isArray(e)?e:[e]).map(e=>e.toUpperCase()));return{matches:e=>r.has(e.method.toUpperCase()),apply:t,priority:n}}getDebugInfo(e,t){let n=this.getMatchingRules(t,e),r=this.shouldApplyLayout(e,t);return{totalRules:this.rules.length,matchingRules:n.map(e=>({priority:e.priority,apply:e.apply})),finalDecision:r,conflictResolution:n.length>1?`priority-based`:`single-rule`}}}
@@ -1 +0,0 @@
1
- export{};
@@ -1 +0,0 @@
1
- const e={solid:{extensions:[`.tsx`,`.jsx`],hydrationExtension:`.js`,mimeType:`application/javascript`,transformPath:(e,t)=>e.endsWith(`.tsx`)?e.replace(/\.tsx$/,`.js`):e.endsWith(`.jsx`)?e.replace(/\.jsx$/,`.js`):e},preact:{extensions:[`.tsx`,`.jsx`],hydrationExtension:`.js`,mimeType:`application/javascript`,transformPath:(e,t)=>e.endsWith(`.tsx`)?e.replace(/\.tsx$/,`.js`):e.endsWith(`.jsx`)?e.replace(/\.jsx$/,`.js`):e},vue:{extensions:[`.vue`],hydrationExtension:`.js`,mimeType:`application/javascript`,transformPath:(e,t)=>e.endsWith(`.vue`)?e.replace(/\.vue$/,`.js`):e},svelte:{extensions:[`.svelte`],hydrationExtension:`.js`,mimeType:`application/javascript`,transformPath:(e,t)=>e.endsWith(`.svelte`)?e.replace(/\.svelte$/,`.js`):e},qwik:{extensions:[`.tsx`,`.jsx`],hydrationExtension:`.js`,mimeType:`application/javascript`,transformPath:(e,t)=>e.endsWith(`.tsx`)?e.replace(/\.tsx$/,`.js`):e.endsWith(`.jsx`)?e.replace(/\.jsx$/,`.js`):e}};export class FrameworkModuleResolver{mode;baseUrl;constructor(e=`development`,t=``){this.mode=e,this.baseUrl=t}resolveModule(t,n,r={}){let i=e[n];if(!i)throw Error(`Unknown framework: ${n}`);let{forHydration:a=!1,baseUrl:o=this.baseUrl}=r,s=t,c=!1,l=this.getMimeType(t);if(a){let e=i.transformPath(t,this.mode);e!==t&&(s=e,c=!0,l=i.mimeType)}let u=this.generateModuleUrl(s,o);return{originalPath:t,resolvedPath:s,framework:n,shouldTransform:c,mimeType:l,url:u}}needsTransformation(t,n){let r=e[n];return r?r.transformPath(t,this.mode)!==t:!1}getMimeType(e){switch(this.getFileExtension(e)){case`.js`:case`.mjs`:return`application/javascript`;case`.ts`:case`.tsx`:case`.jsx`:return`application/javascript`;case`.css`:return`text/css`;case`.json`:return`application/json`;case`.vue`:case`.svelte`:return`application/javascript`;default:return`text/plain`}}generateModuleUrl(e,t=this.baseUrl){let n=e.startsWith(`/`)?e:`/${e}`;return t?`${t.replace(/\/$/,``)}${n}`:n}getSupportedFrameworks(){return Object.keys(e)}getFrameworkConfig(t){return e[t]}isFrameworkSupported(t){return t in e}getFileExtension(e){let t=e.lastIndexOf(`.`);return t===-1?``:e.substring(t)}setMode(e){this.mode=e}getMode(){return this.mode}setBaseUrl(e){this.baseUrl=e}getBaseUrl(){return this.baseUrl}}export const frameworkModuleResolver=new FrameworkModuleResolver;
@@ -1 +0,0 @@
1
- import{analyzeComponentContent as e}from"../core/components/component-analyzer.js";import{resolveIslandPath as t}from"./framework-detection.js";import{getCachedAnalysis as n,setCachedAnalysis as r,getCachedPath as i,setCachedPath as a}from"./render-cache.js";import{readFile as o}from"node:fs/promises";function s(e,t){let n=e.split(`/`).pop()?.replace(/\.(tsx|jsx|vue|svelte|ts|js)$/,``)||``,r=e.split(`.`).pop()||`tsx`;return[t.startsWith(`/`)?t.substring(1):t,e.startsWith(`/`)?e.substring(1):e,`src/islands/${n}.${r}`,`src/islands/${n}.tsx`,`islands/${n}.${r}`,`islands/${n}.tsx`,`src/islands/${n}.svelte`,`src/islands/${n}.vue`,`src/islands/${n}.solid.tsx`]}async function c(e){try{return await o(e,`utf-8`)}catch{return null}}export async function analyzeComponentFile(o,l={}){let u=n(o);if(u)return u;let d=i(o);d||=await t(o);let f=s(o,d);for(let t of f){let n=await c(t);if(n!==null){a(o,t);let i=e(t,n,l);return r(o,i),i}}throw Error(`Component file not found: ${o}`)}export async function renderComponentSSROnly({src:e,condition:t,props:n,framework:r,renderOptions:i}){try{let{default:a}=await import(`./island.js`),{loadIntegration:o}=await import(`./integration-loader.js`),{detectFramework:s}=await import(`./framework-detection.js`),c;c=r||(e.endsWith(`.vue`)?`vue`:e.endsWith(`.svelte`)?`svelte`:e.endsWith(`.tsx`)||e.endsWith(`.jsx`)||e.endsWith(`.ts`)||e.endsWith(`.js`)?await s(e):`preact`);let l=await o(c),u=globalThis.__viteDevServer,d=process.env.NODE_ENV!==`production`;return a({src:e,condition:t,props:n,children:(await l.render({component:null,props:n,src:e,condition:t,ssrOnly:!0,viteServer:u,isDev:d})).html,ssr:!0,framework:c,ssrOnly:!0,renderOptions:i,hydrationData:void 0})}catch(t){throw process.env.NODE_ENV!==`production`&&console.error(`SSR-only rendering failed for ${e}:`,t),t}}
@@ -1,17 +0,0 @@
1
- typeof globalThis<`u`&&!globalThis.__svelteSSRCSS&&(globalThis.__svelteSSRCSS=new Map);export function addSvelteSSRCSS(e,t,n,r=!1){globalThis.__svelteSSRCSS||(globalThis.__svelteSSRCSS=new Map);let i={css:e.trim(),scopeId:t,src:n,isGlobal:r,timestamp:Date.now()};globalThis.__svelteSSRCSS.set(t,i)}export function getSvelteSSRCSS(e=!1){if(!globalThis.__svelteSSRCSS||globalThis.__svelteSSRCSS.size===0)return``;let t=Array.from(globalThis.__svelteSSRCSS.values());t.sort((e,t)=>e.isGlobal&&!t.isGlobal?-1:!e.isGlobal&&t.isGlobal?1:e.timestamp-t.timestamp);let n=t.filter(e=>e.isGlobal),r=t.filter(e=>!e.isGlobal),i=o([n.map(e=>`${`/* Global CSS from: ${e.src} */`}\n${e.css}`).join(`
2
-
3
- `),r.map(e=>`${`/* Component CSS: ${e.src} (${e.scopeId}) */`}\n${e.css}`).join(`
4
-
5
- `)].filter(e=>e.trim()).join(`
6
-
7
- `));return e&&globalThis.__svelteSSRCSS.clear(),i}export function getSvelteSSRCSSForHead(e=!1){let n=getSvelteSSRCSS(e);return n.trim()?`<style data-svelte-ssr="true" data-generated="${new Date().toISOString()}">\n${n}\n</style>`:``}export function getSvelteSSRCSSStats(){if(!globalThis.__svelteSSRCSS||globalThis.__svelteSSRCSS.size===0)return{totalComponents:0,globalComponents:0,scopedComponents:0,totalCSSSize:0,averageCSSSize:0,oldestTimestamp:0,newestTimestamp:0};let e=Array.from(globalThis.__svelteSSRCSS.values()),t=e.filter(e=>e.isGlobal),n=e.filter(e=>!e.isGlobal),r=e.reduce((e,t)=>e+t.css.length,0),i=e.map(e=>e.timestamp);return{totalComponents:e.length,globalComponents:t.length,scopedComponents:n.length,totalCSSSize:r,averageCSSSize:e.length>0?Math.round(r/e.length):0,oldestTimestamp:Math.min(...i),newestTimestamp:Math.max(...i)}}export function getSvelteComponentCSS(e){if(!globalThis.__svelteSSRCSS)return null;let t=globalThis.__svelteSSRCSS.get(e);return t?t.css:null}export function clearSvelteComponentCSS(e){return globalThis.__svelteSSRCSS?globalThis.__svelteSSRCSS.delete(e):!1}function o(e){try{return s(optimizeComponentCSS(e))}catch(t){return console.warn(`⚠️ Failed to optimize Svelte SSR CSS:`,t),e}}function s(e){try{let t=l(c(e));return process.env.NODE_ENV===`production`?minifyCSS(t):u(t)}catch(t){return console.warn(`⚠️ Failed to apply SSR CSS collection optimizations:`,t),e}}function c(e){let t=new Set;return e.replace(/\/\*[^*]*\*+(?:[^/*][^*]*\*+)*\//g,e=>e.includes(`!important`)||e.includes(`@preserve`)||e.includes(`license`)?e:t.has(e)?``:(t.add(e),e))}function l(e){return e.replace(/\n\s*\n\s*\n/g,`
8
-
9
- `).replace(/^\s*\n/gm,``).trim()}function u(e){return e.replace(/\{/g,` {
10
- `).replace(/;/g,`;
11
- `).replace(/\}/g,`
12
- }
13
- `).replace(/\n {2}\n/g,`
14
- `).replace(/\n\n+/g,`
15
-
16
- `).trim()}export function applyCSSScoping(e,t){return e.replace(/([^{}]+){/g,(e,n)=>{let r=n.trim();return r.startsWith(`@`)||r.includes(`[data-${t}]`)?e:r.includes(`:global(`)?`${r.replace(/:global\(([^)]+)\)/g,`$1`)} {`:`${r.split(`,`).map(e=>applySelectorScoping(e.trim(),t)).join(`, `)} {`})}export function applySelectorScoping(e,t){if(!e||e.length===0||e.includes(`[data-${t}]`))return e;let n=e.split(/(\s*[>+~]\s*|\s+)/);if(n.length>1){let e=n[0].trim(),r=n.slice(1).join(``);return d(e,t)+r}return d(e,t)}function d(e,t){let n=e.match(/^([^:]+)(::.*)?$/);if(n){let[,e,r]=n;return`${e}[data-${t}]${r||``}`}let r=e.match(/^([^:]+)(:.*)?$/);if(r){let[,e,n]=r;return`${e}[data-${t}]${n||``}`}return`${e}[data-${t}]`}export function optimizeComponentCSS(e){try{let t=p(f(e)).join(`
17
- `);return process.env.NODE_ENV===`production`?minifyCSS(t):t}catch(t){return console.warn(`⚠️ Failed to optimize component CSS:`,t),e}}function f(e){let t=[],n=``,r=0,i=!1,a=``;for(let o=0;o<e.length;o++){let s=e[o],c=o>0?e[o-1]:``;if((s===`"`||s===`'`)&&c!==`\\`&&(i?s===a&&(i=!1,a=``):(i=!0,a=s)),!i){if(s===`{`)r++;else if(s===`}`&&(r--,r===0)){n+=s;let e=n.trim();e&&!h(e)&&t.push(e),n=``;continue}}n+=s}return n.trim()&&t.push(n.trim()),t}function p(e){let t=new Map,n=[];for(let r=0;r<e.length;r++){let i=e[r],a=m(i);if(a){let e=t.get(a);if(e)n[e.index]=i,t.set(a,{rule:i,index:e.index});else{let e=n.length;n.push(i),t.set(a,{rule:i,index:e})}}else n.push(i)}return n.filter(e=>e!==null)}function m(e){let t=e.match(/^([^{]+)\{([^}]+)\}/);if(!t)return null;let n=t[1].trim();return t[2].trim(),n}function h(e){let t=e.match(/^[^{]+\{([^}]*)\}/);if(!t)return!0;let n=t[1].trim();return n.length===0||n===`;`}export function minifyCSS(e){return e.replace(/\/\*[\s\S]*?\*\//g,``).replace(/\s+/g,` `).replace(/\s*{\s*/g,`{`).replace(/\s*}\s*/g,`}`).replace(/\s*;\s*/g,`;`).replace(/;\s*}/g,`}`).replace(/;}/g,`}`).trim()}export function generateComponentScopeId(e,t=`component`){return`${t}-${e.replace(/^\/+/,``).replace(/\.(svelte|tsx|jsx|vue|ts|js)$/,``).replace(/[^a-zA-Z0-9\/]/g,`-`).replace(/\/+/g,`-`).replace(/-+/g,`-`).replace(/^-|-$/g,``).toLowerCase()}-${simpleHash(e)}`}export function simpleHash(e){let t=0;for(let n=0;n<e.length;n++){let r=e.charCodeAt(n);t=(t<<5)-t+r,t&=t}return Math.abs(t).toString(36).substring(0,6)}
@@ -1 +0,0 @@
1
- export{ISLAND_FILE_EXTENSIONS,DEFAULT_DISCOVERY_CONFIG,isSupportedIslandExtension}from"./types.js";export{discoverIslandDirectories,discoverIslandsInDirectory,discoverAllIslands,isIslandsDirectory,getDefaultIslandsPath,hasDefaultIslandsDirectory,getQualifiedIslandName,parseQualifiedIslandName}from"./scanner.js";export{IslandRegistry,createIslandRegistry}from"./registry.js";export{IslandResolver,createIslandResolver}from"./resolver.js";export{IslandValidator,createIslandValidator,validateAllIslands,formatValidationError,formatValidationWarning,formatCircularDependency,formatValidationResult}from"./validator.js";export{IslandWatcher,createIslandWatcher}from"./watcher.js";
@@ -1 +0,0 @@
1
- import{discoverIslandDirectories as e,discoverIslandsInDirectory as t,getQualifiedIslandName as n,parseQualifiedIslandName as r}from"./scanner.js";export class IslandRegistry{_islands=new Map;_directories=[];_byName=new Map;_collisions=[];_projectRoot;_config;constructor(e,t={}){this._projectRoot=e,this._config=t}get islands(){return new Map(this._islands)}get directories(){return[...this._directories]}get collisions(){return[...this._collisions]}get size(){return this._islands.size}register(e){let t=n(e);this._islands.set(t,e);let r=this._byName.get(e.name)||[];r.push(e),this._byName.set(e.name,r)}resolve(e,t){if(t!==void 0){let n=t===``?e:`${t}/${e}`,r=this._islands.get(n);if(r)return r}if(e.includes(`/`)){let t=this._islands.get(e);if(t)return t;let{namespace:n,name:i}=r(e),a=n===``?i:`${n}/${i}`;return this._islands.get(a)||null}let n=this._byName.get(e);return!n||n.length===0?null:n.length===1?n[0]:n.find(e=>e.directory.isDefault)||n[0]}findByName(e){return this._byName.get(e)||[]}getQualifiedName(e){return n(e)}has(e){return this._islands.has(e)?!0:this._byName.has(e)}detectCollisions(){let e=[];for(let[t,n]of this._byName)if(n.length>1){let r=n.some(e=>e.directory.isDefault)?`priority`:`namespace`;e.push({name:t,islands:[...n],resolution:r})}return this._collisions=e,e}async rebuild(){this._islands.clear(),this._byName.clear(),this._directories=[],this._collisions=[],this._directories=await e(this._projectRoot,this._config);for(let e of this._directories){let n=await t(e,this._projectRoot);for(let e of n)this.register(e)}this.detectCollisions()}getAllIslands(){return Array.from(this._islands.values())}getIslandsInDirectory(e){return this.getAllIslands().filter(t=>t.directory.path===e.path)}getIslandsByNamespace(e){return this.getAllIslands().filter(t=>t.namespace===e)}unregister(e){let t=this._islands.get(e);if(!t)return!1;this._islands.delete(e);let r=this._byName.get(t.name);if(r){let i=r.filter(t=>n(t)!==e);i.length===0?this._byName.delete(t.name):this._byName.set(t.name,i)}return!0}toJSON(){return{islands:Object.fromEntries(this._islands),directories:this._directories,collisions:this._collisions}}}export async function createIslandRegistry(e,t={}){let n=new IslandRegistry(e,t);return await n.rebuild(),n}
@@ -1,2 +0,0 @@
1
- import{relative as e}from"node:path";import{parseQualifiedIslandName as t,getQualifiedIslandName as n}from"./scanner.js";const r={isDevelopment:!0,basePath:`/`,projectRoot:``,absolute:!1};export class IslandResolver{_registry;_projectRoot;constructor(e,t){this._registry=e,this._projectRoot=t}get registry(){return this._registry}get projectRoot(){return this._projectRoot}resolve(e){let t=this.normalizeReference(e),n=this.resolveExplicitPath(t);if(n)return n;if(t.includes(`/`)){let e=this.resolveQualifiedName(t);if(e)return e}return this.resolveByName(t)}normalizeReference(e){let t=e.trim().replace(/^\/+|\/+$/g,``);t=t.replace(/\\/g,`/`);for(let e of[/\.solid\.(tsx|jsx)$/,/\.react\.(tsx|jsx)$/,/\.lit\.(ts|js)$/,/\.preact\.(tsx|jsx)$/,/\.(tsx|ts|jsx|js|vue|svelte)$/])if(e.test(t)){t=t.replace(e,``);break}return t}resolveExplicitPath(e){if(!e.includes(`islands/`))return null;let t=this._registry.getAllIslands();for(let n of t){let t=n.relativePath.replace(/\.[^.]+$/,``),r=[/\.solid$/,/\.react$/,/\.lit$/,/\.preact$/],i=t;for(let e of r)i=i.replace(e,``);if(i===e||i.endsWith(`/`+e)||t===e||t.endsWith(`/`+e))return{island:n,importPath:this.generateImportPath(n),ambiguous:!1}}return null}resolveQualifiedName(e){let{namespace:n,name:r}=t(e),i=this._registry.resolve(r,n);if(!i)return null;let a=this._registry.findByName(r),o=a.length>1;return{island:i,importPath:this.generateImportPath(i),ambiguous:o,alternatives:o?a.filter(e=>e!==i):void 0}}resolveByName(e){let t=this._registry.findByName(e);if(t.length===0)return null;let n=[...t].sort((e,t)=>e.directory.isDefault&&!t.directory.isDefault?-1:!e.directory.isDefault&&t.directory.isDefault?1:e.namespace.localeCompare(t.namespace)),r=n[0],i=t.length>1;return{island:r,importPath:this.generateImportPath(r),ambiguous:i,alternatives:i?n.slice(1):void 0}}generateImportPath(t,n={}){let i={...r,...n},a=i.projectRoot||this._projectRoot;if(i.absolute)return t.filePath;if(i.isDevelopment){let n=e(a,t.filePath).replace(/\\/g,`/`);return`${i.basePath}${n}`}return`${i.basePath}${t.relativePath}`}generateQualifiedImportPath(e){return n(e)}getResolutionOrder(){return[`Island Resolution Order:`,`1. Explicit path-based references (e.g., 'src/modules/auth/islands/Counter')`,`2. Qualified name matches (e.g., 'modules/auth/Counter')`,`3. Default /src/islands/ directory (highest priority for unqualified names)`,`4. Nested directories in alphabetical order by namespace`,``,`Discovered directories (in priority order):`,...this._registry.directories.map((e,t)=>` ${t+1}. ${e.relativePath}${e.isDefault?` (default)`:``}`)]}isAmbiguous(e){return this.resolve(e)?.ambiguous??!1}getAllMatches(e){let n=this.normalizeReference(e);if(n.includes(`/`)&&!n.includes(`islands/`)){let{namespace:e,name:r}=t(n),i=this._registry.resolve(r,e);return i?[i]:[]}return this._registry.findByName(n)}suggestQualifiedNames(e){return this._registry.findByName(e).map(e=>n(e))}resolveOrThrow(e){let t=this.resolve(e);if(!t){let t=this.findSimilarNames(e),n=`Island not found: "${e}"`;throw t.length>0&&(n+=`\n\nDid you mean one of these?\n${t.map(e=>` - ${e}`).join(`
2
- `)}`),Error(n)}return t}findSimilarNames(e){let t=this._registry.getAllIslands(),r=e.toLowerCase();return t.filter(e=>{let t=e.name.toLowerCase(),i=n(e).toLowerCase();return t.includes(r)||r.includes(t)||i.includes(r)||this.levenshteinDistance(t,r)<=3}).map(e=>n(e)).slice(0,5)}levenshteinDistance(e,t){let n=[];for(let e=0;e<=t.length;e++)n[e]=[e];for(let t=0;t<=e.length;t++)n[0][t]=t;for(let r=1;r<=t.length;r++)for(let i=1;i<=e.length;i++)t.charAt(r-1)===e.charAt(i-1)?n[r][i]=n[r-1][i-1]:n[r][i]=Math.min(n[r-1][i-1]+1,n[r][i-1]+1,n[r-1][i]+1);return n[t.length][e.length]}}export function createIslandResolver(e,t){return new IslandResolver(e,t)}
@@ -1 +0,0 @@
1
- import{resolve as e,relative as t,dirname as n,basename as r,extname as i}from"node:path";import{stat as a,readdir as o}from"node:fs/promises";import{DEFAULT_DISCOVERY_CONFIG as s,isSupportedIslandExtension as c}from"./types.js";export async function discoverIslandDirectories(t,n={}){let r={...s,...n},i=e(t,r.rootDir),o=[];try{if(!(await a(i)).isDirectory())return o}catch{return o}return await u(i,t,r,o),o.sort((e,t)=>e.isDefault&&!t.isDefault?-1:!e.isDefault&&t.isDefault?1:e.relativePath.localeCompare(t.relativePath)),o}async function u(n,r,i,a){try{let s=await o(n,{withFileTypes:!0});for(let o of s){if(!o.isDirectory())continue;let s=e(n,o.name);if(!d(t(r,s),i.exclude)){if(o.name===`islands`){let e=f(s,r,i);a.push(e);continue}await u(s,r,i,a)}}}catch(e){(!(e instanceof Error)||e.code!==`EACCES`)&&console.warn(`Warning: Could not scan directory ${n}:`,e)}}function d(e,t){let n=e.replace(/\\/g,`/`);for(let e of t)if(n===e||n.startsWith(e+`/`)||n.includes(`/`+e+`/`)||n.endsWith(`/`+e))return!0;return!1}function f(r,i,a){let o=t(e(i,a.rootDir),r),s=o===`islands`,c=``;return s||(c=n(o).replace(/\\/g,`/`),a.namespaces[c]&&(c=a.namespaces[c])),{path:r,relativePath:o.replace(/\\/g,`/`),namespace:c,isDefault:s}}export function isIslandsDirectory(e){return r(e)===`islands`}export function getDefaultIslandsPath(t,n=`src`){return e(t,n,`islands`)}export async function hasDefaultIslandsDirectory(e,t=`src`){let n=getDefaultIslandsPath(e,t);try{return(await a(n)).isDirectory()}catch{return!1}}export async function discoverIslandsInDirectory(e,t){let n=[];try{let r=await o(e.path,{withFileTypes:!0});for(let a of r){if(!a.isFile()||!c(i(a.name)))continue;let r=p(a.name,e,t);n.push(r)}}catch(t){console.warn(`Warning: Could not scan islands directory ${e.path}:`,t)}return n.sort((e,t)=>e.name.localeCompare(t.name)),n}export async function discoverAllIslands(e,t={}){let n=await discoverIslandDirectories(e,t),r=[];for(let t of n){let n=await discoverIslandsInDirectory(t,e);r.push(...n)}return r}function p(n,r,a){let o=i(n),s=m(n),c=e(r.path,n),l=t(a,c).replace(/\\/g,`/`),u=h(n);return{name:s,filePath:c,relativePath:l,namespace:r.namespace,framework:u,extension:o,directory:r}}function m(e){let t=e;for(let e of[`.solid.tsx`,`.solid.jsx`,`.react.tsx`,`.react.jsx`,`.lit.ts`,`.lit.js`,`.preact.tsx`,`.preact.jsx`])if(t.endsWith(e))return t.slice(0,-e.length);for(let e of[`.tsx`,`.ts`,`.jsx`,`.js`,`.vue`,`.svelte`])if(t.endsWith(e))return t.slice(0,-e.length);return t}function h(e){let t=e.toLowerCase();if(t.includes(`.solid.`))return`solid`;if(t.includes(`.react.`))return`react`;if(t.includes(`.lit.`))return`lit`;if(t.includes(`.preact.`))return`preact`;if(t.includes(`.qwik.`))return`qwik`;if(e.endsWith(`.vue`))return`vue`;if(e.endsWith(`.svelte`))return`svelte`;if((e.endsWith(`.ts`)||e.endsWith(`.js`))&&!e.endsWith(`.d.ts`)){let t=m(e);if(/^[A-Z]/.test(t))return`lit`}return e.endsWith(`.tsx`)||e.endsWith(`.jsx`)?`preact`:`unknown`}export function getQualifiedIslandName(e){return e.namespace===``?e.name:`${e.namespace}/${e.name}`}export function parseQualifiedIslandName(e){let t=e.lastIndexOf(`/`);return t===-1?{namespace:``,name:e}:{namespace:e.slice(0,t),name:e.slice(t+1)}}
@@ -1 +0,0 @@
1
- export const ISLAND_FILE_EXTENSIONS=[`.tsx`,`.ts`,`.jsx`,`.js`,`.vue`,`.svelte`];export function isSupportedIslandExtension(e){return ISLAND_FILE_EXTENSIONS.includes(e)}export const DEFAULT_DISCOVERY_CONFIG={rootDir:`src`,include:[],exclude:[`node_modules`,`.git`,`dist`,`build`],namespaces:{},strictCollisions:!1};
@@ -1,18 +0,0 @@
1
- import{resolve as e,relative as t,basename as n,extname as r}from"node:path";import{readFile as i,stat as a,readdir as o}from"node:fs/promises";import{isSupportedIslandExtension as s}from"./types.js";const c={pascalCase:/^[A-Z][a-zA-Z0-9]*$/,validFileName:/^[a-zA-Z][a-zA-Z0-9._-]*$/,frameworkSuffixes:[`.solid`,`.react`,`.lit`,`.preact`]},l=`https://avalon.dev/docs/islands`;export class IslandValidator{_projectRoot;constructor(e){this._projectRoot=e}get projectRoot(){return this._projectRoot}extractComponentName(e){let t=n(e);for(let e of c.frameworkSuffixes)if(t.includes(e)){let n=t.indexOf(e);return t.slice(0,n)}let i=r(t);return t.slice(0,-i.length)}toPascalCase(e){return e.split(/[-_\s]+/).map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(``)}hasValidJsExport(e){let t=/export\s+default\s+/.test(e)||/export\s*\{\s*[^}]*\s+as\s+default\s*[,}]/.test(e),n=/export\s+(function|class|const)\s+[A-Z]/.test(e),r=/@customElement\s*\(/.test(e)||/customElements\.define\s*\(/.test(e);return t||n||r}isValidVueComponent(e){return/<template[\s>]/.test(e)||/<script[\s>]/.test(e)}isValidSvelteComponent(e){return e.trim().length>0}createExportError(e,t){let n=this.extractComponentName(e),r;switch(t){case`vue`:r=`Add a <template> or <script> section to your Vue component`;break;case`svelte`:r=`Add component markup to your Svelte file`;break;default:r=`Add a default export: export default function ${n}() { return <div>...</div>; }`}return{type:`invalid-export`,message:`Island component "${n}" does not export a valid component`,filePath:e,line:1,column:1,suggestion:`${r}\n\nSee: ${l}#component-exports`}}async validateExports(e){let t=[],n=[];try{let n=await i(e,`utf-8`),a=r(e).toLowerCase();a===`.vue`?this.isValidVueComponent(n)||t.push(this.createExportError(e,`vue`)):a===`.svelte`?this.isValidSvelteComponent(n)||t.push(this.createExportError(e,`svelte`)):this.hasValidJsExport(n)||t.push(this.createExportError(e,`js`))}catch{t.push({type:`invalid-export`,message:`Cannot read file: ${e}`,filePath:e,suggestion:`Check file permissions and encoding`})}return{valid:t.length===0,errors:t,warnings:n}}extractJsImports(e){let t=[],n=/import\s+(?:[\w\s{},*]+\s+from\s+)?['"]([^'"]+)['"]/g,r;for(;(r=n.exec(e))!==null;)t.push(r[1]);let i=/import\s*\(\s*['"]([^'"]+)['"]\s*\)/g;for(;(r=i.exec(e))!==null;)t.push(r[1]);let a=/require\s*\(\s*['"]([^'"]+)['"]\s*\)/g;for(;(r=a.exec(e))!==null;)t.push(r[1]);return t}extractImports(e,t){let n=[],i=r(t).toLowerCase();if(i===`.vue`||i===`.svelte`){let t=e.match(/<script[^>]*>([\s\S]*?)<\/script>/gi);if(t)for(let e of t)n.push(...this.extractJsImports(e))}else n.push(...this.extractJsImports(e));return n}resolveImportToIsland(t,i,a,o){if(!t.startsWith(`.`)&&!t.startsWith(`/`))return null;if(t.startsWith(`.`)){let n=e(e(i.filePath,`..`),t);if(!r(n)){for(let e of[`.tsx`,`.ts`,`.jsx`,`.js`,`.vue`,`.svelte`])if(o.has(n+e)){for(let t of a.values())if(t.filePath===n+e)return t}}if(o.has(n)){for(let e of a.values())if(e.filePath===n)return e}}let s=n(t).replace(/\.[^.]+$/,``);return a.get(s)||null}async buildImportGraph(e){let t=new Map,n=new Set(e.map(e=>e.filePath)),r=new Map;for(let t of e){r.set(t.name,t);let e=t.relativePath.replace(/\.[^.]+$/,``);r.set(e,t)}for(let a of e){let e=[];try{let t=await i(a.filePath,`utf-8`),o=this.extractImports(t,a.filePath);for(let t of o){let i=this.resolveImportToIsland(t,a,r,n);i&&e.push(i.filePath)}}catch{}t.set(a.filePath,e)}return t}cycleExists(e,t){let n=new Set(t);for(let r of e){if(r.length!==t.length-1)continue;let e=new Set(r),i=!0;for(let t of n)if(!e.has(t)){i=!1;break}if(i)return!0}return!1}findCycles(e){let t=[],n=new Set,r=new Set,i=[],a=o=>{n.add(o),r.add(o),i.push(o);let s=e.get(o)||[];for(let e of s)if(!n.has(e))a(e);else if(r.has(e)){let n=i.indexOf(e);if(n!==-1){let r=[...i.slice(n),e];this.cycleExists(t,r)||t.push(r)}}i.pop(),r.delete(o)};for(let t of e.keys())n.has(t)||a(t);return t}formatCycleDescription(e){return`Circular dependency detected:\n ${e.map(e=>t(this._projectRoot,e)).join(`
2
- → `)}`}async validateComponent(e){let t=[],n=[];try{if(!(await a(e)).isFile())return t.push({type:`invalid-export`,message:`Path is not a file: ${e}`,filePath:e}),{valid:!1,errors:t,warnings:n}}catch{return t.push({type:`invalid-export`,message:`File not found: ${e}`,filePath:e}),{valid:!1,errors:t,warnings:n}}let i=r(e);if(!s(i))return t.push({type:`invalid-export`,message:`Unsupported file extension: ${i}`,filePath:e,suggestion:`Use one of: .tsx, .ts, .jsx, .js, .vue, .svelte`}),{valid:!1,errors:t,warnings:n};let o=this.validateNamingConvention(this.extractComponentName(e),e);t.push(...o.errors),n.push(...o.warnings);let c=await this.validateExports(e);return t.push(...c.errors),n.push(...c.warnings),{valid:t.length===0,errors:t,warnings:n}}async validateDirectory(t){let n=[],i=[],a=!1;try{let c=await o(t.path,{withFileTypes:!0});for(let o of c){if(!o.isFile()||!s(r(o.name)))continue;a=!0;let c=e(t.path,o.name),l=await this.validateComponent(c);n.push(...l.errors),i.push(...l.warnings)}}catch{return n.push({type:`invalid-export`,message:`Cannot read directory: ${t.path}`,filePath:t.path,suggestion:`Check directory permissions`}),{valid:!1,errors:n,warnings:i}}return a||i.push({type:`empty-directory`,message:`Islands directory is empty: ${t.relativePath}`,filePath:t.path,suggestion:`Add island components or remove the empty directory`}),{valid:n.length===0,errors:n,warnings:i}}validateNamingConvention(e,t){let n=[],r=[];return c.pascalCase.test(e)||(e.length===0?n.push({type:`naming-convention`,message:`Invalid component name: empty name`,filePath:t,suggestion:`Use PascalCase naming (e.g., "Counter", "UserProfile")`}):/^[a-z]/.test(e)?r.push({type:`deprecated-pattern`,message:`Component name "${e}" should use PascalCase`,filePath:t,suggestion:`Rename to "${this.toPascalCase(e)}"`}):/[^a-zA-Z0-9]/.test(e)&&r.push({type:`deprecated-pattern`,message:`Component name "${e}" contains special characters`,filePath:t,suggestion:`Use only letters and numbers in component names`})),{valid:n.length===0,errors:n,warnings:r}}async detectCircularDependencies(e){let t=await this.buildImportGraph(e);return this.findCycles(t).map(e=>({cycle:e,description:this.formatCycleDescription(e)}))}}export function formatValidationError(e,n){let r=t(n,e.filePath),i=e.line?`${r}:${e.line}${e.column?`:${e.column}`:``}`:r,a=`Error: ${e.message}\n\n`;return a+=` File: ${i}\n`,e.suggestion&&(a+=`\n ${e.suggestion}\n`),a}export function formatValidationWarning(e,n){let r=`Warning: ${e.message}\n`;if(e.filePath){let i=t(n,e.filePath);r+=` File: ${i}\n`}return e.suggestion&&(r+=` Suggestion: ${e.suggestion}\n`),r}export function formatCircularDependency(e,n){let r=e.cycle.map(e=>t(n,e)),i=`Error: Circular dependency detected
3
-
4
- `;i+=` Dependency chain:
5
- `;for(let e=0;e<r.length;e++){let t=e===r.length-1;i+=`${t?` └─`:` ├─`} ${r[e]}\n`,t||(i+=` │ ↓
6
- `)}return i+=`
7
- Suggestion: Break the cycle by:
8
- `,i+=` - Moving shared code to a separate module
9
- `,i+=` - Using dynamic imports for one of the dependencies
10
- `,i+=` - Restructuring the component hierarchy
11
- `,i+=`\n See: ${l}#circular-dependencies\n`,i}export function formatValidationResult(e,t){let n=[];if(e.errors.length>0){n.push(`Found ${e.errors.length} error(s):\n`);for(let r of e.errors)n.push(formatValidationError(r,t))}if(e.warnings.length>0){n.length>0&&n.push(`
12
- `),n.push(`Found ${e.warnings.length} warning(s):\n`);for(let r of e.warnings)n.push(formatValidationWarning(r,t))}return e.valid&&e.warnings.length===0?n.push(`✓ Validation passed
13
- `):e.valid?n.push(`
14
- ✓ Validation passed with warnings
15
- `):n.push(`
16
- ✗ Validation failed
17
- `),n.join(`
18
- `)}export function createIslandValidator(e){return new IslandValidator(e)}export async function validateAllIslands(e,t){let n=createIslandValidator(t),r=[],i=[];for(let t of e){let e=await n.validateComponent(t.filePath);r.push(...e.errors),i.push(...e.warnings)}let a=await n.detectCircularDependencies(e);for(let e of a)r.push({type:`circular-dependency`,message:e.description,filePath:e.cycle[0]});return{valid:r.length===0,errors:r,warnings:i}}
@@ -1 +0,0 @@
1
- import{resolve as e,relative as t,extname as n,basename as r}from"node:path";import{watch as i}from"node:fs";import{isSupportedIslandExtension as a}from"./types.js";import{discoverIslandsInDirectory as o}from"./scanner.js";const s={debounceMs:100,emitInitial:!1};export class IslandWatcher{_projectRoot;_config;_options;_registry;_watchers=[];_callbacks=new Set;_isWatching=!1;_debounceTimers=new Map;constructor(e,t,n={},r={}){this._projectRoot=e,this._registry=t,this._config=n,this._options={...s,...r}}get isWatching(){return this._isWatching}get callbackCount(){return this._callbacks.size}async watch(e){return this._callbacks.add(e),this._isWatching||await this._startWatching(),()=>{this._callbacks.delete(e),this._callbacks.size===0&&this.stop()}}stop(){this._isWatching=!1;for(let e of this._watchers)try{e.close()}catch{}this._watchers=[];for(let e of this._debounceTimers.values())clearTimeout(e);this._debounceTimers.clear()}async _startWatching(){if(this._isWatching)return;this._isWatching=!0;let e=this._registry.directories;for(let t of e)try{this._watchDirectory(t)}catch(e){console.warn(`⚠️ Failed to watch island directory ${t.relativePath}:`,e)}}_watchDirectory(t){try{let r=i(t.path,{recursive:!1},(r,i)=>{if(!this._isWatching||!i)return;let o=e(t.path,i);if(!a(n(i)))return;let s=r;this._debounceEvent(o,s,t)});this._watchers.push(r)}catch(e){if(e instanceof Error&&e.code===`ENOENT`)console.warn(`⚠️ Island directory not found: ${t.relativePath}`);else throw e}}_debounceEvent(e,t,n){let r=this._debounceTimers.get(e);r&&clearTimeout(r);let i=setTimeout(()=>{this._debounceTimers.delete(e),this._handleFileChange(e,t,n)},this._options.debounceMs);this._debounceTimers.set(e,i)}async _handleFileChange(e,n,r){let i=t(this._projectRoot,e).replace(/\\/g,`/`),a;if(n===`change`)a=`change`;else try{let{stat:t}=await import(`node:fs/promises`);await t(e),a=`add`}catch{a=`remove`}let s=null;if(a===`remove`){let t=this._getQualifiedNameFromPath(e,r);s=this._registry.resolve(t)||null,s&&this._registry.unregister(t)}else try{s=(await o(r,this._projectRoot)).find(t=>t.filePath===e)||null,a===`add`&&s&&this._registry.register(s)}catch{s=null}let c={type:a,island:s,filePath:i,timestamp:Date.now()};this._emitEvent(c)}_getQualifiedNameFromPath(e,t){let n=r(e),i=this._extractComponentName(n);return t.namespace===``?i:`${t.namespace}/${i}`}_extractComponentName(e){for(let t of[`.solid.tsx`,`.solid.jsx`,`.react.tsx`,`.react.jsx`,`.lit.ts`,`.lit.js`,`.preact.tsx`,`.preact.jsx`])if(e.endsWith(t))return e.slice(0,-t.length);for(let t of[`.tsx`,`.ts`,`.jsx`,`.js`,`.vue`,`.svelte`])if(e.endsWith(t))return e.slice(0,-t.length);return e}_emitEvent(e){for(let t of this._callbacks)try{t(e)}catch(e){console.error(`Error in island change callback:`,e)}}async refresh(){if(!this._isWatching)return;for(let e of this._watchers)try{e.close()}catch{}this._watchers=[];let e=this._registry.directories;for(let t of e)try{this._watchDirectory(t)}catch(e){console.warn(`⚠️ Failed to watch island directory ${t.relativePath}:`,e)}}}export function createIslandWatcher(e,t,n={},r={}){return new IslandWatcher(e,t,n,r)}
@@ -1 +0,0 @@
1
- import{registry as e}from"../core/integrations/registry.js";import{createIslandRegistry as t}from"./discovery/index.js";import{getCachedPath as n,setCachedPath as r}from"./render-cache.js";import{stat as i,readFile as a}from"node:fs/promises";function o(e,t){let n=s(e);if(!n)return null;let r=t.resolve(n);if(r)return`/`+r.relativePath;if(e.includes(`/`)){let r=c(e);if(r){let e=t.resolve(n,r);if(e)return`/`+e.relativePath}}return null}function s(e){let t=e.split(`/`).filter(Boolean);if(t.length===0)return null;let n=t.at(-1);for(let e of[/\.solid\.(tsx|jsx)$/,/\.react\.(tsx|jsx)$/,/\.lit\.(ts|js)$/,/\.preact\.(tsx|jsx)$/])if(e.test(n)){n=n.replace(e,``);break}return n=n.replace(/\.(tsx|ts|jsx|js|vue|svelte)$/,``),n||null}function c(e){let t=new RegExp(/(?:\/src)?\/(.+?)\/islands\//).exec(e);return t?t[1]:``}async function l(e){try{return await i(e),!0}catch{return!1}}function u(e){if(e.includes(`/islands/`)&&!e.startsWith(`/src/`)){if(/^\/(?:modules\/)?[^/]+\/islands\//.test(e))return`/src`+e;if(e.startsWith(`/islands/`))return e.replace(`/islands/`,`/src/islands/`)}return e}async function d(t){let n=e.getAll(),r=[],i=t.replace(`.tsx`,``);for(let e of n){let t=e.config();for(let e of t.fileExtensions)e===`.tsx`||e===`.jsx`?r.push(`${i}.${t.name}${e}`):r.push(`${i}${e}`)}r.push(t);for(let e of r)if(await l(e.startsWith(`/`)?e.substring(1):e))return e;return null}export async function resolveIslandPath(e){let t=n(e);if(t!==null)return t;let i=u(e.replaceAll(`\\`,`/`)),a=f.__islandRegistry;if(a){let t=o(i,a);if(t)return r(e,t),t}if(i.endsWith(`.tsx`)&&!i.includes(`.solid.`)&&!i.includes(`.preact.`)){let t=await d(i);if(t)return r(e,t),t}return r(e,i),i}export function isNestedIslandPath(e){let t=e.replaceAll(`\\`,`/`);if(!t.includes(`/islands/`))return!1;for(let e of[/^\/islands\//,/^\/src\/islands\//,/^src\/islands\//,/^islands\//])if(e.test(t))return!1;return!0}const f=globalThis;export async function getOrCreateIslandRegistry(e=process.cwd()){return f.__islandRegistry??=await t(e),f.__islandRegistry}export function setIslandRegistry(e){f.__islandRegistry=e}export function clearIslandRegistry(){f.__islandRegistry=void 0}export function detectFrameworkFromSrc(t){let n=t.replaceAll(`\\`,`/`),r=e.getAll();for(let e of r){let t=e.config();if(n.includes(`.${t.name}.`))return t.name}for(let e of r){let t=e.config();for(let e of t.fileExtensions)if(n.endsWith(e))return t.name}return p(n)}function p(e){return e.endsWith(`.vue`)?`vue`:e.endsWith(`.svelte`)?`svelte`:e.includes(`.solid.`)||e.toLowerCase().includes(`solid`)?`solid`:e.includes(`.qwik.`)||e.toLowerCase().includes(`qwik`)?`qwik`:e.includes(`react`)||e.toLowerCase().includes(`react`)?`react`:`preact`}function m(e,t){for(let n of t){let t=n.config();for(let n of t.detectionPatterns.imports)if(n.test(e))return t.name;for(let n of t.detectionPatterns.content)if(n.test(e))return t.name}return null}function h(e){for(let t of[{pattern:/solid-js|@jsxImportSource solid-js/,framework:`solid`},{pattern:/@builder\.io\/qwik|@jsxImportSource @builder\.io\/qwik/,framework:`qwik`},{pattern:/vue|Vue/,framework:`vue`},{pattern:/svelte/,framework:`svelte`},{pattern:/react/,framework:`react`},{pattern:/preact/,framework:`preact`}])if(t.pattern.test(e))return t.framework;return`preact`}async function g(e){try{return await a((await resolveIslandPath(e)).replace(/^\//,``),`utf-8`)}catch{let t=f.__viteDevServer;if(t){let n=await resolveIslandPath(e),r=await t.ssrLoadModule(n);return JSON.stringify(r)}return null}}export async function detectFramework(t){let n=e.getAll();for(let e of n){let n=e.config();for(let e of n.fileExtensions)if(t.endsWith(e))return n.name;if(t.includes(`.${n.name}.`))return n.name}try{let e=await g(t);return e?m(e,n)||(n.length===0?h(e):`preact`):`unknown`}catch{return`unknown`}}
@@ -1 +0,0 @@
1
- import{registry as e}from"../core/integrations/registry.js";import{devWarn as t}from"../utils/dev-logger.js";const n=new Map;export async function loadIntegration(t){if(n.has(t))return n.get(t);if(e.has(t)){let r=e.get(t);return n.set(t,r),r}try{let r=await e.load(t);return n.set(t,r),r}catch(e){throw Error(`Integration '${t}' could not be loaded. Make sure @useavalon/${t} is installed.`,{cause:e})}}export async function detectAndLoadIntegration(e){return await loadIntegration(detectFrameworkFromPath(e))}export function detectFrameworkFromPath(e){let t=e.replaceAll(`\\`,`/`);return t.endsWith(`.vue`)?`vue`:t.endsWith(`.svelte`)?`svelte`:t.includes(`.solid.`)?`solid`:t.includes(`.qwik.`)?`qwik`:t.includes(`.react.`)?`react`:t.includes(`.lit.`)||(t.split(`/`).pop()||``).startsWith(`Lit`)&&(t.endsWith(`.ts`)||t.endsWith(`.js`))||isInIslandsDirectory(t)&&(t.endsWith(`.ts`)||t.endsWith(`.js`))?`lit`:(t.endsWith(`.tsx`)||t.endsWith(`.jsx`),`preact`)}export function isInIslandsDirectory(e){return e.replaceAll(`\\`,`/`).includes(`/islands/`)}export function isNestedIslandPath(e){let t=e.replaceAll(`\\`,`/`);if(!t.includes(`/islands/`))return!1;for(let e of[/^\/islands\//,/^\/src\/islands\//,/^src\/islands\//,/^islands\//])if(e.test(t))return!1;return!0}export function extractNamespaceFromPath(e){let t=e.replaceAll(`\\`,`/`),n=new RegExp(/(?:\/src)?\/(.+?)\/islands\//).exec(t);return n?n[1]:``}export function detectFrameworkFromContent(e,t){let n=detectFrameworkFromPath(e);return n===`vue`||n===`svelte`||n===`react`||n===`lit`?n:t.includes(`from 'react'`)||t.includes(`from "react"`)||t.includes(`from 'react-dom'`)||t.includes(`from "react-dom"`)||t.includes(`"use client"`)||t.includes(`'use client'`)||t.includes(`"use server"`)||t.includes(`'use server'`)?`react`:t.includes(`from 'lit'`)||t.includes(`from "lit"`)||t.includes(`@lit-labs/ssr`)||t.includes(`LitElement`)||t.includes(`@customElement`)?`lit`:t.includes(`solid-js`)||t.includes(`from 'solid-js'`)||t.includes(`from "solid-js"`)?`solid`:t.includes(`from 'preact'`)||t.includes(`from "preact"`)||t.includes(`preact/hooks`)?`preact`:t.includes(`extends LitElement`)||t.includes(`@property`)||t.includes(`@state`)||t.includes("html`")||t.includes("css`")?`lit`:t.includes(`createSignal`)||t.includes(`createEffect`)||t.includes(`createMemo`)?`solid`:t.includes(`useState`)||t.includes(`useEffect`)||t.includes(`useRef`)?`preact`:n}export async function getIntegration(e){try{return await loadIntegration(e)}catch(t){return console.error(`Failed to load integration for ${e}:`,t),null}}export async function hasIntegration(e){try{return await loadIntegration(e),!0}catch{return!1}}export function getLoadedIntegrations(){return Array.from(n.values())}export function getLoadedFrameworks(){return Array.from(n.keys())}export function clearIntegrationCache(){n.clear()}export function isIntegrationLoaded(e){return n.has(e)}export const DEFAULT_PRELOAD_FRAMEWORKS=[`preact`,`react`,`vue`,`svelte`,`solid`,`lit`];export async function preloadIntegrations(e){let n,i=!1,a;if(e?(n=e.frameworks??DEFAULT_PRELOAD_FRAMEWORKS,i=e.lazy??!1,a=e.detectedFrameworks):n=DEFAULT_PRELOAD_FRAMEWORKS,i&&a&&a.length>0){let e=n.filter(e=>a.includes(e));if(e.length===0)return;n=e}else if(i&&(!a||a.length===0))return;let o=await Promise.allSettled(n.map(e=>loadIntegration(e))),s=0,c=0;o.forEach((e,r)=>{e.status===`rejected`?(c++,t(`⚠️ Failed to preload integration '${n[r]}':`,e.reason)):s++})}export function detectFrameworksFromPageContent(e){let t=new Set,n=e.matchAll(/framework\s*=\s*["'](\w+)["']/g);for(let e of n)t.add(e[1]);let r=e.matchAll(/src\s*=\s*["']([^"']+)["']/g);for(let e of r){let n=e[1],r=detectFrameworkFromPath(n);t.add(r)}return(e.includes(`from 'react'`)||e.includes(`from "react"`))&&t.add(`react`),(e.includes(`from 'preact'`)||e.includes(`from "preact"`))&&t.add(`preact`),(e.includes(`from 'vue'`)||e.includes(`from "vue"`))&&t.add(`vue`),(e.includes(`from 'svelte'`)||e.includes(`from "svelte"`))&&t.add(`svelte`),(e.includes(`from 'solid-js'`)||e.includes(`from "solid-js"`))&&t.add(`solid`),(e.includes(`from 'lit'`)||e.includes(`from "lit"`))&&t.add(`lit`),Array.from(t)}
@@ -1 +0,0 @@
1
- import{h as e}from"preact";import{detectFramework as t}from"./framework-detection.js";import{analyzeComponentFile as n,renderComponentSSROnly as r}from"./component-analysis.js";import{loadIntegration as i,detectFrameworkFromPath as a}from"./integration-loader.js";import{addUniversalCSS as o}from"./universal-css-collector.js";import{addUniversalHead as s}from"./universal-head-collector.js";import{getIslandBundlePath as c}from"../build/island-manifest.js";import{isDev as l,devLog as u,devWarn as d,devError as f,logRenderTiming as p}from"../utils/dev-logger.js";function m(e){return`island-${e.replaceAll(/[^a-zA-Z0-9]/g,`-`)}`}function h(e){let t={};e.renderId&&(t[`data-solid-render-id`]=e.renderId);let n=e.metadata;return n?.tagName&&(t[`data-tag-name`]=n.tagName),t}function g(e,t,n,r){return{"data-condition":t,"data-src":c(e),"data-props":JSON.stringify(n),"data-render-strategy":`hydrate`,...h(r)}}function _(e){return e.startsWith(`<script`)?`script`:e.startsWith(`<style`)?`style`:e.startsWith(`<meta`)?`meta`:e.startsWith(`<link`)?`link`:e.includes(`window._$HY`)||e.includes(`_$HY=`)?`script`:`other`}function v(e){let t=e.match(/<style[^>]*>([\s\S]*?)<\/style>/i);return t?t[1].trim():null}function y(e,t,n,r){if(e.css&&o(e.css,t,n,e.scopeId),e.head){let i=e.head.trim(),a=_(i);if(a===`style`){let a=v(i);a&&(u(`${r} Extracting CSS from head <style> tag`),o(a,t,n,e.scopeId));return}s(e.head,t,n,a)}}function b(t){let{islandId:n,detectedFramework:r,shouldSkipHydration:i,src:a,condition:o,props:s,hydrationData:c,children:l}=t,d={id:n,"data-framework":r},f=i?{"data-render-strategy":`ssr-only`}:g(a,o,s,c);r===`lit`&&u(`🔍 [Island Component] ${a} - Lit hydration data:`,{hydrationDataKeys:Object.keys(c),metadata:c.metadata});let p={...d,...f};return typeof l==`string`?e(`avalon-island`,{...p,dangerouslySetInnerHTML:{__html:l}}):e(`avalon-island`,p,l)}function x(t,n,r,i,a,o,s){return r?e(`avalon-island`,{id:t,"data-render-strategy":`ssr-only`,"data-framework":n}):e(`avalon-island`,{id:t,"data-condition":a,"data-src":c(i),"data-props":JSON.stringify(o),"data-render-strategy":`hydrate`,"data-framework":n,...h(s)})}export default function S({src:e,condition:t=`on:client`,props:n={},children:r,ssr:i=t!==`on:client`,framework:o,ssrOnly:s=!1,renderOptions:c={},hydrationData:l={}}){let f=m(e),p=s||!!c.forceSSROnly,h=o||a(e),g=r!=null&&r!==``;return u(`🔍 [Island Component] ${e}`,{ssr:i,ssrOnly:s,hasChildren:g,framework:o,condition:t}),i&&g?b({islandId:f,detectedFramework:h,shouldSkipHydration:p,src:e,condition:t,props:n,hydrationData:l,children:r}):(i&&!g&&p&&d(`${e}: SSR-only component has no rendered content. This may indicate a rendering error.`),x(f,h,p,e,t,n,l))}function C(t,n){let r=n instanceof Error?n.message:String(n);return f(`🚨 Island SSR failed for ${t}:`,n),n instanceof Error&&n.stack&&f(`Stack trace:`,n.stack),e(`avalon-island`,{id:m(t),"data-src":c(t),"data-ssr-error":r,"data-render-strategy":`client-only`})}async function w({src:e,condition:t,props:n,children:r,ssr:a,framework:o,ssrOnly:s,renderOptions:c}){let u=`🏝️ [${e}]`;if(!a||r)return S({src:e,condition:t,props:n,children:r,ssr:a,framework:o,ssrOnly:s,renderOptions:c});let d;try{d=await i(o)}catch(r){return f(`${u} Failed to load ${o} integration:`,r),S({src:e,condition:t,props:n,ssr:!1,framework:o,ssrOnly:s,renderOptions:c})}try{let r=await d.render({component:null,props:n,src:e,condition:t,ssrOnly:s,viteServer:globalThis.__viteDevServer,isDev:l()});return y(r,e,o,u),S({src:e,condition:t,props:n,children:r.html,ssr:!0,framework:o,ssrOnly:s,renderOptions:c,hydrationData:s?void 0:r.hydrationData})}catch(r){return f(`${u} Fast path SSR failed:`,r),S({src:e,condition:t,props:n,ssr:!1,framework:o,ssrOnly:s,renderOptions:c})}}async function T(e,t,r,i){if(t||r.detectScripts===!1)return t;try{let t=await n(e,r);if(t.decision.warnings?.length)for(let e of t.decision.warnings)d(`${i} Analysis warning: ${e}`);return!t.decision.shouldHydrate}catch(e){return d(`${i} Component analysis failed:`,e),t}}async function E(e){return e.endsWith(`.vue`)?`vue`:e.endsWith(`.svelte`)?`svelte`:e.endsWith(`.tsx`)||e.endsWith(`.jsx`)||e.endsWith(`.ts`)||e.endsWith(`.js`)?t(e):`unknown`}async function D(e,t,n,r,i,a){let o=await E(e),s=o,c=await(await O(o,a)).render({component:null,props:n,src:e,condition:t,ssrOnly:r,viteServer:globalThis.__viteDevServer,isDev:l()});return y(c,e,o,a),S({src:e,condition:t,props:n,children:c.html,ssr:!0,framework:s,ssrOnly:r,renderOptions:i,hydrationData:r?void 0:c.hydrationData})}async function O(e,t){try{u(`${t} Loading integration for framework: ${e}`);let n=await i(e);return u(`${t} ✅ Integration loaded successfully`),n}catch(n){throw f(`${t} Failed to load ${e} integration:`,n),Error(`Failed to load integration for framework '${e}'. Make sure @useavalon/${e} is installed.\nInstall it with: deno add @useavalon/${e}`,{cause:n})}}export async function renderIsland({src:e,condition:t=`on:client`,props:n={},children:r,ssr:i=t!==`on:client`,framework:a,ssrOnly:o=!1,renderOptions:s={}}){let c=l()?performance.now():0,u=`🏝️ [${e}]`;try{return o&&!i&&(i=!0),a?await w({src:e,condition:t,props:n,children:r,ssr:i,framework:a,ssrOnly:o,renderOptions:s}):await k({src:e,condition:t,props:n,children:r,ssr:i,ssrOnly:o,renderOptions:s,logPrefix:u})}catch(t){return C(e,t)}finally{l()&&p(e,performance.now()-c)}}async function k(e){let{src:t,condition:n,props:r,children:i,ssr:a,ssrOnly:o,renderOptions:s,logPrefix:c}=e;if(u(`🔍 [renderIsland] ${t} - Starting render (slow path)`,{ssr:a,ssrOnly:o,hasChildren:!!i,condition:n}),await T(t,o,s,c))return A(t,n,r,i,a,s,c);if(!a||i)return S({src:t,condition:n,props:r,children:i,ssr:a,renderOptions:s});try{return await D(t,n,r,o,s,c)}catch(e){let i=await E(t);return f(`${c} Framework rendering failed:`,e),S({src:t,condition:n,props:r,ssr:!1,framework:i,renderOptions:s})}}function A(e,t,n,i,a,o,s){return a&&!i?r({src:e,condition:t,props:n,renderOptions:o}).catch(r=>(f(`${s} SSR failed for SSR-only component:`,r),S({src:e,condition:t,props:n,ssr:!1,ssrOnly:!0,renderOptions:o}))):S({src:e,condition:t,props:n,children:i,ssr:a,ssrOnly:!0,renderOptions:o})}
@@ -1 +0,0 @@
1
- const e={analysisTTL:6e4,pathTTL:6e4,frameworkTTL:6e4,maxEntries:1e3},t={analysisSize:0,pathsSize:0,frameworksSize:0,analysisHits:0,analysisMisses:0,pathHits:0,pathMisses:0,frameworkHits:0,frameworkMisses:0},n={analysis:new Map,paths:new Map,frameworks:new Map,config:{...e},stats:{...t}};function r(){try{return process.env.NODE_ENV!==`production`}catch{return!0}}function i(){try{return process.env.AVALON_VERBOSE===`1`}catch{return!1}}function a(e,t){return Date.now()-e>t}function o(e,t){if(e.size<=t)return;let n=Array.from(e.entries()).sort((e,t)=>e[1].timestamp-t[1].timestamp).slice(0,e.size-t);for(let[t]of n)e.delete(t)}export function getCachedAnalysis(e){let t=n.analysis.get(e);if(t){if(!a(t.timestamp,n.config.analysisTTL))return n.stats.analysisHits++,t.result;n.analysis.delete(e)}return n.stats.analysisMisses++,null}export function setCachedAnalysis(e,t){n.analysis.set(e,{result:t,timestamp:Date.now()}),n.stats.analysisSize=n.analysis.size,o(n.analysis,n.config.maxEntries)}export function getCachedPath(e){let t=n.paths.get(e);if(t){if(!a(t.timestamp,n.config.pathTTL))return n.stats.pathHits++,t.resolved;n.paths.delete(e)}return n.stats.pathMisses++,null}export function setCachedPath(e,t){n.paths.set(e,{resolved:t,timestamp:Date.now()}),n.stats.pathsSize=n.paths.size,o(n.paths,n.config.maxEntries)}export function getCachedFramework(e){let t=n.frameworks.get(e);if(t){if(!a(t.timestamp,n.config.frameworkTTL))return n.stats.frameworkHits++,t.framework;n.frameworks.delete(e)}return n.stats.frameworkMisses++,null}export function setCachedFramework(e,t){n.frameworks.set(e,{framework:t,timestamp:Date.now()}),n.stats.frameworksSize=n.frameworks.size,o(n.frameworks,n.config.maxEntries)}export function clearCache(){n.analysis.clear(),n.paths.clear(),n.frameworks.clear(),n.stats={...t}}export function invalidateCacheForPath(e){n.analysis.delete(e),n.paths.delete(e),n.frameworks.delete(e),n.stats.analysisSize=n.analysis.size,n.stats.pathsSize=n.paths.size,n.stats.frameworksSize=n.frameworks.size}export function configureCache(e){n.config={...n.config,...e}}export function getCacheConfig(){return{...n.config}}export function getCacheStats(){return{analysisSize:n.analysis.size,pathsSize:n.paths.size,frameworksSize:n.frameworks.size,analysisHits:n.stats.analysisHits,analysisMisses:n.stats.analysisMisses,pathHits:n.stats.pathHits,pathMisses:n.stats.pathMisses,frameworkHits:n.stats.frameworkHits,frameworkMisses:n.stats.frameworkMisses}}export function logCacheStats(){if(!r()||!i())return;let e=getCacheStats(),t=e.analysisHits+e.pathHits+e.frameworkHits,n=e.analysisMisses+e.pathMisses+e.frameworkMisses,a=t+n>0?(t/(t+n)*100).toFixed(1):`0.0`;console.log(`📊 Island Render Cache Stats:`),console.log(` Analysis: ${e.analysisSize} entries (${e.analysisHits} hits / ${e.analysisMisses} misses)`),console.log(` Paths: ${e.pathsSize} entries (${e.pathHits} hits / ${e.pathMisses} misses)`),console.log(` Frameworks: ${e.frameworksSize} entries (${e.frameworkHits} hits / ${e.frameworkMisses} misses)`),console.log(` Overall hit rate: ${a}%`)}export function _getCache(){return n}function s(e){return e.replace(/\\/g,`/`).replace(/^\//,``).replace(/\?.*$/,``).replace(/#.*$/,``)}function c(e,t){let n=s(e),r=s(t);if(n===r||n.endsWith(r)||r.endsWith(n))return!0;let i=n.split(`/`).pop(),a=r.split(`/`).pop();return!!(i&&a&&i===a)}export function invalidateCacheForFile(e){let t=0;for(let r of n.analysis.keys())c(e,r)&&(n.analysis.delete(r),t++,i()&&console.log(`🗑️ [Cache] Invalidated analysis cache for: ${r}`));for(let r of n.paths.keys())c(e,r)&&(n.paths.delete(r),t++,i()&&console.log(`🗑️ [Cache] Invalidated path cache for: ${r}`));for(let r of n.frameworks.keys())c(e,r)&&(n.frameworks.delete(r),t++,i()&&console.log(`🗑️ [Cache] Invalidated framework cache for: ${r}`));return n.stats.analysisSize=n.analysis.size,n.stats.pathsSize=n.paths.size,n.stats.frameworksSize=n.frameworks.size,t}export function isIslandComponentFile(e){let t=s(e);return t.includes(`/islands/`)||t.includes(`\\islands\\`)?!0:[`.tsx`,`.jsx`,`.vue`,`.svelte`,`.solid.tsx`,`.lit.ts`].some(e=>t.endsWith(e))}export function clearPathCacheOnStructureChange(){n.paths.clear(),n.stats.pathsSize=0,i()&&console.log(`🗑️ [Cache] Cleared path cache due to file structure change`)}export function clearIslandCache(){clearCache(),i()&&console.log(`🗑️ [Cache] Cleared all island render caches`)}
@@ -1 +0,0 @@
1
- export{};
@@ -1,5 +0,0 @@
1
- typeof globalThis<`u`&&!globalThis.__universalSSRCSS&&(globalThis.__universalSSRCSS=new Map);export function addUniversalCSS(e,t,n,r){if(!e||!e.trim())return;globalThis.__universalSSRCSS||(globalThis.__universalSSRCSS=new Map);let i=r||`${n}-${t}`,a={css:e.trim(),scopeId:i,src:t,framework:n,timestamp:Date.now()};globalThis.__universalSSRCSS.set(i,a)}export function getUniversalCSS(e=!1){if(!globalThis.__universalSSRCSS||globalThis.__universalSSRCSS.size===0)return``;let t=Array.from(globalThis.__universalSSRCSS.values());t.sort((e,t)=>e.timestamp-t.timestamp);let n=t.reduce((e,t)=>(e[t.framework]||(e[t.framework]=[]),e[t.framework].push(t),e),{}),r=[];for(let[e,t]of Object.entries(n)){let n=t.map(t=>`${`/* ${e}: ${t.src} (${t.scopeId}) */`}\n${t.css}`).join(`
2
-
3
- `);r.push(n)}let i=r.join(`
4
-
5
- `);return e&&globalThis.__universalSSRCSS.clear(),i}export function getUniversalCSSForHead(e=!1){let n=getUniversalCSS(e);return n.trim()?`<style data-universal-ssr="true" data-generated="${new Date().toISOString()}">\n${n}\n</style>`:``}export function clearUniversalCSS(){globalThis.__universalSSRCSS&&globalThis.__universalSSRCSS.clear()}export function getUniversalCSSStats(){if(!globalThis.__universalSSRCSS||globalThis.__universalSSRCSS.size===0)return{totalComponents:0,byFramework:{},totalCSSSize:0,averageCSSSize:0};let e=Array.from(globalThis.__universalSSRCSS.values()),t=e.reduce((e,t)=>(e[t.framework]=(e[t.framework]||0)+1,e),{}),n=e.reduce((e,t)=>e+t.css.length,0);return{totalComponents:e.length,byFramework:t,totalCSSSize:n,averageCSSSize:e.length>0?Math.round(n/e.length):0}}
@@ -1,2 +0,0 @@
1
- function e(){return globalThis.__universalSSRHead||(globalThis.__universalSSRHead=new Map),globalThis.__universalSSRHead}export function addUniversalHead(t,n,r,i=`other`){let a=e(),o=`${r}-${n}-${i}`;a.set(o,{content:t,src:n,framework:r,type:i})}export function getUniversalHeadForInjection(t=!1){let n=e();if(n.size===0)return``;let r=Array.from(n.values()),i=r.filter(e=>e.type===`script`),a=r.filter(e=>e.type===`meta`),o=r.filter(e=>e.type===`link`),s=r.filter(e=>e.type===`other`),c=[];a.length>0&&(c.push(`<!-- Framework Meta Tags -->`),c.push(...a.map(e=>e.content))),o.length>0&&(c.push(`<!-- Framework Links -->`),c.push(...o.map(e=>e.content))),i.length>0&&(c.push(`<!-- Framework Hydration Scripts -->`),c.push(...i.map(e=>{let t=e.content.trim();return t.startsWith(`<script`)?t:`<script>${t}<\/script>`}))),s.length>0&&(c.push(`<!-- Framework Head Content -->`),c.push(...s.map(e=>e.content)));let l=c.join(`
2
- `);return t&&n.clear(),l}export function clearUniversalHead(){e().clear()}export function getHeadCollectorSize(){return e().size}
@@ -1 +0,0 @@
1
- export{LayoutDiscovery}from"./core/layout/layout-discovery.js";export{LayoutDataLoader,LayoutDataLoadingError,loadSingleLayoutData,mergeLayoutData,getParentLayoutData,defaultLayoutDataLoader}from"./core/layout/layout-data-loader.js";export{LayoutMatcher as LayoutMatcherClass,BuiltInLayoutRules}from"./core/layout/layout-matcher.js";export{LayoutComposer}from"./core/layout/layout-composer.js";export{EnhancedLayoutResolver,createEnhancedLayoutResolver,EnhancedLayoutResolverUtils}from"./core/layout/enhanced-layout-resolver.js";export{IslandPersistence,defaultIslandPersistence}from"./core/islands/island-persistence.js";export{IslandStateSerializer}from"./core/islands/island-state-serializer.js";export{createPersistentIslandContext,usePersistentIslandContext,PersistentIslandProvider}from"./core/islands/persistent-island-context.js";export{PersistentIsland}from"./components/PersistentIsland.js";export{LayoutErrorBoundary}from"./components/LayoutErrorBoundary.js";export{LayoutDataErrorBoundary}from"./components/LayoutDataErrorBoundary.js";export{IslandErrorBoundary,withIslandErrorBoundary}from"./components/IslandErrorBoundary.js";export{StreamingErrorBoundary,withStreamingErrorBoundary}from"./components/StreamingErrorBoundary.js";export{StreamingLayout,StreamingSuspense,withStreaming,useStreamingState}from"./components/StreamingLayout.js";export{LayoutCacheManager}from"./core/layout/layout-cache-manager.js";export{LayoutContextSchema,LayoutDataSchema,LayoutRouteSchema,LayoutHandlerSchema,LayoutPropsSchema,LayoutDiscoveryOptionsSchema,RouteInfoSchema,LayoutRuleSchema,LayoutConfigSchema,IslandStateSchema,PersistentIslandPropsSchema,PersistentIslandContextSchema,LayoutErrorInfoSchema,LayoutErrorBoundaryPropsSchema,ErrorRecoveryStrategySchema,StreamingLayoutPropsSchema,StreamingComponentSchema,ResolvedLayoutSchema,LayoutCacheSchema,EnhancedLayoutContextSchema}from"./schemas/layout.js";export{EnhancedLayoutResolver as LayoutSystem}from"./core/layout/enhanced-layout-resolver.js";export{defaultIslandPersistence as defaultPersistence}from"./core/islands/island-persistence.js";export{createEnhancedLayoutResolver as createLayoutSystem}from"./core/layout/enhanced-layout-resolver.js";export const LAYOUT_SYSTEM_VERSION=`1.0.0`;export const LAYOUT_SYSTEM_FEATURES={DISCOVERY:!0,DATA_LOADING:!0,CONDITIONAL_RENDERING:!0,COMPOSITION_CONTROL:!0,PERSISTENT_ISLANDS:!0,ERROR_BOUNDARIES:!0,STREAMING:!0,CACHING:!0,PERFORMANCE_MONITORING:!0,DEBUG_UTILITIES:!0};export const LAYOUT_SYSTEM_DEFAULTS={DISCOVERY:{baseDirectory:`src/pages`,filePattern:`_layout.tsx`,excludeDirectories:[`node_modules`,`.git`,`dist`],enableWatching:!1,developmentMode:!1},CACHING:{enabled:!0,ttl:3e5,maxSize:100,cleanupInterval:6e4},STREAMING:{enabled:!0,priority:`medium`,timeout:5e3},ERROR_BOUNDARIES:{enabled:!0,maxRetries:3,fallbackStrategy:`component`},PERFORMANCE:{monitoring:!0,thresholds:{discoveryTime:100,dataLoadingTime:500,renderingTime:200,totalTime:1e3}}};
@@ -1 +0,0 @@
1
- import{join as e,relative as t,resolve as n}from"node:path";import{stat as r,readdir as i}from"node:fs/promises";const a={filePattern:`_middleware.ts`,excludeDirs:[`node_modules`,`.git`,`dist`,`.output`,`.vite`],devMode:!1},o={pages:50};export async function discoverScopedMiddleware(t){let{baseDir:r,filePattern:i=a.filePattern,excludeDirs:o=a.excludeDirs,devMode:s=a.devMode}=t,l=n(r),u=[];if(await c(e(l,`pages`),`pages`,i,o,u,s),u.sort((e,t)=>e.priority-t.priority),s&&u.length>0){console.log(`[middleware] Discovered ${u.length} route-scoped middleware:`);for(let e of u)console.log(` - ${e.type}: ${e.filePath} (priority: ${e.priority})`)}return u}async function c(e,t,n,i,a,o){try{if(!(await r(e).catch(()=>null))?.isDirectory())return;await l(e,e,t,n,i,a,o)}catch(t){o&&(!(t instanceof Error)||t.code!==`ENOENT`)&&console.warn(`[middleware] Error scanning ${e}: ${t instanceof Error?t.message:String(t)}`)}}async function l(n,r,a,o,s,c,d){try{let f=await i(r,{withFileTypes:!0});for(let i of f){let f=e(r,i.name);if(!(i.isDirectory()&&s.includes(i.name))){if(i.isDirectory())await l(n,f,a,o,s,c,d);else if(i.name===o){let e=u(f,t(n,r),a);c.push(e)}}}}catch(e){d&&(!(e instanceof Error)||e.code!==`ENOENT`)&&console.warn(`[middleware] Error reading ${r}: ${e instanceof Error?e.message:String(e)}`)}}function u(e,t,n){let r=t?`/${t}{/*}?`:`/*`,i=t?t.split(`/`).filter(Boolean).length:0,a=o[n]+i;return{pattern:new URLPattern({pathname:r}),filePath:e,priority:a,type:n}}export function getMatchingMiddleware(e,t){let n=t.pathname.startsWith(`/api`);return e.filter(e=>!(!e.pattern.test(t)||e.type===`pages`&&n))}export function clearDiscoveryCache(){}
@@ -1 +0,0 @@
1
- import{getMatchingMiddleware as e}from"./discovery.js";function t(e){let t=new Map;for(let n of Object.keys(e))t.set(n,e[n]);return t}function n(e,t){let n=[],r=[],i=[];for(let i of Object.keys(t))e.has(i)?e.get(i)!==t[i]&&r.push(i):n.push(i);for(let n of e.keys())n in t||i.push(n);return{added:n,modified:r,removed:i}}const r={devMode:!1,timeout:3e4},i=new Map;async function a(e,r,i,a){let o=await l(r.filePath,i);if(!o)return;let s=i?t(e.context):null,c=await u(()=>o(e),a,r.filePath);i&&s&&(n(s,e.context),r.filePath);let f=d(c,r.filePath,i);return f&&i&&console.log(`[middleware] Chain terminated by ${r.filePath}`),f}export async function executeScopedMiddleware(t,n,i={}){let{devMode:o,timeout:c}={...r,...i},l=e(n,s(t));if(l.length!==0)for(let e of l)try{let n=await a(t,e,o,c);if(n)return n}catch(t){throw o&&console.error(`[middleware] Error in ${e.filePath}:`,t),t}}function s(e){let t=`http://localhost`;return typeof e.url==`string`?new URL(e.url,t):e.req?.url?new URL(e.req.url,t):e.path?new URL(e.path,t):e.node?.req?.url?new URL(e.node.req.url,t):new URL(`/`,t)}export function toImportSpecifier(e){return/^[A-Za-z]:[\\/]/.test(e)?`file:///${e.replaceAll(`\\`,`/`)}`:e}async function l(e,t){if(!t&&i.has(e))return i.get(e);try{let n,r=globalThis.__viteDevServer;if(t&&r){let t=r.config.root||``,i=e.startsWith(t)?`/`+e.slice(t.length+1):e;n=await r.ssrLoadModule(i)}else n=await import(toImportSpecifier(e));return!n.default||typeof n.default!=`function`?(t&&console.warn(`[middleware] ${e} does not export a default function`),null):(t||i.set(e,n.default),n.default)}catch(n){return t&&console.error(`[middleware] Failed to load ${e}:`,n),null}}async function u(e,t,n){return Promise.race([Promise.resolve(e()),new Promise((e,r)=>{setTimeout(()=>{r(Error(`Middleware timeout after ${t}ms: ${n}`))},t)})])}function d(e,t,n){if(e!=null){if(e instanceof Response)return e;n&&console.warn(`[middleware] ${t} returned unexpected value: ${typeof e}. Expected void or Response.`)}}export function clearMiddlewareCache(){i.clear()}export function invalidateMiddleware(e){return i.delete(e)}export function getMiddlewareCacheSize(){return i.size}export function hasContextValue(e,t){return t in e.context}export function getContextValue(e,t){return e.context[t]}export function setContextValue(e,t,n,r=!1){let i=!(t in e.context);e.context[t]=n,r&&console.log(`[middleware] Context ${i?`set`:`updated`}: ${t}`)}
@@ -1 +0,0 @@
1
- export{discoverScopedMiddleware,getMatchingMiddleware,clearDiscoveryCache}from"./discovery.js";export{executeScopedMiddleware,clearMiddlewareCache,invalidateMiddleware,getMiddlewareCacheSize,hasContextValue,getContextValue,setContextValue}from"./executor.js";
@@ -1 +0,0 @@
1
- export{};
@@ -1 +0,0 @@
1
- import{DEFAULT_NITRO_CONFIG as e,VALID_V3_PRESETS as t}from"./config.js";export const DEFAULT_BUILD_CONFIG={mode:`both`,clientOutDir:`dist/client`,serverOutDir:`dist/server`,sourcemap:!0,minify:`oxc`,target:`es2020`,ssr:!0,preset:`node_server`,verbose:!1};export const PRESET_OUTPUT_CONFIGS={node_server:{outputDir:`.output`,serverEntry:`server/index.mjs`,supportsStreaming:!0,bundleDependencies:!1},node_middleware:{outputDir:`.output`,serverEntry:`server/index.mjs`,supportsStreaming:!0,bundleDependencies:!1},vercel:{outputDir:`.vercel/output`,serverEntry:`functions/render.func/index.mjs`,supportsStreaming:!0,bundleDependencies:!0,additionalFiles:[`config.json`]},cloudflare_module:{outputDir:`dist`,serverEntry:`server/index.mjs`,supportsStreaming:!1,bundleDependencies:!0},cloudflare_pages:{outputDir:`dist`,serverEntry:`_worker.js`,supportsStreaming:!1,bundleDependencies:!0,additionalFiles:[`_routes.json`]},deno_deploy:{outputDir:`.output`,serverEntry:`server/index.ts`,supportsStreaming:!0,bundleDependencies:!1},deno_server:{outputDir:`.output`,serverEntry:`server/index.ts`,supportsStreaming:!0,bundleDependencies:!1},netlify_functions:{outputDir:`.netlify`,serverEntry:`functions-internal/render.mjs`,supportsStreaming:!0,bundleDependencies:!0},netlify_edge:{outputDir:`.netlify/edge-functions`,serverEntry:`render.js`,supportsStreaming:!0,bundleDependencies:!0},aws_lambda:{outputDir:`.output`,serverEntry:`server/index.mjs`,supportsStreaming:!1,bundleDependencies:!0},azure_swa:{outputDir:`.output`,serverEntry:`server/index.mjs`,supportsStreaming:!1,bundleDependencies:!0},firebase_functions:{outputDir:`.output`,serverEntry:`server/index.mjs`,supportsStreaming:!0,bundleDependencies:!0},render_com:{outputDir:`.output`,serverEntry:`server/index.mjs`,supportsStreaming:!0,bundleDependencies:!1},static:{outputDir:`dist`,serverEntry:``,supportsStreaming:!1,bundleDependencies:!1},browser:{outputDir:`dist`,serverEntry:``,supportsStreaming:!1,bundleDependencies:!0}};export function createClientBuildConfig(e,t={}){let r={...DEFAULT_BUILD_CONFIG,...t};return{outDir:r.clientOutDir,emptyOutDir:!0,sourcemap:r.sourcemap,minify:r.minify,target:r.target,rolldownOptions:{output:{entryFileNames:`[name].[hash].js`,chunkFileNames:`chunks/[name].[hash].js`,assetFileNames:`assets/[name].[hash].[ext]`,codeSplitting:{groups:[{name:`vendor-react`,test:/node_modules\/(react|react-dom)/},{name:`vendor-vue`,test:/node_modules\/(vue|@vue)/},{name:`vendor-svelte`,test:/node_modules\/svelte/},{name:`vendor-preact`,test:/node_modules\/preact/},{name:`vendor-solid`,test:/node_modules\/solid-js/},{name:`vendor-lit`,test:/node_modules\/(lit|@lit)/},{name:`vendor`,test:/node_modules/},{name:`islands`,test:/\/islands\//}]}}},reportCompressedSize:!e.isDev,cssCodeSplit:!0}}export function createServerBuildConfig(t,i,a={}){let s={...DEFAULT_BUILD_CONFIG,...a},c=i.preset??e.preset,l=PRESET_OUTPUT_CONFIGS[c]??PRESET_OUTPUT_CONFIGS.node_server;return{outDir:s.serverOutDir,emptyOutDir:!0,sourcemap:s.sourcemap,minify:s.minify,target:s.target,ssr:!0,rolldownOptions:{input:{index:`./server/index.ts`},output:{format:`esm`,entryFileNames:`[name].mjs`,chunkFileNames:`chunks/[name].[hash].mjs`,preserveModules:!l.bundleDependencies},external:l.bundleDependencies?[]:o(c)}}}function o(e){let t=[/^node:/,/^deno:/];switch(e){case`deno_deploy`:case`deno_server`:return[...t];case`node_server`:return[...t,/^[a-z@]/i];default:return t}}export function getPresetOutputConfig(e){return PRESET_OUTPUT_CONFIGS[e]??PRESET_OUTPUT_CONFIGS.node_server}export function presetSupportsStreaming(e){return getPresetOutputConfig(e).supportsStreaming}export function createCombinedBuildConfig(t,n,r={}){let a=n.preset??e.preset,o=getPresetOutputConfig(a);return{build:{...createClientBuildConfig(t,r),outDir:o.outputDir},define:{__DEV__:!1,__PROD__:!0,"process.env.NODE_ENV":JSON.stringify(`production`),...u(a,o)}}}function u(e,t){let n={__NITRO_PRESET__:JSON.stringify(e),__SUPPORTS_STREAMING__:JSON.stringify(t.supportsStreaming)};if(t.env)for(let[e,r]of Object.entries(t.env))n[`process.env.${e}`]=JSON.stringify(r);return n}export function createNitroBuildPlugin(t,n){let r=n.preset??e.preset,i=getPresetOutputConfig(r);return{name:`avalon:nitro-build`,enforce:`post`,config(e,{command:r}){if(r===`build`)return createCombinedBuildConfig(t,n,{sourcemap:!0,verbose:t.verbose})},buildStart(){t.verbose&&(console.log(`🚀 Avalon Nitro build starting...`),console.log(` Preset: ${r}`),console.log(` Output: ${i.outputDir}`),console.log(` Streaming: ${i.supportsStreaming}`))},writeBundle(){t.verbose&&console.log(`✅ Avalon client build complete`)},closeBundle(){t.verbose&&(console.log(`📦 Avalon build finished`),console.log(` Output directory: ${i.outputDir}`))}}}export function validateBuildConfig(e){let n=[];return e.preset&&(t.includes(e.preset)||n.push(`Unknown preset: ${e.preset}. Valid presets: ${t.join(`, `)}`)),e.mode&&![`client`,`server`,`both`].includes(e.mode)&&n.push(`Invalid build mode: ${e.mode}. Must be 'client', 'server', or 'both'`),e.sourcemap!==void 0&&typeof e.sourcemap!=`boolean`&&![`inline`,`hidden`].includes(e.sourcemap)&&n.push(`Invalid sourcemap option: ${e.sourcemap}`),{valid:n.length===0,errors:n}}export const DEFAULT_SOURCEMAP_CONFIG={enabled:!0,type:!0,includeContent:!0};export function createSourceMapConfig(e,t){return t?{enabled:!0,type:!0,includeContent:!0}:e.includes(`edge`)||e.includes(`cloudflare`)||e.includes(`lambda`)?{enabled:!0,type:`hidden`,includeContent:!1}:{enabled:!0,type:!0,includeContent:!0}}export function getViteSourceMapOption(e){return e.enabled?e.type:!1}export function createSourceMapPlugin(e){return{name:`avalon:sourcemap`,enforce:`post`,config(t,{command:n}){if(n===`build`)return{build:{sourcemap:getViteSourceMapOption(e)},...e.sourceRoot&&{rolldownOptions:{output:{sourcemapPathTransform:t=>`${e.sourceRoot}/${t}`}}}}},generateBundle(t,n){if(!e.enabled)return;let r=Object.keys(n).filter(e=>e.endsWith(`.map`)).length;r>0&&globalThis.__avalonConfig?.verbose&&console.log(`📍 Generated ${r} source map(s)`)}}}
@@ -1 +0,0 @@
1
- export const DEFAULT_STATIC_ASSETS_CONFIG={publicDir:`public`,buildDir:`dist`,compression:!0,cacheControl:`public, max-age=31536000, immutable`,mutableCacheControl:`public, max-age=0, must-revalidate`,headers:{}};export const VALID_V3_PRESETS=[`node_server`,`node_middleware`,`vercel`,`cloudflare_module`,`cloudflare_pages`,`deno_deploy`,`deno_server`,`netlify_functions`,`netlify_edge`,`aws_lambda`,`azure_swa`,`firebase_functions`,`render_com`,`static`,`browser`];export function resolvePresetName(e){if(VALID_V3_PRESETS.includes(e))return e;throw Error(`Unknown Nitro preset: "${e}". Valid presets: ${VALID_V3_PRESETS.join(`, `)}`)}export const DEFAULT_NITRO_CONFIG={preset:`node_server`,serverDir:`server`,streaming:!0};export function createNitroConfig(t,i){let a=t.pagesDir??i.pagesDir,o=i.layoutsDir,s={streaming:t.streaming??DEFAULT_NITRO_CONFIG.streaming,pagesDir:a,layoutsDir:o};if(t.runtimeConfig&&`nitro`in t.runtimeConfig)throw Error(`The "nitro" key in runtimeConfig is reserved by Nitro v3 and cannot be used.`);let c={avalon:s,...t.runtimeConfig},l={...DEFAULT_STATIC_ASSETS_CONFIG,...t.staticAssets},u=mergeRouteRules(createDefaultStaticAssetRouteRules(l),t.routeRules??{}),d=[{dir:l.publicDir??DEFAULT_STATIC_ASSETS_CONFIG.publicDir,baseURL:`/`,maxAge:0}],f=t.renderer===!1?!1:t.renderer??{handler:`./server/renderer.ts`};return{preset:resolvePresetName(t.preset??DEFAULT_NITRO_CONFIG.preset),serverDir:t.serverDir??DEFAULT_NITRO_CONFIG.serverDir,routeRules:u,runtimeConfig:c,publicRuntimeConfig:t.publicRuntimeConfig,renderer:f,compatibilityDate:t.compatibilityDate,traceDeps:t.traceDeps,rolldownConfig:t.rolldownConfig,serverEntry:t.serverEntry,compressPublicAssets:t.compressPublicAssets,publicAssets:d,staticAssets:l}}export function createDefaultStaticAssetRouteRules(t){let n=t.cacheControl??DEFAULT_STATIC_ASSETS_CONFIG.cacheControl,r=t.mutableCacheControl??DEFAULT_STATIC_ASSETS_CONFIG.mutableCacheControl;return{"/assets/**":{headers:{"Cache-Control":n,...t.headers}},"/islands/**":{headers:{"Cache-Control":n,...t.headers}},"/chunks/**":{headers:{"Cache-Control":n,...t.headers}},"/_nuxt/**":{headers:{"Cache-Control":n,...t.headers}},"/**/*.woff":{headers:{"Cache-Control":n,...t.headers}},"/**/*.woff2":{headers:{"Cache-Control":n,...t.headers}},"/**/*.html":{headers:{"Cache-Control":r,...t.headers}},"/favicon.ico":{headers:{"Cache-Control":`public, max-age=86400`,...t.headers}},"/**/*.css":{headers:{"Cache-Control":r,...t.headers}}}}export function isValidPreset(e){return VALID_V3_PRESETS.includes(e)}export function mergeRouteRules(e,t){let n={...e};for(let[e,r]of Object.entries(t))n[e]?n[e]={...n[e],...r,headers:{...n[e].headers,...r.headers}}:n[e]=r;return n}
@@ -1,198 +0,0 @@
1
- import{isHttpError as e,createNotFoundError as t,createInternalError as n}from"./types.js";import{createRenderContext as r,getRequestURL as i}from"./renderer.js";let a={initialized:!1};export function clearErrorPageCache(){a={initialized:!1}}export async function discoverErrorPages(e){if(a.initialized&&!e.isDev)return a;let{loadPageModule:t,pagesDir:n=`src/pages`}=e;if(!t)return a.initialized=!0,a;try{a.notFound=await t(`${n}/404.tsx`)}catch{try{a.notFound=await t(`${n}/404.jsx`)}catch{a.notFound=null}}try{a.serverError=await t(`${n}/500.tsx`)}catch{try{a.serverError=await t(`${n}/500.jsx`)}catch{a.serverError=null}}try{a.genericError=await t(`${n}/_error.tsx`)}catch{try{a.genericError=await t(`${n}/_error.jsx`)}catch{a.genericError=null}}return a.initialized=!0,a}export function getErrorPageModule(e,t){return e===404&&t.notFound?t.notFound:e===500&&t.serverError?t.serverError:t.genericError?t.genericError:null}export function createErrorPageProps(t,n,r){let i={statusCode:e(t)?t.statusCode:500,message:t.message,url:n};return r&&(i.error=t,i.stack=t.stack),i}export async function renderErrorPage(e,t,n,r){if(typeof e.default!=`function`)return generateDefaultErrorPage(t.statusCode,t.message,r,t.stack);try{let n=e.metadata||{};return`<!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="utf-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1">
6
- <title>${u(String(n.title||`Error ${t.statusCode}`))}</title>
7
- ${n.description?`<meta name="description" content="${u(String(n.description))}">`:``}
8
- <style>
9
- body {
10
- font-family: system-ui, -apple-system, sans-serif;
11
- margin: 0;
12
- padding: 40px;
13
- display: flex;
14
- align-items: center;
15
- justify-content: center;
16
- min-height: 100vh;
17
- box-sizing: border-box;
18
- background: #f5f5f5;
19
- }
20
- .error-page {
21
- text-align: center;
22
- max-width: 600px;
23
- }
24
- h1 {
25
- font-size: 48px;
26
- margin: 0 0 20px 0;
27
- color: #333;
28
- }
29
- p {
30
- color: #666;
31
- margin: 0 0 20px 0;
32
- }
33
- a {
34
- color: #0066cc;
35
- text-decoration: none;
36
- }
37
- a:hover {
38
- text-decoration: underline;
39
- }
40
- details {
41
- margin-top: 20px;
42
- text-align: left;
43
- }
44
- pre {
45
- background: #1a1a1a;
46
- color: #e0e0e0;
47
- padding: 15px;
48
- border-radius: 4px;
49
- overflow-x: auto;
50
- font-size: 12px;
51
- }
52
- </style>
53
- </head>
54
- <body>
55
- <div id="app" data-error-page="true" data-status-code="${t.statusCode}" data-props='${u(JSON.stringify(t))}'>
56
- <!-- Custom error page content rendered by Avalon SSR pipeline -->
57
- <div class="error-page">
58
- <h1>${t.statusCode}</h1>
59
- <p>${u(t.message)}</p>
60
- ${r&&t.stack?`
61
- <details>
62
- <summary>Error details</summary>
63
- <pre>${u(t.stack)}</pre>
64
- </details>
65
- `:``}
66
- <a href="/">Go back home</a>
67
- </div>
68
- </div>
69
- </body>
70
- </html>`}catch(e){return console.error(`[Error Page Render Error]`,e),generateDefaultErrorPage(t.statusCode,t.message,r,t.stack)}}export function generateDefaultErrorPage(e,t,n,r){return n?s(e,t,r):c(e,t)}function s(e,t,n){return`<!DOCTYPE html>
71
- <html lang="en">
72
- <head>
73
- <meta charset="utf-8">
74
- <meta name="viewport" content="width=device-width, initial-scale=1">
75
- <title>Error ${e}</title>
76
- <style>
77
- body {
78
- font-family: system-ui, -apple-system, sans-serif;
79
- margin: 0;
80
- padding: 40px;
81
- background: #1a1a1a;
82
- color: #fff;
83
- }
84
- .error-container {
85
- max-width: 800px;
86
- margin: 0 auto;
87
- background: #2d2d2d;
88
- padding: 40px;
89
- border-radius: 8px;
90
- border-left: 4px solid #ff6b6b;
91
- }
92
- h1 {
93
- color: #ff6b6b;
94
- margin-top: 0;
95
- font-size: 24px;
96
- }
97
- .status-code {
98
- font-size: 48px;
99
- font-weight: bold;
100
- color: #ff6b6b;
101
- margin-bottom: 10px;
102
- }
103
- .message {
104
- font-size: 18px;
105
- color: #ccc;
106
- margin-bottom: 20px;
107
- }
108
- pre {
109
- background: #1a1a1a;
110
- padding: 20px;
111
- border-radius: 4px;
112
- overflow-x: auto;
113
- font-size: 14px;
114
- line-height: 1.5;
115
- color: #e0e0e0;
116
- }
117
- .stack-title {
118
- color: #888;
119
- font-size: 12px;
120
- text-transform: uppercase;
121
- margin-bottom: 10px;
122
- }
123
- a {
124
- color: #6b9fff;
125
- text-decoration: none;
126
- }
127
- a:hover {
128
- text-decoration: underline;
129
- }
130
- </style>
131
- </head>
132
- <body>
133
- <div class="error-container">
134
- <div class="status-code">${e}</div>
135
- <h1>${l(e)}</h1>
136
- <p class="message">${u(t)}</p>
137
- ${n?`
138
- <div class="stack-title">Stack Trace</div>
139
- <pre>${u(n)}</pre>
140
- `:``}
141
- <p><a href="/">← Return to home</a></p>
142
- </div>
143
- </body>
144
- </html>`}function c(e,t){let n=e>=500?`An unexpected error occurred. Please try again later.`:t;return`<!DOCTYPE html>
145
- <html lang="en">
146
- <head>
147
- <meta charset="utf-8">
148
- <meta name="viewport" content="width=device-width, initial-scale=1">
149
- <title>Error ${e}</title>
150
- <style>
151
- body {
152
- font-family: system-ui, -apple-system, sans-serif;
153
- margin: 0;
154
- padding: 40px;
155
- background: #f5f5f5;
156
- display: flex;
157
- align-items: center;
158
- justify-content: center;
159
- min-height: 100vh;
160
- box-sizing: border-box;
161
- }
162
- .error-container {
163
- text-align: center;
164
- max-width: 400px;
165
- }
166
- .status-code {
167
- font-size: 72px;
168
- font-weight: bold;
169
- color: #333;
170
- margin-bottom: 10px;
171
- }
172
- h1 {
173
- color: #666;
174
- font-size: 24px;
175
- margin: 0 0 20px 0;
176
- }
177
- p {
178
- color: #888;
179
- margin: 0 0 20px 0;
180
- }
181
- a {
182
- color: #0066cc;
183
- text-decoration: none;
184
- }
185
- a:hover {
186
- text-decoration: underline;
187
- }
188
- </style>
189
- </head>
190
- <body>
191
- <div class="error-container">
192
- <div class="status-code">${e}</div>
193
- <h1>${l(e)}</h1>
194
- <p>${u(n)}</p>
195
- <p><a href="/">Return to home</a></p>
196
- </div>
197
- </body>
198
- </html>`}function l(e){return{400:`Bad Request`,401:`Unauthorized`,403:`Forbidden`,404:`Page Not Found`,405:`Method Not Allowed`,408:`Request Timeout`,410:`Gone`,429:`Too Many Requests`,500:`Internal Server Error`,502:`Bad Gateway`,503:`Service Unavailable`,504:`Gateway Timeout`}[e]||`Error`}function u(e){return e.replaceAll(`&`,`&amp;`).replaceAll(`<`,`&lt;`).replaceAll(`>`,`&gt;`).replaceAll(`"`,`&quot;`).replaceAll(`'`,`&#039;`)}export async function handleRenderError(t,n,a){let{isDev:o=!1}=a,s=e(t)?t.statusCode:500,c=i(n);console.error(`[Render Error] ${s} - ${t.message}`,{url:c.pathname,stack:o?t.stack:void 0});let l=getErrorPageModule(s,await discoverErrorPages(a)),u;return u=l?await renderErrorPage(l,createErrorPageProps(t,c.pathname,o),r(n,{}),o):generateDefaultErrorPage(s,t.message,o,o?t.stack:void 0),new Response(u,{status:s,headers:{"Content-Type":`text/html; charset=utf-8`}})}export function handleApiError(t,n){let{isDev:r=!1}=n,i=e(t)?t.statusCode:500;console.error(`[API Error] ${i} - ${t.message}`,{stack:r?t.stack:void 0});let a=r?{error:t.message,statusCode:i,stack:t.stack}:{error:i>=500?`Internal Server Error`:t.message,statusCode:i};return new Response(JSON.stringify(a),{status:i,headers:{"Content-Type":`application/json`}})}export async function handleNotFound(e,n,r){return handleRenderError(t(`Page not found: ${e}`),n,r)}export async function handleInternalError(e,t,r){let i=n(e.message);return i.stack=e.stack,handleRenderError(i,t,r)}
@@ -1 +0,0 @@
1
- export{createNitroConfig,isValidPreset,mergeRouteRules,createDefaultStaticAssetRouteRules,DEFAULT_NITRO_CONFIG,DEFAULT_STATIC_ASSETS_CONFIG}from"./config.js";export{HttpError,isHttpError,createNotFoundError,createMethodNotAllowedError,createInternalError}from"./types.js";export{createNitroRenderer,createNitroCatchAllRenderer,createRenderContext,renderPage,renderPageStream,createStreamingResponse,injectHydrationScript,validateHydrationMarkers,extractIslandMarkers,ensureHydrationMarkers,processHydrationRequirements,createErrorResponse,getRequestURL as getRendererRequestURL,toRequest as rendererToRequest,setResponseHeader}from"./renderer.js";export{createMiddlewareContext,storeMiddlewareContext,getMiddlewareContext,getOrCreateMiddlewareContext,setMiddlewareState,getMiddlewareState,setMiddlewareLocal,getMiddlewareLocal,hasAvalonContext,ensureAvalonContext,getRequestURL as getMiddlewareRequestURL,getRequestHeaders as getMiddlewareRequestHeaders,toRequest as middlewareToRequest,getRouterParams as getMiddlewareRouterParams}from"./middleware-adapter.js";export{discoverPageRoutes,filePathToPattern,isPrivateFile,calculateRouteSpecificity,sortRoutesBySpecificity,validateRoutePattern,extractParamsFromPattern,matchRoutePattern,PAGE_EXTENSIONS}from"./route-discovery.js";export{createClientBuildConfig,createServerBuildConfig,createCombinedBuildConfig,createNitroBuildPlugin,getPresetOutputConfig,presetSupportsStreaming,validateBuildConfig,createSourceMapConfig,createSourceMapPlugin,getViteSourceMapOption,DEFAULT_BUILD_CONFIG,DEFAULT_SOURCEMAP_CONFIG,PRESET_OUTPUT_CONFIGS}from"./build-config.js";export{createIslandManifestPlugin,createIslandEntry,detectIslandFramework,generateContentHash,extractIslandDependencies,generatePreloadHints,generatePreloadTags,loadIslandManifest,getIslandAssetPath,getPageCssAssets,DEFAULT_MANIFEST_OPTIONS}from"./island-manifest.js";export{discoverErrorPages,getErrorPageModule,renderErrorPage,generateDefaultErrorPage,createErrorPageProps,clearErrorPageCache,handleRenderError,handleApiError,handleNotFound,handleInternalError}from"./error-handler.js";
@@ -1,2 +0,0 @@
1
- import{readFile as e}from"node:fs/promises";export const DEFAULT_MANIFEST_OPTIONS={outputPath:`dist/island-manifest.json`,includeSourceMaps:!1,generatePreloadHints:!0,verbose:!1};const n={react:[/from\s+['"]react['"]/,/from\s+['"]react-dom['"]/,/@jsxImportSource\s+react/],preact:[/from\s+['"]preact['"]/,/from\s+['"]preact\/hooks['"]/,/@jsxImportSource\s+preact/],vue:[/from\s+['"]vue['"]/,/\.vue$/],svelte:[/from\s+['"]svelte['"]/,/\.svelte$/],solid:[/from\s+['"]solid-js['"]/,/\.solid\.(tsx|jsx)$/],lit:[/from\s+['"]lit['"]/,/from\s+['"]@lit['"]/,/\.lit\.(ts|js)$/]};export function detectIslandFramework(e,t){if(e.endsWith(`.vue`))return`vue`;if(e.endsWith(`.svelte`))return`svelte`;if(e.includes(`.solid.`))return`solid`;if(e.includes(`.lit.`))return`lit`;for(let[r,i]of Object.entries(n))for(let n of i)if(n.test(t)||n.test(e))return r;return e.endsWith(`.tsx`)||e.endsWith(`.jsx`)?`preact`:`unknown`}export async function generateContentHash(e){let t=new TextEncoder().encode(e),n=await crypto.subtle.digest(`SHA-256`,t);return Array.from(new Uint8Array(n)).map(e=>e.toString(16).padStart(2,`0`)).join(``).slice(0,8)}export function extractIslandDependencies(e){let t=[],n=/import\s+.*?\s+from\s+['"]([^'"]+)['"]/g,r=/import\s*\(\s*['"]([^'"]+)['"]\s*\)/g,i;for(;(i=n.exec(e))!==null;){let e=i[1];!e.startsWith(`.`)&&!e.startsWith(`/`)&&t.push(e)}for(;(i=r.exec(e))!==null;){let e=i[1];!e.startsWith(`.`)&&!e.startsWith(`/`)&&t.push(e)}return[...new Set(t)]}export async function createIslandEntry(e,t,n,o){let s=detectIslandFramework(t,n),c=await generateContentHash(n);return{src:o,framework:s,css:[],preload:extractIslandDependencies(n).filter(e=>!e.includes(`/`)),sourcePath:t,chunkName:e,contentHash:c,preloadDeps:[],usesStreaming:!1}}export function generatePreloadHints(e){let t=[];e.clientEntry&&t.push({href:e.clientEntry,as:`script`,type:`text/javascript`});for(let n of e.css??[])t.push({href:n,as:`style`,type:`text/css`});for(let n of Object.values(e.frameworkBundles??{}))t.push({href:n,as:`script`,type:`text/javascript`});return t}export function createIslandManifestPlugin(e,n={}){let r={...DEFAULT_MANIFEST_OPTIONS,...n},a=new Map,o=new Set,c=``;return{name:`avalon:island-manifest`,enforce:`post`,generateBundle(e,t){for(let[e,n]of Object.entries(t))if(e.endsWith(`.css`)&&o.add(`/${e}`),n.type===`chunk`&&(n.name===`client`||n.name===`main`)&&(c=`/${e}`),n.type===`chunk`&&(n.facadeModuleId?.includes(`/islands/`)||n.name?.startsWith(`islands/`))){let t=n.name?.replace(`islands/`,``)??e,r=a.get(t);r?r.src=`/${e}`:a.set(t,{src:`/${e}`,framework:u(n),css:[],preload:[],sourcePath:n.facadeModuleId??``,chunkName:t,contentHash:/\.([a-f0-9]+)\.js$/.exec(e)?.[1]??``,preloadDeps:n.imports??[],usesStreaming:!1})}},async writeBundle(e,t){let n={},u=new Date().toISOString();for(let[e,r]of Object.entries(t)){let t=await l(e,r,u);t&&(n[`/${e}`]=t)}let d={islands:Object.fromEntries(a),clientEntry:c,css:Array.from(o),buildTime:Date.now(),buildHash:await generateContentHash(JSON.stringify(Object.fromEntries(a))),avalonVersion:`1.0.0`,cssAssets:Array.from(o),preloadHints:r.generatePreloadHints?generatePreloadHints({clientEntry:c,css:Array.from(o),islands:Object.fromEntries(a)}):[],frameworkBundles:{},assetMetadata:n},f=JSON.stringify(d,null,2);r.verbose&&(console.log(`📋 Island manifest generated:`),console.log(` Islands: ${a.size}`),console.log(` CSS assets: ${o.size}`),console.log(` Client entry: ${c}`),console.log(` Asset metadata entries: ${Object.keys(n).length}`)),this.emitFile({type:`asset`,fileName:`island-manifest.json`,source:f})}}}async function l(e,t,n){let r;if(t.type===`asset`&&t.source?r=t.source:t.type===`chunk`&&t.code&&(r=t.code),!r)return null;let a=typeof r==`string`?new TextEncoder().encode(r).length:r.length,o=await generateContentHash(typeof r==`string`?r:new TextDecoder().decode(r)),s=e.substring(e.lastIndexOf(`.`));return{type:{".js":`application/javascript`,".mjs":`application/javascript`,".css":`text/css`,".json":`application/json`,".html":`text/html`,".map":`application/json`}[s]??`application/octet-stream`,etag:`"${o}"`,mtime:n,size:a}}function u(e){return detectIslandFramework(e.facadeModuleId??``,e.code??``)}export async function loadIslandManifest(t=`dist/island-manifest.json`){try{let n=await e(t,`utf-8`);return JSON.parse(n)}catch{return null}}export function getIslandAssetPath(e,t){return t?t.islands[e]?.src??null:null}export function getPageCssAssets(e,t){if(!t)return[];let n=new Set;for(let e of t.css)n.add(e);for(let r of e){let e=t.islands[r];if(e?.css)for(let t of e.css)n.add(t)}return Array.from(n)}export function generatePreloadTags(e){let t=[];for(let n of e.preloadHints){let e=[`rel="preload"`,`href="${n.href}"`,`as="${n.as}"`];n.type&&e.push(`type="${n.type}"`),n.crossorigin&&e.push(`crossorigin="${n.crossorigin}"`),t.push(`<link ${e.join(` `)}>`)}return t.join(`
2
- `)}
@@ -1 +0,0 @@
1
- import{getRequestURL as e}from"h3";export function getRequestURL(t){return new URL(e(t).pathname,`http://localhost`)}export function getRequestHeaders(e){return new Headers(e.req.headers)}export function toRequest(e){let r=getRequestURL(e),i=e.req.method.toUpperCase();return new Request(r,{method:i,headers:getRequestHeaders(e)})}export function getRouterParams(e){return e.context.params??{}}export function createMiddlewareContext(n,a={}){let{enableLogging:o=!1}=a,s=getRequestURL(n),c=getRouterParams(n),l={};for(let[e,t]of s.searchParams.entries())l[e]?Array.isArray(l[e])?l[e].push(t):l[e]=[l[e],t]:l[e]=t;return o&&console.log(`[Middleware Context] Created for ${n.req.method} ${e(n).pathname}`),{request:toRequest(n),url:s,params:c,query:l,state:new Map,locals:{}}}export function storeMiddlewareContext(e,t){e.context.avalon||(e.context.avalon={}),e.context.avalon.middlewareContext=t}export function getMiddlewareContext(e){return e.context.avalon?.middlewareContext}export function getOrCreateMiddlewareContext(e,t={}){let n=getMiddlewareContext(e);if(n)return n;let r=createMiddlewareContext(e,t);return storeMiddlewareContext(e,r),r}export function setMiddlewareState(e,t,n){getOrCreateMiddlewareContext(e).state.set(t,n)}export function getMiddlewareState(e,t){return getMiddlewareContext(e)?.state.get(t)}export function setMiddlewareLocal(e,t,n){let r=getOrCreateMiddlewareContext(e);r.locals[t]=n}export function getMiddlewareLocal(e,t){return getMiddlewareContext(e)?.locals[t]}export function hasAvalonContext(e){return e.context.avalon!==void 0}export function ensureAvalonContext(e){return e.context.avalon||(e.context.avalon={}),e.context.avalon}