rasengan 1.1.2 → 1.2.0-beta.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/CHANGELOG.md +10 -0
- package/lib/esm/cli/index.js +2 -2
- package/lib/esm/core/config/vite/defaults.js +1 -17
- package/lib/esm/core/dynamic/index.js +32 -0
- package/lib/esm/core/plugins/index.js +1 -1
- package/lib/esm/entries/client/render.js +45 -16
- package/lib/esm/entries/server/entry.server.js +1 -0
- package/lib/esm/entries/server/index.js +3 -3
- package/lib/esm/routing/components/fallback.js +8 -0
- package/lib/esm/routing/components/index.js +97 -6
- package/lib/esm/routing/components/template.js +8 -7
- package/lib/esm/routing/index.js +3 -3
- package/lib/esm/routing/providers/metadata.js +23 -13
- package/lib/esm/routing/utils/define-router.js +10 -6
- package/lib/esm/routing/utils/flat-routes.js +50 -78
- package/lib/esm/routing/utils/generate-routes.js +279 -178
- package/lib/esm/server/build/manifest.js +19 -7
- package/lib/esm/server/dev/handlers.js +16 -1
- package/lib/esm/server/dev/server.js +19 -1
- package/lib/esm/server/node/index.js +8 -2
- package/lib/tsconfig.esm.tsbuildinfo +1 -1
- package/lib/tsconfig.types.tsbuildinfo +1 -1
- package/lib/types/core/dynamic/index.d.ts +15 -0
- package/lib/types/core/types.d.ts +1 -1
- package/lib/types/entries/client/render.d.ts +3 -2
- package/lib/types/routing/components/fallback.d.ts +5 -0
- package/lib/types/routing/components/index.d.ts +11 -0
- package/lib/types/routing/components/template.d.ts +1 -1
- package/lib/types/routing/index.d.ts +3 -3
- package/lib/types/routing/interfaces.d.ts +5 -4
- package/lib/types/routing/providers/metadata.d.ts +1 -3
- package/lib/types/routing/types.d.ts +21 -3
- package/lib/types/routing/utils/define-routes-group.d.ts +1 -1
- package/lib/types/routing/utils/flat-routes.d.ts +21 -3
- package/lib/types/routing/utils/generate-routes.d.ts +6 -6
- package/lib/types/server/build/manifest.d.ts +4 -4
- package/package.json +2 -2
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { DefaultLayout } from '../components/template.js';
|
|
2
2
|
import { RouterComponent } from '../interfaces.js';
|
|
3
|
-
import { convertMDXPageToPageComponent, isMDXPage } from './define-router.js';
|
|
4
3
|
const basePath = '/src/app/_routes/';
|
|
5
4
|
/**
|
|
6
5
|
* Normalize a segment
|
|
@@ -29,7 +28,7 @@ function normalizeSegment(segment) {
|
|
|
29
28
|
* @param foldersOnly Whether to return only folders
|
|
30
29
|
* @returns Path segments
|
|
31
30
|
*/
|
|
32
|
-
function getPathSegments(filePath, foldersOnly = false) {
|
|
31
|
+
export function getPathSegments(filePath, foldersOnly = false) {
|
|
33
32
|
const relative = filePath.replace(basePath, ''); // eg. /src/app/_routes/docs/layout.tsx => docs/layout.tsx
|
|
34
33
|
if (!foldersOnly) {
|
|
35
34
|
let withoutExtension = '';
|
|
@@ -60,6 +59,7 @@ function generateSkeletonTree(tree, modules) {
|
|
|
60
59
|
segment: '_',
|
|
61
60
|
isLayout: true,
|
|
62
61
|
children: [],
|
|
62
|
+
source: '',
|
|
63
63
|
};
|
|
64
64
|
currentLevel.push(root);
|
|
65
65
|
currentLevel = root.children ?? []; // change level
|
|
@@ -71,9 +71,9 @@ function generateSkeletonTree(tree, modules) {
|
|
|
71
71
|
fullPath += '/' + segment;
|
|
72
72
|
}
|
|
73
73
|
else {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
74
|
+
if (fullPath === '') {
|
|
75
|
+
fullPath = '/';
|
|
76
|
+
}
|
|
77
77
|
}
|
|
78
78
|
const existing = tmpLevel.find((n) => n.segment === segment);
|
|
79
79
|
if (existing) {
|
|
@@ -86,6 +86,7 @@ function generateSkeletonTree(tree, modules) {
|
|
|
86
86
|
segment,
|
|
87
87
|
isLayout: false,
|
|
88
88
|
children: [],
|
|
89
|
+
source: '',
|
|
89
90
|
};
|
|
90
91
|
tmpLevel.push(node);
|
|
91
92
|
tmpLevel = node.children ?? []; // change level
|
|
@@ -99,9 +100,10 @@ function insertNodeToTree(tree, segments, routeInfo) {
|
|
|
99
100
|
// Handle the root layout
|
|
100
101
|
if (segments.length === 1 && segments[0] === '_') {
|
|
101
102
|
currentNode.isLayout = true;
|
|
102
|
-
currentNode.component = routeInfo.component;
|
|
103
|
+
currentNode.component = routeInfo.component; // Has to be considered in the case where the developer doesn't provide a layout
|
|
103
104
|
currentNode.metadata = routeInfo.metadata;
|
|
104
|
-
currentNode.
|
|
105
|
+
currentNode.module = routeInfo.module;
|
|
106
|
+
currentNode.source = routeInfo.source;
|
|
105
107
|
return;
|
|
106
108
|
}
|
|
107
109
|
let fullPath = '';
|
|
@@ -125,7 +127,8 @@ function insertNodeToTree(tree, segments, routeInfo) {
|
|
|
125
127
|
currentNode.isLayout = true;
|
|
126
128
|
currentNode.component = routeInfo.component;
|
|
127
129
|
currentNode.metadata = routeInfo.metadata;
|
|
128
|
-
currentNode.
|
|
130
|
+
currentNode.module = routeInfo.module;
|
|
131
|
+
currentNode.source = routeInfo.source;
|
|
129
132
|
}
|
|
130
133
|
else {
|
|
131
134
|
let path = '';
|
|
@@ -157,9 +160,8 @@ function insertNodeToTree(tree, segments, routeInfo) {
|
|
|
157
160
|
fullPath: fullPath + '/' + (lastSegment === '.' ? '' : lastSegment),
|
|
158
161
|
segment: lastSegment,
|
|
159
162
|
isLayout: false,
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
loader: routeInfo.loader,
|
|
163
|
+
module: routeInfo.module,
|
|
164
|
+
source: routeInfo.source,
|
|
163
165
|
};
|
|
164
166
|
currentLevel.push(node);
|
|
165
167
|
}
|
|
@@ -173,20 +175,27 @@ async function generateRouter(tree) {
|
|
|
173
175
|
const root = tree[0];
|
|
174
176
|
// Generate the base router
|
|
175
177
|
const router = new RouterComponent();
|
|
178
|
+
// use default layout if not defined
|
|
179
|
+
let layout;
|
|
176
180
|
// Get layout if defined
|
|
177
181
|
if (root.isLayout) {
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
182
|
+
if ('source' in root) {
|
|
183
|
+
layout = root;
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
layout = root.component;
|
|
187
|
+
layout.path = root.path;
|
|
188
|
+
layout.metadata = root.metadata;
|
|
189
|
+
}
|
|
184
190
|
}
|
|
185
191
|
// Get pages
|
|
186
192
|
const { routes: pages, routers } = await generateRoutes(root.children);
|
|
187
193
|
// Add pages to the router
|
|
188
194
|
router.pages = pages;
|
|
189
195
|
router.routers = routers;
|
|
196
|
+
// Add layout to the router
|
|
197
|
+
router.layout = layout;
|
|
198
|
+
router.useParentLayout = true;
|
|
190
199
|
return router;
|
|
191
200
|
}
|
|
192
201
|
/**
|
|
@@ -200,37 +209,26 @@ async function generateRoutes(tree) {
|
|
|
200
209
|
const routers = [];
|
|
201
210
|
for (const node of tree) {
|
|
202
211
|
// Handle page
|
|
203
|
-
if (!node.isLayout && node.
|
|
204
|
-
|
|
205
|
-
if (!page) {
|
|
206
|
-
console.warn(`Page component is not exported by default for route: ${node.path}`);
|
|
207
|
-
continue;
|
|
208
|
-
}
|
|
209
|
-
if (isMDXPage(page)) {
|
|
210
|
-
// Convert PageComponent to MDXPageComponent (to make ts happy)
|
|
211
|
-
const mdxPage = page;
|
|
212
|
-
mdxPage.metadata.path = node.path;
|
|
213
|
-
mdxPage.metadata.metadata = node.metadata;
|
|
214
|
-
const pageComponent = await convertMDXPageToPageComponent(mdxPage);
|
|
215
|
-
routes.push(pageComponent);
|
|
216
|
-
continue;
|
|
217
|
-
}
|
|
218
|
-
page.path = node.path;
|
|
219
|
-
page.metadata = node.metadata;
|
|
220
|
-
page.loader = node.loader;
|
|
221
|
-
routes.push(page);
|
|
212
|
+
if (!node.isLayout && node.module) {
|
|
213
|
+
routes.push(node);
|
|
222
214
|
continue;
|
|
223
215
|
}
|
|
224
216
|
// Handle layout
|
|
225
217
|
if (node.isLayout) {
|
|
226
|
-
|
|
227
|
-
if (
|
|
228
|
-
|
|
229
|
-
|
|
218
|
+
let layout;
|
|
219
|
+
if ('source' in node) {
|
|
220
|
+
layout = node;
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
layout = node.component;
|
|
224
|
+
if (!layout) {
|
|
225
|
+
console.warn(`Layout component is not defined for route: ${node.path}`);
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
layout.path = node.path;
|
|
229
|
+
layout.metadata = node.metadata;
|
|
230
|
+
layout.source = node.source;
|
|
230
231
|
}
|
|
231
|
-
layout.path = node.path;
|
|
232
|
-
layout.metadata = node.metadata;
|
|
233
|
-
layout.loader = node.loader;
|
|
234
232
|
if (node.children) {
|
|
235
233
|
// Loop through children
|
|
236
234
|
const { routes: subRoutes, routers: subRouters } = await generateRoutes(node.children);
|
|
@@ -270,19 +268,10 @@ async function generateRoutes(tree) {
|
|
|
270
268
|
export async function flatRoutes(fn) {
|
|
271
269
|
try {
|
|
272
270
|
let modules = fn();
|
|
273
|
-
// import.meta.glob can be undefined in some cases (because it's unavailable outside a vite env)
|
|
274
|
-
// if (import.meta.glob) {
|
|
275
|
-
// let modules = import.meta.glob(
|
|
276
|
-
// [
|
|
277
|
-
// '/src/app/_routes/**/layout.{jsx,tsx}',
|
|
278
|
-
// '/src/app/_routes/**/*.page.{md,mdx,jsx,tsx}',
|
|
279
|
-
// ],
|
|
280
|
-
// { eager: true }
|
|
281
|
-
// );
|
|
282
|
-
// }
|
|
283
271
|
const tree = [];
|
|
284
272
|
const foldersMap = new Map();
|
|
285
273
|
const modulesMap = new Map();
|
|
274
|
+
// Map the modules and extract segments for folders and modules (layouts and pages)
|
|
286
275
|
for (const [filePath, mod] of Object.entries(modules)) {
|
|
287
276
|
const foldersSegments = getPathSegments(filePath, true);
|
|
288
277
|
const modulesSegments = getPathSegments(filePath);
|
|
@@ -293,6 +282,7 @@ export async function flatRoutes(fn) {
|
|
|
293
282
|
generateSkeletonTree(tree, foldersMap);
|
|
294
283
|
// Filter out layouts
|
|
295
284
|
const layoutModulesMap = new Map([...modulesMap.entries()].filter(([filePath]) => filePath.includes('layout.')));
|
|
285
|
+
// Filter out pages
|
|
296
286
|
const pageModulesMap = new Map([...modulesMap.entries()].filter(([filePath]) => filePath.includes('.page.')));
|
|
297
287
|
// Handle the case where modules are empty
|
|
298
288
|
if (layoutModulesMap.size === 0) {
|
|
@@ -302,39 +292,20 @@ export async function flatRoutes(fn) {
|
|
|
302
292
|
isLayout: true,
|
|
303
293
|
});
|
|
304
294
|
}
|
|
295
|
+
// Insert every layout into the tree
|
|
305
296
|
for (const [filePath, { segments, mod }] of layoutModulesMap) {
|
|
306
|
-
if (!mod.default) {
|
|
307
|
-
console.warn(`Layout component is not exported by default from: ${filePath}}`);
|
|
308
|
-
continue;
|
|
309
|
-
}
|
|
310
|
-
let metadata = mod.default.metadata;
|
|
311
|
-
let loader = mod.default.loader;
|
|
312
297
|
insertNodeToTree(tree, segments, {
|
|
313
|
-
|
|
314
|
-
metadata: metadata ?? {},
|
|
315
|
-
loader,
|
|
298
|
+
module: mod, // Only present for lazy routes, instead prefer component attribute
|
|
316
299
|
isLayout: true,
|
|
300
|
+
source: filePath,
|
|
317
301
|
});
|
|
318
302
|
}
|
|
303
|
+
// Insert every pages into the tree
|
|
319
304
|
for (const [filePath, { segments, mod }] of pageModulesMap) {
|
|
320
|
-
if (!mod.default) {
|
|
321
|
-
console.warn(`Page component is not exported by default from: ${filePath}}`);
|
|
322
|
-
continue;
|
|
323
|
-
}
|
|
324
|
-
let metadata = mod.default.metadata;
|
|
325
|
-
let loader = mod.default.loader;
|
|
326
|
-
// extracting the metadata
|
|
327
|
-
if (isMDXPage(mod.default)) {
|
|
328
|
-
metadata = mod.default.metadata.metadata;
|
|
329
|
-
}
|
|
330
305
|
insertNodeToTree(tree, segments, {
|
|
331
|
-
|
|
332
|
-
metadata: metadata ?? {
|
|
333
|
-
title: mod.default.name,
|
|
334
|
-
description: '',
|
|
335
|
-
},
|
|
336
|
-
loader,
|
|
306
|
+
module: mod, // Only present for lazy routes, instead prefer component attribute
|
|
337
307
|
isLayout: false,
|
|
308
|
+
source: filePath,
|
|
338
309
|
});
|
|
339
310
|
}
|
|
340
311
|
// Convert the tree into a router component instance
|
|
@@ -343,6 +314,7 @@ export async function flatRoutes(fn) {
|
|
|
343
314
|
}
|
|
344
315
|
catch (error) {
|
|
345
316
|
console.error(error);
|
|
317
|
+
throw error;
|
|
346
318
|
// TODO: Handle error
|
|
347
319
|
}
|
|
348
320
|
}
|