@useavalon/avalon 0.1.88 → 0.1.90

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 (113) hide show
  1. package/dist/src/build/integration-bundler-plugin.d.ts +1 -1
  2. package/dist/src/build/integration-detection-plugin.d.ts +1 -1
  3. package/dist/src/build/integration-detection-plugin.js +1 -1
  4. package/dist/src/build/integration-resolver-plugin.d.ts +1 -1
  5. package/dist/src/build/island-code-splitting.d.ts +1 -1
  6. package/dist/src/build/island-manifest.d.ts +2 -2
  7. package/dist/src/build/island-manifest.js +1 -1
  8. package/dist/src/build/island-types-generator.js +4 -4
  9. package/dist/src/build/mdx-island-transform.js +1 -1
  10. package/dist/src/build/mdx-plugin.d.ts +2 -2
  11. package/dist/src/build/prop-extractors/index.d.ts +3 -3
  12. package/dist/src/build/prop-extractors/index.js +1 -1
  13. package/dist/src/build/prop-extractors/lit.js +1 -1
  14. package/dist/src/build/prop-extractors/svelte.js +1 -1
  15. package/dist/src/build/sidecar-file-manager.js +1 -1
  16. package/dist/src/client/adapters/index.d.ts +1 -1
  17. package/dist/src/client/adapters/index.js +1 -1
  18. package/dist/src/client/css-hmr-handler.d.ts +2 -2
  19. package/dist/src/client/framework-adapter.d.ts +2 -2
  20. package/dist/src/client/hmr-coordinator.d.ts +6 -6
  21. package/dist/src/client/main.js +1 -1
  22. package/dist/src/client/types/framework-runtime.d.ts +54 -55
  23. package/dist/src/client/types/vite-hmr.d.ts +35 -35
  24. package/dist/src/client/types/vite-virtual-modules.d.ts +56 -28
  25. package/dist/src/core/components/component-analyzer.d.ts +3 -3
  26. package/dist/src/core/components/component-analyzer.js +1 -1
  27. package/dist/src/core/components/component-detection.d.ts +8 -8
  28. package/dist/src/core/components/component-detection.js +1 -1
  29. package/dist/src/core/components/enhanced-framework-detector.d.ts +2 -2
  30. package/dist/src/core/components/enhanced-framework-detector.js +1 -1
  31. package/dist/src/core/components/framework-registry.d.ts +1 -1
  32. package/dist/src/core/integrations/index.d.ts +1 -1
  33. package/dist/src/core/integrations/index.js +1 -1
  34. package/dist/src/core/integrations/registry.js +1 -1
  35. package/dist/src/core/layout/enhanced-layout-resolver.d.ts +8 -8
  36. package/dist/src/core/layout/enhanced-layout-resolver.js +1 -1
  37. package/dist/src/core/layout/layout-cache-manager.d.ts +1 -1
  38. package/dist/src/core/layout/layout-composer.d.ts +2 -2
  39. package/dist/src/core/layout/layout-composer.js +1 -1
  40. package/dist/src/core/layout/layout-data-loader.d.ts +2 -2
  41. package/dist/src/core/layout/layout-discovery.d.ts +2 -2
  42. package/dist/src/core/layout/layout-discovery.js +1 -1
  43. package/dist/src/core/layout/layout-matcher.d.ts +1 -1
  44. package/dist/src/core/layout/layout-matcher.js +1 -1
  45. package/dist/src/core/layout/layout-types.d.ts +3 -3
  46. package/dist/src/islands/component-analysis.d.ts +4 -4
  47. package/dist/src/islands/component-analysis.js +1 -1
  48. package/dist/src/islands/critical-css.js +3 -3
  49. package/dist/src/islands/css-utils.js +1 -1
  50. package/dist/src/islands/discovery/index.d.ts +9 -9
  51. package/dist/src/islands/discovery/index.js +1 -1
  52. package/dist/src/islands/discovery/registry.d.ts +1 -1
  53. package/dist/src/islands/discovery/resolver.d.ts +1 -1
  54. package/dist/src/islands/discovery/resolver.js +2 -2
  55. package/dist/src/islands/discovery/scanner.d.ts +1 -1
  56. package/dist/src/islands/discovery/scanner.js +1 -1
  57. package/dist/src/islands/discovery/validator.d.ts +1 -1
  58. package/dist/src/islands/discovery/validator.js +9 -9
  59. package/dist/src/islands/discovery/watcher.d.ts +1 -1
  60. package/dist/src/islands/discovery/watcher.js +1 -1
  61. package/dist/src/islands/framework-base-css.d.ts +36 -0
  62. package/dist/src/islands/framework-base-css.js +1 -0
  63. package/dist/src/islands/framework-detection.d.ts +3 -3
  64. package/dist/src/islands/framework-detection.js +1 -1
  65. package/dist/src/islands/island.js +1 -1
  66. package/dist/src/islands/per-island-script.js +1 -1
  67. package/dist/src/islands/universal-head-collector.d.ts +2 -2
  68. package/dist/src/middleware/discovery.d.ts +1 -1
  69. package/dist/src/middleware/discovery.js +1 -1
  70. package/dist/src/middleware/executor.d.ts +2 -2
  71. package/dist/src/middleware/index.d.ts +3 -3
  72. package/dist/src/middleware/index.js +1 -1
  73. package/dist/src/middleware/types.d.ts +2 -2
  74. package/dist/src/nitro/error-handler.d.ts +2 -2
  75. package/dist/src/nitro/error-handler.js +2 -2
  76. package/dist/src/nitro/index.d.ts +8 -8
  77. package/dist/src/nitro/index.js +1 -1
  78. package/dist/src/nitro/island-manifest.d.ts +1 -1
  79. package/dist/src/nitro/island-manifest.js +1 -1
  80. package/dist/src/nitro/middleware-adapter.d.ts +2 -2
  81. package/dist/src/nitro/types.d.ts +4 -4
  82. package/dist/src/render/isolated-ssr-renderer.d.ts +2 -2
  83. package/dist/src/render/isolated-ssr-renderer.js +1 -1
  84. package/dist/src/render/ssr.d.ts +5 -5
  85. package/dist/src/render/ssr.js +4 -4
  86. package/dist/src/schemas/api.d.ts +1 -1
  87. package/dist/src/schemas/core.d.ts +1 -1
  88. package/dist/src/schemas/index.d.ts +8 -8
  89. package/dist/src/schemas/index.js +1 -1
  90. package/dist/src/schemas/routing/index.d.ts +1 -1
  91. package/dist/src/schemas/routing/index.js +1 -1
  92. package/dist/src/schemas/routing.d.ts +4 -4
  93. package/dist/src/schemas/routing.js +1 -1
  94. package/dist/src/types/image.d.ts +38 -38
  95. package/dist/src/types/island-jsx.d.ts +16 -16
  96. package/dist/src/types/mdx.d.ts +2 -2
  97. package/dist/src/types/routing.d.ts +7 -7
  98. package/dist/src/types/routing.js +1 -1
  99. package/dist/src/types/virtual-modules.d.ts +1 -1
  100. package/dist/src/types/vite-env.d.ts +1 -1
  101. package/dist/src/vite-plugin/auto-discover.js +1 -1
  102. package/dist/src/vite-plugin/config.d.ts +1 -1
  103. package/dist/src/vite-plugin/image-optimization.d.ts +2 -2
  104. package/dist/src/vite-plugin/image-optimization.js +1 -1
  105. package/dist/src/vite-plugin/island-sidecar-plugin.js +1 -1
  106. package/dist/src/vite-plugin/module-discovery.js +1 -1
  107. package/dist/src/vite-plugin/nitro-integration.js +1 -1
  108. package/dist/src/vite-plugin/plugin.d.ts +2 -2
  109. package/dist/src/vite-plugin/plugin.js +1 -1
  110. package/dist/src/vite-plugin/types.d.ts +1 -2
  111. package/package.json +3 -2
  112. package/dist/src/client/main-slim.js +0 -1
  113. package/dist/src/client/strategies.js +0 -1
@@ -12,8 +12,8 @@
12
12
  *
13
13
  * Requirements: 6.1, 6.2, 6.3, 6.4
14
14
  */
15
- import type { AvalonEventContext } from './types.ts';
16
- import type { H3Event } from 'h3';
15
+ import type { H3Event } from "h3";
16
+ import type { AvalonEventContext } from "./types.ts";
17
17
  /**
18
18
  * Context object passed through the middleware chain
19
19
  */
@@ -7,8 +7,8 @@
7
7
  * In Nitro v3, canonical types should be imported from `nitro/types`.
8
8
  * Avalon-specific types that extend or complement Nitro's types are defined here.
9
9
  */
10
- import type { MiddlewareContext } from '../nitro/middleware-adapter.ts';
11
- import type { ApiMethod } from '../schemas/api.ts';
10
+ import type { MiddlewareContext } from "../nitro/middleware-adapter.ts";
11
+ import type { ApiMethod } from "../schemas/api.ts";
12
12
  /**
13
13
  * ServerRequest type reference from Nitro v3 (`nitro/types`).
14
14
  * Re-exported here for convenience within Avalon's Nitro integration.
@@ -91,7 +91,7 @@ export interface LayoutContext {
91
91
  */
