@useavalon/avalon 0.1.11 → 0.1.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (250) hide show
  1. package/README.md +54 -54
  2. package/dist/mod.js +1 -0
  3. package/dist/src/build/integration-bundler-plugin.js +1 -0
  4. package/dist/src/build/integration-config.js +1 -0
  5. package/dist/src/build/integration-detection-plugin.js +1 -0
  6. package/dist/src/build/integration-resolver-plugin.js +1 -0
  7. package/dist/src/build/island-manifest.js +1 -0
  8. package/dist/src/build/island-types-generator.js +5 -0
  9. package/dist/src/build/mdx-island-transform.js +2 -0
  10. package/dist/src/build/mdx-plugin.js +1 -0
  11. package/dist/src/build/page-island-transform.js +3 -0
  12. package/dist/src/build/prop-extractors/index.js +1 -0
  13. package/dist/src/build/prop-extractors/lit.js +1 -0
  14. package/dist/src/build/prop-extractors/qwik.js +1 -0
  15. package/dist/src/build/prop-extractors/solid.js +1 -0
  16. package/dist/src/build/prop-extractors/svelte.js +1 -0
  17. package/dist/src/build/prop-extractors/vue.js +1 -0
  18. package/dist/src/build/sidecar-file-manager.js +1 -0
  19. package/dist/src/build/sidecar-renderer.js +6 -0
  20. package/dist/src/client/adapters/index.js +1 -0
  21. package/dist/src/client/components.js +1 -0
  22. package/dist/src/client/css-hmr-handler.js +1 -0
  23. package/dist/src/client/framework-adapter.js +13 -0
  24. package/dist/src/client/hmr-coordinator.js +1 -0
  25. package/dist/src/client/hmr-error-overlay.js +214 -0
  26. package/dist/src/client/main.js +39 -0
  27. package/{src → dist/src}/client/types/framework-runtime.d.ts +68 -68
  28. package/{src → dist/src}/client/types/vite-hmr.d.ts +46 -46
  29. package/dist/src/client/types/vite-virtual-modules.d.ts +70 -0
  30. package/dist/src/components/Image.js +1 -0
  31. package/dist/src/components/IslandErrorBoundary.js +1 -0
  32. package/dist/src/components/LayoutDataErrorBoundary.js +1 -0
  33. package/dist/src/components/LayoutErrorBoundary.js +1 -0
  34. package/dist/src/components/PersistentIsland.js +1 -0
  35. package/dist/src/components/StreamingErrorBoundary.js +1 -0
  36. package/dist/src/components/StreamingLayout.js +29 -0
  37. package/dist/src/core/components/component-analyzer.js +1 -0
  38. package/dist/src/core/components/component-detection.js +5 -0
  39. package/dist/src/core/components/enhanced-framework-detector.js +1 -0
  40. package/dist/src/core/components/framework-registry.js +1 -0
  41. package/dist/src/core/content/mdx-processor.js +1 -0
  42. package/dist/src/core/integrations/index.js +1 -0
  43. package/dist/src/core/integrations/loader.js +1 -0
  44. package/dist/src/core/integrations/registry.js +1 -0
  45. package/dist/src/core/islands/island-persistence.js +1 -0
  46. package/dist/src/core/islands/island-state-serializer.js +1 -0
  47. package/dist/src/core/islands/persistent-island-context.js +1 -0
  48. package/dist/src/core/islands/use-persistent-state.js +1 -0
  49. package/dist/src/core/layout/enhanced-layout-resolver.js +1 -0
  50. package/dist/src/core/layout/layout-cache-manager.js +1 -0
  51. package/dist/src/core/layout/layout-composer.js +1 -0
  52. package/dist/src/core/layout/layout-data-loader.js +1 -0
  53. package/dist/src/core/layout/layout-discovery.js +1 -0
  54. package/dist/src/core/layout/layout-matcher.js +1 -0
  55. package/dist/src/core/layout/layout-types.js +1 -0
  56. package/dist/src/core/modules/framework-module-resolver.js +1 -0
  57. package/dist/src/islands/component-analysis.js +1 -0
  58. package/dist/src/islands/css-utils.js +17 -0
  59. package/dist/src/islands/discovery/index.js +1 -0
  60. package/dist/src/islands/discovery/registry.js +1 -0
  61. package/dist/src/islands/discovery/resolver.js +2 -0
  62. package/dist/src/islands/discovery/scanner.js +1 -0
  63. package/dist/src/islands/discovery/types.js +1 -0
  64. package/dist/src/islands/discovery/validator.js +18 -0
  65. package/dist/src/islands/discovery/watcher.js +1 -0
  66. package/dist/src/islands/framework-detection.js +1 -0
  67. package/dist/src/islands/integration-loader.js +1 -0
  68. package/dist/src/islands/island.js +1 -0
  69. package/dist/src/islands/render-cache.js +1 -0
  70. package/dist/src/islands/types.js +1 -0
  71. package/dist/src/islands/universal-css-collector.js +5 -0
  72. package/dist/src/islands/universal-head-collector.js +2 -0
  73. package/{src → dist/src}/layout-system.d.ts +592 -592
  74. package/dist/src/layout-system.js +1 -0
  75. package/dist/src/middleware/discovery.js +1 -0
  76. package/dist/src/middleware/executor.js +1 -0
  77. package/dist/src/middleware/index.js +1 -0
  78. package/dist/src/middleware/types.js +1 -0
  79. package/dist/src/nitro/build-config.js +1 -0
  80. package/dist/src/nitro/config.js +1 -0
  81. package/dist/src/nitro/error-handler.js +198 -0
  82. package/dist/src/nitro/index.js +1 -0
  83. package/dist/src/nitro/island-manifest.js +2 -0
  84. package/dist/src/nitro/middleware-adapter.js +1 -0
  85. package/dist/src/nitro/renderer.js +183 -0
  86. package/dist/src/nitro/route-discovery.js +1 -0
  87. package/dist/src/nitro/types.js +1 -0
  88. package/dist/src/render/collect-css.js +3 -0
  89. package/{src/render/error-pages.ts → dist/src/render/error-pages.js} +7 -38
  90. package/dist/src/render/isolated-ssr-renderer.js +1 -0
  91. package/dist/src/render/ssr.js +90 -0
  92. package/dist/src/schemas/api.js +1 -0
  93. package/dist/src/schemas/core.js +1 -0
  94. package/dist/src/schemas/index.js +1 -0
  95. package/dist/src/schemas/layout.js +1 -0
  96. package/dist/src/schemas/routing/index.js +1 -0
  97. package/dist/src/schemas/routing.js +1 -0
  98. package/dist/src/types/as-island.js +1 -0
  99. package/{src → dist/src}/types/image.d.ts +106 -106
  100. package/{src → dist/src}/types/index.d.ts +22 -22
  101. package/{src → dist/src}/types/island-jsx.d.ts +33 -33
  102. package/{src → dist/src}/types/island-prop.d.ts +20 -20
  103. package/dist/src/types/layout.js +1 -0
  104. package/{src → dist/src}/types/mdx.d.ts +6 -6
  105. package/dist/src/types/routing.js +1 -0
  106. package/dist/src/types/types.js +1 -0
  107. package/{src → dist/src}/types/urlpattern.d.ts +49 -49
  108. package/{src → dist/src}/types/vite-env.d.ts +11 -11
  109. package/dist/src/utils/dev-logger.js +12 -0
  110. package/dist/src/utils/fs.js +1 -0
  111. package/dist/src/vite-plugin/auto-discover.js +1 -0
  112. package/dist/src/vite-plugin/config.js +1 -0
  113. package/dist/src/vite-plugin/errors.js +1 -0
  114. package/dist/src/vite-plugin/image-optimization.js +45 -0
  115. package/dist/src/vite-plugin/integration-activator.js +1 -0
  116. package/dist/src/vite-plugin/island-sidecar-plugin.js +1 -0
  117. package/dist/src/vite-plugin/module-discovery.js +1 -0
  118. package/dist/src/vite-plugin/nitro-integration.js +42 -0
  119. package/dist/src/vite-plugin/plugin.js +1 -0
  120. package/dist/src/vite-plugin/types.js +1 -0
  121. package/dist/src/vite-plugin/validation.js +2 -0
  122. package/package.json +57 -26
  123. package/mod.ts +0 -302
  124. package/src/build/integration-bundler-plugin.ts +0 -116
  125. package/src/build/integration-config.ts +0 -168
  126. package/src/build/integration-detection-plugin.ts +0 -117
  127. package/src/build/integration-resolver-plugin.ts +0 -90
  128. package/src/build/island-manifest.ts +0 -269
  129. package/src/build/island-types-generator.ts +0 -476
  130. package/src/build/mdx-island-transform.ts +0 -464
  131. package/src/build/mdx-plugin.ts +0 -98
  132. package/src/build/page-island-transform.ts +0 -598
  133. package/src/build/prop-extractors/index.ts +0 -21
  134. package/src/build/prop-extractors/lit.ts +0 -140
  135. package/src/build/prop-extractors/qwik.ts +0 -16
  136. package/src/build/prop-extractors/solid.ts +0 -125
  137. package/src/build/prop-extractors/svelte.ts +0 -194
  138. package/src/build/prop-extractors/vue.ts +0 -111
  139. package/src/build/sidecar-file-manager.ts +0 -104
  140. package/src/build/sidecar-renderer.ts +0 -30
  141. package/src/client/adapters/index.js +0 -12
  142. package/src/client/adapters/index.ts +0 -13
  143. package/src/client/adapters/lit-adapter.js +0 -467
  144. package/src/client/adapters/lit-adapter.ts +0 -654
  145. package/src/client/adapters/preact-adapter.js +0 -223
  146. package/src/client/adapters/preact-adapter.ts +0 -331
  147. package/src/client/adapters/qwik-adapter.js +0 -259
  148. package/src/client/adapters/qwik-adapter.ts +0 -345
  149. package/src/client/adapters/react-adapter.js +0 -220
  150. package/src/client/adapters/react-adapter.ts +0 -353
  151. package/src/client/adapters/solid-adapter.js +0 -295
  152. package/src/client/adapters/solid-adapter.ts +0 -451
  153. package/src/client/adapters/svelte-adapter.js +0 -368
  154. package/src/client/adapters/svelte-adapter.ts +0 -524
  155. package/src/client/adapters/vue-adapter.js +0 -278
  156. package/src/client/adapters/vue-adapter.ts +0 -467
  157. package/src/client/components.js +0 -23
  158. package/src/client/components.ts +0 -35
  159. package/src/client/css-hmr-handler.js +0 -263
  160. package/src/client/css-hmr-handler.ts +0 -344
  161. package/src/client/framework-adapter.js +0 -283
  162. package/src/client/framework-adapter.ts +0 -462
  163. package/src/client/hmr-coordinator.js +0 -274
  164. package/src/client/hmr-coordinator.ts +0 -396
  165. package/src/client/hmr-error-overlay.js +0 -533
  166. package/src/client/main.js +0 -816
  167. package/src/client/types/vite-virtual-modules.d.ts +0 -60
  168. package/src/components/Image.tsx +0 -123
  169. package/src/components/IslandErrorBoundary.tsx +0 -145
  170. package/src/components/LayoutDataErrorBoundary.tsx +0 -141
  171. package/src/components/LayoutErrorBoundary.tsx +0 -127
  172. package/src/components/PersistentIsland.tsx +0 -52
  173. package/src/components/StreamingErrorBoundary.tsx +0 -233
  174. package/src/components/StreamingLayout.tsx +0 -538
  175. package/src/core/components/component-analyzer.ts +0 -192
  176. package/src/core/components/component-detection.ts +0 -508
  177. package/src/core/components/enhanced-framework-detector.ts +0 -500
  178. package/src/core/components/framework-registry.ts +0 -563
  179. package/src/core/content/mdx-processor.ts +0 -46
  180. package/src/core/integrations/index.ts +0 -19
  181. package/src/core/integrations/loader.ts +0 -125
  182. package/src/core/integrations/registry.ts +0 -175
  183. package/src/core/islands/island-persistence.ts +0 -325
  184. package/src/core/islands/island-state-serializer.ts +0 -258
  185. package/src/core/islands/persistent-island-context.tsx +0 -80
  186. package/src/core/islands/use-persistent-state.ts +0 -68
  187. package/src/core/layout/enhanced-layout-resolver.ts +0 -322
  188. package/src/core/layout/layout-cache-manager.ts +0 -485
  189. package/src/core/layout/layout-composer.ts +0 -357
  190. package/src/core/layout/layout-data-loader.ts +0 -516
  191. package/src/core/layout/layout-discovery.ts +0 -243
  192. package/src/core/layout/layout-matcher.ts +0 -299
  193. package/src/core/layout/layout-types.ts +0 -110
  194. package/src/core/modules/framework-module-resolver.ts +0 -273
  195. package/src/islands/component-analysis.ts +0 -213
  196. package/src/islands/css-utils.ts +0 -565
  197. package/src/islands/discovery/index.ts +0 -80
  198. package/src/islands/discovery/registry.ts +0 -340
  199. package/src/islands/discovery/resolver.ts +0 -477
  200. package/src/islands/discovery/scanner.ts +0 -386
  201. package/src/islands/discovery/types.ts +0 -117
  202. package/src/islands/discovery/validator.ts +0 -544
  203. package/src/islands/discovery/watcher.ts +0 -368
  204. package/src/islands/framework-detection.ts +0 -428
  205. package/src/islands/integration-loader.ts +0 -490
  206. package/src/islands/island.tsx +0 -565
  207. package/src/islands/render-cache.ts +0 -550
  208. package/src/islands/types.ts +0 -80
  209. package/src/islands/universal-css-collector.ts +0 -157
  210. package/src/islands/universal-head-collector.ts +0 -137
  211. package/src/layout-system.ts +0 -218
  212. package/src/middleware/discovery.ts +0 -268
  213. package/src/middleware/executor.ts +0 -315
  214. package/src/middleware/index.ts +0 -76
  215. package/src/middleware/types.ts +0 -99
  216. package/src/nitro/build-config.ts +0 -576
  217. package/src/nitro/config.ts +0 -483
  218. package/src/nitro/error-handler.ts +0 -636
  219. package/src/nitro/index.ts +0 -173
  220. package/src/nitro/island-manifest.ts +0 -584
  221. package/src/nitro/middleware-adapter.ts +0 -260
  222. package/src/nitro/renderer.ts +0 -1471
  223. package/src/nitro/route-discovery.ts +0 -439
  224. package/src/nitro/types.ts +0 -321
  225. package/src/render/collect-css.ts +0 -198
  226. package/src/render/isolated-ssr-renderer.ts +0 -654
  227. package/src/render/ssr.ts +0 -1030
  228. package/src/schemas/api.ts +0 -30
  229. package/src/schemas/core.ts +0 -64
  230. package/src/schemas/index.ts +0 -212
  231. package/src/schemas/layout.ts +0 -279
  232. package/src/schemas/routing/index.ts +0 -38
  233. package/src/schemas/routing.ts +0 -376
  234. package/src/types/as-island.ts +0 -20
  235. package/src/types/layout.ts +0 -285
  236. package/src/types/routing.ts +0 -555
  237. package/src/types/types.ts +0 -5
  238. package/src/utils/dev-logger.ts +0 -299
  239. package/src/utils/fs.ts +0 -151
  240. package/src/vite-plugin/auto-discover.ts +0 -551
  241. package/src/vite-plugin/config.ts +0 -266
  242. package/src/vite-plugin/errors.ts +0 -127
  243. package/src/vite-plugin/image-optimization.ts +0 -156
  244. package/src/vite-plugin/integration-activator.ts +0 -126
  245. package/src/vite-plugin/island-sidecar-plugin.ts +0 -176
  246. package/src/vite-plugin/module-discovery.ts +0 -189
  247. package/src/vite-plugin/nitro-integration.ts +0 -1354
  248. package/src/vite-plugin/plugin.ts +0 -409
  249. package/src/vite-plugin/types.ts +0 -327
  250. package/src/vite-plugin/validation.ts +0 -228
