@module-federation/nextjs-mf 5.5.1 → 5.6.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/README.md +1 -27
- package/{lib/client → client}/CombinedPages.d.ts +27 -28
- package/client/CombinedPages.js +38 -0
- package/client/CombinedPages.js.map +1 -0
- package/{lib/client → client}/MFClient.d.ts +72 -73
- package/client/MFClient.js +159 -0
- package/client/MFClient.js.map +1 -0
- package/{lib/client → client}/RemoteContainer.d.ts +46 -58
- package/client/RemoteContainer.js +121 -0
- package/client/RemoteContainer.js.map +1 -0
- package/{lib/client → client}/RemotePages.d.ts +49 -49
- package/client/RemotePages.js +138 -0
- package/client/RemotePages.js.map +1 -0
- package/{lib/client → client}/UrlNode.d.ts +17 -18
- package/{lib/client → client}/UrlNode.js +157 -161
- package/client/UrlNode.js.map +1 -0
- package/{lib/client → client}/helpers.d.ts +16 -17
- package/{lib/client → client}/helpers.js +90 -104
- package/client/helpers.js.map +1 -0
- package/client/index.d.ts +2 -0
- package/client/index.js +6 -0
- package/client/index.js.map +1 -0
- package/{lib/client → client}/useMFClient.d.ts +24 -25
- package/client/useMFClient.js +55 -0
- package/client/useMFClient.js.map +1 -0
- package/{lib/client → client}/useMFRemote.d.ts +16 -17
- package/client/useMFRemote.js +50 -0
- package/client/useMFRemote.js.map +1 -0
- package/jest.config.d.ts +13 -0
- package/jest.config.js +18 -0
- package/jest.config.js.map +1 -0
- package/package.json +19 -42
- package/src/include-defaults.d.ts +0 -0
- package/{lib → src}/include-defaults.js +4 -3
- package/src/include-defaults.js.map +1 -0
- package/src/index.d.ts +3 -0
- package/src/index.js +9 -0
- package/src/index.js.map +1 -0
- package/src/internal.d.ts +12 -0
- package/src/internal.js +260 -0
- package/src/internal.js.map +1 -0
- package/src/loaders/fixImageLoader.d.ts +16 -0
- package/src/loaders/fixImageLoader.js +53 -0
- package/src/loaders/fixImageLoader.js.map +1 -0
- package/src/loaders/fixUrlLoader.d.ts +13 -0
- package/src/loaders/fixUrlLoader.js +25 -0
- package/src/loaders/fixUrlLoader.js.map +1 -0
- package/src/loaders/helpers.d.ts +10 -0
- package/src/loaders/helpers.js +46 -0
- package/src/loaders/helpers.js.map +1 -0
- package/src/loaders/nextPageMapLoader.d.ts +15 -0
- package/src/loaders/nextPageMapLoader.js +151 -0
- package/src/loaders/nextPageMapLoader.js.map +1 -0
- package/src/loaders/patchNextClientPageLoader.d.ts +7 -0
- package/src/loaders/patchNextClientPageLoader.js +43 -0
- package/src/loaders/patchNextClientPageLoader.js.map +1 -0
- package/src/plugins/AddRuntimeRequirementToPromiseExternalPlugin.d.ts +5 -0
- package/src/plugins/AddRuntimeRequirementToPromiseExternalPlugin.js +19 -0
- package/src/plugins/AddRuntimeRequirementToPromiseExternalPlugin.js.map +1 -0
- package/src/plugins/ChildFederationPlugin.d.ts +9 -0
- package/src/plugins/ChildFederationPlugin.js +281 -0
- package/src/plugins/ChildFederationPlugin.js.map +1 -0
- package/src/plugins/DevHmrFixInvalidPongPlugin.d.ts +11 -0
- package/src/plugins/DevHmrFixInvalidPongPlugin.js +55 -0
- package/src/plugins/DevHmrFixInvalidPongPlugin.js.map +1 -0
- package/src/plugins/ModuleFederationPlugin.d.ts +7 -0
- package/src/plugins/ModuleFederationPlugin.js +50 -0
- package/src/plugins/ModuleFederationPlugin.js.map +1 -0
- package/src/plugins/NextFederationPlugin.d.ts +9 -0
- package/src/plugins/NextFederationPlugin.js +111 -0
- package/src/plugins/NextFederationPlugin.js.map +1 -0
- package/src/plugins/RemoveRRRuntimePlugin.d.ts +5 -0
- package/src/plugins/RemoveRRRuntimePlugin.js +39 -0
- package/src/plugins/RemoveRRRuntimePlugin.js.map +1 -0
- package/utils/Template.d.ts +148 -0
- package/utils/Template.js +381 -0
- package/utils/Template.js.map +1 -0
- package/utils/build-utils.d.ts +3 -0
- package/utils/build-utils.js +175 -0
- package/utils/build-utils.js.map +1 -0
- package/utils/index.d.ts +1 -0
- package/utils/index.js +7 -0
- package/utils/index.js.map +1 -0
- package/.prettierignore +0 -2
- package/.prettierrc +0 -7
- package/LICENSE +0 -21
- package/lib/ModuleFederationPlugin.js +0 -84
- package/lib/NextFederationPlugin.js +0 -513
- package/lib/_virtual/Template.js +0 -7
- package/lib/_virtual/UrlNode.js +0 -9
- package/lib/_virtual/_commonjsHelpers.js +0 -44
- package/lib/_virtual/_fast-glob.js +0 -16
- package/lib/_virtual/_fs.js +0 -16
- package/lib/_virtual/_path.js +0 -16
- package/lib/_virtual/_tslib.js +0 -277
- package/lib/_virtual/_webpack-sources.js +0 -16
- package/lib/_virtual/fs.js +0 -4
- package/lib/_virtual/fs2.js +0 -7
- package/lib/_virtual/helpers.js +0 -7
- package/lib/_virtual/nextPageMapLoader.js +0 -7
- package/lib/_virtual/options.js +0 -7
- package/lib/_virtual/utils.js +0 -7
- package/lib/build-utils.js +0 -176
- package/lib/client/CombinedPages.d.ts.map +0 -1
- package/lib/client/CombinedPages.js +0 -60
- package/lib/client/MFClient.d.ts.map +0 -1
- package/lib/client/MFClient.js +0 -213
- package/lib/client/RemoteContainer.d.ts.map +0 -1
- package/lib/client/RemoteContainer.js +0 -162
- package/lib/client/RemotePages.d.ts.map +0 -1
- package/lib/client/RemotePages.js +0 -194
- package/lib/client/UrlNode.d.ts.map +0 -1
- package/lib/client/helpers.d.ts.map +0 -1
- package/lib/client/useMFClient.d.ts.map +0 -1
- package/lib/client/useMFClient.js +0 -79
- package/lib/client/useMFRemote.d.ts.map +0 -1
- package/lib/client/useMFRemote.js +0 -72
- package/lib/dependencies/webpack/lib/Template.js +0 -437
- package/lib/dependencies/webpack/lib/container/options.js +0 -102
- package/lib/dependencies/webpack/lib/sharing/utils.js +0 -104
- package/lib/dependencies/webpack/lib/util/fs.js +0 -359
- package/lib/index.js +0 -3
- package/lib/internal.js +0 -271
- package/lib/loaders/UrlNode.js +0 -219
- package/lib/loaders/fixImageLoader.js +0 -65
- package/lib/loaders/fixUrlLoader.js +0 -25
- package/lib/loaders/helpers.js +0 -60
- package/lib/loaders/nextPageMapLoader.js +0 -200
- package/lib/loaders/patchNextClientPageLoader.js +0 -53
- package/lib/node-plugin/streaming/CommonJsChunkLoadingPlugin.js +0 -94
- package/lib/node-plugin/streaming/LoadFileChunkLoadingRuntimeModule.js +0 -414
- package/lib/node-plugin/streaming/index.js +0 -46
- package/lib/node-plugin/streaming/loadScript.js +0 -59
- package/lib/plugins/DevHmrFixInvalidPongPlugin.js +0 -82
- package/lib/utils.js +0 -125
- package/node-plugin/README.md +0 -27
- package/node-plugin/package.json +0 -4
- package/node-plugin/streaming/CommonJsChunkLoadingPlugin.js +0 -89
- package/node-plugin/streaming/LoadFileChunkLoadingRuntimeModule.js +0 -410
- package/node-plugin/streaming/NodeRuntime.js +0 -245
- package/node-plugin/streaming/index.js +0 -42
- package/node-plugin/streaming/loadScript.js +0 -51
- package/tsconfig.json +0 -33
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RemoteContainer = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const eventemitter3_1 = tslib_1.__importDefault(require("eventemitter3"));
|
|
6
|
+
const utils_1 = require("../utils");
|
|
7
|
+
/**
|
|
8
|
+
* This is a Lazy loader of webpack remote container with some NextJS-specific helper methods.
|
|
9
|
+
*
|
|
10
|
+
* It provides the ability to register remote, and load & init it on the first use.
|
|
11
|
+
*/
|
|
12
|
+
class RemoteContainer {
|
|
13
|
+
constructor(opts) {
|
|
14
|
+
this.global = opts.global;
|
|
15
|
+
this.url = opts.url;
|
|
16
|
+
this.events = new eventemitter3_1.default();
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Create or reuse existed remote entry.
|
|
20
|
+
*
|
|
21
|
+
* Be careful, Singleton pattern does not work well in webpack builds,
|
|
22
|
+
* because one module may be copied between different chunks. In such a way
|
|
23
|
+
* you obtain several lists of instances.
|
|
24
|
+
*/
|
|
25
|
+
static createSingleton(remote) {
|
|
26
|
+
let data;
|
|
27
|
+
if (typeof remote === 'string') {
|
|
28
|
+
const [global, url] = remote.split('@');
|
|
29
|
+
data = { global, url };
|
|
30
|
+
}
|
|
31
|
+
else if (remote?.global && remote?.url) {
|
|
32
|
+
data = { global: remote.global, url: remote.url };
|
|
33
|
+
}
|
|
34
|
+
if (!data) {
|
|
35
|
+
console.error(`Cannot init RemoteContainer with following data`, RemoteContainer);
|
|
36
|
+
throw Error('[nextjs-mf] RemoteContainer.createSingleton(remote) accepts string "shop@http://example.com/_next/static/chunks/remoteEntry.js" OR object { global: "shop", url: "http://example.com/_next/static/chunks/remoteEntry.js"}');
|
|
37
|
+
}
|
|
38
|
+
let container;
|
|
39
|
+
if (this.instances[data.global]) {
|
|
40
|
+
container = this.instances[data.global];
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
container = new RemoteContainer(data);
|
|
44
|
+
this.instances[data.global] = container;
|
|
45
|
+
}
|
|
46
|
+
return container;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Check is the current remoteEntry.js loaded or not
|
|
50
|
+
*/
|
|
51
|
+
isLoaded() {
|
|
52
|
+
return !!this.container;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Returns initialized webpack RemoteContainer.
|
|
56
|
+
* If its' script does not loaded - then load & init it firstly.
|
|
57
|
+
*/
|
|
58
|
+
async getContainer() {
|
|
59
|
+
if (this.container) {
|
|
60
|
+
return this.container;
|
|
61
|
+
}
|
|
62
|
+
this.events.emit('loadStart', this);
|
|
63
|
+
try {
|
|
64
|
+
const container = await (0, utils_1.injectScript)({
|
|
65
|
+
global: this.global,
|
|
66
|
+
url: this.url,
|
|
67
|
+
});
|
|
68
|
+
if (container) {
|
|
69
|
+
this.container = container;
|
|
70
|
+
this.events.emit('loadComplete', this);
|
|
71
|
+
return container;
|
|
72
|
+
}
|
|
73
|
+
throw Error(`[nextjs-mf] Remote container ${this.url} is empty`);
|
|
74
|
+
}
|
|
75
|
+
catch (e) {
|
|
76
|
+
this.error = e;
|
|
77
|
+
this.events.emit('loadError', e.message, this);
|
|
78
|
+
throw e;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Return remote module from container.
|
|
83
|
+
* If you provide `exportName` it automatically return exact property value from module.
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* remote.getModule('./pages/index', 'default')
|
|
87
|
+
*/
|
|
88
|
+
async getModule(modulePath, exportName) {
|
|
89
|
+
const container = await this.getContainer();
|
|
90
|
+
const modFactory = await container.get(modulePath);
|
|
91
|
+
if (!modFactory)
|
|
92
|
+
return undefined;
|
|
93
|
+
const mod = modFactory();
|
|
94
|
+
if (exportName) {
|
|
95
|
+
return mod && typeof mod === 'object' ? mod[exportName] : undefined;
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
return mod;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Retrieve registered nextjs' routes from remote app
|
|
103
|
+
*/
|
|
104
|
+
async getPageMap() {
|
|
105
|
+
if (this.pageMap) {
|
|
106
|
+
return this.pageMap;
|
|
107
|
+
}
|
|
108
|
+
const pageMap = await this.getModule('./pages-map-v2', 'default');
|
|
109
|
+
if (pageMap) {
|
|
110
|
+
this.pageMap = pageMap;
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
this.pageMap = {};
|
|
114
|
+
console.warn(`[nextjs-mf] Container ${this.global} does not expose "./pages-map-v2" module.`);
|
|
115
|
+
}
|
|
116
|
+
return this.pageMap;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
exports.RemoteContainer = RemoteContainer;
|
|
120
|
+
RemoteContainer.instances = {};
|
|
121
|
+
//# sourceMappingURL=RemoteContainer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RemoteContainer.js","sourceRoot":"","sources":["../../../../packages/nextjs-mf/client/RemoteContainer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,49 +1,49 @@
|
|
|
1
|
-
import { PageMap
|
|
2
|
-
|
|
3
|
-
export declare type
|
|
4
|
-
export declare type
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
*
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
private
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
*
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
1
|
+
import type { PageMap } from '@module-federation/utilities';
|
|
2
|
+
import { RemoteContainer } from './RemoteContainer';
|
|
3
|
+
export declare type PathPrefix = string;
|
|
4
|
+
export declare type RemoteToRoutes = Map<RemoteContainer, PathPrefix | PathPrefix[]>;
|
|
5
|
+
export declare type RouteInfo = {
|
|
6
|
+
component: any;
|
|
7
|
+
exports: any;
|
|
8
|
+
styles: string[];
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* A class which prepares/loads a list of remotes pages and knows how
|
|
12
|
+
* to prepare NextJS pseudo-module of route data.
|
|
13
|
+
*/
|
|
14
|
+
export declare class RemotePages {
|
|
15
|
+
paths: Record<PathPrefix, RemoteContainer>;
|
|
16
|
+
pageListCache: string[] | undefined;
|
|
17
|
+
private asyncLoadedPageMaps;
|
|
18
|
+
private mode?;
|
|
19
|
+
constructor(mode?: 'production' | 'development');
|
|
20
|
+
/**
|
|
21
|
+
* Add remote routes for specific RemoteContainer which serves them.
|
|
22
|
+
*/
|
|
23
|
+
addRoutes(routes: string | string[], remote: RemoteContainer): void;
|
|
24
|
+
/**
|
|
25
|
+
* Load a remote page map and add its routes to registry.
|
|
26
|
+
*/
|
|
27
|
+
loadRemotePageMap(remote: RemoteContainer): Promise<PageMap | undefined>;
|
|
28
|
+
/**
|
|
29
|
+
* Get remote module according to provided next route.
|
|
30
|
+
* Under the hood it automatically determines which remote need to be used.
|
|
31
|
+
*/
|
|
32
|
+
routeToPageModule(route: string): Promise<any>;
|
|
33
|
+
/**
|
|
34
|
+
* Check that provided route present in registry.
|
|
35
|
+
*/
|
|
36
|
+
hasRoute(route: string): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Find remote according to provided route.
|
|
39
|
+
*/
|
|
40
|
+
routeToRemote(route: string): RemoteContainer | undefined;
|
|
41
|
+
/**
|
|
42
|
+
* Get cached unsorted list of remote routes.
|
|
43
|
+
*/
|
|
44
|
+
getPageList(): string[];
|
|
45
|
+
/**
|
|
46
|
+
* Get prepared pseudo-module which is consumed by Nextjs' router.
|
|
47
|
+
*/
|
|
48
|
+
getRouteInfo(route: string): Promise<undefined | RouteInfo>;
|
|
49
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RemotePages = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const React = tslib_1.__importStar(require("react"));
|
|
6
|
+
/**
|
|
7
|
+
* A class which prepares/loads a list of remotes pages and knows how
|
|
8
|
+
* to prepare NextJS pseudo-module of route data.
|
|
9
|
+
*/
|
|
10
|
+
class RemotePages {
|
|
11
|
+
constructor(mode) {
|
|
12
|
+
this.paths = {};
|
|
13
|
+
this.asyncLoadedPageMaps = new Set();
|
|
14
|
+
this.pageListCache = undefined;
|
|
15
|
+
this.mode = mode;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Add remote routes for specific RemoteContainer which serves them.
|
|
19
|
+
*/
|
|
20
|
+
addRoutes(routes, remote) {
|
|
21
|
+
if (Array.isArray(routes)) {
|
|
22
|
+
routes.forEach((route) => {
|
|
23
|
+
this.paths[route] = remote;
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
this.paths[routes] = remote;
|
|
28
|
+
}
|
|
29
|
+
this.pageListCache = Object.keys(this.paths);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Load a remote page map and add its routes to registry.
|
|
33
|
+
*/
|
|
34
|
+
async loadRemotePageMap(remote) {
|
|
35
|
+
const pageMap = await remote.getPageMap();
|
|
36
|
+
if (!pageMap)
|
|
37
|
+
return undefined;
|
|
38
|
+
// init once page map from remote if it wasn't done before
|
|
39
|
+
// here we updating real routes received from remote app in runtime
|
|
40
|
+
if (!this.asyncLoadedPageMaps.has(remote)) {
|
|
41
|
+
this.asyncLoadedPageMaps.add(remote);
|
|
42
|
+
this.addRoutes(Object.keys(pageMap), remote);
|
|
43
|
+
}
|
|
44
|
+
return pageMap;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Get remote module according to provided next route.
|
|
48
|
+
* Under the hood it automatically determines which remote need to be used.
|
|
49
|
+
*/
|
|
50
|
+
async routeToPageModule(route) {
|
|
51
|
+
const remote = this.routeToRemote(route);
|
|
52
|
+
if (!remote) {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
const pageMap = await this.loadRemotePageMap(remote);
|
|
56
|
+
if (!pageMap) {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
const modulePath = pageMap[route];
|
|
60
|
+
if (!modulePath) {
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
return remote.getModule(modulePath);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Check that provided route present in registry.
|
|
67
|
+
*/
|
|
68
|
+
hasRoute(route) {
|
|
69
|
+
return !!this.pageListCache?.includes(route);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Find remote according to provided route.
|
|
73
|
+
*/
|
|
74
|
+
routeToRemote(route) {
|
|
75
|
+
let bestMatch;
|
|
76
|
+
for (const basepath in this.paths) {
|
|
77
|
+
if (route === basepath) {
|
|
78
|
+
return this.paths[basepath];
|
|
79
|
+
}
|
|
80
|
+
else if (route.startsWith(`${basepath}/`)) {
|
|
81
|
+
if (!bestMatch) {
|
|
82
|
+
bestMatch = basepath;
|
|
83
|
+
}
|
|
84
|
+
else if (bestMatch.length < basepath.length) {
|
|
85
|
+
bestMatch = basepath;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (bestMatch) {
|
|
90
|
+
return this.paths[bestMatch];
|
|
91
|
+
}
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Get cached unsorted list of remote routes.
|
|
96
|
+
*/
|
|
97
|
+
getPageList() {
|
|
98
|
+
// it's very important to return the same Array instance
|
|
99
|
+
// because it instance is used in CombinedPages for recalculation of sorted version of all routes
|
|
100
|
+
const pageList = this.pageListCache || Object.keys(this.paths);
|
|
101
|
+
this.pageListCache = pageList;
|
|
102
|
+
return pageList;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Get prepared pseudo-module which is consumed by Nextjs' router.
|
|
106
|
+
*/
|
|
107
|
+
async getRouteInfo(route) {
|
|
108
|
+
let routeInfo;
|
|
109
|
+
try {
|
|
110
|
+
const mod = await this.routeToPageModule(route);
|
|
111
|
+
if (mod) {
|
|
112
|
+
routeInfo = {
|
|
113
|
+
component: mod.default,
|
|
114
|
+
exports: mod,
|
|
115
|
+
styles: [],
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch (e) {
|
|
120
|
+
if (this.mode !== 'development') {
|
|
121
|
+
// in PROD throw error, nextjs will reload the page according to its internal logic
|
|
122
|
+
throw e;
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
// in DEV mod show error in browser
|
|
126
|
+
console.warn(e);
|
|
127
|
+
routeInfo = {
|
|
128
|
+
component: () => React.createElement('div', null, React.createElement('div', null, 'This page is shown only in DEVELOPMENT mode. In PRODUCTION NextJS will reload this page trying to obtain it again from the server.'), React.createElement('div', null, 'Federated page ', route, ' load error:'), React.createElement('div', null, React.createElement('b', null, e.message))),
|
|
129
|
+
exports: {},
|
|
130
|
+
styles: [],
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return routeInfo;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
exports.RemotePages = RemotePages;
|
|
138
|
+
//# sourceMappingURL=RemotePages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RemotePages.js","sourceRoot":"","sources":["../../../../packages/nextjs-mf/client/RemotePages.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,17 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* This class provides a logic of sorting dynamic routes in NextJS.
|
|
3
|
-
*
|
|
4
|
-
* It was copied from
|
|
5
|
-
* @see https://github.com/vercel/next.js/blob/canary/packages/next/shared/lib/router/utils/sorted-routes.ts
|
|
6
|
-
*/
|
|
7
|
-
export declare class UrlNode {
|
|
8
|
-
placeholder: boolean;
|
|
9
|
-
children: Map<string, UrlNode>;
|
|
10
|
-
slugName: string | null;
|
|
11
|
-
restSlugName: string | null;
|
|
12
|
-
optionalRestSlugName: string | null;
|
|
13
|
-
insert(urlPath: string): void;
|
|
14
|
-
smoosh(): string[];
|
|
15
|
-
private _smoosh;
|
|
16
|
-
private _insert;
|
|
17
|
-
}
|
|
18
|
-
//# sourceMappingURL=UrlNode.d.ts.map
|
|
1
|
+
/**
|
|
2
|
+
* This class provides a logic of sorting dynamic routes in NextJS.
|
|
3
|
+
*
|
|
4
|
+
* It was copied from
|
|
5
|
+
* @see https://github.com/vercel/next.js/blob/canary/packages/next/shared/lib/router/utils/sorted-routes.ts
|
|
6
|
+
*/
|
|
7
|
+
export declare class UrlNode {
|
|
8
|
+
placeholder: boolean;
|
|
9
|
+
children: Map<string, UrlNode>;
|
|
10
|
+
slugName: string | null;
|
|
11
|
+
restSlugName: string | null;
|
|
12
|
+
optionalRestSlugName: string | null;
|
|
13
|
+
insert(urlPath: string): void;
|
|
14
|
+
smoosh(): string[];
|
|
15
|
+
private _smoosh;
|
|
16
|
+
private _insert;
|
|
17
|
+
}
|