@useavalon/avalon 0.1.13 → 0.1.14

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 (230) hide show
  1. package/dist/mod.js +1 -0
  2. package/dist/src/build/integration-bundler-plugin.js +1 -0
  3. package/dist/src/build/integration-config.js +1 -0
  4. package/dist/src/build/integration-detection-plugin.js +1 -0
  5. package/dist/src/build/integration-resolver-plugin.js +1 -0
  6. package/dist/src/build/island-manifest.js +1 -0
  7. package/dist/src/build/island-types-generator.js +5 -0
  8. package/dist/src/build/mdx-island-transform.js +2 -0
  9. package/dist/src/build/mdx-plugin.js +1 -0
  10. package/dist/src/build/page-island-transform.js +3 -0
  11. package/dist/src/build/prop-extractors/index.js +1 -0
  12. package/dist/src/build/prop-extractors/lit.js +1 -0
  13. package/dist/src/build/prop-extractors/qwik.js +1 -0
  14. package/dist/src/build/prop-extractors/solid.js +1 -0
  15. package/dist/src/build/prop-extractors/svelte.js +1 -0
  16. package/dist/src/build/prop-extractors/vue.js +1 -0
  17. package/dist/src/build/sidecar-file-manager.js +1 -0
  18. package/dist/src/build/sidecar-renderer.js +6 -0
  19. package/dist/src/client/adapters/index.js +1 -0
  20. package/dist/src/client/components.js +1 -0
  21. package/dist/src/client/css-hmr-handler.js +1 -0
  22. package/dist/src/client/framework-adapter.js +13 -0
  23. package/dist/src/client/hmr-coordinator.js +1 -0
  24. package/dist/src/client/hmr-error-overlay.js +214 -0
  25. package/dist/src/client/main.js +39 -0
  26. package/dist/src/components/Image.js +1 -0
  27. package/dist/src/components/IslandErrorBoundary.js +1 -0
  28. package/dist/src/components/LayoutDataErrorBoundary.js +1 -0
  29. package/dist/src/components/LayoutErrorBoundary.js +1 -0
  30. package/dist/src/components/PersistentIsland.js +1 -0
  31. package/dist/src/components/StreamingErrorBoundary.js +1 -0
  32. package/dist/src/components/StreamingLayout.js +29 -0
  33. package/dist/src/core/components/component-analyzer.js +1 -0
  34. package/dist/src/core/components/component-detection.js +5 -0
  35. package/dist/src/core/components/enhanced-framework-detector.js +1 -0
  36. package/dist/src/core/components/framework-registry.js +1 -0
  37. package/dist/src/core/content/mdx-processor.js +1 -0
  38. package/dist/src/core/integrations/index.js +1 -0
  39. package/dist/src/core/integrations/loader.js +1 -0
  40. package/dist/src/core/integrations/registry.js +1 -0
  41. package/dist/src/core/islands/island-persistence.js +1 -0
  42. package/dist/src/core/islands/island-state-serializer.js +1 -0
  43. package/dist/src/core/islands/persistent-island-context.js +1 -0
  44. package/dist/src/core/islands/use-persistent-state.js +1 -0
  45. package/dist/src/core/layout/enhanced-layout-resolver.js +1 -0
  46. package/dist/src/core/layout/layout-cache-manager.js +1 -0
  47. package/dist/src/core/layout/layout-composer.js +1 -0
  48. package/dist/src/core/layout/layout-data-loader.js +1 -0
  49. package/dist/src/core/layout/layout-discovery.js +1 -0
  50. package/dist/src/core/layout/layout-matcher.js +1 -0
  51. package/dist/src/core/layout/layout-types.js +1 -0
  52. package/dist/src/core/modules/framework-module-resolver.js +1 -0
  53. package/dist/src/islands/component-analysis.js +1 -0
  54. package/dist/src/islands/css-utils.js +17 -0
  55. package/dist/src/islands/discovery/index.js +1 -0
  56. package/dist/src/islands/discovery/registry.js +1 -0
  57. package/dist/src/islands/discovery/resolver.js +2 -0
  58. package/dist/src/islands/discovery/scanner.js +1 -0
  59. package/dist/src/islands/discovery/types.js +1 -0
  60. package/dist/src/islands/discovery/validator.js +18 -0
  61. package/dist/src/islands/discovery/watcher.js +1 -0
  62. package/dist/src/islands/framework-detection.js +1 -0
  63. package/dist/src/islands/integration-loader.js +1 -0
  64. package/dist/src/islands/island.js +1 -0
  65. package/dist/src/islands/render-cache.js +1 -0
  66. package/dist/src/islands/types.js +1 -0
  67. package/dist/src/islands/universal-css-collector.js +5 -0
  68. package/dist/src/islands/universal-head-collector.js +2 -0
  69. package/dist/src/layout-system.js +1 -0
  70. package/dist/src/middleware/discovery.js +1 -0
  71. package/dist/src/middleware/executor.js +1 -0
  72. package/dist/src/middleware/index.js +1 -0
  73. package/dist/src/middleware/types.js +1 -0
  74. package/dist/src/nitro/build-config.js +1 -0
  75. package/dist/src/nitro/config.js +1 -0
  76. package/dist/src/nitro/error-handler.js +198 -0
  77. package/dist/src/nitro/index.js +1 -0
  78. package/dist/src/nitro/island-manifest.js +2 -0
  79. package/dist/src/nitro/middleware-adapter.js +1 -0
  80. package/dist/src/nitro/renderer.js +183 -0
  81. package/dist/src/nitro/route-discovery.js +1 -0
  82. package/dist/src/nitro/types.js +1 -0
  83. package/dist/src/render/collect-css.js +3 -0
  84. package/dist/src/render/error-pages.js +48 -0
  85. package/dist/src/render/isolated-ssr-renderer.js +1 -0
  86. package/dist/src/render/ssr.js +90 -0
  87. package/dist/src/schemas/api.js +1 -0
  88. package/dist/src/schemas/core.js +1 -0
  89. package/dist/src/schemas/index.js +1 -0
  90. package/dist/src/schemas/layout.js +1 -0
  91. package/dist/src/schemas/routing/index.js +1 -0
  92. package/dist/src/schemas/routing.js +1 -0
  93. package/dist/src/types/as-island.js +1 -0
  94. package/dist/src/types/layout.js +1 -0
  95. package/dist/src/types/routing.js +1 -0
  96. package/dist/src/types/types.js +1 -0
  97. package/dist/src/utils/dev-logger.js +12 -0
  98. package/dist/src/utils/fs.js +1 -0
  99. package/dist/src/vite-plugin/auto-discover.js +1 -0
  100. package/dist/src/vite-plugin/config.js +1 -0
  101. package/dist/src/vite-plugin/errors.js +1 -0
  102. package/dist/src/vite-plugin/image-optimization.js +45 -0
  103. package/dist/src/vite-plugin/integration-activator.js +1 -0
  104. package/dist/src/vite-plugin/island-sidecar-plugin.js +1 -0
  105. package/dist/src/vite-plugin/module-discovery.js +1 -0
  106. package/dist/src/vite-plugin/nitro-integration.js +42 -0
  107. package/dist/src/vite-plugin/plugin.js +1 -0
  108. package/dist/src/vite-plugin/types.js +1 -0
  109. package/dist/src/vite-plugin/validation.js +2 -0
  110. package/package.json +14 -20
  111. package/mod.ts +0 -302
  112. package/src/build/integration-bundler-plugin.ts +0 -116
  113. package/src/build/integration-config.ts +0 -168
  114. package/src/build/integration-detection-plugin.ts +0 -117
  115. package/src/build/integration-resolver-plugin.ts +0 -90
  116. package/src/build/island-manifest.ts +0 -269
  117. package/src/build/island-types-generator.ts +0 -476
  118. package/src/build/mdx-island-transform.ts +0 -464
  119. package/src/build/mdx-plugin.ts +0 -98
  120. package/src/build/page-island-transform.ts +0 -598
  121. package/src/build/prop-extractors/index.ts +0 -21
  122. package/src/build/prop-extractors/lit.ts +0 -140
  123. package/src/build/prop-extractors/qwik.ts +0 -16
  124. package/src/build/prop-extractors/solid.ts +0 -125
  125. package/src/build/prop-extractors/svelte.ts +0 -194
  126. package/src/build/prop-extractors/vue.ts +0 -111
  127. package/src/build/sidecar-file-manager.ts +0 -104
  128. package/src/build/sidecar-renderer.ts +0 -30
  129. package/src/client/adapters/index.ts +0 -21
  130. package/src/client/components.ts +0 -35
  131. package/src/client/css-hmr-handler.ts +0 -344
  132. package/src/client/framework-adapter.ts +0 -462
  133. package/src/client/hmr-coordinator.ts +0 -396
  134. package/src/client/hmr-error-overlay.js +0 -533
  135. package/src/client/main.js +0 -824
  136. package/src/components/Image.tsx +0 -123
  137. package/src/components/IslandErrorBoundary.tsx +0 -145
  138. package/src/components/LayoutDataErrorBoundary.tsx +0 -141
  139. package/src/components/LayoutErrorBoundary.tsx +0 -127
  140. package/src/components/PersistentIsland.tsx +0 -52
  141. package/src/components/StreamingErrorBoundary.tsx +0 -233
  142. package/src/components/StreamingLayout.tsx +0 -538
  143. package/src/core/components/component-analyzer.ts +0 -192
  144. package/src/core/components/component-detection.ts +0 -508
  145. package/src/core/components/enhanced-framework-detector.ts +0 -500
  146. package/src/core/components/framework-registry.ts +0 -563
  147. package/src/core/content/mdx-processor.ts +0 -46
  148. package/src/core/integrations/index.ts +0 -19
  149. package/src/core/integrations/loader.ts +0 -125
  150. package/src/core/integrations/registry.ts +0 -175
  151. package/src/core/islands/island-persistence.ts +0 -325
  152. package/src/core/islands/island-state-serializer.ts +0 -258
  153. package/src/core/islands/persistent-island-context.tsx +0 -80
  154. package/src/core/islands/use-persistent-state.ts +0 -68
  155. package/src/core/layout/enhanced-layout-resolver.ts +0 -322
  156. package/src/core/layout/layout-cache-manager.ts +0 -485
  157. package/src/core/layout/layout-composer.ts +0 -357
  158. package/src/core/layout/layout-data-loader.ts +0 -516
  159. package/src/core/layout/layout-discovery.ts +0 -243
  160. package/src/core/layout/layout-matcher.ts +0 -299
  161. package/src/core/layout/layout-types.ts +0 -110
  162. package/src/core/modules/framework-module-resolver.ts +0 -273
  163. package/src/islands/component-analysis.ts +0 -213
  164. package/src/islands/css-utils.ts +0 -565
  165. package/src/islands/discovery/index.ts +0 -80
  166. package/src/islands/discovery/registry.ts +0 -340
  167. package/src/islands/discovery/resolver.ts +0 -477
  168. package/src/islands/discovery/scanner.ts +0 -386
  169. package/src/islands/discovery/types.ts +0 -117
  170. package/src/islands/discovery/validator.ts +0 -544
  171. package/src/islands/discovery/watcher.ts +0 -368
  172. package/src/islands/framework-detection.ts +0 -428
  173. package/src/islands/integration-loader.ts +0 -490
  174. package/src/islands/island.tsx +0 -565
  175. package/src/islands/render-cache.ts +0 -550
  176. package/src/islands/types.ts +0 -80
  177. package/src/islands/universal-css-collector.ts +0 -157
  178. package/src/islands/universal-head-collector.ts +0 -137
  179. package/src/layout-system.ts +0 -218
  180. package/src/middleware/discovery.ts +0 -268
  181. package/src/middleware/executor.ts +0 -315
  182. package/src/middleware/index.ts +0 -76
  183. package/src/middleware/types.ts +0 -99
  184. package/src/nitro/build-config.ts +0 -576
  185. package/src/nitro/config.ts +0 -483
  186. package/src/nitro/error-handler.ts +0 -636
  187. package/src/nitro/index.ts +0 -173
  188. package/src/nitro/island-manifest.ts +0 -584
  189. package/src/nitro/middleware-adapter.ts +0 -260
  190. package/src/nitro/renderer.ts +0 -1471
  191. package/src/nitro/route-discovery.ts +0 -439
  192. package/src/nitro/types.ts +0 -321
  193. package/src/render/collect-css.ts +0 -198
  194. package/src/render/error-pages.ts +0 -79
  195. package/src/render/isolated-ssr-renderer.ts +0 -654
  196. package/src/render/ssr.ts +0 -1030
  197. package/src/schemas/api.ts +0 -30
  198. package/src/schemas/core.ts +0 -64
  199. package/src/schemas/index.ts +0 -212
  200. package/src/schemas/layout.ts +0 -279
  201. package/src/schemas/routing/index.ts +0 -38
  202. package/src/schemas/routing.ts +0 -376
  203. package/src/types/as-island.ts +0 -20
  204. package/src/types/layout.ts +0 -285
  205. package/src/types/routing.ts +0 -555
  206. package/src/types/types.ts +0 -5
  207. package/src/utils/dev-logger.ts +0 -299
  208. package/src/utils/fs.ts +0 -151
  209. package/src/vite-plugin/auto-discover.ts +0 -551
  210. package/src/vite-plugin/config.ts +0 -266
  211. package/src/vite-plugin/errors.ts +0 -127
  212. package/src/vite-plugin/image-optimization.ts +0 -156
  213. package/src/vite-plugin/integration-activator.ts +0 -126
  214. package/src/vite-plugin/island-sidecar-plugin.ts +0 -176
  215. package/src/vite-plugin/module-discovery.ts +0 -189
  216. package/src/vite-plugin/nitro-integration.ts +0 -1354
  217. package/src/vite-plugin/plugin.ts +0 -403
  218. package/src/vite-plugin/types.ts +0 -327
  219. package/src/vite-plugin/validation.ts +0 -228
  220. /package/{src → dist/src}/client/types/framework-runtime.d.ts +0 -0
  221. /package/{src → dist/src}/client/types/vite-hmr.d.ts +0 -0
  222. /package/{src → dist/src}/client/types/vite-virtual-modules.d.ts +0 -0
  223. /package/{src → dist/src}/layout-system.d.ts +0 -0
  224. /package/{src → dist/src}/types/image.d.ts +0 -0
  225. /package/{src → dist/src}/types/index.d.ts +0 -0
  226. /package/{src → dist/src}/types/island-jsx.d.ts +0 -0
  227. /package/{src → dist/src}/types/island-prop.d.ts +0 -0
  228. /package/{src → dist/src}/types/mdx.d.ts +0 -0
  229. /package/{src → dist/src}/types/urlpattern.d.ts +0 -0
  230. /package/{src → dist/src}/types/vite-env.d.ts +0 -0
