rasengan 1.1.2 → 1.1.3

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 CHANGED
@@ -1,5 +1,13 @@
1
1
  ## Unreleased
2
2
 
3
+ ## 1.1.5 (2025-08-30)
4
+
5
+ ## 1.1.4 (2025-08-30)
6
+
7
+ ## 1.1.4 (2025-08-30)
8
+
9
+ ## 1.1.3 (2025-08-30)
10
+
3
11
  ## 1.1.2 (2025-08-16)
4
12
 
5
13
  ## 1.1.1 (2025-08-16)
@@ -8,9 +8,9 @@ program
8
8
  // Handle the dev command
9
9
  program
10
10
  .command('dev')
11
- .option('-p <port>')
11
+ .option('-p, --port <port>', 'Port number')
12
12
  .description('Start development server')
13
- .action(async ({ p: port }) => {
13
+ .action(async ({ port }) => {
14
14
  const convertedPort = Number(port);
15
15
  // Checking port
16
16
  if (port &&
@@ -1,12 +1,37 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { isRouteErrorResponse, Link, useParams, useRouteError, } from 'react-router';
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { isRouteErrorResponse, Link, useLocation, useParams, useRouteError, } from 'react-router';
3
+ import { useEffect, useRef } from 'react';
4
+ // Extract the environment variables
5
+ const extractEnv = () => {
6
+ try {
7
+ const env = import.meta.env;
8
+ if (!env)
9
+ return {
10
+ DEV: false,
11
+ PROD: true,
12
+ TEST: false,
13
+ };
14
+ return {
15
+ DEV: env.DEV,
16
+ PROD: env.PROD,
17
+ TEST: env.TEST,
18
+ };
19
+ }
20
+ catch (error) {
21
+ console.error(error);
22
+ return {
23
+ DEV: false,
24
+ PROD: true,
25
+ TEST: false,
26
+ };
27
+ }
28
+ };
3
29
  /**
4
30
  * Error boundary component that will be displayed if an error occurs during a routing
5
31
  * @returns
6
32
  */
7
33
  export function ErrorBoundary() {
8
- const { DEV } = import.meta.env;
9
- console.log(import.meta.env);
34
+ const { DEV } = extractEnv();
10
35
  let error = useRouteError();
11
36
  if (!DEV)
12
37
  return (_jsx("section", { style: {
@@ -28,10 +53,31 @@ export function ErrorBoundary() {
28
53
  fontSize: '18px',
29
54
  }, children: "Application Error" }) }));
30
55
  if (isRouteErrorResponse(error)) {
31
- return (_jsxs(_Fragment, { children: [_jsx("p", { children: "Application Error" }), _jsxs("h1", { children: [error.status, " ", error.statusText] }), _jsx("p", { children: error.data })] }));
56
+ return (_jsxs("section", { style: {
57
+ position: 'fixed',
58
+ top: 0,
59
+ left: 0,
60
+ right: 0,
61
+ bottom: 0,
62
+ zIndex: 100,
63
+ display: 'flex',
64
+ flexDirection: 'row',
65
+ justifyContent: 'center',
66
+ alignItems: 'center',
67
+ height: '100vh',
68
+ width: '100vw',
69
+ gap: 10,
70
+ backgroundColor: '#fff',
71
+ }, children: [_jsx("p", { style: {
72
+ fontSize: '18px',
73
+ }, children: "Application Error" }), _jsxs("h1", { style: {
74
+ fontSize: '18px',
75
+ }, children: [error.status, " ", error.statusText] }), _jsx("p", { style: {
76
+ fontSize: '18px',
77
+ }, children: error.data })] }));
32
78
  }
33
79
  else if (error instanceof Error) {
34
- return (_jsxs("div", { style: {
80
+ return (_jsxs("section", { style: {
35
81
  position: 'fixed',
36
82
  top: 0,
37
83
  left: 0,
@@ -129,3 +175,45 @@ export const CustomLink = (props) => {
129
175
  }
130
176
  return (_jsx(Link, { to: to, ...rest, children: children }));
131
177
  };
178
+ // Store scroll positions globally (per location.key)
179
+ const scrollPositions = {};
180
+ /**
181
+ * Scroll restoration component
182
+ * @param {Props} props
183
+ * @returns
184
+ */
185
+ export function ScrollRestoration({ alwaysToTop = false, target }) {
186
+ const location = useLocation();
187
+ const pathnameRef = useRef(location.pathname);
188
+ useEffect(() => {
189
+ if (typeof window === 'undefined')
190
+ return;
191
+ const prevPathname = pathnameRef.current;
192
+ const el = target?.current; // easier to reference
193
+ if (alwaysToTop) {
194
+ if (el) {
195
+ el.scrollTo(0, 0);
196
+ }
197
+ else {
198
+ window.scrollTo(0, 0);
199
+ }
200
+ pathnameRef.current = location.pathname;
201
+ return;
202
+ }
203
+ // Save scroll position of the previous page
204
+ if (prevPathname) {
205
+ scrollPositions[prevPathname] = el ? el.scrollTop : window.scrollY;
206
+ }
207
+ // Restore scroll position of the new page (default to 0 if not stored)
208
+ const storedY = scrollPositions[location.pathname] ?? 0;
209
+ if (el) {
210
+ el.scrollTo(0, storedY);
211
+ }
212
+ else {
213
+ window.scrollTo(0, storedY);
214
+ }
215
+ // Update ref
216
+ pathnameRef.current = location.pathname;
217
+ }, [location.pathname, target?.current]); // depend on target.current
218
+ return null;
219
+ }
@@ -1,5 +1,5 @@
1
- import { CustomLink } from './components/index.js';
1
+ import { CustomLink, ScrollRestoration } from './components/index.js';
2
2
  export { defineRouter, defineRoutesGroup, flatRoutes } from './utils/index.js';
3
3
  export { RouterComponent } from './interfaces.js';
4
- export { Outlet, ScrollRestoration, useLocation, useNavigate, useNavigation, useParams, useSearchParams, useFetcher, useMatch, useRoutes, useResolvedPath, matchRoutes, generatePath, matchPath, createRoutesFromChildren, Navigate, NavLink, } from 'react-router';
5
- export { CustomLink as Link };
4
+ export { Outlet, useLocation, useNavigate, useNavigation, useParams, useSearchParams, useFetcher, useMatch, useRoutes, useResolvedPath, matchRoutes, generatePath, matchPath, createRoutesFromChildren, Navigate, NavLink, } from 'react-router';
5
+ export { CustomLink as Link, ScrollRestoration };
@@ -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) {
@@ -343,6 +343,7 @@ export async function flatRoutes(fn) {
343
343
  }
344
344
  catch (error) {
345
345
  console.error(error);
346
+ throw error;
346
347
  // TODO: Handle error
347
348
  }
348
349
  }
@@ -58,6 +58,21 @@ export async function handleDocumentRequest(req, res, runner, options) {
58
58
  // Create static router
59
59
  let router = createStaticRouter(handler.dataRoutes, context);
60
60
  const headers = extractHeadersFromRRContext(context);
61
+ // const route = await handler.queryRoute(request, {
62
+ // requestContext: context,
63
+ // });
64
+ // // TODO: Check this line again
65
+ // if (route['meta']?.title === 'Not Found') {
66
+ // // Set headers
67
+ // res.writeHead(404, {
68
+ // ...Object.fromEntries(headers),
69
+ // });
70
+ // } else {
71
+ // // Set headers
72
+ // res.writeHead(context.statusCode, {
73
+ // ...Object.fromEntries(headers),
74
+ // });
75
+ // }
61
76
  // Set headers
62
77
  res.writeHead(context.statusCode, {
63
78
  ...Object.fromEntries(headers),
@@ -20,3 +20,14 @@ export declare const NotFoundPageComponent: () => import("react/jsx-runtime.js")
20
20
  * @returns React.ReactNode
21
21
  */
22
22
  export declare const CustomLink: (props: LinkProps) => import("react/jsx-runtime.js").JSX.Element;
23
+ type Props = {
24
+ alwaysToTop?: boolean;
25
+ target?: React.RefObject<HTMLElement | null>;
26
+ };
27
+ /**
28
+ * Scroll restoration component
29
+ * @param {Props} props
30
+ * @returns
31
+ */
32
+ export declare function ScrollRestoration({ alwaysToTop, target }: Props): any;
33
+ export {};
@@ -1,6 +1,6 @@
1
- import { CustomLink } from './components/index.js';
1
+ import { CustomLink, ScrollRestoration } from './components/index.js';
2
2
  export type { Metadata, MetadataWithoutTitleAndDescription, LayoutComponent, PageComponent, MDXPageComponent, LoaderOptions, LoaderResponse, ReactComponentProps, TemplateProps, } from './types.js';
3
3
  export { defineRouter, defineRoutesGroup, flatRoutes } from './utils/index.js';
4
4
  export { RouterComponent } from './interfaces.js';
5
- export { Outlet, ScrollRestoration, useLocation, useNavigate, useNavigation, useParams, useSearchParams, useFetcher, useMatch, useRoutes, useResolvedPath, matchRoutes, generatePath, matchPath, createRoutesFromChildren, Navigate, NavLink, } from 'react-router';
6
- export { CustomLink as Link };
5
+ export { Outlet, useLocation, useNavigate, useNavigation, useParams, useSearchParams, useFetcher, useMatch, useRoutes, useResolvedPath, matchRoutes, generatePath, matchPath, createRoutesFromChildren, Navigate, NavLink, } from 'react-router';
6
+ export { CustomLink as Link, ScrollRestoration };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "rasengan",
3
3
  "private": false,
4
- "version": "1.1.2",
4
+ "version": "1.1.3",
5
5
  "description": "The modern React Framework",
6
6
  "type": "module",
7
7
  "main": "lib/esm/index.js",
@@ -78,7 +78,7 @@
78
78
  "less": "*",
79
79
  "sass": "*",
80
80
  "stylus": "*",
81
- "vite": "^7.0.0",
81
+ "vite": "^6.3.0 || ^7.0.0",
82
82
  "@rasenganjs/mdx": "^1.1.7"
83
83
  },
84
84
  "peerDependenciesMeta": {