@useavalon/avalon 0.1.89 → 0.1.91
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/build/integration-bundler-plugin.d.ts +1 -1
- package/dist/src/build/integration-detection-plugin.d.ts +1 -1
- package/dist/src/build/integration-detection-plugin.js +1 -1
- package/dist/src/build/integration-resolver-plugin.d.ts +1 -1
- package/dist/src/build/island-code-splitting.d.ts +1 -1
- package/dist/src/build/island-manifest.d.ts +2 -2
- package/dist/src/build/island-manifest.js +1 -1
- package/dist/src/build/island-types-generator.js +4 -4
- package/dist/src/build/mdx-island-transform.js +1 -1
- package/dist/src/build/mdx-plugin.d.ts +2 -2
- package/dist/src/build/prop-extractors/index.d.ts +3 -3
- package/dist/src/build/prop-extractors/index.js +1 -1
- package/dist/src/build/prop-extractors/lit.js +1 -1
- package/dist/src/build/prop-extractors/svelte.js +1 -1
- package/dist/src/build/sidecar-file-manager.js +1 -1
- package/dist/src/client/adapters/index.d.ts +1 -1
- package/dist/src/client/adapters/index.js +1 -1
- package/dist/src/client/css-hmr-handler.d.ts +2 -2
- package/dist/src/client/framework-adapter.d.ts +2 -2
- package/dist/src/client/hmr-coordinator.d.ts +6 -6
- package/dist/src/client/types/framework-runtime.d.ts +54 -55
- package/dist/src/client/types/vite-hmr.d.ts +35 -35
- package/dist/src/client/types/vite-virtual-modules.d.ts +56 -28
- package/dist/src/core/components/component-analyzer.d.ts +3 -3
- package/dist/src/core/components/component-analyzer.js +1 -1
- package/dist/src/core/components/component-detection.d.ts +8 -8
- package/dist/src/core/components/component-detection.js +1 -1
- package/dist/src/core/components/enhanced-framework-detector.d.ts +2 -2
- package/dist/src/core/components/enhanced-framework-detector.js +1 -1
- package/dist/src/core/components/framework-registry.d.ts +1 -1
- package/dist/src/core/integrations/index.d.ts +1 -1
- package/dist/src/core/integrations/index.js +1 -1
- package/dist/src/core/integrations/registry.js +1 -1
- package/dist/src/core/layout/enhanced-layout-resolver.d.ts +8 -8
- package/dist/src/core/layout/enhanced-layout-resolver.js +1 -1
- package/dist/src/core/layout/layout-cache-manager.d.ts +1 -1
- package/dist/src/core/layout/layout-composer.d.ts +2 -2
- package/dist/src/core/layout/layout-composer.js +1 -1
- package/dist/src/core/layout/layout-data-loader.d.ts +2 -2
- package/dist/src/core/layout/layout-discovery.d.ts +2 -2
- package/dist/src/core/layout/layout-discovery.js +1 -1
- package/dist/src/core/layout/layout-matcher.d.ts +1 -1
- package/dist/src/core/layout/layout-matcher.js +1 -1
- package/dist/src/core/layout/layout-types.d.ts +3 -3
- package/dist/src/islands/component-analysis.d.ts +4 -4
- package/dist/src/islands/component-analysis.js +1 -1
- package/dist/src/islands/css-utils.js +1 -1
- package/dist/src/islands/discovery/index.d.ts +9 -9
- package/dist/src/islands/discovery/index.js +1 -1
- package/dist/src/islands/discovery/registry.d.ts +1 -1
- package/dist/src/islands/discovery/resolver.d.ts +1 -1
- package/dist/src/islands/discovery/resolver.js +2 -2
- package/dist/src/islands/discovery/scanner.d.ts +1 -1
- package/dist/src/islands/discovery/scanner.js +1 -1
- package/dist/src/islands/discovery/validator.d.ts +1 -1
- package/dist/src/islands/discovery/validator.js +9 -9
- package/dist/src/islands/discovery/watcher.d.ts +1 -1
- package/dist/src/islands/discovery/watcher.js +1 -1
- package/dist/src/islands/framework-detection.d.ts +3 -3
- package/dist/src/islands/framework-detection.js +1 -1
- package/dist/src/islands/island.js +1 -1
- package/dist/src/islands/universal-head-collector.d.ts +2 -2
- package/dist/src/middleware/discovery.d.ts +1 -1
- package/dist/src/middleware/discovery.js +1 -1
- package/dist/src/middleware/executor.d.ts +2 -2
- package/dist/src/middleware/index.d.ts +3 -3
- package/dist/src/middleware/index.js +1 -1
- package/dist/src/middleware/types.d.ts +2 -2
- package/dist/src/nitro/error-handler.d.ts +2 -2
- package/dist/src/nitro/error-handler.js +2 -2
- package/dist/src/nitro/index.d.ts +8 -8
- package/dist/src/nitro/index.js +1 -1
- package/dist/src/nitro/island-manifest.d.ts +1 -1
- package/dist/src/nitro/island-manifest.js +1 -1
- package/dist/src/nitro/middleware-adapter.d.ts +2 -2
- package/dist/src/nitro/types.d.ts +4 -4
- package/dist/src/render/isolated-ssr-renderer.d.ts +2 -2
- package/dist/src/render/isolated-ssr-renderer.js +1 -1
- package/dist/src/render/ssr.d.ts +5 -5
- package/dist/src/render/ssr.js +4 -4
- package/dist/src/schemas/api.d.ts +1 -1
- package/dist/src/schemas/core.d.ts +1 -1
- package/dist/src/schemas/index.d.ts +8 -8
- package/dist/src/schemas/index.js +1 -1
- package/dist/src/schemas/routing/index.d.ts +1 -1
- package/dist/src/schemas/routing/index.js +1 -1
- package/dist/src/schemas/routing.d.ts +4 -4
- package/dist/src/schemas/routing.js +1 -1
- package/dist/src/types/image.d.ts +38 -38
- package/dist/src/types/island-jsx.d.ts +16 -16
- package/dist/src/types/mdx.d.ts +2 -2
- package/dist/src/types/routing.d.ts +7 -7
- package/dist/src/types/routing.js +1 -1
- package/dist/src/types/virtual-modules.d.ts +1 -1
- package/dist/src/types/vite-env.d.ts +1 -1
- package/dist/src/vite-plugin/auto-discover.js +1 -1
- package/dist/src/vite-plugin/config.d.ts +1 -1
- package/dist/src/vite-plugin/image-optimization.d.ts +2 -2
- package/dist/src/vite-plugin/image-optimization.js +1 -1
- package/dist/src/vite-plugin/island-sidecar-plugin.js +1 -1
- package/dist/src/vite-plugin/module-discovery.js +1 -1
- package/dist/src/vite-plugin/plugin.d.ts +2 -2
- package/dist/src/vite-plugin/plugin.js +1 -1
- package/dist/src/vite-plugin/types.d.ts +1 -2
- package/package.json +3 -2
- package/dist/src/client/main-slim.js +0 -1
- package/dist/src/client/strategies.js +0 -1
package/dist/src/render/ssr.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{readFile as e}from"node:fs/promises";import{h as t}from"preact";import{render as n}from"preact-render-to-string";import{analyzeComponentContent as r}from"../core/components/component-analyzer.js";import{getUniversalCSSForHead as i}from"../islands/universal-css-collector.js";import{getUniversalHeadForInjection as a,injectSolidHydrationScriptIfNeeded as o}from"../islands/universal-head-collector.js";import{IsolatedSSRRenderer as s}from"./isolated-ssr-renderer.js";function c(e){let t=e;if(!(e.includes(`data-framework=`)||e.includes(`data-src=`)))return e;if(!e.includes(`data-universal-ssr="true"`)){let n=i(!0);n&&e.includes(`</head>`)&&(t=t.replace(`</head>`,`${n}\n</head>`))}let n=a(!0);if(n&&e.includes(`</head>`)&&(t=t.replace(`</head>`,` ${n}\n</head>`)),t=o(t),e.includes(`/src/client/main.js`)||e.includes(`main.js`))return t;let r=`<script type="module" src="/src/client/main.js"><\/script>`;return t.includes(`</body>`)?t.replace(`</body>`,`${r}\n</body>`):t+r}const l={solid:[`solid-js`,`SolidIsland`,`createSignal`,`.solid.`,`data-solid-hydrate`],vue:[`data-vue-hydrate`,`.vue`,`Vue`],svelte:[`data-framework="svelte"`,`.svelte`,`s-`]};let u=null;function d(){return u||=new s({enableStrictIsolation:!0,allowedCrossFrameworkImports:[`preact`,`preact-render-to-string`],errorHandling:`fallback`,debugLogging:process.env.NODE_ENV!==`production`}),u}function f(e){return{solid:l.solid.some(t=>e.includes(t)),vue:l.vue.some(t=>e.includes(t)),svelte:l.svelte.some(t=>e.includes(t))}}function p(e,t,n){let r=[],i=/^import\s[^'"]*['"]([^'"]+)['"]/gm,a=[];for(let e=i.exec(t);e!==null;e=i.exec(t))a.push(e[1]);let o=n;e.includes(`.solid.`)?o=`solid`:e.includes(`.preact.`)&&(o=`preact`);let s=new Map([[`preact`,[`solid-js`,`solid-js/web`,`vue`,`svelte`]],[`solid`,[`preact`,`preact-render-to-string`,`vue`,`svelte`]],[`vue`,[`preact`,`solid-js`,`svelte`]],[`svelte`,[`preact`,`solid-js`,`vue`]]]).get(o)||[];for(let t of a)for(let n of s)t.startsWith(n)&&r.push(`Cross-framework import detected: ${o} component (${e}) importing ${t}`);return r}function m(e,t){return t.type===`ssr-only`?e.replaceAll(/data-hydrate="[^"]*"\s*/g,``).replace(`>`,` data-render-strategy="${t.type}" data-ssr-reason="${t.reason}">`):e.replace(`>`,` data-render-strategy="${t.type}" data-hydrate-reason="${t.reason}">`)}async function h(e,t={}){let n=/(<[^>]*data-hydrate="([^"]*)"[^>]*>)/g,r=e,i=Array.from(e.matchAll(n));for(let e of i){let[n,i,a]=e;try{if(n.includes(`data-render-strategy`))continue;let e=await _(a,t);await g(a,t),r=r.replace(n,m(n,e)),t.logDecisions===!0&&(console.log(`[SSR Strategy] ${a} -> ${e.type.toUpperCase()}: ${e.reason}`),e.warnings&&e.warnings.length>0&&!t.suppressWarnings&&e.warnings.forEach(e=>console.warn(`[SSR Warning] ${a}: ${e}`)))}catch(e){console.warn(`Failed to analyze component ${a}:`,e);let t=n.replace(`>`,` data-render-strategy="hydrate" data-error="analysis-failed">`);r=r.replace(n,t)}}return r}async function g(t,n={}){try{let r,i=t;t.startsWith(`/`)&&(i=t.substring(1));let a=[i,`examples/${i.split(`/`).pop()}`,`src/islands/${i.split(`/`).pop()}`,`islands/${i.split(`/`).pop()}`],o=``;for(let t of a)try{r=await e(t,`utf-8`),o=t;break}catch{}if(!o||!r)return;let s=f(r),c=`preact`;s.solid?c=`solid`:s.vue?c=`vue`:s.svelte&&(c=`svelte`);let l=p(o,r,c);l.length>0&&!n.suppressWarnings&&l.forEach(e=>console.warn(`[Import Validation] ${e}`))}catch(e){n.logDecisions!==!1&&console.warn(`Import validation failed for ${t}:`,e)}}async function _(t,n={}){if(n.forceSSROnly)return{type:`ssr-only`,reason:`Explicitly configured for SSR-only rendering`};if(t.includes(`NoHydrate`)||t.includes(`Static`)||t.includes(`SSROnly`))return{type:`ssr-only`,reason:`Component name explicitly indicates SSR-only rendering`};if(n.detectScripts===!1)return{type:`hydrate`,reason:`Script detection disabled, defaulting to hydration`};try{let i,a=t;t.startsWith(`/`)&&(a=t.substring(1));let o=[a,`examples/${a.split(`/`).pop()}`,`src/islands/${a.split(`/`).pop()}`,`islands/${a.split(`/`).pop()}`],s=null;for(let t of o)try{i=await e(t,`utf-8`);let a={forceSSROnly:n.forceSSROnly,detectScripts:n.detectScripts,suppressWarnings:n.suppressWarnings,logDecisions:!1};s=r(t,i,a);break}catch{}return s?{type:s.decision.shouldHydrate?`hydrate`:`ssr-only`,reason:s.decision.reason,warnings:s.decision.warnings}:v(t)}catch(e){return console.warn(`Component analysis failed for ${t}:`,e),{type:`ssr-only`,reason:`Analysis failed, defaulting to SSR-only for safety`,warnings:[`Component analysis error: ${e instanceof Error?e.message:String(e)}`]}}}function v(e){return e.endsWith(`.vue`)||e.endsWith(`.svelte`)||e.endsWith(`.tsx`)||e.endsWith(`.jsx`)?{type:`ssr-only`,reason:`Framework component detected, defaulting to SSR-only (hydration requires explicit hydrate function)`}:{type:`ssr-only`,reason:`Unknown component type, defaulting to SSR-only for safety`}}function y(e){return e.meta?.map(({name:e,content:t})=>`<meta name="${e}" content="${t}">`).join(`
|
|
2
2
|
`)||``}function b(e){return e.styles?.map(e=>`<link rel="stylesheet" href="${e}">`).join(`
|
|
3
3
|
`)||``}function x(e){return e.scripts?.map(e=>typeof e==`string`?`<script src="${e}" defer><\/script>`:`<script ${e.src?`src="${e.src}"`:``} ${e.type?`type="${e.type}"`:``}>${e.content||``}<\/script>`).join(`
|
|
4
4
|
`)||``}function S(e,t){return`
|
|
@@ -7,7 +7,7 @@ import{h as e}from"preact";import{render as t}from"preact-render-to-string";impo
|
|
|
7
7
|
if (import.meta.hot) {
|
|
8
8
|
import.meta.hot.accept();
|
|
9
9
|
}
|
|
10
|
-
<\/script>`:``}function w(e){return e.replaceAll(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`).replaceAll(`"`,`"`).replaceAll(`'`,`'`)}function T(e,t,n){let
|
|
10
|
+
<\/script>`:``}function w(e){return e.replaceAll(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`).replaceAll(`"`,`"`).replaceAll(`'`,`'`)}function T(e,t,n){let r=process.env.NODE_ENV!==`production`,o=y(e),s=b(e),c=x(e),l=S(r,t),u=C(r,n),d=i(!0),f=a(!0);return`
|
|
11
11
|
<head>
|
|
12
12
|
<meta charset="utf-8">
|
|
13
13
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
@@ -29,13 +29,13 @@ import{h as e}from"preact";import{render as t}from"preact-render-to-string";impo
|
|
|
29
29
|
${d}
|
|
30
30
|
${f}
|
|
31
31
|
${c}${l}${u}
|
|
32
|
-
</head>`.trim()}export async function renderToHtml(e,
|
|
32
|
+
</head>`.trim()}export async function renderToHtml(e,t={},r,i={}){try{let a,s;if(i.forceSSROnly===!0){let t=e.component();a=n(t instanceof Promise?await t:t),s=f(a)}else ({content:a,frameworks:s}=await O(e,i));a=await h(a,i);let c=`<!DOCTYPE html>\n<html lang="en">\n${T({...t,...e.options},s,r)}\n<body>\n${a}\n</body>\n</html>`;return c=o(c),c}catch(e){throw console.error(`Error rendering component:`,e),Error(`Failed to render component`)}}export async function renderToHtmlWithLayouts(e,t,n,r,i={},a,o={}){try{let s=e,c={default:e.component,layoutConfig:s.layoutConfig,loader:s.loader,frontmatter:e.frontmatter},l=await t.resolveAndRender(r,c,n);return l.handlers.length===0?await renderToHtml(e,i,a,o):E(await h(await j(await A(e,r,o),l,c,n,r),o),e,i,a)}catch(t){console.error(`Error rendering component with layouts:`,t);try{return await renderToHtml(e,i,a,o)}catch(e){throw console.error(`Fallback rendering also failed:`,e),Error(`Failed to render component with layouts and fallback failed`)}}}function E(e,t,n,r){if(e.trim().startsWith(`<!DOCTYPE html>`)||e.trim().startsWith(`<html`))return c(e);let i=f(e);return c(`<!DOCTYPE html>\n<html lang="en">\n${T({...n,...t.options},i,r)}\n<body>\n${e}\n</body>\n</html>`)}async function D(e,t,r,i){let a,o;if(i.forceSSROnly===!0){let t=e.component();a=n(t instanceof Promise?await t:t),o=f(a)}else ({content:a,frameworks:o}=await O(e,i));return a=await h(a,i),{head:T({...t,...e.options},o,r),content:a}}async function O(e,t){try{let n=await d().renderWithIsolation({componentPath:`route-component`,component:e.component});if(!n.success)throw Error(`Isolated rendering failed: ${n.errors.join(`, `)}`);return n.warnings.length>0&&!t.suppressWarnings&&n.warnings.forEach(e=>console.warn(`[SSR Isolation] ${e}`)),{content:n.html,frameworks:f(n.html)}}catch(t){console.warn(`[SSR] Isolated rendering failed, falling back to standard rendering:`,t);let r=e.component(),i=n(r instanceof Promise?await r:r);return{content:i,frameworks:f(i)}}}function k(e,t,n,r,i,a=`Streaming Error`,o=`route-component`){if(console.error(`[${a}]`,{message:e.message,stack:e.stack,shellSent:t,timestamp:new Date().toISOString()}),i.onError?.(e),t){console.log(`[${a}] Mid-stream error detected, injecting error boundary`);try{n.enqueue(r.encode(N(e,o))),n.enqueue(r.encode(`
|
|
33
33
|
</body>
|
|
34
34
|
</html>`))}catch(e){console.error(`[${a}] Failed to inject error boundary:`,e)}}else i.onShellError?.(e),n.enqueue(r.encode(M(e)));n.close()}export async function renderToHtmlStream(e,t={},n,r={}){let i=new TextEncoder,a=null,o=!1;return new ReadableStream({async start(s){a=s;try{let{head:s,content:c}=await D(e,t,n,r);a.enqueue(i.encode(`<!DOCTYPE html>\n<html lang="en">\n${s}\n<body>\n`)),o=!0,r.onShellReady?.(),a.enqueue(i.encode(c)),a.enqueue(i.encode(`
|
|
35
35
|
</body>
|
|
36
36
|
</html>`)),r.onAllReady?.(),a.close()}catch(e){k(e instanceof Error?e:Error(String(e)),o,a,i,r)}},cancel(){try{a?.close()}catch{}}})}export async function renderToHtmlStreamWithLayouts(e,t,n,r,i={},a,o={}){let s=new TextEncoder,l=null,u=!1;return new ReadableStream({async start(d){l=d;try{let d=e,p={default:e.component,layoutConfig:d.layoutConfig,loader:d.loader,frontmatter:e.frontmatter},m=await t.resolveAndRender(r,p,n);if(m.handlers.length===0){let t=(await renderToHtmlStream(e,i,a,o)).getReader();try{for(;;){let{done:e,value:n}=await t.read();if(e)break;l.enqueue(n)}}finally{t.releaseLock()}l.close();return}let g=await h(await j(await A(e,r,o),m,p,n,r),o);if(g.trim().startsWith(`<!DOCTYPE html>`)||g.trim().startsWith(`<html`)){let e=c(g);l.enqueue(s.encode(e)),u=!0,o.onShellReady?.(),o.onAllReady?.(),l.close();return}let _=f(g),v=T({...i,...e.options},_,a);l.enqueue(s.encode(`<!DOCTYPE html>\n<html lang="en">\n${v}\n<body>\n`)),u=!0,o.onShellReady?.(),l.enqueue(s.encode(g)),l.enqueue(s.encode(`
|
|
37
37
|
</body>
|
|
38
|
-
</html>`)),o.onAllReady?.(),l.close()}catch(e){k(e instanceof Error?e:Error(String(e)),u,l,s,o,`Streaming Error with Layouts`,`layout-${r}`)}},cancel(){try{l?.close()}catch{}}})}async function A(e,
|
|
38
|
+
</html>`)),o.onAllReady?.(),l.close()}catch(e){k(e instanceof Error?e:Error(String(e)),u,l,s,o,`Streaming Error with Layouts`,`layout-${r}`)}},cancel(){try{l?.close()}catch{}}})}async function A(e,t,r){if(r.forceSSROnly===!0){let t=e.component();return n(t instanceof Promise?await t:t)}try{let n=await d().renderWithIsolation({componentPath:t,component:e.component});if(!n.success)throw Error(`Isolated rendering failed: ${n.errors.join(`, `)}`);return n.warnings.length>0&&!r.suppressWarnings&&n.warnings.forEach(e=>console.warn(`[SSR Isolation] ${e}`)),n.html}catch(t){console.warn(`[SSR] Isolated page rendering failed, falling back to standard rendering:`,t);let r=e.component();return n(r instanceof Promise?await r:r)}}async function j(e,r,i,a,o){let s=t(`avalon-page-content`,{dangerouslySetInnerHTML:{__html:e}}),c=null;for(let e=r.handlers.length-1;e>=0;e--){let l=r.handlers[e],u={data:r.dataLoaders[e]?await r.dataLoaders[e](a):{},frontmatter:i.frontmatter||{},route:{path:o,params:a.params,query:a.query}},d=l.component,f=d({...u,children:s});if(f instanceof Promise){let r=n(await f);e===0?c=r:s=t(`avalon-layout-fragment`,{dangerouslySetInnerHTML:{__html:r}})}else s=t(d,u,s)}if(c!==null)return c;try{let e=await d().renderWithIsolation({componentPath:`layout-chain-${o}`,component:()=>s});if(e.success)return e.html}catch{}return n(s)}function M(e){let t=process.env.NODE_ENV!==`production`;return`<!DOCTYPE html>
|
|
39
39
|
<html lang="en">
|
|
40
40
|
<head>
|
|
41
41
|
<meta charset="utf-8">
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { z } from
|
|
2
|
-
import type { RenderOptions } from
|
|
3
|
-
import type { LayoutContext, LayoutData,
|
|
4
|
-
import type { FileSystemRoute,
|
|
5
|
-
export * from
|
|
6
|
-
export * from
|
|
7
|
-
export * from
|
|
8
|
-
export * from
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { RenderOptions } from "./core.ts";
|
|
3
|
+
import type { LayoutConfig, LayoutContext, LayoutData, LayoutDiscoveryOptions, LayoutHandler, ResolvedLayout } from "./layout.ts";
|
|
4
|
+
import type { FileSystemRoute, FileSystemRouterConfig, Metadata, ResolvedMetadata, RouteDiscoveryOptions, RoutePageModule } from "./routing.ts";
|
|
5
|
+
export * from "./api.ts";
|
|
6
|
+
export * from "./core.ts";
|
|
7
|
+
export * from "./layout.ts";
|
|
8
|
+
export * from "./routing.ts";
|
|
9
9
|
export interface ValidationSuccess<T> {
|
|
10
10
|
success: true;
|
|
11
11
|
data: T;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{z as e}from"zod";import{RenderOptionsSchema as t}from"./core.js";import{
|
|
1
|
+
import{z as e}from"zod";import{RenderOptionsSchema as t}from"./core.js";import{LayoutConfigSchema as n,LayoutContextSchema as r,LayoutDataSchema as i,LayoutDiscoveryOptionsSchema as a,LayoutHandlerSchema as o,ResolvedLayoutSchema as s}from"./layout.js";import{FileSystemRouterConfigSchema as c,FileSystemRouteSchema as l,MetadataSchema as u,ResolvedMetadataSchema as d,RouteDiscoveryOptionsSchema as f,RoutePageModuleSchema as p}from"./routing.js";export*from"./api.js";export*from"./core.js";export*from"./layout.js";export*from"./routing.js";export class ValidationError extends Error{constructor(e,t){super(e),this.zodError=t,this.name=`ValidationError`}getFormattedErrors(){return this.zodError.issues.map(e=>`${e.path.length>0?`${e.path.join(`.`)}: `:``}${e.message}`)}getErrorMessage(){return this.getFormattedErrors().join(`; `)}}export function createValidationError(e,t){return new ValidationError(e,t)}export function safeValidate(e,t,n=`Validation failed`){let r=e.safeParse(t);return r.success?{success:!0,data:r.data}:{success:!1,error:createValidationError(n,r.error)}}export function validate(e,t,n=`Validation failed`){let r=e.safeParse(t);if(r.success)return r.data;throw createValidationError(n,r.error)}export const validators={renderOptions:e=>validate(t,e,`Invalid render options`),layoutContext:e=>validate(r,e,`Invalid layout context`),layoutData:e=>validate(i,e,`Invalid layout data`),layoutHandler:e=>validate(o,e,`Invalid layout handler`),layoutDiscoveryOptions:e=>validate(a,e,`Invalid layout discovery options`),layoutConfig:e=>validate(n,e,`Invalid layout config`),resolvedLayout:e=>validate(s,e,`Invalid resolved layout`),fileSystemRoute:e=>validate(l,e,`Invalid file system route`),routePageModule:e=>validate(p,e,`Invalid route page module`),routeDiscoveryOptions:e=>validate(f,e,`Invalid route discovery options`),fileSystemRouterConfig:e=>validate(c,e,`Invalid file system router config`),metadata:e=>validate(u,e,`Invalid metadata`),resolvedMetadata:e=>validate(d,e,`Invalid resolved metadata`)};export const safeValidators={renderOptions:e=>safeValidate(t,e,`Invalid render options`),layoutContext:e=>safeValidate(r,e,`Invalid layout context`),layoutData:e=>safeValidate(i,e,`Invalid layout data`),layoutHandler:e=>safeValidate(o,e,`Invalid layout handler`),layoutDiscoveryOptions:e=>safeValidate(a,e,`Invalid layout discovery options`),layoutConfig:e=>safeValidate(n,e,`Invalid layout config`),resolvedLayout:e=>safeValidate(s,e,`Invalid resolved layout`),fileSystemRoute:e=>safeValidate(l,e,`Invalid file system route`),routePageModule:e=>safeValidate(p,e,`Invalid route page module`),routeDiscoveryOptions:e=>safeValidate(f,e,`Invalid route discovery options`),fileSystemRouterConfig:e=>safeValidate(c,e,`Invalid file system router config`),metadata:e=>safeValidate(u,e,`Invalid metadata`),resolvedMetadata:e=>safeValidate(d,e,`Invalid resolved metadata`)};export const devValidators={renderOptionsSoft:(e,t=`unknown`)=>{let n=safeValidators.renderOptions(e);return n.success?!0:(console.warn(`Render options validation warning in ${t}:`,n.error?.getErrorMessage?.()??`unknown error`),!1)}};export function isValidRenderOptions(e){return safeValidators.renderOptions(e).success}export function isValidFileSystemRoute(e){return safeValidators.fileSystemRoute(e).success}export function isValidRoutePageModule(e){return safeValidators.routePageModule(e).success}export function isValidRouteDiscoveryOptions(e){return safeValidators.routeDiscoveryOptions(e).success}export function isValidFileSystemRouterConfig(e){return safeValidators.fileSystemRouterConfig(e).success}export function isValidMetadata(e){return safeValidators.metadata(e).success}export function isValidResolvedMetadata(e){return safeValidators.resolvedMetadata(e).success}export function validateBatch(e,t){let n={},r=[];for(let[i,a]of Object.entries(e))try{n[i]=validate(a,t[i],`Invalid ${String(i)}`)}catch(e){e instanceof ValidationError?r.push(`${String(i)}: ${e.getErrorMessage()}`):r.push(`${String(i)}: Unknown validation error`)}if(r.length>0)throw Error(`Batch validation failed: ${r.join(`; `)}`);return n}export function safeValidateBatch(t,n){try{return{success:!0,data:validateBatch(t,n)}}catch(t){return{success:!1,error:t instanceof ValidationError?t:createValidationError(`Batch validation failed`,new e.ZodError([{code:`custom`,message:String(t),path:[]}]))}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export*from"../routing.js";import{
|
|
1
|
+
export*from"../routing.js";import{safeValidate as e,validate as t}from"../index.js";import{FileSystemRouterConfigSchema as n,FileSystemRouteSchema as r,MetadataSchema as i,ResolvedMetadataSchema as a,RouteDiscoveryOptionsSchema as o,RoutePageModuleSchema as s}from"../routing.js";export const routingValidators={fileSystemRoute:e=>t(r,e,`Invalid file system route`),routePageModule:e=>t(s,e,`Invalid route page module`),routeDiscoveryOptions:e=>t(o,e,`Invalid route discovery options`),fileSystemRouterConfig:e=>t(n,e,`Invalid file system router config`),metadata:e=>t(i,e,`Invalid metadata`),resolvedMetadata:e=>t(a,e,`Invalid resolved metadata`)};export const safeRoutingValidators={fileSystemRoute:t=>e(r,t,`Invalid file system route`),routePageModule:t=>e(s,t,`Invalid route page module`),routeDiscoveryOptions:t=>e(o,t,`Invalid route discovery options`),fileSystemRouterConfig:t=>e(n,t,`Invalid file system router config`),metadata:t=>e(i,t,`Invalid metadata`),resolvedMetadata:t=>e(a,t,`Invalid resolved metadata`)};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
1
|
+
import type { ComponentType } from "preact/compat";
|
|
2
|
+
import { z } from "zod";
|
|
3
3
|
/**
|
|
4
4
|
* Route Type Schema - Defines the different types of routes supported
|
|
5
5
|
*/
|
|
@@ -384,5 +384,5 @@ export declare function isRouteParams(data: unknown): data is RouteParams;
|
|
|
384
384
|
* Type guard for FileSystemApiModule
|
|
385
385
|
*/
|
|
386
386
|
export declare function isFileSystemApiModule(data: unknown): data is FileSystemApiModule;
|
|
387
|
-
export type {
|
|
388
|
-
export {
|
|
387
|
+
export type { CountDynamicSegments, ExtractOptionalParams, ExtractRouteParams, HasCatchAllSegments, HasDynamicSegments, HasOptionalSegments, PageComponentProps, RouteParameters, TypedApiHandler, TypedApiModule, TypedMetadataGenerator, TypedPageComponent, TypedPageComponentWithData, TypedPageLoader, ValidRouteExtension, ValidRoutePattern, } from "../types/routing.ts";
|
|
388
|
+
export { createTypedApiHandler, createTypedMetadataGenerator, createTypedPageComponent, createTypedPageLoader, isValidPageProps, isValidRouteParams, isValidRoutePattern, validatePageComponent, } from "../types/routing.ts";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{z as e}from"zod";export const RouteTypeSchema=e.enum([`static`,`dynamic`,`catch-all`,`index`,`group`]);export const FileSystemRouteSchema=e.object({pattern:e.any(),filePath:e.string().min(1),routeType:RouteTypeSchema,dynamicSegments:e.array(e.string()),priority:e.number().int().min(0),isPrivate:e.boolean(),routeGroup:e.string().optional()});export const RoutePageModuleSchema=e.object({default:e.any(),layoutConfig:e.any().optional(),generateMetadata:e.any().optional(),loader:e.any().optional(),frontmatter:e.record(e.string(),e.any()).optional()});export const RouteParamsSchema=e.record(e.string(),e.string());export const LoaderContextSchema=e.object({request:e.instanceof(Request),url:e.instanceof(URL),params:RouteParamsSchema,query:e.instanceof(URLSearchParams),state:e.instanceof(Map)});export const PagePropsSchema=e.object({params:RouteParamsSchema,query:e.instanceof(URLSearchParams),data:e.unknown().optional()});export const MetadataSchema=e.object({title:e.string().optional(),description:e.string().optional(),keywords:e.array(e.string()).optional(),openGraph:e.object({title:e.string().optional(),description:e.string().optional(),image:e.url().optional(),url:e.url().optional(),type:e.string().optional(),siteName:e.string().optional()}).optional(),twitter:e.object({card:e.enum([`summary`,`summary_large_image`,`app`,`player`]).optional(),title:e.string().optional(),description:e.string().optional(),image:e.url().optional(),site:e.string().optional()}).optional(),schema:e.array(e.record(e.string(),e.unknown())).optional(),canonical:e.url().optional(),robots:e.string().optional()});export const ResolvedMetadataSchema=MetadataSchema.extend({sources:e.array(e.string()).optional(),resolvedAt:e.number().optional()});export const MetadataChainSchema=e.object({global:MetadataSchema.optional(),sections:e.array(e.object({path:e.string(),metadata:MetadataSchema})),page:MetadataSchema.optional()});export const RouteDiscoveryOptionsSchema=e.object({pagesDirectory:e.string().min(1).default(`src/pages`),apiDirectory:e.string().min(1).default(`src/api`),extensions:e.array(e.string()).default([`.tsx`,`.ts`,`.jsx`,`.js`]),excludeDirectories:e.array(e.string()).default([`node_modules`,`.git`]),enableWatching:e.boolean().default(!1),developmentMode:e.boolean().default(!1),quietMode:e.boolean().default(!1)});export const FileSystemRouterConfigSchema=e.object({discovery:RouteDiscoveryOptionsSchema.optional(),enabled:e.boolean().default(!0),fallbackToManual:e.boolean().default(!0),enableCaching:e.boolean().default(!0),cacheTTL:e.number().positive().default(3e5)});export const PageFileSchema=e.object({filePath:e.string().min(1),relativePath:e.string().min(1),extension:e.string().min(1),isPrivate:e.boolean(),routeGroup:e.string().optional(),mtime:e.number().optional()});export const RouteHandlerSchema=e.object({pattern:e.any(),handler:e.any(),metadata:e.object({filePath:e.string(),routeType:RouteTypeSchema,priority:e.number(),dynamicSegments:e.array(e.string())})});export const RouteCacheEntrySchema=e.object({routes:e.array(FileSystemRouteSchema),timestamp:e.number(),fileMtimes:e.record(e.string(),e.number())});export const FileSystemApiRouteSchema=e.object({pattern:e.any(),filePath:e.string().min(1),methods:e.array(e.enum([`GET`,`POST`,`PUT`,`DELETE`,`PATCH`,`HEAD`,`OPTIONS`])),priority:e.number().int().min(0),dynamicSegments:e.array(e.string())});export const FileSystemApiModuleSchema=e.object({GET:e.any().optional(),POST:e.any().optional(),PUT:e.any().optional(),DELETE:e.any().optional(),PATCH:e.any().optional(),HEAD:e.any().optional(),OPTIONS:e.any().optional()});export function isFileSystemRoute(e){return FileSystemRouteSchema.safeParse(e).success}export function isRoutePageModule(e){return RoutePageModuleSchema.safeParse(e).success}export function isMetadata(e){return MetadataSchema.safeParse(e).success}export function isRouteParams(e){return RouteParamsSchema.safeParse(e).success}export function isFileSystemApiModule(e){return FileSystemApiModuleSchema.safeParse(e).success}export{
|
|
1
|
+
import{z as e}from"zod";export const RouteTypeSchema=e.enum([`static`,`dynamic`,`catch-all`,`index`,`group`]);export const FileSystemRouteSchema=e.object({pattern:e.any(),filePath:e.string().min(1),routeType:RouteTypeSchema,dynamicSegments:e.array(e.string()),priority:e.number().int().min(0),isPrivate:e.boolean(),routeGroup:e.string().optional()});export const RoutePageModuleSchema=e.object({default:e.any(),layoutConfig:e.any().optional(),generateMetadata:e.any().optional(),loader:e.any().optional(),frontmatter:e.record(e.string(),e.any()).optional()});export const RouteParamsSchema=e.record(e.string(),e.string());export const LoaderContextSchema=e.object({request:e.instanceof(Request),url:e.instanceof(URL),params:RouteParamsSchema,query:e.instanceof(URLSearchParams),state:e.instanceof(Map)});export const PagePropsSchema=e.object({params:RouteParamsSchema,query:e.instanceof(URLSearchParams),data:e.unknown().optional()});export const MetadataSchema=e.object({title:e.string().optional(),description:e.string().optional(),keywords:e.array(e.string()).optional(),openGraph:e.object({title:e.string().optional(),description:e.string().optional(),image:e.url().optional(),url:e.url().optional(),type:e.string().optional(),siteName:e.string().optional()}).optional(),twitter:e.object({card:e.enum([`summary`,`summary_large_image`,`app`,`player`]).optional(),title:e.string().optional(),description:e.string().optional(),image:e.url().optional(),site:e.string().optional()}).optional(),schema:e.array(e.record(e.string(),e.unknown())).optional(),canonical:e.url().optional(),robots:e.string().optional()});export const ResolvedMetadataSchema=MetadataSchema.extend({sources:e.array(e.string()).optional(),resolvedAt:e.number().optional()});export const MetadataChainSchema=e.object({global:MetadataSchema.optional(),sections:e.array(e.object({path:e.string(),metadata:MetadataSchema})),page:MetadataSchema.optional()});export const RouteDiscoveryOptionsSchema=e.object({pagesDirectory:e.string().min(1).default(`src/pages`),apiDirectory:e.string().min(1).default(`src/api`),extensions:e.array(e.string()).default([`.tsx`,`.ts`,`.jsx`,`.js`]),excludeDirectories:e.array(e.string()).default([`node_modules`,`.git`]),enableWatching:e.boolean().default(!1),developmentMode:e.boolean().default(!1),quietMode:e.boolean().default(!1)});export const FileSystemRouterConfigSchema=e.object({discovery:RouteDiscoveryOptionsSchema.optional(),enabled:e.boolean().default(!0),fallbackToManual:e.boolean().default(!0),enableCaching:e.boolean().default(!0),cacheTTL:e.number().positive().default(3e5)});export const PageFileSchema=e.object({filePath:e.string().min(1),relativePath:e.string().min(1),extension:e.string().min(1),isPrivate:e.boolean(),routeGroup:e.string().optional(),mtime:e.number().optional()});export const RouteHandlerSchema=e.object({pattern:e.any(),handler:e.any(),metadata:e.object({filePath:e.string(),routeType:RouteTypeSchema,priority:e.number(),dynamicSegments:e.array(e.string())})});export const RouteCacheEntrySchema=e.object({routes:e.array(FileSystemRouteSchema),timestamp:e.number(),fileMtimes:e.record(e.string(),e.number())});export const FileSystemApiRouteSchema=e.object({pattern:e.any(),filePath:e.string().min(1),methods:e.array(e.enum([`GET`,`POST`,`PUT`,`DELETE`,`PATCH`,`HEAD`,`OPTIONS`])),priority:e.number().int().min(0),dynamicSegments:e.array(e.string())});export const FileSystemApiModuleSchema=e.object({GET:e.any().optional(),POST:e.any().optional(),PUT:e.any().optional(),DELETE:e.any().optional(),PATCH:e.any().optional(),HEAD:e.any().optional(),OPTIONS:e.any().optional()});export function isFileSystemRoute(e){return FileSystemRouteSchema.safeParse(e).success}export function isRoutePageModule(e){return RoutePageModuleSchema.safeParse(e).success}export function isMetadata(e){return MetadataSchema.safeParse(e).success}export function isRouteParams(e){return RouteParamsSchema.safeParse(e).success}export function isFileSystemApiModule(e){return FileSystemApiModuleSchema.safeParse(e).success}export{createTypedApiHandler,createTypedMetadataGenerator,createTypedPageComponent,createTypedPageLoader,isValidPageProps,isValidRouteParams,isValidRoutePattern,validatePageComponent}from"../types/routing.js";
|
|
@@ -14,93 +14,93 @@
|
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
16
|
declare module "*.jpg" {
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
const src: string;
|
|
18
|
+
export default src;
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
declare module "*.jpeg" {
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
const src: string;
|
|
23
|
+
export default src;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
declare module "*.png" {
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
const src: string;
|
|
28
|
+
export default src;
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
declare module "*.webp" {
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
const src: string;
|
|
33
|
+
export default src;
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
declare module "*.avif" {
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
const src: string;
|
|
38
|
+
export default src;
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
declare module "*.gif" {
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
const src: string;
|
|
43
|
+
export default src;
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
declare module "*.tiff" {
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
const src: string;
|
|
48
|
+
export default src;
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
declare module "*.svg" {
|
|
52
|
-
|
|
53
|
-
|
|
52
|
+
const src: string;
|
|
53
|
+
export default src;
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
// vite-imagetools srcset output
|
|
57
57
|
interface ImageToolsSrcset {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
58
|
+
src: string;
|
|
59
|
+
srcset: string;
|
|
60
|
+
width: number;
|
|
61
|
+
height: number;
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
declare module "*&as=srcset" {
|
|
65
|
-
|
|
66
|
-
|
|
65
|
+
const srcset: ImageToolsSrcset;
|
|
66
|
+
export default srcset;
|
|
67
67
|
}
|
|
68
68
|
|
|
69
69
|
declare module "*?as=srcset" {
|
|
70
|
-
|
|
71
|
-
|
|
70
|
+
const srcset: ImageToolsSrcset;
|
|
71
|
+
export default srcset;
|
|
72
72
|
}
|
|
73
73
|
|
|
74
74
|
// vite-imagetools picture output (multiple formats)
|
|
75
75
|
interface ImageToolsPicture {
|
|
76
|
-
|
|
77
|
-
|
|
76
|
+
sources: Record<string, ImageToolsSrcset>;
|
|
77
|
+
img: ImageToolsSrcset;
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
declare module "*&as=picture" {
|
|
81
|
-
|
|
82
|
-
|
|
81
|
+
const picture: ImageToolsPicture;
|
|
82
|
+
export default picture;
|
|
83
83
|
}
|
|
84
84
|
|
|
85
85
|
declare module "*?as=picture" {
|
|
86
|
-
|
|
87
|
-
|
|
86
|
+
const picture: ImageToolsPicture;
|
|
87
|
+
export default picture;
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
// vite-imagetools metadata output
|
|
91
91
|
interface ImageToolsMetadata {
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
92
|
+
src: string;
|
|
93
|
+
width: number;
|
|
94
|
+
height: number;
|
|
95
|
+
format: string;
|
|
96
96
|
}
|
|
97
97
|
|
|
98
98
|
declare module "*&as=metadata" {
|
|
99
|
-
|
|
100
|
-
|
|
99
|
+
const metadata: ImageToolsMetadata;
|
|
100
|
+
export default metadata;
|
|
101
101
|
}
|
|
102
102
|
|
|
103
103
|
declare module "*?as=metadata" {
|
|
104
|
-
|
|
105
|
-
|
|
104
|
+
const metadata: ImageToolsMetadata;
|
|
105
|
+
export default metadata;
|
|
106
106
|
}
|
|
@@ -4,29 +4,29 @@
|
|
|
4
4
|
* Automatically included via tsconfig.json `compilerOptions.types`.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import type { IslandDirective } from
|
|
7
|
+
import type { IslandDirective } from "./island-prop.d.ts";
|
|
8
8
|
|
|
9
9
|
/** Force TypeScript to expand the type inline on hover instead of showing the alias name */
|
|
10
10
|
type Expand<T> = T extends infer O ? { [K in keyof O]: O[K] } : never;
|
|
11
11
|
|
|
12
|
-
declare module
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
12
|
+
declare module "preact" {
|
|
13
|
+
namespace JSX {
|
|
14
|
+
interface IntrinsicAttributes {
|
|
15
|
+
island?: Expand<IslandDirective>;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
declare global {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
21
|
+
namespace JSX {
|
|
22
|
+
interface IntrinsicAttributes {
|
|
23
|
+
island?: Expand<IslandDirective>;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
declare module
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
declare module "@vue/runtime-core" {
|
|
29
|
+
interface ComponentCustomProps {
|
|
30
|
+
island?: Expand<IslandDirective>;
|
|
31
|
+
}
|
|
32
32
|
}
|
package/dist/src/types/mdx.d.ts
CHANGED
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
* This module provides strongly typed interfaces, utility types, and type guards
|
|
5
5
|
* for the file-system routing system, ensuring type safety throughout the routing pipeline.
|
|
6
6
|
*/
|
|
7
|
-
import type { ComponentType } from
|
|
8
|
-
import type {
|
|
9
|
-
import type {
|
|
7
|
+
import type { ComponentType } from "preact";
|
|
8
|
+
import type { LayoutConfig } from "../schemas/layout.ts";
|
|
9
|
+
import type { LoaderContext, Metadata } from "../schemas/routing.ts";
|
|
10
10
|
/**
|
|
11
11
|
* Extract route parameters from a route pattern string
|
|
12
12
|
*
|
|
@@ -170,7 +170,7 @@ export type ValidRoutePattern<T extends string> = T extends `${string}[${string}
|
|
|
170
170
|
/**
|
|
171
171
|
* Valid file extensions for routes
|
|
172
172
|
*/
|
|
173
|
-
export type ValidRouteExtension =
|
|
173
|
+
export type ValidRouteExtension = ".tsx" | ".ts" | ".jsx" | ".js";
|
|
174
174
|
/**
|
|
175
175
|
* Route file path validation
|
|
176
176
|
*/
|
|
@@ -212,11 +212,11 @@ export type GetStaticParts<T extends string> = T extends `${infer Static}[${stri
|
|
|
212
212
|
/**
|
|
213
213
|
* Count dynamic segments in a route
|
|
214
214
|
*/
|
|
215
|
-
export type CountDynamicSegments<T extends string, Count extends readonly unknown[] = []> = T extends `${string}[${string}]${infer Rest}` ? CountDynamicSegments<Rest, [...Count, unknown]> : Count[
|
|
215
|
+
export type CountDynamicSegments<T extends string, Count extends readonly unknown[] = []> = T extends `${string}[${string}]${infer Rest}` ? CountDynamicSegments<Rest, [...Count, unknown]> : Count["length"];
|
|
216
216
|
/**
|
|
217
217
|
* Route error types
|
|
218
218
|
*/
|
|
219
|
-
export type RouteErrorType =
|
|
219
|
+
export type RouteErrorType = "ROUTE_NOT_FOUND" | "INVALID_PARAMS" | "LOADER_ERROR" | "METADATA_ERROR" | "COMPONENT_ERROR" | "VALIDATION_ERROR";
|
|
220
220
|
/**
|
|
221
221
|
* Route error with context
|
|
222
222
|
*/
|
|
@@ -294,4 +294,4 @@ export declare function validatePageComponent<TRoute extends string>(component:
|
|
|
294
294
|
* Create a typed API handler with parameter validation
|
|
295
295
|
*/
|
|
296
296
|
export declare function createTypedApiHandler<TRoute extends string>(handler: TypedApiHandler<TRoute>, expectedParams: (keyof RouteParameters<TRoute>)[]): TypedApiHandler<TRoute>;
|
|
297
|
-
export type {
|
|
297
|
+
export type { FileSystemRoute, LoaderContext, Metadata, PageProps, ResolvedMetadata, RoutePageModule, RouteParams, } from "../schemas/routing.ts";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import e from"node:process";import{h as t}from"preact";export function isValidRouteParams(e,t){if(!e||typeof e!=`object`)return!1;let n=e;for(let e of t){let t=n[e];if(t===void 0||typeof t!=`string`&&!Array.isArray(t)||Array.isArray(t)&&!t.every(e=>typeof e==`string`))return!1}return!0}export function isValidPageProps(e,t){if(!e||typeof e!=`object`)return!1;let r=e;return!(!r.params||!r.query||!isValidRouteParams(r.params,t)||!(r.query instanceof URLSearchParams))}export function isValidRoutePattern(e){let t=e.match(/\[([^\]]+)\]/g);if(t)for(let e of t){let t=e.slice(1,-1);if(!/^[a-zA-Z_]\w*(\?)?$/.test(t)&&!/^\.\.\.[a-zA-Z_]\w*$/.test(t))return!1}let n=e.match(/\(([^)]+)\)/g);if(n)for(let e of n){let t=e.slice(1,-1);if(!/^[a-zA-Z_]\w*-*\w*$/.test(t))return!1}return!0}export function createTypedPageComponent(n,i){return a=>(e.env?.NODE_ENV===`development`&&(isValidPageProps(a,i)||console.warn(`Invalid props passed to typed page component:`,a)),t(n,a))}export function createTypedMetadataGenerator(t,r){return async i=>(e.env?.NODE_ENV===`development`&&(isValidRouteParams(i,r)||console.warn(`Invalid params passed to typed metadata generator:`,i)),await t(i))}export function createTypedPageLoader(t,r){return async i=>(e.env?.NODE_ENV===`development`&&(isValidRouteParams(i.params,r)||console.warn(`Invalid params passed to typed page loader:`,i.params)),await t(i))}export function validatePageComponent(e,t){return typeof e==`function`}export function createTypedApiHandler(t,r){return async(i,a)=>(e.env?.NODE_ENV===`development`&&(isValidRouteParams(a.params,r)||console.warn(`Invalid params passed to typed API handler:`,a.params)),await t(i,a))}
|
|
@@ -24,7 +24,7 @@ declare module "virtual:avalon/config" {
|
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
declare module "virtual:avalon/layouts" {
|
|
27
|
-
import type {
|
|
27
|
+
import type { NitroRenderContext, PageModule } from "@useavalon/avalon/nitro/types";
|
|
28
28
|
export function wrapWithLayouts(
|
|
29
29
|
pageHtml: string,
|
|
30
30
|
pageModule: PageModule,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{closeSync as e,openSync as t,readSync as n}from"node:fs";import{stat as r,readdir as i,readFile as a}from"node:fs/promises";import{resolve as o}from"node:path";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(e,t){let n=t?o(t,e):o(e);try{if(!(await r(n)).isDirectory())return new Set}catch{return new Set}let i=new Set;return await f(n,i),i}async function f(e,t){try{let n=await i(e,{withFileTypes:!0});for(let r of n){let n=o(e,r.name);if(r.isDirectory())await f(n,t);else if(r.isFile()){let e=await m(n,r.name);e&&t.add(e)}}}catch(t){(!(t instanceof Error)||t.code!==`EACCES`)&&console.warn(`Warning: Could not scan directory ${e}:`,t)}}function p(r){try{let i=t(r,`r`),a=Buffer.alloc(500);n(i,a,0,500,0),e(i);let o=a.toString(`utf-8`);for(let{pattern:e,integration:t}of l)if(e.test(o))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(e,t,n,i){let a=new Set,s=n??process.cwd(),c=[o(s,e),o(s,t)];i&&c.push(o(s,i));for(let e of c)try{(await r(e)).isDirectory()&&await h(e,s,a)}catch{}return a}async function h(e,t,n){try{let r=await i(e,{withFileTypes:!0});for(let i of r){let r=o(e,i.name);i.isDirectory()?await h(r,t,n):i.isFile()&&g(i.name)&&await v(r,t,n)}}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 r=await a(e,`utf-8`),i=y(r),o=b(r);for(let r of o){let a=i.get(r);if(!a)continue;let o=x(a,e,t);if(!o)continue;let s=await S(o);s&&n.add(s)}for(let[,e]of i)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);r!==null;r=n.exec(e))t.set(r[1],r[2]);let i=/import\s+\{([^}]+)\}\s+from\s+['"]([^'"]+)['"]/g;for(r=i.exec(e);r!==null;r=i.exec(e)){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;for(let r=n.exec(e);r!==null;r=n.exec(e))t.add(r[1]);return t}function x(e,t,n){if(e.startsWith(`.`))return o(o(t,`..`),e);for(let{prefix:t,replacement:r}of[{prefix:`@/`,replacement:`src/`},{prefix:`$components/`,replacement:`src/components/`},{prefix:`$islands/`,replacement:`src/islands/`},{prefix:`~/`,replacement:`src/`}])if(e.startsWith(t))return o(n,r,e.slice(t.length));return e.startsWith(`/src/`)?o(n,e.slice(1)):null}async function S(e){for(let t of[``,`.tsx`,`.jsx`,`.ts`,`.js`,`.vue`,`.svelte`]){let n=e+t;try{if((await r(n)).isFile())return m(n,n.split(`/`).pop()||``)}catch{}}return null}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* This module provides default configuration values and the resolution
|
|
5
5
|
* function that merges user configuration with defaults.
|
|
6
6
|
*/
|
|
7
|
-
import type { AvalonPluginConfig, ResolvedAvalonConfig,
|
|
7
|
+
import type { AvalonPluginConfig, ResolvedAvalonConfig, ResolvedImageConfig, ResolvedMDXConfig } from "./types.ts";
|
|
8
8
|
/**
|
|
9
9
|
* Default MDX configuration values
|
|
10
10
|
*/
|
|
@@ -23,8 +23,8 @@
|
|
|
23
23
|
* <HeroImage alt="Hero" />
|
|
24
24
|
* ```
|
|
25
25
|
*/
|
|
26
|
-
import type { Plugin } from
|
|
27
|
-
import type { ResolvedImageConfig } from
|
|
26
|
+
import type { Plugin } from "vite";
|
|
27
|
+
import type { ResolvedImageConfig } from "./types.ts";
|
|
28
28
|
/**
|
|
29
29
|
* Creates the vite-imagetools plugin with Avalon's configuration
|
|
30
30
|
*/
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{createRequire as e}from"node:module";import{join as t}from"node:path";export async function createImagePlugin(
|
|
1
|
+
import{createRequire as e}from"node:module";import{join as t}from"node:path";import{pathToFileURL as n}from"node:url";async function r(){try{return await import(n(e(t(process.cwd(),`package.json`)).resolve(`vite-imagetools`)).href)}catch{return await import(`vite-imagetools`)}}export async function createImagePlugin(e,t){if(!e.enabled)return t&&console.log(` ⏭️ Image optimization disabled`),[];try{let{imagetools:n}=await r();return t&&(console.log(` 🖼️ Image optimization enabled`),console.log(` Format: ${e.defaultFormat}`),console.log(` Quality: ${e.quality}`),console.log(` Widths: ${e.widths.join(`, `)}`)),[n({include:e.include,exclude:e.exclude,removeMetadata:e.removeMetadata,defaultDirectives:t=>{let n=new URLSearchParams;return t.searchParams.has(`format`)||n.set(`format`,e.defaultFormat),t.searchParams.has(`quality`)||n.set(`quality`,String(e.quality)),t.searchParams.has(`jsx`)&&(!t.searchParams.has(`w`)&&!t.searchParams.has(`width`)&&n.set(`w`,e.widths.join(`;`)),n.set(`as`,`picture`)),n}})]}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
2
|
Install it with: bun add -d vite-imagetools
|
|
3
3
|
Or disable image optimization: image: false`),[];throw e}}export const IMAGE_TYPES_DECLARATION=`
|
|
4
4
|
declare module '*.jpg' {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{access as e,readFile as t}from"node:fs/promises";import n from"node:path";import{EXTRACTOR_MAP as r}from"../build/prop-extractors/index.js";import{deleteSidecar as i,getSidecarPath as a,isSidecarFresh as o,writeSidecarIfChanged as s}from"../build/sidecar-file-manager.js";import{renderSidecarContent as c}from"../build/sidecar-renderer.js";import{detectFrameworkFromPath as l}from"../islands/integration-loader.js";const u=new Set([`react`,`preact`]),d=[`.vue`,`.svelte`,`.lit.ts`,`.solid.tsx`,`.qwik.tsx`];export async function checkTsConfigForArbitraryExtensions(e){let r=n.join(e,`tsconfig.json`);try{let e=await t(r,`utf-8`);JSON.parse(e)?.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(e,n){try{let n=l(e);if(u.has(n))return!1;let i=r[n];if(!i)return!1;let o=c(i(await t(e,`utf-8`)).propsType);return await s(a(e),o)}catch(t){return n&&console.warn(`[avalon] Failed to generate sidecar for ${e}:`,t instanceof Error?t.message:t),!1}}export function islandSidecarPlugin(t={}){let n,r=new Set;return{name:`avalon:island-sidecar`,configResolved(e){n=e.root},async buildStart(){await checkTsConfigForArbitraryExtensions(n),r.clear()},async load(e){return!p(e)||r.has(e)||(r.add(e),await o(e,a(e)))||await m(e,t.verbose)&&t.verbose&&console.log(`[avalon] Generated sidecar for: ${e}`),null},async handleHotUpdate(n){let o=n.file;if(!p(o))return;let s=!0;try{await e(o)}catch{s=!1}if(!s){await i(a(o))&&t.verbose&&console.log(`[avalon] Deleted sidecar for removed file: ${o}`),r.delete(o);return}r.delete(o),await m(o,t.verbose)&&t.verbose&&console.log(`[avalon] Updated sidecar for: ${o}`)}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{readdir as e,stat as t}from"node:fs/promises";import{
|
|
1
|
+
import{readdir as e,stat as t}from"node:fs/promises";import{join as n,resolve as r}from"node:path";export async function discoverModules(t,i){let s=r(i,t.dir),c=[],l=[],u=[];try{let r=await e(s,{withFileTypes:!0});for(let e of r){if(!e.isDirectory()||e.name.startsWith(`.`)||e.name===`node_modules`)continue;let r=n(s,e.name),i=n(r,t.pagesDirName),d=n(r,t.layoutsDirName),[f,p]=await Promise.all([o(i),o(d)]),m=a(e.name),h={name:e.name,path:r,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,n){let a=[],s=r(n,e);if(await o(s)&&a.push({dir:s,prefix:`/`}),t){let{pageDirs:e}=await discoverModules(t,n);a.push(...e)}return a}export async function getAllLayoutDirs(e,t,n){let a=[],s=r(n,e);if(await o(s)&&a.push({dir:s,prefix:`/`}),t){let{layoutDirs:e}=await discoverModules(t,n);a.push(...e)}return a}
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
* or layouts is automatically treated as an island. No fixed islands directory required.
|
|
11
11
|
*/
|
|
12
12
|
import type { Plugin, PluginOption, ViteDevServer } from "vite";
|
|
13
|
-
import type { AvalonPluginConfig, IntegrationName, ResolvedAvalonConfig } from "./types.ts";
|
|
14
13
|
import type { NitroConfigOutput } from "../nitro/config.ts";
|
|
14
|
+
import type { AvalonPluginConfig, IntegrationName, ResolvedAvalonConfig } from "./types.ts";
|
|
15
15
|
declare global {
|
|
16
16
|
var __avalonConfig: ResolvedAvalonConfig | undefined;
|
|
17
17
|
var __viteDevServer: ViteDevServer | undefined;
|
|
@@ -49,5 +49,5 @@ export declare function getPagesDir(): string;
|
|
|
49
49
|
export declare function getLayoutsDir(): string;
|
|
50
50
|
export declare function getNitroConfig(): NitroConfigOutput | undefined;
|
|
51
51
|
export declare function isNitroEnabled(): boolean;
|
|
52
|
-
export type { AvalonPluginConfig, IntegrationName, ResolvedAvalonConfig, ImageConfig, ResolvedImageConfig, } from "./types.ts";
|
|
53
52
|
export type { AvalonNitroConfig, NitroConfigOutput } from "../nitro/config.ts";
|
|
53
|
+
export type { AvalonPluginConfig, ImageConfig, IntegrationName, ResolvedAvalonConfig, ResolvedImageConfig, } from "./types.ts";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createRequire as e}from"node:module";import{dirname as t,join as n}from"node:path";import{
|
|
1
|
+
import{createRequire as e}from"node:module";import{dirname as t,join as n}from"node:path";import{islandClientBundlerPlugin as r}from"../build/island-client-bundler.js";import{islandCodeSplittingPlugin as i}from"../build/island-code-splitting.js";import{mdxIslandTransform as a}from"../build/mdx-island-transform.js";import{createMDXPlugin as o}from"../build/mdx-plugin.js";import{pageIslandTransform as s}from"../build/page-island-transform.js";import{registry as c}from"../core/integrations/registry.js";import{discoverIntegrationsFromIslandUsage as l}from"./auto-discover.js";import{checkDirectoriesExist as u,resolveConfig as d}from"./config.js";import{createImagePlugin as f}from"./image-optimization.js";import{activateIntegrations as p,activateSingleIntegration as m}from"./integration-activator.js";import{islandSidecarPlugin as h}from"./island-sidecar-plugin.js";import{createNitroIntegration as g}from"./nitro-integration.js";import{formatValidationResults as _,validateActiveIntegrations as v}from"./validation.js";export async function collectIntegrationPlugins(e,t=!1){let n=[],r=[];for(let i of e){let e=await y(i,t);i===`lit`?r.push(...e):n.push(...e)}return[...r,...n]}async function y(e,t){let n=c.get(e);if(!n||typeof n.vitePlugin!=`function`)return[];try{let e=await n.vitePlugin();return(Array.isArray(e)?e:[e]).filter(e=>e!=null)}catch(t){return console.warn(`[avalon] Failed to load vite plugin for ${e}:`,t instanceof Error?t.message:t),[]}}async function b(e,t){let n=new Set;try{let r=await l(e.pagesDir,e.layoutsDir,t,e.modules?.dir);for(let t of r)e.integrations.includes(t)&&n.add(t)}catch{for(let t of e.integrations)n.add(t)}return n}async function x(e){if(!e.lazyIntegrations||e.integrations.length===0)return[...e.integrations];let t=await b(e);return t.size===0?[...e.integrations]:Array.from(t)}async function S(e){try{let t=await o({jsxImportSource:e.mdx.jsxImportSource,syntaxHighlighting:e.mdx.syntaxHighlighting,remarkPlugins:e.mdx.remarkPlugins,rehypePlugins:e.mdx.rehypePlugins,development:!0});return t.push(a({verbose:e.verbose})),t}catch(t){return e.showWarnings&&console.warn(`⚠️ Could not configure MDX plugin:`,t),[]}}function C(e,t,n){let{plugins:r,nitroOptions:i}=g(e,t);return globalThis.__nitroConfig=i,{plugins:r,options:i}}async function w(e,t,n){if(e.autoDiscoverIntegrations)try{let r=await l(e.pagesDir,e.layoutsDir,t,e.modules?.dir);for(let t of r)if(!n.has(t))try{await m(t,n,e.verbose)}catch(n){e.showWarnings&&console.warn(` ⚠️ Could not auto-load integration: ${t}`,n)}}catch(t){e.showWarnings&&console.warn(` ⚠️ Auto-discovery failed:`,t)}}function T(e,t){if(!e.validateIntegrations||t.size===0)return;let n=v(t,e.showWarnings);n.allValid||(console.error(_(n)),e.showWarnings&&console.warn(` ⚠️ Some integrations have validation issues.`))}export async function avalon(a){let o,c,l=new Set,m=d(a,!0),g=await x(m);g.length>0&&await p({...m,integrations:g},l);let _=await S(m),v=await f(m.image,m.verbose),y=[];l.size>0&&(y=await collectIntegrationPlugins(l,m.verbose));let b=[];if(a?.nitro){let{plugins:e}=C(m,a.nitro,m.verbose);b=e}let E=h({verbose:m.verbose}),D=e(import.meta.url),O=null;try{O=n(t(D.resolve(`@useavalon/avalon/client`)),`main.js`)}catch{}let k=new Set([`preact`,`react`,`vue`,`svelte`,`solid`,`lit`,`qwik`].flatMap(e=>[`/@useavalon/${e}/client`,`/@useavalon/${e}/client/hmr`,`@useavalon/${e}/client`,`@useavalon/${e}/client/hmr`])),A={name:`avalon`,enforce:`pre`,config(e,{command:t}){let n={preact:[`preact`,`preact/hooks`],react:[`react`,`react-dom`,`react-dom/client`],vue:[`vue`],svelte:[`svelte`,`svelte/internal`],solid:[`solid-js`,`solid-js/web`],lit:[`lit`,`@lit-labs/ssr-client`],qwik:[`@builder.io/qwik`]},r=g.flatMap(e=>n[e]??[]);return{define:{__AVALON_PER_ISLAND__:JSON.stringify(t===`build`)},oxc:{exclude:[/node_modules\/@useavalon\/.*\.tsx?$/]},ssr:{noExternal:[/^@useavalon\//]},optimizeDeps:{exclude:[`@useavalon/avalon`,...g.map(e=>`@useavalon/${e}`)],include:r}}},configResolved(e){c=e,o=d(a,e.command===`serve`),globalThis.__avalonConfig=o,u(o,e.root)},async resolveId(e){if(e===`/src/client/main.js`&&O)return O;if(k.has(e)){let t=e.startsWith(`/`)?e.slice(1):e;return(await this.resolve(t))?.id??null}return null},async transform(e,t){if(t.includes(`@useavalon/`)&&/\.tsx?$/.test(t)){let{transform:n}=await import(`oxc-transform`),r=await n(t,e,{sourcemap:!0,typescript:{onlyRemoveTypeImports:!1}});return{code:r.code,map:r.map,moduleType:`js`}}},async buildStart(){await w(o,c?.root,l),T(o,l)},configureServer(e){globalThis.__viteDevServer=e}},j=y.filter(e=>e.name?.includes(`lit`)),M=y.filter(e=>!e.name?.includes(`lit`));return[s({pagesDir:m.pagesDir,layoutsDir:m.layoutsDir,modules:m.modules,verbose:m.verbose}),r(m,a?.nitro),i(m,a?.nitro),...v,...j,..._,A,E,...b,...M]}export function getResolvedConfig(){return globalThis.__avalonConfig}export function getPagesDir(){return globalThis.__avalonConfig?.pagesDir??`src/pages`}export function getLayoutsDir(){return globalThis.__avalonConfig?.layoutsDir??`src/layouts`}export function getNitroConfig(){return globalThis.__nitroConfig}export function isNitroEnabled(){return globalThis.__nitroConfig!==void 0}
|