@@ -1,386 +0,0 @@
1
- /**
2
- * Island Directory Scanner
3
- *
4
- * Recursively scans the source directory to discover all islands directories.
5
- * Supports nested patterns like /src/modules/[module]/islands/.
6
- */
7
-
8
- import { resolve, relative, dirname, basename, extname } from "node:path";
9
- import { stat as fsStat, readdir } from "node:fs/promises";
10
- import type {
11
- IslandDirectory,
12
- IslandDiscoveryConfig,
13
- DiscoveredIsland,
14
- } from "./types.ts";
15
- import {
16
- DEFAULT_DISCOVERY_CONFIG,
17
- isSupportedIslandExtension,
18
- } from "./types.ts";
19
- import type { Framework } from "../types.ts";
20
-
21
- /**
22
- * Discover all island directories within the source directory.
23
- * Uses recursive scanning to find all directories named "islands".
24
- *
25
- * @param projectRoot - The root directory of the project
26
- * @param config - Optional configuration for discovery
27
- * @returns Array of discovered island directories
28
- */
29
- export async function discoverIslandDirectories(
30
- projectRoot: string,
31
- config: IslandDiscoveryConfig = {}
32
- ): Promise<IslandDirectory[]> {
33
- const mergedConfig = { ...DEFAULT_DISCOVERY_CONFIG, ...config };
34
- const srcDir = resolve(projectRoot, mergedConfig.rootDir);
35
- const directories: IslandDirectory[] = [];
36
-
37
- // Check if src directory exists
38
- try {
39
- const statResult = await fsStat(srcDir);
40
- if (!statResult.isDirectory()) {
41
- return directories;
42
- }
43
- } catch {
44
- // src directory doesn't exist
45
- return directories;
46
- }
47
-
48
- // Recursively scan for islands directories
49
- await scanForIslandDirectories(
50
- srcDir,
51
- projectRoot,
52
- mergedConfig,
53
- directories
54
- );
55
-
56
- // Sort directories: default first, then alphabetically by path
57
- directories.sort((a, b) => {
58
- if (a.isDefault && !b.isDefault) return -1;
59
- if (!a.isDefault && b.isDefault) return 1;
60
- return a.relativePath.localeCompare(b.relativePath);
61
- });
62
-
63
- return directories;
64
- }
65
-
66
- /**
67
- * Recursively scan a directory for islands directories.
68
- */
69
- async function scanForIslandDirectories(
70
- currentDir: string,
71
- projectRoot: string,
72
- config: Required<IslandDiscoveryConfig>,
73
- results: IslandDirectory[]
74
- ): Promise<void> {
75
- try {
76
- const entries = await readdir(currentDir, { withFileTypes: true });
77
- for (const entry of entries) {
78
- if (!entry.isDirectory()) continue;
79
-
80
- const fullPath = resolve(currentDir, entry.name);
81
- const relativeFromRoot = relative(projectRoot, fullPath);
82
-
83
- // Check if this directory should be excluded
84
- if (shouldExclude(relativeFromRoot, config.exclude)) {
85
- continue;
86
- }
87
-
88
- // Check if this is an islands directory
89
- if (entry.name === "islands") {
90
- const islandDir = createIslandDirectory(
91
- fullPath,
92
- projectRoot,
93
- config
94
- );
95
- results.push(islandDir);
96
- // Don't recurse into islands directories
97
- continue;
98
- }
99
-
100
- // Recurse into subdirectories
101
- await scanForIslandDirectories(
102
- fullPath,
103
- projectRoot,
104
- config,
105
- results
106
- );
107
- }
108
- } catch (error) {
109
- // Log but don't fail on permission errors or other issues
110
- if (!(error instanceof Error) || (error as NodeJS.ErrnoException).code !== 'EACCES') {
111
- console.warn(`Warning: Could not scan directory ${currentDir}:`, error);
112
- }
113
- }
114
- }
115
-
116
- /**
117
- * Check if a path should be excluded from scanning.
118
- */
119
- function shouldExclude(relativePath: string, excludePatterns: string[]): boolean {
120
- const normalizedPath = relativePath.replace(/\\/g, "/");
121
-
122
- for (const pattern of excludePatterns) {
123
- // Simple pattern matching - check if path starts with or contains the pattern
124
- if (normalizedPath === pattern ||
125
- normalizedPath.startsWith(pattern + "/") ||
126
- normalizedPath.includes("/" + pattern + "/") ||
127
- normalizedPath.endsWith("/" + pattern)) {
128
- return true;
129
- }
130
- }
131
-
132
- return false;
133
- }
134
-
135
- /**
136
- * Create an IslandDirectory object from a discovered path.
137
- */
138
- function createIslandDirectory(
139
- absolutePath: string,
140
- projectRoot: string,
141
- config: Required<IslandDiscoveryConfig>
142
- ): IslandDirectory {
143
- const relativeFromSrc = relative(
144
- resolve(projectRoot, config.rootDir),
145
- absolutePath
146
- );
147
-
148
- // Determine if this is the default islands directory
149
- // Default is /src/islands/ (directly under src, not nested)
150
- const isDefault = relativeFromSrc === "islands";
151
-
152
- // Calculate namespace from the path
153
- // For /src/islands/ -> namespace is ""
154
- // For /src/modules/auth/islands/ -> namespace is "modules/auth"
155
- let namespace = "";
156
- if (!isDefault) {
157
- const parentDir = dirname(relativeFromSrc);
158
- namespace = parentDir.replace(/\\/g, "/");
159
-
160
- // Apply custom namespace mapping if configured
161
- if (config.namespaces[namespace]) {
162
- namespace = config.namespaces[namespace];
163
- }
164
- }
165
-
166
- return {
167
- path: absolutePath,
168
- relativePath: relativeFromSrc.replace(/\\/g, "/"),
169
- namespace,
170
- isDefault,
171
- };
172
- }
173
-
174
- /**
175
- * Check if a directory is an islands directory.
176
- */
177
- export function isIslandsDirectory(dirPath: string): boolean {
178
- return basename(dirPath) === "islands";
179
- }
180
-
181
- /**
182
- * Get the default islands directory path.
183
- */
184
- export function getDefaultIslandsPath(projectRoot: string, rootDir = "src"): string {
185
- return resolve(projectRoot, rootDir, "islands");
186
- }
187
-
188
- /**
189
- * Check if the default islands directory exists.
190
- */
191
- export async function hasDefaultIslandsDirectory(
192
- projectRoot: string,
193
- rootDir = "src"
194
- ): Promise<boolean> {
195
- const defaultPath = getDefaultIslandsPath(projectRoot, rootDir);
196
- try {
197
- const statResult = await fsStat(defaultPath);
198
- return statResult.isDirectory();
199
- } catch {
200
- return false;
201
- }
202
- }
203
-
204
-
205
- /**
206
- * Discover all island components within a specific islands directory.
207
- *
208
- * @param directory - The island directory to scan
209
- * @param projectRoot - The root directory of the project
210
- * @returns Array of discovered island components
211
- */
212
- export async function discoverIslandsInDirectory(
213
- directory: IslandDirectory,
214
- projectRoot: string
215
- ): Promise<DiscoveredIsland[]> {
216
- const islands: DiscoveredIsland[] = [];
217
-
218
- try {
219
- const entries = await readdir(directory.path, { withFileTypes: true });
220
- for (const entry of entries) {
221
- if (!entry.isFile()) continue;
222
-
223
- const ext = extname(entry.name);
224
- if (!isSupportedIslandExtension(ext)) continue;
225
-
226
- const island = createDiscoveredIsland(
227
- entry.name,
228
- directory,
229
- projectRoot
230
- );
231
- islands.push(island);
232
- }
233
- } catch (error) {
234
- console.warn(
235
- `Warning: Could not scan islands directory ${directory.path}:`,
236
- error
237
- );
238
- }
239
-
240
- // Sort islands alphabetically by name
241
- islands.sort((a, b) => a.name.localeCompare(b.name));
242
-
243
- return islands;
244
- }
245
-
246
- /**
247
- * Discover all islands across all directories.
248
- *
249
- * @param projectRoot - The root directory of the project
250
- * @param config - Optional configuration for discovery
251
- * @returns Array of all discovered island components
252
- */
253
- export async function discoverAllIslands(
254
- projectRoot: string,
255
- config: IslandDiscoveryConfig = {}
256
- ): Promise<DiscoveredIsland[]> {
257
- const directories = await discoverIslandDirectories(projectRoot, config);
258
- const allIslands: DiscoveredIsland[] = [];
259
-
260
- for (const directory of directories) {
261
- const islands = await discoverIslandsInDirectory(directory, projectRoot);
262
- allIslands.push(...islands);
263
- }
264
-
265
- return allIslands;
266
- }
267
-
268
- /**
269
- * Create a DiscoveredIsland object from a file entry.
270
- */
271
- function createDiscoveredIsland(
272
- fileName: string,
273
- directory: IslandDirectory,
274
- projectRoot: string
275
- ): DiscoveredIsland {
276
- const ext = extname(fileName);
277
- const name = extractComponentName(fileName);
278
- const filePath = resolve(directory.path, fileName);
279
- const relativePath = relative(projectRoot, filePath).replace(/\\/g, "/");
280
- const framework = detectFrameworkFromFileName(fileName);
281
-
282
- return {
283
- name,
284
- filePath,
285
- relativePath,
286
- namespace: directory.namespace,
287
- framework,
288
- extension: ext,
289
- directory,
290
- };
291
- }
292
-
293
- /**
294
- * Extract the component name from a file name.
295
- * Handles framework-specific naming conventions like .solid.tsx, .react.tsx
296
- */
297
- function extractComponentName(fileName: string): string {
298
- // Remove extension
299
- const name = fileName;
300
-
301
- // Handle double extensions like .solid.tsx, .react.tsx, .lit.ts
302
- const frameworkPatterns = [
303
- ".solid.tsx", ".solid.jsx",
304
- ".react.tsx", ".react.jsx",
305
- ".lit.ts", ".lit.js",
306
- ".preact.tsx", ".preact.jsx",
307
- ];
308
-
309
- for (const pattern of frameworkPatterns) {
310
- if (name.endsWith(pattern)) {
311
- return name.slice(0, -pattern.length);
312
- }
313
- }
314
-
315
- // Handle single extensions
316
- const singleExtensions = [".tsx", ".ts", ".jsx", ".js", ".vue", ".svelte"];
317
- for (const ext of singleExtensions) {
318
- if (name.endsWith(ext)) {
319
- return name.slice(0, -ext.length);
320
- }
321
- }
322
-
323
- return name;
324
- }
325
-
326
- /**
327
- * Detect the framework from a file name based on extension and naming conventions.
328
- */
329
- function detectFrameworkFromFileName(fileName: string): Framework {
330
- const normalizedName = fileName.toLowerCase();
331
-
332
- // Check for framework-specific naming conventions
333
- if (normalizedName.includes(".solid.")) return "solid";
334
- if (normalizedName.includes(".react.")) return "react";
335
- if (normalizedName.includes(".lit.")) return "lit";
336
- if (normalizedName.includes(".preact.")) return "preact";
337
- if (normalizedName.includes(".qwik.")) return "qwik";
338
-
339
- // Check file extensions
340
- if (fileName.endsWith(".vue")) return "vue";
341
- if (fileName.endsWith(".svelte")) return "svelte";
342
-
343
- // Lit files by naming convention (files starting with uppercase in .ts/.js)
344
- if ((fileName.endsWith(".ts") || fileName.endsWith(".js")) &&
345
- !fileName.endsWith(".d.ts")) {
346
- // Check if it looks like a component (PascalCase)
347
- const baseName = extractComponentName(fileName);
348
- if (/^[A-Z]/.test(baseName)) {
349
- return "lit";
350
- }
351
- }
352
-
353
- // Default to preact for .tsx/.jsx files
354
- if (fileName.endsWith(".tsx") || fileName.endsWith(".jsx")) {
355
- return "preact";
356
- }
357
-
358
- return "unknown";
359
- }
360
-
361
- /**
362
- * Get the qualified name for an island (namespace/name or just name for default).
363
- */
364
- export function getQualifiedIslandName(island: DiscoveredIsland): string {
365
- if (island.namespace === "") {
366
- return island.name;
367
- }
368
- return `${island.namespace}/${island.name}`;
369
- }
370
-
371
- /**
372
- * Parse a qualified island name into namespace and name parts.
373
- */
374
- export function parseQualifiedIslandName(qualifiedName: string): {
375
- namespace: string;
376
- name: string;
377
- } {
378
- const lastSlashIndex = qualifiedName.lastIndexOf("/");
379
- if (lastSlashIndex === -1) {
380
- return { namespace: "", name: qualifiedName };
381
- }
382
- return {
383
- namespace: qualifiedName.slice(0, lastSlashIndex),
384
- name: qualifiedName.slice(lastSlashIndex + 1),
385
- };
386
- }
@@ -1,117 +0,0 @@
1
- /**
2
- * Island Discovery Types
3
- *
4
- * Type definitions for the nested islands discovery system.
5
- * Supports discovering island components in modular architectures
6
- * like /src/modules/[module]/islands/ and arbitrary nesting patterns.
7
- */
8
-
9
- import type { Framework } from "../types.ts";
10
-
11
- /**
12
- * Represents a discovered islands directory
13
- */
14
- export interface IslandDirectory {
15
- /** Absolute path to the islands directory */
16
- path: string;
17
- /** Relative path from src/ (e.g., "modules/auth/islands") */
18
- relativePath: string;
19
- /** Namespace prefix for components (e.g., "modules/auth") */
20
- namespace: string;
21
- /** Whether this is the default /src/islands/ directory */
22
- isDefault: boolean;
23
- }
24
-
25
- /**
26
- * Represents a discovered island component
27
- */
28
- export interface DiscoveredIsland {
29
- /** Component name without extension */
30
- name: string;
31
- /** Full absolute path to the component file */
32
- filePath: string;
33
- /** Relative path from project root */
34
- relativePath: string;
35
- /** Namespace (empty string for default islands directory) */
36
- namespace: string;
37
- /** Detected framework */
38
- framework: Framework;
39
- /** File extension (e.g., ".tsx", ".vue", ".svelte") */
40
- extension: string;
41
- /** The directory this island belongs to */
42
- directory: IslandDirectory;
43
- }
44
-
45
- /**
46
- * Represents a naming collision between islands
47
- */
48
- export interface IslandCollision {
49
- /** Component name that has collisions */
50
- name: string;
51
- /** All islands with this name */
52
- islands: DiscoveredIsland[];
53
- /** Resolution strategy used */
54
- resolution: "namespace" | "priority";
55
- }
56
-
57
- /**
58
- * Event emitted when island files change
59
- */
60
- export interface IslandChangeEvent {
61
- /** Type of change */
62
- type: "add" | "change" | "remove";
63
- /** Affected island (null for remove events before discovery) */
64
- island: DiscoveredIsland | null;
65
- /** File path that changed */
66
- filePath: string;
67
- /** Timestamp of the change */
68
- timestamp: number;
69
- }
70
-
71
- /**
72
- * Supported file extensions for island components
73
- */
74
- export const ISLAND_FILE_EXTENSIONS = [
75
- ".tsx",
76
- ".ts",
77
- ".jsx",
78
- ".js",
79
- ".vue",
80
- ".svelte",
81
- ] as const;
82
-
83
- export type IslandFileExtension = (typeof ISLAND_FILE_EXTENSIONS)[number];
84
-
85
- /**
86
- * Check if a file extension is supported for islands
87
- */
88
- export function isSupportedIslandExtension(ext: string): ext is IslandFileExtension {
89
- return ISLAND_FILE_EXTENSIONS.includes(ext as IslandFileExtension);
90
- }
91
-
92
- /**
93
- * Configuration options for island discovery
94
- */
95
- export interface IslandDiscoveryConfig {
96
- /** Root directory to scan (defaults to "src") */
97
- rootDir?: string;
98
- /** Additional directories to scan (beyond default patterns) */
99
- include?: string[];
100
- /** Directories to exclude from scanning */
101
- exclude?: string[];
102
- /** Custom namespace mapping */
103
- namespaces?: Record<string, string>;
104
- /** Whether to fail on naming collisions */
105
- strictCollisions?: boolean;
106
- }
107
-
108
- /**
109
- * Default configuration for island discovery
110
- */
111
- export const DEFAULT_DISCOVERY_CONFIG: Required<IslandDiscoveryConfig> = {
112
- rootDir: "src",
113
- include: [],
114
- exclude: ["node_modules", ".git", "dist", "build"],
115
- namespaces: {},
116
- strictCollisions: false,
117
- };