@bleedingdev/modern-js-runtime 3.5.0-ultramodern.99 → 3.8.1-ultramodern.2
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/dist/cjs/cli/ssr/index.js +1 -0
- package/dist/cjs/core/browser/hydrate.js +31 -27
- package/dist/cjs/core/react/wrapper.js +23 -28
- package/dist/cjs/core/server/requestResponse.js +5 -5
- package/dist/cjs/core/server/scriptOrder.js +1 -1
- package/dist/cjs/core/server/stream/beforeTemplate.worker.js +1 -10
- package/dist/cjs/core/server/utils.js +3 -3
- package/dist/cjs/document/cli/index.js +5 -2
- package/dist/cjs/module-federation/distributed-ssr.js +13 -12
- package/dist/cjs/module-federation/last-known-good.js +1 -1
- package/dist/cjs/module-federation/manifest-recovery-runtime-plugin.js +27 -38
- package/dist/cjs/router/cli/code/index.js +16 -9
- package/dist/cjs/router/cli/code/templates.js +36 -27
- package/dist/cjs/router/cli/handler.js +7 -1
- package/dist/cjs/router/runtime/plugin.js +22 -17
- package/dist/cjs/router/runtime/plugin.node.js +11 -3
- package/dist/cjs/router/runtime/provider.js +2 -2
- package/dist/cjs/router/runtime/redirect.js +51 -0
- package/dist/cjs/router/runtime/routerHelper.js +4 -0
- package/dist/cjs/router/runtime/rsc-router.js +2 -13
- package/dist/cjs/router/runtime/utils.js +3 -2
- package/dist/esm/cli/ssr/index.mjs +1 -0
- package/dist/esm/core/browser/hydrate.mjs +30 -22
- package/dist/esm/core/react/wrapper.mjs +23 -28
- package/dist/esm/core/server/requestResponse.mjs +4 -4
- package/dist/esm/core/server/scriptOrder.mjs +1 -1
- package/dist/esm/core/server/stream/beforeTemplate.worker.mjs +1 -10
- package/dist/esm/core/server/utils.mjs +1 -1
- package/dist/esm/document/cli/index.mjs +1 -1
- package/dist/esm/module-federation/distributed-ssr.mjs +13 -12
- package/dist/esm/module-federation/last-known-good.mjs +1 -1
- package/dist/esm/module-federation/manifest-recovery-runtime-plugin.mjs +22 -33
- package/dist/esm/router/cli/code/index.mjs +16 -9
- package/dist/esm/router/cli/code/templates.mjs +36 -27
- package/dist/esm/router/cli/handler.mjs +7 -1
- package/dist/esm/router/runtime/plugin.mjs +24 -19
- package/dist/esm/router/runtime/plugin.node.mjs +12 -4
- package/dist/esm/router/runtime/provider.mjs +2 -2
- package/dist/esm/router/runtime/redirect.mjs +13 -0
- package/dist/esm/router/runtime/routerHelper.mjs +2 -1
- package/dist/esm/router/runtime/rsc-router.mjs +2 -13
- package/dist/esm/router/runtime/utils.mjs +2 -1
- package/dist/esm-node/cli/ssr/index.mjs +1 -0
- package/dist/esm-node/core/browser/hydrate.mjs +30 -22
- package/dist/esm-node/core/react/wrapper.mjs +23 -28
- package/dist/esm-node/core/server/requestResponse.mjs +4 -4
- package/dist/esm-node/core/server/scriptOrder.mjs +1 -1
- package/dist/esm-node/core/server/stream/beforeTemplate.worker.mjs +1 -10
- package/dist/esm-node/core/server/utils.mjs +1 -1
- package/dist/esm-node/document/cli/index.mjs +1 -1
- package/dist/esm-node/module-federation/distributed-ssr.mjs +13 -12
- package/dist/esm-node/module-federation/last-known-good.mjs +1 -1
- package/dist/esm-node/module-federation/manifest-recovery-runtime-plugin.mjs +22 -33
- package/dist/esm-node/router/cli/code/index.mjs +16 -9
- package/dist/esm-node/router/cli/code/templates.mjs +36 -27
- package/dist/esm-node/router/cli/handler.mjs +7 -1
- package/dist/esm-node/router/runtime/plugin.mjs +24 -19
- package/dist/esm-node/router/runtime/plugin.node.mjs +12 -4
- package/dist/esm-node/router/runtime/provider.mjs +2 -2
- package/dist/esm-node/router/runtime/redirect.mjs +14 -0
- package/dist/esm-node/router/runtime/routerHelper.mjs +2 -1
- package/dist/esm-node/router/runtime/rsc-router.mjs +2 -13
- package/dist/esm-node/router/runtime/utils.mjs +2 -1
- package/dist/types/core/browser/hydrate.d.ts +0 -1
- package/dist/types/core/server/utils.d.ts +1 -1
- package/dist/types/document/cli/index.d.ts +1 -0
- package/dist/types/module-federation/distributed-ssr.d.ts +3 -3
- package/dist/types/module-federation/manifest-recovery-runtime-plugin.d.ts +1 -1
- package/dist/types/router/cli/code/index.d.ts +6 -1
- package/dist/types/router/cli/code/templates.d.ts +8 -3
- package/dist/types/router/cli/handler.d.ts +4 -0
- package/dist/types/router/runtime/redirect.d.ts +1 -0
- package/dist/types/router/runtime/routerHelper.d.ts +7 -0
- package/dist/types/router/runtime/rsc-router.d.ts +1 -2
- package/package.json +14 -14
- package/rstest.config.mts +2 -0
|
@@ -91,7 +91,7 @@ async function hasUseClientDirective(componentPath, srcDirectory, internalSrcAli
|
|
|
91
91
|
await fh?.close();
|
|
92
92
|
}
|
|
93
93
|
}
|
|
94
|
-
const fileSystemRoutes = async ({ metaName, routes, ssrMode, nestedRoutesEntry, entryName, internalDirectory, splitRouteChunks = true, isRscClientBundle = false, srcDirectory, internalSrcAlias })=>{
|
|
94
|
+
const fileSystemRoutes = async ({ metaName, routes, ssrMode, nestedRoutesEntry, entryName, internalDirectory, splitRouteChunks = true, isRscClientBundle = false, hydrateRscClientRoutes = false, isolateRouteDataInRscLayer = false, srcDirectory, internalSrcAlias })=>{
|
|
95
95
|
const components = [];
|
|
96
96
|
const loadings = [];
|
|
97
97
|
const errors = [];
|
|
@@ -163,7 +163,6 @@ const fileSystemRoutes = async ({ metaName, routes, ssrMode, nestedRoutesEntry,
|
|
|
163
163
|
componentPath: route._component,
|
|
164
164
|
routeId: route.id
|
|
165
165
|
});
|
|
166
|
-
rootLayoutCode = `import RootLayout from '${route._component}'`;
|
|
167
166
|
component = 'RootLayout';
|
|
168
167
|
} else if (splitRouteChunks) {
|
|
169
168
|
lazyImport = createLazyImport({
|
|
@@ -184,8 +183,9 @@ const fileSystemRoutes = async ({ metaName, routes, ssrMode, nestedRoutesEntry,
|
|
|
184
183
|
component = `component_${components.length - 1}`;
|
|
185
184
|
}
|
|
186
185
|
const isClientComponent = 'nested' === route.type && Boolean(route._component) && Boolean(srcDirectory) && Boolean(internalSrcAlias) && await hasUseClientDirective(route._component, srcDirectory, internalSrcAlias);
|
|
187
|
-
const shouldHydrateRscRoute = isRscClientBundle && !isClientComponent && !route.loader && !route.data;
|
|
186
|
+
const shouldHydrateRscRoute = hydrateRscClientRoutes && isRscClientBundle && !isClientComponent && ('nested' !== route.type || !route.loader && !route.data);
|
|
188
187
|
const shouldIncludeClientBundle = !isRscClientBundle || isClientComponent || shouldHydrateRscRoute;
|
|
188
|
+
if ('nested' === route.type && route.isRoot && route._component && shouldIncludeClientBundle) rootLayoutCode = `import RootLayout from '${route._component}'`;
|
|
189
189
|
const finalRoute = {
|
|
190
190
|
...route,
|
|
191
191
|
loading,
|
|
@@ -246,32 +246,30 @@ const fileSystemRoutes = async ({ metaName, routes, ssrMode, nestedRoutesEntry,
|
|
|
246
246
|
const importComponentsCode = components.map((component, index)=>`import component_${index} from '${component}';\n`).join('');
|
|
247
247
|
const importErrorComponentsCode = errors.map((error, index)=>`import error_${index} from '${error}';\n`).join('');
|
|
248
248
|
let importLoadersCode = '';
|
|
249
|
-
|
|
249
|
+
const isolatedRouteDataDirectory = path.join(internalDirectory, entryName, '__rsc_route_data__');
|
|
250
|
+
await fs.remove(isolatedRouteDataDirectory);
|
|
251
|
+
if (isolateRouteDataInRscLayer) await fs.ensureDir(isolatedRouteDataDirectory);
|
|
252
|
+
for (const [key, loaderInfo] of Object.entries(loadersMap)){
|
|
250
253
|
const { route } = loaderInfo;
|
|
251
|
-
|
|
254
|
+
const loaderRequest = `${slash(loaderInfo.filePath)}${getDataLoaderPath({
|
|
252
255
|
loaderId: key,
|
|
253
256
|
clientData: loaderInfo.clientData,
|
|
254
|
-
action: route.action,
|
|
257
|
+
action: route.action || false,
|
|
255
258
|
inline: loaderInfo.inline,
|
|
256
259
|
routeId: loaderInfo.routeId,
|
|
257
260
|
inValidSSRRoute: loaderInfo.inValidSSRRoute
|
|
258
|
-
})}
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
action:
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
action: false,
|
|
271
|
-
inline: loaderInfo.inline,
|
|
272
|
-
routeId: loaderInfo.routeId,
|
|
273
|
-
inValidSSRRoute: loaderInfo.inValidSSRRoute
|
|
274
|
-
})}";\n`;
|
|
261
|
+
})}`;
|
|
262
|
+
let loaderImport = loaderRequest;
|
|
263
|
+
if (isolateRouteDataInRscLayer) {
|
|
264
|
+
const isolatedLoaderFile = path.join(isolatedRouteDataDirectory, `${key}.js`);
|
|
265
|
+
const isolatedLoaderCode = loaderInfo.inline ? route.action ? `export { loader, action } from ${JSON.stringify(loaderRequest)};` : `export { loader } from ${JSON.stringify(loaderRequest)};` : `export { default } from ${JSON.stringify(loaderRequest)};`;
|
|
266
|
+
await fs.outputFile(isolatedLoaderFile, isolatedLoaderCode, 'utf8');
|
|
267
|
+
loaderImport = `./__rsc_route_data__/${key}.js`;
|
|
268
|
+
}
|
|
269
|
+
if (loaderInfo.inline) if (route.action) importLoadersCode += `import { loader as ${key}, action as action_${loaderInfo.loaderId} } from "${loaderImport}";\n`;
|
|
270
|
+
else importLoadersCode += `import { loader as ${key} } from "${loaderImport}";\n`;
|
|
271
|
+
else importLoadersCode += `import ${key} from "${loaderImport}";\n`;
|
|
272
|
+
}
|
|
275
273
|
let importConfigsCode = '';
|
|
276
274
|
for (const [key, configPath] of Object.entries(configsMap))importConfigsCode += `import * as ${key} from "${slash(configPath)}";\n`;
|
|
277
275
|
await fs.ensureFile(loadersMapFile);
|
|
@@ -297,7 +295,7 @@ const fileSystemRoutes = async ({ metaName, routes, ssrMode, nestedRoutesEntry,
|
|
|
297
295
|
${routeComponentsCode}
|
|
298
296
|
`;
|
|
299
297
|
};
|
|
300
|
-
function ssrLoaderCombinedModule(entrypoints, entrypoint, config, appContext) {
|
|
298
|
+
function ssrLoaderCombinedModule(entrypoints, entrypoint, config, appContext, options = {}) {
|
|
301
299
|
const { entryName, isMainEntry } = entrypoint;
|
|
302
300
|
const { packageName } = appContext;
|
|
303
301
|
const ssr = getEntryOptions(entryName, isMainEntry, config.server.ssr, config.server.ssrByEntries, packageName);
|
|
@@ -305,6 +303,17 @@ function ssrLoaderCombinedModule(entrypoints, entrypoint, config, appContext) {
|
|
|
305
303
|
if (entrypoint.nestedRoutesEntry && (ssr || ssg)) {
|
|
306
304
|
const serverLoaderRuntime = require.resolve('@modern-js/plugin-data-loader/runtime');
|
|
307
305
|
const serverLoadersFile = './route-server-loaders.js';
|
|
306
|
+
const includeRouteServerLoaders = false !== options.includeRouteServerLoaders;
|
|
307
|
+
if (!includeRouteServerLoaders) {
|
|
308
|
+
if (!config.source.enableAsyncEntry) return `export * from "${slash(serverLoaderRuntime)}"`;
|
|
309
|
+
return `
|
|
310
|
+
async function loadModules() {
|
|
311
|
+
return import("${slash(serverLoaderRuntime)}");
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
export { loadModules };
|
|
315
|
+
`;
|
|
316
|
+
}
|
|
308
317
|
const combinedModule = `export * from "${slash(serverLoaderRuntime)}"; export * from "${serverLoadersFile}"`;
|
|
309
318
|
if (!config.source.enableAsyncEntry) return combinedModule;
|
|
310
319
|
return `
|
|
@@ -325,7 +334,7 @@ function ssrLoaderCombinedModule(entrypoints, entrypoint, config, appContext) {
|
|
|
325
334
|
}
|
|
326
335
|
return null;
|
|
327
336
|
}
|
|
328
|
-
const runtimeGlobalContext = async ({ entryName, metaName, srcDirectory, nestedRoutesEntry, internalSrcAlias, globalApp, rscType = false, basename })=>{
|
|
337
|
+
const runtimeGlobalContext = async ({ entryName, metaName, srcDirectory, nestedRoutesEntry, internalSrcAlias, globalApp, rscType = false, routesImportPath = './routes', basename })=>{
|
|
329
338
|
const imports = [
|
|
330
339
|
`import { setGlobalContext } from '@${metaName}/runtime/context';`
|
|
331
340
|
];
|
|
@@ -356,7 +365,7 @@ const runtimeGlobalContext = async ({ entryName, metaName, srcDirectory, nestedR
|
|
|
356
365
|
const enableRsc = Boolean(rscType);
|
|
357
366
|
if (isClient) return `${imports.join('\n')}
|
|
358
367
|
|
|
359
|
-
import { routes } from '
|
|
368
|
+
import { routes } from '${routesImportPath}';
|
|
360
369
|
|
|
361
370
|
const entryName = '${entryName}';
|
|
362
371
|
const basename = '${basename || '/'}';
|
|
@@ -372,7 +381,7 @@ const runtimeGlobalContext = async ({ entryName, metaName, srcDirectory, nestedR
|
|
|
372
381
|
`;
|
|
373
382
|
return `${imports.join('\n')}
|
|
374
383
|
|
|
375
|
-
import { routes } from '
|
|
384
|
+
import { routes } from '${routesImportPath}';
|
|
376
385
|
|
|
377
386
|
const entryName = '${entryName}';
|
|
378
387
|
const basename = '${basename || '/'}';
|
|
@@ -21,7 +21,12 @@ async function handleGeneratorEntryCode(api, entrypoints, options = {}) {
|
|
|
21
21
|
const { generatorRegisterCode, generateCode, generatorServerRegisterCode } = await import("./code/index.mjs");
|
|
22
22
|
originEntrypointsByKey.set(entrypointsKey, cloneDeep(entrypoints));
|
|
23
23
|
const enableRsc = resolvedConfig?.server?.rsc;
|
|
24
|
-
const routesByEntry = await generateCode(appContext, resolvedConfig, entrypoints, api
|
|
24
|
+
const routesByEntry = await generateCode(appContext, resolvedConfig, entrypoints, api, {
|
|
25
|
+
hydrateRscClientRoutes: normalizedOptions.hydrateRscClientRoutes,
|
|
26
|
+
includeRouteServerLoadersInSsrEntry: normalizedOptions.includeRouteServerLoadersInSsrEntry,
|
|
27
|
+
isolateRouteDataInRscLayer: normalizedOptions.isolateRouteDataInRscLayer,
|
|
28
|
+
serverRoutesFileName: normalizedOptions.serverRoutesFileName
|
|
29
|
+
});
|
|
25
30
|
await Promise.all(entrypoints.map(async (entrypoint)=>{
|
|
26
31
|
if (entrypoint.nestedRoutesEntry || entrypoint.pageRoutesEntry) {
|
|
27
32
|
const route = appContext.serverRoutes.find((r)=>r.entryName === entrypoint.entryName);
|
|
@@ -44,6 +49,7 @@ async function handleGeneratorEntryCode(api, entrypoints, options = {}) {
|
|
|
44
49
|
internalSrcAlias: appContext.internalSrcAlias,
|
|
45
50
|
globalApp: entrypoint.fileSystemRoutes?.globalApp,
|
|
46
51
|
rscType: 'server',
|
|
52
|
+
routesImportPath: normalizedOptions.serverRoutesFileName ? `./${normalizedOptions.serverRoutesFileName.replace(/\.js$/, '')}` : void 0,
|
|
47
53
|
basename
|
|
48
54
|
}));
|
|
49
55
|
}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import "node:module";
|
|
2
2
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { merge } from "@modern-js/runtime-utils/merge";
|
|
4
|
-
import { RouterProvider, createBrowserRouter, createHashRouter, createRoutesFromElements, useHref, useLocation, useMatches } from "@modern-js/runtime-utils/router";
|
|
4
|
+
import { RouterProvider, createBrowserRouter, createHashRouter, createRoutesFromElements, useHref, useInRouterContext, useLocation, useMatches, useNavigate, useParams } from "@modern-js/runtime-utils/router";
|
|
5
5
|
import { normalizePathname } from "@modern-js/runtime-utils/url";
|
|
6
6
|
import * as __rspack_external_react from "react";
|
|
7
|
-
import { InternalRuntimeContext, getGlobalIsRscClient, getGlobalLayoutApp, getGlobalRoutes } from "../../core/context/index.mjs";
|
|
7
|
+
import { InternalRuntimeContext, getGlobalEnableRsc, getGlobalIsRscClient, getGlobalLayoutApp, getGlobalRoutes } from "../../core/context/index.mjs";
|
|
8
8
|
import { applyRouterRuntimeState } from "./lifecycle.mjs";
|
|
9
|
+
import { Link } from "./PrefetchLink.mjs";
|
|
9
10
|
import { routerProviderRegistryHooks } from "./provider.mjs";
|
|
10
11
|
import { createClientRouterFromPayload } from "./rsc-router.mjs";
|
|
11
12
|
import { createRouteObjectsFromConfig, deserializeErrors, renderRoutes, urlJoin } from "./utils.mjs";
|
|
@@ -39,9 +40,13 @@ const routerPlugin = (userConfig = {})=>({
|
|
|
39
40
|
}
|
|
40
41
|
}
|
|
41
42
|
context.router = {
|
|
43
|
+
Link: Link,
|
|
42
44
|
useMatches: useMatches,
|
|
43
45
|
useLocation: useLocation,
|
|
44
|
-
useHref: useHref
|
|
46
|
+
useHref: useHref,
|
|
47
|
+
useInRouterContext: useInRouterContext,
|
|
48
|
+
useNavigate: useNavigate,
|
|
49
|
+
useParams: useParams
|
|
45
50
|
};
|
|
46
51
|
Object.defineProperty(context, 'routes', {
|
|
47
52
|
get () {
|
|
@@ -65,7 +70,7 @@ const routerPlugin = (userConfig = {})=>({
|
|
|
65
70
|
};
|
|
66
71
|
let cachedRouter = null;
|
|
67
72
|
const RouterWrapper = (props)=>{
|
|
68
|
-
const routerResult = useRouterCreation(
|
|
73
|
+
const routerResult = useRouterCreation(("u" > typeof __MODERN_ENABLE_RSC__ ? __MODERN_ENABLE_RSC__ : true === getGlobalEnableRsc()) ? {
|
|
69
74
|
...props,
|
|
70
75
|
rscPayload: props?.rscPayload
|
|
71
76
|
} : props, {
|
|
@@ -83,18 +88,18 @@ const routerPlugin = (userConfig = {})=>({
|
|
|
83
88
|
const { routes } = routerResult;
|
|
84
89
|
routesContainer.current = routes;
|
|
85
90
|
beforeCreateRouter = false;
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
91
|
+
const routerContent = /*#__PURE__*/ jsxs(Fragment, {
|
|
92
|
+
children: [
|
|
93
|
+
/*#__PURE__*/ jsx(RouterProvider, {
|
|
94
|
+
router: router
|
|
95
|
+
}),
|
|
96
|
+
/*#__PURE__*/ jsx(EmptyComponent, {}),
|
|
97
|
+
/*#__PURE__*/ jsx(EmptyComponent, {})
|
|
98
|
+
]
|
|
99
|
+
});
|
|
95
100
|
return App ? /*#__PURE__*/ jsx(App, {
|
|
96
|
-
children:
|
|
97
|
-
}) :
|
|
101
|
+
children: routerContent
|
|
102
|
+
}) : routerContent;
|
|
98
103
|
};
|
|
99
104
|
return RouterWrapper;
|
|
100
105
|
});
|
|
@@ -122,15 +127,15 @@ function useRouterCreation(props, options) {
|
|
|
122
127
|
const baseUrl = selectBasePath(location.pathname).replace(/^\/*/, '/');
|
|
123
128
|
const _basename = '/' === baseUrl ? urlJoin(baseUrl, runtimeContext._internalRouterBaseName || basename || '') : baseUrl;
|
|
124
129
|
const { unstable_getBlockNavState: getBlockNavState } = runtimeContext;
|
|
125
|
-
const rscPayload =
|
|
126
|
-
let hydrationData =
|
|
130
|
+
const rscPayload = ("u" > typeof __MODERN_ENABLE_RSC__ ? __MODERN_ENABLE_RSC__ : true === getGlobalEnableRsc()) && props?.rscPayload ? safeUse(props.rscPayload) : null;
|
|
131
|
+
let hydrationData = "u" > typeof __MODERN_ENABLE_RSC__ ? __MODERN_ENABLE_RSC__ ? window._ROUTER_DATA || rscPayload : window._ROUTER_DATA : true === getGlobalEnableRsc() ? window._ROUTER_DATA || rscPayload : window._ROUTER_DATA;
|
|
127
132
|
return (0, __rspack_external_react.useMemo)(()=>{
|
|
128
133
|
if (hydrationData?.errors) hydrationData = {
|
|
129
134
|
...hydrationData,
|
|
130
135
|
errors: deserializeErrors(hydrationData.errors)
|
|
131
136
|
};
|
|
132
137
|
let routes = null;
|
|
133
|
-
routes =
|
|
138
|
+
routes = ("u" > typeof __MODERN_ENABLE_RSC__ ? __MODERN_ENABLE_RSC__ : true === getGlobalEnableRsc()) && getGlobalIsRscClient() ? createRoutes ? createRoutes() : createRouteObjectsFromConfig({
|
|
134
139
|
routesConfig: finalRouteConfig
|
|
135
140
|
}) : createRoutes ? createRoutes() : createRoutesFromElements(renderRoutes({
|
|
136
141
|
routesConfig: finalRouteConfig,
|
|
@@ -138,7 +143,7 @@ function useRouterCreation(props, options) {
|
|
|
138
143
|
}));
|
|
139
144
|
if (!routes) routes = [];
|
|
140
145
|
const hooks = api.getHooks();
|
|
141
|
-
if (
|
|
146
|
+
if (("u" > typeof __MODERN_ENABLE_RSC__ ? __MODERN_ENABLE_RSC__ : true === getGlobalEnableRsc()) && rscPayload) try {
|
|
142
147
|
const router = createClientRouterFromPayload(rscPayload, routes, _basename);
|
|
143
148
|
return {
|
|
144
149
|
router,
|
|
@@ -2,7 +2,7 @@ import "node:module";
|
|
|
2
2
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { merge } from "@modern-js/runtime-utils/merge";
|
|
4
4
|
import { createRequestContext } from "@modern-js/runtime-utils/node";
|
|
5
|
-
import { StaticRouterProvider, createRoutesFromElements, createStaticHandler, createStaticRouter } from "@modern-js/runtime-utils/router";
|
|
5
|
+
import { StaticRouterProvider, createRoutesFromElements, createStaticHandler, createStaticRouter, useInRouterContext, useLocation, useNavigate, useParams } from "@modern-js/runtime-utils/router";
|
|
6
6
|
import { time } from "@modern-js/runtime-utils/time";
|
|
7
7
|
import { LOADER_REPORTER_NAME } from "@modern-js/utils/universal/constants";
|
|
8
8
|
import { useContext } from "react";
|
|
@@ -10,6 +10,7 @@ import { InternalRuntimeContext, getGlobalEnableRsc, getGlobalLayoutApp, getGlob
|
|
|
10
10
|
import { setServerPayload } from "../../core/context/serverPayload/index.server.mjs";
|
|
11
11
|
import DeferredDataScripts_node from "./DeferredDataScripts.node.mjs";
|
|
12
12
|
import { applyRouterRuntimeState, createRouterServerSnapshot } from "./lifecycle.mjs";
|
|
13
|
+
import { Link } from "./PrefetchLink.mjs";
|
|
13
14
|
import { routerProviderRegistryHooks } from "./provider.mjs";
|
|
14
15
|
import { RSCStaticRouter, createServerPayload, handleRSCRedirect, prepareRSCRoutes } from "./rsc-router.mjs";
|
|
15
16
|
import { createRouteObjectsFromConfig, renderRoutes, urlJoin } from "./utils.mjs";
|
|
@@ -47,6 +48,13 @@ const routerPlugin = (userConfig = {})=>({
|
|
|
47
48
|
setup: (api)=>{
|
|
48
49
|
let finalRouteConfig = {};
|
|
49
50
|
api.onBeforeRender(async (context, interrupt)=>{
|
|
51
|
+
context.router = {
|
|
52
|
+
Link: Link,
|
|
53
|
+
useInRouterContext: useInRouterContext,
|
|
54
|
+
useLocation: useLocation,
|
|
55
|
+
useNavigate: useNavigate,
|
|
56
|
+
useParams: useParams
|
|
57
|
+
};
|
|
50
58
|
const pluginConfig = api.getRuntimeConfig();
|
|
51
59
|
const { basename = '', routesConfig, createRoutes } = merge(pluginConfig.router || {}, userConfig);
|
|
52
60
|
finalRouteConfig = {
|
|
@@ -135,10 +143,8 @@ const routerPlugin = (userConfig = {})=>({
|
|
|
135
143
|
const enableRsc = getGlobalEnableRsc();
|
|
136
144
|
return (props)=>{
|
|
137
145
|
const context = useContext(InternalRuntimeContext);
|
|
138
|
-
const { routerContext,
|
|
139
|
-
const { nonce, mode, useJsonScript } = ssrContext;
|
|
146
|
+
const { routerContext, routes } = context;
|
|
140
147
|
const { basename } = routerContext;
|
|
141
|
-
const remixRouter = createStaticRouter(routes, routerContext);
|
|
142
148
|
if (enableRsc) return App ? /*#__PURE__*/ jsx(App, {
|
|
143
149
|
children: /*#__PURE__*/ jsx(RSCStaticRouter, {
|
|
144
150
|
basename: basename
|
|
@@ -147,6 +153,8 @@ const routerPlugin = (userConfig = {})=>({
|
|
|
147
153
|
basename: basename
|
|
148
154
|
});
|
|
149
155
|
{
|
|
156
|
+
const { nonce, mode, useJsonScript } = context.ssrContext;
|
|
157
|
+
const remixRouter = createStaticRouter(routes, routerContext);
|
|
150
158
|
const routerWrapper = /*#__PURE__*/ jsxs(Fragment, {
|
|
151
159
|
children: [
|
|
152
160
|
/*#__PURE__*/ jsx(StaticRouterProvider, {
|
|
@@ -17,7 +17,7 @@ function createRouterProviderRealm(registrations) {
|
|
|
17
17
|
const providers = new Map();
|
|
18
18
|
let defaultProvider;
|
|
19
19
|
for (const registration of registrations){
|
|
20
|
-
if (
|
|
20
|
+
if (0 === registration.name.length) throw new Error('[@modern-js/runtime] A router provider realm cannot contain an unnamed provider.');
|
|
21
21
|
if (providers.has(registration.name)) throw new Error(`[@modern-js/runtime] Router provider "${registration.name}" is declared more than once in the same runtime realm.`);
|
|
22
22
|
if (true === registration.isDefault && void 0 !== defaultProvider && defaultProvider !== registration.name) throw new Error(`[@modern-js/runtime] Router provider realm declares both "${defaultProvider}" and "${registration.name}" as defaults.`);
|
|
23
23
|
providers.set(registration.name, registration.factory);
|
|
@@ -27,7 +27,7 @@ function createRouterProviderRealm(registrations) {
|
|
|
27
27
|
...providers.keys()
|
|
28
28
|
]);
|
|
29
29
|
return Object.freeze({
|
|
30
|
-
...defaultProvider ? {
|
|
30
|
+
...void 0 !== defaultProvider ? {
|
|
31
31
|
defaultProvider
|
|
32
32
|
} : {},
|
|
33
33
|
get: (name)=>providers.get(name),
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import "node:module";
|
|
2
|
+
const handleRSCRedirect = (headers, basename, status)=>{
|
|
3
|
+
const newHeaders = new Headers(headers);
|
|
4
|
+
let redirectUrl = headers.get('Location');
|
|
5
|
+
if ('/' !== basename) redirectUrl = redirectUrl.replace(basename, '');
|
|
6
|
+
newHeaders.set('X-Modernjs-Redirect', redirectUrl);
|
|
7
|
+
newHeaders.set('X-Modernjs-BaseUrl', basename);
|
|
8
|
+
newHeaders.delete('Location');
|
|
9
|
+
return new Response(null, {
|
|
10
|
+
status,
|
|
11
|
+
headers: newHeaders
|
|
12
|
+
});
|
|
13
|
+
};
|
|
14
|
+
export { handleRSCRedirect };
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import "node:module";
|
|
2
2
|
import { ROUTE_MODULES } from "@modern-js/utils/universal/constants";
|
|
3
|
+
const isRouteErrorResponse = (error)=>null !== error && 'object' == typeof error && 'number' == typeof error.status && 'string' == typeof error.statusText && 'boolean' == typeof error.internal && 'data' in error;
|
|
3
4
|
const isObjectLike = (value)=>'object' == typeof value && null !== value || 'function' == typeof value;
|
|
4
5
|
const isRouteComponent = (value)=>'function' == typeof value || isObjectLike(value) && '$$typeof' in value;
|
|
5
6
|
const getRouteModules = ()=>{
|
|
@@ -52,4 +53,4 @@ const handleRouteModuleError = (error)=>{
|
|
|
52
53
|
console.error(error);
|
|
53
54
|
return null;
|
|
54
55
|
};
|
|
55
|
-
export { createShouldRevalidate, handleRouteModule, handleRouteModuleError, resolveRouteComponent };
|
|
56
|
+
export { createShouldRevalidate, handleRouteModule, handleRouteModuleError, isRouteErrorResponse, resolveRouteComponent };
|
|
@@ -86,18 +86,6 @@ const createServerPayload = (routerContext, routes)=>{
|
|
|
86
86
|
})
|
|
87
87
|
};
|
|
88
88
|
};
|
|
89
|
-
const handleRSCRedirect = (headers, basename, status)=>{
|
|
90
|
-
const newHeaders = new Headers(headers);
|
|
91
|
-
let redirectUrl = headers.get('Location');
|
|
92
|
-
if ('/' !== basename) redirectUrl = redirectUrl.replace(basename, '');
|
|
93
|
-
newHeaders.set('X-Modernjs-Redirect', redirectUrl);
|
|
94
|
-
newHeaders.set('X-Modernjs-BaseUrl', basename);
|
|
95
|
-
newHeaders.delete('Location');
|
|
96
|
-
return new Response(null, {
|
|
97
|
-
status: status,
|
|
98
|
-
headers: newHeaders
|
|
99
|
-
});
|
|
100
|
-
};
|
|
101
89
|
const prepareRSCRoutes = async (routes)=>{
|
|
102
90
|
const isLazyComponent = (component)=>null != component && 'object' == typeof component && '_init' in component && '_payload' in component;
|
|
103
91
|
const processRoutes = async (routesList)=>{
|
|
@@ -326,4 +314,5 @@ const RSCStaticRouter = ({ basename })=>{
|
|
|
326
314
|
children: createRSCStaticRouterComponent(payload, basename)
|
|
327
315
|
});
|
|
328
316
|
};
|
|
329
|
-
export {
|
|
317
|
+
export { handleRSCRedirect } from "./redirect.mjs";
|
|
318
|
+
export { RSCStaticRouter, createClientRouterFromPayload, createServerPayload, prepareRSCRoutes };
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import "node:module";
|
|
2
2
|
import { jsx } from "react/jsx-runtime";
|
|
3
3
|
import { renderNestedRoute } from "@modern-js/runtime-utils/browser";
|
|
4
|
-
import { Route, UNSAFE_ErrorResponseImpl
|
|
4
|
+
import { Route, UNSAFE_ErrorResponseImpl } from "@modern-js/runtime-utils/router";
|
|
5
5
|
import react from "react";
|
|
6
6
|
import { DefaultNotFound } from "./DefaultNotFound.mjs";
|
|
7
7
|
import DeferredDataScripts from "./DeferredDataScripts.mjs";
|
|
8
|
+
import { isRouteErrorResponse } from "./routerHelper.mjs";
|
|
8
9
|
function getRouteComponents(routes, { globalApp, ssrMode, props }) {
|
|
9
10
|
const Layout = ({ Component, ...props })=>{
|
|
10
11
|
const GlobalLayout = globalApp;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type React from 'react';
|
|
2
2
|
import { type Root } from 'react-dom/client';
|
|
3
3
|
import type { TRuntimeContext } from '../context/runtime';
|
|
4
|
-
export declare const isReact18: () => boolean;
|
|
5
4
|
export declare function hydrateWithReact(App: React.ReactElement, rootElement: HTMLElement): Promise<Root>;
|
|
6
5
|
export declare function hydrateRoot(App: React.ReactElement, context: TRuntimeContext, ModernRender: (App: React.ReactElement) => Promise<HTMLElement | Root>, ModernHydrate: (App: React.ReactElement, callback?: () => void) => Promise<HTMLElement | Root>): Promise<HTMLElement | Root>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ServerUserConfig } from '@modern-js/app-tools';
|
|
2
|
-
import {
|
|
2
|
+
import type { StaticHandlerContext } from '@modern-js/runtime-utils/router';
|
|
3
3
|
import type { SSRConfig } from './shared';
|
|
4
4
|
export declare function attributesToString(attributes: Record<string, any>): string;
|
|
5
5
|
/**
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { AppTools, CliPlugin } from '@modern-js/app-tools';
|
|
2
2
|
import type { Entrypoint } from '@modern-js/types/cli';
|
|
3
|
+
export declare const processScriptPlaceholders: (html: string, nonce?: string) => string;
|
|
3
4
|
export declare const getDocumentByEntryName: (entrypoints: Entrypoint[], entryName: string, fallbackDir?: string) => string | undefined;
|
|
4
5
|
export declare const documentPlugin: () => CliPlugin<AppTools>;
|
|
5
6
|
export default documentPlugin;
|
|
@@ -23,11 +23,11 @@ export type DistributedSsrFragmentContext = {
|
|
|
23
23
|
required: true;
|
|
24
24
|
resolve?: (remote: string, expose: string, props: Record<string, unknown>) => DistributedSsrFragmentResult | PromiseLike<DistributedSsrFragmentResult>;
|
|
25
25
|
};
|
|
26
|
-
export type DistributedSsrBoundaryProps = {
|
|
26
|
+
export type DistributedSsrBoundaryProps<Props extends object = Record<string, unknown>> = {
|
|
27
27
|
children: ReactNode;
|
|
28
28
|
expose: string;
|
|
29
29
|
fallback: ReactNode;
|
|
30
|
-
fragmentProps?:
|
|
30
|
+
fragmentProps?: Props;
|
|
31
31
|
remote: string;
|
|
32
32
|
};
|
|
33
33
|
export type CreateDistributedSsrComponentOptions<Props extends object> = {
|
|
@@ -49,7 +49,7 @@ export declare function useDistributedSsrFragmentProps<Props extends object>({ b
|
|
|
49
49
|
* Node SSR has no distributed-fragment context and therefore renders the
|
|
50
50
|
* child normally, preserving Module Federation's in-process SSR path.
|
|
51
51
|
*/
|
|
52
|
-
export declare function DistributedSsrBoundary({ children, expose, fallback, fragmentProps, remote, }: DistributedSsrBoundaryProps): import("react").JSX.Element;
|
|
52
|
+
export declare function DistributedSsrBoundary<Props extends object = Record<string, unknown>>({ children, expose, fallback, fragmentProps, remote, }: DistributedSsrBoundaryProps<Props>): import("react").JSX.Element;
|
|
53
53
|
/**
|
|
54
54
|
* Defers creation of the native Module Federation component until React
|
|
55
55
|
* actually renders that child. A workerd request with a verified distributed
|
|
@@ -20,6 +20,6 @@ export type ModuleFederationManifestRecoveryPluginOptions = {
|
|
|
20
20
|
*/
|
|
21
21
|
export declare const createModuleFederationManifestRecoveryPlugin: (options?: ModuleFederationManifestRecoveryPluginOptions) => {
|
|
22
22
|
name: string;
|
|
23
|
-
errorLoadRemote(args: ErrorLoadRemoteArgs): Promise<
|
|
23
|
+
errorLoadRemote(args: ErrorLoadRemoteArgs): Promise<unknown>;
|
|
24
24
|
};
|
|
25
25
|
export default createModuleFederationManifestRecoveryPlugin;
|
|
@@ -5,6 +5,11 @@ import type { Entrypoint, NestedRouteForCli, PageRoute } from '@modern-js/types'
|
|
|
5
5
|
* Generate routing information for a single entry point (can be reused by the routes inspect feature)
|
|
6
6
|
*/
|
|
7
7
|
export declare function generateRoutesForEntry(entrypoint: Entrypoint, appContext: AppToolsContext): Promise<NestedRouteForCli[]>;
|
|
8
|
-
export declare const generateCode: (appContext: AppToolsContext, config: AppNormalizedConfig, entrypoints: Entrypoint[], api: CLIPluginAPI<AppTools
|
|
8
|
+
export declare const generateCode: (appContext: AppToolsContext, config: AppNormalizedConfig, entrypoints: Entrypoint[], api: CLIPluginAPI<AppTools>, options?: {
|
|
9
|
+
hydrateRscClientRoutes?: boolean;
|
|
10
|
+
includeRouteServerLoadersInSsrEntry?: boolean;
|
|
11
|
+
isolateRouteDataInRscLayer?: boolean;
|
|
12
|
+
serverRoutesFileName?: string;
|
|
13
|
+
}) => Promise<Record<string, (NestedRouteForCli | PageRoute)[]>>;
|
|
9
14
|
export declare function generatorRegisterCode(internalDirectory: string, entryName: string, code: string): void;
|
|
10
15
|
export declare function generatorServerRegisterCode(internalDirectory: string, entryName: string, code: string): void;
|
|
@@ -3,7 +3,7 @@ import type { Entrypoint, NestedRouteForCli, PageRoute, RouteLegacy, SSRMode } f
|
|
|
3
3
|
export declare const routesForServer: ({ routesForServerLoaderMatches, }: {
|
|
4
4
|
routesForServerLoaderMatches: (NestedRouteForCli | PageRoute)[];
|
|
5
5
|
}) => string;
|
|
6
|
-
export declare const fileSystemRoutes: ({ metaName, routes, ssrMode, nestedRoutesEntry, entryName, internalDirectory, splitRouteChunks, isRscClientBundle, srcDirectory, internalSrcAlias, }: {
|
|
6
|
+
export declare const fileSystemRoutes: ({ metaName, routes, ssrMode, nestedRoutesEntry, entryName, internalDirectory, splitRouteChunks, isRscClientBundle, hydrateRscClientRoutes, isolateRouteDataInRscLayer, srcDirectory, internalSrcAlias, }: {
|
|
7
7
|
metaName: string;
|
|
8
8
|
routes: RouteLegacy[] | (NestedRouteForCli | PageRoute)[];
|
|
9
9
|
ssrMode?: SSRMode;
|
|
@@ -12,11 +12,15 @@ export declare const fileSystemRoutes: ({ metaName, routes, ssrMode, nestedRoute
|
|
|
12
12
|
internalDirectory: string;
|
|
13
13
|
splitRouteChunks?: boolean;
|
|
14
14
|
isRscClientBundle?: boolean;
|
|
15
|
+
hydrateRscClientRoutes?: boolean;
|
|
16
|
+
isolateRouteDataInRscLayer?: boolean;
|
|
15
17
|
srcDirectory?: string;
|
|
16
18
|
internalSrcAlias?: string;
|
|
17
19
|
}) => Promise<string>;
|
|
18
|
-
export declare function ssrLoaderCombinedModule(entrypoints: Entrypoint[], entrypoint: Entrypoint, config: AppNormalizedConfig, appContext: AppToolsContext
|
|
19
|
-
|
|
20
|
+
export declare function ssrLoaderCombinedModule(entrypoints: Entrypoint[], entrypoint: Entrypoint, config: AppNormalizedConfig, appContext: AppToolsContext, options?: {
|
|
21
|
+
includeRouteServerLoaders?: boolean;
|
|
22
|
+
}): string | null;
|
|
23
|
+
export declare const runtimeGlobalContext: ({ entryName, metaName, srcDirectory, nestedRoutesEntry, internalSrcAlias, globalApp, rscType, routesImportPath, basename, }: {
|
|
20
24
|
entryName: string;
|
|
21
25
|
metaName: string;
|
|
22
26
|
srcDirectory: string;
|
|
@@ -24,5 +28,6 @@ export declare const runtimeGlobalContext: ({ entryName, metaName, srcDirectory,
|
|
|
24
28
|
internalSrcAlias: string;
|
|
25
29
|
globalApp?: string | false;
|
|
26
30
|
rscType?: 'server' | 'client' | false;
|
|
31
|
+
routesImportPath?: string;
|
|
27
32
|
basename?: string;
|
|
28
33
|
}) => Promise<string>;
|
|
@@ -10,6 +10,10 @@ type RegenerateRoutesFn = (params: {
|
|
|
10
10
|
}) => Promise<void>;
|
|
11
11
|
type HandleGeneratorEntryCodeOptions = {
|
|
12
12
|
entrypointsKey?: string;
|
|
13
|
+
hydrateRscClientRoutes?: boolean;
|
|
14
|
+
includeRouteServerLoadersInSsrEntry?: boolean;
|
|
15
|
+
isolateRouteDataInRscLayer?: boolean;
|
|
16
|
+
serverRoutesFileName?: string;
|
|
13
17
|
};
|
|
14
18
|
type HandleFileChangeOptions = {
|
|
15
19
|
includeEntry?: (entrypoint: Entrypoint) => boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const handleRSCRedirect: (headers: Headers, basename: string, status: number) => Response;
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import type { ShouldRevalidateFunction } from '@modern-js/runtime-utils/router';
|
|
2
2
|
import type { ElementType } from 'react';
|
|
3
|
+
export type ModernRouteErrorResponse = {
|
|
4
|
+
status: number;
|
|
5
|
+
statusText: string;
|
|
6
|
+
internal: boolean;
|
|
7
|
+
data: unknown;
|
|
8
|
+
};
|
|
9
|
+
export declare const isRouteErrorResponse: (error: unknown) => error is ModernRouteErrorResponse;
|
|
3
10
|
export declare const createShouldRevalidate: (routeId: string) => ShouldRevalidateFunction;
|
|
4
11
|
export declare const resolveRouteComponent: (routeModule: unknown) => ElementType<Record<string, unknown>>;
|
|
5
12
|
export declare const handleRouteModule: (routeModule: unknown, routeId: string) => unknown;
|
|
@@ -2,6 +2,7 @@ import { type RouteObject, type StaticHandlerContext } from '@modern-js/runtime-
|
|
|
2
2
|
import React from 'react';
|
|
3
3
|
import type { ServerPayload } from '../../core/context';
|
|
4
4
|
import type { RouteManifest } from './types';
|
|
5
|
+
export { handleRSCRedirect } from './redirect';
|
|
5
6
|
declare global {
|
|
6
7
|
interface Window {
|
|
7
8
|
_MODERNJS_ROUTE_MANIFEST?: RouteManifest;
|
|
@@ -9,7 +10,6 @@ declare global {
|
|
|
9
10
|
}
|
|
10
11
|
}
|
|
11
12
|
export declare const createServerPayload: (routerContext: StaticHandlerContext, routes: RouteObject[]) => ServerPayload;
|
|
12
|
-
export declare const handleRSCRedirect: (headers: Headers, basename: string, status: number) => Response;
|
|
13
13
|
export declare const prepareRSCRoutes: (routes: RouteObject[]) => Promise<void>;
|
|
14
14
|
export declare const createClientRouterFromPayload: (payload: ServerPayload, originalRoutes: RouteObject[], basename?: string) => import("react-router").DataRouter;
|
|
15
15
|
interface RSCStaticRouterProps {
|
|
@@ -17,4 +17,3 @@ interface RSCStaticRouterProps {
|
|
|
17
17
|
useJsonScript?: boolean;
|
|
18
18
|
}
|
|
19
19
|
export declare const RSCStaticRouter: React.FC<RSCStaticRouterProps>;
|
|
20
|
-
export {};
|
package/package.json
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"modern",
|
|
18
18
|
"modern.js"
|
|
19
19
|
],
|
|
20
|
-
"version": "3.
|
|
20
|
+
"version": "3.8.1-ultramodern.2",
|
|
21
21
|
"engines": {
|
|
22
22
|
"node": ">=20"
|
|
23
23
|
},
|
|
@@ -246,12 +246,12 @@
|
|
|
246
246
|
"dependencies": {
|
|
247
247
|
"@loadable/component": "5.16.7",
|
|
248
248
|
"@loadable/server": "5.16.7",
|
|
249
|
-
"@modern-js/plugin": "npm:@bleedingdev/modern-js-plugin@3.
|
|
250
|
-
"@modern-js/plugin-data-loader": "npm:@bleedingdev/modern-js-plugin-data-loader@3.
|
|
251
|
-
"@modern-js/render": "npm:@bleedingdev/modern-js-render@3.
|
|
252
|
-
"@modern-js/runtime-utils": "npm:@bleedingdev/modern-js-runtime-utils@3.
|
|
253
|
-
"@modern-js/types": "npm:@bleedingdev/modern-js-types@3.
|
|
254
|
-
"@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.
|
|
249
|
+
"@modern-js/plugin": "npm:@bleedingdev/modern-js-plugin@3.8.1-ultramodern.2",
|
|
250
|
+
"@modern-js/plugin-data-loader": "npm:@bleedingdev/modern-js-plugin-data-loader@3.8.1-ultramodern.2",
|
|
251
|
+
"@modern-js/render": "npm:@bleedingdev/modern-js-render@3.8.1-ultramodern.2",
|
|
252
|
+
"@modern-js/runtime-utils": "npm:@bleedingdev/modern-js-runtime-utils@3.8.1-ultramodern.2",
|
|
253
|
+
"@modern-js/types": "npm:@bleedingdev/modern-js-types@3.8.1-ultramodern.2",
|
|
254
|
+
"@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.8.1-ultramodern.2",
|
|
255
255
|
"@swc/core": "1.15.43",
|
|
256
256
|
"@swc/helpers": "^0.5.23",
|
|
257
257
|
"@swc/plugin-loadable-components": "^11.15.0",
|
|
@@ -265,14 +265,14 @@
|
|
|
265
265
|
"isbot": "5.2.0",
|
|
266
266
|
"react-helmet": "^6.1.0",
|
|
267
267
|
"react-helmet-async": "3.0.0",
|
|
268
|
-
"react-is": "^19.2.
|
|
268
|
+
"react-is": "^19.2.8"
|
|
269
269
|
},
|
|
270
270
|
"peerDependencies": {
|
|
271
|
-
"react": "^19.2.
|
|
272
|
-
"react-dom": "^19.2.
|
|
271
|
+
"react": "^19.2.8",
|
|
272
|
+
"react-dom": "^19.2.8"
|
|
273
273
|
},
|
|
274
274
|
"devDependencies": {
|
|
275
|
-
"@modern-js/app-tools": "npm:@bleedingdev/modern-js-app-tools@3.
|
|
275
|
+
"@modern-js/app-tools": "npm:@bleedingdev/modern-js-app-tools@3.8.1-ultramodern.2",
|
|
276
276
|
"@remix-run/web-fetch": "^4.4.2",
|
|
277
277
|
"@rsbuild/core": "2.1.5",
|
|
278
278
|
"@rslib/core": "0.23.2",
|
|
@@ -282,10 +282,10 @@
|
|
|
282
282
|
"@types/cookie": "0.6.0",
|
|
283
283
|
"@types/invariant": "^2.2.37",
|
|
284
284
|
"@types/loadable__server": "5.12.11",
|
|
285
|
-
"@types/node": "^26.
|
|
285
|
+
"@types/node": "^26.2.0",
|
|
286
286
|
"@typescript/native-preview": "7.0.0-dev.20260707.2",
|
|
287
|
-
"react": "^19.2.
|
|
288
|
-
"react-dom": "^19.2.
|
|
287
|
+
"react": "^19.2.8",
|
|
288
|
+
"react-dom": "^19.2.8",
|
|
289
289
|
"ts-node": "^10.9.2",
|
|
290
290
|
"typescript": "^7.0.2"
|
|
291
291
|
},
|
package/rstest.config.mts
CHANGED
|
@@ -24,6 +24,7 @@ export default {
|
|
|
24
24
|
testEnvironment: 'node',
|
|
25
25
|
exclude: [
|
|
26
26
|
'tests/boundary-debugger/client.test.tsx',
|
|
27
|
+
'tests/router/plugin.client.test.tsx',
|
|
27
28
|
'tests/router/prefetch.test.tsx',
|
|
28
29
|
],
|
|
29
30
|
extends: commonConfig,
|
|
@@ -51,6 +52,7 @@ export default {
|
|
|
51
52
|
testEnvironment: 'happy-dom',
|
|
52
53
|
include: [
|
|
53
54
|
'tests/boundary-debugger/client.test.tsx',
|
|
55
|
+
'tests/router/plugin.client.test.tsx',
|
|
54
56
|
'tests/router/prefetch.test.tsx',
|
|
55
57
|
],
|
|
56
58
|
extends: commonConfig,
|