@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.
- package/dist/__tests__/codegen.test.d.ts +2 -0
- package/dist/__tests__/codegen.test.d.ts.map +1 -0
- package/dist/__tests__/codegen.test.js +121 -0
- package/dist/__tests__/codegen.test.js.map +1 -0
- package/dist/__tests__/conventions.test.d.ts +2 -0
- package/dist/__tests__/conventions.test.d.ts.map +1 -0
- package/dist/__tests__/conventions.test.js +80 -0
- package/dist/__tests__/conventions.test.js.map +1 -0
- package/dist/__tests__/page-extractor.test.d.ts +2 -0
- package/dist/__tests__/page-extractor.test.d.ts.map +1 -0
- package/dist/__tests__/page-extractor.test.js +82 -0
- package/dist/__tests__/page-extractor.test.js.map +1 -0
- package/dist/__tests__/tree-builder.test.d.ts +2 -0
- package/dist/__tests__/tree-builder.test.d.ts.map +1 -0
- package/dist/__tests__/tree-builder.test.js +335 -0
- package/dist/__tests__/tree-builder.test.js.map +1 -0
- package/dist/conventions.d.ts +53 -0
- package/dist/conventions.d.ts.map +1 -0
- package/dist/conventions.js +82 -0
- package/dist/conventions.js.map +1 -0
- package/dist/generator/codegen.d.ts +23 -0
- package/dist/generator/codegen.d.ts.map +1 -0
- package/dist/generator/codegen.js +164 -0
- package/dist/generator/codegen.js.map +1 -0
- package/dist/generator/page-extractor.d.ts +21 -0
- package/dist/generator/page-extractor.d.ts.map +1 -0
- package/dist/generator/page-extractor.js +23 -0
- package/dist/generator/page-extractor.js.map +1 -0
- package/dist/generator/scanner.d.ts +11 -0
- package/dist/generator/scanner.d.ts.map +1 -0
- package/dist/generator/scanner.js +34 -0
- package/dist/generator/scanner.js.map +1 -0
- package/dist/generator/tree-builder.d.ts +50 -0
- package/dist/generator/tree-builder.d.ts.map +1 -0
- package/dist/generator/tree-builder.js +273 -0
- package/dist/generator/tree-builder.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin.d.ts +26 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +101 -0
- package/dist/plugin.js.map +1 -0
- package/package.json +24 -0
- package/src/__tests__/codegen.test.ts +134 -0
- package/src/__tests__/conventions.test.ts +93 -0
- package/src/__tests__/page-extractor.test.ts +95 -0
- package/src/__tests__/tree-builder.test.ts +390 -0
- package/src/conventions.ts +116 -0
- package/src/generator/codegen.ts +214 -0
- package/src/generator/page-extractor.ts +48 -0
- package/src/generator/scanner.ts +45 -0
- package/src/generator/tree-builder.ts +354 -0
- package/src/index.ts +17 -0
- package/src/plugin.ts +132 -0
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
import { describe, expect, it } from 'bun:test';
|
|
2
|
+
import { buildFileRouteTree } from '../generator/tree-builder';
|
|
3
|
+
/** Module loader that returns empty modules (no page exports). */
|
|
4
|
+
const emptyLoader = async () => ({});
|
|
5
|
+
describe('buildFileRouteTree', () => {
|
|
6
|
+
it('builds a tree from flat files', async () => {
|
|
7
|
+
const files = [
|
|
8
|
+
{ absolutePath: '/app/src/routes/index.tsx', relativePath: 'index.tsx' },
|
|
9
|
+
{ absolutePath: '/app/src/routes/about.tsx', relativePath: 'about.tsx' },
|
|
10
|
+
];
|
|
11
|
+
const tree = await buildFileRouteTree(files, emptyLoader);
|
|
12
|
+
expect(tree).toHaveLength(2);
|
|
13
|
+
const index = tree.find(n => n.isIndex);
|
|
14
|
+
expect(index).toBeDefined();
|
|
15
|
+
expect(index.fullPath).toBe('/');
|
|
16
|
+
const about = tree.find(n => n.segment === 'about');
|
|
17
|
+
expect(about).toBeDefined();
|
|
18
|
+
expect(about.fullPath).toBe('/about');
|
|
19
|
+
});
|
|
20
|
+
it('builds nested routes with layouts', async () => {
|
|
21
|
+
const files = [
|
|
22
|
+
{ absolutePath: '/app/src/routes/_layout.tsx', relativePath: '_layout.tsx' },
|
|
23
|
+
{ absolutePath: '/app/src/routes/index.tsx', relativePath: 'index.tsx' },
|
|
24
|
+
{ absolutePath: '/app/src/routes/users/_layout.tsx', relativePath: 'users/_layout.tsx' },
|
|
25
|
+
{ absolutePath: '/app/src/routes/users/index.tsx', relativePath: 'users/index.tsx' },
|
|
26
|
+
{ absolutePath: '/app/src/routes/users/detail.tsx', relativePath: 'users/detail.tsx' },
|
|
27
|
+
];
|
|
28
|
+
const tree = await buildFileRouteTree(files, emptyLoader);
|
|
29
|
+
expect(tree).toHaveLength(1);
|
|
30
|
+
const rootLayout = tree[0];
|
|
31
|
+
expect(rootLayout.isLayout).toBe(true);
|
|
32
|
+
expect(rootLayout.filePath).toBe('/app/src/routes/_layout.tsx');
|
|
33
|
+
const rootIndex = rootLayout.children.find(n => n.isIndex);
|
|
34
|
+
expect(rootIndex).toBeDefined();
|
|
35
|
+
const usersLayout = rootLayout.children.find(n => n.isLayout && n.segment === 'users');
|
|
36
|
+
expect(usersLayout).toBeDefined();
|
|
37
|
+
expect(usersLayout.children).toHaveLength(2);
|
|
38
|
+
const usersIndex = usersLayout.children.find(n => n.isIndex);
|
|
39
|
+
expect(usersIndex).toBeDefined();
|
|
40
|
+
const detail = usersLayout.children.find(n => n.segment === 'detail');
|
|
41
|
+
expect(detail).toBeDefined();
|
|
42
|
+
});
|
|
43
|
+
it('handles pathless groups', async () => {
|
|
44
|
+
const files = [
|
|
45
|
+
{ absolutePath: '/app/src/routes/(auth)/login.tsx', relativePath: '(auth)/login.tsx' },
|
|
46
|
+
];
|
|
47
|
+
const tree = await buildFileRouteTree(files, emptyLoader);
|
|
48
|
+
const authGroup = tree.find(n => n.isPathlessGroup);
|
|
49
|
+
expect(authGroup).toBeDefined();
|
|
50
|
+
});
|
|
51
|
+
it('uses plain file names as segments', async () => {
|
|
52
|
+
const files = [
|
|
53
|
+
{ absolutePath: '/app/src/routes/users/detail.tsx', relativePath: 'users/detail.tsx' },
|
|
54
|
+
];
|
|
55
|
+
const tree = await buildFileRouteTree(files, emptyLoader);
|
|
56
|
+
const users = tree.find(n => n.segment === 'users');
|
|
57
|
+
expect(users).toBeDefined();
|
|
58
|
+
expect(users.children).toHaveLength(1);
|
|
59
|
+
expect(users.children[0].segment).toBe('detail');
|
|
60
|
+
expect(users.children[0].fullPath).toBe('/users/detail');
|
|
61
|
+
});
|
|
62
|
+
it('derives segment from page .route() via module loader', async () => {
|
|
63
|
+
const files = [
|
|
64
|
+
{ absolutePath: '/app/src/routes/users/detail.tsx', relativePath: 'users/detail.tsx' },
|
|
65
|
+
];
|
|
66
|
+
const loader = async (p) => {
|
|
67
|
+
if (p === '/app/src/routes/users/detail.tsx') {
|
|
68
|
+
return {
|
|
69
|
+
default: {
|
|
70
|
+
__buzolaPage: true,
|
|
71
|
+
component: () => null,
|
|
72
|
+
route: '/users/:userId',
|
|
73
|
+
paramsMeta: [{ name: 'userId', optional: false, array: false }],
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return {};
|
|
78
|
+
};
|
|
79
|
+
const tree = await buildFileRouteTree(files, loader);
|
|
80
|
+
const users = tree.find(n => n.segment === 'users');
|
|
81
|
+
expect(users).toBeDefined();
|
|
82
|
+
expect(users.children).toHaveLength(1);
|
|
83
|
+
expect(users.children[0].segment).toBe(':userId');
|
|
84
|
+
expect(users.children[0].fullPath).toBe('/users/:userId');
|
|
85
|
+
expect(users.children[0].pageExports).toEqual([
|
|
86
|
+
{ pageId: 'users/detail', exportName: 'default', routePattern: '/users/:userId', params: [{ name: 'userId', optional: false, array: false }] },
|
|
87
|
+
]);
|
|
88
|
+
});
|
|
89
|
+
it('derives route from file path when no .route()', async () => {
|
|
90
|
+
const files = [
|
|
91
|
+
{ absolutePath: '/app/src/routes/users/detail.tsx', relativePath: 'users/detail.tsx' },
|
|
92
|
+
];
|
|
93
|
+
const loader = async () => ({
|
|
94
|
+
default: {
|
|
95
|
+
__buzolaPage: true,
|
|
96
|
+
component: () => null,
|
|
97
|
+
paramsMeta: [{ name: 'userId', optional: false, array: false }],
|
|
98
|
+
// no .route() — should derive /users/detail from file path
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
const tree = await buildFileRouteTree(files, loader);
|
|
102
|
+
const users = tree.find(n => n.segment === 'users');
|
|
103
|
+
expect(users).toBeDefined();
|
|
104
|
+
expect(users.children[0].segment).toBe('detail');
|
|
105
|
+
expect(users.children[0].fullPath).toBe('/users/detail');
|
|
106
|
+
expect(users.children[0].pageExports).toEqual([
|
|
107
|
+
{ pageId: 'users/detail', exportName: 'default', routePattern: '/users/detail', params: [{ name: 'userId', optional: false, array: false }] },
|
|
108
|
+
]);
|
|
109
|
+
});
|
|
110
|
+
it('derives route for index file when no .route()', async () => {
|
|
111
|
+
const files = [
|
|
112
|
+
{ absolutePath: '/app/src/routes/users/index.tsx', relativePath: 'users/index.tsx' },
|
|
113
|
+
];
|
|
114
|
+
const loader = async () => ({
|
|
115
|
+
default: {
|
|
116
|
+
__buzolaPage: true,
|
|
117
|
+
component: () => null,
|
|
118
|
+
paramsMeta: [],
|
|
119
|
+
},
|
|
120
|
+
});
|
|
121
|
+
const tree = await buildFileRouteTree(files, loader);
|
|
122
|
+
const users = tree.find(n => n.segment === 'users');
|
|
123
|
+
const index = users.children.find(n => n.isIndex);
|
|
124
|
+
expect(index).toBeDefined();
|
|
125
|
+
expect(index.pageExports).toEqual([
|
|
126
|
+
{ pageId: 'users', exportName: 'default', routePattern: '/users', params: [] },
|
|
127
|
+
]);
|
|
128
|
+
});
|
|
129
|
+
it('sorts not-found routes last', async () => {
|
|
130
|
+
const files = [
|
|
131
|
+
{ absolutePath: '/app/src/routes/about.tsx', relativePath: 'about.tsx' },
|
|
132
|
+
{ absolutePath: '/app/src/routes/_404.tsx', relativePath: '_404.tsx' },
|
|
133
|
+
{ absolutePath: '/app/src/routes/users/index.tsx', relativePath: 'users/index.tsx' },
|
|
134
|
+
];
|
|
135
|
+
const tree = await buildFileRouteTree(files, emptyLoader);
|
|
136
|
+
const segments = tree.map(n => n.segment);
|
|
137
|
+
// _404 catch-all must be last
|
|
138
|
+
expect(segments[segments.length - 1]).toBe(':__notFound+');
|
|
139
|
+
const notFound = tree.find(n => n.isNotFound);
|
|
140
|
+
expect(notFound).toBeDefined();
|
|
141
|
+
expect(notFound.fullPath).toBe('/:__notFound+');
|
|
142
|
+
});
|
|
143
|
+
// ─── Named exports ──────────────────────────────────────────────────────
|
|
144
|
+
it('creates child nodes for named exports from regular files', async () => {
|
|
145
|
+
const files = [
|
|
146
|
+
{ absolutePath: '/app/src/routes/users.tsx', relativePath: 'users.tsx' },
|
|
147
|
+
];
|
|
148
|
+
const loader = async () => ({
|
|
149
|
+
default: {
|
|
150
|
+
__buzolaPage: true,
|
|
151
|
+
component: () => null,
|
|
152
|
+
paramsMeta: [],
|
|
153
|
+
},
|
|
154
|
+
detail: {
|
|
155
|
+
__buzolaPage: true,
|
|
156
|
+
component: () => null,
|
|
157
|
+
paramsMeta: [{ name: 'id', optional: false, array: false }],
|
|
158
|
+
},
|
|
159
|
+
settings: {
|
|
160
|
+
__buzolaPage: true,
|
|
161
|
+
component: () => null,
|
|
162
|
+
paramsMeta: [],
|
|
163
|
+
},
|
|
164
|
+
});
|
|
165
|
+
const tree = await buildFileRouteTree(files, loader);
|
|
166
|
+
const users = tree.find(n => n.segment === 'users');
|
|
167
|
+
expect(users).toBeDefined();
|
|
168
|
+
expect(users.filePath).toBe('/app/src/routes/users.tsx');
|
|
169
|
+
expect(users.exportName).toBe('default');
|
|
170
|
+
expect(users.pageExports).toEqual([
|
|
171
|
+
{ pageId: 'users', exportName: 'default', routePattern: '/users', params: [] },
|
|
172
|
+
]);
|
|
173
|
+
// Named exports become children
|
|
174
|
+
expect(users.children).toHaveLength(2);
|
|
175
|
+
const detail = users.children.find(n => n.segment === 'detail');
|
|
176
|
+
expect(detail).toBeDefined();
|
|
177
|
+
expect(detail.filePath).toBe('/app/src/routes/users.tsx');
|
|
178
|
+
expect(detail.exportName).toBe('detail');
|
|
179
|
+
expect(detail.fullPath).toBe('/users/detail');
|
|
180
|
+
expect(detail.pageExports).toEqual([
|
|
181
|
+
{ pageId: 'users/detail', exportName: 'detail', routePattern: '/users/detail', params: [{ name: 'id', optional: false, array: false }] },
|
|
182
|
+
]);
|
|
183
|
+
const settings = users.children.find(n => n.segment === 'settings');
|
|
184
|
+
expect(settings).toBeDefined();
|
|
185
|
+
expect(settings.fullPath).toBe('/users/settings');
|
|
186
|
+
});
|
|
187
|
+
it('creates sibling nodes for named exports from index files', async () => {
|
|
188
|
+
const files = [
|
|
189
|
+
{ absolutePath: '/app/src/routes/users/index.tsx', relativePath: 'users/index.tsx' },
|
|
190
|
+
];
|
|
191
|
+
const loader = async () => ({
|
|
192
|
+
default: {
|
|
193
|
+
__buzolaPage: true,
|
|
194
|
+
component: () => null,
|
|
195
|
+
paramsMeta: [],
|
|
196
|
+
},
|
|
197
|
+
detail: {
|
|
198
|
+
__buzolaPage: true,
|
|
199
|
+
component: () => null,
|
|
200
|
+
paramsMeta: [{ name: 'id', optional: false, array: false }],
|
|
201
|
+
},
|
|
202
|
+
});
|
|
203
|
+
const tree = await buildFileRouteTree(files, loader);
|
|
204
|
+
const users = tree.find(n => n.segment === 'users');
|
|
205
|
+
expect(users).toBeDefined();
|
|
206
|
+
// Default export → index node
|
|
207
|
+
const index = users.children.find(n => n.isIndex);
|
|
208
|
+
expect(index).toBeDefined();
|
|
209
|
+
expect(index.filePath).toBe('/app/src/routes/users/index.tsx');
|
|
210
|
+
// Named export → sibling of index (child of users)
|
|
211
|
+
const detail = users.children.find(n => n.segment === 'detail');
|
|
212
|
+
expect(detail).toBeDefined();
|
|
213
|
+
expect(detail.filePath).toBe('/app/src/routes/users/index.tsx');
|
|
214
|
+
expect(detail.exportName).toBe('detail');
|
|
215
|
+
expect(detail.fullPath).toBe('/users/detail');
|
|
216
|
+
expect(detail.pageExports).toEqual([
|
|
217
|
+
{ pageId: 'users/detail', exportName: 'detail', routePattern: '/users/detail', params: [{ name: 'id', optional: false, array: false }] },
|
|
218
|
+
]);
|
|
219
|
+
});
|
|
220
|
+
it('creates container node when file has only named exports', async () => {
|
|
221
|
+
const files = [
|
|
222
|
+
{ absolutePath: '/app/src/routes/users.tsx', relativePath: 'users.tsx' },
|
|
223
|
+
];
|
|
224
|
+
const loader = async () => ({
|
|
225
|
+
list: {
|
|
226
|
+
__buzolaPage: true,
|
|
227
|
+
component: () => null,
|
|
228
|
+
paramsMeta: [],
|
|
229
|
+
},
|
|
230
|
+
detail: {
|
|
231
|
+
__buzolaPage: true,
|
|
232
|
+
component: () => null,
|
|
233
|
+
paramsMeta: [],
|
|
234
|
+
},
|
|
235
|
+
});
|
|
236
|
+
const tree = await buildFileRouteTree(files, loader);
|
|
237
|
+
const users = tree.find(n => n.segment === 'users');
|
|
238
|
+
expect(users).toBeDefined();
|
|
239
|
+
expect(users.filePath).toBeUndefined(); // No default → no component
|
|
240
|
+
expect(users.pageExports).toBeUndefined();
|
|
241
|
+
expect(users.children).toHaveLength(2);
|
|
242
|
+
expect(users.children.find(n => n.segment === 'detail')).toBeDefined();
|
|
243
|
+
expect(users.children.find(n => n.segment === 'list')).toBeDefined();
|
|
244
|
+
});
|
|
245
|
+
it('named export with .route() uses explicit route pattern', async () => {
|
|
246
|
+
const files = [
|
|
247
|
+
{ absolutePath: '/app/src/routes/users.tsx', relativePath: 'users.tsx' },
|
|
248
|
+
];
|
|
249
|
+
const loader = async () => ({
|
|
250
|
+
detail: {
|
|
251
|
+
__buzolaPage: true,
|
|
252
|
+
component: () => null,
|
|
253
|
+
route: '/users/:userId',
|
|
254
|
+
paramsMeta: [{ name: 'userId', optional: false, array: false }],
|
|
255
|
+
},
|
|
256
|
+
});
|
|
257
|
+
const tree = await buildFileRouteTree(files, loader);
|
|
258
|
+
const users = tree.find(n => n.segment === 'users');
|
|
259
|
+
expect(users.children).toHaveLength(1);
|
|
260
|
+
expect(users.children[0].segment).toBe(':userId');
|
|
261
|
+
expect(users.children[0].fullPath).toBe('/users/:userId');
|
|
262
|
+
});
|
|
263
|
+
it('throws on collision: named export vs file in subdirectory', async () => {
|
|
264
|
+
const files = [
|
|
265
|
+
{ absolutePath: '/app/src/routes/users.tsx', relativePath: 'users.tsx' },
|
|
266
|
+
{ absolutePath: '/app/src/routes/users/detail.tsx', relativePath: 'users/detail.tsx' },
|
|
267
|
+
];
|
|
268
|
+
const loader = async (p) => {
|
|
269
|
+
if (p === '/app/src/routes/users.tsx') {
|
|
270
|
+
return {
|
|
271
|
+
detail: {
|
|
272
|
+
__buzolaPage: true,
|
|
273
|
+
component: () => null,
|
|
274
|
+
paramsMeta: [],
|
|
275
|
+
},
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
return {
|
|
279
|
+
default: {
|
|
280
|
+
__buzolaPage: true,
|
|
281
|
+
component: () => null,
|
|
282
|
+
paramsMeta: [],
|
|
283
|
+
},
|
|
284
|
+
};
|
|
285
|
+
};
|
|
286
|
+
expect(buildFileRouteTree(files, loader)).rejects.toThrow(/Route collision/);
|
|
287
|
+
});
|
|
288
|
+
it('throws on collision: named export from index vs file in same directory', async () => {
|
|
289
|
+
const files = [
|
|
290
|
+
{ absolutePath: '/app/src/routes/users/detail.tsx', relativePath: 'users/detail.tsx' },
|
|
291
|
+
{ absolutePath: '/app/src/routes/users/index.tsx', relativePath: 'users/index.tsx' },
|
|
292
|
+
];
|
|
293
|
+
const loader = async (p) => {
|
|
294
|
+
if (p === '/app/src/routes/users/index.tsx') {
|
|
295
|
+
return {
|
|
296
|
+
detail: {
|
|
297
|
+
__buzolaPage: true,
|
|
298
|
+
component: () => null,
|
|
299
|
+
paramsMeta: [],
|
|
300
|
+
},
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
return {
|
|
304
|
+
default: {
|
|
305
|
+
__buzolaPage: true,
|
|
306
|
+
component: () => null,
|
|
307
|
+
paramsMeta: [],
|
|
308
|
+
},
|
|
309
|
+
};
|
|
310
|
+
};
|
|
311
|
+
expect(buildFileRouteTree(files, loader)).rejects.toThrow(/Route collision/);
|
|
312
|
+
});
|
|
313
|
+
it('handles nested _404 within a directory', async () => {
|
|
314
|
+
const files = [
|
|
315
|
+
{ absolutePath: '/app/src/routes/users/index.tsx', relativePath: 'users/index.tsx' },
|
|
316
|
+
{ absolutePath: '/app/src/routes/users/_404.tsx', relativePath: 'users/_404.tsx' },
|
|
317
|
+
];
|
|
318
|
+
const tree = await buildFileRouteTree(files, emptyLoader);
|
|
319
|
+
const users = tree.find(n => n.segment === 'users');
|
|
320
|
+
expect(users).toBeDefined();
|
|
321
|
+
const notFound = users.children.find(n => n.isNotFound);
|
|
322
|
+
expect(notFound).toBeDefined();
|
|
323
|
+
expect(notFound.segment).toBe(':__notFound+');
|
|
324
|
+
expect(notFound.fullPath).toBe('/users/:__notFound+');
|
|
325
|
+
expect(notFound.pageExports).toEqual([
|
|
326
|
+
{
|
|
327
|
+
pageId: 'users/404',
|
|
328
|
+
exportName: 'default',
|
|
329
|
+
routePattern: '/users/:__notFound+',
|
|
330
|
+
params: [{ name: '__notFound', optional: false, array: false }],
|
|
331
|
+
},
|
|
332
|
+
]);
|
|
333
|
+
});
|
|
334
|
+
});
|
|
335
|
+
//# sourceMappingURL=tree-builder.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-builder.test.js","sourceRoot":"","sources":["../../src/__tests__/tree-builder.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File naming conventions for page-centric routing.
|
|
3
|
+
*
|
|
4
|
+
* _layout.tsx → Layout wrapper (renders children via <Outlet />)
|
|
5
|
+
* _404.tsx → Not-found catch-all (auto-assigned catch-all pattern within parent scope)
|
|
6
|
+
* index.tsx → Index route (renders at parent's exact path)
|
|
7
|
+
* about.tsx → Named page file (page ID derived from file name)
|
|
8
|
+
* (group)/ → Pathless group (no URL segment)
|
|
9
|
+
*
|
|
10
|
+
* Files prefixed with `_` are special convention files, not regular pages.
|
|
11
|
+
* Route patterns (URL paths) come exclusively from `.route()` on `createPage()`.
|
|
12
|
+
* File names only determine page IDs and layout nesting.
|
|
13
|
+
*/
|
|
14
|
+
export declare const ROUTE_FILE_EXTENSIONS: string[];
|
|
15
|
+
export interface ParsedRouteFile {
|
|
16
|
+
/** The route segment this file contributes. */
|
|
17
|
+
segment: string;
|
|
18
|
+
/** Whether this is a layout file. */
|
|
19
|
+
isLayout: boolean;
|
|
20
|
+
/** Whether this is an index file. */
|
|
21
|
+
isIndex: boolean;
|
|
22
|
+
/** Whether this is a not-found catch-all file. */
|
|
23
|
+
isNotFound: boolean;
|
|
24
|
+
/** Whether this directory is a pathless group. */
|
|
25
|
+
isPathlessGroup: boolean;
|
|
26
|
+
/** Original file path relative to routes dir. */
|
|
27
|
+
relativePath: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Check if a file is a route file based on extension.
|
|
31
|
+
*/
|
|
32
|
+
export declare function isRouteFile(filePath: string): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Parse a directory name for routing conventions.
|
|
35
|
+
*/
|
|
36
|
+
export declare function parseDirName(name: string): {
|
|
37
|
+
segment: string;
|
|
38
|
+
isPathlessGroup: boolean;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Parse a route file name (without extension) into routing info.
|
|
42
|
+
*/
|
|
43
|
+
export declare function parseFileName(nameWithoutExt: string): {
|
|
44
|
+
segment: string;
|
|
45
|
+
isLayout: boolean;
|
|
46
|
+
isIndex: boolean;
|
|
47
|
+
isNotFound: boolean;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Parse a route file path relative to the routes directory.
|
|
51
|
+
*/
|
|
52
|
+
export declare function parseRouteFile(relativePath: string): ParsedRouteFile;
|
|
53
|
+
//# sourceMappingURL=conventions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conventions.d.ts","sourceRoot":"","sources":["../src/conventions.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AAEH,eAAO,MAAM,qBAAqB,UAAiC,CAAA;AAEnE,MAAM,WAAW,eAAe;IAC/B,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAA;IACf,qCAAqC;IACrC,QAAQ,EAAE,OAAO,CAAA;IACjB,qCAAqC;IACrC,OAAO,EAAE,OAAO,CAAA;IAChB,kDAAkD;IAClD,UAAU,EAAE,OAAO,CAAA;IACnB,kDAAkD;IAClD,eAAe,EAAE,OAAO,CAAA;IACxB,iDAAiD;IACjD,YAAY,EAAE,MAAM,CAAA;CACpB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAErD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,OAAO,CAAA;CAAE,CAOxF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,cAAc,EAAE,MAAM,GAAG;IACtD,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,OAAO,CAAA;IACjB,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,OAAO,CAAA;CACnB,CAcA;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,eAAe,CAoCpE"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import * as path from 'node:path';
|
|
2
|
+
/**
|
|
3
|
+
* File naming conventions for page-centric routing.
|
|
4
|
+
*
|
|
5
|
+
* _layout.tsx → Layout wrapper (renders children via <Outlet />)
|
|
6
|
+
* _404.tsx → Not-found catch-all (auto-assigned catch-all pattern within parent scope)
|
|
7
|
+
* index.tsx → Index route (renders at parent's exact path)
|
|
8
|
+
* about.tsx → Named page file (page ID derived from file name)
|
|
9
|
+
* (group)/ → Pathless group (no URL segment)
|
|
10
|
+
*
|
|
11
|
+
* Files prefixed with `_` are special convention files, not regular pages.
|
|
12
|
+
* Route patterns (URL paths) come exclusively from `.route()` on `createPage()`.
|
|
13
|
+
* File names only determine page IDs and layout nesting.
|
|
14
|
+
*/
|
|
15
|
+
export const ROUTE_FILE_EXTENSIONS = ['.tsx', '.jsx', '.ts', '.js'];
|
|
16
|
+
/**
|
|
17
|
+
* Check if a file is a route file based on extension.
|
|
18
|
+
*/
|
|
19
|
+
export function isRouteFile(filePath) {
|
|
20
|
+
return ROUTE_FILE_EXTENSIONS.some(ext => filePath.endsWith(ext));
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Parse a directory name for routing conventions.
|
|
24
|
+
*/
|
|
25
|
+
export function parseDirName(name) {
|
|
26
|
+
// Pathless group: (auth)
|
|
27
|
+
if (name.startsWith('(') && name.endsWith(')')) {
|
|
28
|
+
return { segment: '', isPathlessGroup: true };
|
|
29
|
+
}
|
|
30
|
+
return { segment: name, isPathlessGroup: false };
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Parse a route file name (without extension) into routing info.
|
|
34
|
+
*/
|
|
35
|
+
export function parseFileName(nameWithoutExt) {
|
|
36
|
+
if (nameWithoutExt === '_layout') {
|
|
37
|
+
return { segment: '', isLayout: true, isIndex: false, isNotFound: false };
|
|
38
|
+
}
|
|
39
|
+
if (nameWithoutExt === '_404') {
|
|
40
|
+
return { segment: '', isLayout: false, isIndex: false, isNotFound: true };
|
|
41
|
+
}
|
|
42
|
+
if (nameWithoutExt === 'index') {
|
|
43
|
+
return { segment: '', isLayout: false, isIndex: true, isNotFound: false };
|
|
44
|
+
}
|
|
45
|
+
return { segment: nameWithoutExt, isLayout: false, isIndex: false, isNotFound: false };
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Parse a route file path relative to the routes directory.
|
|
49
|
+
*/
|
|
50
|
+
export function parseRouteFile(relativePath) {
|
|
51
|
+
const ext = path.extname(relativePath);
|
|
52
|
+
const withoutExt = relativePath.slice(0, -ext.length);
|
|
53
|
+
const parts = withoutExt.split(path.sep);
|
|
54
|
+
const fileName = parts.pop();
|
|
55
|
+
const dirs = parts;
|
|
56
|
+
const fileInfo = parseFileName(fileName);
|
|
57
|
+
// Build segment from directory path + file
|
|
58
|
+
const segments = [];
|
|
59
|
+
let isPathlessGroup = false;
|
|
60
|
+
for (const dir of dirs) {
|
|
61
|
+
const dirInfo = parseDirName(dir);
|
|
62
|
+
if (dirInfo.isPathlessGroup) {
|
|
63
|
+
isPathlessGroup = true;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
segments.push(dirInfo.segment);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (fileInfo.segment) {
|
|
70
|
+
segments.push(fileInfo.segment);
|
|
71
|
+
}
|
|
72
|
+
const segment = segments.length > 0 ? segments.join('/') : '';
|
|
73
|
+
return {
|
|
74
|
+
segment,
|
|
75
|
+
isLayout: fileInfo.isLayout,
|
|
76
|
+
isIndex: fileInfo.isIndex,
|
|
77
|
+
isNotFound: fileInfo.isNotFound,
|
|
78
|
+
isPathlessGroup,
|
|
79
|
+
relativePath,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=conventions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conventions.js","sourceRoot":"","sources":["../src/conventions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { FileRouteNode } from './tree-builder';
|
|
2
|
+
export interface CodegenOptions {
|
|
3
|
+
/** The route tree from file scanning. */
|
|
4
|
+
tree: FileRouteNode[];
|
|
5
|
+
/** Absolute path to the routes directory. */
|
|
6
|
+
routesDir: string;
|
|
7
|
+
/** Absolute path to the output file. */
|
|
8
|
+
outputPath: string;
|
|
9
|
+
/** Parameter names that should be persistent across navigations. */
|
|
10
|
+
persistentParams?: string[];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Generate the buzola.gen.ts file with:
|
|
14
|
+
* 1. Module augmentation for BuzolaPageMap (type safety)
|
|
15
|
+
* 2. Page registry (page ID → route pattern)
|
|
16
|
+
* 3. Route tree construction code
|
|
17
|
+
*/
|
|
18
|
+
export declare function generateRouteModule(options: CodegenOptions): string;
|
|
19
|
+
/**
|
|
20
|
+
* Generate the virtual module content for `virtual:buzola/routes`.
|
|
21
|
+
*/
|
|
22
|
+
export declare function generateVirtualModule(outputPath: string): string;
|
|
23
|
+
//# sourceMappingURL=codegen.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../../src/generator/codegen.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAEnD,MAAM,WAAW,cAAc;IAC9B,yCAAyC;IACzC,IAAI,EAAE,aAAa,EAAE,CAAA;IACrB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAA;IACjB,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAA;IAClB,oEAAoE;IACpE,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;CAC3B;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAsFnE;AAsGD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEhE"}
|