@useavalon/avalon 0.1.11 → 0.1.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +54 -54
- package/mod.ts +302 -302
- package/package.json +49 -26
- package/src/build/integration-bundler-plugin.ts +116 -116
- package/src/build/integration-config.ts +168 -168
- package/src/build/integration-detection-plugin.ts +117 -117
- package/src/build/integration-resolver-plugin.ts +90 -90
- package/src/build/island-manifest.ts +269 -269
- package/src/build/island-types-generator.ts +476 -476
- package/src/build/mdx-island-transform.ts +464 -464
- package/src/build/mdx-plugin.ts +98 -98
- package/src/build/page-island-transform.ts +598 -598
- package/src/build/prop-extractors/index.ts +21 -21
- package/src/build/prop-extractors/lit.ts +140 -140
- package/src/build/prop-extractors/qwik.ts +16 -16
- package/src/build/prop-extractors/solid.ts +125 -125
- package/src/build/prop-extractors/svelte.ts +194 -194
- package/src/build/prop-extractors/vue.ts +111 -111
- package/src/build/sidecar-file-manager.ts +104 -104
- package/src/build/sidecar-renderer.ts +30 -30
- package/src/client/adapters/index.ts +21 -13
- package/src/client/components.ts +35 -35
- package/src/client/css-hmr-handler.ts +344 -344
- package/src/client/framework-adapter.ts +462 -462
- package/src/client/hmr-coordinator.ts +396 -396
- package/src/client/hmr-error-overlay.js +533 -533
- package/src/client/main.js +824 -816
- package/src/client/types/framework-runtime.d.ts +68 -68
- package/src/client/types/vite-hmr.d.ts +46 -46
- package/src/client/types/vite-virtual-modules.d.ts +70 -60
- package/src/components/Image.tsx +123 -123
- package/src/components/IslandErrorBoundary.tsx +145 -145
- package/src/components/LayoutDataErrorBoundary.tsx +141 -141
- package/src/components/LayoutErrorBoundary.tsx +127 -127
- package/src/components/PersistentIsland.tsx +52 -52
- package/src/components/StreamingErrorBoundary.tsx +233 -233
- package/src/components/StreamingLayout.tsx +538 -538
- package/src/core/components/component-analyzer.ts +192 -192
- package/src/core/components/component-detection.ts +508 -508
- package/src/core/components/enhanced-framework-detector.ts +500 -500
- package/src/core/components/framework-registry.ts +563 -563
- package/src/core/content/mdx-processor.ts +46 -46
- package/src/core/integrations/index.ts +19 -19
- package/src/core/integrations/loader.ts +125 -125
- package/src/core/integrations/registry.ts +175 -175
- package/src/core/islands/island-persistence.ts +325 -325
- package/src/core/islands/island-state-serializer.ts +258 -258
- package/src/core/islands/persistent-island-context.tsx +80 -80
- package/src/core/islands/use-persistent-state.ts +68 -68
- package/src/core/layout/enhanced-layout-resolver.ts +322 -322
- package/src/core/layout/layout-cache-manager.ts +485 -485
- package/src/core/layout/layout-composer.ts +357 -357
- package/src/core/layout/layout-data-loader.ts +516 -516
- package/src/core/layout/layout-discovery.ts +243 -243
- package/src/core/layout/layout-matcher.ts +299 -299
- package/src/core/layout/layout-types.ts +110 -110
- package/src/core/modules/framework-module-resolver.ts +273 -273
- package/src/islands/component-analysis.ts +213 -213
- package/src/islands/css-utils.ts +565 -565
- package/src/islands/discovery/index.ts +80 -80
- package/src/islands/discovery/registry.ts +340 -340
- package/src/islands/discovery/resolver.ts +477 -477
- package/src/islands/discovery/scanner.ts +386 -386
- package/src/islands/discovery/types.ts +117 -117
- package/src/islands/discovery/validator.ts +544 -544
- package/src/islands/discovery/watcher.ts +368 -368
- package/src/islands/framework-detection.ts +428 -428
- package/src/islands/integration-loader.ts +490 -490
- package/src/islands/island.tsx +565 -565
- package/src/islands/render-cache.ts +550 -550
- package/src/islands/types.ts +80 -80
- package/src/islands/universal-css-collector.ts +157 -157
- package/src/islands/universal-head-collector.ts +137 -137
- package/src/layout-system.d.ts +592 -592
- package/src/layout-system.ts +218 -218
- package/src/middleware/discovery.ts +268 -268
- package/src/middleware/executor.ts +315 -315
- package/src/middleware/index.ts +76 -76
- package/src/middleware/types.ts +99 -99
- package/src/nitro/build-config.ts +575 -575
- package/src/nitro/config.ts +483 -483
- package/src/nitro/error-handler.ts +636 -636
- package/src/nitro/index.ts +173 -173
- package/src/nitro/island-manifest.ts +584 -584
- package/src/nitro/middleware-adapter.ts +260 -260
- package/src/nitro/renderer.ts +1471 -1471
- package/src/nitro/route-discovery.ts +439 -439
- package/src/nitro/types.ts +321 -321
- package/src/render/collect-css.ts +198 -198
- package/src/render/error-pages.ts +79 -79
- package/src/render/isolated-ssr-renderer.ts +654 -654
- package/src/render/ssr.ts +1030 -1030
- package/src/schemas/api.ts +30 -30
- package/src/schemas/core.ts +64 -64
- package/src/schemas/index.ts +212 -212
- package/src/schemas/layout.ts +279 -279
- package/src/schemas/routing/index.ts +38 -38
- package/src/schemas/routing.ts +376 -376
- package/src/types/as-island.ts +20 -20
- package/src/types/image.d.ts +106 -106
- package/src/types/index.d.ts +22 -22
- package/src/types/island-jsx.d.ts +33 -33
- package/src/types/island-prop.d.ts +20 -20
- package/src/types/layout.ts +285 -285
- package/src/types/mdx.d.ts +6 -6
- package/src/types/routing.ts +555 -555
- package/src/types/types.ts +5 -5
- package/src/types/urlpattern.d.ts +49 -49
- package/src/types/vite-env.d.ts +11 -11
- package/src/utils/dev-logger.ts +299 -299
- package/src/utils/fs.ts +151 -151
- package/src/vite-plugin/auto-discover.ts +551 -551
- package/src/vite-plugin/config.ts +266 -266
- package/src/vite-plugin/errors.ts +127 -127
- package/src/vite-plugin/image-optimization.ts +156 -156
- package/src/vite-plugin/integration-activator.ts +126 -126
- package/src/vite-plugin/island-sidecar-plugin.ts +176 -176
- package/src/vite-plugin/module-discovery.ts +189 -189
- package/src/vite-plugin/nitro-integration.ts +1354 -1354
- package/src/vite-plugin/plugin.ts +403 -409
- package/src/vite-plugin/types.ts +327 -327
- package/src/vite-plugin/validation.ts +228 -228
- package/src/client/adapters/index.js +0 -12
- package/src/client/adapters/lit-adapter.js +0 -467
- package/src/client/adapters/lit-adapter.ts +0 -654
- package/src/client/adapters/preact-adapter.js +0 -223
- package/src/client/adapters/preact-adapter.ts +0 -331
- package/src/client/adapters/qwik-adapter.js +0 -259
- package/src/client/adapters/qwik-adapter.ts +0 -345
- package/src/client/adapters/react-adapter.js +0 -220
- package/src/client/adapters/react-adapter.ts +0 -353
- package/src/client/adapters/solid-adapter.js +0 -295
- package/src/client/adapters/solid-adapter.ts +0 -451
- package/src/client/adapters/svelte-adapter.js +0 -368
- package/src/client/adapters/svelte-adapter.ts +0 -524
- package/src/client/adapters/vue-adapter.js +0 -278
- package/src/client/adapters/vue-adapter.ts +0 -467
- package/src/client/components.js +0 -23
- package/src/client/css-hmr-handler.js +0 -263
- package/src/client/framework-adapter.js +0 -283
- package/src/client/hmr-coordinator.js +0 -274
|
@@ -1,189 +1,189 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Module Discovery for Modular Architecture
|
|
3
|
-
*
|
|
4
|
-
* Discovers pages and layouts within feature modules for file-based routing.
|
|
5
|
-
* Supports co-located architecture where each module contains its own pages/layouts.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { readdir, stat } from "node:fs/promises";
|
|
9
|
-
import { resolve, join } from "node:path";
|
|
10
|
-
import type { ResolvedModulesConfig } from "./types.ts";
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Discovered module with its pages and layouts directories
|
|
14
|
-
*/
|
|
15
|
-
export interface DiscoveredModule {
|
|
16
|
-
/** Module name (folder name) */
|
|
17
|
-
name: string;
|
|
18
|
-
/** Absolute path to the module directory */
|
|
19
|
-
path: string;
|
|
20
|
-
/** Absolute path to pages directory (if exists) */
|
|
21
|
-
pagesDir: string | null;
|
|
22
|
-
/** Absolute path to layouts directory (if exists) */
|
|
23
|
-
layoutsDir: string | null;
|
|
24
|
-
/** Route prefix derived from module name */
|
|
25
|
-
routePrefix: string;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Result of module discovery
|
|
30
|
-
*/
|
|
31
|
-
export interface ModuleDiscoveryResult {
|
|
32
|
-
/** All discovered modules */
|
|
33
|
-
modules: DiscoveredModule[];
|
|
34
|
-
/** All page directories (for route discovery) */
|
|
35
|
-
pageDirs: Array<{ dir: string; prefix: string }>;
|
|
36
|
-
/** All layout directories */
|
|
37
|
-
layoutDirs: Array<{ dir: string; prefix: string }>;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Discover all modules within the modules directory
|
|
42
|
-
*
|
|
43
|
-
* @param modulesConfig - Resolved modules configuration
|
|
44
|
-
* @param projectRoot - Project root directory
|
|
45
|
-
* @returns Discovery result with modules, page dirs, and layout dirs
|
|
46
|
-
*/
|
|
47
|
-
export async function discoverModules(
|
|
48
|
-
modulesConfig: ResolvedModulesConfig,
|
|
49
|
-
projectRoot: string
|
|
50
|
-
): Promise<ModuleDiscoveryResult> {
|
|
51
|
-
const modulesDir = resolve(projectRoot, modulesConfig.dir);
|
|
52
|
-
const modules: DiscoveredModule[] = [];
|
|
53
|
-
const pageDirs: Array<{ dir: string; prefix: string }> = [];
|
|
54
|
-
const layoutDirs: Array<{ dir: string; prefix: string }> = [];
|
|
55
|
-
|
|
56
|
-
try {
|
|
57
|
-
const entries = await readdir(modulesDir, { withFileTypes: true });
|
|
58
|
-
|
|
59
|
-
for (const entry of entries) {
|
|
60
|
-
if (!entry.isDirectory()) continue;
|
|
61
|
-
|
|
62
|
-
// Skip hidden directories and common non-module folders
|
|
63
|
-
if (entry.name.startsWith('.') || entry.name === 'node_modules') continue;
|
|
64
|
-
|
|
65
|
-
const modulePath = join(modulesDir, entry.name);
|
|
66
|
-
const pagesPath = join(modulePath, modulesConfig.pagesDirName);
|
|
67
|
-
const layoutsPath = join(modulePath, modulesConfig.layoutsDirName);
|
|
68
|
-
|
|
69
|
-
// Check if pages/layouts directories exist
|
|
70
|
-
const [pagesExists, layoutsExists] = await Promise.all([
|
|
71
|
-
directoryExists(pagesPath),
|
|
72
|
-
directoryExists(layoutsPath),
|
|
73
|
-
]);
|
|
74
|
-
|
|
75
|
-
// Determine route prefix
|
|
76
|
-
// 'home' or 'root' module maps to '/', others map to '/moduleName'
|
|
77
|
-
const routePrefix = getRoutePrefix(entry.name);
|
|
78
|
-
|
|
79
|
-
const module: DiscoveredModule = {
|
|
80
|
-
name: entry.name,
|
|
81
|
-
path: modulePath,
|
|
82
|
-
pagesDir: pagesExists ? pagesPath : null,
|
|
83
|
-
layoutsDir: layoutsExists ? layoutsPath : null,
|
|
84
|
-
routePrefix,
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
modules.push(module);
|
|
88
|
-
|
|
89
|
-
if (pagesExists) {
|
|
90
|
-
pageDirs.push({ dir: pagesPath, prefix: routePrefix });
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
if (layoutsExists) {
|
|
94
|
-
layoutDirs.push({ dir: layoutsPath, prefix: routePrefix });
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
} catch (error) {
|
|
98
|
-
// Modules directory doesn't exist or can't be read
|
|
99
|
-
// This is fine - modules are optional
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// Sort modules so 'home'/'root' comes first (for route priority)
|
|
103
|
-
modules.sort((a, b) => {
|
|
104
|
-
if (a.routePrefix === '/') return -1;
|
|
105
|
-
if (b.routePrefix === '/') return 1;
|
|
106
|
-
return a.name.localeCompare(b.name);
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
return { modules, pageDirs, layoutDirs };
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Get the route prefix for a module
|
|
114
|
-
* Special modules like 'home', 'root', 'main' map to '/'
|
|
115
|
-
*/
|
|
116
|
-
function getRoutePrefix(moduleName: string): string {
|
|
117
|
-
const rootModules = ['home', 'root', 'main', 'index'];
|
|
118
|
-
if (rootModules.includes(moduleName.toLowerCase())) {
|
|
119
|
-
return '/';
|
|
120
|
-
}
|
|
121
|
-
return '/' + moduleName;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* Check if a directory exists
|
|
126
|
-
*/
|
|
127
|
-
async function directoryExists(path: string): Promise<boolean> {
|
|
128
|
-
try {
|
|
129
|
-
const stats = await stat(path);
|
|
130
|
-
return stats.isDirectory();
|
|
131
|
-
} catch {
|
|
132
|
-
return false;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
* Get all page directories including both traditional and modular
|
|
138
|
-
*
|
|
139
|
-
* @param pagesDir - Traditional pages directory
|
|
140
|
-
* @param modulesConfig - Modules configuration (if any)
|
|
141
|
-
* @param projectRoot - Project root
|
|
142
|
-
* @returns Array of page directories with their route prefixes
|
|
143
|
-
*/
|
|
144
|
-
export async function getAllPageDirs(
|
|
145
|
-
pagesDir: string,
|
|
146
|
-
modulesConfig: ResolvedModulesConfig | null,
|
|
147
|
-
projectRoot: string
|
|
148
|
-
): Promise<Array<{ dir: string; prefix: string }>> {
|
|
149
|
-
const dirs: Array<{ dir: string; prefix: string }> = [];
|
|
150
|
-
|
|
151
|
-
// Add traditional pages directory
|
|
152
|
-
const traditionalPagesPath = resolve(projectRoot, pagesDir);
|
|
153
|
-
if (await directoryExists(traditionalPagesPath)) {
|
|
154
|
-
dirs.push({ dir: traditionalPagesPath, prefix: '/' });
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
// Add modular page directories
|
|
158
|
-
if (modulesConfig) {
|
|
159
|
-
const { pageDirs } = await discoverModules(modulesConfig, projectRoot);
|
|
160
|
-
dirs.push(...pageDirs);
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
return dirs;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
/**
|
|
167
|
-
* Get all layout directories including both traditional and modular
|
|
168
|
-
*/
|
|
169
|
-
export async function getAllLayoutDirs(
|
|
170
|
-
layoutsDir: string,
|
|
171
|
-
modulesConfig: ResolvedModulesConfig | null,
|
|
172
|
-
projectRoot: string
|
|
173
|
-
): Promise<Array<{ dir: string; prefix: string }>> {
|
|
174
|
-
const dirs: Array<{ dir: string; prefix: string }> = [];
|
|
175
|
-
|
|
176
|
-
// Add traditional layouts directory
|
|
177
|
-
const traditionalLayoutsPath = resolve(projectRoot, layoutsDir);
|
|
178
|
-
if (await directoryExists(traditionalLayoutsPath)) {
|
|
179
|
-
dirs.push({ dir: traditionalLayoutsPath, prefix: '/' });
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
// Add modular layout directories
|
|
183
|
-
if (modulesConfig) {
|
|
184
|
-
const { layoutDirs } = await discoverModules(modulesConfig, projectRoot);
|
|
185
|
-
dirs.push(...layoutDirs);
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
return dirs;
|
|
189
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Module Discovery for Modular Architecture
|
|
3
|
+
*
|
|
4
|
+
* Discovers pages and layouts within feature modules for file-based routing.
|
|
5
|
+
* Supports co-located architecture where each module contains its own pages/layouts.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { readdir, stat } from "node:fs/promises";
|
|
9
|
+
import { resolve, join } from "node:path";
|
|
10
|
+
import type { ResolvedModulesConfig } from "./types.ts";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Discovered module with its pages and layouts directories
|
|
14
|
+
*/
|
|
15
|
+
export interface DiscoveredModule {
|
|
16
|
+
/** Module name (folder name) */
|
|
17
|
+
name: string;
|
|
18
|
+
/** Absolute path to the module directory */
|
|
19
|
+
path: string;
|
|
20
|
+
/** Absolute path to pages directory (if exists) */
|
|
21
|
+
pagesDir: string | null;
|
|
22
|
+
/** Absolute path to layouts directory (if exists) */
|
|
23
|
+
layoutsDir: string | null;
|
|
24
|
+
/** Route prefix derived from module name */
|
|
25
|
+
routePrefix: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Result of module discovery
|
|
30
|
+
*/
|
|
31
|
+
export interface ModuleDiscoveryResult {
|
|
32
|
+
/** All discovered modules */
|
|
33
|
+
modules: DiscoveredModule[];
|
|
34
|
+
/** All page directories (for route discovery) */
|
|
35
|
+
pageDirs: Array<{ dir: string; prefix: string }>;
|
|
36
|
+
/** All layout directories */
|
|
37
|
+
layoutDirs: Array<{ dir: string; prefix: string }>;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Discover all modules within the modules directory
|
|
42
|
+
*
|
|
43
|
+
* @param modulesConfig - Resolved modules configuration
|
|
44
|
+
* @param projectRoot - Project root directory
|
|
45
|
+
* @returns Discovery result with modules, page dirs, and layout dirs
|
|
46
|
+
*/
|
|
47
|
+
export async function discoverModules(
|
|
48
|
+
modulesConfig: ResolvedModulesConfig,
|
|
49
|
+
projectRoot: string
|
|
50
|
+
): Promise<ModuleDiscoveryResult> {
|
|
51
|
+
const modulesDir = resolve(projectRoot, modulesConfig.dir);
|
|
52
|
+
const modules: DiscoveredModule[] = [];
|
|
53
|
+
const pageDirs: Array<{ dir: string; prefix: string }> = [];
|
|
54
|
+
const layoutDirs: Array<{ dir: string; prefix: string }> = [];
|
|
55
|
+
|
|
56
|
+
try {
|
|
57
|
+
const entries = await readdir(modulesDir, { withFileTypes: true });
|
|
58
|
+
|
|
59
|
+
for (const entry of entries) {
|
|
60
|
+
if (!entry.isDirectory()) continue;
|
|
61
|
+
|
|
62
|
+
// Skip hidden directories and common non-module folders
|
|
63
|
+
if (entry.name.startsWith('.') || entry.name === 'node_modules') continue;
|
|
64
|
+
|
|
65
|
+
const modulePath = join(modulesDir, entry.name);
|
|
66
|
+
const pagesPath = join(modulePath, modulesConfig.pagesDirName);
|
|
67
|
+
const layoutsPath = join(modulePath, modulesConfig.layoutsDirName);
|
|
68
|
+
|
|
69
|
+
// Check if pages/layouts directories exist
|
|
70
|
+
const [pagesExists, layoutsExists] = await Promise.all([
|
|
71
|
+
directoryExists(pagesPath),
|
|
72
|
+
directoryExists(layoutsPath),
|
|
73
|
+
]);
|
|
74
|
+
|
|
75
|
+
// Determine route prefix
|
|
76
|
+
// 'home' or 'root' module maps to '/', others map to '/moduleName'
|
|
77
|
+
const routePrefix = getRoutePrefix(entry.name);
|
|
78
|
+
|
|
79
|
+
const module: DiscoveredModule = {
|
|
80
|
+
name: entry.name,
|
|
81
|
+
path: modulePath,
|
|
82
|
+
pagesDir: pagesExists ? pagesPath : null,
|
|
83
|
+
layoutsDir: layoutsExists ? layoutsPath : null,
|
|
84
|
+
routePrefix,
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
modules.push(module);
|
|
88
|
+
|
|
89
|
+
if (pagesExists) {
|
|
90
|
+
pageDirs.push({ dir: pagesPath, prefix: routePrefix });
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (layoutsExists) {
|
|
94
|
+
layoutDirs.push({ dir: layoutsPath, prefix: routePrefix });
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
} catch (error) {
|
|
98
|
+
// Modules directory doesn't exist or can't be read
|
|
99
|
+
// This is fine - modules are optional
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Sort modules so 'home'/'root' comes first (for route priority)
|
|
103
|
+
modules.sort((a, b) => {
|
|
104
|
+
if (a.routePrefix === '/') return -1;
|
|
105
|
+
if (b.routePrefix === '/') return 1;
|
|
106
|
+
return a.name.localeCompare(b.name);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
return { modules, pageDirs, layoutDirs };
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Get the route prefix for a module
|
|
114
|
+
* Special modules like 'home', 'root', 'main' map to '/'
|
|
115
|
+
*/
|
|
116
|
+
function getRoutePrefix(moduleName: string): string {
|
|
117
|
+
const rootModules = ['home', 'root', 'main', 'index'];
|
|
118
|
+
if (rootModules.includes(moduleName.toLowerCase())) {
|
|
119
|
+
return '/';
|
|
120
|
+
}
|
|
121
|
+
return '/' + moduleName;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Check if a directory exists
|
|
126
|
+
*/
|
|
127
|
+
async function directoryExists(path: string): Promise<boolean> {
|
|
128
|
+
try {
|
|
129
|
+
const stats = await stat(path);
|
|
130
|
+
return stats.isDirectory();
|
|
131
|
+
} catch {
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Get all page directories including both traditional and modular
|
|
138
|
+
*
|
|
139
|
+
* @param pagesDir - Traditional pages directory
|
|
140
|
+
* @param modulesConfig - Modules configuration (if any)
|
|
141
|
+
* @param projectRoot - Project root
|
|
142
|
+
* @returns Array of page directories with their route prefixes
|
|
143
|
+
*/
|
|
144
|
+
export async function getAllPageDirs(
|
|
145
|
+
pagesDir: string,
|
|
146
|
+
modulesConfig: ResolvedModulesConfig | null,
|
|
147
|
+
projectRoot: string
|
|
148
|
+
): Promise<Array<{ dir: string; prefix: string }>> {
|
|
149
|
+
const dirs: Array<{ dir: string; prefix: string }> = [];
|
|
150
|
+
|
|
151
|
+
// Add traditional pages directory
|
|
152
|
+
const traditionalPagesPath = resolve(projectRoot, pagesDir);
|
|
153
|
+
if (await directoryExists(traditionalPagesPath)) {
|
|
154
|
+
dirs.push({ dir: traditionalPagesPath, prefix: '/' });
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Add modular page directories
|
|
158
|
+
if (modulesConfig) {
|
|
159
|
+
const { pageDirs } = await discoverModules(modulesConfig, projectRoot);
|
|
160
|
+
dirs.push(...pageDirs);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return dirs;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Get all layout directories including both traditional and modular
|
|
168
|
+
*/
|
|
169
|
+
export async function getAllLayoutDirs(
|
|
170
|
+
layoutsDir: string,
|
|
171
|
+
modulesConfig: ResolvedModulesConfig | null,
|
|
172
|
+
projectRoot: string
|
|
173
|
+
): Promise<Array<{ dir: string; prefix: string }>> {
|
|
174
|
+
const dirs: Array<{ dir: string; prefix: string }> = [];
|
|
175
|
+
|
|
176
|
+
// Add traditional layouts directory
|
|
177
|
+
const traditionalLayoutsPath = resolve(projectRoot, layoutsDir);
|
|
178
|
+
if (await directoryExists(traditionalLayoutsPath)) {
|
|
179
|
+
dirs.push({ dir: traditionalLayoutsPath, prefix: '/' });
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Add modular layout directories
|
|
183
|
+
if (modulesConfig) {
|
|
184
|
+
const { layoutDirs } = await discoverModules(modulesConfig, projectRoot);
|
|
185
|
+
dirs.push(...layoutDirs);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
return dirs;
|
|
189
|
+
}
|