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.
Files changed (37) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/lib/esm/cli/index.js +2 -2
  3. package/lib/esm/core/config/vite/defaults.js +1 -17
  4. package/lib/esm/core/dynamic/index.js +32 -0
  5. package/lib/esm/core/plugins/index.js +1 -1
  6. package/lib/esm/entries/client/render.js +45 -16
  7. package/lib/esm/entries/server/entry.server.js +1 -0
  8. package/lib/esm/entries/server/index.js +3 -3
  9. package/lib/esm/routing/components/fallback.js +8 -0
  10. package/lib/esm/routing/components/index.js +97 -6
  11. package/lib/esm/routing/components/template.js +8 -7
  12. package/lib/esm/routing/index.js +3 -3
  13. package/lib/esm/routing/providers/metadata.js +23 -13
  14. package/lib/esm/routing/utils/define-router.js +10 -6
  15. package/lib/esm/routing/utils/flat-routes.js +50 -78
  16. package/lib/esm/routing/utils/generate-routes.js +279 -178
  17. package/lib/esm/server/build/manifest.js +19 -7
  18. package/lib/esm/server/dev/handlers.js +16 -1
  19. package/lib/esm/server/dev/server.js +19 -1
  20. package/lib/esm/server/node/index.js +8 -2
  21. package/lib/tsconfig.esm.tsbuildinfo +1 -1
  22. package/lib/tsconfig.types.tsbuildinfo +1 -1
  23. package/lib/types/core/dynamic/index.d.ts +15 -0
  24. package/lib/types/core/types.d.ts +1 -1
  25. package/lib/types/entries/client/render.d.ts +3 -2
  26. package/lib/types/routing/components/fallback.d.ts +5 -0
  27. package/lib/types/routing/components/index.d.ts +11 -0
  28. package/lib/types/routing/components/template.d.ts +1 -1
  29. package/lib/types/routing/index.d.ts +3 -3
  30. package/lib/types/routing/interfaces.d.ts +5 -4
  31. package/lib/types/routing/providers/metadata.d.ts +1 -3
  32. package/lib/types/routing/types.d.ts +21 -3
  33. package/lib/types/routing/utils/define-routes-group.d.ts +1 -1
  34. package/lib/types/routing/utils/flat-routes.d.ts +21 -3
  35. package/lib/types/routing/utils/generate-routes.d.ts +6 -6
  36. package/lib/types/server/build/manifest.d.ts +4 -4
  37. 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
- // if (fullPath === '') {
75
- // fullPath = '/';
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.loader = routeInfo.loader;
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.loader = routeInfo.loader;
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
- component: routeInfo.component,
161
- metadata: routeInfo.metadata,
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
- // use default layout if not defined
179
- const layout = (root.component || DefaultLayout);
180
- layout.path = root.path || DefaultLayout.path;
181
- // TODO: Add metadata here
182
- router.layout = layout;
183
- router.useParentLayout = true;
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.component) {
204
- const page = node.component;
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
- const layout = node.component;
227
- if (!layout) {
228
- console.warn(`Layout component is not defined for route: ${node.path}`);
229
- continue;
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
- component: mod.default,
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
- component: mod.default,
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
  }