aaex-file-router 1.2.1 → 1.3.0

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 CHANGED
@@ -2,9 +2,10 @@
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.2.1
5
+ ## V. 1.3.0
6
+ Routes are now able to be infinetly nested
6
7
 
7
- **Hotfix**: fixed all layouts importing as TestLayout now the layout for `pages/users/layout.tsx` gets imported as UsersLayout
8
+ **Notice** Onlyt tested 3 levels deep but there is no reason i shouldnt work further
8
9
 
9
10
  ## Features
10
11
 
@@ -7,21 +7,13 @@ export interface FileData {
7
7
  }
8
8
  export declare class FileScanner {
9
9
  page_dir: string;
10
- topLevelImports: string[];
11
10
  constructor(pages_dir: string);
12
11
  /**
13
- * Recursively scan directory and flatten all files/folders
14
- * Adds a parentPath property to each entry to track hierarchy
12
+ * Recursively scan directory and return nested FileData
15
13
  */
16
14
  private scan_files;
17
15
  /**
18
- * Convert flat Dirent array into nested FileData structure
19
- * Rebuilds directory hierarchy and filters children by parent path
20
- */
21
- private build_file_data;
22
- /**
23
- * Public entry point: scans pages directory and returns nested FileData structure
24
- * Handles both flat scanning and hierarchical rebuilding
16
+ * Public entry point: returns nested FileData structure
25
17
  */
26
18
  get_file_data(): Promise<FileData[]>;
27
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"FileScanner.d.ts","sourceRoot":"","sources":["../../src/core/FileScanner.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,QAAQ;IACvB,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,WAAW;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,EAAE,CAAM;gBAEnB,SAAS,EAAE,MAAM;IAI7B;;;OAGG;YACW,UAAU;IAmBxB;;;OAGG;YACW,eAAe;IA+C7B;;;OAGG;IACU,aAAa,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;CAOlD"}
1
+ {"version":3,"file":"FileScanner.d.ts","sourceRoot":"","sources":["../../src/core/FileScanner.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,QAAQ;IACvB,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,WAAW;IACtB,QAAQ,EAAE,MAAM,CAAC;gBAEL,SAAS,EAAE,MAAM;IAI7B;;OAEG;YACW,UAAU;IA0BxB;;OAEG;IACU,aAAa,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;CAKlD"}
@@ -2,80 +2,39 @@ import { promises as fs } from "node:fs";
2
2
  import path from "path";
3
3
  export class FileScanner {
4
4
  page_dir;
5
- topLevelImports = [];
6
5
  constructor(pages_dir) {
7
6
  this.page_dir = pages_dir;
8
7
  }
9
8
  /**
10
- * Recursively scan directory and flatten all files/folders
11
- * Adds a parentPath property to each entry to track hierarchy
9
+ * Recursively scan directory and return nested FileData
12
10
  */
13
11
  async scan_files(dir) {
14
12
  const entries = await fs.readdir(dir, { withFileTypes: true });
15
- let result = [];
13
+ const result = [];
16
14
  for (const entry of entries) {
17
- // Store parent directory path for later reference
18
- entry.parentPath = dir;
19
- result.push(entry);
20
- // Recursively scan subdirectories and flatten results
15
+ const fullPath = path.join(dir, entry.name);
16
+ const relativePath = path.relative(process.cwd(), fullPath).replace(/\\/g, "/");
17
+ const parentPath = path.relative(process.cwd(), dir).replace(/\\/g, "/") + "/";
18
+ const fileData = {
19
+ name: entry.name,
20
+ relative_path: relativePath,
21
+ parent_path: parentPath,
22
+ isDirectory: entry.isDirectory(),
23
+ };
21
24
  if (entry.isDirectory()) {
22
- const subFiles = await this.scan_files(path.join(dir, entry.name));
23
- result = result.concat(subFiles);
25
+ fileData.children = await this.scan_files(fullPath);
24
26
  }
27
+ result.push(fileData);
25
28
  }
26
29
  return result;
27
30
  }
28
31
  /**
29
- * Convert flat Dirent array into nested FileData structure
30
- * Rebuilds directory hierarchy and filters children by parent path
31
- */
32
- async build_file_data(files) {
33
- const result = [];
34
- for (const file of files) {
35
- const fullpath = path.join(file.parentPath, file.name);
36
- // Convert backslashes to forward slashes for cross-platform path consistency
37
- const relative = path
38
- .relative(process.cwd(), fullpath)
39
- .replace(/\\/g, "/")
40
- .trim();
41
- if (file.isDirectory()) {
42
- // Filter files to find only direct children of this directory
43
- const children = files.filter((file) => file.parentPath === fullpath);
44
- result.push({
45
- name: file.name,
46
- parent_path:
47
- // Normalize parent path with forward slashes and trailing slash
48
- path
49
- .relative(process.cwd(), file.parentPath)
50
- .replace(/\\/g, "/") + "/",
51
- relative_path: relative,
52
- isDirectory: true,
53
- children: await this.build_file_data(children),
54
- });
55
- continue;
56
- }
57
- result.push({
58
- name: file.name,
59
- parent_path:
60
- // Normalize parent path with forward slashes and trailing slash
61
- path
62
- .relative(process.cwd(), file.parentPath)
63
- .replace(/\\/g, "/") + "/",
64
- relative_path: relative,
65
- isDirectory: false,
66
- });
67
- }
68
- return result;
69
- }
70
- /**
71
- * Public entry point: scans pages directory and returns nested FileData structure
72
- * Handles both flat scanning and hierarchical rebuilding
32
+ * Public entry point: returns nested FileData structure
73
33
  */
74
34
  async get_file_data() {
75
- const raw = await this.scan_files(path.join(process.cwd(), this.page_dir));
76
- console.log("raw", raw);
77
- const result = await this.build_file_data(raw);
78
- return result;
35
+ const fullDir = path.join(process.cwd(), this.page_dir);
36
+ const data = await this.scan_files(fullDir);
37
+ return data;
79
38
  }
80
39
  }
81
40
  //# sourceMappingURL=FileScanner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FileScanner.js","sourceRoot":"","sources":["../../src/core/FileScanner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FileScanner.js","sourceRoot":"","sources":["../../src/core/FileScanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,IAAI,MAAM,MAAM,CAAC;AAUxB,MAAM,OAAO,WAAW;IACtB,QAAQ,CAAS;IAEjB,YAAY,SAAiB;QAC3B,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;IAC5B,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,UAAU,CAAC,GAAW;QAClC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAe,EAAE,CAAC;QAE9B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAChF,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC;YAE/E,MAAM,QAAQ,GAAa;gBACzB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,aAAa,EAAE,YAAY;gBAC3B,WAAW,EAAE,UAAU;gBACvB,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE;aACjC,CAAC;YAEF,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,QAAQ,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACtD,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxB,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,aAAa;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -1,27 +1,29 @@
1
- import { FileData } from "./FileScanner";
1
+ interface FileNode {
2
+ name: string;
3
+ relative_path: string;
4
+ parent_path: string;
5
+ isDirectory: boolean;
6
+ children?: FileNode[];
7
+ }
2
8
  export declare class RouteGenerator {
3
9
  private topLevelImports;
4
10
  private importSet;
5
- private processedFiles;
6
11
  /**
7
- * Recursively converts FileData tree into React Router RouteConfig array
8
- * Handles layout files, index files, and nested routes with proper pathing
9
- * @param fileData - Array of files/folders to process
10
- * @param parentPath - Current path context for nested routes (empty for root)
12
+ * Converts a FileData-like tree into React Router routes
13
+ * @param files - Array of file/folder objects passed externally
14
+ * @param parentPath - Current path for recursion
11
15
  */
12
16
  private fileDataToRoutes;
13
17
  /**
14
- * Generates a complete routes configuration file as a string
15
- * Includes all imports and route definitions in valid TypeScript/React code
16
- * @param fileData - FileData tree from FileScanner
17
- * @returns Complete routes file content ready to be written to disk
18
+ * Generates a React Router routes file as a string
19
+ * @param fileData - FileData-like tree
18
20
  */
19
- generateComponentsMap(fileData: FileData[]): Promise<string>;
21
+ generateRoutesFile(fileData: FileNode[]): Promise<string>;
20
22
  /**
21
- * Generates a TypeScript definition file exporting a union type of all route paths
22
- * @param fileData - FileData tree from FileScanner
23
- * @returns Type definition file content as string
23
+ * Generates TypeScript type definition for all route paths
24
+ * @param fileData - FileData-like tree
24
25
  */
25
- generateRoutesTypeDef(fileData: FileData[]): Promise<string>;
26
+ generateRoutesTypeDef(fileData: FileNode[]): Promise<string>;
26
27
  }
28
+ export {};
27
29
  //# sourceMappingURL=RouteGenerator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RouteGenerator.d.ts","sourceRoot":"","sources":["../../src/core/RouteGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AASzC,qBAAa,cAAc;IACzB,OAAO,CAAC,eAAe,CAAgB;IACvC,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,cAAc,CAA0B;IAEhD;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAmLxB;;;;;OAKG;IACU,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IA8BzE;;;;OAIG;IACU,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;CAuC1E"}
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;IAE3C;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAgGxB;;;OAGG;IACU,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAsBtE;;;OAGG;IACU,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;CA8B1E"}
@@ -1,145 +1,89 @@
1
1
  export class RouteGenerator {
2
2
  topLevelImports = [];
3
3
  importSet = new Set();
4
- processedFiles = new Set();
5
4
  /**
6
- * Recursively converts FileData tree into React Router RouteConfig array
7
- * Handles layout files, index files, and nested routes with proper pathing
8
- * @param fileData - Array of files/folders to process
9
- * @param parentPath - Current path context for nested routes (empty for root)
5
+ * Converts a FileData-like tree into React Router routes
6
+ * @param files - Array of file/folder objects passed externally
7
+ * @param parentPath - Current path for recursion
10
8
  */
11
- fileDataToRoutes(fileData, parentPath = "", flattenPrefix = "", inGroup = false) {
9
+ fileDataToRoutes(files, parentPath = "", isChild = false) {
12
10
  const routes = [];
13
- const processedIndexes = new Set();
14
- /** Converts `[slug]` → `:slug` */
15
- const normalizeDynamicSegment = (name) => name.replace(/\[([^\]]+)\]/g, ":$1");
16
- /**
17
- * Utility function to safely join path segments
18
- * - Filters out empty/falsy parts to avoid "///" in paths
19
- * - Joins with "/" separator
20
- * - Replaces all backslashes with forward slashes for cross-platform consistency
21
- * Example: posixJoin("test", "", "hello") -> "test/hello"
22
- * Example: posixJoin("pages\\test", "hello") -> "pages/test/hello"
23
- */
24
- const posixJoin = (...parts) => parts.filter(Boolean).join("/").replace(/\\/g, "/");
25
- /** Converts "user", "[id]" → "User", "Id" */
11
+ const normalizeSegment = (name) => name.replace(/\[([^\]]+)\]/g, ":$1").toLowerCase();
26
12
  const toPascal = (str) => str
27
13
  .replace(/\[|\]/g, "")
28
14
  .replace(/(^\w|[-_]\w)/g, (m) => m.replace(/[-_]/, "").toUpperCase());
29
- /** Build import name from parent folder + file */
30
- const getImportName = (file) => {
31
- const segments = file.relative_path.replace(/^src[\/\\]/, "").split("/");
32
- const parentFolder = segments.length > 1 ? segments[segments.length - 2] : "";
33
- const parentName = parentFolder ? toPascal(parentFolder) : "";
15
+ const getImportName = (file, parentPath) => {
34
16
  const nameWithoutExt = file.name.replace(/\.[jt]sx?$/, "");
35
- const fileNamePart = nameWithoutExt.toLowerCase() === "index"
36
- ? ""
37
- : toPascal(nameWithoutExt);
38
- return `${parentName}${fileNamePart}`;
39
- };
40
- /** Create route object (handles lazy vs top-level import) */
41
- const createRoute = (file, path, importName, lazy = false) => {
42
- const filePath = file.relative_path.replace(/^src[\/\\]/, "./");
43
- const element = lazy
44
- ? `React.createElement(React.lazy(() => import('${filePath}')))`
45
- : `React.createElement(${importName})`;
46
- return { path: normalizeDynamicSegment(path), element };
17
+ if (nameWithoutExt.toLowerCase() === "index" && parentPath) {
18
+ // Use parent folder prefix for nested index
19
+ const segments = parentPath.split("/").filter(Boolean);
20
+ return toPascal(segments.join("")) + "Index";
21
+ }
22
+ return toPascal(nameWithoutExt);
47
23
  };
48
- /** Recursive processing */
49
- const processFile = (file, currentParentPath, currentFlatten, group) => {
50
- //Already proccesed
51
- if (!file.isDirectory && this.processedFiles.has(file.relative_path))
52
- return;
53
- if (file.isDirectory && file.children?.length) {
54
- const layoutFile = file.children.find((c) => !c.isDirectory && /^layout\.(tsx|jsx|ts|js)$/i.test(c.name));
55
- if (!layoutFile) {
56
- const newFlatten = posixJoin(currentFlatten, file.name.toLowerCase());
57
- routes.push(...this.fileDataToRoutes(file.children, currentParentPath, newFlatten, false));
58
- return;
59
- }
60
- const layoutImportName = file.name.charAt(0).toUpperCase() + file.name.slice(1) + "Layout";
61
- const layoutPath = layoutFile.relative_path.replace(/^src[\/\\]/, "./");
62
- this.topLevelImports.push(`import ${layoutImportName} from '${layoutPath}';`);
63
- this.processedFiles.add(layoutFile.relative_path);
64
- const childRoutes = [];
65
- for (const child of file.children.filter((c) => !/^layout\.(tsx|jsx|ts|js)$/i.test(c.name))) {
66
- if (child.isDirectory) {
67
- processFile(child, posixJoin(currentParentPath, file.name), "", true);
24
+ for (const file of files) {
25
+ if (file.isDirectory) {
26
+ const layout = file.children?.find((f) => !f.isDirectory && /^layout\.(tsx|jsx|ts|js)$/i.test(f.name));
27
+ const route = {
28
+ path: normalizeSegment(file.name),
29
+ };
30
+ if (layout) {
31
+ const importName = `${toPascal(file.name)}Layout`;
32
+ const importPath = `./${layout.relative_path.replace(/^src[\/\\]/, "")}`;
33
+ if (!this.importSet.has(layout.relative_path)) {
34
+ this.topLevelImports.push(`import ${importName} from '${importPath}';`);
35
+ this.importSet.add(layout.relative_path);
68
36
  }
69
- else {
70
- const childNameWithoutExt = child.name.replace(/\.[jt]sx?$/, "");
71
- const path = childNameWithoutExt.toLowerCase() === "index"
72
- ? ""
73
- : normalizeDynamicSegment(childNameWithoutExt.toLowerCase());
74
- childRoutes.push(createRoute(child, path, undefined, true));
75
- this.processedFiles.add(child.relative_path);
37
+ route.element = `React.createElement(${importName})`;
38
+ }
39
+ if (file.children?.length) {
40
+ const children = file.children.filter((f) => !/^layout\.(tsx|jsx|ts|js)$/i.test(f.name));
41
+ if (children.length) {
42
+ // Pass true for isChild to make children paths relative
43
+ route.children = this.fileDataToRoutes(children, route.path, true);
76
44
  }
77
45
  }
78
- routes.push({
79
- path: normalizeDynamicSegment(file.name.toLowerCase()),
80
- element: `React.createElement(${layoutImportName})`,
81
- children: childRoutes.length ? childRoutes : undefined,
82
- });
83
- return;
84
- }
85
- // ---------------- FILES ----------------
86
- const nameWithoutExt = file.name.replace(/\.[jt]sx?$/, "");
87
- const isIndex = nameWithoutExt.toLowerCase() === "index";
88
- if (isIndex && processedIndexes.has(file.relative_path))
89
- return;
90
- if (fileData.some((f) => f.isDirectory &&
91
- f.name.toLowerCase() === nameWithoutExt.toLowerCase()) ||
92
- /^layout\.(tsx|jsx|ts|js)$/i.test(file.name)) {
93
- this.processedFiles.add(file.relative_path);
94
- return;
46
+ routes.push(route);
95
47
  }
96
- const rawSegment = isIndex ? "" : nameWithoutExt.toLowerCase();
97
- const fileSegment = normalizeDynamicSegment(rawSegment);
98
- let fullPath;
99
- if (currentFlatten)
100
- fullPath = posixJoin(currentFlatten, fileSegment);
101
- else if (group)
102
- fullPath = fileSegment;
103
- else if (currentParentPath)
104
- fullPath = posixJoin(currentParentPath, fileSegment);
105
- else
106
- fullPath = isIndex ? "/" : fileSegment;
107
- const importName = getImportName(file);
108
- if (group)
109
- routes.push(createRoute(file, fullPath, undefined, true));
110
48
  else {
49
+ const nameWithoutExt = file.name.replace(/\.[jt]sx?$/, "");
50
+ const isIndex = nameWithoutExt.toLowerCase() === "index";
51
+ // If child, path is relative; otherwise, top-level gets full path
52
+ let pathSegment = isIndex ? "" : normalizeSegment(nameWithoutExt);
53
+ if (isChild) {
54
+ // Children always use relative paths
55
+ pathSegment = pathSegment;
56
+ }
57
+ else {
58
+ pathSegment = parentPath
59
+ ? `${parentPath}/${pathSegment}`
60
+ : pathSegment;
61
+ }
62
+ const importName = getImportName(file, parentPath);
63
+ ;
64
+ const importPath = `./${file.relative_path.replace(/^src[\/\\]/, "")}`;
111
65
  if (!this.importSet.has(file.relative_path)) {
112
- this.topLevelImports.push(`import ${importName} from './${file.relative_path.replace(/^src[\/\\]/, "")}';`);
66
+ this.topLevelImports.push(`import ${importName} from '${importPath}';`);
113
67
  this.importSet.add(file.relative_path);
114
68
  }
115
- routes.push(createRoute(file, fullPath, importName));
69
+ routes.push({
70
+ path: pathSegment,
71
+ element: `React.createElement(${importName})`,
72
+ });
116
73
  }
117
- this.processedFiles.add(file.relative_path);
118
- if (isIndex)
119
- processedIndexes.add(file.relative_path);
120
- };
121
- for (const file of fileData)
122
- processFile(file, parentPath, flattenPrefix, inGroup);
74
+ }
123
75
  return routes;
124
76
  }
125
77
  /**
126
- * Generates a complete routes configuration file as a string
127
- * Includes all imports and route definitions in valid TypeScript/React code
128
- * @param fileData - FileData tree from FileScanner
129
- * @returns Complete routes file content ready to be written to disk
78
+ * Generates a React Router routes file as a string
79
+ * @param fileData - FileData-like tree
130
80
  */
131
- async generateComponentsMap(fileData) {
132
- // reset import & processed tracking each generation to avoid duplication across regen
81
+ async generateRoutesFile(fileData) {
133
82
  this.topLevelImports = [];
134
83
  this.importSet = new Set();
135
- this.processedFiles = new Set();
136
84
  const routes = this.fileDataToRoutes(fileData);
137
- const routesString = JSON.stringify(routes, null, 2)
138
- // lazy imports were serialized as strings, restore them to function calls
139
- .replace(/"React\.createElement\(React\.lazy\(\(\) => import\('(.*)'\)\)\)"/g, "React.createElement(React.lazy(() => import('$1')))")
140
- // React.createElement(Component) serialized as string, unquote it
141
- .replace(/"React\.createElement\((\w+)\)"/g, "React.createElement($1)");
142
- const mapString = `//* AUTO GENERATED: DO NOT EDIT
85
+ const routesString = JSON.stringify(routes, null, 2).replace(/"React\.createElement\((\w+)\)"/g, "React.createElement($1)");
86
+ return `//* AUTO GENERATED: DO NOT EDIT
143
87
  import React from 'react';
144
88
  ${this.topLevelImports.join("\n")}
145
89
  import type { RouteObject } from 'react-router-dom';
@@ -148,37 +92,31 @@ const routes: RouteObject[] = ${routesString};
148
92
 
149
93
  export default routes;
150
94
  `;
151
- return mapString;
152
95
  }
153
96
  /**
154
- * Generates a TypeScript definition file exporting a union type of all route paths
155
- * @param fileData - FileData tree from FileScanner
156
- * @returns Type definition file content as string
97
+ * Generates TypeScript type definition for all route paths
98
+ * @param fileData - FileData-like tree
157
99
  */
158
100
  async generateRoutesTypeDef(fileData) {
159
- // Reset state
160
- this.topLevelImports = [];
161
- this.importSet = new Set();
162
- this.processedFiles = new Set();
163
101
  const routes = this.fileDataToRoutes(fileData);
164
- const routePaths = [];
165
- const addRoute = (route, parentPath = "") => {
166
- const fullPath = parentPath
167
- ? `${parentPath}/${route.path}`.replace(/\/+/g, "/")
168
- : route.path;
169
- // Replace ":param" with ${string} for TypeScript type
170
- const tsPath = fullPath
171
- .split("/")
172
- .map((seg) => (seg.startsWith(":") ? "${string}" : seg))
173
- .join("/");
174
- routePaths.push(tsPath);
175
- if (route.children?.length) {
176
- route.children.forEach((child) => addRoute(child, fullPath));
102
+ const paths = [];
103
+ const collectPaths = (routes, parentPath = "") => {
104
+ for (const route of routes) {
105
+ const fullPath = parentPath
106
+ ? `${parentPath}/${route.path}`.replace(/\/+/g, "/")
107
+ : route.path;
108
+ const tsPath = fullPath
109
+ .split("/")
110
+ .map((seg) => (seg.startsWith(":") ? "${string}" : seg))
111
+ .join("/");
112
+ paths.push(tsPath);
113
+ if (route.children)
114
+ collectPaths(route.children, fullPath);
177
115
  }
178
116
  };
179
- routes.forEach((route) => addRoute(route));
180
- const uniquePaths = Array.from(new Set(routePaths))
181
- .map((p) => `\`${p}\``) // wrap in backticks for template literal types
117
+ collectPaths(routes);
118
+ const uniquePaths = Array.from(new Set(paths))
119
+ .map((p) => `\`${p}\``)
182
120
  .join(" | ");
183
121
  return `// * AUTO GENERATED: DO NOT EDIT
184
122
 
@@ -1 +1 @@
1
- {"version":3,"file":"RouteGenerator.js","sourceRoot":"","sources":["../../src/core/RouteGenerator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RouteGenerator.js","sourceRoot":"","sources":["../../src/core/RouteGenerator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export default function Boo(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=boo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boo.d.ts","sourceRoot":"","sources":["../../../../../src/pages/test/ba/baka/boo.tsx"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,GAAG,4CAE1B"}
@@ -0,0 +1,5 @@
1
+ import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
2
+ export default function Boo() {
3
+ return _jsx(_Fragment, { children: "hdue" });
4
+ }
5
+ //# sourceMappingURL=boo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boo.js","sourceRoot":"","sources":["../../../../../src/pages/test/ba/baka/boo.tsx"],"names":[],"mappings":";AAAA,MAAM,CAAC,OAAO,UAAU,GAAG;IACvB,OAAO,qCAAS,CAAA;AACpB,CAAC"}
package/dist/plugin.js CHANGED
@@ -30,7 +30,7 @@ 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 = await generator.generateComponentsMap(fileData);
33
+ const routesCode = await generator.generateRoutesFile(fileData);
34
34
  const routesType = await generator.generateRoutesTypeDef(fileData);
35
35
  // Write routes file
36
36
  await fs.writeFile(outputFile, routesCode, "utf-8");
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/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,uBAAuB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAO1D;;;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,MAAM,SAAS,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;wBACnE,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;wBAEnE,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"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/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,uBAAuB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAO1D;;;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,MAAM,SAAS,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;wBAChE,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;wBAEnE,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"}
@@ -1,19 +1,25 @@
1
1
  import { fileURLToPath } from "url";
2
2
  import { FileScanner } from "../core/FileScanner.js";
3
3
  import { RouteGenerator } from "../core/RouteGenerator.js";
4
+ import fs from "fs";
4
5
  const __filename = fileURLToPath(import.meta.url);
5
6
  const pagesDir = "/src/pages";
6
7
  async function generateRoutes() {
7
8
  try {
8
9
  const scanner = new FileScanner(pagesDir);
9
10
  const fileData = await scanner.get_file_data();
10
- console.log(fileData);
11
11
  // console.log(fileData);
12
+ console.dir(fileData, { depth: null });
12
13
  const generator = new RouteGenerator();
13
- const routeMap = await generator.generateComponentsMap(fileData);
14
+ const routeMap = await generator.generateRoutesFile(fileData);
14
15
  // console.log("Route map: ", routeMap)
15
- const routType = await generator.generateRoutesTypeDef(fileData);
16
- console.log(routeMap);
16
+ // const routType = await generator.generateRoutesTypeDef(fileData);
17
+ // console.log(routeMap);
18
+ fs.writeFile("./src/test/output.ts", routeMap, "utf-8", (err) => {
19
+ if (err) {
20
+ console.log(err);
21
+ }
22
+ });
17
23
  }
18
24
  catch (error) {
19
25
  console.error("Error generating routes:", error);
@@ -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;AAG3D,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,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEtB,yBAAyB;QAEzB,MAAM,SAAS,GAAG,IAAI,cAAc,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QAEjE,uCAAuC;QAEvC,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QAEjE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,cAAc,EAAE,CAAC"}
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,GAAG,MAAM,SAAS,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAE9D,uCAAuC;QAEvC,oEAAoE;QAEpE,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"}
@@ -0,0 +1,4 @@
1
+ import type { RouteObject } from 'react-router-dom';
2
+ declare const routes: RouteObject[];
3
+ export default routes;
4
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/test/output.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,QAAA,MAAM,MAAM,EAAE,WAAW,EAiCxB,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -0,0 +1,42 @@
1
+ //* AUTO GENERATED: DO NOT EDIT
2
+ import React from 'react';
3
+ import Pages from './pages/index.tsx';
4
+ import TestLayout from './pages/test/layout.tsx';
5
+ import BaMoo from './pages/test/ba/moo.tsx';
6
+ import UsersLayout from './pages/users/layout.tsx';
7
+ const routes = [
8
+ {
9
+ "path": "/",
10
+ "element": React.createElement(Pages)
11
+ },
12
+ {
13
+ "path": "test",
14
+ "element": React.createElement(TestLayout),
15
+ "children": [
16
+ {
17
+ "path": "about",
18
+ "element": React.createElement(React.lazy(() => import('./pages/test/about.tsx')))
19
+ },
20
+ {
21
+ "path": "",
22
+ "element": React.createElement(React.lazy(() => import('./pages/test/index.tsx')))
23
+ }
24
+ ]
25
+ },
26
+ {
27
+ "path": "ba/moo",
28
+ "element": React.createElement(BaMoo)
29
+ },
30
+ {
31
+ "path": "users",
32
+ "element": React.createElement(UsersLayout),
33
+ "children": [
34
+ {
35
+ "path": ":id",
36
+ "element": React.createElement(React.lazy(() => import('./pages/users/[id].tsx')))
37
+ }
38
+ ]
39
+ }
40
+ ];
41
+ export default routes;
42
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/test/output.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,MAAM,mBAAmB,CAAC;AACtC,OAAO,UAAU,MAAM,yBAAyB,CAAC;AACjD,OAAO,KAAK,MAAM,yBAAyB,CAAC;AAC5C,OAAO,WAAW,MAAM,0BAA0B,CAAC;AAGnD,MAAM,MAAM,GAAkB;IAC5B;QACE,MAAM,EAAE,GAAG;QACX,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC;KACtC;IACD;QACE,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC;QAC1C,UAAU,EAAE;YACV;gBACE,MAAM,EAAE,OAAO;gBACf,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAAC;aACnF;YACD;gBACE,MAAM,EAAE,EAAE;gBACV,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAAC;aACnF;SACF;KACF;IACD;QACE,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC;KACtC;IACD;QACE,MAAM,EAAE,OAAO;QACf,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC;QAC3C,UAAU,EAAE;YACV;gBACE,MAAM,EAAE,KAAK;gBACb,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAAC;aACnF;SACF;KACF;CACF,CAAC;AAEF,eAAe,MAAM,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aaex-file-router",
3
- "version": "1.2.1",
3
+ "version": "1.3.0",
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": {