react-fs-router 1.0.13 → 2.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 +721 -175
- package/dist/adapters/custom.d.ts +9 -0
- package/dist/adapters/custom.d.ts.map +1 -0
- package/dist/adapters/custom.js +11 -0
- package/dist/adapters/custom.js.map +1 -0
- package/dist/adapters/index.d.ts +8 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +14 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/react-router.d.ts +18 -0
- package/dist/adapters/react-router.d.ts.map +1 -0
- package/dist/adapters/react-router.js +58 -0
- package/dist/adapters/react-router.js.map +1 -0
- package/dist/adapters/tanstack.d.ts +16 -0
- package/dist/adapters/tanstack.d.ts.map +1 -0
- package/dist/adapters/tanstack.js +75 -0
- package/dist/adapters/tanstack.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +59 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +24 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +81 -0
- package/dist/config.js.map +1 -0
- package/dist/generator.d.ts +48 -0
- package/dist/generator.d.ts.map +1 -0
- package/dist/generator.js +272 -0
- package/dist/generator.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/render.d.ts +53 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +100 -0
- package/dist/render.js.map +1 -0
- package/dist/scanner.d.ts +27 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/scanner.js +38 -0
- package/dist/scanner.js.map +1 -0
- package/dist/tree.d.ts +11 -0
- package/dist/tree.d.ts.map +1 -0
- package/dist/tree.js +83 -0
- package/dist/tree.js.map +1 -0
- package/dist/types.d.ts +98 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/vite.d.ts +14 -0
- package/dist/vite.d.ts.map +1 -0
- package/dist/vite.js +33 -0
- package/dist/vite.js.map +1 -0
- package/dist/webpack.d.ts +32 -0
- package/dist/webpack.d.ts.map +1 -0
- package/dist/webpack.js +26 -0
- package/dist/webpack.js.map +1 -0
- package/package.json +103 -35
- package/.idea/git_toolbox_prj.xml +0 -15
- package/.idea/modules.xml +0 -8
- package/.idea/react-filesystem-router.iml +0 -12
- package/.idea/vcs.xml +0 -6
- package/genPath.js +0 -212
- package/index.js +0 -19
- package/lib/components/Routes.js +0 -0
- package/tsconfig.json +0 -7
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import { mkdirSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { basename, dirname, extname, normalize, relative } from "node:path";
|
|
3
|
+
import { scanDirectory } from "./tree.js";
|
|
4
|
+
/** Convert a file base name into a valid JS identifier. */
|
|
5
|
+
export function toIdentifier(file) {
|
|
6
|
+
const base = basename(file, extname(file));
|
|
7
|
+
const cleaned = base.replace(/[^A-Za-z0-9_$]/g, "_");
|
|
8
|
+
return /^[A-Za-z_$]/.test(cleaned) ? cleaned : "_" + cleaned;
|
|
9
|
+
}
|
|
10
|
+
/** Assign a unique, readable import identifier to every referenced file. */
|
|
11
|
+
export function buildFileRegistry(tree) {
|
|
12
|
+
const fileToId = new Map();
|
|
13
|
+
const used = new Set();
|
|
14
|
+
const register = (file) => {
|
|
15
|
+
if (fileToId.has(file))
|
|
16
|
+
return;
|
|
17
|
+
const base = toIdentifier(file);
|
|
18
|
+
let id = base;
|
|
19
|
+
let i = 1;
|
|
20
|
+
while (used.has(id))
|
|
21
|
+
id = `${base}${i++}`;
|
|
22
|
+
used.add(id);
|
|
23
|
+
fileToId.set(file, id);
|
|
24
|
+
};
|
|
25
|
+
const visit = (nodes) => {
|
|
26
|
+
for (const node of nodes) {
|
|
27
|
+
if (node.component)
|
|
28
|
+
register(node.component);
|
|
29
|
+
if (node.layout)
|
|
30
|
+
register(node.layout);
|
|
31
|
+
for (const fn of Object.values(node.functions))
|
|
32
|
+
register(fn);
|
|
33
|
+
for (const fn of Object.values(node.loaders))
|
|
34
|
+
register(fn);
|
|
35
|
+
visit(node.children);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
visit(tree);
|
|
39
|
+
return { fileToId };
|
|
40
|
+
}
|
|
41
|
+
/** Compute the import specifier for a file, relative to the generated file (or aliased). */
|
|
42
|
+
export function importSpecifier(file, config) {
|
|
43
|
+
const noExt = file.replace(/\.[^.]+$/, "");
|
|
44
|
+
if (config.importPrefix) {
|
|
45
|
+
const rel = normalize(relative(config.pages, noExt)).replace(/[\\/]/g, "/");
|
|
46
|
+
return `${config.importPrefix}/${rel}`.replace(/\/{2,}/g, "/");
|
|
47
|
+
}
|
|
48
|
+
const rel = normalize(relative(dirname(config.outFile), noExt)).replace(/[\\/]/g, "/");
|
|
49
|
+
return rel.startsWith(".") ? rel : `./${rel}`;
|
|
50
|
+
}
|
|
51
|
+
function toRouteMeta(node, config) {
|
|
52
|
+
return {
|
|
53
|
+
type: node.type,
|
|
54
|
+
path: node.path,
|
|
55
|
+
component: node.component ? importSpecifier(node.component, config) : null,
|
|
56
|
+
layout: node.layout ? importSpecifier(node.layout, config) : null,
|
|
57
|
+
functions: Object.fromEntries(Object.entries(node.functions).map(([name, file]) => [name, importSpecifier(file, config)])),
|
|
58
|
+
loaders: Object.fromEntries(Object.entries(node.loaders).map(([name, file]) => [name, importSpecifier(file, config)])),
|
|
59
|
+
children: node.children.map((child) => toRouteMeta(child, config)),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Split a formatted route path into segments. Dynamic segments start with
|
|
64
|
+
* ":" (react-router/custom) or "$" (tanstack); catch-all segments start with "*".
|
|
65
|
+
*/
|
|
66
|
+
export function parseRouteSegments(path) {
|
|
67
|
+
return path
|
|
68
|
+
.split("/")
|
|
69
|
+
.filter(Boolean)
|
|
70
|
+
.map((segment) => {
|
|
71
|
+
if (segment.startsWith(":") || segment.startsWith("$")) {
|
|
72
|
+
return { kind: "param", name: segment.slice(1) };
|
|
73
|
+
}
|
|
74
|
+
if (segment.startsWith("*")) {
|
|
75
|
+
return { kind: "catch", name: segment.slice(1) };
|
|
76
|
+
}
|
|
77
|
+
return { kind: "literal", name: segment };
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
/** Turn a segment into an uppercase object-key token ("about" -> "ABOUT"). */
|
|
81
|
+
export function segmentToken(segment) {
|
|
82
|
+
const raw = segment.name.toUpperCase().replace(/[^A-Z0-9]+/g, "_");
|
|
83
|
+
return raw.replace(/^_+|_+$/g, "");
|
|
84
|
+
}
|
|
85
|
+
/** Build an object key from path segments; the root index route is "HOME". */
|
|
86
|
+
export function routeKeyForSegments(segments) {
|
|
87
|
+
const key = segments.map(segmentToken).filter(Boolean).join("_");
|
|
88
|
+
return key || "HOME";
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Collect every addressable route (files and directories that have an index
|
|
92
|
+
* page) into `ROUTES` entries, skipping duplicate keys.
|
|
93
|
+
*/
|
|
94
|
+
export function routeMapEntries(tree) {
|
|
95
|
+
const entries = [];
|
|
96
|
+
const seen = new Set();
|
|
97
|
+
const visit = (nodes) => {
|
|
98
|
+
for (const node of nodes) {
|
|
99
|
+
const addressable = node.type === "file" || (node.type === "directory" && node.component !== null);
|
|
100
|
+
if (addressable) {
|
|
101
|
+
const segments = parseRouteSegments(node.path);
|
|
102
|
+
const key = routeKeyForSegments(segments);
|
|
103
|
+
if (!seen.has(key)) {
|
|
104
|
+
seen.add(key);
|
|
105
|
+
entries.push({
|
|
106
|
+
key,
|
|
107
|
+
path: node.path,
|
|
108
|
+
segments,
|
|
109
|
+
params: segments.filter((s) => s.kind !== "literal").map((s) => s.name),
|
|
110
|
+
hasCatch: segments.some((s) => s.kind === "catch"),
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
visit(node.children);
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
visit(tree);
|
|
118
|
+
return entries;
|
|
119
|
+
}
|
|
120
|
+
function routeMapValueSource(entry) {
|
|
121
|
+
if (entry.params.length === 0)
|
|
122
|
+
return JSON.stringify(entry.path);
|
|
123
|
+
const used = new Set();
|
|
124
|
+
const uniqueJsName = (name) => {
|
|
125
|
+
let id = name.replace(/[^A-Za-z0-9_$]/g, "_");
|
|
126
|
+
if (!/^[A-Za-z_$]/.test(id))
|
|
127
|
+
id = "_" + id;
|
|
128
|
+
while (used.has(id))
|
|
129
|
+
id += "_";
|
|
130
|
+
used.add(id);
|
|
131
|
+
return id;
|
|
132
|
+
};
|
|
133
|
+
let template = "/";
|
|
134
|
+
const args = [];
|
|
135
|
+
for (const segment of entry.segments) {
|
|
136
|
+
if (segment.kind === "literal") {
|
|
137
|
+
template += segment.name + "/";
|
|
138
|
+
}
|
|
139
|
+
else if (segment.kind === "param") {
|
|
140
|
+
const id = uniqueJsName(segment.name);
|
|
141
|
+
args.push(id);
|
|
142
|
+
template += "${" + id + "}/";
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
const id = uniqueJsName(segment.name);
|
|
146
|
+
args.push(`...${id}`);
|
|
147
|
+
template += "${" + id + ".join('/')}";
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
if (template.endsWith("/"))
|
|
151
|
+
template = template.slice(0, -1);
|
|
152
|
+
return `(${args.join(", ")}) => \`${template}\``;
|
|
153
|
+
}
|
|
154
|
+
/** Render the body of `export const ROUTES = { ... }` for the given entries. */
|
|
155
|
+
export function routeMapSource(entries) {
|
|
156
|
+
return entries
|
|
157
|
+
.map((entry) => `${JSON.stringify(entry.key)}: ${routeMapValueSource(entry)}`)
|
|
158
|
+
.join(",\n");
|
|
159
|
+
}
|
|
160
|
+
function routeEntrySource(node, registry) {
|
|
161
|
+
const component = node.component ? (registry.fileToId.get(node.component) ?? "null") : "null";
|
|
162
|
+
const layout = node.layout ? (registry.fileToId.get(node.layout) ?? "null") : "null";
|
|
163
|
+
const functions = Object.entries(node.functions)
|
|
164
|
+
.map(([name, file]) => `${JSON.stringify(name)}: ${registry.fileToId.get(file) ?? "null"}`)
|
|
165
|
+
.join(", ");
|
|
166
|
+
const loaders = Object.entries(node.loaders)
|
|
167
|
+
.map(([name, file]) => `${JSON.stringify(name)}: ${registry.fileToId.get(file) ?? "null"}`)
|
|
168
|
+
.join(", ");
|
|
169
|
+
const children = node.children.map((child) => routeEntrySource(child, registry)).join(", ");
|
|
170
|
+
return `{ type: ${JSON.stringify(node.type)}, path: ${JSON.stringify(node.path)}, component: ${component}, layout: ${layout}, functions: { ${functions} }, loaders: { ${loaders} }, children: [${children}] }`;
|
|
171
|
+
}
|
|
172
|
+
function importsSource(registry, config) {
|
|
173
|
+
return [...registry.fileToId.entries()]
|
|
174
|
+
.map(([file, id]) => `import ${id} from ${JSON.stringify(importSpecifier(file, config))};`)
|
|
175
|
+
.join("\n");
|
|
176
|
+
}
|
|
177
|
+
/** Generate the routes module source for the resolved config. */
|
|
178
|
+
export function generateRoutesModule(config) {
|
|
179
|
+
const tree = scanDirectory(config.pages, config);
|
|
180
|
+
const registry = buildFileRegistry(tree);
|
|
181
|
+
const routeEntries = tree.map((node) => routeEntrySource(node, registry)).join(",\n");
|
|
182
|
+
const routesMeta = JSON.stringify(tree.map((node) => toRouteMeta(node, config)), null, 2);
|
|
183
|
+
const imports = importsSource(registry, config);
|
|
184
|
+
const isReactRouter = config.adapter === "react-router";
|
|
185
|
+
const isTanstack = config.adapter === "tanstack-router";
|
|
186
|
+
// Data router (route objects) is the default; opt into the legacy declarative
|
|
187
|
+
// `<BrowserRouter>` component with `legacyBrowserRouter: true`.
|
|
188
|
+
const legacyBrowserRouter = config.legacyBrowserRouter;
|
|
189
|
+
const reactRouterImports = legacyBrowserRouter
|
|
190
|
+
? [
|
|
191
|
+
'import { FileSystemRouter, resolveRoutes } from "react-fs-router/render";',
|
|
192
|
+
'import { reactRouterAdapter, toRouteObjects } from "react-fs-router/adapters/react-router";',
|
|
193
|
+
'import type { RouteEntry } from "react-fs-router/render";',
|
|
194
|
+
]
|
|
195
|
+
: [
|
|
196
|
+
'import { FileSystemRouter, resolveRoutes } from "react-fs-router/render";',
|
|
197
|
+
'import { reactRouterDataAdapter, toDataRouterObjects } from "react-fs-router/adapters/react-router";',
|
|
198
|
+
'import type { RouteEntry } from "react-fs-router/render";',
|
|
199
|
+
];
|
|
200
|
+
const tanstackImports = [
|
|
201
|
+
'import { FileSystemRouter, resolveRoutes } from "react-fs-router/render";',
|
|
202
|
+
'import { tanstackRouterAdapter, toTanstackRouteTree } from "react-fs-router/adapters/tanstack";',
|
|
203
|
+
'import type { RouteEntry } from "react-fs-router/render";',
|
|
204
|
+
].join("\n");
|
|
205
|
+
const customImports = [
|
|
206
|
+
'import { FileSystemRouter } from "react-fs-router/render";',
|
|
207
|
+
'import type { RouteEntry, ResolvedRoute } from "react-fs-router/render";',
|
|
208
|
+
'import type { ReactNode } from "react";',
|
|
209
|
+
].join("\n");
|
|
210
|
+
const libImports = isReactRouter
|
|
211
|
+
? reactRouterImports.join("\n")
|
|
212
|
+
: isTanstack
|
|
213
|
+
? tanstackImports
|
|
214
|
+
: customImports;
|
|
215
|
+
const routesBlock = `const routes: RouteEntry[] = [\n${routeEntries}\n];`;
|
|
216
|
+
const routesMetaBlock = `export const routesMeta = ${routesMeta};`;
|
|
217
|
+
const routingMetaBlock = `export const routingMeta = ${JSON.stringify({
|
|
218
|
+
adapter: config.adapter,
|
|
219
|
+
ignorePrefix: config.ignorePrefix,
|
|
220
|
+
ignoreDotFiles: config.ignoreDotFiles,
|
|
221
|
+
ignore: config.ignore,
|
|
222
|
+
inheritLayout: config.inheritLayout,
|
|
223
|
+
legacyBrowserRouter: config.legacyBrowserRouter,
|
|
224
|
+
}, null, 2)};`;
|
|
225
|
+
// Standalone identifier so consumers can read the resolved ignore prefix
|
|
226
|
+
// (the leading character that marks a file as ignored) without parsing
|
|
227
|
+
// routingMeta.
|
|
228
|
+
const ignoreIdentifierBlock = `export const ignoreIdentifier = ${JSON.stringify(config.ignorePrefix)};`;
|
|
229
|
+
// Navigation map: static paths are constants, dynamic paths are functions
|
|
230
|
+
// that build the URL from their arguments (e.g. ROUTES.USERS_ID(14)).
|
|
231
|
+
const routesObjectBlock = `export const ROUTES = {\n${routeMapSource(routeMapEntries(tree))}\n} as const;`;
|
|
232
|
+
const inheritLayout = JSON.stringify(config.inheritLayout);
|
|
233
|
+
const reactRouterAdapterName = legacyBrowserRouter ? "reactRouterAdapter" : "reactRouterDataAdapter";
|
|
234
|
+
const defaultExport = isReactRouter
|
|
235
|
+
? `export default function Router() {\n return <FileSystemRouter routes={routes} inheritLayout={${inheritLayout}} adapter={${reactRouterAdapterName}} />;\n}`
|
|
236
|
+
: isTanstack
|
|
237
|
+
? `export default function Router() {\n return <FileSystemRouter routes={routes} inheritLayout={${inheritLayout}} adapter={tanstackRouterAdapter} />;\n}`
|
|
238
|
+
: `export default function Router({ renderRoutes }: { renderRoutes?: (routes: ResolvedRoute[]) => ReactNode }) {\n return <FileSystemRouter routes={routes} inheritLayout={${inheritLayout}} renderRoutes={renderRoutes} />;\n}`;
|
|
239
|
+
const routeObjectsConverter = legacyBrowserRouter ? "toRouteObjects" : "toDataRouterObjects";
|
|
240
|
+
const routeObjectsBlock = isReactRouter
|
|
241
|
+
? `export const routeObjects = ${routeObjectsConverter}(resolveRoutes(routes, ${inheritLayout}));`
|
|
242
|
+
: "";
|
|
243
|
+
const routeTreeBlock = isTanstack
|
|
244
|
+
? `export const routeTree = toTanstackRouteTree(resolveRoutes(routes, ${inheritLayout}));`
|
|
245
|
+
: "";
|
|
246
|
+
return [
|
|
247
|
+
"// Generated by react-fs-router. Do not edit.",
|
|
248
|
+
libImports,
|
|
249
|
+
imports,
|
|
250
|
+
"",
|
|
251
|
+
routesBlock,
|
|
252
|
+
"",
|
|
253
|
+
routesMetaBlock,
|
|
254
|
+
"",
|
|
255
|
+
routingMetaBlock,
|
|
256
|
+
ignoreIdentifierBlock,
|
|
257
|
+
routesObjectBlock,
|
|
258
|
+
routeObjectsBlock,
|
|
259
|
+
routeTreeBlock,
|
|
260
|
+
"",
|
|
261
|
+
defaultExport,
|
|
262
|
+
"",
|
|
263
|
+
].join("\n");
|
|
264
|
+
}
|
|
265
|
+
/** Generate the routes module and write it to disk. Returns the output file path. */
|
|
266
|
+
export function writeRoutes(config) {
|
|
267
|
+
const source = generateRoutesModule(config);
|
|
268
|
+
mkdirSync(dirname(config.outFile), { recursive: true });
|
|
269
|
+
writeFileSync(config.outFile, source, "utf8");
|
|
270
|
+
return config.outFile;
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from "./types.js";
|
|
2
|
+
export * from "./scanner.js";
|
|
3
|
+
export * from "./tree.js";
|
|
4
|
+
export * from "./config.js";
|
|
5
|
+
export * from "./generator.js";
|
|
6
|
+
export { FileSystemRouter, resolveRoute, resolveRoutes, wrapWithFunctions, } from "./render.js";
|
|
7
|
+
export type { RouteEntry, ResolvedRoute, RouteAdapter, RouteFunctionComponent, RouteDataFunction, } from "./render.js";
|
|
8
|
+
export { defineAdapter, getAdapter, hasAdapter } from "./adapters/index.js";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,UAAU,EACV,aAAa,EACb,YAAY,EACZ,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from "./types.js";
|
|
2
|
+
export * from "./scanner.js";
|
|
3
|
+
export * from "./tree.js";
|
|
4
|
+
export * from "./config.js";
|
|
5
|
+
export * from "./generator.js";
|
|
6
|
+
export { FileSystemRouter, resolveRoute, resolveRoutes, wrapWithFunctions, } from "./render.js";
|
|
7
|
+
export { defineAdapter, getAdapter, hasAdapter } from "./adapters/index.js";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAQrB,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/render.d.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { type ComponentType, type ReactNode } from "react";
|
|
2
|
+
/** A route function component wraps a page (and optionally its children). */
|
|
3
|
+
export type RouteFunctionComponent = ComponentType<{
|
|
4
|
+
children?: ReactNode;
|
|
5
|
+
}>;
|
|
6
|
+
/** A route data function (loader, action, ...) attached to a route. */
|
|
7
|
+
export type RouteDataFunction = (...args: any[]) => any;
|
|
8
|
+
/** Runtime route descriptor with concrete component references. */
|
|
9
|
+
export interface RouteEntry {
|
|
10
|
+
type: "file" | "directory";
|
|
11
|
+
path: string;
|
|
12
|
+
component: ComponentType | null;
|
|
13
|
+
layout: RouteFunctionComponent | null;
|
|
14
|
+
functions: Record<string, RouteFunctionComponent>;
|
|
15
|
+
loaders: Record<string, RouteDataFunction>;
|
|
16
|
+
children: RouteEntry[];
|
|
17
|
+
}
|
|
18
|
+
/** Router-agnostic composed route, ready for an adapter to render. */
|
|
19
|
+
export interface ResolvedRoute {
|
|
20
|
+
path: string;
|
|
21
|
+
index: boolean;
|
|
22
|
+
/** The page element (already wrapped with functions), or null for a pure group route. */
|
|
23
|
+
element: ReactNode | null;
|
|
24
|
+
/** Layout wrapper component, applied by the adapter around child routes. */
|
|
25
|
+
layout: RouteFunctionComponent | null;
|
|
26
|
+
/** Data functions (loader, action, ...) attached to this route. */
|
|
27
|
+
loaders: Record<string, RouteDataFunction>;
|
|
28
|
+
children: ResolvedRoute[];
|
|
29
|
+
}
|
|
30
|
+
/** An adapter renders a resolved route tree into router-specific output. */
|
|
31
|
+
export type RouteAdapter = ComponentType<{
|
|
32
|
+
routes: ResolvedRoute[];
|
|
33
|
+
}>;
|
|
34
|
+
/** Wrap an element with the given route functions (in insertion order). */
|
|
35
|
+
export declare function wrapWithFunctions(functions: Record<string, RouteFunctionComponent>, element: ReactNode | null): ReactNode | null;
|
|
36
|
+
/** Compose a single route entry into a router-agnostic resolved route. */
|
|
37
|
+
export declare function resolveRoute(entry: RouteEntry, inheritLayout?: boolean): ResolvedRoute;
|
|
38
|
+
/** Compose a list of route entries into resolved routes. */
|
|
39
|
+
export declare function resolveRoutes(entries: RouteEntry[], inheritLayout?: boolean): ResolvedRoute[];
|
|
40
|
+
export interface FileSystemRouterProps {
|
|
41
|
+
routes: RouteEntry[];
|
|
42
|
+
adapter?: RouteAdapter;
|
|
43
|
+
renderRoutes?: (routes: ResolvedRoute[]) => ReactNode;
|
|
44
|
+
/** Whether parent layouts cascade to layout-less descendants. Default: true. */
|
|
45
|
+
inheritLayout?: boolean;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* The single component users drop into their routing solution. It resolves the
|
|
49
|
+
* route tree and hands it to the configured adapter (or a custom `renderRoutes`
|
|
50
|
+
* callback for any other toolchain).
|
|
51
|
+
*/
|
|
52
|
+
export declare function FileSystemRouter({ routes, adapter: Adapter, renderRoutes, inheritLayout, }: FileSystemRouterProps): ReactNode;
|
|
53
|
+
//# sourceMappingURL=render.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEpF,6EAA6E;AAC7E,MAAM,MAAM,sBAAsB,GAAG,aAAa,CAAC;IAAE,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,CAAC,CAAC;AAE7E,uEAAuE;AACvE,MAAM,MAAM,iBAAiB,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;AAExD,mEAAmE;AACnE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,aAAa,GAAG,IAAI,CAAC;IAChC,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAAC;IACtC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IAClD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC3C,QAAQ,EAAE,UAAU,EAAE,CAAC;CACxB;AAED,sEAAsE;AACtE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,yFAAyF;IACzF,OAAO,EAAE,SAAS,GAAG,IAAI,CAAC;IAC1B,4EAA4E;IAC5E,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAAC;IACtC,mEAAmE;IACnE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC3C,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,4EAA4E;AAC5E,MAAM,MAAM,YAAY,GAAG,aAAa,CAAC;IAAE,MAAM,EAAE,aAAa,EAAE,CAAA;CAAE,CAAC,CAAC;AAEtE,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,EACjD,OAAO,EAAE,SAAS,GAAG,IAAI,GACxB,SAAS,GAAG,IAAI,CAMlB;AA2FD,0EAA0E;AAC1E,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,UAAO,GAAG,aAAa,CAEnF;AAED,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,aAAa,UAAO,GAAG,aAAa,EAAE,CAO1F;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,SAAS,CAAC;IACtD,gFAAgF;IAChF,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,OAAO,EAAE,OAAO,EAChB,YAAY,EACZ,aAAoB,GACrB,EAAE,qBAAqB,GAAG,SAAS,CASnC"}
|
package/dist/render.js
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { Fragment, createElement } from "react";
|
|
2
|
+
/** Wrap an element with the given route functions (in insertion order). */
|
|
3
|
+
export function wrapWithFunctions(functions, element) {
|
|
4
|
+
if (element === null || element === undefined)
|
|
5
|
+
return null;
|
|
6
|
+
return Object.entries(functions).reduce((acc, [name, Component]) => createElement(Component, { key: name }, acc), element);
|
|
7
|
+
}
|
|
8
|
+
/** Wrap an element in a layout component, if one is provided. */
|
|
9
|
+
function wrapWithLayout(layout, element) {
|
|
10
|
+
if (element === null || element === undefined)
|
|
11
|
+
return null;
|
|
12
|
+
return layout ? createElement(layout, null, element) : element;
|
|
13
|
+
}
|
|
14
|
+
function resolveEntry(entry, inheritLayout, inheritedLayout) {
|
|
15
|
+
if (entry.type === "file") {
|
|
16
|
+
return {
|
|
17
|
+
route: {
|
|
18
|
+
path: entry.path,
|
|
19
|
+
index: false,
|
|
20
|
+
element: wrapWithFunctions(entry.functions, entry.component ? createElement(entry.component) : null),
|
|
21
|
+
layout: entry.layout,
|
|
22
|
+
loaders: entry.loaders,
|
|
23
|
+
children: [],
|
|
24
|
+
},
|
|
25
|
+
hoisted: [],
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
const ownLayout = entry.layout;
|
|
29
|
+
// The layout that wraps this directory's own page (and, when inheritance is
|
|
30
|
+
// enabled, its non-overriding descendants).
|
|
31
|
+
const effectiveLayout = ownLayout ?? (inheritLayout ? inheritedLayout : null);
|
|
32
|
+
const nested = [];
|
|
33
|
+
const hoisted = [];
|
|
34
|
+
for (const child of entry.children) {
|
|
35
|
+
const result = resolveEntry(child, inheritLayout, effectiveLayout);
|
|
36
|
+
// A descendant directory that defines its own layout overrides the current
|
|
37
|
+
// directory's layout, so it escapes the layout wrapper by becoming a sibling.
|
|
38
|
+
if (inheritLayout && result.route.layout !== null && effectiveLayout !== null) {
|
|
39
|
+
hoisted.push(result.route, ...result.hoisted);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
nested.push(result.route);
|
|
43
|
+
hoisted.push(...result.hoisted);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const indexElement = entry.component
|
|
47
|
+
? wrapWithFunctions(entry.functions, createElement(entry.component))
|
|
48
|
+
: null;
|
|
49
|
+
// When inheritance is enabled this directory's layout wraps its children via
|
|
50
|
+
// an outlet; otherwise the layout only wraps its own index page.
|
|
51
|
+
const wrapsChildren = inheritLayout && ownLayout !== null;
|
|
52
|
+
const indexChild = indexElement
|
|
53
|
+
? {
|
|
54
|
+
path: "",
|
|
55
|
+
index: true,
|
|
56
|
+
element: wrapsChildren ? indexElement : wrapWithLayout(ownLayout, indexElement),
|
|
57
|
+
layout: null,
|
|
58
|
+
loaders: entry.loaders,
|
|
59
|
+
children: [],
|
|
60
|
+
}
|
|
61
|
+
: null;
|
|
62
|
+
return {
|
|
63
|
+
route: {
|
|
64
|
+
path: entry.path,
|
|
65
|
+
index: false,
|
|
66
|
+
element: null,
|
|
67
|
+
layout: wrapsChildren ? ownLayout : null,
|
|
68
|
+
loaders: indexChild ? {} : entry.loaders,
|
|
69
|
+
children: indexChild ? [indexChild, ...nested] : nested,
|
|
70
|
+
},
|
|
71
|
+
hoisted,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/** Compose a single route entry into a router-agnostic resolved route. */
|
|
75
|
+
export function resolveRoute(entry, inheritLayout = true) {
|
|
76
|
+
return resolveEntry(entry, inheritLayout, null).route;
|
|
77
|
+
}
|
|
78
|
+
/** Compose a list of route entries into resolved routes. */
|
|
79
|
+
export function resolveRoutes(entries, inheritLayout = true) {
|
|
80
|
+
const resolved = [];
|
|
81
|
+
for (const entry of entries) {
|
|
82
|
+
const result = resolveEntry(entry, inheritLayout, null);
|
|
83
|
+
resolved.push(result.route, ...result.hoisted);
|
|
84
|
+
}
|
|
85
|
+
return resolved;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* The single component users drop into their routing solution. It resolves the
|
|
89
|
+
* route tree and hands it to the configured adapter (or a custom `renderRoutes`
|
|
90
|
+
* callback for any other toolchain).
|
|
91
|
+
*/
|
|
92
|
+
export function FileSystemRouter({ routes, adapter: Adapter, renderRoutes, inheritLayout = true, }) {
|
|
93
|
+
const resolved = resolveRoutes(routes, inheritLayout);
|
|
94
|
+
if (renderRoutes)
|
|
95
|
+
return createElement(Fragment, null, renderRoutes(resolved));
|
|
96
|
+
if (Adapter)
|
|
97
|
+
return createElement(Adapter, { routes: resolved });
|
|
98
|
+
throw new Error("[react-fs-router] FileSystemRouter requires an `adapter` or a `renderRoutes` prop.");
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { PathFormatter } from "./types.js";
|
|
2
|
+
export interface ParsedFileName {
|
|
3
|
+
/** Base name without extension, e.g. "index" or "[id]". */
|
|
4
|
+
name: string;
|
|
5
|
+
/** Extension including the leading dot, e.g. ".tsx" or "". */
|
|
6
|
+
ext: string;
|
|
7
|
+
}
|
|
8
|
+
export interface IgnoreOptions {
|
|
9
|
+
ignorePrefix: string;
|
|
10
|
+
ignoreDotFiles: boolean;
|
|
11
|
+
ignore: string[];
|
|
12
|
+
}
|
|
13
|
+
/** Split a file name into its base name and extension. */
|
|
14
|
+
export declare function parseFileName(fileName: string): ParsedFileName;
|
|
15
|
+
/** Whether a file base name represents an index route. */
|
|
16
|
+
export declare function isIndexName(name: string): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Convert a raw file/directory name into a route segment using the given
|
|
19
|
+
* formatter. "[id]" -> formatter.dynamic("id"), "[...rest]" ->
|
|
20
|
+
* formatter.catchAll("rest"), and anything else is passed through.
|
|
21
|
+
*/
|
|
22
|
+
export declare function toRouteSegment(name: string, formatter: PathFormatter): string;
|
|
23
|
+
/** Whether a file/directory name should be skipped based on the ignore options. */
|
|
24
|
+
export declare function isIgnoredName(fileName: string, options: IgnoreOptions): boolean;
|
|
25
|
+
/** Whether a file has one of the supported extensions. */
|
|
26
|
+
export declare function isSupportedFile(fileName: string, extensions: string[]): boolean;
|
|
27
|
+
//# sourceMappingURL=scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC7B,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,0DAA0D;AAC1D,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAI9D;AAED,0DAA0D;AAC1D,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,GAAG,MAAM,CAO7E;AAED,mFAAmF;AACnF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAI/E;AAED,0DAA0D;AAC1D,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAE/E"}
|
package/dist/scanner.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/** Split a file name into its base name and extension. */
|
|
2
|
+
export function parseFileName(fileName) {
|
|
3
|
+
const dot = fileName.lastIndexOf(".");
|
|
4
|
+
if (dot <= 0)
|
|
5
|
+
return { name: fileName, ext: "" };
|
|
6
|
+
return { name: fileName.slice(0, dot), ext: fileName.slice(dot) };
|
|
7
|
+
}
|
|
8
|
+
/** Whether a file base name represents an index route. */
|
|
9
|
+
export function isIndexName(name) {
|
|
10
|
+
return name === "index";
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Convert a raw file/directory name into a route segment using the given
|
|
14
|
+
* formatter. "[id]" -> formatter.dynamic("id"), "[...rest]" ->
|
|
15
|
+
* formatter.catchAll("rest"), and anything else is passed through.
|
|
16
|
+
*/
|
|
17
|
+
export function toRouteSegment(name, formatter) {
|
|
18
|
+
if (name.startsWith("[") && name.endsWith("]")) {
|
|
19
|
+
const inner = name.slice(1, -1);
|
|
20
|
+
if (inner.startsWith("..."))
|
|
21
|
+
return formatter.catchAll(inner.slice(3));
|
|
22
|
+
return formatter.dynamic(inner);
|
|
23
|
+
}
|
|
24
|
+
return name;
|
|
25
|
+
}
|
|
26
|
+
/** Whether a file/directory name should be skipped based on the ignore options. */
|
|
27
|
+
export function isIgnoredName(fileName, options) {
|
|
28
|
+
if (options.ignorePrefix && fileName.startsWith(options.ignorePrefix))
|
|
29
|
+
return true;
|
|
30
|
+
if (options.ignoreDotFiles && fileName.startsWith("."))
|
|
31
|
+
return true;
|
|
32
|
+
return options.ignore.includes(fileName);
|
|
33
|
+
}
|
|
34
|
+
/** Whether a file has one of the supported extensions. */
|
|
35
|
+
export function isSupportedFile(fileName, extensions) {
|
|
36
|
+
return extensions.includes(parseFileName(fileName).ext);
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"AAeA,0DAA0D;AAC1D,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;IACjD,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;AACpE,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,IAAI,KAAK,OAAO,CAAC;AAC1B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,SAAwB;IACnE,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACvE,OAAO,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,OAAsB;IACpE,IAAI,OAAO,CAAC,YAAY,IAAI,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IACnF,IAAI,OAAO,CAAC,cAAc,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACpE,OAAO,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC3C,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,UAAoB;IACpE,OAAO,UAAU,CAAC,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;AAC1D,CAAC"}
|
package/dist/tree.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ResolvedConfig, RouteNode } from "./types.js";
|
|
2
|
+
/** Join a base route path with a segment, normalizing the leading slash. */
|
|
3
|
+
export declare function joinPath(base: string, segment: string): string;
|
|
4
|
+
/**
|
|
5
|
+
* Recursively scan a pages directory and build the route tree.
|
|
6
|
+
* Directories define hierarchy, index files define the directory's page,
|
|
7
|
+
* layout (and other mapped functions) are attached as add-ons, and other
|
|
8
|
+
* files become leaf routes.
|
|
9
|
+
*/
|
|
10
|
+
export declare function scanDirectory(pages: string, config: ResolvedConfig): RouteNode[];
|
|
11
|
+
//# sourceMappingURL=tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../src/tree.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAS5D,4EAA4E;AAC5E,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAG9D;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,SAAS,EAAE,CAEhF"}
|