@buzola/vite-plugin 0.0.1

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 (56) hide show
  1. package/dist/__tests__/codegen.test.d.ts +2 -0
  2. package/dist/__tests__/codegen.test.d.ts.map +1 -0
  3. package/dist/__tests__/codegen.test.js +121 -0
  4. package/dist/__tests__/codegen.test.js.map +1 -0
  5. package/dist/__tests__/conventions.test.d.ts +2 -0
  6. package/dist/__tests__/conventions.test.d.ts.map +1 -0
  7. package/dist/__tests__/conventions.test.js +80 -0
  8. package/dist/__tests__/conventions.test.js.map +1 -0
  9. package/dist/__tests__/page-extractor.test.d.ts +2 -0
  10. package/dist/__tests__/page-extractor.test.d.ts.map +1 -0
  11. package/dist/__tests__/page-extractor.test.js +82 -0
  12. package/dist/__tests__/page-extractor.test.js.map +1 -0
  13. package/dist/__tests__/tree-builder.test.d.ts +2 -0
  14. package/dist/__tests__/tree-builder.test.d.ts.map +1 -0
  15. package/dist/__tests__/tree-builder.test.js +335 -0
  16. package/dist/__tests__/tree-builder.test.js.map +1 -0
  17. package/dist/conventions.d.ts +53 -0
  18. package/dist/conventions.d.ts.map +1 -0
  19. package/dist/conventions.js +82 -0
  20. package/dist/conventions.js.map +1 -0
  21. package/dist/generator/codegen.d.ts +23 -0
  22. package/dist/generator/codegen.d.ts.map +1 -0
  23. package/dist/generator/codegen.js +164 -0
  24. package/dist/generator/codegen.js.map +1 -0
  25. package/dist/generator/page-extractor.d.ts +21 -0
  26. package/dist/generator/page-extractor.d.ts.map +1 -0
  27. package/dist/generator/page-extractor.js +23 -0
  28. package/dist/generator/page-extractor.js.map +1 -0
  29. package/dist/generator/scanner.d.ts +11 -0
  30. package/dist/generator/scanner.d.ts.map +1 -0
  31. package/dist/generator/scanner.js +34 -0
  32. package/dist/generator/scanner.js.map +1 -0
  33. package/dist/generator/tree-builder.d.ts +50 -0
  34. package/dist/generator/tree-builder.d.ts.map +1 -0
  35. package/dist/generator/tree-builder.js +273 -0
  36. package/dist/generator/tree-builder.js.map +1 -0
  37. package/dist/index.d.ts +13 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +7 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/plugin.d.ts +26 -0
  42. package/dist/plugin.d.ts.map +1 -0
  43. package/dist/plugin.js +101 -0
  44. package/dist/plugin.js.map +1 -0
  45. package/package.json +24 -0
  46. package/src/__tests__/codegen.test.ts +134 -0
  47. package/src/__tests__/conventions.test.ts +93 -0
  48. package/src/__tests__/page-extractor.test.ts +95 -0
  49. package/src/__tests__/tree-builder.test.ts +390 -0
  50. package/src/conventions.ts +116 -0
  51. package/src/generator/codegen.ts +214 -0
  52. package/src/generator/page-extractor.ts +48 -0
  53. package/src/generator/scanner.ts +45 -0
  54. package/src/generator/tree-builder.ts +354 -0
  55. package/src/index.ts +17 -0
  56. package/src/plugin.ts +132 -0
