@useavalon/avalon 0.1.12 → 0.1.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/mod.ts +302 -0
- package/package.json +9 -17
- package/src/build/integration-bundler-plugin.ts +116 -0
- package/src/build/integration-config.ts +168 -0
- package/src/build/integration-detection-plugin.ts +117 -0
- package/src/build/integration-resolver-plugin.ts +90 -0
- package/src/build/island-manifest.ts +269 -0
- package/src/build/island-types-generator.ts +476 -0
- package/src/build/mdx-island-transform.ts +464 -0
- package/src/build/mdx-plugin.ts +98 -0
- package/src/build/page-island-transform.ts +598 -0
- package/src/build/prop-extractors/index.ts +21 -0
- package/src/build/prop-extractors/lit.ts +140 -0
- package/src/build/prop-extractors/qwik.ts +16 -0
- package/src/build/prop-extractors/solid.ts +125 -0
- package/src/build/prop-extractors/svelte.ts +194 -0
- package/src/build/prop-extractors/vue.ts +111 -0
- package/src/build/sidecar-file-manager.ts +104 -0
- package/src/build/sidecar-renderer.ts +30 -0
- package/src/client/adapters/index.ts +21 -0
- package/src/client/components.ts +35 -0
- package/src/client/css-hmr-handler.ts +344 -0
- package/src/client/framework-adapter.ts +462 -0
- package/src/client/hmr-coordinator.ts +396 -0
- package/src/client/hmr-error-overlay.js +533 -0
- package/src/client/main.js +824 -0
- package/src/components/Image.tsx +123 -0
- package/src/components/IslandErrorBoundary.tsx +145 -0
- package/src/components/LayoutDataErrorBoundary.tsx +141 -0
- package/src/components/LayoutErrorBoundary.tsx +127 -0
- package/src/components/PersistentIsland.tsx +52 -0
- package/src/components/StreamingErrorBoundary.tsx +233 -0
- package/src/components/StreamingLayout.tsx +538 -0
- package/src/core/components/component-analyzer.ts +192 -0
- package/src/core/components/component-detection.ts +508 -0
- package/src/core/components/enhanced-framework-detector.ts +500 -0
- package/src/core/components/framework-registry.ts +563 -0
- package/src/core/content/mdx-processor.ts +46 -0
- package/src/core/integrations/index.ts +19 -0
- package/src/core/integrations/loader.ts +125 -0
- package/src/core/integrations/registry.ts +175 -0
- package/src/core/islands/island-persistence.ts +325 -0
- package/src/core/islands/island-state-serializer.ts +258 -0
- package/src/core/islands/persistent-island-context.tsx +80 -0
- package/src/core/islands/use-persistent-state.ts +68 -0
- package/src/core/layout/enhanced-layout-resolver.ts +322 -0
- package/src/core/layout/layout-cache-manager.ts +485 -0
- package/src/core/layout/layout-composer.ts +357 -0
- package/src/core/layout/layout-data-loader.ts +516 -0
- package/src/core/layout/layout-discovery.ts +243 -0
- package/src/core/layout/layout-matcher.ts +299 -0
- package/src/core/layout/layout-types.ts +110 -0
- package/src/core/modules/framework-module-resolver.ts +273 -0
- package/src/islands/component-analysis.ts +213 -0
- package/src/islands/css-utils.ts +565 -0
- package/src/islands/discovery/index.ts +80 -0
- package/src/islands/discovery/registry.ts +340 -0
- package/src/islands/discovery/resolver.ts +477 -0
- package/src/islands/discovery/scanner.ts +386 -0
- package/src/islands/discovery/types.ts +117 -0
- package/src/islands/discovery/validator.ts +544 -0
- package/src/islands/discovery/watcher.ts +368 -0
- package/src/islands/framework-detection.ts +428 -0
- package/src/islands/integration-loader.ts +490 -0
- package/src/islands/island.tsx +565 -0
- package/src/islands/render-cache.ts +550 -0
- package/src/islands/types.ts +80 -0
- package/src/islands/universal-css-collector.ts +157 -0
- package/src/islands/universal-head-collector.ts +137 -0
- package/src/layout-system.ts +218 -0
- package/src/middleware/discovery.ts +268 -0
- package/src/middleware/executor.ts +315 -0
- package/src/middleware/index.ts +76 -0
- package/src/middleware/types.ts +99 -0
- package/src/nitro/build-config.ts +576 -0
- package/src/nitro/config.ts +483 -0
- package/src/nitro/error-handler.ts +636 -0
- package/src/nitro/index.ts +173 -0
- package/src/nitro/island-manifest.ts +584 -0
- package/src/nitro/middleware-adapter.ts +260 -0
- package/src/nitro/renderer.ts +1471 -0
- package/src/nitro/route-discovery.ts +439 -0
- package/src/nitro/types.ts +321 -0
- package/src/render/collect-css.ts +198 -0
- package/src/render/error-pages.ts +79 -0
- package/src/render/isolated-ssr-renderer.ts +654 -0
- package/src/render/ssr.ts +1030 -0
- package/src/schemas/api.ts +30 -0
- package/src/schemas/core.ts +64 -0
- package/src/schemas/index.ts +212 -0
- package/src/schemas/layout.ts +279 -0
- package/src/schemas/routing/index.ts +38 -0
- package/src/schemas/routing.ts +376 -0
- package/src/types/as-island.ts +20 -0
- package/src/types/layout.ts +285 -0
- package/src/types/routing.ts +555 -0
- package/src/types/types.ts +5 -0
- package/src/utils/dev-logger.ts +299 -0
- package/src/utils/fs.ts +151 -0
- package/src/vite-plugin/auto-discover.ts +551 -0
- package/src/vite-plugin/config.ts +266 -0
- package/src/vite-plugin/errors.ts +127 -0
- package/src/vite-plugin/image-optimization.ts +156 -0
- package/src/vite-plugin/integration-activator.ts +126 -0
- package/src/vite-plugin/island-sidecar-plugin.ts +176 -0
- package/src/vite-plugin/module-discovery.ts +189 -0
- package/src/vite-plugin/nitro-integration.ts +1354 -0
- package/src/vite-plugin/plugin.ts +403 -0
- package/src/vite-plugin/types.ts +327 -0
- package/src/vite-plugin/validation.ts +228 -0
- package/dist/mod.js +0 -1
- package/dist/src/build/integration-bundler-plugin.js +0 -1
- package/dist/src/build/integration-config.js +0 -1
- package/dist/src/build/integration-detection-plugin.js +0 -1
- package/dist/src/build/integration-resolver-plugin.js +0 -1
- package/dist/src/build/island-manifest.js +0 -1
- package/dist/src/build/island-types-generator.js +0 -5
- package/dist/src/build/mdx-island-transform.js +0 -2
- package/dist/src/build/mdx-plugin.js +0 -1
- package/dist/src/build/page-island-transform.js +0 -3
- package/dist/src/build/prop-extractors/index.js +0 -1
- package/dist/src/build/prop-extractors/lit.js +0 -1
- package/dist/src/build/prop-extractors/qwik.js +0 -1
- package/dist/src/build/prop-extractors/solid.js +0 -1
- package/dist/src/build/prop-extractors/svelte.js +0 -1
- package/dist/src/build/prop-extractors/vue.js +0 -1
- package/dist/src/build/sidecar-file-manager.js +0 -1
- package/dist/src/build/sidecar-renderer.js +0 -6
- package/dist/src/client/adapters/index.js +0 -1
- package/dist/src/client/components.js +0 -1
- package/dist/src/client/css-hmr-handler.js +0 -1
- package/dist/src/client/framework-adapter.js +0 -13
- package/dist/src/client/hmr-coordinator.js +0 -1
- package/dist/src/client/hmr-error-overlay.js +0 -214
- package/dist/src/client/main.js +0 -39
- package/dist/src/components/Image.js +0 -1
- package/dist/src/components/IslandErrorBoundary.js +0 -1
- package/dist/src/components/LayoutDataErrorBoundary.js +0 -1
- package/dist/src/components/LayoutErrorBoundary.js +0 -1
- package/dist/src/components/PersistentIsland.js +0 -1
- package/dist/src/components/StreamingErrorBoundary.js +0 -1
- package/dist/src/components/StreamingLayout.js +0 -29
- package/dist/src/core/components/component-analyzer.js +0 -1
- package/dist/src/core/components/component-detection.js +0 -5
- package/dist/src/core/components/enhanced-framework-detector.js +0 -1
- package/dist/src/core/components/framework-registry.js +0 -1
- package/dist/src/core/content/mdx-processor.js +0 -1
- package/dist/src/core/integrations/index.js +0 -1
- package/dist/src/core/integrations/loader.js +0 -1
- package/dist/src/core/integrations/registry.js +0 -1
- package/dist/src/core/islands/island-persistence.js +0 -1
- package/dist/src/core/islands/island-state-serializer.js +0 -1
- package/dist/src/core/islands/persistent-island-context.js +0 -1
- package/dist/src/core/islands/use-persistent-state.js +0 -1
- package/dist/src/core/layout/enhanced-layout-resolver.js +0 -1
- package/dist/src/core/layout/layout-cache-manager.js +0 -1
- package/dist/src/core/layout/layout-composer.js +0 -1
- package/dist/src/core/layout/layout-data-loader.js +0 -1
- package/dist/src/core/layout/layout-discovery.js +0 -1
- package/dist/src/core/layout/layout-matcher.js +0 -1
- package/dist/src/core/layout/layout-types.js +0 -1
- package/dist/src/core/modules/framework-module-resolver.js +0 -1
- package/dist/src/islands/component-analysis.js +0 -1
- package/dist/src/islands/css-utils.js +0 -17
- package/dist/src/islands/discovery/index.js +0 -1
- package/dist/src/islands/discovery/registry.js +0 -1
- package/dist/src/islands/discovery/resolver.js +0 -2
- package/dist/src/islands/discovery/scanner.js +0 -1
- package/dist/src/islands/discovery/types.js +0 -1
- package/dist/src/islands/discovery/validator.js +0 -18
- package/dist/src/islands/discovery/watcher.js +0 -1
- package/dist/src/islands/framework-detection.js +0 -1
- package/dist/src/islands/integration-loader.js +0 -1
- package/dist/src/islands/island.js +0 -1
- package/dist/src/islands/render-cache.js +0 -1
- package/dist/src/islands/types.js +0 -1
- package/dist/src/islands/universal-css-collector.js +0 -5
- package/dist/src/islands/universal-head-collector.js +0 -2
- package/dist/src/layout-system.js +0 -1
- package/dist/src/middleware/discovery.js +0 -1
- package/dist/src/middleware/executor.js +0 -1
- package/dist/src/middleware/index.js +0 -1
- package/dist/src/middleware/types.js +0 -1
- package/dist/src/nitro/build-config.js +0 -1
- package/dist/src/nitro/config.js +0 -1
- package/dist/src/nitro/error-handler.js +0 -198
- package/dist/src/nitro/index.js +0 -1
- package/dist/src/nitro/island-manifest.js +0 -2
- package/dist/src/nitro/middleware-adapter.js +0 -1
- package/dist/src/nitro/renderer.js +0 -183
- package/dist/src/nitro/route-discovery.js +0 -1
- package/dist/src/nitro/types.js +0 -1
- package/dist/src/render/collect-css.js +0 -3
- package/dist/src/render/error-pages.js +0 -48
- package/dist/src/render/isolated-ssr-renderer.js +0 -1
- package/dist/src/render/ssr.js +0 -90
- package/dist/src/schemas/api.js +0 -1
- package/dist/src/schemas/core.js +0 -1
- package/dist/src/schemas/index.js +0 -1
- package/dist/src/schemas/layout.js +0 -1
- package/dist/src/schemas/routing/index.js +0 -1
- package/dist/src/schemas/routing.js +0 -1
- package/dist/src/types/as-island.js +0 -1
- package/dist/src/types/layout.js +0 -1
- package/dist/src/types/routing.js +0 -1
- package/dist/src/types/types.js +0 -1
- package/dist/src/utils/dev-logger.js +0 -12
- package/dist/src/utils/fs.js +0 -1
- package/dist/src/vite-plugin/auto-discover.js +0 -1
- package/dist/src/vite-plugin/config.js +0 -1
- package/dist/src/vite-plugin/errors.js +0 -1
- package/dist/src/vite-plugin/image-optimization.js +0 -45
- package/dist/src/vite-plugin/integration-activator.js +0 -1
- package/dist/src/vite-plugin/island-sidecar-plugin.js +0 -1
- package/dist/src/vite-plugin/module-discovery.js +0 -1
- package/dist/src/vite-plugin/nitro-integration.js +0 -42
- package/dist/src/vite-plugin/plugin.js +0 -1
- package/dist/src/vite-plugin/types.js +0 -1
- package/dist/src/vite-plugin/validation.js +0 -2
- /package/{dist/src → src}/client/types/framework-runtime.d.ts +0 -0
- /package/{dist/src → src}/client/types/vite-hmr.d.ts +0 -0
- /package/{dist/src → src}/client/types/vite-virtual-modules.d.ts +0 -0
- /package/{dist/src → src}/layout-system.d.ts +0 -0
- /package/{dist/src → src}/types/image.d.ts +0 -0
- /package/{dist/src → src}/types/index.d.ts +0 -0
- /package/{dist/src → src}/types/island-jsx.d.ts +0 -0
- /package/{dist/src → src}/types/island-prop.d.ts +0 -0
- /package/{dist/src → src}/types/mdx.d.ts +0 -0
- /package/{dist/src → src}/types/urlpattern.d.ts +0 -0
- /package/{dist/src → src}/types/vite-env.d.ts +0 -0
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
import{getRequestURL as e}from"h3";import{createNotFoundError as t,isHttpError as n}from"./types.js";import{discoverScopedMiddleware as r,executeScopedMiddleware as i}from"../middleware/index.js";import{handleRenderError as a,discoverErrorPages as o}from"./error-handler.js";import{h as s}from"preact";import c from"preact-render-to-string";export function createRenderContext(e,t={}){let n=getRequestURL(e);return{url:n,params:t,query:Object.fromEntries(n.searchParams),request:toRequest(e),event:e}}export function getRequestURL(t){return new URL(e(t).pathname,`http://localhost`)}export function toRequest(e){let t=getRequestURL(e);return new Request(t,{method:e.req.method,headers:getRequestHeaders(e)})}export function getRequestHeaders(e){return new Headers}export function setResponseHeader(e,t,n){e.context.responseHeaders||(e.context.responseHeaders={}),e.context.responseHeaders[t]=n}export function createErrorResponse(e,t){let r=n(e)?e.statusCode:500;if(t){let t=h(e,r);return new Response(t,{status:r,headers:{"Content-Type":`text/html; charset=utf-8`}})}let i=g(r);return new Response(i,{status:r,headers:{"Content-Type":`text/html; charset=utf-8`}})}function h(e,t){return`<!DOCTYPE html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="utf-8">
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
-
<title>Error ${t}</title>
|
|
7
|
-
<style>
|
|
8
|
-
body {
|
|
9
|
-
font-family: system-ui, -apple-system, sans-serif;
|
|
10
|
-
margin: 0;
|
|
11
|
-
padding: 40px;
|
|
12
|
-
background: #1a1a1a;
|
|
13
|
-
color: #fff;
|
|
14
|
-
}
|
|
15
|
-
.error-container {
|
|
16
|
-
max-width: 800px;
|
|
17
|
-
margin: 0 auto;
|
|
18
|
-
background: #2d2d2d;
|
|
19
|
-
padding: 40px;
|
|
20
|
-
border-radius: 8px;
|
|
21
|
-
border-left: 4px solid #ff6b6b;
|
|
22
|
-
}
|
|
23
|
-
h1 {
|
|
24
|
-
color: #ff6b6b;
|
|
25
|
-
margin-top: 0;
|
|
26
|
-
font-size: 24px;
|
|
27
|
-
}
|
|
28
|
-
.status-code {
|
|
29
|
-
font-size: 48px;
|
|
30
|
-
font-weight: bold;
|
|
31
|
-
color: #ff6b6b;
|
|
32
|
-
margin-bottom: 10px;
|
|
33
|
-
}
|
|
34
|
-
.message {
|
|
35
|
-
font-size: 18px;
|
|
36
|
-
color: #ccc;
|
|
37
|
-
margin-bottom: 20px;
|
|
38
|
-
}
|
|
39
|
-
pre {
|
|
40
|
-
background: #1a1a1a;
|
|
41
|
-
padding: 20px;
|
|
42
|
-
border-radius: 4px;
|
|
43
|
-
overflow-x: auto;
|
|
44
|
-
font-size: 14px;
|
|
45
|
-
line-height: 1.5;
|
|
46
|
-
color: #e0e0e0;
|
|
47
|
-
}
|
|
48
|
-
.stack-title {
|
|
49
|
-
color: #888;
|
|
50
|
-
font-size: 12px;
|
|
51
|
-
text-transform: uppercase;
|
|
52
|
-
margin-bottom: 10px;
|
|
53
|
-
}
|
|
54
|
-
</style>
|
|
55
|
-
</head>
|
|
56
|
-
<body>
|
|
57
|
-
<div class="error-container">
|
|
58
|
-
<div class="status-code">${t}</div>
|
|
59
|
-
<h1>${_(t)}</h1>
|
|
60
|
-
<p class="message">${v(e.message)}</p>
|
|
61
|
-
${e.stack?`
|
|
62
|
-
<div class="stack-title">Stack Trace</div>
|
|
63
|
-
<pre>${v(e.stack)}</pre>
|
|
64
|
-
`:``}
|
|
65
|
-
</div>
|
|
66
|
-
</body>
|
|
67
|
-
</html>`}function g(e){return`<!DOCTYPE html>
|
|
68
|
-
<html lang="en">
|
|
69
|
-
<head>
|
|
70
|
-
<meta charset="utf-8">
|
|
71
|
-
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
72
|
-
<title>Error ${e}</title>
|
|
73
|
-
<style>
|
|
74
|
-
body {
|
|
75
|
-
font-family: system-ui, -apple-system, sans-serif;
|
|
76
|
-
margin: 0;
|
|
77
|
-
padding: 40px;
|
|
78
|
-
background: #f5f5f5;
|
|
79
|
-
display: flex;
|
|
80
|
-
align-items: center;
|
|
81
|
-
justify-content: center;
|
|
82
|
-
min-height: 100vh;
|
|
83
|
-
box-sizing: border-box;
|
|
84
|
-
}
|
|
85
|
-
.error-container {
|
|
86
|
-
text-align: center;
|
|
87
|
-
max-width: 400px;
|
|
88
|
-
}
|
|
89
|
-
.status-code {
|
|
90
|
-
font-size: 72px;
|
|
91
|
-
font-weight: bold;
|
|
92
|
-
color: #333;
|
|
93
|
-
margin-bottom: 10px;
|
|
94
|
-
}
|
|
95
|
-
h1 {
|
|
96
|
-
color: #666;
|
|
97
|
-
font-size: 24px;
|
|
98
|
-
margin: 0 0 20px 0;
|
|
99
|
-
}
|
|
100
|
-
p {
|
|
101
|
-
color: #888;
|
|
102
|
-
margin: 0;
|
|
103
|
-
}
|
|
104
|
-
a {
|
|
105
|
-
color: #0066cc;
|
|
106
|
-
text-decoration: none;
|
|
107
|
-
}
|
|
108
|
-
a:hover {
|
|
109
|
-
text-decoration: underline;
|
|
110
|
-
}
|
|
111
|
-
</style>
|
|
112
|
-
</head>
|
|
113
|
-
<body>
|
|
114
|
-
<div class="error-container">
|
|
115
|
-
<div class="status-code">${e}</div>
|
|
116
|
-
<h1>${_(e)}</h1>
|
|
117
|
-
<p><a href="/">Return to home</a></p>
|
|
118
|
-
</div>
|
|
119
|
-
</body>
|
|
120
|
-
</html>`}function _(e){return{400:`Bad Request`,401:`Unauthorized`,403:`Forbidden`,404:`Page Not Found`,405:`Method Not Allowed`,500:`Internal Server Error`,502:`Bad Gateway`,503:`Service Unavailable`}[e]||`Error`}function v(e){return e.replaceAll(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`).replaceAll(`"`,`"`).replaceAll(`'`,`'`)}export function extractIslandMarkers(e){let t=[],n=/<[^>]*data-framework="([^"]+)"[^>]*>/g,r;for(;(r=n.exec(e))!==null;){let e=r[0],n=r[1],i=/data-src="([^"]+)"/.exec(e),a=i?i[1]:``,o=/data-props="([^"]*)"/.exec(e),s=o?o[1]:void 0,c=/data-hydrate="([^"]+)"/.exec(e),l=c?c[1]:void 0;t.push({framework:n,src:a,props:s,hydrate:l})}return t}export function ensureHydrationMarkers(e,t){let n=e;return t.framework&&!n.includes(`data-framework=`)&&(n=n.replace(/>/,` data-framework="${t.framework}">`)),t.src&&!n.includes(`data-src=`)&&(n=n.replace(/>/,` data-src="${t.src}">`)),t.props!==void 0&&!n.includes(`data-props=`)&&(n=n.replace(/>/,` data-props="${t.props}">`)),n}export function injectHydrationScript(e,t,n={}){if(!(e.includes(`data-framework=`)||e.includes(`data-src=`))&&!n.forceInject||[`/src/client/main.js`,`/dist/client.js`,`client/main.js`].some(t=>e.includes(t)))return e;let r=n.scriptPath||(t?`/src/client/main.js`:`/dist/client.js`),i=[];i.push(`<script type="module" src="${r}"><\/script>`),n.additionalScripts&&i.push(...n.additionalScripts);let a=i.join(`
|
|
121
|
-
`);return e.includes(`</body>`)?e.replace(`</body>`,`${a}\n</body>`):e+a}export function validateHydrationMarkers(e){let t=extractIslandMarkers(e),n=e.match(/data-framework="[^"]+"/g)||[],r=e.match(/data-src="[^"]+"/g)||[],i=e.match(/data-props="[^"]*"/g)||[],a=e.includes(`/src/client/main.js`)||e.includes(`/dist/client.js`)||e.includes(`client/main.js`),o=t.every(e=>e.framework&&e.src),s=t.length===0||o&&a;return{hasFrameworkAttr:n.length>0,hasSrcAttr:r.length>0,hasPropsAttr:i.length>0,islandCount:n.length,islands:t,hasClientScript:a,isValid:s}}export function processHydrationRequirements(e,t){let n=injectHydrationScript(e,t);return{html:n,validation:validateHydrationMarkers(n)}}export async function renderPage(e,t,n={}){try{let r={};return e.getServerSideProps&&(r=await e.getServerSideProps(t)),{html:await y(e,r,t,n),statusCode:200,headers:{"Content-Type":`text/html; charset=utf-8`}}}catch(e){throw console.error(`[SSR Error]`,e),n.onError&&e instanceof Error&&n.onError(e),e}}async function y(e,t,n,r){let i=e.default,a=e.metadata||{},o;try{let e=i(t);o=e instanceof Promise?await e:e}catch(e){console.error(`[renderer] Error calling page component:`,e),o=s(`div`,null,`Error rendering page`)}let l;try{l=c(o)}catch(e){console.error(`[renderer] Error in preactRenderToString:`,e),l=`<div>Error rendering page</div>`}return`<!DOCTYPE html>
|
|
122
|
-
<html lang="en">
|
|
123
|
-
<head>
|
|
124
|
-
<meta charset="utf-8">
|
|
125
|
-
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
126
|
-
<title>${v(String(a.title||`Avalon App`))}</title>
|
|
127
|
-
${a.description?`<meta name="description" content="${v(String(a.description))}">`:``}
|
|
128
|
-
</head>
|
|
129
|
-
<body>
|
|
130
|
-
<div id="app">
|
|
131
|
-
${l}
|
|
132
|
-
</div>
|
|
133
|
-
<script type="module" src="/src/client/main.js"><\/script>
|
|
134
|
-
</body>
|
|
135
|
-
</html>`}export async function renderPageStream(e,t,n={}){let r=new TextEncoder,i=null,a={shellSent:!1,contentSent:!1,closed:!1,error:null},o=n.shellReadyTimeout,s=n.allReadyTimeout,c=null,l=null,u=()=>{c&&=(clearTimeout(c),null),l&&=(clearTimeout(l),null)};function d(e,t,n,r,i,a,o){if(n.error=e,a(),console.error(`[Streaming Error]`,{message:e.message,stack:e.stack,shellSent:n.shellSent,isShellError:t,timestamp:new Date().toISOString()}),t&&o.onShellError&&o.onShellError(e),o.onError&&o.onError(e),!n.closed&&r){if(n.shellSent){let t=C(e);r.enqueue(i.encode(t));let n=S();r.enqueue(i.encode(n))}else{let t=h(e,500);r.enqueue(i.encode(t))}n.closed=!0,r.close()}}async function f(o){i=o;let f={};e.getServerSideProps&&(f=await e.getServerSideProps(t));let p=b(e.metadata||{},t);if(a.closed||(o.enqueue(r.encode(p)),a.shellSent=!0,c&&=(clearTimeout(c),null),n.onShellReady&&n.onShellReady()),s&&s>0&&(l=setTimeout(()=>{!a.contentSent&&!a.closed&&d(Error(`All ready timeout after ${s}ms`),!1,a,i,r,u,n)},s)),!a.closed){let t=x(e,f);o.enqueue(r.encode(t)),a.contentSent=!0}if(!a.closed){let e=S();o.enqueue(r.encode(e))}u(),n.onAllReady&&!a.closed&&n.onAllReady(),a.closed||(a.closed=!0,o.close())}return new ReadableStream({async start(e){i=e,o&&o>0&&(c=setTimeout(()=>{!a.shellSent&&!a.closed&&d(Error(`Shell ready timeout after ${o}ms`),!0,a,i,r,u,n)},o));try{await f(e)}catch(e){d(e instanceof Error?e:Error(String(e)),!a.shellSent,a,i,r,u,n)}},cancel(){if(u(),!a.closed&&i){a.closed=!0;try{i.close()}catch{}}}})}function b(e,t){return`<!DOCTYPE html>
|
|
136
|
-
<html lang="en">
|
|
137
|
-
<head>
|
|
138
|
-
<meta charset="utf-8">
|
|
139
|
-
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
140
|
-
<title>${v(String(e.title||`Avalon App`))}</title>
|
|
141
|
-
${e.description?`<meta name="description" content="${v(String(e.description))}">`:``}
|
|
142
|
-
</head>
|
|
143
|
-
<body>
|
|
144
|
-
`}function x(e,t){let n=e.default?.name||`Page`;return` <div id="app" data-page="${v(String(n))}" data-props='${v(JSON.stringify(t))}'>
|
|
145
|
-
<!-- Page content rendered by Avalon SSR pipeline -->
|
|
146
|
-
</div>
|
|
147
|
-
`}function S(){return` </body>
|
|
148
|
-
</html>`}function C(e){let t=process.env.NODE_ENV!==`production`,n=e.stack?`<pre style="
|
|
149
|
-
background: #f5f5f5;
|
|
150
|
-
padding: 10px;
|
|
151
|
-
border-radius: 4px;
|
|
152
|
-
overflow-x: auto;
|
|
153
|
-
font-size: 12px;
|
|
154
|
-
margin-top: 10px;
|
|
155
|
-
">${v(e.stack)}</pre>`:``;return`
|
|
156
|
-
<div class="streaming-error-boundary" data-error-boundary="true" style="
|
|
157
|
-
background: #fff3cd;
|
|
158
|
-
border: 2px solid #ffc107;
|
|
159
|
-
border-radius: 8px;
|
|
160
|
-
padding: 20px;
|
|
161
|
-
margin: 20px 0;
|
|
162
|
-
font-family: system-ui, -apple-system, sans-serif;
|
|
163
|
-
">
|
|
164
|
-
<div style="display: flex; align-items: center; gap: 10px; margin-bottom: 10px;">
|
|
165
|
-
<span style="font-size: 24px;">⚠️</span>
|
|
166
|
-
<h3 style="margin: 0; color: #856404;">Streaming Error</h3>
|
|
167
|
-
</div>
|
|
168
|
-
<p style="margin: 10px 0; color: #856404;">
|
|
169
|
-
An error occurred while streaming this page.
|
|
170
|
-
</p>
|
|
171
|
-
${t?`
|
|
172
|
-
<details style="margin-top: 15px;">
|
|
173
|
-
<summary style="cursor: pointer; color: #856404; font-weight: bold;">
|
|
174
|
-
Error Details (Development Mode)
|
|
175
|
-
</summary>
|
|
176
|
-
<div style="margin-top: 10px;">
|
|
177
|
-
<p><strong>Error:</strong> ${v(e.message)}</p>
|
|
178
|
-
${n}
|
|
179
|
-
</div>
|
|
180
|
-
</details>
|
|
181
|
-
`:``}
|
|
182
|
-
</div>
|
|
183
|
-
`}export function createStreamingResponse(e,t={}){let n=new Headers({"Content-Type":`text/html; charset=utf-8`,"Transfer-Encoding":`chunked`,...t.headers});return new Response(e,{status:t.status||200,headers:n})}function w(e,t,n){return async()=>(e.value??=await r({baseDir:t,devMode:n}),e.value)}function T(e,t,n){return async(r,i)=>e?a(r,i,t):createErrorResponse(r,n)}export function createNitroRenderer(e){let{avalonConfig:n,isDev:r=!1,enableCustomErrorPages:a=!0}=e,s={isDev:r,avalonConfig:n,loadPageModule:e.loadPageModule,pagesDir:n.pagesDir};a&&o(s).catch(e=>{console.warn(`[renderer] Failed to discover error pages:`,e)});let c=w({value:null},n.srcDir||`src`,r),d=T(a,s,r);return async function(a){let o=getRequestURL(a).pathname;try{let s=await i(a,await c(),{devMode:r});if(s)return r&&console.log(`[renderer] Middleware terminated request for ${o}`),s;let u=a.context.route,f=null;if(f=u||(e.resolvePageRoute?await e.resolvePageRoute(o,n.pagesDir):await E(o,n.pagesDir)),!f)return d(t(`Page not found: ${o}`),a);let m=e.loadPageModule?await e.loadPageModule(f.filePath):await D(f.filePath),h=createRenderContext(a,a.context.params||f.params);if(e.resolveLayouts&&(h.layoutContext={layouts:await e.resolveLayouts(o,n)}),n.streaming){let e=await renderPageStream(m,h,{onShellReady:()=>{setResponseHeader(a,`Content-Type`,`text/html; charset=utf-8`)}});return new Response(e,{headers:{"Content-Type":`text/html; charset=utf-8`}})}else{let e=await renderPage(m,h),t=injectHydrationScript(e.html,r);return new Response(t,{status:e.statusCode,headers:e.headers})}}catch(e){return console.error(`[Nitro Renderer Error]`,e),d(e instanceof Error?e:Error(String(e)),a)}}}async function E(e,t){return e===`/`||e===``?{filePath:`src/pages/index.tsx`,pattern:`/`,params:{}}:{filePath:`src/pages/${e.replace(/^\//,``).replace(/\/$/,``)}.tsx`,pattern:e,params:{}}}async function D(e){return{default:()=>null,metadata:{title:`Avalon Page`}}}export function createNitroCatchAllRenderer(e){let{avalonConfig:n,isDev:r=!1,loadPageModule:a,resolveLayouts:s,enableCustomErrorPages:c=!0}=e,d={isDev:r,avalonConfig:n,loadPageModule:a,pagesDir:n.pagesDir};c&&o(d).catch(e=>{console.warn(`[renderer] Failed to discover error pages:`,e)});let f=w({value:null},n.srcDir||`src`,r),m=T(c,d,r);return async function(e){let o=getRequestURL(e).pathname;try{let c=await i(e,await f(),{devMode:r});if(c)return r&&console.log(`[renderer] Middleware terminated request for ${o}`),c;let u=e.context.params||{},d=u.slug||o.replace(/^\//,``)||`index`,h=`${n.pagesDir}/${d}.tsx`,g;try{g=await a(h)}catch(i){try{g=await a(`${n.pagesDir}/${d}/index.tsx`)}catch(a){return r&&(console.debug(`[renderer] Page not found: ${h}`,i),console.debug(`[renderer] Index fallback not found: ${n.pagesDir}/${d}/index.tsx`,a)),m(t(`Page not found: ${o}`),e)}}let _=createRenderContext(e,u);if(s&&(_.layoutContext={layouts:await s(o,n)}),n.streaming){let t=await renderPageStream(g,_,{onShellReady:()=>{setResponseHeader(e,`Content-Type`,`text/html; charset=utf-8`)}});return new Response(t,{headers:{"Content-Type":`text/html; charset=utf-8`}})}else{let e=await renderPage(g,_),t=injectHydrationScript(e.html,r);return new Response(t,{status:e.statusCode,headers:e.headers})}}catch(t){return console.error(`[Nitro Catch-All Renderer Error]`,t),m(t instanceof Error?t:Error(String(t)),e)}}}export{clearMiddlewareCache as clearRendererMiddlewareCache}from"../middleware/index.js";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{stat as e}from"node:fs/promises";import{basename as t,dirname as n,relative as r}from"node:path";import{walk as i}from"../utils/fs.js";export const PAGE_EXTENSIONS=[`.tsx`,`.ts`,`.jsx`,`.js`,`.vue`,`.svelte`,`.md`,`.mdx`];export async function discoverPageRoutesFromMultipleDirs(e,t){let n=[];for(let{dir:r,prefix:i}of e){let e=await discoverPageRoutes(r,t);for(let t of e)i!==`/`&&(t.pattern=t.pattern===`/`?i:i+t.pattern),n.push(t)}return sortRoutesBySpecificity(n)}export async function discoverPageRoutes(t,n){let o=[],s=n?.excludeDirectories??[`node_modules`,`.git`];try{if(!(await e(t)).isDirectory())return n?.developmentMode&&console.warn(`[route-discovery] Pages path is not a directory: ${t}`),[]}catch(e){if(e instanceof Error&&e.code===`ENOENT`)return n?.developmentMode&&console.warn(`[route-discovery] Pages directory not found: ${t}`),[];throw e}let l=PAGE_EXTENSIONS.map(e=>e.slice(1));for await(let e of i(t,{includeDirs:!1,includeSymlinks:!1,exts:l})){if(!e.isFile)continue;let n=r(t,e.path);if(s.some(e=>n.includes(e))||isPrivateFile(n))continue;let{pattern:i,params:a}=filePathToPattern(n);o.push({type:`page`,filePath:e.path,pattern:i,params:a})}return sortRoutesBySpecificity(o)}export function filePathToPattern(e){let r=[],i=e.replace(/\\/g,`/`).replace(/\.(tsx|ts|jsx|js|vue|svelte|md|mdx)$/,``).replace(/\([^)]+\)\//g,``).replace(/\([^)]+\)$/,``);return t(i)===`index`&&(i=n(i),i===`.`&&(i=``)),i=i.replace(/\[([^\]]+)\]/g,(e,t)=>{if(t.startsWith(`...`)){let e=t.slice(3);return r.push(e),`**`}else return r.push(t),`:${t}`}),i.startsWith(`/`)||(i=`/`+i),(i===`/`||i===``)&&(i=`/`),i.length>1&&i.endsWith(`/`)&&(i=i.slice(0,-1)),{pattern:i,params:r}}export function isPrivateFile(e){return e.split(/[/\\]/).some(e=>e.startsWith(`_`))}export function calculateRouteSpecificity(e){let t=e.pattern.split(`/`).filter(e=>e.length>0),n=0;for(let e of t)e===`**`?n+=1e3:e.startsWith(`:`)?n+=100:n+=1;return n+=t.length,n}export function sortRoutesBySpecificity(e){return[...e].sort((e,t)=>calculateRouteSpecificity(e)-calculateRouteSpecificity(t))}export function validateRoutePattern(e){let t=[];e.startsWith(`/`)||t.push(`Route pattern must start with /`);let n=e.match(/\[[^\]]*$/g);n&&t.push(`Malformed dynamic segments: ${n.join(`, `)}. Dynamic segments must be properly closed with ]`),e.match(/\[\]/g)&&t.push(`Empty dynamic segments [] are not allowed. Use [param] for dynamic segments or [...rest] for catch-all`);let r=e.match(/\[[^\]]*\[[^\]]*\]/g);return r&&t.push(`Nested dynamic segments are not supported: ${r.join(`, `)}`),t}export function extractParamsFromPattern(e){let t=[],n=e.matchAll(/:([^/]+)/g);for(let e of n)t.push(e[1]);return e.includes(`**`)&&t.push(`slug`),t}export function matchRoutePattern(e,t){let n={},r=e.replace(/\/$/,``)||`/`,i=t.replace(/\/$/,``)||`/`,a=r.split(`/`).filter(e=>e),o=i.split(`/`).filter(e=>e),s=0,c=0;for(;s<a.length;){let e=a[s];if(e===`**`)return n.slug=o.slice(c).join(`/`),{matches:!0,params:n};if(c>=o.length)return{matches:!1,params:{}};let t=o[c];if(e.startsWith(`:`)){let r=e.slice(1);n[r]=t}else if(e!==t)return{matches:!1,params:{}};s++,c++}return c<o.length?{matches:!1,params:{}}:{matches:!0,params:n}}
|
package/dist/src/nitro/types.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export class HttpError extends Error{statusCode;data;constructor(e,t,n){super(t),this.name=`HttpError`,this.statusCode=e,this.data=n}}export function createNotFoundError(t=`Not Found`){return new HttpError(404,t)}export function createMethodNotAllowedError(t){return new HttpError(405,`Method Not Allowed`,{allowed:t})}export function createInternalError(t=`Internal Server Error`){return new HttpError(500,t)}export function isHttpError(t){return t instanceof HttpError}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
export async function collectCssFromModuleGraph(e,r){let i=[],a=new Set,o=await e.moduleGraph.getModuleByUrl(r);if(!o)return i;let s=[o];for(;s.length>0;){let r=s.shift(),o=r.id??r.url;if(!a.has(o)){if(a.add(o),t(o)){let t=await n(e,r);t&&i.push(t)}for(let e of r.importedModules){let t=e.id??e.url;a.has(t)||s.push(e)}}}return i}function t(e){let t=e.split(`?`)[0];return t.endsWith(`.css`)||t.endsWith(`.scss`)||t.endsWith(`.sass`)||t.endsWith(`.less`)||t.endsWith(`.styl`)||t.endsWith(`.stylus`)}async function n(e,t){try{let n=t.url,i=await e.transformRequest(n+`?direct`);return i&&typeof i.code==`string`?r(i.code):null}catch{return null}}function r(e){let t=new RegExp(/const\s+__vite__css\s*=\s*"((?:[^"\\]|\\.)*)"/).exec(e);if(t)return i(t[1]);let n=new RegExp(/__vite_ssr_exports__\.default\s*=\s*"((?:[^"\\]|\\.)*)"/).exec(e);if(n)return i(n[1]);let r=new RegExp(/export\s+default\s+"((?:[^"\\]|\\.)*)"/).exec(e);return r?i(r[1]):!e.includes(`export `)&&!e.includes(`__vite`)?e:null}function i(e){return e.replaceAll(String.raw`\n`,`
|
|
2
|
-
`).replaceAll(String.raw`\t`,` `).replaceAll(String.raw`\r`,`\r`).replaceAll(String.raw`\"`,`"`).replaceAll(`\\\\`,`\\`)}export function injectSsrCss(e,t){if(t.length===0)return e;let n=t.map(e=>`<style data-avalon-ssr-css>${o(e)}</style>`).join(`
|
|
3
|
-
`);return e.includes(`</head>`)?e.replace(`</head>`,`${n}\n</head>`):e.includes(`<head>`)?e.replace(`<head>`,`<head>\n${n}`):n+e}function o(e){return e.replaceAll(/<\/style/gi,String.raw`<\/style`)}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
function e(e){return e.replaceAll(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`).replaceAll(`"`,`"`).replaceAll(`'`,`'`)}export function generateErrorPage(t){return`<!DOCTYPE html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="utf-8">
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
-
<title>SSR Error</title>
|
|
7
|
-
<style>
|
|
8
|
-
body {
|
|
9
|
-
font-family: system-ui, -apple-system, sans-serif;
|
|
10
|
-
margin: 0;
|
|
11
|
-
padding: 40px;
|
|
12
|
-
background: #1a1a1a;
|
|
13
|
-
color: #fff;
|
|
14
|
-
}
|
|
15
|
-
.error-container {
|
|
16
|
-
max-width: 800px;
|
|
17
|
-
margin: 0 auto;
|
|
18
|
-
background: #2d2d2d;
|
|
19
|
-
padding: 40px;
|
|
20
|
-
border-radius: 8px;
|
|
21
|
-
border-left: 4px solid #ff6b6b;
|
|
22
|
-
}
|
|
23
|
-
h1 { color: #ff6b6b; margin-top: 0; font-size: 24px; }
|
|
24
|
-
.message { font-size: 18px; color: #ccc; margin-bottom: 20px; }
|
|
25
|
-
pre {
|
|
26
|
-
background: #1a1a1a;
|
|
27
|
-
padding: 20px;
|
|
28
|
-
border-radius: 4px;
|
|
29
|
-
overflow-x: auto;
|
|
30
|
-
font-size: 14px;
|
|
31
|
-
line-height: 1.5;
|
|
32
|
-
color: #e0e0e0;
|
|
33
|
-
}
|
|
34
|
-
.stack-title { color: #888; font-size: 12px; text-transform: uppercase; margin-bottom: 10px; }
|
|
35
|
-
</style>
|
|
36
|
-
</head>
|
|
37
|
-
<body>
|
|
38
|
-
<div class="error-container">
|
|
39
|
-
<h1>SSR Error</h1>
|
|
40
|
-
<p class="message">${e(t.message)}</p>
|
|
41
|
-
${t.stack?`
|
|
42
|
-
<div class="stack-title">Stack Trace</div>
|
|
43
|
-
<pre>${e(t.stack)}</pre>
|
|
44
|
-
`:``}
|
|
45
|
-
</div>
|
|
46
|
-
<script type="module" src="/@vite/client"><\/script>
|
|
47
|
-
</body>
|
|
48
|
-
</html>`}export function generateFallback404(t){return`<!DOCTYPE html><html><head><title>404 Not Found</title></head><body><h1>404 - Page Not Found</h1><p>The page ${e(t)} was not found.</p></body></html>`}
|
|
@@ -1 +0,0 @@
|
|
|
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`]}}
|
package/dist/src/render/ssr.js
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
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}from"../islands/universal-head-collector.js";import{analyzeComponentContent as a}from"../core/components/component-analyzer.js";import{IsolatedSSRRenderer as o}from"./isolated-ssr-renderer.js";function s(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>`)),e.includes(`/src/client/main.js`)||e.includes(`main.js`))return t;let a=`<script type="module" src="/src/client/main.js"><\/script>`;return t.includes(`</body>`)?t.replace(`</body>`,`${a}\n</body>`):t+a}const c={solid:[`solid-js`,`SolidIsland`,`createSignal`,`.solid.`,`data-solid-hydrate`],vue:[`data-vue-hydrate`,`.vue`,`Vue`],svelte:[`data-framework="svelte"`,`.svelte`,`s-`]};let l=null;function u(){return l||=new o({enableStrictIsolation:!0,allowedCrossFrameworkImports:[`preact`,`preact-render-to-string`],errorHandling:`fallback`,debugLogging:process.env.NODE_ENV!==`production`}),l}function d(e){return{solid:c.solid.some(t=>e.includes(t)),vue:c.vue.some(t=>e.includes(t)),svelte:c.svelte.some(t=>e.includes(t))}}function f(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 p(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 m(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 g(a,t);await h(a,t),r=r.replace(n,p(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 h(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=d(r),c=`preact`;s.solid?c=`solid`:s.vue?c=`vue`:s.svelte&&(c=`svelte`);let l=f(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 g(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 o=[i,`examples/${i.split(`/`).pop()}`,`src/islands/${i.split(`/`).pop()}`,`islands/${i.split(`/`).pop()}`],s=null;for(let e of o)try{r=await n(e,`utf-8`);let i={forceSSROnly:t.forceSSROnly,detectScripts:t.detectScripts,suppressWarnings:t.suppressWarnings,logDecisions:!1};s=a(e,r,i);break}catch{continue}return s?{type:s.decision.shouldHydrate?`hydrate`:`ssr-only`,reason:s.decision.reason,warnings:s.decision.warnings}:_(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 _(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 v(e){return e.meta?.map(({name:e,content:t})=>`<meta name="${e}" content="${t}">`).join(`
|
|
2
|
-
`)||``}function y(e){return e.styles?.map(e=>`<link rel="stylesheet" href="${e}">`).join(`
|
|
3
|
-
`)||``}function b(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
|
-
`)||``}function x(e,t){return`
|
|
5
|
-
<script type="module" src="${e?`/src/client/main.js`:`/dist/client.js`}"><\/script>`}function S(e,t){return e&&t?`
|
|
6
|
-
<script type="module">
|
|
7
|
-
if (import.meta.hot) {
|
|
8
|
-
import.meta.hot.accept();
|
|
9
|
-
}
|
|
10
|
-
<\/script>`:``}function C(e){return e.replaceAll(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`).replaceAll(`"`,`"`).replaceAll(`'`,`'`)}function w(e,t,n){let a=process.env.NODE_ENV!==`production`,o=v(e),s=y(e),c=b(e),l=x(a,t),u=S(a,n),d=r(!0),f=i(!0);return`
|
|
11
|
-
<head>
|
|
12
|
-
<meta charset="utf-8">
|
|
13
|
-
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
14
|
-
${o}
|
|
15
|
-
<title>${C(String(e.title||`Avalon App`))}</title>
|
|
16
|
-
|
|
17
|
-
<script type="importmap">
|
|
18
|
-
{
|
|
19
|
-
"imports": {
|
|
20
|
-
"@useavalon/preact/client": "/packages/integrations/preact/client/index.ts",
|
|
21
|
-
"@useavalon/vue/client": "/packages/integrations/vue/client/index.ts",
|
|
22
|
-
"@useavalon/solid/client": "/packages/integrations/solid/client/index.ts",
|
|
23
|
-
"@useavalon/svelte/client": "/packages/integrations/svelte/client/index.ts",
|
|
24
|
-
"@useavalon/shared": "/packages/integrations/core/types.ts"
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
<\/script>
|
|
28
|
-
${s}
|
|
29
|
-
${d}
|
|
30
|
-
${f}
|
|
31
|
-
${c}${l}${u}
|
|
32
|
-
</head>`.trim()}export async function renderToHtml(e,n={},r,i={}){try{let a,o;if(i.forceSSROnly===!0){let n=e.component();a=t(n instanceof Promise?await n:n),o=d(a)}else ({content:a,frameworks:o}=await D(e,i));return a=await m(a,i),`<!DOCTYPE html>\n<html lang="en">\n${w({...n,...e.options},o,r)}\n<body>\n${a}\n</body>\n</html>`}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):T(await m(await A(await k(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 T(e,t,n,r){if(e.trim().startsWith(`<!DOCTYPE html>`)||e.trim().startsWith(`<html`))return s(e);let i=d(e);return s(`<!DOCTYPE html>\n<html lang="en">\n${w({...n,...t.options},i,r)}\n<body>\n${e}\n</body>\n</html>`)}async function E(e,n,r,i){let a,o;if(i.forceSSROnly===!0){let n=e.component();a=t(n instanceof Promise?await n:n),o=d(a)}else ({content:a,frameworks:o}=await D(e,i));return a=await m(a,i),{head:w({...n,...e.options},o,r),content:a}}async function D(e,n){try{let t=await u().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:d(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:d(i)}}}function O(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(M(e,o))),n.enqueue(r.encode(`
|
|
33
|
-
</body>
|
|
34
|
-
</html>`))}catch(e){console.error(`[${a}] Failed to inject error boundary:`,e)}}else i.onShellError?.(e),n.enqueue(r.encode(j(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 E(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
|
-
</body>
|
|
36
|
-
</html>`)),r.onAllReady?.(),a.close()}catch(e){O(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 c=new TextEncoder,l=null,u=!1;return new ReadableStream({async start(f){l=f;try{let f=e,p={default:e.component,layoutConfig:f.layoutConfig,loader:f.loader,frontmatter:e.frontmatter},h=await t.resolveAndRender(r,p,n);if(h.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 m(await A(await k(e,r,o),h,p,n,r),o);if(g.trim().startsWith(`<!DOCTYPE html>`)||g.trim().startsWith(`<html`)){let e=s(g);l.enqueue(c.encode(e)),u=!0,o.onShellReady?.(),o.onAllReady?.(),l.close();return}let _=d(g),v=w({...i,...e.options},_,a);l.enqueue(c.encode(`<!DOCTYPE html>\n<html lang="en">\n${v}\n<body>\n`)),u=!0,o.onShellReady?.(),l.enqueue(c.encode(g)),l.enqueue(c.encode(`
|
|
37
|
-
</body>
|
|
38
|
-
</html>`)),o.onAllReady?.(),l.close()}catch(e){O(e instanceof Error?e:Error(String(e)),u,l,c,o,`Streaming Error with Layouts`,`layout-${r}`)}},cancel(){try{l?.close()}catch{}}})}async function k(e,n,r){if(r.forceSSROnly===!0){let n=e.component();return t(n instanceof Promise?await n:n)}try{let t=await u().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 A(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 u().renderWithIsolation({componentPath:`layout-chain-${o}`,component:()=>s});if(e.success)return e.html}catch{}return t(s)}function j(e){let t=process.env.NODE_ENV!==`production`;return`<!DOCTYPE html>
|
|
39
|
-
<html lang="en">
|
|
40
|
-
<head>
|
|
41
|
-
<meta charset="utf-8">
|
|
42
|
-
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
43
|
-
<title>Error</title>
|
|
44
|
-
<style>
|
|
45
|
-
body {
|
|
46
|
-
font-family: system-ui, -apple-system, sans-serif;
|
|
47
|
-
margin: 0;
|
|
48
|
-
padding: 40px;
|
|
49
|
-
background: #f5f5f5;
|
|
50
|
-
}
|
|
51
|
-
.error-container {
|
|
52
|
-
max-width: 600px;
|
|
53
|
-
margin: 0 auto;
|
|
54
|
-
background: white;
|
|
55
|
-
padding: 40px;
|
|
56
|
-
border-radius: 8px;
|
|
57
|
-
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
|
|
58
|
-
}
|
|
59
|
-
h1 {
|
|
60
|
-
color: #d32f2f;
|
|
61
|
-
margin-top: 0;
|
|
62
|
-
}
|
|
63
|
-
pre {
|
|
64
|
-
background: #f5f5f5;
|
|
65
|
-
padding: 16px;
|
|
66
|
-
border-radius: 4px;
|
|
67
|
-
overflow-x: auto;
|
|
68
|
-
}
|
|
69
|
-
</style>
|
|
70
|
-
</head>
|
|
71
|
-
<body>
|
|
72
|
-
<div class="error-container">
|
|
73
|
-
<h1>Server Error</h1>
|
|
74
|
-
<p>An error occurred while rendering the page:</p>
|
|
75
|
-
<pre>${e.message}</pre>
|
|
76
|
-
${t&&e.stack?`<pre>${e.stack}</pre>`:``}
|
|
77
|
-
</div>
|
|
78
|
-
</body>
|
|
79
|
-
</html>`}function M(e,t){let n=process.env.NODE_ENV!==`production`,r=t?`<p><strong>Component ID:</strong> ${t}</p>`:``,i=e.stack?`<pre style="background:#f5f5f5;padding:10px;border-radius:4px;overflow-x:auto;font-size:12px;margin-top:10px">${e.stack}</pre>`:``,a=n?`<details style="margin-top:15px"><summary style="cursor:pointer;color:#856404;font-weight:bold">Error Details (Development Mode)</summary><div style="margin-top:10px">${r}<p><strong>Error:</strong> ${e.message}</p>${i}</div></details>`:``;return`
|
|
80
|
-
<div class="streaming-error-boundary" data-error-boundary="true"${t?` data-component-id="${t}"`:``}>
|
|
81
|
-
<div class="error-boundary-container" style="background:#fff3cd;border:2px solid #ffc107;border-radius:8px;padding:20px;margin:20px 0;font-family:system-ui,-apple-system,sans-serif">
|
|
82
|
-
<div class="error-boundary-header" style="display:flex;align-items:center;gap:10px;margin-bottom:10px">
|
|
83
|
-
<span style="font-size:24px">⚠️</span>
|
|
84
|
-
<h3 style="margin:0;color:#856404">Component Error</h3>
|
|
85
|
-
</div>
|
|
86
|
-
<p style="margin:10px 0;color:#856404">An error occurred while rendering this component. The rest of the page should work normally.</p>
|
|
87
|
-
${a}
|
|
88
|
-
</div>
|
|
89
|
-
</div>
|
|
90
|
-
`}
|
package/dist/src/schemas/api.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{z as e}from"zod";export const ApiMethodSchema=e.enum([`GET`,`POST`,`PUT`,`DELETE`,`PATCH`,`HEAD`,`OPTIONS`]);
|
package/dist/src/schemas/core.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{z as e}from"zod";export const MetaTagSchema=e.object({name:e.string().min(1),content:e.string()});export const ScriptConfigSchema=e.union([e.string().min(1),e.object({src:e.string().min(1).optional(),content:e.string().optional(),data:e.union([e.record(e.string(),e.unknown()),e.array(e.unknown()),e.string()]).optional(),type:e.string().optional(),async:e.boolean().optional(),defer:e.boolean().optional(),crossorigin:e.enum([`anonymous`,`use-credentials`]).optional(),integrity:e.string().optional(),nomodule:e.boolean().optional(),referrerpolicy:e.enum([`no-referrer`,`no-referrer-when-downgrade`,`origin`,`origin-when-cross-origin`,`same-origin`,`strict-origin`,`strict-origin-when-cross-origin`,`unsafe-url`]).optional(),attributes:e.record(e.string(),e.string()).optional()}).refine(e=>e.src||e.content||e.data,{message:`Script must have either 'src', 'content', or 'data'`})]);export const RenderOptionsSchema=e.object({title:e.string().optional(),scripts:e.array(ScriptConfigSchema).optional(),styles:e.array(e.string().min(1)).optional(),meta:e.array(MetaTagSchema).optional()});
|
|
@@ -1 +0,0 @@
|
|
|
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()),!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 +0,0 @@
|
|
|
1
|
-
import{z as e}from"zod";export const LayoutContextSchema=e.object({request:e.instanceof(Request),params:e.record(e.string(),e.string()),query:e.instanceof(URLSearchParams),state:e.instanceof(Map),middlewareContext:e.any().optional()});export const LayoutDataSchema=e.record(e.string(),e.unknown());export const LayoutRouteSchema=e.object({pattern:e.instanceof(URLPattern),layoutPath:e.string().min(1),priority:e.number().int().min(0),type:e.enum([`root`,`nested`]),depth:e.number().int().min(0)});export const LayoutHandlerSchema=e.object({component:e.any(),loader:e.any().optional(),path:e.string().min(1),priority:e.number().int().min(0)});export const LayoutPropsSchema=e.object({children:e.any(),data:LayoutDataSchema,frontmatter:e.record(e.string(),e.any()).optional(),route:e.object({path:e.string(),params:e.record(e.string(),e.string()),query:e.instanceof(URLSearchParams)})});export const LayoutDiscoveryOptionsSchema=e.object({baseDirectory:e.string().min(1),filePattern:e.string().min(1).optional().default(`_layout.tsx`),excludeDirectories:e.array(e.string()).optional().default([]),enableWatching:e.boolean().optional().default(!1),developmentMode:e.boolean().optional().default(!1)});export const RouteInfoSchema=e.object({path:e.string(),params:e.record(e.string(),e.string()),method:e.string(),headers:e.instanceof(Headers)});export const LayoutRuleSchema=e.object({matches:e.any(),apply:e.boolean(),priority:e.number().int()});export const LayoutConfigSchema=e.object({skipLayouts:e.array(e.string()).optional(),replaceLayout:e.boolean().optional(),onlyLayouts:e.array(e.string()).optional(),customLayout:e.string().optional()});export const IslandStateSchema=e.record(e.string(),e.unknown());export const PersistentIslandPropsSchema=e.object({persistentId:e.string().min(1),children:e.any()});export const PersistentIslandContextSchema=e.object({saveState:e.any(),loadState:e.any(),clearState:e.any()});export const LayoutErrorInfoSchema=e.object({layoutPath:e.string(),errorType:e.enum([`component`,`loader`,`rendering`,`island`]),timestamp:e.number().int().positive(),componentStack:e.string().optional(),errorBoundary:e.string().optional()});export const LayoutErrorBoundaryPropsSchema=e.object({children:e.any(),fallback:e.any(),onError:e.any().optional()});export const ErrorRecoveryStrategySchema=e.object({type:e.enum([`retry`,`fallback`,`skip`,`redirect`]),maxRetries:e.number().int().positive().optional(),fallbackComponent:e.any().optional(),redirectUrl:e.url().optional()});export const StreamingLayoutPropsSchema=e.object({children:e.any(),fallback:e.any().optional(),priority:e.enum([`high`,`medium`,`low`]).default(`medium`)});export const StreamingComponentSchema=e.object({component:e.any(),fallback:e.any(),priority:e.number().int().min(0),isReady:e.any()});export const ResolvedLayoutSchema=e.object({handlers:e.array(LayoutHandlerSchema),dataLoaders:e.array(e.any()),errorBoundaries:e.array(e.any()),streamingComponents:e.array(StreamingComponentSchema),metadata:e.object({totalLayouts:e.number().int().min(0),resolutionTime:e.number().positive(),cacheHit:e.boolean()})});export const LayoutCacheSchema=e.object({resolved:e.instanceof(Map),handlers:e.instanceof(Map),data:e.instanceof(Map),ttl:e.instanceof(Map)});export const EnhancedLayoutContextSchema=LayoutContextSchema.extend({layouts:e.array(LayoutHandlerSchema),parentData:e.array(LayoutDataSchema),islandStates:e.instanceof(Map),streamingEnabled:e.boolean(),errorBoundaries:e.array(e.any())});
|
|
@@ -1 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
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 +0,0 @@
|
|
|
1
|
-
export function asIsland(e){return e}
|
package/dist/src/types/layout.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export{LayoutDiscovery}from"../core/layout/layout-discovery.js";export{LayoutDataLoader}from"../core/layout/layout-data-loader.js";export{LayoutMatcher as LayoutMatcherClass}from"../core/layout/layout-matcher.js";export{LayoutComposer}from"../core/layout/layout-composer.js";export{IslandPersistence,defaultIslandPersistence}from"../core/islands/island-persistence.js";export{IslandStateSerializer}from"../core/islands/island-state-serializer.js";export{createPersistentIslandContext,usePersistentIslandContext,PersistentIslandProvider}from"../core/islands/persistent-island-context.js";export{PersistentIsland}from"../components/PersistentIsland.js";export{LayoutErrorBoundary}from"../components/LayoutErrorBoundary.js";export{LayoutDataErrorBoundary}from"../components/LayoutDataErrorBoundary.js";export{IslandErrorBoundary,withIslandErrorBoundary}from"../components/IslandErrorBoundary.js";export{StreamingLayout,StreamingSuspense,withStreaming,useStreamingState}from"../components/StreamingLayout.js";export{EnhancedLayoutResolver,createEnhancedLayoutResolver,EnhancedLayoutResolverUtils}from"../core/layout/enhanced-layout-resolver.js";export{LayoutCacheManager}from"../core/layout/layout-cache-manager.js";
|
|
@@ -1 +0,0 @@
|
|
|
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))}
|
package/dist/src/types/types.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export*from"./layout.js";
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
export function isDev(){try{return process.env.NODE_ENV!==`production`}catch{return!0}}export function isVerbose(){try{return process.env.AVALON_VERBOSE===`1`}catch{return!1}}export function devLog(...n){isDev()&&isVerbose()&&console.log(...n)}export function devWarn(...t){isDev()&&console.warn(...t)}export function devError(...t){isDev()&&console.error(...t)}export function logRenderTiming(n,r,i=100){!isDev()||!isVerbose()||(r>i?console.warn(`⚠️ Slow island render: ${n} took ${r.toFixed(2)}ms`):console.log(`🏝️ ${n} rendered in ${r.toFixed(2)}ms`))}export function logCacheHit(n,r){!isDev()||!isVerbose()||console.log(`📦 Cache HIT [${n}]: ${r}`)}export function logCacheMiss(n,r){!isDev()||!isVerbose()||console.log(`📭 Cache MISS [${n}]: ${r}`)}const a=`
|
|
2
|
-
█████╗ ██╗ ██╗ █████╗ ██╗ ██████╗ ███╗ ██╗
|
|
3
|
-
██╔══██╗██║ ██║██╔══██╗██║ ██╔═══██╗████╗ ██║
|
|
4
|
-
███████║██║ ██║███████║██║ ██║ ██║██╔██╗ ██║
|
|
5
|
-
██╔══██║╚██╗ ██╔╝██╔══██║██║ ██║ ██║██║╚██╗██║
|
|
6
|
-
██║ ██║ ╚████╔╝ ██║ ██║███████╗╚██████╔╝██║ ╚████║
|
|
7
|
-
╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═╝ ╚═══╝
|
|
8
|
-
`,o={reset:`\x1B[0m`,cyan:`\x1B[36m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,magenta:`\x1B[35m`,gray:`\x1B[90m`,bold:`\x1B[1m`},s=[`⠋`,`⠙`,`⠹`,`⠸`,`⠼`,`⠴`,`⠦`,`⠧`,`⠇`,`⠏`];export class DevLogger{tasks=new Map;spinnerInterval;currentFrame=0;startTime=Date.now();originalConsoleLog;originalConsoleWarn;originalConsoleError;suppressedLogs=[];headerLines=0;constructor(){this.originalConsoleLog=console.log,this.originalConsoleWarn=console.warn,this.originalConsoleError=console.error,this.suppressConsole(),process.stdout.write(`\x1B[2J\x1B[H`);let e=o.cyan+a+o.reset+`
|
|
9
|
-
`+o.gray+` Development Server`+o.reset+`
|
|
10
|
-
|
|
11
|
-
`;this.headerLines=a.split(`
|
|
12
|
-
`).length+2,process.stdout.write(e)}suppressConsole(){console.log=(...e)=>{this.suppressedLogs.push(e.map(String).join(` `))},console.warn=(...e)=>{this.suppressedLogs.push(`[WARN] `+e.map(String).join(` `))},console.error=this.originalConsoleError}restoreConsole(){console.log=this.originalConsoleLog,console.warn=this.originalConsoleWarn,console.error=this.originalConsoleError}addTask(e,t){this.tasks.set(e,{name:t,status:`pending`}),this.render()}startTask(e){let t=this.tasks.get(e);t&&(t.status=`running`,t.startTime=Date.now(),this.render())}completeTask(e){let t=this.tasks.get(e);t&&(t.status=`done`,this.render())}render(){let e=null;for(let t of this.tasks.values())if(t.status===`running`){e=t;break}let t=`\r`;if(e){let n=o.cyan+s[this.currentFrame]+o.reset;t+=`${n} ${e.name}`}else t+=`${o.gray}Initializing...${o.reset}`;t+=`\x1B[K`,process.stdout.write(t)}startSpinner(){this.spinnerInterval=setInterval(()=>{this.currentFrame=(this.currentFrame+1)%s.length,this.render()},100)}stopSpinner(){this.spinnerInterval&&clearInterval(this.spinnerInterval)}finish(e,t,n){this.stopSpinner();let r=`\x1b[${this.headerLines+1};0H`;r+=`\x1B[J`,process.stdout.write(r);let i=((Date.now()-this.startTime)/1e3).toFixed(1);this.originalConsoleLog(``),this.originalConsoleLog(o.green+o.bold+`✨ Server ready!`+o.reset),this.originalConsoleLog(``),this.originalConsoleLog(o.cyan+` ➜ `+o.reset+o.bold+`Local: `+o.reset+o.cyan+e+o.reset),t&&this.originalConsoleLog(o.cyan+` ➜ `+o.reset+o.bold+`Vite: `+o.reset+o.gray+t+o.reset),n&&this.originalConsoleLog(o.cyan+` ➜ `+o.reset+o.bold+`HMR: `+o.reset+o.gray+n+o.reset),this.originalConsoleLog(``),this.originalConsoleLog(o.gray+` Ready in ${i}s`+o.reset),this.originalConsoleLog(``),this.originalConsoleLog(o.gray+` Press Ctrl+C to stop`+o.reset),this.originalConsoleLog(``)}}
|
package/dist/src/utils/fs.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{readdirSync as e,statSync as t}from"node:fs";import{join as n}from"node:path";export async function*walk(e,t={}){let{maxDepth:n=1/0,includeFiles:r=!0,includeDirs:i=!0,exts:a,match:s,skip:c}=t;yield*o(e,0,{maxDepth:n,includeFiles:r,includeDirs:i,exts:a,match:s,skip:c})}function i(e,t,n){return!(n.exts&&!n.exts.some(t=>e.endsWith(t))||n.match&&!n.match.some(e=>e.test(t)))}function a(e,t){return!t||t.some(t=>t.test(e))}function*o(t,r,s){if(r>s.maxDepth)return;let c;try{c=e(t,{withFileTypes:!0})}catch{return}for(let e of c){let c=n(t,e.name);if(s.skip?.some(e=>e.test(c)))continue;let l={path:c,name:e.name,isFile:e.isFile(),isDirectory:e.isDirectory(),isSymlink:e.isSymbolicLink()};e.isDirectory()?(s.includeDirs&&a(c,s.match)&&(yield l),yield*o(c,r+1,s)):e.isFile()&&s.includeFiles&&i(e.name,c,s)&&(yield l)}}export async function ensureDir(e){let{mkdirSync:t}=await import(`node:fs`);try{t(e,{recursive:!0})}catch{}}export function exists(e){try{return t(e),Promise.resolve(!0)}catch{return Promise.resolve(!1)}}export function existsSync(e){try{return t(e),!0}catch{return!1}}export async function emptyDir(e){let{rmSync:t,mkdirSync:n}=await import(`node:fs`);try{t(e,{recursive:!0,force:!0})}catch{}n(e,{recursive:!0})}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{resolve as e}from"node:path";import{stat as t,readdir as n,readFile as r}from"node:fs/promises";import{openSync as i,readSync as a,closeSync as o}from"node:fs";const s={".vue":`vue`,".svelte":`svelte`},c=[{pattern:/\.solid\.(tsx|jsx)$/,integration:`solid`},{pattern:/\.react\.(tsx|jsx)$/,integration:`react`},{pattern:/\.lit\.(ts|js)$/,integration:`lit`},{pattern:/\.preact\.(tsx|jsx)$/,integration:`preact`},{pattern:/\.qwik\.(tsx|jsx)$/,integration:`qwik`}],l=[{pattern:/from\s+['"]react['"]/,integration:`react`},{pattern:/@jsxImportSource\s+react/,integration:`react`},{pattern:/from\s+['"]solid-js['"]/,integration:`solid`},{pattern:/@jsxImportSource\s+solid-js/,integration:`solid`},{pattern:/from\s+['"]preact['"]/,integration:`preact`},{pattern:/@jsxImportSource\s+preact/,integration:`preact`},{pattern:/from\s+['"]@builder\.io\/qwik['"]/,integration:`qwik`},{pattern:/@jsxImportSource\s+@builder\.io\/qwik/,integration:`qwik`}],u=`preact`,d=[`.tsx`,`.jsx`,`.ts`,`.js`,`.vue`,`.svelte`];export async function discoverIntegrationsFromFiles(n,r){let i=r?e(r,n):e(n);try{if(!(await t(i)).isDirectory())return new Set}catch{return new Set}let a=new Set;return await f(i,a),a}async function f(t,r){try{let i=await n(t,{withFileTypes:!0});for(let n of i){let i=e(t,n.name);if(n.isDirectory())await f(i,r);else if(n.isFile()){let e=await m(i,n.name);e&&r.add(e)}}}catch(e){(!(e instanceof Error)||e.code!==`EACCES`)&&console.warn(`Warning: Could not scan directory ${t}:`,e)}}function p(e){try{let t=i(e,`r`),n=Buffer.alloc(500);a(t,n,0,500,0),o(t);let r=n.toString(`utf-8`);for(let{pattern:e,integration:t}of l)if(e.test(r))return t}catch{}return u}async function m(e,t){let n=t.toLowerCase();for(let{pattern:e,integration:t}of c)if(e.test(n))return t;for(let[e,t]of Object.entries(s))if(n.endsWith(e))return t;return n.endsWith(`.tsx`)||n.endsWith(`.jsx`)?p(e):(n.endsWith(`.ts`)||n.endsWith(`.js`))&&!n.endsWith(`.d.ts`)&&/^[A-Z]/.test(t)?`lit`:null}export function detectIntegrationFromFileName(e){let t=e.toLowerCase();for(let{pattern:e,integration:n}of c)if(e.test(t))return n;for(let[e,n]of Object.entries(s))if(t.endsWith(e))return n;return t.endsWith(`.tsx`)||t.endsWith(`.jsx`)?u:(t.endsWith(`.ts`)||t.endsWith(`.js`))&&!t.endsWith(`.d.ts`)&&/^[A-Z]/.test(e)?`lit`:null}export function isSupportedExtension(e){return d.includes(e.toLowerCase())}export function getSupportedExtensions(){return d}export async function discoverIntegrationsFromIslandUsage(n,r,i,a){let o=new Set,s=i??process.cwd(),c=[e(s,n),e(s,r)];a&&c.push(e(s,a));for(let e of c)try{(await t(e)).isDirectory()&&await h(e,s,o)}catch{}return o}async function h(t,r,i){try{let a=await n(t,{withFileTypes:!0});for(let n of a){let a=e(t,n.name);n.isDirectory()?await h(a,r,i):n.isFile()&&g(n.name)&&await v(a,r,i)}}catch(e){!(e instanceof Error)||e.code}}function g(e){let t=e.toLowerCase();return t.endsWith(`.tsx`)||t.endsWith(`.jsx`)||t.endsWith(`.mdx`)}const _=[{pattern:/\.qwik\./,integration:`qwik`}];async function v(e,t,n){try{let i=await r(e,`utf-8`),a=y(i),o=b(i);for(let r of o){let i=a.get(r);if(!i)continue;let o=x(i,e,t);if(!o)continue;let s=await S(o);s&&n.add(s)}for(let[,e]of a)for(let{pattern:t,integration:r}of _)t.test(e)&&n.add(r)}catch{}}function y(e){let t=new Map,n=/import\s+(\w+)\s+from\s+['"]([^'"]+)['"]/g,r;for(;(r=n.exec(e))!==null;)t.set(r[1],r[2]);let i=/import\s+\{([^}]+)\}\s+from\s+['"]([^'"]+)['"]/g;for(;(r=i.exec(e))!==null;){let e=r[1].split(`,`).map(e=>e.trim()),n=r[2];for(let r of e){let e=r.match(/(\w+)\s+as\s+(\w+)/);e?t.set(e[2],n):r&&t.set(r,n)}}return t}function b(e){let t=new Set,n=/<([A-Z]\w*)\s+[^>]*\bisland\b/g,r;for(;(r=n.exec(e))!==null;)t.add(r[1]);return t}function x(t,n,r){if(t.startsWith(`.`))return e(e(n,`..`),t);for(let{prefix:n,replacement:i}of[{prefix:`@/`,replacement:`src/`},{prefix:`$components/`,replacement:`src/components/`},{prefix:`$islands/`,replacement:`src/islands/`},{prefix:`~/`,replacement:`src/`}])if(t.startsWith(n))return e(r,i,t.slice(n.length));return t.startsWith(`/src/`)?e(r,t.slice(1)):null}async function S(e){for(let n of[``,`.tsx`,`.jsx`,`.ts`,`.js`,`.vue`,`.svelte`]){let r=e+n;try{if((await t(r)).isFile())return m(r,r.split(`/`).pop()||``)}catch{}}return null}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{existsSync as e}from"node:fs";import{resolve as t}from"node:path";import n from"node:process";export const DEFAULT_MDX_CONFIG={jsxImportSource:`preact`,syntaxHighlighting:!0,remarkPlugins:[],rehypePlugins:[]};export const DEFAULT_IMAGE_CONFIG={enabled:!0,defaultFormat:`webp`,quality:80,widths:[200,400,600,800,1200],removeMetadata:!0,include:/^[^?]+\.(heif|avif|jpeg|jpg|png|tiff|webp|gif)(\?.*)?$/,exclude:`public/**/*`};export const DEFAULT_CONFIG={pagesDir:`src/pages`,layoutsDir:`src/layouts`,modules:null,integrations:[],mdx:DEFAULT_MDX_CONFIG,image:DEFAULT_IMAGE_CONFIG,verbose:!1,autoDiscoverIntegrations:!0,validateIntegrations:!0,showWarnings:!0,lazyIntegrations:!0};export const DEFAULT_MODULES_CONFIG={pagesDirName:`pages`,layoutsDirName:`layouts`};function s(e){return e?typeof e==`string`?{dir:e,pagesDirName:DEFAULT_MODULES_CONFIG.pagesDirName,layoutsDirName:DEFAULT_MODULES_CONFIG.layoutsDirName}:{dir:e.dir,pagesDirName:e.pagesDirName??DEFAULT_MODULES_CONFIG.pagesDirName,layoutsDirName:e.layoutsDirName??DEFAULT_MODULES_CONFIG.layoutsDirName}:null}function c(e){return e===!1?{...DEFAULT_IMAGE_CONFIG,enabled:!1}:e===void 0||e===!0?DEFAULT_IMAGE_CONFIG:{enabled:e.enabled??DEFAULT_IMAGE_CONFIG.enabled,defaultFormat:e.defaultFormat??DEFAULT_IMAGE_CONFIG.defaultFormat,quality:e.quality??DEFAULT_IMAGE_CONFIG.quality,widths:e.widths??DEFAULT_IMAGE_CONFIG.widths,removeMetadata:e.removeMetadata??DEFAULT_IMAGE_CONFIG.removeMetadata,include:e.include??DEFAULT_IMAGE_CONFIG.include,exclude:e.exclude??DEFAULT_IMAGE_CONFIG.exclude}}export function resolveConfig(e,t){let n=e??{},i=s(n.modules),o=c(n.image);return{pagesDir:n.pagesDir??DEFAULT_CONFIG.pagesDir,layoutsDir:n.layoutsDir??DEFAULT_CONFIG.layoutsDir,modules:i,integrations:n.integrations??DEFAULT_CONFIG.integrations,mdx:{jsxImportSource:n.mdx?.jsxImportSource??DEFAULT_MDX_CONFIG.jsxImportSource,syntaxHighlighting:n.mdx?.syntaxHighlighting??DEFAULT_MDX_CONFIG.syntaxHighlighting,remarkPlugins:n.mdx?.remarkPlugins??DEFAULT_MDX_CONFIG.remarkPlugins,rehypePlugins:n.mdx?.rehypePlugins??DEFAULT_MDX_CONFIG.rehypePlugins},image:o,verbose:n.verbose??DEFAULT_CONFIG.verbose,autoDiscoverIntegrations:n.autoDiscoverIntegrations??DEFAULT_CONFIG.autoDiscoverIntegrations,validateIntegrations:n.validateIntegrations??DEFAULT_CONFIG.validateIntegrations,showWarnings:n.showWarnings??DEFAULT_CONFIG.showWarnings,lazyIntegrations:n.lazyIntegrations??DEFAULT_CONFIG.lazyIntegrations,isDev:t}}export function checkDirectoriesExist(r,i=n.cwd()){let a=[];!r.modules&&r.pagesDir&&a.push({path:r.pagesDir,type:`pages`}),r.layoutsDir&&a.push({path:r.layoutsDir,type:`layouts`});let o=[];for(let{path:n,type:s}of a){let a=t(i,n),c=e(a);o.push({path:n,absolutePath:a,exists:c,type:s}),!c&&r.showWarnings&&console.warn(`⚠️ Avalon: ${s} directory '${n}' does not exist (resolved to: ${a}). This directory will be skipped.`)}return o}export function logDirectoryCheckSummary(e,t){let n=e.filter(e=>!e.exists),r=e.filter(e=>e.exists);t&&(r.length>0&&console.log(` ✅ Found directories: ${r.map(e=>e.path).join(`, `)}`),n.length>0&&console.log(` ⚠️ Missing directories: ${n.map(e=>e.path).join(`, `)}`))}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export class AvalonConfigError extends Error{field;value;constructor(t,r,i){let a=n(i);super(`Avalon configuration error in '${r}': ${t}\nReceived value: ${a}`),this.name=`AvalonConfigError`,this.field=r,this.value=i,Error.captureStackTrace&&Error.captureStackTrace(this,AvalonConfigError)}}export class IntegrationError extends Error{integrationName;originalCause;constructor(e,n,r){super(`Integration '${n}': ${e}`,{cause:r}),this.name=`IntegrationError`,this.integrationName=n,this.originalCause=r,Error.captureStackTrace&&Error.captureStackTrace(this,IntegrationError)}}function n(e){if(e===void 0)return`undefined`;if(e===null)return`null`;if(typeof e==`string`)return`"${e}"`;if(typeof e==`function`)return`[Function]`;if(Array.isArray(e))return e.length===0?`[]`:e.length<=3?`[${e.map(n).join(`, `)}]`:`[${e.slice(0,3).map(n).join(`, `)}, ... (${e.length} items)]`;if(typeof e==`object`)try{return JSON.stringify(e)}catch{return`[Circular]`}return String(e)}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import{createRequire as e}from"node:module";import{join as t}from"node:path";export async function createImagePlugin(n,r){if(!n.enabled)return r&&console.log(` ⏭️ Image optimization disabled`),[];try{let{imagetools:i}=e(t(process.cwd(),`package.json`))(`vite-imagetools`);return r&&(console.log(` 🖼️ Image optimization enabled`),console.log(` Format: ${n.defaultFormat}`),console.log(` Quality: ${n.quality}`),console.log(` Widths: ${n.widths.join(`, `)}`)),[i({include:n.include,exclude:n.exclude,removeMetadata:n.removeMetadata,defaultDirectives:e=>{let t=new URLSearchParams;return e.searchParams.has(`format`)||t.set(`format`,n.defaultFormat),e.searchParams.has(`quality`)||t.set(`quality`,String(n.quality)),e.searchParams.has(`jsx`)&&(!e.searchParams.has(`w`)&&!e.searchParams.has(`width`)&&t.set(`w`,n.widths.join(`;`)),t.set(`as`,`picture`)),t}})]}catch(e){let t=e instanceof Error?e.message:String(e);if(t.includes(`Cannot find package`)||t.includes(`MODULE_NOT_FOUND`))return console.warn(`⚠️ Avalon: Image optimization is enabled but vite-imagetools is not installed.
|
|
2
|
-
Install it with: bun add -d vite-imagetools
|
|
3
|
-
Or disable image optimization: image: false`),[];throw e}}export const IMAGE_TYPES_DECLARATION=`
|
|
4
|
-
declare module '*.jpg' {
|
|
5
|
-
const src: string;
|
|
6
|
-
export default src;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
declare module '*.jpeg' {
|
|
10
|
-
const src: string;
|
|
11
|
-
export default src;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
declare module '*.png' {
|
|
15
|
-
const src: string;
|
|
16
|
-
export default src;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
declare module '*.webp' {
|
|
20
|
-
const src: string;
|
|
21
|
-
export default src;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
declare module '*.avif' {
|
|
25
|
-
const src: string;
|
|
26
|
-
export default src;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
declare module '*.gif' {
|
|
30
|
-
const src: string;
|
|
31
|
-
export default src;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
declare module '*?jsx' {
|
|
35
|
-
import type { ComponentType } from 'preact';
|
|
36
|
-
const Component: ComponentType<{ alt: string; class?: string; style?: Record<string, string> }>;
|
|
37
|
-
export default Component;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
declare module '*&jsx' {
|
|
41
|
-
import type { ComponentType } from 'preact';
|
|
42
|
-
const Component: ComponentType<{ alt: string; class?: string; style?: Record<string, string> }>;
|
|
43
|
-
export default Component;
|
|
44
|
-
}
|
|
45
|
-
`;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{loadIntegration as e}from"../islands/integration-loader.js";import{IntegrationError as t}from"./errors.js";export const VALID_INTEGRATION_NAMES=[`react`,`preact`,`vue`,`svelte`,`solid`,`lit`,`qwik`];export function isValidIntegrationName(e){return VALID_INTEGRATION_NAMES.includes(e)}export async function activateIntegrations(n,r){let{integrations:i}=n;for(let n of i){if(!isValidIntegrationName(n))throw new t(`Invalid integration name '${n}'. Valid integration names are: ${VALID_INTEGRATION_NAMES.join(`, `)}`,n);if(!r.has(n))try{await e(n),r.add(n)}catch(e){throw new t(`Failed to activate integration. Is @useavalon/${n} installed?`,n,e)}}}export async function activateSingleIntegration(n,r,i=!1){if(!isValidIntegrationName(n))throw new t(`Invalid integration name '${n}'. Valid integration names are: ${VALID_INTEGRATION_NAMES.join(`, `)}`,n);if(r.has(n))return!1;try{return await e(n),r.add(n),!0}catch(e){throw new t(`Failed to activate integration. Is @useavalon/${n} installed?`,n,e)}}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{readFile as e,access as t}from"node:fs/promises";import n from"node:path";import{detectFrameworkFromPath as r}from"../islands/integration-loader.js";import{EXTRACTOR_MAP as i}from"../build/prop-extractors/index.js";import{renderSidecarContent as a}from"../build/sidecar-renderer.js";import{getSidecarPath as o,writeSidecarIfChanged as s,deleteSidecar as c,isSidecarFresh as l}from"../build/sidecar-file-manager.js";const u=new Set([`react`,`preact`]),d=[`.vue`,`.svelte`,`.lit.ts`,`.solid.tsx`,`.qwik.tsx`];export async function checkTsConfigForArbitraryExtensions(t){let r=n.join(t,`tsconfig.json`);try{let t=await e(r,`utf-8`);JSON.parse(t)?.compilerOptions?.allowArbitraryExtensions!==!0&&console.warn(`[avalon] tsconfig.json is missing "allowArbitraryExtensions: true" — sidecar .d.[ext].ts files require this setting`)}catch{}}function f(e){let t=n.basename(e);return/\.d\.(vue|svelte|lit|solid\.tsx)/.test(t)}function p(e){return f(e)?!1:d.some(t=>e.endsWith(t))}async function m(t,n){try{let n=r(t);if(u.has(n))return!1;let c=i[n];if(!c)return!1;let l=a(c(await e(t,`utf-8`)).propsType);return await s(o(t),l)}catch(e){return n&&console.warn(`[avalon] Failed to generate sidecar for ${t}:`,e instanceof Error?e.message:e),!1}}export function islandSidecarPlugin(e={}){let n,r=new Set;return{name:`avalon:island-sidecar`,configResolved(e){n=e.root},async buildStart(){await checkTsConfigForArbitraryExtensions(n),r.clear()},async load(t){return!p(t)||r.has(t)||(r.add(t),await l(t,o(t)))||await m(t,e.verbose)&&e.verbose&&console.log(`[avalon] Generated sidecar for: ${t}`),null},async handleHotUpdate(n){let i=n.file;if(!p(i))return;let a=!0;try{await t(i)}catch{a=!1}if(!a){await c(o(i))&&e.verbose&&console.log(`[avalon] Deleted sidecar for removed file: ${i}`),r.delete(i);return}r.delete(i),await m(i,e.verbose)&&e.verbose&&console.log(`[avalon] Updated sidecar for: ${i}`)}}}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{readdir as e,stat as t}from"node:fs/promises";import{resolve as n,join as r}from"node:path";export async function discoverModules(t,i){let s=n(i,t.dir),c=[],l=[],u=[];try{let n=await e(s,{withFileTypes:!0});for(let e of n){if(!e.isDirectory()||e.name.startsWith(`.`)||e.name===`node_modules`)continue;let n=r(s,e.name),i=r(n,t.pagesDirName),d=r(n,t.layoutsDirName),[f,p]=await Promise.all([o(i),o(d)]),m=a(e.name),h={name:e.name,path:n,pagesDir:f?i:null,layoutsDir:p?d:null,routePrefix:m};c.push(h),f&&l.push({dir:i,prefix:m}),p&&u.push({dir:d,prefix:m})}}catch{}return c.sort((e,t)=>e.routePrefix===`/`?-1:t.routePrefix===`/`?1:e.name.localeCompare(t.name)),{modules:c,pageDirs:l,layoutDirs:u}}function a(e){return[`home`,`root`,`main`,`index`].includes(e.toLowerCase())?`/`:`/`+e}async function o(e){try{return(await t(e)).isDirectory()}catch{return!1}}export async function getAllPageDirs(e,t,r){let a=[],s=n(r,e);if(await o(s)&&a.push({dir:s,prefix:`/`}),t){let{pageDirs:e}=await discoverModules(t,r);a.push(...e)}return a}export async function getAllLayoutDirs(e,t,r){let a=[],s=n(r,e);if(await o(s)&&a.push({dir:s,prefix:`/`}),t){let{layoutDirs:e}=await discoverModules(t,r);a.push(...e)}return a}
|