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.
- package/LICENSE +21 -0
- package/README.md +484 -0
- package/dist/babel.d.ts +8 -0
- package/dist/constants.d.ts +28 -0
- package/dist/dev-server.d.ts +3 -0
- package/dist/index.cjs +746 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +726 -0
- package/dist/manifest.d.ts +14 -0
- package/dist/modify-browser-manifest.d.ts +12 -0
- package/dist/plugin-utils.d.ts +16 -0
- package/dist/server-utils.d.ts +16 -0
- package/dist/templates/context.d.ts +6 -0
- package/dist/templates/entry.client.cjs +12 -0
- package/dist/templates/entry.client.d.ts +1 -0
- package/dist/templates/entry.client.js +6 -0
- package/dist/templates/entry.server.cjs +49 -0
- package/dist/templates/entry.server.d.ts +2 -0
- package/dist/templates/entry.server.js +31 -0
- package/dist/transform-route-federation.d.ts +6 -0
- package/dist/types.d.ts +49 -0
- package/package.json +122 -0
|
@@ -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,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,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>;
|
package/dist/types.d.ts
ADDED
|
@@ -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
|
+
}
|