aaex-file-router 1.3.2 → 1.4.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 +93 -23
- package/dist/core/RouteGenerator.d.ts +5 -9
- package/dist/core/RouteGenerator.d.ts.map +1 -1
- package/dist/core/RouteGenerator.js +66 -50
- package/dist/core/RouteGenerator.js.map +1 -1
- package/dist/pages/test/loading.d.ts +2 -0
- package/dist/pages/test/loading.d.ts.map +1 -0
- package/dist/pages/test/loading.js +5 -0
- package/dist/pages/test/loading.js.map +1 -0
- package/dist/plugin/plugin.js +2 -2
- package/dist/plugin/plugin.js.map +1 -1
- package/dist/test/index.js +3 -2
- package/dist/test/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,11 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
A file-based routing system for React projects that automatically generates routes from your file structure. Similar to Next.js App Router or Remix file conventions.
|
|
4
4
|
|
|
5
|
-
## V. 1.
|
|
5
|
+
## V. 1.4.1
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
**Notice** Only tested 3 levels deep but there is no reason i shouldnt work further
|
|
7
|
+
Added support for loading components
|
|
10
8
|
|
|
11
9
|
## Table of Contents
|
|
12
10
|
|
|
@@ -19,11 +17,12 @@ Routes are now able to be infinitely nested
|
|
|
19
17
|
- [Using createBrowserRouter](#1-using-createbrowserrouter-recommended-for-most-users)
|
|
20
18
|
- [Using nested Route elements](#2-using-nested-route-elements)
|
|
21
19
|
- [File Conventions](#file-conventions)
|
|
22
|
-
- [Generated Routes File](#generated-routes-file)
|
|
23
20
|
- [Route Resolution Examples](#route-resolution-examples)
|
|
21
|
+
- [Import strategy](#import-strategy)
|
|
24
22
|
- [Layouts](#layouts)
|
|
25
23
|
- [FileLink component](#filelink-component)
|
|
26
24
|
- [Usage](#usage)
|
|
25
|
+
- [Generated files](#generated-files)
|
|
27
26
|
- [API Reference](#api-reference)
|
|
28
27
|
- [How It Works](#how-it-works)
|
|
29
28
|
- [Performance Considerations](#performance-considerations)
|
|
@@ -53,13 +52,15 @@ npm install aaex-file-router
|
|
|
53
52
|
|
|
54
53
|
```
|
|
55
54
|
src/pages/
|
|
56
|
-
|
|
57
|
-
├──
|
|
58
|
-
|
|
59
|
-
├──
|
|
60
|
-
├──
|
|
61
|
-
|
|
62
|
-
└──
|
|
55
|
+
└── dashboard/
|
|
56
|
+
├── loading.tsx ← Used as fallback for ALL lazy imports below
|
|
57
|
+
├── index.tsx
|
|
58
|
+
├── stats/
|
|
59
|
+
│ ├── loading.tsx ← Overrides parent
|
|
60
|
+
│ └── weekly.tsx
|
|
61
|
+
└── users/
|
|
62
|
+
└── [id].tsx ← used for dynamic routes ex :users/123
|
|
63
|
+
|
|
63
64
|
```
|
|
64
65
|
|
|
65
66
|
### 2. Configure Vite
|
|
@@ -83,6 +84,8 @@ export default defineConfig({
|
|
|
83
84
|
|
|
84
85
|
### 3. Use in your app
|
|
85
86
|
|
|
87
|
+
### Note: Since v1.4.0 every lazy-loaded route is automatically wrapped in a Suspense boundary, using the nearest loading.tsx file as the fallback.
|
|
88
|
+
|
|
86
89
|
#### 1. Using createBrowserRouter (recommended for most users)
|
|
87
90
|
|
|
88
91
|
```typescript
|
|
@@ -105,9 +108,7 @@ function App() {
|
|
|
105
108
|
export default App;
|
|
106
109
|
```
|
|
107
110
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
### 2. using nested Route elements
|
|
111
|
+
### 2. Using nested Route elements
|
|
111
112
|
|
|
112
113
|
**Note** I will probably create a custom route provider using this version later since this is the only solution that works with VITE-SSR if you wrap client in `<BrowserRouter/>` and server in `<StaticRouter/>`
|
|
113
114
|
|
|
@@ -160,7 +161,7 @@ pages/about/index.tsx → "/about"
|
|
|
160
161
|
|
|
161
162
|
Wraps all sibling and nested routes. Children are rendered in an `<Outlet />`.
|
|
162
163
|
|
|
163
|
-
```
|
|
164
|
+
```tsx
|
|
164
165
|
// pages/admin/layout.tsx
|
|
165
166
|
import { Outlet } from "react-router-dom";
|
|
166
167
|
|
|
@@ -174,6 +175,18 @@ export default function AdminLayout() {
|
|
|
174
175
|
}
|
|
175
176
|
```
|
|
176
177
|
|
|
178
|
+
### `loading.tsx`
|
|
179
|
+
|
|
180
|
+
Folder level loading component <br>
|
|
181
|
+
Autmatically gets rendered instead of files waiting on lazy import
|
|
182
|
+
|
|
183
|
+
```tsx
|
|
184
|
+
// src/pages/test/loading.tsx
|
|
185
|
+
export default function Test() {
|
|
186
|
+
return <div>Loading...</div>;
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
177
190
|
### Slug files
|
|
178
191
|
|
|
179
192
|
Filenames wrapper in square brackets `[filename]` will resolve to a dynamic route
|
|
@@ -204,7 +217,7 @@ pages/about.tsx → "/about"
|
|
|
204
217
|
pages/blog/post.tsx → "/blog/post"
|
|
205
218
|
```
|
|
206
219
|
|
|
207
|
-
## Generated Routes File
|
|
220
|
+
<!-- ## Generated Routes File
|
|
208
221
|
|
|
209
222
|
The plugin generates a `routes.ts` file with all your routes:
|
|
210
223
|
|
|
@@ -231,7 +244,7 @@ const routes: RouteObject[] = [
|
|
|
231
244
|
];
|
|
232
245
|
|
|
233
246
|
export default routes;
|
|
234
|
-
```
|
|
247
|
+
``` -->
|
|
235
248
|
|
|
236
249
|
## Route Resolution Examples
|
|
237
250
|
|
|
@@ -265,6 +278,19 @@ export default function DashboardLayout() {
|
|
|
265
278
|
|
|
266
279
|
All routes in `src/pages/dashboard/*` will render inside this layout.
|
|
267
280
|
|
|
281
|
+
## Import Strategy
|
|
282
|
+
|
|
283
|
+
| File type | | | Import style | |
|
|
284
|
+
| ------------------------------------- | --- | --- | ------------- | --- |
|
|
285
|
+
| pages/\*.tsx (top level) | | | static import | |
|
|
286
|
+
| Files inside a folder with layout.tsx | | | Lazy loaded | |
|
|
287
|
+
| Files inside a folder without layout | | | Lazy loaded | |
|
|
288
|
+
| layout.tsx | | | Static import |
|
|
289
|
+
| loading.tsx | | | Static import |
|
|
290
|
+
---
|
|
291
|
+
Top-level pages are always statically imported for faster initial navigation.
|
|
292
|
+
All nested pages are lazy-loaded and wrapped in a Suspense boundary.
|
|
293
|
+
|
|
268
294
|
## FileLink component
|
|
269
295
|
|
|
270
296
|
The FileLink component is a type safe wrapper for the Link component in react router that uses an autogenerated type to check which routes are available.
|
|
@@ -276,18 +302,21 @@ React Router's normal Link still works in cases where type safety is less import
|
|
|
276
302
|
|
|
277
303
|
## Usage
|
|
278
304
|
|
|
305
|
+
If reades the type file that is automatically generated
|
|
306
|
+
|
|
307
|
+
`users/{string}` is what users/:slug gets translated to this means users/ allows any string after even if the route dosnt exist. Will look into better solution
|
|
308
|
+
|
|
279
309
|
```ts
|
|
280
310
|
// src/routeTypes.ts
|
|
281
311
|
// * AUTO GENERATED: DO NOT EDIT
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
export type FileRoutes = "/" | "test";
|
|
312
|
+
/
|
|
313
|
+
export type FileRoutes = "/" | "test" | "users/{string}";
|
|
285
314
|
```
|
|
286
315
|
|
|
287
316
|
```tsx
|
|
288
317
|
// src/pages/index.tsx
|
|
289
318
|
import { FileLink } from "aaex-file-router";
|
|
290
|
-
import type { FileRoutes } from "../routeTypes";
|
|
319
|
+
import type { FileRoutes } from "../routeTypes"; //import type
|
|
291
320
|
|
|
292
321
|
export default function Home() {
|
|
293
322
|
return (
|
|
@@ -302,6 +331,47 @@ export default function Home() {
|
|
|
302
331
|
}
|
|
303
332
|
```
|
|
304
333
|
|
|
334
|
+
## Generated files
|
|
335
|
+
|
|
336
|
+
### routes.ts
|
|
337
|
+
|
|
338
|
+
Generated route definition file
|
|
339
|
+
|
|
340
|
+
```ts
|
|
341
|
+
// src/routes.ts
|
|
342
|
+
...imports
|
|
343
|
+
export default routes = [
|
|
344
|
+
{
|
|
345
|
+
path: "/",
|
|
346
|
+
element: React.createElement(Index)},
|
|
347
|
+
{
|
|
348
|
+
path: "test",
|
|
349
|
+
element: React.createElement(TestLayout),
|
|
350
|
+
children:
|
|
351
|
+
[
|
|
352
|
+
{
|
|
353
|
+
path: "",
|
|
354
|
+
element: React.createElement(
|
|
355
|
+
React.Suspense,
|
|
356
|
+
{ fallback: React.createElement(TestLoading) },
|
|
357
|
+
React.createElement(React.lazy(() => import("./pages/test/index.tsx")))
|
|
358
|
+
)
|
|
359
|
+
},
|
|
360
|
+
...
|
|
361
|
+
]
|
|
362
|
+
}
|
|
363
|
+
]
|
|
364
|
+
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
### routeTypes.ts
|
|
368
|
+
|
|
369
|
+
Exports TypeScript union type of existing routes
|
|
370
|
+
|
|
371
|
+
```ts
|
|
372
|
+
export type FileRoutes = `/` | `test`;
|
|
373
|
+
```
|
|
374
|
+
|
|
305
375
|
## API Reference
|
|
306
376
|
|
|
307
377
|
### FileScanner
|
|
@@ -323,7 +393,7 @@ Converts file structure into React Router route configuration.
|
|
|
323
393
|
import { RouteGenerator } from "aaex-file-router/core";
|
|
324
394
|
|
|
325
395
|
const generator = new RouteGenerator();
|
|
326
|
-
const routesCode = await generator.
|
|
396
|
+
const routesCode = await generator.generateRoutesFile(fileData);
|
|
327
397
|
```
|
|
328
398
|
|
|
329
399
|
### aaexFileRouter (Vite Plugin)
|
|
@@ -8,22 +8,18 @@ interface FileNode {
|
|
|
8
8
|
export declare class RouteGenerator {
|
|
9
9
|
private topLevelImports;
|
|
10
10
|
private importSet;
|
|
11
|
-
/** Converts filenames/folders to URL-friendly paths, e.g., [id] -> :id */
|
|
12
11
|
private normalizeSegment;
|
|
13
|
-
|
|
12
|
+
private normalizeTypeSegment;
|
|
14
13
|
private toPascal;
|
|
15
|
-
/** Adds import statement for codegen, avoiding duplicates */
|
|
16
14
|
private addImport;
|
|
17
|
-
/** Generates PascalCase import name, handles nested index files */
|
|
18
15
|
private getImportName;
|
|
19
16
|
private createDirectoryRoute;
|
|
20
17
|
private createFileRoute;
|
|
21
|
-
/** Converts file tree to nested RouteConfig array */
|
|
22
18
|
private fileDataToRoutes;
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
19
|
+
private collectPaths;
|
|
20
|
+
private buildTypeUnion;
|
|
21
|
+
generateRoutesFile(fileData: FileNode[]): string;
|
|
22
|
+
generateTypesFile(fileData: FileNode[]): string;
|
|
27
23
|
}
|
|
28
24
|
export {};
|
|
29
25
|
//# sourceMappingURL=RouteGenerator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RouteGenerator.d.ts","sourceRoot":"","sources":["../../src/core/RouteGenerator.ts"],"names":[],"mappings":"AAMA,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;CACvB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,eAAe,CAAgB;IACvC,OAAO,CAAC,SAAS,CAA0B;
|
|
1
|
+
{"version":3,"file":"RouteGenerator.d.ts","sourceRoot":"","sources":["../../src/core/RouteGenerator.ts"],"names":[],"mappings":"AAMA,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;CACvB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,eAAe,CAAgB;IACvC,OAAO,CAAC,SAAS,CAA0B;IAG3C,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,QAAQ;IAMhB,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,oBAAoB;IA0C5B,OAAO,CAAC,eAAe;IA4BvB,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,YAAY;IA2BpB,OAAO,CAAC,cAAc;IAUf,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,MAAM;IAqBhD,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,MAAM;CASvD"}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
export class RouteGenerator {
|
|
2
2
|
topLevelImports = [];
|
|
3
|
-
importSet = new Set();
|
|
3
|
+
importSet = new Set();
|
|
4
4
|
// ---------------- Helpers ----------------
|
|
5
|
-
/** Converts filenames/folders to URL-friendly paths, e.g., [id] -> :id */
|
|
6
5
|
normalizeSegment(name) {
|
|
7
6
|
return name.replace(/\[([^\]]+)\]/g, ":$1").toLowerCase();
|
|
8
7
|
}
|
|
9
|
-
|
|
8
|
+
normalizeTypeSegment(name) {
|
|
9
|
+
return name.replace(/\[([^\]]+)\]/g, "{string}");
|
|
10
|
+
}
|
|
10
11
|
toPascal(str) {
|
|
11
12
|
return str
|
|
12
13
|
.replace(/\[|\]/g, "")
|
|
13
14
|
.replace(/(^\w|[-_]\w)/g, (m) => m.replace(/[-_]/, "").toUpperCase());
|
|
14
15
|
}
|
|
15
|
-
/** Adds import statement for codegen, avoiding duplicates */
|
|
16
16
|
addImport(file, importName) {
|
|
17
17
|
if (!this.importSet.has(file.relative_path)) {
|
|
18
18
|
const importPath = `./${file.relative_path.replace(/^src[\/\\]/, "")}`;
|
|
@@ -20,7 +20,6 @@ export class RouteGenerator {
|
|
|
20
20
|
this.importSet.add(file.relative_path);
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
|
-
/** Generates PascalCase import name, handles nested index files */
|
|
24
23
|
getImportName(file, parentPath) {
|
|
25
24
|
const nameWithoutExt = file.name.replace(/\.[jt]sx?$/, "");
|
|
26
25
|
if (nameWithoutExt.toLowerCase() === "index" && parentPath) {
|
|
@@ -32,23 +31,26 @@ export class RouteGenerator {
|
|
|
32
31
|
// ---------------- Route Creation ----------------
|
|
33
32
|
createDirectoryRoute(file) {
|
|
34
33
|
const route = { path: this.normalizeSegment(file.name) };
|
|
35
|
-
|
|
36
|
-
const layout = file.children?.find((f) => !f.isDirectory && /^layout\.(tsx|jsx|ts|js)$/i.test(f.name));
|
|
34
|
+
const layout = file.children?.find((f) => /^layout\.(tsx|jsx|ts|js)$/i.test(f.name));
|
|
37
35
|
if (layout) {
|
|
38
36
|
const importName = `${this.toPascal(file.name)}Layout`;
|
|
39
37
|
this.addImport(layout, importName);
|
|
40
38
|
route.element = `React.createElement(${importName})`;
|
|
41
39
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
40
|
+
const loadingFile = file.children?.find((f) => /^loading\.(tsx|jsx|ts|js)$/i.test(f.name));
|
|
41
|
+
let loadingName = null;
|
|
42
|
+
if (loadingFile) {
|
|
43
|
+
loadingName = this.getImportName(loadingFile, file.relative_path);
|
|
44
|
+
this.addImport(loadingFile, loadingName);
|
|
45
|
+
}
|
|
46
|
+
const children = file.children?.filter((f) => !/^layout\.(tsx|jsx|ts|js)$/i.test(f.name) &&
|
|
47
|
+
!/^loading\.(tsx|jsx|ts|js)$/i.test(f.name));
|
|
48
|
+
if (children?.length) {
|
|
49
|
+
route.children = this.fileDataToRoutes(children, route.path, true, loadingName);
|
|
48
50
|
}
|
|
49
51
|
return route;
|
|
50
52
|
}
|
|
51
|
-
createFileRoute(file, parentPath, isChild) {
|
|
53
|
+
createFileRoute(file, parentPath, isChild, folderLoadingName) {
|
|
52
54
|
const nameWithoutExt = file.name.replace(/\.[jt]sx?$/, "");
|
|
53
55
|
const isIndex = nameWithoutExt.toLowerCase() === "index";
|
|
54
56
|
let pathSegment = isIndex ? "" : this.normalizeSegment(nameWithoutExt);
|
|
@@ -56,58 +58,72 @@ export class RouteGenerator {
|
|
|
56
58
|
pathSegment = `${parentPath}/${pathSegment}`;
|
|
57
59
|
const importName = this.getImportName(file, parentPath);
|
|
58
60
|
this.addImport(file, importName);
|
|
59
|
-
|
|
61
|
+
const fallback = folderLoadingName
|
|
62
|
+
? `React.createElement(${folderLoadingName})`
|
|
63
|
+
: `React.createElement('div',null,'loading...')`;
|
|
64
|
+
const elementString = `React.createElement(React.Suspense, { fallback: ${fallback} }, React.createElement(React.lazy(() => import('./${file.relative_path.replace(/^src[\/\\]/, "")}'))))`;
|
|
65
|
+
return { path: pathSegment, element: elementString };
|
|
60
66
|
}
|
|
61
|
-
// ---------------- Recursion ----------------
|
|
62
|
-
|
|
63
|
-
fileDataToRoutes(files, parentPath = "", isChild = false) {
|
|
67
|
+
// ---------------- Route Recursion ----------------
|
|
68
|
+
fileDataToRoutes(files, parentPath = "", isChild = false, folderLoadingName = null) {
|
|
64
69
|
return files.map((file) => file.isDirectory
|
|
65
70
|
? this.createDirectoryRoute(file)
|
|
66
|
-
: this.createFileRoute(file, parentPath, isChild));
|
|
71
|
+
: this.createFileRoute(file, parentPath, isChild, folderLoadingName));
|
|
72
|
+
}
|
|
73
|
+
// ---------------- Type Helpers ----------------
|
|
74
|
+
collectPaths(files, prefix = "") {
|
|
75
|
+
let result = [];
|
|
76
|
+
for (const file of files) {
|
|
77
|
+
if (file.isDirectory) {
|
|
78
|
+
const newPrefix = `${prefix}/${this.normalizeTypeSegment(file.name)}`;
|
|
79
|
+
result.push(newPrefix);
|
|
80
|
+
if (file.children?.length) {
|
|
81
|
+
result.push(...this.collectPaths(file.children, newPrefix));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
const clean = file.name.replace(/\.[jt]sx?$/, "");
|
|
86
|
+
if (clean === "layout" || clean === "loading")
|
|
87
|
+
continue;
|
|
88
|
+
if (clean === "index") {
|
|
89
|
+
result.push(prefix || "/");
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
result.push(`${prefix}/${this.normalizeTypeSegment(clean)}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
buildTypeUnion(paths) {
|
|
99
|
+
const normalized = [...new Set(paths)]
|
|
100
|
+
.map((p) => p.replace(/\/+/g, "/"))
|
|
101
|
+
.map((p) => (p === "" ? "/" : p))
|
|
102
|
+
.sort();
|
|
103
|
+
return normalized.map((p) => ` | "${p}"`).join("\n");
|
|
67
104
|
}
|
|
68
|
-
// ----------------
|
|
69
|
-
|
|
70
|
-
async generateRoutesFile(fileData) {
|
|
105
|
+
// ---------------- PUBLIC METHODS ----------------
|
|
106
|
+
generateRoutesFile(fileData) {
|
|
71
107
|
this.topLevelImports = [];
|
|
72
108
|
this.importSet.clear();
|
|
73
109
|
const routes = this.fileDataToRoutes(fileData);
|
|
74
|
-
// Replace quotes around element strings with actual React code
|
|
75
|
-
const routesString = JSON.stringify(routes, null, 2).replace(/"React\.createElement\((\w+)\)"/g, "React.createElement($1)");
|
|
76
110
|
return `//* AUTO GENERATED: DO NOT EDIT
|
|
77
111
|
import React from 'react';
|
|
78
112
|
${this.topLevelImports.join("\n")}
|
|
79
113
|
import type { RouteObject } from 'react-router-dom';
|
|
80
114
|
|
|
81
|
-
const routes: RouteObject[] = ${
|
|
115
|
+
const routes: RouteObject[] = ${JSON.stringify(routes, null, 2).replace(/"React\.createElement\(([\s\S]*?)\)"/g, (_, inner) => `React.createElement(${inner})`)}
|
|
116
|
+
|
|
82
117
|
|
|
83
118
|
export default routes;
|
|
84
119
|
`;
|
|
85
120
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
const
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
const fullPath = parentPath
|
|
93
|
-
? `${parentPath}/${route.path}`.replace(/\/+/g, "/")
|
|
94
|
-
: route.path;
|
|
95
|
-
const tsPath = fullPath
|
|
96
|
-
.split("/")
|
|
97
|
-
.map((seg) => (seg.startsWith(":") ? "${string}" : seg))
|
|
98
|
-
.join("/");
|
|
99
|
-
paths.push(tsPath);
|
|
100
|
-
if (route.children)
|
|
101
|
-
collectPaths(route.children, fullPath);
|
|
102
|
-
}
|
|
103
|
-
};
|
|
104
|
-
collectPaths(routes);
|
|
105
|
-
const uniquePaths = Array.from(new Set(paths))
|
|
106
|
-
.map((p) => `\`${p}\``)
|
|
107
|
-
.join(" | ");
|
|
108
|
-
return `// * AUTO GENERATED: DO NOT EDIT
|
|
109
|
-
|
|
110
|
-
export type FileRoutes = ${uniquePaths};
|
|
121
|
+
generateTypesFile(fileData) {
|
|
122
|
+
const paths = this.collectPaths(fileData, "");
|
|
123
|
+
const union = this.buildTypeUnion(paths);
|
|
124
|
+
return `// AUTO-GENERATED: DO NOT EDIT
|
|
125
|
+
export type FileRoutes =
|
|
126
|
+
${union};
|
|
111
127
|
`;
|
|
112
128
|
}
|
|
113
129
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RouteGenerator.js","sourceRoot":"","sources":["../../src/core/RouteGenerator.ts"],"names":[],"mappings":"AAcA,MAAM,OAAO,cAAc;IACjB,eAAe,GAAa,EAAE,CAAC;IAC/B,SAAS,GAAgB,IAAI,GAAG,EAAE,CAAC
|
|
1
|
+
{"version":3,"file":"RouteGenerator.js","sourceRoot":"","sources":["../../src/core/RouteGenerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loading.d.ts","sourceRoot":"","sources":["../../../src/pages/test/loading.tsx"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,OAAO,4CAE9B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loading.js","sourceRoot":"","sources":["../../../src/pages/test/loading.tsx"],"names":[],"mappings":";AAAA,MAAM,CAAC,OAAO,UAAU,OAAO;IAC3B,OAAO,gDAAoB,CAAA;AAC/B,CAAC"}
|
package/dist/plugin/plugin.js
CHANGED
|
@@ -30,8 +30,8 @@ export function aaexFileRouter(options = {}) {
|
|
|
30
30
|
scanner = new FileScanner(pagesDir);
|
|
31
31
|
generator = new RouteGenerator();
|
|
32
32
|
const fileData = await scanner.get_file_data();
|
|
33
|
-
const routesCode =
|
|
34
|
-
const routesType =
|
|
33
|
+
const routesCode = generator.generateRoutesFile(fileData);
|
|
34
|
+
const routesType = generator.generateTypesFile(fileData);
|
|
35
35
|
// Write routes file
|
|
36
36
|
await fs.writeFile(outputFile, routesCode, "utf-8");
|
|
37
37
|
await fs.writeFile("src/routeTypes.ts", routesType, "utf-8");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin/plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAO3D;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,UAA6B,EAAE;IAC5D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,aAAa,CAAC;IACnD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,iBAAiB,CAAC;IAE3D,IAAI,OAAoB,CAAC;IACzB,IAAI,SAAyB,CAAC;IAE9B,OAAO;QACL,IAAI,EAAE,kBAAkB;QACxB,KAAK,EAAE,OAAO,EAAE,uBAAuB;QAEvC,cAAc;YACZ,OAAO,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;YACpC,SAAS,GAAG,IAAI,cAAc,EAAE,CAAC;QACnC,CAAC;QAED,KAAK,CAAC,eAAe,CAAC,MAAM;YAC1B,wCAAwC;YACxC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;YAE1D,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;gBACjD,4CAA4C;gBAC5C,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAC1C,IAAI,CAAC;wBACH,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,KAAK,QAAQ,EAAE,CAAC,CAAC;wBAE3D,oBAAoB;wBACpB,OAAO,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;wBACpC,SAAS,GAAG,IAAI,cAAc,EAAE,CAAC;wBAEjC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC;wBAC/C,MAAM,UAAU,GAAG,
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin/plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAO3D;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,UAA6B,EAAE;IAC5D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,aAAa,CAAC;IACnD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,iBAAiB,CAAC;IAE3D,IAAI,OAAoB,CAAC;IACzB,IAAI,SAAyB,CAAC;IAE9B,OAAO;QACL,IAAI,EAAE,kBAAkB;QACxB,KAAK,EAAE,OAAO,EAAE,uBAAuB;QAEvC,cAAc;YACZ,OAAO,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;YACpC,SAAS,GAAG,IAAI,cAAc,EAAE,CAAC;QACnC,CAAC;QAED,KAAK,CAAC,eAAe,CAAC,MAAM;YAC1B,wCAAwC;YACxC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;YAE1D,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;gBACjD,4CAA4C;gBAC5C,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAC1C,IAAI,CAAC;wBACH,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,KAAK,QAAQ,EAAE,CAAC,CAAC;wBAE3D,oBAAoB;wBACpB,OAAO,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;wBACpC,SAAS,GAAG,IAAI,cAAc,EAAE,CAAC;wBAEjC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC;wBAC/C,MAAM,UAAU,GAAG,SAAS,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;wBAC1D,MAAM,UAAU,GAAG,SAAS,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;wBAEzD,oBAAoB;wBACpB,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;wBACpD,MAAM,EAAE,CAAC,SAAS,CAAC,mBAAmB,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;wBAE7D,OAAO,CAAC,GAAG,CACT,8CAA8C,UAAU,EAAE,CAC3D,CAAC;oBACJ,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,OAAO,CAAC,KAAK,CACX,iDAAiD,EACjD,KAAK,CACN,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/test/index.js
CHANGED
|
@@ -11,9 +11,10 @@ async function generateRoutes() {
|
|
|
11
11
|
// console.log(fileData);
|
|
12
12
|
console.dir(fileData, { depth: null });
|
|
13
13
|
const generator = new RouteGenerator();
|
|
14
|
-
const routeMap =
|
|
14
|
+
const routeMap = generator.generateRoutesFile(fileData);
|
|
15
15
|
// console.log("Route map: ", routeMap)
|
|
16
|
-
|
|
16
|
+
const routType = generator.generateTypesFile(fileData);
|
|
17
|
+
console.log(routType);
|
|
17
18
|
// console.log(routeMap);
|
|
18
19
|
fs.writeFile("./src/test/output.ts", routeMap, "utf-8", (err) => {
|
|
19
20
|
if (err) {
|
package/dist/test/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,OAAO,EAAE,MAAM,IAAI,CAAA;AAEnB,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,QAAQ,GAAG,YAAY,CAAC;AAE9B,KAAK,UAAU,cAAc;IAC3B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC;QAE/C,yBAAyB;QAEzB,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAC,EAAC,KAAK,EAAC,IAAI,EAAC,CAAC,CAAC;QAEnC,MAAM,SAAS,GAAG,IAAI,cAAc,EAAE,CAAC;QACvC,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/test/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,OAAO,EAAE,MAAM,IAAI,CAAA;AAEnB,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,QAAQ,GAAG,YAAY,CAAC;AAE9B,KAAK,UAAU,cAAc;IAC3B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC;QAE/C,yBAAyB;QAEzB,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAC,EAAC,KAAK,EAAC,IAAI,EAAC,CAAC,CAAC;QAEnC,MAAM,SAAS,GAAG,IAAI,cAAc,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAI,SAAS,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAEzD,uCAAuC;QAEvC,MAAM,QAAQ,GAAI,SAAS,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAGtB,yBAAyB;QAEzB,EAAE,CAAC,SAAS,CAAC,sBAAsB,EAAC,QAAQ,EAAC,OAAO,EAAC,CAAC,GAAG,EAAC,EAAE;YAC1D,IAAI,GAAG,EAAE,CAAC;gBACR,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAEnB,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,cAAc,EAAE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aaex-file-router",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.1",
|
|
4
4
|
"description": "A file-based routing system for React projects that automatically generates routes from your file structure. Similar to Next.js App Router or Remix file conventions.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"scripts": {
|