@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.
- package/dist/src/build/integration-bundler-plugin.d.ts +1 -1
- package/dist/src/build/integration-detection-plugin.d.ts +1 -1
- package/dist/src/build/integration-detection-plugin.js +1 -1
- package/dist/src/build/integration-resolver-plugin.d.ts +1 -1
- package/dist/src/build/island-code-splitting.d.ts +1 -1
- package/dist/src/build/island-manifest.d.ts +2 -2
- package/dist/src/build/island-manifest.js +1 -1
- package/dist/src/build/island-types-generator.js +4 -4
- package/dist/src/build/mdx-island-transform.js +1 -1
- package/dist/src/build/mdx-plugin.d.ts +2 -2
- package/dist/src/build/prop-extractors/index.d.ts +3 -3
- package/dist/src/build/prop-extractors/index.js +1 -1
- package/dist/src/build/prop-extractors/lit.js +1 -1
- package/dist/src/build/prop-extractors/svelte.js +1 -1
- package/dist/src/build/sidecar-file-manager.js +1 -1
- package/dist/src/client/adapters/index.d.ts +1 -1
- package/dist/src/client/adapters/index.js +1 -1
- package/dist/src/client/css-hmr-handler.d.ts +2 -2
- package/dist/src/client/framework-adapter.d.ts +2 -2
- package/dist/src/client/hmr-coordinator.d.ts +6 -6
- package/dist/src/client/main.js +1 -1
- package/dist/src/client/types/framework-runtime.d.ts +54 -55
- package/dist/src/client/types/vite-hmr.d.ts +35 -35
- package/dist/src/client/types/vite-virtual-modules.d.ts +56 -28
- package/dist/src/core/components/component-analyzer.d.ts +3 -3
- package/dist/src/core/components/component-analyzer.js +1 -1
- package/dist/src/core/components/component-detection.d.ts +8 -8
- package/dist/src/core/components/component-detection.js +1 -1
- package/dist/src/core/components/enhanced-framework-detector.d.ts +2 -2
- package/dist/src/core/components/enhanced-framework-detector.js +1 -1
- package/dist/src/core/components/framework-registry.d.ts +1 -1
- package/dist/src/core/integrations/index.d.ts +1 -1
- package/dist/src/core/integrations/index.js +1 -1
- package/dist/src/core/integrations/registry.js +1 -1
- package/dist/src/core/layout/enhanced-layout-resolver.d.ts +8 -8
- package/dist/src/core/layout/enhanced-layout-resolver.js +1 -1
- package/dist/src/core/layout/layout-cache-manager.d.ts +1 -1
- package/dist/src/core/layout/layout-composer.d.ts +2 -2
- package/dist/src/core/layout/layout-composer.js +1 -1
- package/dist/src/core/layout/layout-data-loader.d.ts +2 -2
- package/dist/src/core/layout/layout-discovery.d.ts +2 -2
- package/dist/src/core/layout/layout-discovery.js +1 -1
- package/dist/src/core/layout/layout-matcher.d.ts +1 -1
- package/dist/src/core/layout/layout-matcher.js +1 -1
- package/dist/src/core/layout/layout-types.d.ts +3 -3
- package/dist/src/islands/component-analysis.d.ts +4 -4
- package/dist/src/islands/component-analysis.js +1 -1
- package/dist/src/islands/critical-css.js +3 -3
- package/dist/src/islands/css-utils.js +1 -1
- package/dist/src/islands/discovery/index.d.ts +9 -9
- package/dist/src/islands/discovery/index.js +1 -1
- package/dist/src/islands/discovery/registry.d.ts +1 -1
- package/dist/src/islands/discovery/resolver.d.ts +1 -1
- package/dist/src/islands/discovery/resolver.js +2 -2
- package/dist/src/islands/discovery/scanner.d.ts +1 -1
- package/dist/src/islands/discovery/scanner.js +1 -1
- package/dist/src/islands/discovery/validator.d.ts +1 -1
- package/dist/src/islands/discovery/validator.js +9 -9
- package/dist/src/islands/discovery/watcher.d.ts +1 -1
- package/dist/src/islands/discovery/watcher.js +1 -1
- package/dist/src/islands/framework-base-css.d.ts +36 -0
- package/dist/src/islands/framework-base-css.js +1 -0
- package/dist/src/islands/framework-detection.d.ts +3 -3
- package/dist/src/islands/framework-detection.js +1 -1
- package/dist/src/islands/island.js +1 -1
- package/dist/src/islands/per-island-script.js +1 -1
- package/dist/src/islands/universal-head-collector.d.ts +2 -2
- package/dist/src/middleware/discovery.d.ts +1 -1
- package/dist/src/middleware/discovery.js +1 -1
- package/dist/src/middleware/executor.d.ts +2 -2
- package/dist/src/middleware/index.d.ts +3 -3
- package/dist/src/middleware/index.js +1 -1
- package/dist/src/middleware/types.d.ts +2 -2
- package/dist/src/nitro/error-handler.d.ts +2 -2
- package/dist/src/nitro/error-handler.js +2 -2
- package/dist/src/nitro/index.d.ts +8 -8
- package/dist/src/nitro/index.js +1 -1
- package/dist/src/nitro/island-manifest.d.ts +1 -1
- package/dist/src/nitro/island-manifest.js +1 -1
- package/dist/src/nitro/middleware-adapter.d.ts +2 -2
- package/dist/src/nitro/types.d.ts +4 -4
- package/dist/src/render/isolated-ssr-renderer.d.ts +2 -2
- package/dist/src/render/isolated-ssr-renderer.js +1 -1
- package/dist/src/render/ssr.d.ts +5 -5
- package/dist/src/render/ssr.js +4 -4
- package/dist/src/schemas/api.d.ts +1 -1
- package/dist/src/schemas/core.d.ts +1 -1
- package/dist/src/schemas/index.d.ts +8 -8
- package/dist/src/schemas/index.js +1 -1
- package/dist/src/schemas/routing/index.d.ts +1 -1
- package/dist/src/schemas/routing/index.js +1 -1
- package/dist/src/schemas/routing.d.ts +4 -4
- package/dist/src/schemas/routing.js +1 -1
- package/dist/src/types/image.d.ts +38 -38
- package/dist/src/types/island-jsx.d.ts +16 -16
- package/dist/src/types/mdx.d.ts +2 -2
- package/dist/src/types/routing.d.ts +7 -7
- package/dist/src/types/routing.js +1 -1
- package/dist/src/types/virtual-modules.d.ts +1 -1
- package/dist/src/types/vite-env.d.ts +1 -1
- package/dist/src/vite-plugin/auto-discover.js +1 -1
- package/dist/src/vite-plugin/config.d.ts +1 -1
- package/dist/src/vite-plugin/image-optimization.d.ts +2 -2
- package/dist/src/vite-plugin/image-optimization.js +1 -1
- package/dist/src/vite-plugin/island-sidecar-plugin.js +1 -1
- package/dist/src/vite-plugin/module-discovery.js +1 -1
- package/dist/src/vite-plugin/nitro-integration.js +1 -1
- package/dist/src/vite-plugin/plugin.d.ts +2 -2
- package/dist/src/vite-plugin/plugin.js +1 -1
- package/dist/src/vite-plugin/types.d.ts +1 -2
- package/package.json +3 -2
- package/dist/src/client/main-slim.js +0 -1
- 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 {
|
|
16
|
-
import type {
|
|
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
|
|
11
|
-
import type { ApiMethod } from
|
|
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:
|
|
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:
|
|
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
|
|
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:
|
|
19
|
+
errorHandling: "strict" | "fallback" | "ignore";
|
|
20
20
|
debugLogging: boolean;
|
|
21
21
|
}
|
|
22
22
|
export interface IsolatedRenderRequest {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
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`]}}
|
package/dist/src/render/ssr.d.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { type JSX } from
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
4
|
-
import type { LayoutContext } from
|
|
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:
|
|
11
|
+
type: "hydrate" | "ssr-only";
|
|
12
12
|
reason: string;
|
|
13
13
|
warnings?: string[];
|
|
14
14
|
}
|
package/dist/src/render/ssr.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{
|
|
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(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`).replaceAll(`"`,`"`).replaceAll(`'`,`'`)}function T(e,t,n){let
|
|
10
|
+
<\/script>`:``}function w(e){return e.replaceAll(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`).replaceAll(`"`,`"`).replaceAll(`'`,`'`)}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,
|
|
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,
|
|
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,11 +1,11 @@
|
|
|
1
|
-
import { z } from
|
|
2
|
-
import type { RenderOptions } from
|
|
3
|
-
import type { LayoutContext, LayoutData,
|
|
4
|
-
import type { FileSystemRoute,
|
|
5
|
-
export * from
|
|
6
|
-
export * from
|
|
7
|
-
export * from
|
|
8
|
-
export * from
|
|
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{
|
|
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 +1 @@
|
|
|
1
|
-
export*from"../routing.js";import{
|
|
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 {
|
|
2
|
-
import
|
|
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 {
|
|
388
|
-
export {
|
|
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{
|
|
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
|
-
|
|
18
|
-
|
|
17
|
+
const src: string;
|
|
18
|
+
export default src;
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
declare module "*.jpeg" {
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
const src: string;
|
|
23
|
+
export default src;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
declare module "*.png" {
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
const src: string;
|
|
28
|
+
export default src;
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
declare module "*.webp" {
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
const src: string;
|
|
33
|
+
export default src;
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
declare module "*.avif" {
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
const src: string;
|
|
38
|
+
export default src;
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
declare module "*.gif" {
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
const src: string;
|
|
43
|
+
export default src;
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
declare module "*.tiff" {
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
const src: string;
|
|
48
|
+
export default src;
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
declare module "*.svg" {
|
|
52
|
-
|
|
53
|
-
|
|
52
|
+
const src: string;
|
|
53
|
+
export default src;
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
// vite-imagetools srcset output
|
|
57
57
|
interface ImageToolsSrcset {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
58
|
+
src: string;
|
|
59
|
+
srcset: string;
|
|
60
|
+
width: number;
|
|
61
|
+
height: number;
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
declare module "*&as=srcset" {
|
|
65
|
-
|
|
66
|
-
|
|
65
|
+
const srcset: ImageToolsSrcset;
|
|
66
|
+
export default srcset;
|
|
67
67
|
}
|
|
68
68
|
|
|
69
69
|
declare module "*?as=srcset" {
|
|
70
|
-
|
|
71
|
-
|
|
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
|
-
|
|
77
|
-
|
|
76
|
+
sources: Record<string, ImageToolsSrcset>;
|
|
77
|
+
img: ImageToolsSrcset;
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
declare module "*&as=picture" {
|
|
81
|
-
|
|
82
|
-
|
|
81
|
+
const picture: ImageToolsPicture;
|
|
82
|
+
export default picture;
|
|
83
83
|
}
|
|
84
84
|
|
|
85
85
|
declare module "*?as=picture" {
|
|
86
|
-
|
|
87
|
-
|
|
86
|
+
const picture: ImageToolsPicture;
|
|
87
|
+
export default picture;
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
// vite-imagetools metadata output
|
|
91
91
|
interface ImageToolsMetadata {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
92
|
+
src: string;
|
|
93
|
+
width: number;
|
|
94
|
+
height: number;
|
|
95
|
+
format: string;
|
|
96
96
|
}
|
|
97
97
|
|
|
98
98
|
declare module "*&as=metadata" {
|
|
99
|
-
|
|
100
|
-
|
|
99
|
+
const metadata: ImageToolsMetadata;
|
|
100
|
+
export default metadata;
|
|
101
101
|
}
|
|
102
102
|
|
|
103
103
|
declare module "*?as=metadata" {
|
|
104
|
-
|
|
105
|
-
|
|
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
|
|
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
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
21
|
+
namespace JSX {
|
|
22
|
+
interface IntrinsicAttributes {
|
|
23
|
+
island?: Expand<IslandDirective>;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
declare module
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
declare module "@vue/runtime-core" {
|
|
29
|
+
interface ComponentCustomProps {
|
|
30
|
+
island?: Expand<IslandDirective>;
|
|
31
|
+
}
|
|
32
32
|
}
|
package/dist/src/types/mdx.d.ts
CHANGED
|
@@ -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
|
|
8
|
-
import type {
|
|
9
|
-
import type {
|
|
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 =
|
|
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[
|
|
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 =
|
|
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 {
|
|
297
|
+
export type { FileSystemRoute, LoaderContext, Metadata, PageProps, ResolvedMetadata, RoutePageModule, RouteParams, } from "../schemas/routing.ts";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
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 {
|
|
27
|
+
import type { NitroRenderContext, PageModule } from "@useavalon/avalon/nitro/types";
|
|
28
28
|
export function wrapWithLayouts(
|
|
29
29
|
pageHtml: string,
|
|
30
30
|
pageModule: PageModule,
|