@@ -0,0 +1,164 @@
1
+ import * as path from 'node:path';
2
+ /**
3
+ * Generate the buzola.gen.ts file with:
4
+ * 1. Module augmentation for BuzolaPageMap (type safety)
5
+ * 2. Page registry (page ID → route pattern)
6
+ * 3. Route tree construction code
7
+ */
8
+ export function generateRouteModule(options) {
9
+ const { tree, outputPath } = options;
10
+ const outputDir = path.dirname(outputPath);
11
+ let importCounter = 0;
12
+ const lines = [];
13
+ lines.push('// This file is auto-generated by @buzola/vite-plugin. Do not edit.');
14
+ lines.push('/* eslint-disable */');
15
+ lines.push('');
16
+ // Framework imports first — needed by lazy component declarations below
17
+ lines.push(`import { lazy, type ComponentType } from 'react';`);
18
+ lines.push(`import { buildRouteTree } from '@buzola/router';`);
19
+ lines.push(`import type { RouteConfig } from '@buzola/router';`);
20
+ lines.push('');
21
+ // Collect route imports — importsByKey maps "filePath::exportName" → import info
22
+ const imports = [];
23
+ const importsByKey = new Map();
24
+ collectImports(tree, outputDir, imports, importsByKey, () => importCounter++);
25
+ // Generate route imports
26
+ for (const imp of imports) {
27
+ if (imp.isLazy) {
28
+ lines.push(`const ${imp.varName} = () => import('${imp.filePath}').then(m => ({ default: m.${imp.exportName}.component })) as Promise<{ default: ComponentType }>;`);
29
+ }
30
+ else {
31
+ if (imp.exportName !== 'default') {
32
+ lines.push(`import { ${imp.exportName} as ${imp.varName} } from '${imp.filePath}';`);
33
+ }
34
+ else {
35
+ lines.push(`import ${imp.varName} from '${imp.filePath}';`);
36
+ }
37
+ }
38
+ }
39
+ lines.push('');
40
+ // Collect page info for type augmentation and registry
41
+ const pages = collectPages(tree);
42
+ // Generate page map type augmentation
43
+ lines.push('// Module augmentation for type-safe page-centric routing');
44
+ lines.push(`declare module '@buzola/router' {`);
45
+ lines.push(' interface BuzolaPageMap {');
46
+ for (const page of pages) {
47
+ if (page.params.length === 0) {
48
+ lines.push(` '${page.pageId}': {};`);
49
+ }
50
+ else {
51
+ const paramEntries = page.params.map(p => {
52
+ const type = p.array ? 'string[]' : 'string';
53
+ return p.optional ? `${p.name}?: ${type}` : `${p.name}: ${type}`;
54
+ }).join('; ');
55
+ lines.push(` '${page.pageId}': { ${paramEntries} };`);
56
+ }
57
+ }
58
+ lines.push(' }');
59
+ if (options.persistentParams && options.persistentParams.length > 0) {
60
+ lines.push(' interface BuzolaPersistentParams {');
61
+ for (const param of options.persistentParams) {
62
+ lines.push(` ${param}: true;`);
63
+ }
64
+ lines.push(' }');
65
+ }
66
+ lines.push('}');
67
+ lines.push('');
68
+ // Generate page registry
69
+ lines.push('// Page registry — page ID → route pattern');
70
+ lines.push('export const pageRegistry: Record<string, string> = {');
71
+ for (const page of pages) {
72
+ lines.push(` '${page.pageId}': '${page.routePattern}',`);
73
+ }
74
+ lines.push('};');
75
+ lines.push('');
76
+ // Generate route tree config
77
+ lines.push('const routeConfigs: RouteConfig[] = [');
78
+ generateTreeConfig(tree, lines, importsByKey, 1);
79
+ lines.push('];');
80
+ lines.push('');
81
+ lines.push('export const routes = buildRouteTree(routeConfigs);');
82
+ lines.push('');
83
+ return lines.join('\n');
84
+ }
85
+ /**
86
+ * Collect page info from the file route tree for codegen.
87
+ */
88
+ function collectPages(nodes, parentPath = '') {
89
+ const result = [];
90
+ for (const node of nodes) {
91
+ if (node.filePath && !node.isLayout && !node.isNotFound) {
92
+ if (node.pageExports) {
93
+ for (const exp of node.pageExports) {
94
+ result.push({
95
+ pageId: exp.pageId,
96
+ routePattern: exp.routePattern,
97
+ params: exp.params,
98
+ });
99
+ }
100
+ }
101
+ }
102
+ if (node.children.length > 0) {
103
+ result.push(...collectPages(node.children, node.fullPath));
104
+ }
105
+ }
106
+ return result;
107
+ }
108
+ function importKey(filePath, exportName) {
109
+ return `${filePath}::${exportName ?? 'default'}`;
110
+ }
111
+ function collectImports(nodes, outputDir, imports, importsByKey, nextId) {
112
+ for (const node of nodes) {
113
+ if (node.filePath) {
114
+ const key = importKey(node.filePath, node.exportName);
115
+ if (!importsByKey.has(key)) {
116
+ const relativePath = path.relative(outputDir, node.filePath);
117
+ const importPath = relativePath.startsWith('.') ? relativePath : `./${relativePath}`;
118
+ // Strip extension for import
119
+ const cleanPath = importPath.replace(/\.(tsx?|jsx?)$/, '');
120
+ const varName = `Route${nextId()}`;
121
+ const isLazy = !node.isLayout; // Layouts are eagerly loaded, pages are lazy
122
+ const exportName = node.exportName ?? 'default';
123
+ imports.push({ varName, filePath: cleanPath, isLazy, exportName });
124
+ importsByKey.set(key, { varName, isLazy });
125
+ }
126
+ }
127
+ collectImports(node.children, outputDir, imports, importsByKey, nextId);
128
+ }
129
+ }
130
+ function generateTreeConfig(nodes, lines, importsByKey, indent) {
131
+ const pad = ' '.repeat(indent);
132
+ for (const node of nodes) {
133
+ const imp = node.filePath ? importsByKey.get(importKey(node.filePath, node.exportName)) : undefined;
134
+ lines.push(`${pad}{`);
135
+ lines.push(`${pad} path: '${node.segment ? `/${node.segment}` : '/'}',`);
136
+ if (imp) {
137
+ if (imp.isLazy) {
138
+ lines.push(`${pad} component: lazy(${imp.varName}),`);
139
+ }
140
+ else {
141
+ lines.push(`${pad} component: ${imp.varName},`);
142
+ }
143
+ }
144
+ if (node.isLayout)
145
+ lines.push(`${pad} isLayout: true,`);
146
+ if (node.isIndex)
147
+ lines.push(`${pad} isIndex: true,`);
148
+ if (node.isPathlessGroup)
149
+ lines.push(`${pad} isPathlessGroup: true,`);
150
+ if (node.children.length > 0) {
151
+ lines.push(`${pad} children: [`);
152
+ generateTreeConfig(node.children, lines, importsByKey, indent + 2);
153
+ lines.push(`${pad} ],`);
154
+ }
155
+ lines.push(`${pad}},`);
156
+ }
157
+ }
158
+ /**
159
+ * Generate the virtual module content for `virtual:buzola/routes`.
160
+ */
161
+ export function generateVirtualModule(outputPath) {
162
+ return `export { routes, pageRegistry } from '${outputPath.replace(/\.ts$/, '')}';\n`;
163
+ }
164
+ //# sourceMappingURL=codegen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codegen.js","sourceRoot":"","sources":["../../src/generator/codegen.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export interface ExtractedPage {
2
+ /** Export name (e.g., "detail", "list"). "default" for default exports. */
3
+ exportName: string;
4
+ /** Explicit route pattern from .route('...'), if present. */
5
+ route?: string;
6
+ /** Whether this is a default export. */
7
+ isDefault: boolean;
8
+ /** Extracted param info from .params(z.object({...})). */
9
+ params: ExtractedParam[];
10
+ }
11
+ export interface ExtractedParam {
12
+ name: string;
13
+ optional: boolean;
14
+ array: boolean;
15
+ }
16
+ export type ModuleLoader = (absolutePath: string) => Promise<Record<string, unknown>>;
17
+ /**
18
+ * Extract createPage() metadata by loading the module and inspecting exports.
19
+ */
20
+ export declare function extractPages(absolutePath: string, loadModule: ModuleLoader): Promise<ExtractedPage[]>;
21
+ //# sourceMappingURL=page-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-extractor.d.ts","sourceRoot":"","sources":["../../src/generator/page-extractor.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC7B,2EAA2E;IAC3E,UAAU,EAAE,MAAM,CAAA;IAClB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,wCAAwC;IACxC,SAAS,EAAE,OAAO,CAAA;IAClB,0DAA0D;IAC1D,MAAM,EAAE,cAAc,EAAE,CAAA;CACxB;AAED,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,OAAO,CAAA;IACjB,KAAK,EAAE,OAAO,CAAA;CACd;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;AAUrF;;GAEG;AACH,wBAAsB,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAiB3G"}
@@ -0,0 +1,23 @@
1
+ function isPageDefinition(value) {
2
+ return value != null && typeof value === 'object' && '__buzolaPage' in value && value.__buzolaPage === true;
3
+ }
4
+ /**
5
+ * Extract createPage() metadata by loading the module and inspecting exports.
6
+ */
7
+ export async function extractPages(absolutePath, loadModule) {
8
+ const mod = await loadModule(absolutePath);
9
+ const pages = [];
10
+ for (const [key, value] of Object.entries(mod)) {
11
+ if (!isPageDefinition(value))
12
+ continue;
13
+ const exportName = key === 'default' ? 'default' : key;
14
+ pages.push({
15
+ exportName,
16
+ isDefault: key === 'default',
17
+ route: value.route,
18
+ params: value.paramsMeta ?? [],
19
+ });
20
+ }
21
+ return pages;
22
+ }
23
+ //# sourceMappingURL=page-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-extractor.js","sourceRoot":"","sources":["../../src/generator/page-extractor.ts"],"names":[],"mappings":"AAmBA,SAAS,gBAAgB,CAAC,KAAc;IAKvC,OAAO,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,cAAc,IAAI,KAAK,IAAK,KAAa,CAAC,YAAY,KAAK,IAAI,CAAA;AACrH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,YAAoB,EAAE,UAAwB;IAChF,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,YAAY,CAAC,CAAA;IAC1C,MAAM,KAAK,GAAoB,EAAE,CAAA;IAEjC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;YAAE,SAAQ;QAEtC,MAAM,UAAU,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAA;QACtD,KAAK,CAAC,IAAI,CAAC;YACV,UAAU;YACV,SAAS,EAAE,GAAG,KAAK,SAAS;YAC5B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM,EAAE,KAAK,CAAC,UAAU,IAAI,EAAE;SAC9B,CAAC,CAAA;IACH,CAAC;IAED,OAAO,KAAK,CAAA;AACb,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface ScannedFile {
2
+ /** Absolute path to the file. */
3
+ absolutePath: string;
4
+ /** Path relative to the routes directory. */
5
+ relativePath: string;
6
+ }
7
+ /**
8
+ * Scan a directory recursively for route files.
9
+ */
10
+ export declare function scanRouteFiles(routesDir: string): ScannedFile[];
11
+ //# sourceMappingURL=scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/generator/scanner.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC3B,iCAAiC;IACjC,YAAY,EAAE,MAAM,CAAA;IACpB,6CAA6C;IAC7C,YAAY,EAAE,MAAM,CAAA;CACpB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,EAAE,CA8B/D"}
@@ -0,0 +1,34 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import { isRouteFile } from '../conventions';
4
+ /**
5
+ * Scan a directory recursively for route files.
6
+ */
7
+ export function scanRouteFiles(routesDir) {
8
+ const files = [];
9
+ function scan(dir) {
10
+ if (!fs.existsSync(dir))
11
+ return;
12
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
13
+ for (const entry of entries) {
14
+ const fullPath = path.join(dir, entry.name);
15
+ if (entry.isDirectory()) {
16
+ // Skip node_modules and hidden directories
17
+ if (entry.name.startsWith('.') || entry.name === 'node_modules')
18
+ continue;
19
+ scan(fullPath);
20
+ }
21
+ else if (entry.isFile() && isRouteFile(entry.name)) {
22
+ files.push({
23
+ absolutePath: fullPath,
24
+ relativePath: path.relative(routesDir, fullPath),
25
+ });
26
+ }
27
+ }
28
+ }
29
+ scan(routesDir);
30
+ // Sort for deterministic output
31
+ files.sort((a, b) => a.relativePath.localeCompare(b.relativePath));
32
+ return files;
33
+ }
34
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/generator/scanner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAS5C;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC/C,MAAM,KAAK,GAAkB,EAAE,CAAA;IAE/B,SAAS,IAAI,CAAC,GAAW;QACxB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAM;QAE/B,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;QAE5D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;YAE3C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACzB,2CAA2C;gBAC3C,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc;oBAAE,SAAQ;gBACzE,IAAI,CAAC,QAAQ,CAAC,CAAA;YACf,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtD,KAAK,CAAC,IAAI,CAAC;oBACV,YAAY,EAAE,QAAQ;oBACtB,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC;iBAChD,CAAC,CAAA;YACH,CAAC;QACF,CAAC;IACF,CAAC;IAED,IAAI,CAAC,SAAS,CAAC,CAAA;IAEf,gCAAgC;IAChC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAA;IAElE,OAAO,KAAK,CAAA;AACb,CAAC"}
@@ -0,0 +1,50 @@
1
+ import type { ModuleLoader } from './page-extractor';
2
+ import type { ScannedFile } from './scanner';
3
+ /**
4
+ * Page export info attached to a file route node.
5
+ */
6
+ export interface PageExportInfo {
7
+ /** Page ID (e.g., "project/detail"). */
8
+ pageId: string;
9
+ /** Export name (e.g., "default", "detail"). */
10
+ exportName: string;
11
+ /** Route pattern (e.g., "/project/:id"). */
12
+ routePattern: string;
13
+ /** Param info extracted from the page schema. */
14
+ params: {
15
+ name: string;
16
+ optional: boolean;
17
+ array: boolean;
18
+ }[];
19
+ }
20
+ /**
21
+ * A node in the file-based route tree (before compilation into RouteNode).
22
+ */
23
+ export interface FileRouteNode {
24
+ /** Route path segment (from file name, or derived from .route() pattern). */
25
+ segment: string;
26
+ /** Full path from root. */
27
+ fullPath: string;
28
+ /** Absolute file path to the component. */
29
+ filePath?: string;
30
+ /** Which export to use from the file ("default" or a named export). */
31
+ exportName?: string;
32
+ /** Whether this is a layout. */
33
+ isLayout: boolean;
34
+ /** Whether this is an index route. */
35
+ isIndex: boolean;
36
+ /** Whether this is a not-found catch-all. */
37
+ isNotFound: boolean;
38
+ /** Whether this is a pathless group. */
39
+ isPathlessGroup: boolean;
40
+ /** Page exports discovered in this file. */
41
+ pageExports?: PageExportInfo[];
42
+ /** Children nodes. */
43
+ children: FileRouteNode[];
44
+ }
45
+ /**
46
+ * Build a route tree from scanned files.
47
+ * Loads each module via moduleLoader to extract createPage() metadata.
48
+ */
49
+ export declare function buildFileRouteTree(files: ScannedFile[], moduleLoader: ModuleLoader): Promise<FileRouteNode[]>;
50
+ //# sourceMappingURL=tree-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-builder.d.ts","sourceRoot":"","sources":["../../src/generator/tree-builder.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAEnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAE5C;;GAEG;AACH,MAAM,WAAW,cAAc;IAC9B,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAA;IACd,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAA;IAClB,4CAA4C;IAC5C,YAAY,EAAE,MAAM,CAAA;IACpB,iDAAiD;IACjD,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,EAAE,CAAA;CAC7D;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAA;IACf,2BAA2B;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,gCAAgC;IAChC,QAAQ,EAAE,OAAO,CAAA;IACjB,sCAAsC;IACtC,OAAO,EAAE,OAAO,CAAA;IAChB,6CAA6C;IAC7C,UAAU,EAAE,OAAO,CAAA;IACnB,wCAAwC;IACxC,eAAe,EAAE,OAAO,CAAA;IACxB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,cAAc,EAAE,CAAA;IAC9B,sBAAsB;IACtB,QAAQ,EAAE,aAAa,EAAE,CAAA;CACzB;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAsBnH"}
@@ -0,0 +1,273 @@
1
+ import * as path from 'node:path';
2
+ import { parseDirName, parseFileName } from '../conventions';
3
+ import { extractPages } from './page-extractor';
4
+ /**
5
+ * Build a route tree from scanned files.
6
+ * Loads each module via moduleLoader to extract createPage() metadata.
7
+ */
8
+ export async function buildFileRouteTree(files, moduleLoader) {
9
+ const root = {
10
+ segment: '',
11
+ fullPath: '/',
12
+ isLayout: false,
13
+ isIndex: false,
14
+ isNotFound: false,
15
+ isPathlessGroup: false,
16
+ children: [],
17
+ };
18
+ for (const file of files) {
19
+ await insertFile(root, file, moduleLoader);
20
+ }
21
+ sortChildren(root);
22
+ if (root.isLayout && root.filePath) {
23
+ return [root];
24
+ }
25
+ return root.children;
26
+ }
27
+ async function insertFile(root, file, moduleLoader) {
28
+ const ext = path.extname(file.relativePath);
29
+ const withoutExt = file.relativePath.slice(0, -ext.length);
30
+ const parts = withoutExt.split(path.sep);
31
+ const fileName = parts.pop();
32
+ const dirs = parts;
33
+ let current = root;
34
+ let currentPath = '';
35
+ for (const dir of dirs) {
36
+ const dirInfo = parseDirName(dir);
37
+ const segmentPath = dirInfo.isPathlessGroup
38
+ ? currentPath
39
+ : joinPath(currentPath, dirInfo.segment);
40
+ let child = current.children.find(c => c.segment === dirInfo.segment && c.isPathlessGroup === dirInfo.isPathlessGroup && c.isLayout);
41
+ if (!child) {
42
+ child = current.children.find(c => c.segment === dirInfo.segment && c.isPathlessGroup === dirInfo.isPathlessGroup && !c.filePath);
43
+ }
44
+ if (!child) {
45
+ child = {
46
+ segment: dirInfo.segment,
47
+ fullPath: segmentPath || '/',
48
+ isLayout: false,
49
+ isIndex: false,
50
+ isNotFound: false,
51
+ isPathlessGroup: dirInfo.isPathlessGroup,
52
+ children: [],
53
+ };
54
+ current.children.push(child);
55
+ }
56
+ current = child;
57
+ currentPath = segmentPath;
58
+ }
59
+ const fileInfo = parseFileName(fileName);
60
+ if (fileInfo.isLayout) {
61
+ current.isLayout = true;
62
+ current.filePath = file.absolutePath;
63
+ }
64
+ else if (fileInfo.isNotFound) {
65
+ const catchAllSegment = ':__notFound+';
66
+ const fullPath = joinPath(currentPath, catchAllSegment);
67
+ const pageId = dirs.length === 0 ? '404' : `${dirs.join('/')}/404`;
68
+ const pageExports = [{
69
+ pageId,
70
+ exportName: 'default',
71
+ routePattern: fullPath,
72
+ params: [{ name: '__notFound', optional: false, array: false }],
73
+ }];
74
+ const notFoundNode = {
75
+ segment: catchAllSegment,
76
+ fullPath,
77
+ filePath: file.absolutePath,
78
+ isLayout: false,
79
+ isIndex: false,
80
+ isNotFound: true,
81
+ isPathlessGroup: false,
82
+ pageExports,
83
+ children: [],
84
+ };
85
+ current.children.push(notFoundNode);
86
+ }
87
+ else if (fileInfo.isIndex) {
88
+ const fullPath = currentPath || '/';
89
+ const allExports = await extractPageExportsFromFile(file, dirs, '', true, currentPath, moduleLoader);
90
+ const defaultExports = allExports?.filter(e => e.exportName === 'default');
91
+ const namedExports = allExports?.filter(e => e.exportName !== 'default') ?? [];
92
+ const hasDefault = defaultExports != null && defaultExports.length > 0;
93
+ const indexNode = {
94
+ segment: '',
95
+ fullPath,
96
+ filePath: hasDefault ? file.absolutePath : undefined,
97
+ exportName: hasDefault ? 'default' : undefined,
98
+ isLayout: false,
99
+ isIndex: true,
100
+ isNotFound: false,
101
+ isPathlessGroup: false,
102
+ pageExports: hasDefault ? defaultExports : undefined,
103
+ children: [],
104
+ };
105
+ current.children.push(indexNode);
106
+ // Named exports become siblings (children of current, not of the index node)
107
+ for (const exp of namedExports) {
108
+ const namedSegment = exp.routePattern ? (computeRelativeSegment(currentPath, exp.routePattern) ?? exp.exportName) : exp.exportName;
109
+ checkCollision(current.children, namedSegment, file.absolutePath, exp.exportName);
110
+ current.children.push({
111
+ segment: namedSegment,
112
+ fullPath: joinPath(currentPath, namedSegment),
113
+ filePath: file.absolutePath,
114
+ exportName: exp.exportName,
115
+ isLayout: false,
116
+ isIndex: false,
117
+ isNotFound: false,
118
+ isPathlessGroup: false,
119
+ pageExports: [exp],
120
+ children: [],
121
+ });
122
+ }
123
+ }
124
+ else {
125
+ const allExports = await extractPageExportsFromFile(file, dirs, fileName, false, currentPath, moduleLoader);
126
+ const defaultExports = allExports?.filter(e => e.exportName === 'default');
127
+ const namedExports = allExports?.filter(e => e.exportName !== 'default') ?? [];
128
+ const hasDefault = defaultExports != null && defaultExports.length > 0;
129
+ const routeSegment = hasDefault ? deriveSegmentFromPageExports(defaultExports, currentPath) : undefined;
130
+ const segment = routeSegment ?? fileInfo.segment;
131
+ const fullPath = joinPath(currentPath, segment);
132
+ if (hasDefault) {
133
+ checkCollision(current.children, segment, file.absolutePath, 'default');
134
+ }
135
+ // Reuse existing container node (created by a previous file's named exports) if available
136
+ let routeNode = !hasDefault ? current.children.find(c => c.segment === segment && !c.filePath && !c.isLayout && !c.isPathlessGroup) : undefined;
137
+ if (!routeNode) {
138
+ routeNode = {
139
+ segment,
140
+ fullPath,
141
+ filePath: hasDefault ? file.absolutePath : undefined,
142
+ exportName: hasDefault ? 'default' : undefined,
143
+ isLayout: false,
144
+ isIndex: false,
145
+ isNotFound: false,
146
+ isPathlessGroup: false,
147
+ pageExports: hasDefault ? defaultExports : undefined,
148
+ children: [],
149
+ };
150
+ current.children.push(routeNode);
151
+ }
152
+ // Named exports become children (equivalent to files in a subdirectory)
153
+ for (const exp of namedExports) {
154
+ const namedSegment = exp.routePattern ? (computeRelativeSegment(fullPath, exp.routePattern) ?? exp.exportName) : exp.exportName;
155
+ checkCollision(routeNode.children, namedSegment, file.absolutePath, exp.exportName);
156
+ routeNode.children.push({
157
+ segment: namedSegment,
158
+ fullPath: joinPath(fullPath, namedSegment),
159
+ filePath: file.absolutePath,
160
+ exportName: exp.exportName,
161
+ isLayout: false,
162
+ isIndex: false,
163
+ isNotFound: false,
164
+ isPathlessGroup: false,
165
+ pageExports: [exp],
166
+ children: [],
167
+ });
168
+ }
169
+ }
170
+ }
171
+ /**
172
+ * Derive page ID from file path and export name.
173
+ *
174
+ * Examples:
175
+ * - File: project.tsx, export: detail → "project/detail"
176
+ * - File: project.tsx, export: default → "project"
177
+ * - File: project/detail.tsx, export: default → "project/detail"
178
+ * - File: index.tsx, export: default → "index"
179
+ */
180
+ function derivePageId(dirs, fileName, isIndex, exportName) {
181
+ const segments = [...dirs];
182
+ if (isIndex) {
183
+ if (segments.length === 0) {
184
+ return exportName === 'default' ? 'index' : `index/${exportName}`;
185
+ }
186
+ const base = segments.join('/');
187
+ return exportName === 'default' ? base : `${base}/${exportName}`;
188
+ }
189
+ segments.push(fileName);
190
+ const base = segments.join('/');
191
+ return exportName === 'default' ? base : `${base}/${exportName}`;
192
+ }
193
+ /**
194
+ * Compute the relative route segment from a page's .route() pattern and parent path.
195
+ */
196
+ function computeRelativeSegment(parentPath, routePattern) {
197
+ const prefix = parentPath === '/' ? '/' : parentPath + '/';
198
+ if (routePattern.startsWith(prefix)) {
199
+ return routePattern.slice(prefix.length);
200
+ }
201
+ if (routePattern === parentPath) {
202
+ return undefined;
203
+ }
204
+ const lastSlash = routePattern.lastIndexOf('/');
205
+ return lastSlash >= 0 ? routePattern.slice(lastSlash + 1) : routePattern;
206
+ }
207
+ function deriveSegmentFromPageExports(pageExports, parentPath) {
208
+ if (!pageExports || pageExports.length === 0)
209
+ return undefined;
210
+ const firstRoute = pageExports[0].routePattern;
211
+ return computeRelativeSegment(parentPath, firstRoute);
212
+ }
213
+ async function extractPageExportsFromFile(file, dirs, fileName, isIndex, parentPath, moduleLoader) {
214
+ let pages;
215
+ try {
216
+ pages = await extractPages(file.absolutePath, moduleLoader);
217
+ }
218
+ catch {
219
+ return undefined;
220
+ }
221
+ if (pages.length === 0)
222
+ return undefined;
223
+ const result = [];
224
+ for (const page of pages) {
225
+ const pageId = derivePageId(dirs, fileName, isIndex, page.exportName);
226
+ // If no explicit .route(), derive from file path — all params become query params
227
+ const basePath = isIndex ? (parentPath || '/') : joinPath(parentPath, fileName);
228
+ const routePattern = page.route ?? (page.isDefault ? basePath : joinPath(basePath, page.exportName));
229
+ result.push({
230
+ pageId,
231
+ exportName: page.exportName,
232
+ routePattern,
233
+ params: page.params,
234
+ });
235
+ }
236
+ return result.length > 0 ? result : undefined;
237
+ }
238
+ function checkCollision(siblings, segment, filePath, exportName) {
239
+ const existing = siblings.find(c => c.segment === segment && !c.isLayout && !c.isPathlessGroup);
240
+ if (!existing || !existing.filePath)
241
+ return;
242
+ const existingDesc = existing.exportName && existing.exportName !== 'default'
243
+ ? `named export '${existing.exportName}' in '${existing.filePath}'`
244
+ : `'${existing.filePath}'`;
245
+ const newDesc = exportName !== 'default'
246
+ ? `named export '${exportName}' in '${filePath}'`
247
+ : `'${filePath}'`;
248
+ throw new Error(`Route collision: ${newDesc} conflicts with ${existingDesc} — both resolve to segment '${segment}'`);
249
+ }
250
+ function sortChildren(node) {
251
+ for (const child of node.children) {
252
+ sortChildren(child);
253
+ }
254
+ node.children.sort((a, b) => sortWeight(a) - sortWeight(b));
255
+ }
256
+ function sortWeight(node) {
257
+ if (node.isIndex)
258
+ return 0;
259
+ if (node.isNotFound)
260
+ return 4;
261
+ if (node.segment.includes(':') && node.segment.includes('+'))
262
+ return 3;
263
+ if (node.segment.includes(':'))
264
+ return 2;
265
+ return 1;
266
+ }
267
+ function joinPath(parent, child) {
268
+ if (!child)
269
+ return parent || '/';
270
+ const base = parent || '';
271
+ return `${base}/${child}`;
272
+ }
273
+ //# sourceMappingURL=tree-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-builder.js","sourceRoot":"","sources":["../../src/generator/tree-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAE5D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AA2C/C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,KAAoB,EAAE,YAA0B;IACxF,MAAM,IAAI,GAAkB;QAC3B,OAAO,EAAE,EAAE;QACX,QAAQ,EAAE,GAAG;QACb,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,KAAK;QACjB,eAAe,EAAE,KAAK;QACtB,QAAQ,EAAE,EAAE;KACZ,CAAA;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,CAAA;IAC3C,CAAC;IAED,YAAY,CAAC,IAAI,CAAC,CAAA;IAElB,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpC,OAAO,CAAC,IAAI,CAAC,CAAA;IACd,CAAC;IAED,OAAO,IAAI,CAAC,QAAQ,CAAA;AACrB,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAmB,EAAE,IAAiB,EAAE,YAA0B;IAC3F,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAC1D,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,EAAG,CAAA;IAC7B,MAAM,IAAI,GAAG,KAAK,CAAA;IAElB,IAAI,OAAO,GAAG,IAAI,CAAA;IAClB,IAAI,WAAW,GAAG,EAAE,CAAA;IAEpB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAA;QACjC,MAAM,WAAW,GAAG,OAAO,CAAC,eAAe;YAC1C,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;QAEzC,IAAI,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,eAAe,KAAK,OAAO,CAAC,eAAe,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAA;QAEpI,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,eAAe,KAAK,OAAO,CAAC,eAAe,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;QAClI,CAAC;QAED,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,KAAK,GAAG;gBACP,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,QAAQ,EAAE,WAAW,IAAI,GAAG;gBAC5B,QAAQ,EAAE,KAAK;gBACf,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,KAAK;gBACjB,eAAe,EAAE,OAAO,CAAC,eAAe;gBACxC,QAAQ,EAAE,EAAE;aACZ,CAAA;YACD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC7B,CAAC;QAED,OAAO,GAAG,KAAK,CAAA;QACf,WAAW,GAAG,WAAW,CAAA;IAC1B,CAAC;IAED,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAA;IAExC,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACvB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAA;QACvB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAA;IACrC,CAAC;SAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QAChC,MAAM,eAAe,GAAG,cAAc,CAAA;QACtC,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAC,CAAA;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAA;QAClE,MAAM,WAAW,GAAqB,CAAC;gBACtC,MAAM;gBACN,UAAU,EAAE,SAAS;gBACrB,YAAY,EAAE,QAAQ;gBACtB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;aAC/D,CAAC,CAAA;QACF,MAAM,YAAY,GAAkB;YACnC,OAAO,EAAE,eAAe;YACxB,QAAQ;YACR,QAAQ,EAAE,IAAI,CAAC,YAAY;YAC3B,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,IAAI;YAChB,eAAe,EAAE,KAAK;YACtB,WAAW;YACX,QAAQ,EAAE,EAAE;SACZ,CAAA;QACD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IACpC,CAAC;SAAM,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,WAAW,IAAI,GAAG,CAAA;QACnC,MAAM,UAAU,GAAG,MAAM,0BAA0B,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,CAAC,CAAA;QACpG,MAAM,cAAc,GAAG,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,SAAS,CAAC,CAAA;QAC1E,MAAM,YAAY,GAAG,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAA;QAE9E,MAAM,UAAU,GAAG,cAAc,IAAI,IAAI,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,CAAA;QACtE,MAAM,SAAS,GAAkB;YAChC,OAAO,EAAE,EAAE;YACX,QAAQ;YACR,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;YACpD,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;YAC9C,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,KAAK;YACjB,eAAe,EAAE,KAAK;YACtB,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS;YACpD,QAAQ,EAAE,EAAE;SACZ,CAAA;QACD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAEhC,6EAA6E;QAC7E,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAChC,MAAM,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,WAAW,EAAE,GAAG,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAA;YAClI,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,UAAU,CAAC,CAAA;YACjF,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACrB,OAAO,EAAE,YAAY;gBACrB,QAAQ,EAAE,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC;gBAC7C,QAAQ,EAAE,IAAI,CAAC,YAAY;gBAC3B,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,QAAQ,EAAE,KAAK;gBACf,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,KAAK;gBACjB,eAAe,EAAE,KAAK;gBACtB,WAAW,EAAE,CAAC,GAAG,CAAC;gBAClB,QAAQ,EAAE,EAAE;aACZ,CAAC,CAAA;QACH,CAAC;IACF,CAAC;SAAM,CAAC;QACP,MAAM,UAAU,GAAG,MAAM,0BAA0B,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,CAAC,CAAA;QAC3G,MAAM,cAAc,GAAG,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,SAAS,CAAC,CAAA;QAC1E,MAAM,YAAY,GAAG,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAA;QAE9E,MAAM,UAAU,GAAG,cAAc,IAAI,IAAI,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,CAAA;QACtE,MAAM,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC,4BAA4B,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QACvG,MAAM,OAAO,GAAG,YAAY,IAAI,QAAQ,CAAC,OAAO,CAAA;QAChD,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;QAE/C,IAAI,UAAU,EAAE,CAAC;YAChB,cAAc,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAA;QACxE,CAAC;QAED,0FAA0F;QAC1F,IAAI,SAAS,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAC/I,IAAI,CAAC,SAAS,EAAE,CAAC;YAChB,SAAS,GAAG;gBACX,OAAO;gBACP,QAAQ;gBACR,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;gBACpD,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;gBAC9C,QAAQ,EAAE,KAAK;gBACf,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,KAAK;gBACjB,eAAe,EAAE,KAAK;gBACtB,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS;gBACpD,QAAQ,EAAE,EAAE;aACZ,CAAA;YACD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACjC,CAAC;QAED,wEAAwE;QACxE,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAChC,MAAM,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,QAAQ,EAAE,GAAG,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAA;YAC/H,cAAc,CAAC,SAAS,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,UAAU,CAAC,CAAA;YACnF,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACvB,OAAO,EAAE,YAAY;gBACrB,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;gBAC1C,QAAQ,EAAE,IAAI,CAAC,YAAY;gBAC3B,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,QAAQ,EAAE,KAAK;gBACf,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,KAAK;gBACjB,eAAe,EAAE,KAAK;gBACtB,WAAW,EAAE,CAAC,GAAG,CAAC;gBAClB,QAAQ,EAAE,EAAE;aACZ,CAAC,CAAA;QACH,CAAC;IACF,CAAC;AACF,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,YAAY,CAAC,IAAc,EAAE,QAAgB,EAAE,OAAgB,EAAE,UAAkB;IAC3F,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,CAAA;IAE1B,IAAI,OAAO,EAAE,CAAC;QACb,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,UAAU,EAAE,CAAA;QAClE,CAAC;QACD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC/B,OAAO,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,UAAU,EAAE,CAAA;IACjE,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACvB,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAE/B,OAAO,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,UAAU,EAAE,CAAA;AACjE,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAAC,UAAkB,EAAE,YAAoB;IACvE,MAAM,MAAM,GAAG,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,GAAG,GAAG,CAAA;IAE1D,IAAI,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACrC,OAAO,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACzC,CAAC;IAED,IAAI,YAAY,KAAK,UAAU,EAAE,CAAC;QACjC,OAAO,SAAS,CAAA;IACjB,CAAC;IAED,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IAC/C,OAAO,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAA;AACzE,CAAC;AAED,SAAS,4BAA4B,CACpC,WAAyC,EACzC,UAAkB;IAElB,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IAC9D,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,YAAY,CAAA;IAC9C,OAAO,sBAAsB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;AACtD,CAAC;AAED,KAAK,UAAU,0BAA0B,CACxC,IAAiB,EACjB,IAAc,EACd,QAAgB,EAChB,OAAgB,EAChB,UAAkB,EAClB,YAA0B;IAE1B,IAAI,KAAsB,CAAA;IAC1B,IAAI,CAAC;QACJ,KAAK,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAA;IAC5D,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAA;IACjB,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IAExC,MAAM,MAAM,GAAqB,EAAE,CAAA;IAEnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAA;QACrE,kFAAkF;QAClF,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;QAC/E,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAA;QAEpG,MAAM,CAAC,IAAI,CAAC;YACX,MAAM;YACN,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,YAAY;YACZ,MAAM,EAAE,IAAI,CAAC,MAAM;SACnB,CAAC,CAAA;IACH,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAA;AAC9C,CAAC;AAED,SAAS,cAAc,CAAC,QAAyB,EAAE,OAAe,EAAE,QAAgB,EAAE,UAAkB;IACvG,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,CAAA;IAC/F,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ;QAAE,OAAM;IAE3C,MAAM,YAAY,GAAG,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS;QAC5E,CAAC,CAAC,iBAAiB,QAAQ,CAAC,UAAU,SAAS,QAAQ,CAAC,QAAQ,GAAG;QACnE,CAAC,CAAC,IAAI,QAAQ,CAAC,QAAQ,GAAG,CAAA;IAC3B,MAAM,OAAO,GAAG,UAAU,KAAK,SAAS;QACvC,CAAC,CAAC,iBAAiB,UAAU,SAAS,QAAQ,GAAG;QACjD,CAAC,CAAC,IAAI,QAAQ,GAAG,CAAA;IAElB,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,mBAAmB,YAAY,+BAA+B,OAAO,GAAG,CAAC,CAAA;AACrH,CAAC;AAED,SAAS,YAAY,CAAC,IAAmB;IACxC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnC,YAAY,CAAC,KAAK,CAAC,CAAA;IACpB,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;AAC5D,CAAC;AAED,SAAS,UAAU,CAAC,IAAmB;IACtC,IAAI,IAAI,CAAC,OAAO;QAAE,OAAO,CAAC,CAAA;IAC1B,IAAI,IAAI,CAAC,UAAU;QAAE,OAAO,CAAC,CAAA;IAC7B,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAA;IACtE,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAA;IACxC,OAAO,CAAC,CAAA;AACT,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc,EAAE,KAAa;IAC9C,IAAI,CAAC,KAAK;QAAE,OAAO,MAAM,IAAI,GAAG,CAAA;IAChC,MAAM,IAAI,GAAG,MAAM,IAAI,EAAE,CAAA;IACzB,OAAO,GAAG,IAAI,IAAI,KAAK,EAAE,CAAA;AAC1B,CAAC"}
@@ -0,0 +1,13 @@
1
+ export { buzolaPlugin } from './plugin';
2
+ export type { BuzolaPluginOptions } from './plugin';
3
+ export { scanRouteFiles } from './generator/scanner';
4
+ export type { ScannedFile } from './generator/scanner';
5
+ export { buildFileRouteTree } from './generator/tree-builder';
6
+ export type { FileRouteNode, PageExportInfo } from './generator/tree-builder';
7
+ export { generateRouteModule } from './generator/codegen';
8
+ export type { CodegenOptions } from './generator/codegen';
9
+ export { extractPages } from './generator/page-extractor';
10
+ export type { ExtractedPage, ExtractedParam, ModuleLoader } from './generator/page-extractor';
11
+ export { isRouteFile, parseDirName, parseFileName, parseRouteFile } from './conventions';
12
+ export type { ParsedRouteFile } from './conventions';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,YAAY,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAEnD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAC7D,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAE7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AACzD,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AACzD,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAE7F,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AACxF,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA"}