@kimesh/router-generator 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/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # @kimesh/router-generator
2
+
3
+ Part of the [Kimesh](https://github.com/kimesh/kimesh) framework.
@@ -0,0 +1,505 @@
1
+ import { Plugin } from "vite";
2
+
3
+ //#region src/types.d.ts
4
+ /**
5
+ * Router generator configuration
6
+ */
7
+ interface KimeshRouterConfig {
8
+ /** Source directory (default: 'src') */
9
+ srcDir: string;
10
+ /** Routes directory relative to srcDir (default: 'routes') */
11
+ routesDir: string;
12
+ /** Generated files directory relative to srcDir (default: '.kimesh') */
13
+ generatedDir: string;
14
+ /** File extensions to scan (default: ['.vue']) */
15
+ extensions: string[];
16
+ /** Import mode for route components */
17
+ importMode: 'async' | 'sync' | ((filepath: string) => 'async' | 'sync');
18
+ }
19
+ /**
20
+ * Resolved router config with all defaults applied
21
+ */
22
+ interface ResolvedRouterConfig extends KimeshRouterConfig {
23
+ /** Absolute path to routes directory */
24
+ routesDirPath: string;
25
+ /** Absolute path to generated directory */
26
+ generatedDirPath: string;
27
+ /** Project root */
28
+ root: string;
29
+ }
30
+ /**
31
+ * Route node type
32
+ */
33
+ type RouteNodeType = 'page' | 'layout' | 'index' | 'catch-all' | 'dynamic';
34
+ /**
35
+ * Scanned route node
36
+ */
37
+ interface RouteNode {
38
+ /** File path relative to routes dir */
39
+ filePath: string;
40
+ /** Absolute file path */
41
+ fullPath: string;
42
+ /** Generated route path (e.g., '/posts/:postId') */
43
+ routePath: string;
44
+ /** Variable name for imports */
45
+ variableName: string;
46
+ /** Route node type */
47
+ type: RouteNodeType;
48
+ /** Route name for vue-router */
49
+ routeName: string;
50
+ /** Is lazy-loaded */
51
+ isLazy: boolean;
52
+ /** Param names in route */
53
+ params: RouteParam[];
54
+ /** Parsed route info from SFC */
55
+ parsed: ParsedRoute;
56
+ /** Child route nodes */
57
+ children: RouteNode[];
58
+ /** Parent route node */
59
+ parent?: RouteNode;
60
+ /** Route group name (if inside group folder) */
61
+ group?: string;
62
+ /** Raw segment from filename */
63
+ rawSegment: string;
64
+ /** Source layer name (for layer-aware features) */
65
+ layer?: string;
66
+ }
67
+ /**
68
+ * Route parameter
69
+ */
70
+ interface RouteParam {
71
+ /** Parameter name */
72
+ name: string;
73
+ /** Is optional param */
74
+ optional: boolean;
75
+ /** Is catch-all (splat) param */
76
+ isSplat: boolean;
77
+ /** Is repeatable (+) */
78
+ repeatable: boolean;
79
+ }
80
+ /**
81
+ * Parsed route definition from SFC
82
+ */
83
+ interface ParsedRoute {
84
+ /** Route has a Route export */
85
+ hasRouteDefinition: boolean;
86
+ /** Route path from createFileRoute() */
87
+ routePath: string | null;
88
+ /** Loader function exists */
89
+ hasLoader: boolean;
90
+ /** Meta object exists */
91
+ hasMeta: boolean;
92
+ /** Search params validation exists */
93
+ hasValidateSearch: boolean;
94
+ /** Is this a layout file */
95
+ isLayout: boolean;
96
+ /** Raw route script content */
97
+ routeScriptContent: string | null;
98
+ }
99
+ /**
100
+ * Generated routes output
101
+ */
102
+ interface GeneratedOutput {
103
+ /** routes.gen.ts content */
104
+ routesCode: string;
105
+ /** route-types.d.ts content */
106
+ typesCode: string;
107
+ /** Route tree */
108
+ routes: RouteNode[];
109
+ }
110
+ /**
111
+ * Route tree node for building
112
+ */
113
+ interface TreeNode {
114
+ segment: string;
115
+ routePath: string;
116
+ node?: RouteNode;
117
+ children: Map<string, TreeNode>;
118
+ parent?: TreeNode;
119
+ }
120
+ //#endregion
121
+ //#region src/plugin.d.ts
122
+ /**
123
+ * Layer route configuration
124
+ */
125
+ interface LayerRouteConfig {
126
+ /** Layer name */
127
+ layerName: string;
128
+ /** Routes directory path */
129
+ routesDir: string;
130
+ /** Layer root path (for generating .kimesh directory) */
131
+ layerPath?: string;
132
+ /** Base path prefix for routes */
133
+ basePath?: string;
134
+ /** Layer priority (lower = higher priority) */
135
+ priority: number;
136
+ }
137
+ interface KimeshRouterPluginOptions extends Partial<KimeshRouterConfig> {
138
+ /** Enable debug logging */
139
+ debug?: boolean;
140
+ /** Layer routes configuration (static) */
141
+ layerRoutes?: LayerRouteConfig[];
142
+ /** Layer routes configuration (lazy getter for async resolution) */
143
+ getLayerRoutes?: () => LayerRouteConfig[];
144
+ }
145
+ /**
146
+ * Kimesh Router Generator Vite Plugin
147
+ */
148
+ declare function kimeshRouterGenerator(options?: KimeshRouterPluginOptions): Plugin;
149
+ //#endregion
150
+ //#region src/scanner.d.ts
151
+ /**
152
+ * Route file scanner
153
+ * Scans the routes directory and builds route nodes
154
+ */
155
+ declare class RouteScanner {
156
+ private config;
157
+ private routeNodes;
158
+ constructor(config: ResolvedRouterConfig);
159
+ /**
160
+ * Scan routes directory and return route nodes
161
+ */
162
+ scan(): Promise<RouteNode[]>;
163
+ /**
164
+ * Process a single route file
165
+ */
166
+ private processFile;
167
+ /**
168
+ * Parse filename to determine route type and path
169
+ *
170
+ * Kimesh file-based routing conventions:
171
+ * - __root.vue → root layout (wraps everything)
172
+ * - index.vue → index route
173
+ * - about.vue → regular page (/about)
174
+ * - $id.vue → dynamic param (/users/:id)
175
+ * - $.vue → catch-all (splat route)
176
+ * - _auth.vue → pathless layout (underscore prefix, no URL segment)
177
+ * - posts.vue + posts/ → layout route (file + matching directory)
178
+ * - posts.index.vue → flat route notation (dot separator)
179
+ */
180
+ private parseFileName;
181
+ private parseDotNotationRoute;
182
+ /**
183
+ * Generate a valid JavaScript variable name from file path
184
+ */
185
+ private generateVariableName;
186
+ /**
187
+ * Generate route name from route path
188
+ */
189
+ private generateRouteName;
190
+ /**
191
+ * Check if route should be lazy loaded based on config
192
+ */
193
+ private shouldBeLazy;
194
+ /**
195
+ * Get all scanned route nodes
196
+ */
197
+ getNodes(): RouteNode[];
198
+ /**
199
+ * Build glob pattern for file scanning based on configured extensions
200
+ */
201
+ private buildGlobPattern;
202
+ }
203
+ /**
204
+ * Create a route scanner instance
205
+ */
206
+ declare function createScanner(config: ResolvedRouterConfig): RouteScanner;
207
+ //#endregion
208
+ //#region src/parser.d.ts
209
+ /**
210
+ * Extended parsed route with OXC-extracted metadata
211
+ */
212
+ interface ExtendedParsedRoute extends ParsedRoute {
213
+ /** defineLoader options if present */
214
+ loaderOptions?: {
215
+ isAsync: boolean;
216
+ hasBeforeLoad: boolean;
217
+ dependencies: string[];
218
+ cacheStrategy?: string;
219
+ };
220
+ /** defineMiddleware names */
221
+ middleware?: string[];
222
+ /** definePageMeta options */
223
+ pageMeta?: {
224
+ name?: string;
225
+ path?: string;
226
+ alias?: string | string[];
227
+ redirect?: string;
228
+ layout?: string | false;
229
+ transition?: boolean | string;
230
+ keepAlive?: boolean;
231
+ meta?: Record<string, unknown>;
232
+ };
233
+ }
234
+ /**
235
+ * Parse a Vue SFC file to extract route definition information using OXC
236
+ */
237
+ declare function parseRouteFile(code: string, filePath: string): ExtendedParsedRoute;
238
+ /**
239
+ * Create an empty parsed route
240
+ */
241
+ declare function createEmptyParsedRoute(filePath: string): ExtendedParsedRoute;
242
+ //#endregion
243
+ //#region src/tree-builder.d.ts
244
+ /**
245
+ * Build a route tree from flat route nodes
246
+ */
247
+ declare class RouteTreeBuilder {
248
+ private config;
249
+ private root;
250
+ private layoutNodes;
251
+ private pathlessLayoutMap;
252
+ constructor(config: ResolvedRouterConfig);
253
+ /**
254
+ * Build route tree from scanned nodes
255
+ */
256
+ build(nodes: RouteNode[]): RouteNode[];
257
+ private separateLayoutsAndPages;
258
+ private registerLayout;
259
+ private groupPagesByPathlessLayout;
260
+ private findMatchingPathlessLayout;
261
+ private addPathlessLayoutRoutes;
262
+ /**
263
+ * Insert a node into the tree
264
+ */
265
+ private insertNode;
266
+ /**
267
+ * Get path segments from route path
268
+ */
269
+ private getPathSegments;
270
+ /**
271
+ * Create a tree node
272
+ */
273
+ private createTreeNode;
274
+ /**
275
+ * Flatten tree to route array
276
+ */
277
+ private flattenTree;
278
+ /**
279
+ * Flatten children of a tree node
280
+ */
281
+ private flattenChildren;
282
+ private flattenChildNode;
283
+ private createLayoutWithChildren;
284
+ private flattenNodeWithChildren;
285
+ /**
286
+ * Compare segments for sorting
287
+ * Order: static > dynamic > catch-all
288
+ */
289
+ private compareSegments;
290
+ /**
291
+ * Get sorting score for a segment
292
+ */
293
+ private getSegmentScore;
294
+ }
295
+ /**
296
+ * Create a route tree builder
297
+ */
298
+ declare function createTreeBuilder(config: ResolvedRouterConfig): RouteTreeBuilder;
299
+ /**
300
+ * Build route tree from nodes
301
+ */
302
+ declare function buildRouteTree(nodes: RouteNode[], config: ResolvedRouterConfig): RouteNode[];
303
+ //#endregion
304
+ //#region src/codegen/routes.d.ts
305
+ /**
306
+ * Generate routes.gen.ts content
307
+ */
308
+ declare function generateRoutes(routes: RouteNode[], config: ResolvedRouterConfig): string;
309
+ //#endregion
310
+ //#region src/codegen/types.d.ts
311
+ /**
312
+ * Generate typed-routes.d.ts content with comprehensive type safety
313
+ */
314
+ declare function generateRouteTypes(routes: RouteNode[]): string;
315
+ //#endregion
316
+ //#region src/route-utils.d.ts
317
+ interface ParsedFileName {
318
+ type: RouteNodeType;
319
+ routePath: string;
320
+ params: RouteParam[];
321
+ rawSegment: string;
322
+ isPathlessLayout?: boolean;
323
+ }
324
+ /**
325
+ * Check if directory path is root (empty or ".")
326
+ */
327
+ declare function isRootDir(dirPath: string): boolean;
328
+ /**
329
+ * Extract dynamic param name from segment (e.g., "$id" -> "id")
330
+ */
331
+ declare function extractDynamicParam(segment: string): string | null;
332
+ /**
333
+ * Check if filename uses dot notation for flat routes
334
+ */
335
+ declare function isDotNotationRoute(fileName: string): boolean;
336
+ /**
337
+ * Unescape bracket notation in filenames
338
+ * e.g., script[.]js -> script.js, api[.]v1 -> api.v1
339
+ */
340
+ declare function unescapeBrackets(segment: string): string;
341
+ /**
342
+ * Process a single path segment for dynamic params and special conventions
343
+ *
344
+ * Conventions:
345
+ * - (auth) -> pathless group folder, returns empty string
346
+ * - _auth -> pathless layout folder, returns empty string
347
+ * - posts_ -> layout escape, strips trailing underscore
348
+ * - $id -> dynamic param :id
349
+ * - -folder -> excluded from routing (dash prefix)
350
+ * - [x] -> escape special characters
351
+ */
352
+ declare function processPathSegment(segment: string): string;
353
+ /**
354
+ * Process directory path into route segments
355
+ */
356
+ declare function processDirectoryPath(dirPath: string): string;
357
+ /**
358
+ * Build route path from directory and segment
359
+ */
360
+ declare function buildRoutePath(dirPath: string, segment: string): string;
361
+ /**
362
+ * Create a standard RouteParam for a dynamic parameter
363
+ */
364
+ declare function createDynamicParam(name: string): RouteParam;
365
+ /**
366
+ * Create a catch-all RouteParam
367
+ */
368
+ declare function createCatchAllParam(): RouteParam;
369
+ /**
370
+ * Build a glob pattern for route file scanning
371
+ */
372
+ declare function buildGlobPattern(extensions: string[]): string;
373
+ //#endregion
374
+ //#region src/layer-collector.d.ts
375
+ /**
376
+ * Layer route source configuration
377
+ */
378
+ interface LayerRouteSource {
379
+ /** Layer name */
380
+ layer: string;
381
+ /** Layer priority (0 = app/highest) */
382
+ priority: number;
383
+ /** Absolute path to routes directory */
384
+ routesDir: string;
385
+ /** Base path prefix for all routes in this layer */
386
+ basePath?: string;
387
+ }
388
+ /**
389
+ * Collected layer routes result
390
+ */
391
+ interface LayerRoutesResult {
392
+ /** All route nodes from all layers */
393
+ routes: RouteNode[];
394
+ /** Routes grouped by layer */
395
+ byLayer: Map<string, RouteNode[]>;
396
+ /** Timing information */
397
+ timing: {
398
+ totalMs: number;
399
+ perLayer: Map<string, number>;
400
+ };
401
+ }
402
+ /**
403
+ * Extended route node with layer information
404
+ */
405
+ interface LayerRouteNode extends RouteNode {
406
+ /** Source layer name */
407
+ layer: string;
408
+ /** Layer priority */
409
+ layerPriority: number;
410
+ /** Base path from layer config */
411
+ layerBasePath?: string;
412
+ /** Final route path (with basePath applied) */
413
+ finalRoutePath: string;
414
+ }
415
+ /**
416
+ * Collect routes from all configured layers and build proper route trees
417
+ */
418
+ declare function collectLayerRoutes(sources: LayerRouteSource[], config: ResolvedRouterConfig): Promise<LayerRoutesResult>;
419
+ //#endregion
420
+ //#region src/layout-resolver.d.ts
421
+ /**
422
+ * Resolved layout information
423
+ */
424
+ interface ResolvedLayout {
425
+ /** Absolute file path */
426
+ filePath: string;
427
+ /** Layout name (undefined for default) */
428
+ name?: string;
429
+ /** Route path this layout applies to */
430
+ routePath: string;
431
+ /** Layer this layout comes from */
432
+ layer: string;
433
+ /** Layer priority */
434
+ priority: number;
435
+ /** Source type: 'host' or 'layer' */
436
+ source: 'host' | 'layer';
437
+ /** Mount path for layer layouts */
438
+ mountPath?: string;
439
+ }
440
+ /**
441
+ * Layout chain for a page
442
+ */
443
+ interface LayoutChain {
444
+ /** Ordered list of layouts from outermost to innermost */
445
+ layouts: ResolvedLayout[];
446
+ /** Final page component */
447
+ page: LayerRouteNode;
448
+ }
449
+ /**
450
+ * Layout resolver for nested wrapping
451
+ *
452
+ * Key principle: Host layouts WRAP layer layouts (outer → inner)
453
+ * - Host root layout is always outermost
454
+ * - Host path-specific layouts come next
455
+ * - Layer layouts are innermost (closest to page content)
456
+ */
457
+ declare class LayoutResolver {
458
+ private hostLayouts;
459
+ private layerLayouts;
460
+ private layerMounts;
461
+ /**
462
+ * Build layout chains for all routes
463
+ */
464
+ resolveLayoutChains(routes: LayerRouteNode[], layerMounts: Map<string, string>): Map<string, LayoutChain>;
465
+ /**
466
+ * Categorize layouts into host and layer layouts
467
+ */
468
+ private categorizeLayouts;
469
+ /**
470
+ * Build the complete layout chain for a page
471
+ *
472
+ * Order: Host root → Host path-specific → Layer root → Layer path-specific → Page
473
+ */
474
+ private buildLayoutChain;
475
+ /**
476
+ * Collect host layouts from root to most specific path
477
+ */
478
+ private collectHostLayouts;
479
+ /**
480
+ * Collect layer layouts from layer root to most specific path
481
+ */
482
+ private collectLayerLayouts;
483
+ /**
484
+ * Extract layout name from file path
485
+ * _layout.admin.vue → 'admin'
486
+ * _layout.vue → undefined
487
+ */
488
+ private extractLayoutName;
489
+ /**
490
+ * Make a unique key for layout lookup
491
+ */
492
+ private makeLayoutKey;
493
+ }
494
+ /**
495
+ * Generate nested layout component structure for Vue Router
496
+ *
497
+ * This generates the component tree where layouts wrap their children
498
+ */
499
+ declare function generateLayoutStructure(chain: LayoutChain): {
500
+ component: string;
501
+ children?: any[];
502
+ } | null;
503
+ //#endregion
504
+ export { type ExtendedParsedRoute, type GeneratedOutput, type KimeshRouterConfig, type KimeshRouterPluginOptions, type LayerRouteConfig, type LayerRouteNode, type LayerRouteSource, type LayerRoutesResult, type LayoutChain, LayoutResolver, type ParsedFileName, type ParsedRoute, type ResolvedLayout, type ResolvedRouterConfig, type RouteNode, type RouteNodeType, type RouteParam, RouteScanner, RouteTreeBuilder, type TreeNode, buildGlobPattern, buildRoutePath, buildRouteTree, collectLayerRoutes, createCatchAllParam, createDynamicParam, createEmptyParsedRoute, createScanner, createTreeBuilder, extractDynamicParam, generateLayoutStructure, generateRouteTypes, generateRoutes, isDotNotationRoute, isRootDir, kimeshRouterGenerator, parseRouteFile, processDirectoryPath, processPathSegment, unescapeBrackets };
505
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/plugin.ts","../src/scanner.ts","../src/parser.ts","../src/tree-builder.ts","../src/codegen/routes.ts","../src/codegen/types.ts","../src/route-utils.ts","../src/layer-collector.ts","../src/layout-resolver.ts"],"mappings":"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"}