92
92
  export interface DiscoveredRoute {
93
93
  /** Route type: page or API */
94
- type: 'page' | 'api';
94
+ type: "page" | "api";
95
95
  /** Absolute file path to the route handler */
96
96
  filePath: string;
97
97
  /** Route pattern for matching (e.g., /users/:id) */
@@ -108,7 +108,7 @@ export interface NitroRouteConfig {
108
108
  /** Route pattern (e.g., /users/:id) */
109
109
  pattern: string;
110
110
  /** Route handler type */
111
- type: 'page' | 'api' | 'middleware';
111
+ type: "page" | "api" | "middleware";
112
112
  /** File path to the handler */
113
113
  filePath: string;
114
114
  /** Extracted parameter names */
@@ -5,7 +5,7 @@
5
5
  * between different frameworks during server-side rendering. Each framework gets its
6
6
  * own isolated import context and rendering pipeline.
7
7
  */
8
- import type { JSX } from 'preact';
8
+ import type { JSX } from "preact";
9
9
  export interface FrameworkSSRContext {
10
10
  framework: string;
11
11
  imports: Map<string, unknown>;
@@ -16,7 +16,7 @@ export interface FrameworkSSRContext {
16
16
  export interface SSRIsolationConfig {
17
17
  enableStrictIsolation: boolean;
18
18
  allowedCrossFrameworkImports: string[];
19
- errorHandling: 'strict' | 'fallback' | 'ignore';
19
+ errorHandling: "strict" | "fallback" | "ignore";
20
20
  debugLogging: boolean;
21
21
  }
22
22
  export interface IsolatedRenderRequest {
@@ -1 +1 @@
1
- import{render as e}from"preact-render-to-string";import{readFile as t}from"node:fs/promises";import{EnhancedFrameworkDetector as n}from"../core/components/enhanced-framework-detector.js";import{toImportSpecifier as r}from"../middleware/executor.js";export class IsolatedSSRRenderer{contexts;detector;config;activeContext=null;constructor(e={}){this.contexts=new Map,this.detector=new n,this.config={enableStrictIsolation:!0,allowedCrossFrameworkImports:[`preact`,`preact-render-to-string`],errorHandling:`fallback`,debugLogging:!1,...e},this.initializeFrameworkContexts()}async renderWithIsolation(e){let t=[],n=[];try{let r=await this.resolveFramework(e,n);return await this.renderInContext(e,r,t,n)}catch(r){return t.push(`SSR rendering failed: ${r instanceof Error?r.message:String(r)}`),await this.tryFallbackRender(e,t,n)}}async resolveFramework(e,t){if(e.framework)return e.framework;try{let n=await this.getComponentContent(e.componentPath),r=this.detector.detectFramework(e.componentPath,n);return r.confidence===`low`&&t.push(`Low confidence framework detection for ${e.componentPath}: ${r.framework}`),this.config.debugLogging&&(console.log(`[SSR Isolation] Detected framework: ${r.framework} for ${e.componentPath}`),console.log(`[SSR Isolation] Evidence: ${r.evidence.join(`, `)}`)),r.framework}catch{return t.push(`Could not read component file for framework detection: ${e.componentPath}, defaulting to preact`),`preact`}}async renderInContext(e,t,n,r){let i=this.getFrameworkContext(t);if(!i)throw Error(`No SSR context available for framework: ${t}`);await this.switchToContext(t);try{let a=e.component(),o=a instanceof Promise?await a:a;return{html:await i.renderFunction(o,e.props||{}),framework:t,success:!0,errors:n,warnings:r}}finally{this.cleanupContext(t)}}async tryFallbackRender(t,n,r){if(this.config.errorHandling!==`fallback`)return{html:``,framework:t.framework||`unknown`,success:!1,errors:n,warnings:r};try{let i=e(await t.component());return r.push(`Fell back to Preact rendering due to framework-specific error`),{html:i,framework:`preact`,success:!0,errors:n,warnings:r}}catch(e){return n.push(`Fallback rendering also failed: ${e instanceof Error?e.message:String(e)}`),{html:``,framework:t.framework||`unknown`,success:!1,errors:n,warnings:r}}}initializeFrameworkContexts(){this.contexts.set(`preact`,{framework:`preact`,imports:new Map,renderFunction:t=>Promise.resolve(e(t)),cleanup:()=>{this.clearFrameworkGlobals(`preact`)},isActive:!1}),this.contexts.set(`solid`,{framework:`solid`,imports:new Map,renderFunction:async e=>{try{let t=await this.importFrameworkModule(`solid-js/web`,`solid`);if(t&&typeof t.renderToString==`function`)return t.renderToString(()=>e);throw Error(`Solid renderToString not available`)}catch(e){throw Error(`Solid SSR failed: ${e instanceof Error?e.message:String(e)}`)}},cleanup:()=>{this.clearFrameworkGlobals(`solid`)},isActive:!1}),this.contexts.set(`vue`,{framework:`vue`,imports:new Map,renderFunction:async e=>{try{let t=await this.importFrameworkModule(`vue/server-renderer`,`vue`);if(t&&typeof t.renderToString==`function`)return await t.renderToString(e);throw Error(`Vue renderToString not available`)}catch(e){throw Error(`Vue SSR failed: ${e instanceof Error?e.message:String(e)}`)}},cleanup:()=>{this.clearFrameworkGlobals(`vue`)},isActive:!1}),this.contexts.set(`svelte`,{framework:`svelte`,imports:new Map,renderFunction:e=>{try{if(e&&typeof e==`object`&&`render`in e){let t=e.render();return Promise.resolve(t.html||``)}throw Error(`Svelte component does not have render method`)}catch(e){throw Error(`Svelte SSR failed: ${e instanceof Error?e.message:String(e)}`)}},cleanup:()=>{this.clearFrameworkGlobals(`svelte`)},isActive:!1}),this.contexts.set(`unknown`,{framework:`unknown`,imports:new Map,renderFunction:t=>Promise.resolve(e(t)),cleanup:()=>{},isActive:!1})}getFrameworkContext(e){return this.contexts.get(e)||this.contexts.get(`unknown`)||null}async switchToContext(e){this.activeContext&&this.activeContext!==e&&this.cleanupContext(this.activeContext);let t=this.contexts.get(e);if(!t)throw Error(`Framework context not found: ${e}`);t.isActive=!0,this.activeContext=e,await this.setupFrameworkEnvironment(e)}cleanupContext(e){let t=this.contexts.get(e);t&&(t.cleanup(),t.isActive=!1,t.imports.clear(),this.activeContext===e&&(this.activeContext=null))}async setupFrameworkEnvironment(e){switch(e){case`solid`:await this.ensureSolidEnvironment();break;case`vue`:await this.ensureVueEnvironment();break;case`svelte`:this.ensureSvelteEnvironment();break;default:break}}async importFrameworkModule(e,t){let n=this.contexts.get(t);if(!n)throw Error(`No context for framework: ${t}`);if(n.imports.has(e))return n.imports.get(e);if(this.config.enableStrictIsolation&&!this.isImportAllowed(e,t))throw Error(`Import not allowed in ${t} context: ${e}`);try{let i=await import(r(e));return n.imports.set(e,i),this.config.debugLogging&&console.log(`[SSR Isolation] Imported ${e} in ${t} context`),i}catch(n){throw Error(`Failed to import ${e} in ${t} context: ${n instanceof Error?n.message:String(n)}`)}}isImportAllowed(e,t){let n=this.detector.getFrameworkConfigs().get(t);return n&&[...n.ssrModules,...n.hydrationModules].some(t=>e.startsWith(t))?!0:this.config.allowedCrossFrameworkImports.some(t=>e.startsWith(t))}clearFrameworkGlobals(e){let t=globalThis;switch(e){case`solid`:typeof globalThis<`u`&&(delete t._$HY,delete t.Solid);break;case`vue`:typeof globalThis<`u`&&(delete t.__VUE__,delete t.Vue);break;case`svelte`:typeof globalThis<`u`&&delete t.__SVELTE__;break}}async ensureSolidEnvironment(){try{await this.importFrameworkModule(`solid-js/web`,`solid`)}catch(e){this.config.debugLogging&&console.warn(`[SSR Isolation] Failed to set up Solid environment:`,e)}}async ensureVueEnvironment(){try{await this.importFrameworkModule(`vue/server-renderer`,`vue`)}catch(e){this.config.debugLogging&&console.warn(`[SSR Isolation] Failed to set up Vue environment:`,e)}}ensureSvelteEnvironment(){try{this.config.debugLogging&&console.log(`[SSR Isolation] Svelte environment ready`)}catch(e){this.config.debugLogging&&console.warn(`[SSR Isolation] Failed to set up Svelte environment:`,e)}}async getComponentContent(e){try{let n=e;e.startsWith(`/`)&&(n=e.substring(1));let r=[n,`src/islands/${n.split(`/`).pop()}`,`islands/${n.split(`/`).pop()}`,`examples/${n.split(`/`).pop()}`];for(let e of r)try{return await t(e,`utf-8`)}catch{continue}throw Error(`Component file not found: ${e}`)}catch(e){throw Error(`Failed to read component content: ${e instanceof Error?e.message:String(e)}`)}}getActiveContext(){return this.activeContext}getContexts(){return new Map(this.contexts)}updateConfig(e){this.config={...this.config,...e}}resetAllContexts(){for(let[e]of this.contexts)this.cleanupContext(e);this.activeContext=null}async renderWithFallback(e,t){let n=[],r=[];try{let i={componentPath:`fallback-component`,component:e,framework:t},a=await this.renderWithIsolation(i);if(a.success)return a;n.push(...a.errors),r.push(...a.warnings)}catch(e){n.push(`Preferred framework (${t}) failed: ${e instanceof Error?e.message:String(e)}`)}for(let i of[`preact`,`unknown`])if(i!==t)try{let a={componentPath:`fallback-component`,component:e,framework:i},o=await this.renderWithIsolation(a);if(o.success)return r.push(`Fell back to ${i} rendering from ${t}`),{...o,warnings:[...r,...o.warnings]};n.push(...o.errors)}catch(e){n.push(`Fallback framework (${i}) failed: ${e instanceof Error?e.message:String(e)}`)}return{html:``,framework:t,success:!1,errors:n,warnings:r}}async validateFrameworkContext(e){if(!this.contexts.get(e))return!1;try{return await this.setupFrameworkEnvironment(e),!0}catch(t){return this.config.debugLogging&&console.warn(`[SSR Isolation] Framework context validation failed for ${e}:`,t),!1}}getErrorRecoveryStrategies(e){return{solid:[`Ensure solid-js and solid-js/web are installed`,`Check that Solid components use proper JSX import source: /** @jsxImportSource solid-js */`,`Verify Solid components export default function`],vue:[`Ensure vue and vue/server-renderer are installed`,`Check that Vue components have proper <template>, <script>, and <style> sections`,`Verify Vue components are properly compiled for SSR`],svelte:[`Ensure svelte is installed and components are compiled`,`Check that Svelte components export default class or function`,`Verify Svelte components have proper script and style sections`],preact:[`Ensure preact and preact-render-to-string are installed`,`Check that Preact components use proper JSX import source: /** @jsxImportSource preact */`,`Verify Preact components export default function`]}[e]||[`Check that the framework is properly installed`,`Verify component syntax is correct for the detected framework`,`Consider adding explicit framework detection hints`]}}
1
+ import{readFile as e}from"node:fs/promises";import{render as t}from"preact-render-to-string";import{EnhancedFrameworkDetector as n}from"../core/components/enhanced-framework-detector.js";import{toImportSpecifier as r}from"../middleware/executor.js";export class IsolatedSSRRenderer{contexts;detector;config;activeContext=null;constructor(e={}){this.contexts=new Map,this.detector=new n,this.config={enableStrictIsolation:!0,allowedCrossFrameworkImports:[`preact`,`preact-render-to-string`],errorHandling:`fallback`,debugLogging:!1,...e},this.initializeFrameworkContexts()}async renderWithIsolation(e){let t=[],n=[];try{let r=await this.resolveFramework(e,n);return await this.renderInContext(e,r,t,n)}catch(r){return t.push(`SSR rendering failed: ${r instanceof Error?r.message:String(r)}`),await this.tryFallbackRender(e,t,n)}}async resolveFramework(e,t){if(e.framework)return e.framework;try{let n=await this.getComponentContent(e.componentPath),r=this.detector.detectFramework(e.componentPath,n);return r.confidence===`low`&&t.push(`Low confidence framework detection for ${e.componentPath}: ${r.framework}`),this.config.debugLogging&&(console.log(`[SSR Isolation] Detected framework: ${r.framework} for ${e.componentPath}`),console.log(`[SSR Isolation] Evidence: ${r.evidence.join(`, `)}`)),r.framework}catch{return t.push(`Could not read component file for framework detection: ${e.componentPath}, defaulting to preact`),`preact`}}async renderInContext(e,t,n,r){let i=this.getFrameworkContext(t);if(!i)throw Error(`No SSR context available for framework: ${t}`);await this.switchToContext(t);try{let a=e.component(),o=a instanceof Promise?await a:a;return{html:await i.renderFunction(o,e.props||{}),framework:t,success:!0,errors:n,warnings:r}}finally{this.cleanupContext(t)}}async tryFallbackRender(e,n,r){if(this.config.errorHandling!==`fallback`)return{html:``,framework:e.framework||`unknown`,success:!1,errors:n,warnings:r};try{let i=t(await e.component());return r.push(`Fell back to Preact rendering due to framework-specific error`),{html:i,framework:`preact`,success:!0,errors:n,warnings:r}}catch(t){return n.push(`Fallback rendering also failed: ${t instanceof Error?t.message:String(t)}`),{html:``,framework:e.framework||`unknown`,success:!1,errors:n,warnings:r}}}initializeFrameworkContexts(){this.contexts.set(`preact`,{framework:`preact`,imports:new Map,renderFunction:e=>Promise.resolve(t(e)),cleanup:()=>{this.clearFrameworkGlobals(`preact`)},isActive:!1}),this.contexts.set(`solid`,{framework:`solid`,imports:new Map,renderFunction:async e=>{try{let t=await this.importFrameworkModule(`solid-js/web`,`solid`);if(t&&typeof t.renderToString==`function`)return t.renderToString(()=>e);throw Error(`Solid renderToString not available`)}catch(e){throw Error(`Solid SSR failed: ${e instanceof Error?e.message:String(e)}`)}},cleanup:()=>{this.clearFrameworkGlobals(`solid`)},isActive:!1}),this.contexts.set(`vue`,{framework:`vue`,imports:new Map,renderFunction:async e=>{try{let t=await this.importFrameworkModule(`vue/server-renderer`,`vue`);if(t&&typeof t.renderToString==`function`)return await t.renderToString(e);throw Error(`Vue renderToString not available`)}catch(e){throw Error(`Vue SSR failed: ${e instanceof Error?e.message:String(e)}`)}},cleanup:()=>{this.clearFrameworkGlobals(`vue`)},isActive:!1}),this.contexts.set(`svelte`,{framework:`svelte`,imports:new Map,renderFunction:e=>{try{if(e&&typeof e==`object`&&`render`in e){let t=e.render();return Promise.resolve(t.html||``)}throw Error(`Svelte component does not have render method`)}catch(e){throw Error(`Svelte SSR failed: ${e instanceof Error?e.message:String(e)}`)}},cleanup:()=>{this.clearFrameworkGlobals(`svelte`)},isActive:!1}),this.contexts.set(`unknown`,{framework:`unknown`,imports:new Map,renderFunction:e=>Promise.resolve(t(e)),cleanup:()=>{},isActive:!1})}getFrameworkContext(e){return this.contexts.get(e)||this.contexts.get(`unknown`)||null}async switchToContext(e){this.activeContext&&this.activeContext!==e&&this.cleanupContext(this.activeContext);let t=this.contexts.get(e);if(!t)throw Error(`Framework context not found: ${e}`);t.isActive=!0,this.activeContext=e,await this.setupFrameworkEnvironment(e)}cleanupContext(e){let t=this.contexts.get(e);t&&(t.cleanup(),t.isActive=!1,t.imports.clear(),this.activeContext===e&&(this.activeContext=null))}async setupFrameworkEnvironment(e){switch(e){case`solid`:await this.ensureSolidEnvironment();break;case`vue`:await this.ensureVueEnvironment();break;case`svelte`:this.ensureSvelteEnvironment();break;default:break}}async importFrameworkModule(e,t){let n=this.contexts.get(t);if(!n)throw Error(`No context for framework: ${t}`);if(n.imports.has(e))return n.imports.get(e);if(this.config.enableStrictIsolation&&!this.isImportAllowed(e,t))throw Error(`Import not allowed in ${t} context: ${e}`);try{let i=await import(r(e));return n.imports.set(e,i),this.config.debugLogging&&console.log(`[SSR Isolation] Imported ${e} in ${t} context`),i}catch(n){throw Error(`Failed to import ${e} in ${t} context: ${n instanceof Error?n.message:String(n)}`)}}isImportAllowed(e,t){let n=this.detector.getFrameworkConfigs().get(t);return n&&[...n.ssrModules,...n.hydrationModules].some(t=>e.startsWith(t))?!0:this.config.allowedCrossFrameworkImports.some(t=>e.startsWith(t))}clearFrameworkGlobals(e){let t=globalThis;switch(e){case`solid`:typeof globalThis<`u`&&(delete t._$HY,delete t.Solid);break;case`vue`:typeof globalThis<`u`&&(delete t.__VUE__,delete t.Vue);break;case`svelte`:typeof globalThis<`u`&&delete t.__SVELTE__;break}}async ensureSolidEnvironment(){try{await this.importFrameworkModule(`solid-js/web`,`solid`)}catch(e){this.config.debugLogging&&console.warn(`[SSR Isolation] Failed to set up Solid environment:`,e)}}async ensureVueEnvironment(){try{await this.importFrameworkModule(`vue/server-renderer`,`vue`)}catch(e){this.config.debugLogging&&console.warn(`[SSR Isolation] Failed to set up Vue environment:`,e)}}ensureSvelteEnvironment(){try{this.config.debugLogging&&console.log(`[SSR Isolation] Svelte environment ready`)}catch(e){this.config.debugLogging&&console.warn(`[SSR Isolation] Failed to set up Svelte environment:`,e)}}async getComponentContent(t){try{let n=t;t.startsWith(`/`)&&(n=t.substring(1));let r=[n,`src/islands/${n.split(`/`).pop()}`,`islands/${n.split(`/`).pop()}`,`examples/${n.split(`/`).pop()}`];for(let t of r)try{return await e(t,`utf-8`)}catch{}throw Error(`Component file not found: ${t}`)}catch(e){throw Error(`Failed to read component content: ${e instanceof Error?e.message:String(e)}`)}}getActiveContext(){return this.activeContext}getContexts(){return new Map(this.contexts)}updateConfig(e){this.config={...this.config,...e}}resetAllContexts(){for(let[e]of this.contexts)this.cleanupContext(e);this.activeContext=null}async renderWithFallback(e,t){let n=[],r=[];try{let i={componentPath:`fallback-component`,component:e,framework:t},a=await this.renderWithIsolation(i);if(a.success)return a;n.push(...a.errors),r.push(...a.warnings)}catch(e){n.push(`Preferred framework (${t}) failed: ${e instanceof Error?e.message:String(e)}`)}for(let i of[`preact`,`unknown`])if(i!==t)try{let a={componentPath:`fallback-component`,component:e,framework:i},o=await this.renderWithIsolation(a);if(o.success)return r.push(`Fell back to ${i} rendering from ${t}`),{...o,warnings:[...r,...o.warnings]};n.push(...o.errors)}catch(e){n.push(`Fallback framework (${i}) failed: ${e instanceof Error?e.message:String(e)}`)}return{html:``,framework:t,success:!1,errors:n,warnings:r}}async validateFrameworkContext(e){if(!this.contexts.get(e))return!1;try{return await this.setupFrameworkEnvironment(e),!0}catch(t){return this.config.debugLogging&&console.warn(`[SSR Isolation] Framework context validation failed for ${e}:`,t),!1}}getErrorRecoveryStrategies(e){return{solid:[`Ensure solid-js and solid-js/web are installed`,`Check that Solid components use proper JSX import source: /** @jsxImportSource solid-js */`,`Verify Solid components export default function`],vue:[`Ensure vue and vue/server-renderer are installed`,`Check that Vue components have proper <template>, <script>, and <style> sections`,`Verify Vue components are properly compiled for SSR`],svelte:[`Ensure svelte is installed and components are compiled`,`Check that Svelte components export default class or function`,`Verify Svelte components have proper script and style sections`],preact:[`Ensure preact and preact-render-to-string are installed`,`Check that Preact components use proper JSX import source: /** @jsxImportSource preact */`,`Verify Preact components export default function`]}[e]||[`Check that the framework is properly installed`,`Verify component syntax is correct for the detected framework`,`Consider adding explicit framework detection hints`]}}
@@ -1,14 +1,14 @@
1
- import { type JSX } from 'preact';
2
- import type { RenderOptions } from '../schemas/core.ts';
3
- import type { EnhancedLayoutResolver } from '../core/layout/enhanced-layout-resolver.ts';
4
- import type { LayoutContext } from '../types/layout.ts';
1
+ import { type JSX } from "preact";
2
+ import type { EnhancedLayoutResolver } from "../core/layout/enhanced-layout-resolver.ts";
3
+ import type { RenderOptions } from "../schemas/core.ts";
4
+ import type { LayoutContext } from "../types/layout.ts";
5
5
  export interface RouteConfig {
6
6
  component: () => JSX.Element | Promise<JSX.Element>;
7
7
  options?: Partial<RenderOptions>;
8
8
  frontmatter?: Record<string, unknown>;
9
9
  }
10
10
  export interface RenderStrategy {
11
- type: 'hydrate' | 'ssr-only';
11
+ type: "hydrate" | "ssr-only";
12
12
  reason: string;
13
13
  warnings?: string[];
14
14
  }
@@ -1,4 +1,4 @@
1
- import{h as e}from"preact";import{render as t}from"preact-render-to-string";import{readFile as n}from"node:fs/promises";import{getUniversalCSSForHead as r}from"../islands/universal-css-collector.js";import{getUniversalHeadForInjection as i,injectSolidHydrationScriptIfNeeded as a}from"../islands/universal-head-collector.js";import{analyzeComponentContent as o}from"../core/components/component-analyzer.js";import{IsolatedSSRRenderer as s}from"./isolated-ssr-renderer.js";function c(e){let t=e;if(!(e.includes(`data-framework=`)||e.includes(`data-src=`)))return e;if(!e.includes(`data-universal-ssr="true"`)){let n=r(!0);n&&e.includes(`</head>`)&&(t=t.replace(`</head>`,`${n}\n</head>`))}let n=i(!0);if(n&&e.includes(`</head>`)&&(t=t.replace(`</head>`,` ${n}\n</head>`)),t=a(t),e.includes(`/src/client/main.js`)||e.includes(`main.js`))return t;let o=`<script type="module" src="/src/client/main.js"><\/script>`;return t.includes(`</body>`)?t.replace(`</body>`,`${o}\n</body>`):t+o}const l={solid:[`solid-js`,`SolidIsland`,`createSignal`,`.solid.`,`data-solid-hydrate`],vue:[`data-vue-hydrate`,`.vue`,`Vue`],svelte:[`data-framework="svelte"`,`.svelte`,`s-`]};let u=null;function d(){return u||=new s({enableStrictIsolation:!0,allowedCrossFrameworkImports:[`preact`,`preact-render-to-string`],errorHandling:`fallback`,debugLogging:process.env.NODE_ENV!==`production`}),u}function f(e){return{solid:l.solid.some(t=>e.includes(t)),vue:l.vue.some(t=>e.includes(t)),svelte:l.svelte.some(t=>e.includes(t))}}function p(e,t,n){let r=[],i=/^import\s[^'"]*['"]([^'"]+)['"]/gm,a=[],o;for(;(o=i.exec(t))!==null;)a.push(o[1]);let s=n;e.includes(`.solid.`)?s=`solid`:e.includes(`.preact.`)&&(s=`preact`);let c=new Map([[`preact`,[`solid-js`,`solid-js/web`,`vue`,`svelte`]],[`solid`,[`preact`,`preact-render-to-string`,`vue`,`svelte`]],[`vue`,[`preact`,`solid-js`,`svelte`]],[`svelte`,[`preact`,`solid-js`,`vue`]]]).get(s)||[];for(let t of a)for(let n of c)t.startsWith(n)&&r.push(`Cross-framework import detected: ${s} component (${e}) importing ${t}`);return r}function m(e,t){return t.type===`ssr-only`?e.replaceAll(/data-hydrate="[^"]*"\s*/g,``).replace(`>`,` data-render-strategy="${t.type}" data-ssr-reason="${t.reason}">`):e.replace(`>`,` data-render-strategy="${t.type}" data-hydrate-reason="${t.reason}">`)}async function h(e,t={}){let n=/(<[^>]*data-hydrate="([^"]*)"[^>]*>)/g,r=e,i=Array.from(e.matchAll(n));for(let e of i){let[n,i,a]=e;try{if(n.includes(`data-render-strategy`))continue;let e=await _(a,t);await g(a,t),r=r.replace(n,m(n,e)),t.logDecisions===!0&&(console.log(`[SSR Strategy] ${a} -> ${e.type.toUpperCase()}: ${e.reason}`),e.warnings&&e.warnings.length>0&&!t.suppressWarnings&&e.warnings.forEach(e=>console.warn(`[SSR Warning] ${a}: ${e}`)))}catch(e){console.warn(`Failed to analyze component ${a}:`,e);let t=n.replace(`>`,` data-render-strategy="hydrate" data-error="analysis-failed">`);r=r.replace(n,t)}}return r}async function g(e,t={}){try{let r,i=e;e.startsWith(`/`)&&(i=e.substring(1));let a=[i,`examples/${i.split(`/`).pop()}`,`src/islands/${i.split(`/`).pop()}`,`islands/${i.split(`/`).pop()}`],o=``;for(let e of a)try{r=await n(e,`utf-8`),o=e;break}catch{continue}if(!o||!r)return;let s=f(r),c=`preact`;s.solid?c=`solid`:s.vue?c=`vue`:s.svelte&&(c=`svelte`);let l=p(o,r,c);l.length>0&&!t.suppressWarnings&&l.forEach(e=>console.warn(`[Import Validation] ${e}`))}catch(n){t.logDecisions!==!1&&console.warn(`Import validation failed for ${e}:`,n)}}async function _(e,t={}){if(t.forceSSROnly)return{type:`ssr-only`,reason:`Explicitly configured for SSR-only rendering`};if(e.includes(`NoHydrate`)||e.includes(`Static`)||e.includes(`SSROnly`))return{type:`ssr-only`,reason:`Component name explicitly indicates SSR-only rendering`};if(t.detectScripts===!1)return{type:`hydrate`,reason:`Script detection disabled, defaulting to hydration`};try{let r,i=e;e.startsWith(`/`)&&(i=e.substring(1));let a=[i,`examples/${i.split(`/`).pop()}`,`src/islands/${i.split(`/`).pop()}`,`islands/${i.split(`/`).pop()}`],s=null;for(let e of a)try{r=await n(e,`utf-8`);let i={forceSSROnly:t.forceSSROnly,detectScripts:t.detectScripts,suppressWarnings:t.suppressWarnings,logDecisions:!1};s=o(e,r,i);break}catch{continue}return s?{type:s.decision.shouldHydrate?`hydrate`:`ssr-only`,reason:s.decision.reason,warnings:s.decision.warnings}:v(e)}catch(t){return console.warn(`Component analysis failed for ${e}:`,t),{type:`ssr-only`,reason:`Analysis failed, defaulting to SSR-only for safety`,warnings:[`Component analysis error: ${t instanceof Error?t.message:String(t)}`]}}}function v(e){return e.endsWith(`.vue`)||e.endsWith(`.svelte`)||e.endsWith(`.tsx`)||e.endsWith(`.jsx`)?{type:`ssr-only`,reason:`Framework component detected, defaulting to SSR-only (hydration requires explicit hydrate function)`}:{type:`ssr-only`,reason:`Unknown component type, defaulting to SSR-only for safety`}}function y(e){return e.meta?.map(({name:e,content:t})=>`<meta name="${e}" content="${t}">`).join(`
1
+ import{readFile as e}from"node:fs/promises";import{h as t}from"preact";import{render as n}from"preact-render-to-string";import{analyzeComponentContent as r}from"../core/components/component-analyzer.js";import{getUniversalCSSForHead as i}from"../islands/universal-css-collector.js";import{getUniversalHeadForInjection as a,injectSolidHydrationScriptIfNeeded as o}from"../islands/universal-head-collector.js";import{IsolatedSSRRenderer as s}from"./isolated-ssr-renderer.js";function c(e){let t=e;if(!(e.includes(`data-framework=`)||e.includes(`data-src=`)))return e;if(!e.includes(`data-universal-ssr="true"`)){let n=i(!0);n&&e.includes(`</head>`)&&(t=t.replace(`</head>`,`${n}\n</head>`))}let n=a(!0);if(n&&e.includes(`</head>`)&&(t=t.replace(`</head>`,` ${n}\n</head>`)),t=o(t),e.includes(`/src/client/main.js`)||e.includes(`main.js`))return t;let r=`<script type="module" src="/src/client/main.js"><\/script>`;return t.includes(`</body>`)?t.replace(`</body>`,`${r}\n</body>`):t+r}const l={solid:[`solid-js`,`SolidIsland`,`createSignal`,`.solid.`,`data-solid-hydrate`],vue:[`data-vue-hydrate`,`.vue`,`Vue`],svelte:[`data-framework="svelte"`,`.svelte`,`s-`]};let u=null;function d(){return u||=new s({enableStrictIsolation:!0,allowedCrossFrameworkImports:[`preact`,`preact-render-to-string`],errorHandling:`fallback`,debugLogging:process.env.NODE_ENV!==`production`}),u}function f(e){return{solid:l.solid.some(t=>e.includes(t)),vue:l.vue.some(t=>e.includes(t)),svelte:l.svelte.some(t=>e.includes(t))}}function p(e,t,n){let r=[],i=/^import\s[^'"]*['"]([^'"]+)['"]/gm,a=[];for(let e=i.exec(t);e!==null;e=i.exec(t))a.push(e[1]);let o=n;e.includes(`.solid.`)?o=`solid`:e.includes(`.preact.`)&&(o=`preact`);let s=new Map([[`preact`,[`solid-js`,`solid-js/web`,`vue`,`svelte`]],[`solid`,[`preact`,`preact-render-to-string`,`vue`,`svelte`]],[`vue`,[`preact`,`solid-js`,`svelte`]],[`svelte`,[`preact`,`solid-js`,`vue`]]]).get(o)||[];for(let t of a)for(let n of s)t.startsWith(n)&&r.push(`Cross-framework import detected: ${o} component (${e}) importing ${t}`);return r}function m(e,t){return t.type===`ssr-only`?e.replaceAll(/data-hydrate="[^"]*"\s*/g,``).replace(`>`,` data-render-strategy="${t.type}" data-ssr-reason="${t.reason}">`):e.replace(`>`,` data-render-strategy="${t.type}" data-hydrate-reason="${t.reason}">`)}async function h(e,t={}){let n=/(<[^>]*data-hydrate="([^"]*)"[^>]*>)/g,r=e,i=Array.from(e.matchAll(n));for(let e of i){let[n,i,a]=e;try{if(n.includes(`data-render-strategy`))continue;let e=await _(a,t);await g(a,t),r=r.replace(n,m(n,e)),t.logDecisions===!0&&(console.log(`[SSR Strategy] ${a} -> ${e.type.toUpperCase()}: ${e.reason}`),e.warnings&&e.warnings.length>0&&!t.suppressWarnings&&e.warnings.forEach(e=>console.warn(`[SSR Warning] ${a}: ${e}`)))}catch(e){console.warn(`Failed to analyze component ${a}:`,e);let t=n.replace(`>`,` data-render-strategy="hydrate" data-error="analysis-failed">`);r=r.replace(n,t)}}return r}async function g(t,n={}){try{let r,i=t;t.startsWith(`/`)&&(i=t.substring(1));let a=[i,`examples/${i.split(`/`).pop()}`,`src/islands/${i.split(`/`).pop()}`,`islands/${i.split(`/`).pop()}`],o=``;for(let t of a)try{r=await e(t,`utf-8`),o=t;break}catch{}if(!o||!r)return;let s=f(r),c=`preact`;s.solid?c=`solid`:s.vue?c=`vue`:s.svelte&&(c=`svelte`);let l=p(o,r,c);l.length>0&&!n.suppressWarnings&&l.forEach(e=>console.warn(`[Import Validation] ${e}`))}catch(e){n.logDecisions!==!1&&console.warn(`Import validation failed for ${t}:`,e)}}async function _(t,n={}){if(n.forceSSROnly)return{type:`ssr-only`,reason:`Explicitly configured for SSR-only rendering`};if(t.includes(`NoHydrate`)||t.includes(`Static`)||t.includes(`SSROnly`))return{type:`ssr-only`,reason:`Component name explicitly indicates SSR-only rendering`};if(n.detectScripts===!1)return{type:`hydrate`,reason:`Script detection disabled, defaulting to hydration`};try{let i,a=t;t.startsWith(`/`)&&(a=t.substring(1));let o=[a,`examples/${a.split(`/`).pop()}`,`src/islands/${a.split(`/`).pop()}`,`islands/${a.split(`/`).pop()}`],s=null;for(let t of o)try{i=await e(t,`utf-8`);let a={forceSSROnly:n.forceSSROnly,detectScripts:n.detectScripts,suppressWarnings:n.suppressWarnings,logDecisions:!1};s=r(t,i,a);break}catch{}return s?{type:s.decision.shouldHydrate?`hydrate`:`ssr-only`,reason:s.decision.reason,warnings:s.decision.warnings}:v(t)}catch(e){return console.warn(`Component analysis failed for ${t}:`,e),{type:`ssr-only`,reason:`Analysis failed, defaulting to SSR-only for safety`,warnings:[`Component analysis error: ${e instanceof Error?e.message:String(e)}`]}}}function v(e){return e.endsWith(`.vue`)||e.endsWith(`.svelte`)||e.endsWith(`.tsx`)||e.endsWith(`.jsx`)?{type:`ssr-only`,reason:`Framework component detected, defaulting to SSR-only (hydration requires explicit hydrate function)`}:{type:`ssr-only`,reason:`Unknown component type, defaulting to SSR-only for safety`}}function y(e){return e.meta?.map(({name:e,content:t})=>`<meta name="${e}" content="${t}">`).join(`
2
2
  `)||``}function b(e){return e.styles?.map(e=>`<link rel="stylesheet" href="${e}">`).join(`
3
3
  `)||``}function x(e){return e.scripts?.map(e=>typeof e==`string`?`<script src="${e}" defer><\/script>`:`<script ${e.src?`src="${e.src}"`:``} ${e.type?`type="${e.type}"`:``}>${e.content||``}<\/script>`).join(`
4
4
  `)||``}function S(e,t){return`
@@ -7,7 +7,7 @@ import{h as e}from"preact";import{render as t}from"preact-render-to-string";impo
7
7
  if (import.meta.hot) {
8
8
  import.meta.hot.accept();
9
9
  }
10
- <\/script>`:``}function w(e){return e.replaceAll(`&`,`&amp;`).replaceAll(`<`,`&lt;`).replaceAll(`>`,`&gt;`).replaceAll(`"`,`&quot;`).replaceAll(`'`,`&#039;`)}function T(e,t,n){let a=process.env.NODE_ENV!==`production`,o=y(e),s=b(e),c=x(e),l=S(a,t),u=C(a,n),d=r(!0),f=i(!0);return`
10
+ <\/script>`:``}function w(e){return e.replaceAll(`&`,`&amp;`).replaceAll(`<`,`&lt;`).replaceAll(`>`,`&gt;`).replaceAll(`"`,`&quot;`).replaceAll(`'`,`&#039;`)}function T(e,t,n){let r=process.env.NODE_ENV!==`production`,o=y(e),s=b(e),c=x(e),l=S(r,t),u=C(r,n),d=i(!0),f=a(!0);return`
11
11
  <head>
12
12
  <meta charset="utf-8">
13
13
  <meta name="viewport" content="width=device-width, initial-scale=1">
@@ -29,13 +29,13 @@ import{h as e}from"preact";import{render as t}from"preact-render-to-string";impo
29
29
  ${d}
30
30
  ${f}
31
31
  ${c}${l}${u}
32
- </head>`.trim()}export async function renderToHtml(e,n={},r,i={}){try{let o,s;if(i.forceSSROnly===!0){let n=e.component();o=t(n instanceof Promise?await n:n),s=f(o)}else ({content:o,frameworks:s}=await O(e,i));o=await h(o,i);let c=`<!DOCTYPE html>\n<html lang="en">\n${T({...n,...e.options},s,r)}\n<body>\n${o}\n</body>\n</html>`;return c=a(c),c}catch(e){throw console.error(`Error rendering component:`,e),Error(`Failed to render component`)}}export async function renderToHtmlWithLayouts(e,t,n,r,i={},a,o={}){try{let s=e,c={default:e.component,layoutConfig:s.layoutConfig,loader:s.loader,frontmatter:e.frontmatter},l=await t.resolveAndRender(r,c,n);return l.handlers.length===0?await renderToHtml(e,i,a,o):E(await h(await j(await A(e,r,o),l,c,n,r),o),e,i,a)}catch(t){console.error(`Error rendering component with layouts:`,t);try{return await renderToHtml(e,i,a,o)}catch(e){throw console.error(`Fallback rendering also failed:`,e),Error(`Failed to render component with layouts and fallback failed`)}}}function E(e,t,n,r){if(e.trim().startsWith(`<!DOCTYPE html>`)||e.trim().startsWith(`<html`))return c(e);let i=f(e);return c(`<!DOCTYPE html>\n<html lang="en">\n${T({...n,...t.options},i,r)}\n<body>\n${e}\n</body>\n</html>`)}async function D(e,n,r,i){let a,o;if(i.forceSSROnly===!0){let n=e.component();a=t(n instanceof Promise?await n:n),o=f(a)}else ({content:a,frameworks:o}=await O(e,i));return a=await h(a,i),{head:T({...n,...e.options},o,r),content:a}}async function O(e,n){try{let t=await d().renderWithIsolation({componentPath:`route-component`,component:e.component});if(!t.success)throw Error(`Isolated rendering failed: ${t.errors.join(`, `)}`);return t.warnings.length>0&&!n.suppressWarnings&&t.warnings.forEach(e=>console.warn(`[SSR Isolation] ${e}`)),{content:t.html,frameworks:f(t.html)}}catch(n){console.warn(`[SSR] Isolated rendering failed, falling back to standard rendering:`,n);let r=e.component(),i=t(r instanceof Promise?await r:r);return{content:i,frameworks:f(i)}}}function k(e,t,n,r,i,a=`Streaming Error`,o=`route-component`){if(console.error(`[${a}]`,{message:e.message,stack:e.stack,shellSent:t,timestamp:new Date().toISOString()}),i.onError?.(e),t){console.log(`[${a}] Mid-stream error detected, injecting error boundary`);try{n.enqueue(r.encode(N(e,o))),n.enqueue(r.encode(`
32
+ </head>`.trim()}export async function renderToHtml(e,t={},r,i={}){try{let a,s;if(i.forceSSROnly===!0){let t=e.component();a=n(t instanceof Promise?await t:t),s=f(a)}else ({content:a,frameworks:s}=await O(e,i));a=await h(a,i);let c=`<!DOCTYPE html>\n<html lang="en">\n${T({...t,...e.options},s,r)}\n<body>\n${a}\n</body>\n</html>`;return c=o(c),c}catch(e){throw console.error(`Error rendering component:`,e),Error(`Failed to render component`)}}export async function renderToHtmlWithLayouts(e,t,n,r,i={},a,o={}){try{let s=e,c={default:e.component,layoutConfig:s.layoutConfig,loader:s.loader,frontmatter:e.frontmatter},l=await t.resolveAndRender(r,c,n);return l.handlers.length===0?await renderToHtml(e,i,a,o):E(await h(await j(await A(e,r,o),l,c,n,r),o),e,i,a)}catch(t){console.error(`Error rendering component with layouts:`,t);try{return await renderToHtml(e,i,a,o)}catch(e){throw console.error(`Fallback rendering also failed:`,e),Error(`Failed to render component with layouts and fallback failed`)}}}function E(e,t,n,r){if(e.trim().startsWith(`<!DOCTYPE html>`)||e.trim().startsWith(`<html`))return c(e);let i=f(e);return c(`<!DOCTYPE html>\n<html lang="en">\n${T({...n,...t.options},i,r)}\n<body>\n${e}\n</body>\n</html>`)}async function D(e,t,r,i){let a,o;if(i.forceSSROnly===!0){let t=e.component();a=n(t instanceof Promise?await t:t),o=f(a)}else ({content:a,frameworks:o}=await O(e,i));return a=await h(a,i),{head:T({...t,...e.options},o,r),content:a}}async function O(e,t){try{let n=await d().renderWithIsolation({componentPath:`route-component`,component:e.component});if(!n.success)throw Error(`Isolated rendering failed: ${n.errors.join(`, `)}`);return n.warnings.length>0&&!t.suppressWarnings&&n.warnings.forEach(e=>console.warn(`[SSR Isolation] ${e}`)),{content:n.html,frameworks:f(n.html)}}catch(t){console.warn(`[SSR] Isolated rendering failed, falling back to standard rendering:`,t);let r=e.component(),i=n(r instanceof Promise?await r:r);return{content:i,frameworks:f(i)}}}function k(e,t,n,r,i,a=`Streaming Error`,o=`route-component`){if(console.error(`[${a}]`,{message:e.message,stack:e.stack,shellSent:t,timestamp:new Date().toISOString()}),i.onError?.(e),t){console.log(`[${a}] Mid-stream error detected, injecting error boundary`);try{n.enqueue(r.encode(N(e,o))),n.enqueue(r.encode(`
33
33
  </body>
34
34
  </html>`))}catch(e){console.error(`[${a}] Failed to inject error boundary:`,e)}}else i.onShellError?.(e),n.enqueue(r.encode(M(e)));n.close()}export async function renderToHtmlStream(e,t={},n,r={}){let i=new TextEncoder,a=null,o=!1;return new ReadableStream({async start(s){a=s;try{let{head:s,content:c}=await D(e,t,n,r);a.enqueue(i.encode(`<!DOCTYPE html>\n<html lang="en">\n${s}\n<body>\n`)),o=!0,r.onShellReady?.(),a.enqueue(i.encode(c)),a.enqueue(i.encode(`
35
35
  </body>
36
36
  </html>`)),r.onAllReady?.(),a.close()}catch(e){k(e instanceof Error?e:Error(String(e)),o,a,i,r)}},cancel(){try{a?.close()}catch{}}})}export async function renderToHtmlStreamWithLayouts(e,t,n,r,i={},a,o={}){let s=new TextEncoder,l=null,u=!1;return new ReadableStream({async start(d){l=d;try{let d=e,p={default:e.component,layoutConfig:d.layoutConfig,loader:d.loader,frontmatter:e.frontmatter},m=await t.resolveAndRender(r,p,n);if(m.handlers.length===0){let t=(await renderToHtmlStream(e,i,a,o)).getReader();try{for(;;){let{done:e,value:n}=await t.read();if(e)break;l.enqueue(n)}}finally{t.releaseLock()}l.close();return}let g=await h(await j(await A(e,r,o),m,p,n,r),o);if(g.trim().startsWith(`<!DOCTYPE html>`)||g.trim().startsWith(`<html`)){let e=c(g);l.enqueue(s.encode(e)),u=!0,o.onShellReady?.(),o.onAllReady?.(),l.close();return}let _=f(g),v=T({...i,...e.options},_,a);l.enqueue(s.encode(`<!DOCTYPE html>\n<html lang="en">\n${v}\n<body>\n`)),u=!0,o.onShellReady?.(),l.enqueue(s.encode(g)),l.enqueue(s.encode(`
37
37
  </body>
38
- </html>`)),o.onAllReady?.(),l.close()}catch(e){k(e instanceof Error?e:Error(String(e)),u,l,s,o,`Streaming Error with Layouts`,`layout-${r}`)}},cancel(){try{l?.close()}catch{}}})}async function A(e,n,r){if(r.forceSSROnly===!0){let n=e.component();return t(n instanceof Promise?await n:n)}try{let t=await d().renderWithIsolation({componentPath:n,component:e.component});if(!t.success)throw Error(`Isolated rendering failed: ${t.errors.join(`, `)}`);return t.warnings.length>0&&!r.suppressWarnings&&t.warnings.forEach(e=>console.warn(`[SSR Isolation] ${e}`)),t.html}catch(n){console.warn(`[SSR] Isolated page rendering failed, falling back to standard rendering:`,n);let r=e.component();return t(r instanceof Promise?await r:r)}}async function j(n,r,i,a,o){let s=e(`avalon-page-content`,{dangerouslySetInnerHTML:{__html:n}}),c=null;for(let n=r.handlers.length-1;n>=0;n--){let l=r.handlers[n],u={data:r.dataLoaders[n]?await r.dataLoaders[n](a):{},frontmatter:i.frontmatter||{},route:{path:o,params:a.params,query:a.query}},d=l.component,f=d({...u,children:s});if(f instanceof Promise){let r=t(await f);n===0?c=r:s=e(`avalon-layout-fragment`,{dangerouslySetInnerHTML:{__html:r}})}else s=e(d,u,s)}if(c!==null)return c;try{let e=await d().renderWithIsolation({componentPath:`layout-chain-${o}`,component:()=>s});if(e.success)return e.html}catch{}return t(s)}function M(e){let t=process.env.NODE_ENV!==`production`;return`<!DOCTYPE html>
38
+ </html>`)),o.onAllReady?.(),l.close()}catch(e){k(e instanceof Error?e:Error(String(e)),u,l,s,o,`Streaming Error with Layouts`,`layout-${r}`)}},cancel(){try{l?.close()}catch{}}})}async function A(e,t,r){if(r.forceSSROnly===!0){let t=e.component();return n(t instanceof Promise?await t:t)}try{let n=await d().renderWithIsolation({componentPath:t,component:e.component});if(!n.success)throw Error(`Isolated rendering failed: ${n.errors.join(`, `)}`);return n.warnings.length>0&&!r.suppressWarnings&&n.warnings.forEach(e=>console.warn(`[SSR Isolation] ${e}`)),n.html}catch(t){console.warn(`[SSR] Isolated page rendering failed, falling back to standard rendering:`,t);let r=e.component();return n(r instanceof Promise?await r:r)}}async function j(e,r,i,a,o){let s=t(`avalon-page-content`,{dangerouslySetInnerHTML:{__html:e}}),c=null;for(let e=r.handlers.length-1;e>=0;e--){let l=r.handlers[e],u={data:r.dataLoaders[e]?await r.dataLoaders[e](a):{},frontmatter:i.frontmatter||{},route:{path:o,params:a.params,query:a.query}},d=l.component,f=d({...u,children:s});if(f instanceof Promise){let r=n(await f);e===0?c=r:s=t(`avalon-layout-fragment`,{dangerouslySetInnerHTML:{__html:r}})}else s=t(d,u,s)}if(c!==null)return c;try{let e=await d().renderWithIsolation({componentPath:`layout-chain-${o}`,component:()=>s});if(e.success)return e.html}catch{}return n(s)}function M(e){let t=process.env.NODE_ENV!==`production`;return`<!DOCTYPE html>
39
39
  <html lang="en">
40
40
  <head>
41
41
  <meta charset="utf-8">
@@ -1,4 +1,4 @@
1
- import { z } from 'zod';
1
+ import { z } from "zod";
2
2
  /**
3
3
  * Supported HTTP methods for API routes
4
4
  */
@@ -1,4 +1,4 @@
1
- import { z } from 'zod';
1
+ import { z } from "zod";
2
2
  /**
3
3
  * Schema for meta tags
4
4
  */
@@ -1,11 +1,11 @@
1
- import { z } from 'zod';
2
- import type { RenderOptions } from './core.ts';
3
- import type { LayoutContext, LayoutData, LayoutHandler, LayoutDiscoveryOptions, LayoutConfig, ResolvedLayout } from './layout.ts';
4
- import type { FileSystemRoute, RoutePageModule, RouteDiscoveryOptions, FileSystemRouterConfig, Metadata, ResolvedMetadata } from './routing.ts';
5
- export * from './core.ts';
6
- export * from './api.ts';
7
- export * from './layout.ts';
8
- export * from './routing.ts';
1
+ import { z } from "zod";
2
+ import type { RenderOptions } from "./core.ts";
3
+ import type { LayoutConfig, LayoutContext, LayoutData, LayoutDiscoveryOptions, LayoutHandler, ResolvedLayout } from "./layout.ts";
4
+ import type { FileSystemRoute, FileSystemRouterConfig, Metadata, ResolvedMetadata, RouteDiscoveryOptions, RoutePageModule } from "./routing.ts";
5
+ export * from "./api.ts";
6
+ export * from "./core.ts";
7
+ export * from "./layout.ts";
8
+ export * from "./routing.ts";
9
9
  export interface ValidationSuccess<T> {
10
10
  success: true;
11
11
  data: T;
@@ -1 +1 @@
1
- import{z as e}from"zod";import{RenderOptionsSchema as t}from"./core.js";import{LayoutContextSchema as n,LayoutDataSchema as r,LayoutHandlerSchema as i,LayoutDiscoveryOptionsSchema as a,LayoutConfigSchema as o,ResolvedLayoutSchema as s}from"./layout.js";import{FileSystemRouteSchema as c,RoutePageModuleSchema as l,RouteDiscoveryOptionsSchema as u,FileSystemRouterConfigSchema as d,MetadataSchema as f,ResolvedMetadataSchema as p}from"./routing.js";export*from"./core.js";export*from"./api.js";export*from"./layout.js";export*from"./routing.js";export class ValidationError extends Error{constructor(e,t){super(e),this.zodError=t,this.name=`ValidationError`}getFormattedErrors(){return this.zodError.issues.map(e=>`${e.path.length>0?`${e.path.join(`.`)}: `:``}${e.message}`)}getErrorMessage(){return this.getFormattedErrors().join(`; `)}}export function createValidationError(e,t){return new ValidationError(e,t)}export function safeValidate(e,t,n=`Validation failed`){let r=e.safeParse(t);return r.success?{success:!0,data:r.data}:{success:!1,error:createValidationError(n,r.error)}}export function validate(e,t,n=`Validation failed`){let r=e.safeParse(t);if(r.success)return r.data;throw createValidationError(n,r.error)}export const validators={renderOptions:e=>validate(t,e,`Invalid render options`),layoutContext:e=>validate(n,e,`Invalid layout context`),layoutData:e=>validate(r,e,`Invalid layout data`),layoutHandler:e=>validate(i,e,`Invalid layout handler`),layoutDiscoveryOptions:e=>validate(a,e,`Invalid layout discovery options`),layoutConfig:e=>validate(o,e,`Invalid layout config`),resolvedLayout:e=>validate(s,e,`Invalid resolved layout`),fileSystemRoute:e=>validate(c,e,`Invalid file system route`),routePageModule:e=>validate(l,e,`Invalid route page module`),routeDiscoveryOptions:e=>validate(u,e,`Invalid route discovery options`),fileSystemRouterConfig:e=>validate(d,e,`Invalid file system router config`),metadata:e=>validate(f,e,`Invalid metadata`),resolvedMetadata:e=>validate(p,e,`Invalid resolved metadata`)};export const safeValidators={renderOptions:e=>safeValidate(t,e,`Invalid render options`),layoutContext:e=>safeValidate(n,e,`Invalid layout context`),layoutData:e=>safeValidate(r,e,`Invalid layout data`),layoutHandler:e=>safeValidate(i,e,`Invalid layout handler`),layoutDiscoveryOptions:e=>safeValidate(a,e,`Invalid layout discovery options`),layoutConfig:e=>safeValidate(o,e,`Invalid layout config`),resolvedLayout:e=>safeValidate(s,e,`Invalid resolved layout`),fileSystemRoute:e=>safeValidate(c,e,`Invalid file system route`),routePageModule:e=>safeValidate(l,e,`Invalid route page module`),routeDiscoveryOptions:e=>safeValidate(u,e,`Invalid route discovery options`),fileSystemRouterConfig:e=>safeValidate(d,e,`Invalid file system router config`),metadata:e=>safeValidate(f,e,`Invalid metadata`),resolvedMetadata:e=>safeValidate(p,e,`Invalid resolved metadata`)};export const devValidators={renderOptionsSoft:(e,t=`unknown`)=>{let n=safeValidators.renderOptions(e);return n.success?!0:(console.warn(`Render options validation warning in ${t}:`,n.error?.getErrorMessage?.()??`unknown error`),!1)}};export function isValidRenderOptions(e){return safeValidators.renderOptions(e).success}export function isValidFileSystemRoute(e){return safeValidators.fileSystemRoute(e).success}export function isValidRoutePageModule(e){return safeValidators.routePageModule(e).success}export function isValidRouteDiscoveryOptions(e){return safeValidators.routeDiscoveryOptions(e).success}export function isValidFileSystemRouterConfig(e){return safeValidators.fileSystemRouterConfig(e).success}export function isValidMetadata(e){return safeValidators.metadata(e).success}export function isValidResolvedMetadata(e){return safeValidators.resolvedMetadata(e).success}export function validateBatch(e,t){let n={},r=[];for(let[i,a]of Object.entries(e))try{n[i]=validate(a,t[i],`Invalid ${String(i)}`)}catch(e){e instanceof ValidationError?r.push(`${String(i)}: ${e.getErrorMessage()}`):r.push(`${String(i)}: Unknown validation error`)}if(r.length>0)throw Error(`Batch validation failed: ${r.join(`; `)}`);return n}export function safeValidateBatch(t,n){try{return{success:!0,data:validateBatch(t,n)}}catch(t){return{success:!1,error:t instanceof ValidationError?t:createValidationError(`Batch validation failed`,new e.ZodError([{code:`custom`,message:String(t),path:[]}]))}}}
1
+ import{z as e}from"zod";import{RenderOptionsSchema as t}from"./core.js";import{LayoutConfigSchema as n,LayoutContextSchema as r,LayoutDataSchema as i,LayoutDiscoveryOptionsSchema as a,LayoutHandlerSchema as o,ResolvedLayoutSchema as s}from"./layout.js";import{FileSystemRouterConfigSchema as c,FileSystemRouteSchema as l,MetadataSchema as u,ResolvedMetadataSchema as d,RouteDiscoveryOptionsSchema as f,RoutePageModuleSchema as p}from"./routing.js";export*from"./api.js";export*from"./core.js";export*from"./layout.js";export*from"./routing.js";export class ValidationError extends Error{constructor(e,t){super(e),this.zodError=t,this.name=`ValidationError`}getFormattedErrors(){return this.zodError.issues.map(e=>`${e.path.length>0?`${e.path.join(`.`)}: `:``}${e.message}`)}getErrorMessage(){return this.getFormattedErrors().join(`; `)}}export function createValidationError(e,t){return new ValidationError(e,t)}export function safeValidate(e,t,n=`Validation failed`){let r=e.safeParse(t);return r.success?{success:!0,data:r.data}:{success:!1,error:createValidationError(n,r.error)}}export function validate(e,t,n=`Validation failed`){let r=e.safeParse(t);if(r.success)return r.data;throw createValidationError(n,r.error)}export const validators={renderOptions:e=>validate(t,e,`Invalid render options`),layoutContext:e=>validate(r,e,`Invalid layout context`),layoutData:e=>validate(i,e,`Invalid layout data`),layoutHandler:e=>validate(o,e,`Invalid layout handler`),layoutDiscoveryOptions:e=>validate(a,e,`Invalid layout discovery options`),layoutConfig:e=>validate(n,e,`Invalid layout config`),resolvedLayout:e=>validate(s,e,`Invalid resolved layout`),fileSystemRoute:e=>validate(l,e,`Invalid file system route`),routePageModule:e=>validate(p,e,`Invalid route page module`),routeDiscoveryOptions:e=>validate(f,e,`Invalid route discovery options`),fileSystemRouterConfig:e=>validate(c,e,`Invalid file system router config`),metadata:e=>validate(u,e,`Invalid metadata`),resolvedMetadata:e=>validate(d,e,`Invalid resolved metadata`)};export const safeValidators={renderOptions:e=>safeValidate(t,e,`Invalid render options`),layoutContext:e=>safeValidate(r,e,`Invalid layout context`),layoutData:e=>safeValidate(i,e,`Invalid layout data`),layoutHandler:e=>safeValidate(o,e,`Invalid layout handler`),layoutDiscoveryOptions:e=>safeValidate(a,e,`Invalid layout discovery options`),layoutConfig:e=>safeValidate(n,e,`Invalid layout config`),resolvedLayout:e=>safeValidate(s,e,`Invalid resolved layout`),fileSystemRoute:e=>safeValidate(l,e,`Invalid file system route`),routePageModule:e=>safeValidate(p,e,`Invalid route page module`),routeDiscoveryOptions:e=>safeValidate(f,e,`Invalid route discovery options`),fileSystemRouterConfig:e=>safeValidate(c,e,`Invalid file system router config`),metadata:e=>safeValidate(u,e,`Invalid metadata`),resolvedMetadata:e=>safeValidate(d,e,`Invalid resolved metadata`)};export const devValidators={renderOptionsSoft:(e,t=`unknown`)=>{let n=safeValidators.renderOptions(e);return n.success?!0:(console.warn(`Render options validation warning in ${t}:`,n.error?.getErrorMessage?.()??`unknown error`),!1)}};export function isValidRenderOptions(e){return safeValidators.renderOptions(e).success}export function isValidFileSystemRoute(e){return safeValidators.fileSystemRoute(e).success}export function isValidRoutePageModule(e){return safeValidators.routePageModule(e).success}export function isValidRouteDiscoveryOptions(e){return safeValidators.routeDiscoveryOptions(e).success}export function isValidFileSystemRouterConfig(e){return safeValidators.fileSystemRouterConfig(e).success}export function isValidMetadata(e){return safeValidators.metadata(e).success}export function isValidResolvedMetadata(e){return safeValidators.resolvedMetadata(e).success}export function validateBatch(e,t){let n={},r=[];for(let[i,a]of Object.entries(e))try{n[i]=validate(a,t[i],`Invalid ${String(i)}`)}catch(e){e instanceof ValidationError?r.push(`${String(i)}: ${e.getErrorMessage()}`):r.push(`${String(i)}: Unknown validation error`)}if(r.length>0)throw Error(`Batch validation failed: ${r.join(`; `)}`);return n}export function safeValidateBatch(t,n){try{return{success:!0,data:validateBatch(t,n)}}catch(t){return{success:!1,error:t instanceof ValidationError?t:createValidationError(`Batch validation failed`,new e.ZodError([{code:`custom`,message:String(t),path:[]}]))}}}
@@ -1,4 +1,4 @@
1
- export * from '../routing.ts';
1
+ export * from "../routing.ts";
2
2
  export declare const routingValidators: {
3
3
  readonly fileSystemRoute: (data: unknown) => {
4
4
  pattern: any;
@@ -1 +1 @@
1
- export*from"../routing.js";import{FileSystemRouteSchema as e,RoutePageModuleSchema as t,RouteDiscoveryOptionsSchema as n,FileSystemRouterConfigSchema as r,MetadataSchema as i,ResolvedMetadataSchema as a}from"../routing.js";import{validate as o,safeValidate as s}from"../index.js";export const routingValidators={fileSystemRoute:t=>o(e,t,`Invalid file system route`),routePageModule:e=>o(t,e,`Invalid route page module`),routeDiscoveryOptions:e=>o(n,e,`Invalid route discovery options`),fileSystemRouterConfig:e=>o(r,e,`Invalid file system router config`),metadata:e=>o(i,e,`Invalid metadata`),resolvedMetadata:e=>o(a,e,`Invalid resolved metadata`)};export const safeRoutingValidators={fileSystemRoute:t=>s(e,t,`Invalid file system route`),routePageModule:e=>s(t,e,`Invalid route page module`),routeDiscoveryOptions:e=>s(n,e,`Invalid route discovery options`),fileSystemRouterConfig:e=>s(r,e,`Invalid file system router config`),metadata:e=>s(i,e,`Invalid metadata`),resolvedMetadata:e=>s(a,e,`Invalid resolved metadata`)};
1
+ export*from"../routing.js";import{safeValidate as e,validate as t}from"../index.js";import{FileSystemRouterConfigSchema as n,FileSystemRouteSchema as r,MetadataSchema as i,ResolvedMetadataSchema as a,RouteDiscoveryOptionsSchema as o,RoutePageModuleSchema as s}from"../routing.js";export const routingValidators={fileSystemRoute:e=>t(r,e,`Invalid file system route`),routePageModule:e=>t(s,e,`Invalid route page module`),routeDiscoveryOptions:e=>t(o,e,`Invalid route discovery options`),fileSystemRouterConfig:e=>t(n,e,`Invalid file system router config`),metadata:e=>t(i,e,`Invalid metadata`),resolvedMetadata:e=>t(a,e,`Invalid resolved metadata`)};export const safeRoutingValidators={fileSystemRoute:t=>e(r,t,`Invalid file system route`),routePageModule:t=>e(s,t,`Invalid route page module`),routeDiscoveryOptions:t=>e(o,t,`Invalid route discovery options`),fileSystemRouterConfig:t=>e(n,t,`Invalid file system router config`),metadata:t=>e(i,t,`Invalid metadata`),resolvedMetadata:t=>e(a,t,`Invalid resolved metadata`)};
@@ -1,5 +1,5 @@
1
- import { z } from 'zod';
2
- import type { ComponentType } from 'preact/compat';
1
+ import type { ComponentType } from "preact/compat";
2
+ import { z } from "zod";
3
3
  /**
4
4
  * Route Type Schema - Defines the different types of routes supported
5
5
  */
@@ -384,5 +384,5 @@ export declare function isRouteParams(data: unknown): data is RouteParams;
384
384
  * Type guard for FileSystemApiModule
385
385
  */
386
386
  export declare function isFileSystemApiModule(data: unknown): data is FileSystemApiModule;
387
- export type { ExtractRouteParams, ExtractOptionalParams, RouteParameters, TypedPageComponent, TypedPageComponentWithData, TypedMetadataGenerator, TypedPageLoader, TypedApiHandler, TypedApiModule, HasDynamicSegments, HasCatchAllSegments, HasOptionalSegments, CountDynamicSegments, ValidRoutePattern, ValidRouteExtension, PageComponentProps, } from '../types/routing.ts';
388
- export { isValidRouteParams, isValidPageProps, isValidRoutePattern, validatePageComponent, createTypedPageComponent, createTypedMetadataGenerator, createTypedPageLoader, createTypedApiHandler, } from '../types/routing.ts';
387
+ export type { CountDynamicSegments, ExtractOptionalParams, ExtractRouteParams, HasCatchAllSegments, HasDynamicSegments, HasOptionalSegments, PageComponentProps, RouteParameters, TypedApiHandler, TypedApiModule, TypedMetadataGenerator, TypedPageComponent, TypedPageComponentWithData, TypedPageLoader, ValidRouteExtension, ValidRoutePattern, } from "../types/routing.ts";
388
+ export { createTypedApiHandler, createTypedMetadataGenerator, createTypedPageComponent, createTypedPageLoader, isValidPageProps, isValidRouteParams, isValidRoutePattern, validatePageComponent, } from "../types/routing.ts";
@@ -1 +1 @@
1
- import{z as e}from"zod";export const RouteTypeSchema=e.enum([`static`,`dynamic`,`catch-all`,`index`,`group`]);export const FileSystemRouteSchema=e.object({pattern:e.any(),filePath:e.string().min(1),routeType:RouteTypeSchema,dynamicSegments:e.array(e.string()),priority:e.number().int().min(0),isPrivate:e.boolean(),routeGroup:e.string().optional()});export const RoutePageModuleSchema=e.object({default:e.any(),layoutConfig:e.any().optional(),generateMetadata:e.any().optional(),loader:e.any().optional(),frontmatter:e.record(e.string(),e.any()).optional()});export const RouteParamsSchema=e.record(e.string(),e.string());export const LoaderContextSchema=e.object({request:e.instanceof(Request),url:e.instanceof(URL),params:RouteParamsSchema,query:e.instanceof(URLSearchParams),state:e.instanceof(Map)});export const PagePropsSchema=e.object({params:RouteParamsSchema,query:e.instanceof(URLSearchParams),data:e.unknown().optional()});export const MetadataSchema=e.object({title:e.string().optional(),description:e.string().optional(),keywords:e.array(e.string()).optional(),openGraph:e.object({title:e.string().optional(),description:e.string().optional(),image:e.url().optional(),url:e.url().optional(),type:e.string().optional(),siteName:e.string().optional()}).optional(),twitter:e.object({card:e.enum([`summary`,`summary_large_image`,`app`,`player`]).optional(),title:e.string().optional(),description:e.string().optional(),image:e.url().optional(),site:e.string().optional()}).optional(),schema:e.array(e.record(e.string(),e.unknown())).optional(),canonical:e.url().optional(),robots:e.string().optional()});export const ResolvedMetadataSchema=MetadataSchema.extend({sources:e.array(e.string()).optional(),resolvedAt:e.number().optional()});export const MetadataChainSchema=e.object({global:MetadataSchema.optional(),sections:e.array(e.object({path:e.string(),metadata:MetadataSchema})),page:MetadataSchema.optional()});export const RouteDiscoveryOptionsSchema=e.object({pagesDirectory:e.string().min(1).default(`src/pages`),apiDirectory:e.string().min(1).default(`src/api`),extensions:e.array(e.string()).default([`.tsx`,`.ts`,`.jsx`,`.js`]),excludeDirectories:e.array(e.string()).default([`node_modules`,`.git`]),enableWatching:e.boolean().default(!1),developmentMode:e.boolean().default(!1),quietMode:e.boolean().default(!1)});export const FileSystemRouterConfigSchema=e.object({discovery:RouteDiscoveryOptionsSchema.optional(),enabled:e.boolean().default(!0),fallbackToManual:e.boolean().default(!0),enableCaching:e.boolean().default(!0),cacheTTL:e.number().positive().default(3e5)});export const PageFileSchema=e.object({filePath:e.string().min(1),relativePath:e.string().min(1),extension:e.string().min(1),isPrivate:e.boolean(),routeGroup:e.string().optional(),mtime:e.number().optional()});export const RouteHandlerSchema=e.object({pattern:e.any(),handler:e.any(),metadata:e.object({filePath:e.string(),routeType:RouteTypeSchema,priority:e.number(),dynamicSegments:e.array(e.string())})});export const RouteCacheEntrySchema=e.object({routes:e.array(FileSystemRouteSchema),timestamp:e.number(),fileMtimes:e.record(e.string(),e.number())});export const FileSystemApiRouteSchema=e.object({pattern:e.any(),filePath:e.string().min(1),methods:e.array(e.enum([`GET`,`POST`,`PUT`,`DELETE`,`PATCH`,`HEAD`,`OPTIONS`])),priority:e.number().int().min(0),dynamicSegments:e.array(e.string())});export const FileSystemApiModuleSchema=e.object({GET:e.any().optional(),POST:e.any().optional(),PUT:e.any().optional(),DELETE:e.any().optional(),PATCH:e.any().optional(),HEAD:e.any().optional(),OPTIONS:e.any().optional()});export function isFileSystemRoute(e){return FileSystemRouteSchema.safeParse(e).success}export function isRoutePageModule(e){return RoutePageModuleSchema.safeParse(e).success}export function isMetadata(e){return MetadataSchema.safeParse(e).success}export function isRouteParams(e){return RouteParamsSchema.safeParse(e).success}export function isFileSystemApiModule(e){return FileSystemApiModuleSchema.safeParse(e).success}export{isValidRouteParams,isValidPageProps,isValidRoutePattern,validatePageComponent,createTypedPageComponent,createTypedMetadataGenerator,createTypedPageLoader,createTypedApiHandler}from"../types/routing.js";
1
+ import{z as e}from"zod";export const RouteTypeSchema=e.enum([`static`,`dynamic`,`catch-all`,`index`,`group`]);export const FileSystemRouteSchema=e.object({pattern:e.any(),filePath:e.string().min(1),routeType:RouteTypeSchema,dynamicSegments:e.array(e.string()),priority:e.number().int().min(0),isPrivate:e.boolean(),routeGroup:e.string().optional()});export const RoutePageModuleSchema=e.object({default:e.any(),layoutConfig:e.any().optional(),generateMetadata:e.any().optional(),loader:e.any().optional(),frontmatter:e.record(e.string(),e.any()).optional()});export const RouteParamsSchema=e.record(e.string(),e.string());export const LoaderContextSchema=e.object({request:e.instanceof(Request),url:e.instanceof(URL),params:RouteParamsSchema,query:e.instanceof(URLSearchParams),state:e.instanceof(Map)});export const PagePropsSchema=e.object({params:RouteParamsSchema,query:e.instanceof(URLSearchParams),data:e.unknown().optional()});export const MetadataSchema=e.object({title:e.string().optional(),description:e.string().optional(),keywords:e.array(e.string()).optional(),openGraph:e.object({title:e.string().optional(),description:e.string().optional(),image:e.url().optional(),url:e.url().optional(),type:e.string().optional(),siteName:e.string().optional()}).optional(),twitter:e.object({card:e.enum([`summary`,`summary_large_image`,`app`,`player`]).optional(),title:e.string().optional(),description:e.string().optional(),image:e.url().optional(),site:e.string().optional()}).optional(),schema:e.array(e.record(e.string(),e.unknown())).optional(),canonical:e.url().optional(),robots:e.string().optional()});export const ResolvedMetadataSchema=MetadataSchema.extend({sources:e.array(e.string()).optional(),resolvedAt:e.number().optional()});export const MetadataChainSchema=e.object({global:MetadataSchema.optional(),sections:e.array(e.object({path:e.string(),metadata:MetadataSchema})),page:MetadataSchema.optional()});export const RouteDiscoveryOptionsSchema=e.object({pagesDirectory:e.string().min(1).default(`src/pages`),apiDirectory:e.string().min(1).default(`src/api`),extensions:e.array(e.string()).default([`.tsx`,`.ts`,`.jsx`,`.js`]),excludeDirectories:e.array(e.string()).default([`node_modules`,`.git`]),enableWatching:e.boolean().default(!1),developmentMode:e.boolean().default(!1),quietMode:e.boolean().default(!1)});export const FileSystemRouterConfigSchema=e.object({discovery:RouteDiscoveryOptionsSchema.optional(),enabled:e.boolean().default(!0),fallbackToManual:e.boolean().default(!0),enableCaching:e.boolean().default(!0),cacheTTL:e.number().positive().default(3e5)});export const PageFileSchema=e.object({filePath:e.string().min(1),relativePath:e.string().min(1),extension:e.string().min(1),isPrivate:e.boolean(),routeGroup:e.string().optional(),mtime:e.number().optional()});export const RouteHandlerSchema=e.object({pattern:e.any(),handler:e.any(),metadata:e.object({filePath:e.string(),routeType:RouteTypeSchema,priority:e.number(),dynamicSegments:e.array(e.string())})});export const RouteCacheEntrySchema=e.object({routes:e.array(FileSystemRouteSchema),timestamp:e.number(),fileMtimes:e.record(e.string(),e.number())});export const FileSystemApiRouteSchema=e.object({pattern:e.any(),filePath:e.string().min(1),methods:e.array(e.enum([`GET`,`POST`,`PUT`,`DELETE`,`PATCH`,`HEAD`,`OPTIONS`])),priority:e.number().int().min(0),dynamicSegments:e.array(e.string())});export const FileSystemApiModuleSchema=e.object({GET:e.any().optional(),POST:e.any().optional(),PUT:e.any().optional(),DELETE:e.any().optional(),PATCH:e.any().optional(),HEAD:e.any().optional(),OPTIONS:e.any().optional()});export function isFileSystemRoute(e){return FileSystemRouteSchema.safeParse(e).success}export function isRoutePageModule(e){return RoutePageModuleSchema.safeParse(e).success}export function isMetadata(e){return MetadataSchema.safeParse(e).success}export function isRouteParams(e){return RouteParamsSchema.safeParse(e).success}export function isFileSystemApiModule(e){return FileSystemApiModuleSchema.safeParse(e).success}export{createTypedApiHandler,createTypedMetadataGenerator,createTypedPageComponent,createTypedPageLoader,isValidPageProps,isValidRouteParams,isValidRoutePattern,validatePageComponent}from"../types/routing.js";
@@ -14,93 +14,93 @@
14
14
  */
15
15
 
16
16
  declare module "*.jpg" {
17
- const src: string;
18
- export default src;
17
+ const src: string;
18
+ export default src;
19
19
  }
20
20
 
21
21
  declare module "*.jpeg" {
22
- const src: string;
23
- export default src;
22
+ const src: string;
23
+ export default src;
24
24
  }
25
25
 
26
26
  declare module "*.png" {
27
- const src: string;
28
- export default src;
27
+ const src: string;
28
+ export default src;
29
29
  }
30
30
 
31
31
  declare module "*.webp" {
32
- const src: string;
33
- export default src;
32
+ const src: string;
33
+ export default src;
34
34
  }
35
35
 
36
36
  declare module "*.avif" {
37
- const src: string;
38
- export default src;
37
+ const src: string;
38
+ export default src;
39
39
  }
40
40
 
41
41
  declare module "*.gif" {
42
- const src: string;
43
- export default src;
42
+ const src: string;
43
+ export default src;
44
44
  }
45
45
 
46
46
  declare module "*.tiff" {
47
- const src: string;
48
- export default src;
47
+ const src: string;
48
+ export default src;
49
49
  }
50
50
 
51
51
  declare module "*.svg" {
52
- const src: string;
53
- export default src;
52
+ const src: string;
53
+ export default src;
54
54
  }
55
55
 
56
56
  // vite-imagetools srcset output
57
57
  interface ImageToolsSrcset {
58
- src: string;
59
- srcset: string;
60
- width: number;
61
- height: number;
58
+ src: string;
59
+ srcset: string;
60
+ width: number;
61
+ height: number;
62
62
  }
63
63
 
64
64
  declare module "*&as=srcset" {
65
- const srcset: ImageToolsSrcset;
66
- export default srcset;
65
+ const srcset: ImageToolsSrcset;
66
+ export default srcset;
67
67
  }
68
68
 
69
69
  declare module "*?as=srcset" {
70
- const srcset: ImageToolsSrcset;
71
- export default srcset;
70
+ const srcset: ImageToolsSrcset;
71
+ export default srcset;
72
72
  }
73
73
 
74
74
  // vite-imagetools picture output (multiple formats)
75
75
  interface ImageToolsPicture {
76
- sources: Record<string, ImageToolsSrcset>;
77
- img: ImageToolsSrcset;
76
+ sources: Record<string, ImageToolsSrcset>;
77
+ img: ImageToolsSrcset;
78
78
  }
79
79
 
80
80
  declare module "*&as=picture" {
81
- const picture: ImageToolsPicture;
82
- export default picture;
81
+ const picture: ImageToolsPicture;
82
+ export default picture;
83
83
  }
84
84
 
85
85
  declare module "*?as=picture" {
86
- const picture: ImageToolsPicture;
87
- export default picture;
86
+ const picture: ImageToolsPicture;
87
+ export default picture;
88
88
  }
89
89
 
90
90
  // vite-imagetools metadata output
91
91
  interface ImageToolsMetadata {
92
- src: string;
93
- width: number;
94
- height: number;
95
- format: string;
92
+ src: string;
93
+ width: number;
94
+ height: number;
95
+ format: string;
96
96
  }
97
97
 
98
98
  declare module "*&as=metadata" {
99
- const metadata: ImageToolsMetadata;
100
- export default metadata;
99
+ const metadata: ImageToolsMetadata;
100
+ export default metadata;
101
101
  }
102
102
 
103
103
  declare module "*?as=metadata" {
104
- const metadata: ImageToolsMetadata;
105
- export default metadata;
104
+ const metadata: ImageToolsMetadata;
105
+ export default metadata;
106
106
  }
@@ -4,29 +4,29 @@
4
4
  * Automatically included via tsconfig.json `compilerOptions.types`.
5
5
  */
6
6
 
7
- import type { IslandDirective } from './island-prop.d.ts';
7
+ import type { IslandDirective } from "./island-prop.d.ts";
8
8
 
9
9
  /** Force TypeScript to expand the type inline on hover instead of showing the alias name */
10
10
  type Expand<T> = T extends infer O ? { [K in keyof O]: O[K] } : never;
11
11
 
12
- declare module 'preact' {
13
- namespace JSX {
14
- interface IntrinsicAttributes {
15
- island?: Expand<IslandDirective>;
16
- }
17
- }
12
+ declare module "preact" {
13
+ namespace JSX {
14
+ interface IntrinsicAttributes {
15
+ island?: Expand<IslandDirective>;
16
+ }
17
+ }
18
18
  }
19
19
 
20
20
  declare global {
21
- namespace JSX {
22
- interface IntrinsicAttributes {
23
- island?: Expand<IslandDirective>;
24
- }
25
- }
21
+ namespace JSX {
22
+ interface IntrinsicAttributes {
23
+ island?: Expand<IslandDirective>;
24
+ }
25
+ }
26
26
  }
27
27
 
28
- declare module '@vue/runtime-core' {
29
- interface ComponentCustomProps {
30
- island?: Expand<IslandDirective>;
31
- }
28
+ declare module "@vue/runtime-core" {
29
+ interface ComponentCustomProps {
30
+ island?: Expand<IslandDirective>;
31
+ }
32
32
  }
@@ -1,6 +1,6 @@
1
- import type { ComponentType } from 'preact';
1
+ import type { ComponentType } from "preact";
2
2
 
3
- declare module '*.mdx' {
3
+ declare module "*.mdx" {
4
4
  const MDXComponent: ComponentType<Record<string, unknown>>;
5
5
  export default MDXComponent;
6
6
  }
@@ -4,9 +4,9 @@
4
4
  * This module provides strongly typed interfaces, utility types, and type guards
5
5
  * for the file-system routing system, ensuring type safety throughout the routing pipeline.
6
6
  */
7
- import type { ComponentType } from 'preact';
8
- import type { LoaderContext, Metadata } from '../schemas/routing.ts';
9
- import type { LayoutConfig } from '../schemas/layout.ts';
7
+ import type { ComponentType } from "preact";
8
+ import type { LayoutConfig } from "../schemas/layout.ts";
9
+ import type { LoaderContext, Metadata } from "../schemas/routing.ts";
10
10
  /**
11
11
  * Extract route parameters from a route pattern string
12
12
  *
@@ -170,7 +170,7 @@ export type ValidRoutePattern<T extends string> = T extends `${string}[${string}
170
170
  /**
171
171
  * Valid file extensions for routes
172
172
  */
173
- export type ValidRouteExtension = '.tsx' | '.ts' | '.jsx' | '.js';
173
+ export type ValidRouteExtension = ".tsx" | ".ts" | ".jsx" | ".js";
174
174
  /**
175
175
  * Route file path validation
176
176
  */
@@ -212,11 +212,11 @@ export type GetStaticParts<T extends string> = T extends `${infer Static}[${stri
212
212
  /**
213
213
  * Count dynamic segments in a route
214
214
  */
215
- export type CountDynamicSegments<T extends string, Count extends readonly unknown[] = []> = T extends `${string}[${string}]${infer Rest}` ? CountDynamicSegments<Rest, [...Count, unknown]> : Count['length'];
215
+ export type CountDynamicSegments<T extends string, Count extends readonly unknown[] = []> = T extends `${string}[${string}]${infer Rest}` ? CountDynamicSegments<Rest, [...Count, unknown]> : Count["length"];
216
216
  /**
217
217
  * Route error types
218
218
  */
219
- export type RouteErrorType = 'ROUTE_NOT_FOUND' | 'INVALID_PARAMS' | 'LOADER_ERROR' | 'METADATA_ERROR' | 'COMPONENT_ERROR' | 'VALIDATION_ERROR';
219
+ export type RouteErrorType = "ROUTE_NOT_FOUND" | "INVALID_PARAMS" | "LOADER_ERROR" | "METADATA_ERROR" | "COMPONENT_ERROR" | "VALIDATION_ERROR";
220
220
  /**
221
221
  * Route error with context
222
222
  */
@@ -294,4 +294,4 @@ export declare function validatePageComponent<TRoute extends string>(component:
294
294
  * Create a typed API handler with parameter validation
295
295
  */
296
296
  export declare function createTypedApiHandler<TRoute extends string>(handler: TypedApiHandler<TRoute>, expectedParams: (keyof RouteParameters<TRoute>)[]): TypedApiHandler<TRoute>;
297
- export type { RouteParams, LoaderContext, Metadata, PageProps, RoutePageModule, FileSystemRoute, ResolvedMetadata, } from '../schemas/routing.ts';
297
+ export type { FileSystemRoute, LoaderContext, Metadata, PageProps, ResolvedMetadata, RoutePageModule, RouteParams, } from "../schemas/routing.ts";
@@ -1 +1 @@
1
- import{h as e}from"preact";import t from"node:process";export function isValidRouteParams(e,t){if(!e||typeof e!=`object`)return!1;let n=e;for(let e of t){let t=n[e];if(t===void 0||typeof t!=`string`&&!Array.isArray(t)||Array.isArray(t)&&!t.every(e=>typeof e==`string`))return!1}return!0}export function isValidPageProps(e,t){if(!e||typeof e!=`object`)return!1;let r=e;return!(!r.params||!r.query||!isValidRouteParams(r.params,t)||!(r.query instanceof URLSearchParams))}export function isValidRoutePattern(e){let t=e.match(/\[([^\]]+)\]/g);if(t)for(let e of t){let t=e.slice(1,-1);if(!/^[a-zA-Z_]\w*(\?)?$/.test(t)&&!/^\.\.\.[a-zA-Z_]\w*$/.test(t))return!1}let n=e.match(/\(([^)]+)\)/g);if(n)for(let e of n){let t=e.slice(1,-1);if(!/^[a-zA-Z_]\w*-*\w*$/.test(t))return!1}return!0}export function createTypedPageComponent(n,i){return a=>(t.env?.NODE_ENV===`development`&&(isValidPageProps(a,i)||console.warn(`Invalid props passed to typed page component:`,a)),e(n,a))}export function createTypedMetadataGenerator(e,r){return async i=>(t.env?.NODE_ENV===`development`&&(isValidRouteParams(i,r)||console.warn(`Invalid params passed to typed metadata generator:`,i)),await e(i))}export function createTypedPageLoader(e,r){return async i=>(t.env?.NODE_ENV===`development`&&(isValidRouteParams(i.params,r)||console.warn(`Invalid params passed to typed page loader:`,i.params)),await e(i))}export function validatePageComponent(e,t){return typeof e==`function`}export function createTypedApiHandler(e,r){return async(i,a)=>(t.env?.NODE_ENV===`development`&&(isValidRouteParams(a.params,r)||console.warn(`Invalid params passed to typed API handler:`,a.params)),await e(i,a))}
1
+ import e from"node:process";import{h as t}from"preact";export function isValidRouteParams(e,t){if(!e||typeof e!=`object`)return!1;let n=e;for(let e of t){let t=n[e];if(t===void 0||typeof t!=`string`&&!Array.isArray(t)||Array.isArray(t)&&!t.every(e=>typeof e==`string`))return!1}return!0}export function isValidPageProps(e,t){if(!e||typeof e!=`object`)return!1;let r=e;return!(!r.params||!r.query||!isValidRouteParams(r.params,t)||!(r.query instanceof URLSearchParams))}export function isValidRoutePattern(e){let t=e.match(/\[([^\]]+)\]/g);if(t)for(let e of t){let t=e.slice(1,-1);if(!/^[a-zA-Z_]\w*(\?)?$/.test(t)&&!/^\.\.\.[a-zA-Z_]\w*$/.test(t))return!1}let n=e.match(/\(([^)]+)\)/g);if(n)for(let e of n){let t=e.slice(1,-1);if(!/^[a-zA-Z_]\w*-*\w*$/.test(t))return!1}return!0}export function createTypedPageComponent(n,i){return a=>(e.env?.NODE_ENV===`development`&&(isValidPageProps(a,i)||console.warn(`Invalid props passed to typed page component:`,a)),t(n,a))}export function createTypedMetadataGenerator(t,r){return async i=>(e.env?.NODE_ENV===`development`&&(isValidRouteParams(i,r)||console.warn(`Invalid params passed to typed metadata generator:`,i)),await t(i))}export function createTypedPageLoader(t,r){return async i=>(e.env?.NODE_ENV===`development`&&(isValidRouteParams(i.params,r)||console.warn(`Invalid params passed to typed page loader:`,i.params)),await t(i))}export function validatePageComponent(e,t){return typeof e==`function`}export function createTypedApiHandler(t,r){return async(i,a)=>(e.env?.NODE_ENV===`development`&&(isValidRouteParams(a.params,r)||console.warn(`Invalid params passed to typed API handler:`,a.params)),await t(i,a))}
@@ -24,7 +24,7 @@ declare module "virtual:avalon/config" {
24
24
  }
25
25
 
26
26
  declare module "virtual:avalon/layouts" {
27
- import type { PageModule, NitroRenderContext } from "@useavalon/avalon/nitro/types";
27
+ import type { NitroRenderContext, PageModule } from "@useavalon/avalon/nitro/types";
28
28
  export function wrapWithLayouts(
29
29
  pageHtml: string,
30
30
  pageModule: PageModule,
@@ -7,5 +7,5 @@ interface ImportMetaEnv {
7
7
 
8
8
  interface ImportMeta {
9
9
  readonly env: ImportMetaEnv;
10
- readonly hot?: import('vite/types/hot').ViteHotContext;
10
+ readonly hot?: import("vite/types/hot").ViteHotContext;
11
11
  }