@@ -1,409 +0,0 @@
1
- /**
2
- * Avalon Vite Plugin
3
- *
4
- * This module provides the main `avalon()` function that creates a unified Vite plugin
5
- * for the Avalon framework. It handles configuration resolution, integration activation,
6
- * Nitro server integration, and wires up all the necessary Vite hooks.
7
- *
8
- * ISLAND DETECTION:
9
- * Islands are detected by usage - any component used with an `island` prop in pages
10
- * or layouts is automatically treated as an island. No fixed islands directory required.
11
- */
12
-
13
- import type { Plugin, PluginOption, ResolvedConfig, ViteDevServer } from "vite";
14
- import type {
15
- AvalonPluginConfig,
16
- IntegrationName,
17
- ResolvedAvalonConfig,
18
- } from "./types.ts";
19
- import { createRequire } from "node:module";
20
- import { dirname, join } from "node:path";
21
- import { resolveConfig, checkDirectoriesExist } from "./config.ts";
22
- import { activateIntegrations, activateSingleIntegration } from "./integration-activator.ts";
23
- import { discoverIntegrationsFromIslandUsage } from "./auto-discover.ts";
24
- import { validateActiveIntegrations, formatValidationResults } from "./validation.ts";
25
- import { createMDXPlugin } from "../build/mdx-plugin.ts";
26
- import { mdxIslandTransform } from "../build/mdx-island-transform.ts";
27
- import { pageIslandTransform } from "../build/page-island-transform.ts";
28
- import { registry } from "../core/integrations/registry.ts";
29
- import { createNitroIntegration } from "./nitro-integration.ts";
30
- import { islandSidecarPlugin } from "./island-sidecar-plugin.ts";
31
- import { createImagePlugin } from "./image-optimization.ts";
32
- import type { NitroConfigOutput } from "../nitro/config.ts";
33
- declare global {
34
- var __avalonConfig: ResolvedAvalonConfig | undefined;
35
- var __viteDevServer: ViteDevServer | undefined;
36
- var __nitroConfig: NitroConfigOutput | undefined;
37
- }
38
-
39
- /**
40
- * Collects Vite plugins from all activated integrations.
41
- *
42
- * This function iterates through the activated integrations and calls their
43
- * vitePlugin() method if implemented. The returned plugins are collected and
44
- * flattened into a single array.
45
- *
46
- * Plugin ordering is handled to ensure correct application:
47
- * - Lit plugins come first (DOM shim requirement)
48
- * - Other framework plugins follow
49
- *
50
- * @param activeIntegrations - Set of activated integration names
51
- * @param verbose - Whether to log detailed information
52
- * @returns Promise resolving to an array of Vite plugins from integrations
53
- */
54
- export async function collectIntegrationPlugins(
55
- activeIntegrations: Set<IntegrationName>,
56
- verbose: boolean = false
57
- ): Promise<Plugin[]> {
58
- const plugins: Plugin[] = [];
59
- const litPlugins: Plugin[] = [];
60
-
61
- for (const name of activeIntegrations) {
62
- const validPlugins = await loadPluginsForIntegration(name, verbose);
63
- if (name === "lit") {
64
- litPlugins.push(...validPlugins);
65
- } else {
66
- plugins.push(...validPlugins);
67
- }
68
- }
69
-
70
- return [...litPlugins, ...plugins];
71
- }
72
-
73
- async function loadPluginsForIntegration(name: IntegrationName, _verbose: boolean): Promise<Plugin[]> {
74
- const integration = registry.get(name);
75
- if (!integration) return [];
76
- if (typeof integration.vitePlugin !== "function") return [];
77
-
78
- try {
79
- const result = await integration.vitePlugin();
80
- const pluginArray = Array.isArray(result) ? result : [result];
81
- return pluginArray.filter((p): p is Plugin => p != null);
82
- } catch (error) {
83
- console.warn(`[avalon] Failed to load vite plugin for ${name}:`, error instanceof Error ? error.message : error);
84
- return [];
85
- }
86
- }
87
-
88
- /**
89
- * Discovers which integrations are actually needed by scanning pages/layouts for island prop usage.
90
- * This enables lazy loading - only load Vite plugins for frameworks that are actually used.
91
- *
92
- * @param config - The resolved Avalon configuration
93
- * @param projectRoot - The project root directory (defaults to cwd)
94
- * @returns Set of integration names that are actually needed
95
- */
96
- async function discoverNeededIntegrations(
97
- config: ResolvedAvalonConfig,
98
- projectRoot?: string
99
- ): Promise<Set<IntegrationName>> {
100
- const needed = new Set<IntegrationName>();
101
-
102
- try {
103
- // Scan pages, layouts, and modules for components used with island prop
104
- const discovered = await discoverIntegrationsFromIslandUsage(
105
- config.pagesDir,
106
- config.layoutsDir,
107
- projectRoot,
108
- config.modules?.dir
109
- );
110
-
111
- // Only include integrations that are both discovered AND configured
112
- for (const integration of discovered) {
113
- if (config.integrations.includes(integration)) {
114
- needed.add(integration);
115
- }
116
- }
117
- } catch {
118
- // If discovery fails, fall back to all configured integrations
119
- for (const integration of config.integrations) {
120
- needed.add(integration);
121
- }
122
- }
123
-
124
- return needed;
125
- }
126
-
127
- async function resolveIntegrationsToLoad(
128
- preResolvedConfig: ResolvedAvalonConfig
129
- ): Promise<IntegrationName[]> {
130
- if (!preResolvedConfig.lazyIntegrations || preResolvedConfig.integrations.length === 0) {
131
- return [...preResolvedConfig.integrations];
132
- }
133
-
134
- const needed = await discoverNeededIntegrations(preResolvedConfig);
135
- if (needed.size === 0) {
136
- return [...preResolvedConfig.integrations];
137
- }
138
-
139
- return Array.from(needed);
140
- }
141
-
142
- async function setupMDXPlugins(preResolvedConfig: ResolvedAvalonConfig): Promise<Plugin[]> {
143
- try {
144
- const mdxPlugins = await createMDXPlugin({
145
- jsxImportSource: preResolvedConfig.mdx.jsxImportSource,
146
- syntaxHighlighting: preResolvedConfig.mdx.syntaxHighlighting,
147
- remarkPlugins: preResolvedConfig.mdx.remarkPlugins as import("unified").Pluggable[],
148
- rehypePlugins: preResolvedConfig.mdx.rehypePlugins as import("unified").Pluggable[],
149
- development: true,
150
- });
151
- mdxPlugins.push(mdxIslandTransform({ verbose: preResolvedConfig.verbose }));
152
- return mdxPlugins;
153
- } catch (error) {
154
- if (preResolvedConfig.showWarnings) {
155
- console.warn("⚠️ Could not configure MDX plugin:", error);
156
- }
157
- return [];
158
- }
159
- }
160
-
161
- function setupNitroPlugins(
162
- preResolvedConfig: ResolvedAvalonConfig,
163
- nitroConfig: NonNullable<AvalonPluginConfig["nitro"]>,
164
- _verbose?: boolean
165
- ): { plugins: Plugin[]; options: NitroConfigOutput } {
166
- const { plugins, nitroOptions } = createNitroIntegration(preResolvedConfig, nitroConfig);
167
- globalThis.__nitroConfig = nitroOptions;
168
- return { plugins, options: nitroOptions };
169
- }
170
-
171
- async function runAutoDiscovery(
172
- resolvedConfig: ResolvedAvalonConfig,
173
- viteRoot: string,
174
- activeIntegrations: Set<IntegrationName>
175
- ): Promise<void> {
176
- if (!resolvedConfig.autoDiscoverIntegrations) return;
177
-
178
- try {
179
- const discovered = await discoverIntegrationsFromIslandUsage(
180
- resolvedConfig.pagesDir,
181
- resolvedConfig.layoutsDir,
182
- viteRoot,
183
- resolvedConfig.modules?.dir
184
- );
185
- for (const name of discovered) {
186
- if (activeIntegrations.has(name)) continue;
187
- try {
188
- await activateSingleIntegration(name, activeIntegrations, resolvedConfig.verbose);
189
- } catch (error) {
190
- if (resolvedConfig.showWarnings) console.warn(` ⚠️ Could not auto-load integration: ${name}`, error);
191
- }
192
- }
193
- } catch (error) {
194
- if (resolvedConfig.showWarnings) console.warn(" ⚠️ Auto-discovery failed:", error);
195
- }
196
- }
197
-
198
- function runValidation(
199
- resolvedConfig: ResolvedAvalonConfig,
200
- activeIntegrations: Set<IntegrationName>
201
- ): void {
202
- if (!resolvedConfig.validateIntegrations || activeIntegrations.size === 0) return;
203
-
204
- const validationSummary = validateActiveIntegrations(activeIntegrations, resolvedConfig.showWarnings);
205
- if (!validationSummary.allValid) {
206
- console.error(formatValidationResults(validationSummary));
207
- if (resolvedConfig.showWarnings) console.warn(" ⚠️ Some integrations have validation issues.");
208
- }
209
- }
210
-
211
- /**
212
- * Creates the Avalon Vite plugin array
213
- *
214
- * @param config - Avalon configuration options
215
- * @returns A promise that resolves to an array of Vite plugins that handle all Avalon functionality.
216
- * Returns PluginOption[] to avoid TypeScript's excessive stack depth issues
217
- * when comparing Plugin<any> arrays in Vite 8's complex type system.
218
- */
219
- export async function avalon(config?: AvalonPluginConfig): Promise<PluginOption[]> {
220
- // Resolved configuration with defaults applied
221
- let resolvedConfig: ResolvedAvalonConfig;
222
-
223
- // Reference to Vite's resolved config
224
- let viteConfig: ResolvedConfig;
225
-
226
- // Track which integrations are activated
227
- const activeIntegrations = new Set<IntegrationName>();
228
-
229
- // Pre-resolve config to get MDX settings and integration list
230
- // We use isDev=true as a default; the actual value will be set in configResolved
231
- const preResolvedConfig = resolveConfig(config, true);
232
-
233
- const integrationsToLoad = await resolveIntegrationsToLoad(preResolvedConfig);
234
-
235
- if (integrationsToLoad.length > 0) {
236
- await activateIntegrations({ ...preResolvedConfig, integrations: integrationsToLoad }, activeIntegrations);
237
- }
238
- const mdxPlugins = await setupMDXPlugins(preResolvedConfig);
239
-
240
- // Image optimization plugins (vite-imagetools wrapper)
241
- const imagePlugins = await createImagePlugin(preResolvedConfig.image, preResolvedConfig.verbose);
242
-
243
- let integrationPlugins: Plugin[] = [];
244
- if (activeIntegrations.size > 0) {
245
- integrationPlugins = await collectIntegrationPlugins(activeIntegrations, preResolvedConfig.verbose);
246
- }
247
-
248
- let nitroPlugins: Plugin[] = [];
249
- if (config?.nitro) {
250
- const { plugins } = setupNitroPlugins(preResolvedConfig, config.nitro, preResolvedConfig.verbose);
251
- nitroPlugins = plugins;
252
- }
253
-
254
- // Sidecar plugin for Vue/Svelte/Solid type declarations
255
- const sidecarPlugin = islandSidecarPlugin({
256
- verbose: preResolvedConfig.verbose,
257
- });
258
-
259
- // Pre-resolve paths for standalone projects.
260
- // In the monorepo www/ project these are handled by manual resolve.alias.
261
- const require = createRequire(import.meta.url);
262
-
263
- let clientMainResolved: string | null = null;
264
- try {
265
- const clientEntry = require.resolve("@useavalon/avalon/client");
266
- clientMainResolved = join(dirname(clientEntry), "main.js");
267
- } catch {
268
- // Monorepo — www/ sets its own alias
269
- }
270
-
271
- // Resolve /@useavalon/*/client virtual imports used by main.js
272
- // These are resolved dynamically in the resolveId hook using Vite's resolver
273
- const integrationClientIds = new Set(
274
- ['preact', 'react', 'vue', 'svelte', 'solid', 'lit', 'qwik'].map(
275
- name => `/@useavalon/${name}/client`
276
- )
277
- );
278
-
279
- // The main Avalon plugin
280
- const avalonPlugin: Plugin = {
281
- name: "avalon",
282
- enforce: "pre",
283
-
284
- config() {
285
- // @useavalon packages ship raw .ts source for SSR and pre-compiled
286
- // .js for client-side code.
287
- //
288
- // oxc.exclude: Prevents Vite's built-in OXC from processing @useavalon
289
- // .ts files. Without this, OXC applies integration plugins' global
290
- // jsx: 'automatic' config to plain .ts files, causing errors.
291
- // Our transform hook below handles TS stripping for SSR instead.
292
- // Client-side loads .js files which OXC skips by default (/\.js$/).
293
- //
294
- // ssr.noExternal: Ensures Vite processes @useavalon packages through
295
- // the SSR transform pipeline instead of treating them as external CJS.
296
- return {
297
- oxc: {
298
- exclude: [/node_modules\/@useavalon\/.*\.tsx?$/],
299
- },
300
- ssr: {
301
- noExternal: [/^@useavalon\//],
302
- },
303
- };
304
- },
305
-
306
- configResolved(resolvedViteConfig: ResolvedConfig) {
307
- viteConfig = resolvedViteConfig;
308
- const isDev = resolvedViteConfig.command === "serve";
309
- resolvedConfig = resolveConfig(config, isDev);
310
-
311
- globalThis.__avalonConfig = resolvedConfig;
312
-
313
- checkDirectoriesExist(resolvedConfig, resolvedViteConfig.root);
314
- },
315
-
316
- async resolveId(id: string) {
317
- if (id === "/src/client/main.js" && clientMainResolved) {
318
- return clientMainResolved;
319
- }
320
- // /@useavalon/*/client — resolve through Vite's pipeline so it finds
321
- // workspace-linked or npm-installed integration packages from the
322
- // consuming project's node_modules, not from avalon's own context.
323
- if (integrationClientIds.has(id)) {
324
- const packageId = id.slice(1); // strip leading /
325
- const resolved = await this.resolve(packageId);
326
- return resolved?.id ?? null;
327
- }
328
- return null;
329
- },
330
-
331
- async transform(code: string, id: string) {
332
- // For SSR: strip TypeScript from @useavalon packages ourselves.
333
- // Integration plugins (react, preact) set jsx: 'automatic' which Vite's
334
- // OXC applies to all files — causing "Invalid jsx option" errors on
335
- // plain .ts files during SSR. We intercept and strip TS without JSX config.
336
- // For client-side: main.js imports pre-compiled .js files that OXC
337
- // skips entirely (default exclude: /\.js$/), avoiding the jsx conflict.
338
- if (
339
- this.environment?.config?.consumer === 'server' &&
340
- id.includes('@useavalon/') &&
341
- /\.tsx?$/.test(id)
342
- ) {
343
- const { transform: oxcTransform } = await import('oxc-transform');
344
- const result = await oxcTransform(id, code, {
345
- sourcemap: true,
346
- typescript: { onlyRemoveTypeImports: false },
347
- });
348
- return { code: result.code, map: result.map, moduleType: 'js' };
349
- }
350
- },
351
-
352
- async buildStart() {
353
- await runAutoDiscovery(resolvedConfig, viteConfig?.root, activeIntegrations);
354
- runValidation(resolvedConfig, activeIntegrations);
355
- },
356
-
357
- configureServer(server: ViteDevServer) {
358
-
359
- (globalThis as any).__viteDevServer = server;
360
- },
361
- };
362
-
363
- // Extract Lit plugins for proper ordering
364
- const litPlugins = integrationPlugins.filter(p => p.name?.includes("lit"));
365
- const otherIntegrationPlugins = integrationPlugins.filter(p => !p.name?.includes("lit"));
366
-
367
- // Page island transform: auto-wraps components with `island` prop
368
- const pageTransformPlugin = pageIslandTransform({
369
- pagesDir: preResolvedConfig.pagesDir,
370
- layoutsDir: preResolvedConfig.layoutsDir,
371
- modules: preResolvedConfig.modules,
372
- verbose: preResolvedConfig.verbose,
373
- });
374
-
375
- return [
376
- pageTransformPlugin,
377
- ...imagePlugins,
378
- ...litPlugins,
379
- ...mdxPlugins,
380
- avalonPlugin,
381
- sidecarPlugin,
382
- ...nitroPlugins,
383
- ...otherIntegrationPlugins,
384
- ] as PluginOption[];
385
- }
386
-
387
- export function getResolvedConfig(): ResolvedAvalonConfig | undefined {
388
- return globalThis.__avalonConfig;
389
- }
390
-
391
- export function getPagesDir(): string {
392
- return globalThis.__avalonConfig?.pagesDir ?? "src/pages";
393
- }
394
-
395
- export function getLayoutsDir(): string {
396
- return globalThis.__avalonConfig?.layoutsDir ?? "src/layouts";
397
- }
398
-
399
-
400
- export function getNitroConfig(): NitroConfigOutput | undefined {
401
- return globalThis.__nitroConfig;
402
- }
403
-
404
- export function isNitroEnabled(): boolean {
405
- return globalThis.__nitroConfig !== undefined;
406
- }
407
-
408
- export type { AvalonPluginConfig, IntegrationName, ResolvedAvalonConfig, ImageConfig, ResolvedImageConfig } from "./types.ts";
409
- export type { AvalonNitroConfig, NitroConfigOutput } from "../nitro/config.ts";