rsbuild-plugin-react-router 0.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.
@@ -0,0 +1,14 @@
1
+ import type { Route, PluginOptions, RouteManifestItem } from './types.js';
2
+ import type { RouteConfigEntry } from '@react-router/dev/routes';
3
+ import type { Rspack } from '@rsbuild/core';
4
+ export declare function configRoutesToRouteManifest(appDirectory: string, routes: RouteConfigEntry[], rootId?: string): Record<string, Route>;
5
+ export declare function getReactRouterManifestForDev(routes: Record<string, Route>, options: PluginOptions, clientStats: Rspack.StatsCompilation | undefined, context: string): Promise<{
6
+ version: string;
7
+ url: string;
8
+ entry: {
9
+ module: string;
10
+ imports: string[];
11
+ css: string[];
12
+ };
13
+ routes: Record<string, RouteManifestItem>;
14
+ }>;
@@ -0,0 +1,12 @@
1
+ import type { Route, PluginOptions } from './types.js';
2
+ import type { Rspack } from '@rsbuild/core';
3
+ /**
4
+ * Creates a Webpack/Rspack plugin that modifies the browser manifest
5
+ * @param routes - The routes configuration
6
+ * @param pluginOptions - The plugin options
7
+ * @param appDirectory - The application directory
8
+ * @returns A webpack/rspack plugin
9
+ */
10
+ export declare function createModifyBrowserManifestPlugin(routes: Record<string, Route>, pluginOptions: PluginOptions, appDirectory: string): {
11
+ apply(compiler: Rspack.Compiler): void;
12
+ };
@@ -0,0 +1,16 @@
1
+ import type { Babel, ParseResult } from './babel.js';
2
+ export declare function validateDestructuredExports(id: Babel.ArrayPattern | Babel.ObjectPattern, exportsToRemove: string[]): void;
3
+ export declare function invalidDestructureError(name: string): Error;
4
+ export declare function toFunctionExpression(decl: Babel.FunctionDeclaration): any;
5
+ export declare function combineURLs(baseURL: string, relativeURL: string): string;
6
+ export declare function stripFileExtension(file: string): string;
7
+ export declare function createRouteId(file: string): string;
8
+ /**
9
+ * Find a file with any of the supported JavaScript extensions
10
+ * @param basePath - The base path without extension
11
+ * @returns The file path with extension if found, or a default path
12
+ */
13
+ export declare function findEntryFile(basePath: string): string;
14
+ export declare function generateWithProps(): string;
15
+ export declare const removeExports: (ast: ParseResult<Babel.File>, exportsToRemove: string[]) => void;
16
+ export declare const transformRoute: (ast: ParseResult<Babel.File>) => void;
@@ -0,0 +1,16 @@
1
+ import type { Route } from './types.js';
2
+ /**
3
+ * Generates the server build module content
4
+ * @param routes The route manifest
5
+ * @param options Build options
6
+ * @returns The generated module content as a string
7
+ */
8
+ declare function generateServerBuild(routes: Record<string, Route>, options: {
9
+ entryServerPath: string;
10
+ assetsBuildDirectory: string;
11
+ basename: string;
12
+ appDirectory: string;
13
+ ssr: boolean;
14
+ federation?: boolean;
15
+ }): string;
16
+ export { generateServerBuild };
@@ -0,0 +1,6 @@
1
+ import type { Context } from 'react';
2
+ export interface Assets {
3
+ scriptTags: string[];
4
+ styleTags: string[];
5
+ }
6
+ export declare const AssetsContext: Context<Assets>;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ let __rslib_import_meta_url__ = 'undefined' == typeof document ? new (require('url'.replace('', ''))).URL('file:' + __filename).href : document.currentScript && document.currentScript.src || new URL('main.js', document.baseURI).href;
3
+ var __webpack_exports__ = {};
4
+ let external_react_namespaceObject = require("react"), client_namespaceObject = require("react-dom/client"), dom_namespaceObject = require("react-router/dom");
5
+ external_react_namespaceObject.startTransition(()=>{
6
+ (0, client_namespaceObject.hydrateRoot)(document, external_react_namespaceObject.createElement(external_react_namespaceObject.StrictMode, null, external_react_namespaceObject.createElement(dom_namespaceObject.HydratedRouter, null)));
7
+ });
8
+ var __webpack_export_target__ = exports;
9
+ for(var __webpack_i__ in __webpack_exports__)__webpack_export_target__[__webpack_i__] = __webpack_exports__[__webpack_i__];
10
+ __webpack_exports__.__esModule && Object.defineProperty(__webpack_export_target__, '__esModule', {
11
+ value: !0
12
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,6 @@
1
+ import * as __WEBPACK_EXTERNAL_MODULE_react__ from "react";
2
+ import * as __WEBPACK_EXTERNAL_MODULE_react_dom_client_76b1397c__ from "react-dom/client";
3
+ import * as __WEBPACK_EXTERNAL_MODULE_react_router_dom_acbe8c37__ from "react-router/dom";
4
+ __WEBPACK_EXTERNAL_MODULE_react__.startTransition(()=>{
5
+ (0, __WEBPACK_EXTERNAL_MODULE_react_dom_client_76b1397c__.hydrateRoot)(document, __WEBPACK_EXTERNAL_MODULE_react__.createElement(__WEBPACK_EXTERNAL_MODULE_react__.StrictMode, null, __WEBPACK_EXTERNAL_MODULE_react__.createElement(__WEBPACK_EXTERNAL_MODULE_react_router_dom_acbe8c37__.HydratedRouter, null)));
6
+ });
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ let __rslib_import_meta_url__ = 'undefined' == typeof document ? new (require('url'.replace('', ''))).URL('file:' + __filename).href : document.currentScript && document.currentScript.src || new URL('main.js', document.baseURI).href;
3
+ var __webpack_require__ = {};
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key) && Object.defineProperty(exports1, key, {
6
+ enumerable: !0,
7
+ get: definition[key]
8
+ });
9
+ }, __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop), __webpack_require__.r = (exports1)=>{
10
+ 'undefined' != typeof Symbol && Symbol.toStringTag && Object.defineProperty(exports1, Symbol.toStringTag, {
11
+ value: 'Module'
12
+ }), Object.defineProperty(exports1, '__esModule', {
13
+ value: !0
14
+ });
15
+ };
16
+ var __webpack_exports__ = {};
17
+ __webpack_require__.r(__webpack_exports__), __webpack_require__.d(__webpack_exports__, {
18
+ default: ()=>handleRequest
19
+ });
20
+ let external_node_stream_namespaceObject = require("node:stream"), node_namespaceObject = require("@react-router/node"), external_isbot_namespaceObject = require("isbot"), external_react_namespaceObject = require("react"), server_namespaceObject = require("react-dom/server"), external_react_router_namespaceObject = require("react-router"), ABORT_DELAY = 5000;
21
+ function handleRequest(request, responseStatusCode, responseHeaders, routerContext) {
22
+ return new Promise((resolve, reject)=>{
23
+ let shellRendered = !1, statusCode = responseStatusCode, userAgent = request.headers.get('user-agent'), readyOption = userAgent && (0, external_isbot_namespaceObject.isbot)(userAgent) || routerContext.isSpaMode ? 'onAllReady' : 'onShellReady', { pipe, abort } = (0, server_namespaceObject.renderToPipeableStream)(external_react_namespaceObject.createElement(external_react_router_namespaceObject.ServerRouter, {
24
+ context: routerContext,
25
+ url: request.url
26
+ }), {
27
+ [readyOption] () {
28
+ shellRendered = !0;
29
+ let body = new external_node_stream_namespaceObject.PassThrough(), stream = (0, node_namespaceObject.createReadableStreamFromReadable)(body);
30
+ responseHeaders.set('Content-Type', 'text/html'), resolve(new Response(stream, {
31
+ headers: responseHeaders,
32
+ status: statusCode
33
+ })), pipe(body);
34
+ },
35
+ onShellError (error) {
36
+ reject(error);
37
+ },
38
+ onError (error) {
39
+ statusCode = 500, shellRendered && console.error(error);
40
+ }
41
+ });
42
+ setTimeout(abort, 5000);
43
+ });
44
+ }
45
+ var __webpack_export_target__ = exports;
46
+ for(var __webpack_i__ in __webpack_exports__)__webpack_export_target__[__webpack_i__] = __webpack_exports__[__webpack_i__];
47
+ __webpack_exports__.__esModule && Object.defineProperty(__webpack_export_target__, '__esModule', {
48
+ value: !0
49
+ });
@@ -0,0 +1,2 @@
1
+ import type { EntryContext } from 'react-router';
2
+ export default function handleRequest(request: Request, responseStatusCode: number, responseHeaders: Headers, routerContext: EntryContext): Promise<Response>;
@@ -0,0 +1,31 @@
1
+ import * as __WEBPACK_EXTERNAL_MODULE_node_stream_444d1c2b__ from "node:stream";
2
+ import * as __WEBPACK_EXTERNAL_MODULE__react_router_node_fff52f02__ from "@react-router/node";
3
+ import * as __WEBPACK_EXTERNAL_MODULE_isbot__ from "isbot";
4
+ import * as __WEBPACK_EXTERNAL_MODULE_react__ from "react";
5
+ import * as __WEBPACK_EXTERNAL_MODULE_react_dom_server_98c38d5c__ from "react-dom/server";
6
+ import * as __WEBPACK_EXTERNAL_MODULE_react_router_65608a1a__ from "react-router";
7
+ function handleRequest(request, responseStatusCode, responseHeaders, routerContext) {
8
+ return new Promise((resolve, reject)=>{
9
+ let shellRendered = !1, statusCode = responseStatusCode, userAgent = request.headers.get('user-agent'), readyOption = userAgent && (0, __WEBPACK_EXTERNAL_MODULE_isbot__.isbot)(userAgent) || routerContext.isSpaMode ? 'onAllReady' : 'onShellReady', { pipe, abort } = (0, __WEBPACK_EXTERNAL_MODULE_react_dom_server_98c38d5c__.renderToPipeableStream)(__WEBPACK_EXTERNAL_MODULE_react__.createElement(__WEBPACK_EXTERNAL_MODULE_react_router_65608a1a__.ServerRouter, {
10
+ context: routerContext,
11
+ url: request.url
12
+ }), {
13
+ [readyOption] () {
14
+ shellRendered = !0;
15
+ let body = new __WEBPACK_EXTERNAL_MODULE_node_stream_444d1c2b__.PassThrough(), stream = (0, __WEBPACK_EXTERNAL_MODULE__react_router_node_fff52f02__.createReadableStreamFromReadable)(body);
16
+ responseHeaders.set('Content-Type', 'text/html'), resolve(new Response(stream, {
17
+ headers: responseHeaders,
18
+ status: statusCode
19
+ })), pipe(body);
20
+ },
21
+ onShellError (error) {
22
+ reject(error);
23
+ },
24
+ onError (error) {
25
+ statusCode = 500, shellRendered && console.error(error);
26
+ }
27
+ });
28
+ setTimeout(abort, 5000);
29
+ });
30
+ }
31
+ export { handleRequest as default };
@@ -0,0 +1,6 @@
1
+ import type { TransformArgs } from './types.js';
2
+ /**
3
+ * Transforms route modules with the react-router-route-federation resource query
4
+ * This handles proper code transformation for federated routes
5
+ */
6
+ export declare function transformRouteFederation(args: TransformArgs): Promise<string>;
@@ -0,0 +1,49 @@
1
+ export type Route = {
2
+ id: string;
3
+ parentId?: string;
4
+ file: string;
5
+ path?: string;
6
+ index?: boolean;
7
+ caseSensitive?: boolean;
8
+ children?: Route[];
9
+ };
10
+ export type PluginOptions = {
11
+ /**
12
+ * Whether to disable automatic middleware setup for custom server implementation.
13
+ * Use this when you want to handle server setup manually.
14
+ * @default false
15
+ */
16
+ customServer?: boolean;
17
+ /**
18
+ * The output format for server builds.
19
+ * When set to "module", no package.json will be emitted.
20
+ * @default "module"
21
+ */
22
+ serverOutput?: 'module' | 'commonjs';
23
+ /**
24
+ * Federation mode configuration
25
+ */
26
+ federation?: boolean;
27
+ };
28
+ /**
29
+ * Arguments passed to transform functions
30
+ */
31
+ export type TransformArgs = {
32
+ code: string;
33
+ resource: string;
34
+ resourcePath: string;
35
+ context?: string | null;
36
+ environment?: {
37
+ name: string;
38
+ };
39
+ };
40
+ export type RouteManifestItem = Omit<Route, 'file' | 'children'> & {
41
+ module: string;
42
+ hasAction: boolean;
43
+ hasLoader: boolean;
44
+ hasClientAction: boolean;
45
+ hasClientLoader: boolean;
46
+ hasErrorBoundary: boolean;
47
+ imports: string[];
48
+ css: string[];
49
+ };
package/package.json ADDED
@@ -0,0 +1,122 @@
1
+ {
2
+ "name": "rsbuild-plugin-react-router",
3
+ "version": "0.0.1",
4
+ "description": "React Router plugin for Rsbuild",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/rspack-contrib/rsbuild-plugin-react-router.git",
8
+ "directory": ""
9
+ },
10
+ "keywords": [
11
+ "rsbuild",
12
+ "rsbuild-plugin",
13
+ "react-router",
14
+ "react",
15
+ "router",
16
+ "ssr",
17
+ "rspack",
18
+ "plugin",
19
+ "remix",
20
+ "module-federation"
21
+ ],
22
+ "license": "MIT",
23
+ "type": "module",
24
+ "registry": "https://registry.npmjs.org/",
25
+ "exports": {
26
+ ".": {
27
+ "types": "./dist/index.d.ts",
28
+ "import": "./dist/index.js",
29
+ "require": "./dist/index.cjs"
30
+ },
31
+ "./templates/entry.client": {
32
+ "types": "./dist/templates/entry.client.d.ts",
33
+ "import": "./dist/templates/entry.client.js",
34
+ "require": "./dist/templates/entry.client.cjs"
35
+ },
36
+ "./templates/entry.server": {
37
+ "types": "./dist/templates/entry.server.d.ts",
38
+ "import": "./dist/templates/entry.server.js",
39
+ "require": "./dist/templates/entry.server.cjs"
40
+ }
41
+ },
42
+ "main": "./dist/index.cjs",
43
+ "types": "./dist/index.d.ts",
44
+ "files": [
45
+ "dist"
46
+ ],
47
+ "publint": {
48
+ "ignoreMissingDts": true
49
+ },
50
+ "dependencies": {
51
+ "@babel/core": "^7.26.3",
52
+ "@babel/generator": "^7.26.3",
53
+ "@babel/parser": "^7.26.3",
54
+ "@babel/traverse": "^7.26.3",
55
+ "@babel/types": "^7.26.3",
56
+ "@mjackson/node-fetch-server": "^0.3.0",
57
+ "@react-router/node": "^7.4.0",
58
+ "@rspack/plugin-react-refresh": "^1.0.1",
59
+ "babel-dead-code-elimination": "^1.0.8",
60
+ "esbuild": "^0.24.2",
61
+ "execa": "^9.5.2",
62
+ "fs-extra": "11.3.0",
63
+ "isbot": "5.1.18",
64
+ "jiti": "^2.4.2",
65
+ "jsesc": "^3.1.0",
66
+ "pathe": "^1.1.2",
67
+ "react-refresh": "^0.16.0",
68
+ "rspack-plugin-virtual-module": "^0.1.13"
69
+ },
70
+ "devDependencies": {
71
+ "@changesets/cli": "^2.28.1",
72
+ "@react-router/dev": "^7.4.0",
73
+ "@react-router/node": "^7.4.0",
74
+ "@rsbuild/core": "^1.2.19",
75
+ "@rslib/core": "^0.5.4",
76
+ "@rspack/core": "npm:@rspack-canary/core@1.3.0-canary-ce784815-20250320233859",
77
+ "@types/babel__core": "^7.6.8",
78
+ "@types/babel__generator": "^7.6.8",
79
+ "@types/babel__traverse": "^7.20.6",
80
+ "@types/fs-extra": "11.0.4",
81
+ "@types/jsesc": "^3.0.3",
82
+ "@types/node": "^22.10.1",
83
+ "@types/react": "^19.0.1",
84
+ "@types/react-dom": "^19.0.1",
85
+ "jiti": "^2.4.1",
86
+ "kill-port": "^2.0.1",
87
+ "killport": "^1.0.2",
88
+ "playwright": "^1.50.1",
89
+ "prettier": "3.4.2",
90
+ "react": "^19.0.0",
91
+ "react-dom": "^19.0.0",
92
+ "react-router": "^7.4.0",
93
+ "react-router-dom": "^7.4.0",
94
+ "typescript": "^5.7.2",
95
+ "vitest": "^3.0.5",
96
+ "@rsbuild/config": "1.0.1"
97
+ },
98
+ "peerDependencies": {
99
+ "@rsbuild/core": "1.x"
100
+ },
101
+ "publishConfig": {
102
+ "access": "public",
103
+ "provenance": false,
104
+ "registry": "https://registry.npmjs.org/"
105
+ },
106
+ "scripts": {
107
+ "build": "rslib build",
108
+ "e2e": "pnpm build && cd examples/default-template && pnpm test:e2e && npx kill-port 3000 && cd ../custom-node-server && pnpm test:e2e",
109
+ "dev": "rslib build --watch",
110
+ "test": "vitest run",
111
+ "test:watch": "vitest watch",
112
+ "test:coverage": "vitest run --coverage",
113
+ "test:core": "vitest run -c ./vitest.config.ts",
114
+ "test:core:watch": "vitest watch -c ./vitest.config.ts",
115
+ "format": "prettier --write \"src/**/*.{js,jsx,ts,tsx}\"",
116
+ "format:check": "prettier --check \"src/**/*.{js,jsx,ts,tsx}\"",
117
+ "changeset": "changeset",
118
+ "version": "changeset version",
119
+ "release": "changeset publish",
120
+ "release:local": "pnpm build && changeset version && changeset publish"
121
+ }
122
+ }