@module-federation/devtools 0.21.3 → 0.21.4

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.
@@ -48,7 +48,8 @@ import {
48
48
  ENABLEHMR,
49
49
  __ENABLE_FAST_REFRESH__,
50
50
  BROWSER_ENV_KEY,
51
- __FEDERATION_DEVTOOLS__
51
+ __FEDERATION_DEVTOOLS__,
52
+ __EAGER_SHARE__
52
53
  } from "../../template/constant";
53
54
  const Layout = (props) => {
54
55
  const {
@@ -178,6 +179,7 @@ const Layout = (props) => {
178
179
  mergeStorage(__FEDERATION_DEVTOOLS__, __ENABLE_FAST_REFRESH__, on);
179
180
  } else {
180
181
  removeStorageKey(__FEDERATION_DEVTOOLS__, __ENABLE_FAST_REFRESH__);
182
+ removeStorageKey(__FEDERATION_DEVTOOLS__, __EAGER_SHARE__);
181
183
  }
182
184
  injectScript(reloadPage, false);
183
185
  };
@@ -50,12 +50,14 @@ const statusInfo = {
50
50
  }
51
51
  };
52
52
  const __ENABLE_FAST_REFRESH__ = "enableFastRefresh";
53
+ const __EAGER_SHARE__ = "eagerShare";
53
54
  const BROWSER_ENV_KEY = "MF_ENV";
54
55
  const __FEDERATION_DEVTOOLS__ = "__MF_DEVTOOLS__";
55
56
  export {
56
57
  BROWSER_ENV_KEY,
57
58
  ENABLEHMR,
58
59
  FormID,
60
+ __EAGER_SHARE__,
59
61
  __ENABLE_FAST_REFRESH__,
60
62
  __FEDERATION_DEVTOOLS__,
61
63
  defaultDataItem,
@@ -50,7 +50,48 @@ var _a;
50
50
  import { loadScript } from "@module-federation/sdk";
51
51
  import { isObject, getUnpkgUrl } from "../index";
52
52
  import { definePropertyGlobalVal } from "../sdk";
53
- import { __FEDERATION_DEVTOOLS__ } from "../../template";
53
+ import {
54
+ __FEDERATION_DEVTOOLS__,
55
+ __EAGER_SHARE__,
56
+ __ENABLE_FAST_REFRESH__
57
+ } from "../../template/constant";
58
+ const SUPPORT_PKGS = ["react", "react-dom"];
59
+ const fetchAndExecuteUmdSync = (url) => {
60
+ try {
61
+ const response = new XMLHttpRequest();
62
+ response.open("GET", url, false);
63
+ response.overrideMimeType("text/plain");
64
+ response.send();
65
+ if (response.status === 200) {
66
+ const scriptContent = response.responseText;
67
+ const moduleFunction = new Function(scriptContent);
68
+ return moduleFunction(window);
69
+ } else {
70
+ throw new Error(
71
+ `Failed to load module from ${url}: HTTP ${response.status}`
72
+ );
73
+ }
74
+ } catch (error) {
75
+ throw new Error(`Failed to fetch module from ${url}: ${error.message}`);
76
+ }
77
+ };
78
+ const getDevtoolsMessage = () => {
79
+ const devtoolsMessageStr = localStorage.getItem(__FEDERATION_DEVTOOLS__);
80
+ if (devtoolsMessageStr) {
81
+ try {
82
+ return JSON.parse(devtoolsMessageStr);
83
+ } catch (e) {
84
+ console.debug("Fast Refresh Plugin Error: ", e);
85
+ }
86
+ }
87
+ return null;
88
+ };
89
+ const devtoolsMessage = getDevtoolsMessage();
90
+ if ((devtoolsMessage == null ? void 0 : devtoolsMessage[__ENABLE_FAST_REFRESH__]) && (devtoolsMessage == null ? void 0 : devtoolsMessage[__EAGER_SHARE__])) {
91
+ const [_name, version] = devtoolsMessage[__EAGER_SHARE__];
92
+ fetchAndExecuteUmdSync(getUnpkgUrl("react", version));
93
+ fetchAndExecuteUmdSync(getUnpkgUrl("react-dom", version));
94
+ }
54
95
  const fastRefreshPlugin = () => {
55
96
  return {
56
97
  name: "mf-fast-refresh-plugin",
@@ -58,17 +99,22 @@ const fastRefreshPlugin = () => {
58
99
  var _b = _a2, { userOptions } = _b, args = __objRest(_b, ["userOptions"]);
59
100
  const shareInfo = userOptions.shared;
60
101
  const twinsShareInfo = args.shareInfo;
61
- let enableFastRefresh;
62
- let devtoolsMessage;
102
+ let enableFastRefresh = false;
103
+ let devtoolsMessage2 = {};
63
104
  const devtoolsMessageStr = localStorage.getItem(__FEDERATION_DEVTOOLS__);
64
105
  if (devtoolsMessageStr) {
65
106
  try {
66
- devtoolsMessage = JSON.parse(devtoolsMessageStr);
67
- enableFastRefresh = devtoolsMessage == null ? void 0 : devtoolsMessage.enableFastRefresh;
107
+ devtoolsMessage2 = JSON.parse(devtoolsMessageStr);
108
+ enableFastRefresh = devtoolsMessage2 == null ? void 0 : devtoolsMessage2[__ENABLE_FAST_REFRESH__];
68
109
  } catch (e) {
69
110
  console.debug("Fast Refresh Plugin Error: ", e);
70
111
  }
71
112
  }
113
+ if (!enableFastRefresh) {
114
+ return __spreadValues({
115
+ userOptions
116
+ }, args);
117
+ }
72
118
  if (shareInfo && isObject(shareInfo)) {
73
119
  let orderResolve;
74
120
  const orderPromise = new Promise((resolve) => {
@@ -81,10 +127,37 @@ const fastRefreshPlugin = () => {
81
127
  twinsSharedArr = Array.isArray(twinsShareInfo[share]) ? twinsShareInfo[share] : [twinsShareInfo[share]];
82
128
  }
83
129
  sharedArr.forEach((shared, idx) => {
130
+ var _a3;
131
+ if (!SUPPORT_PKGS.includes(share)) {
132
+ return;
133
+ }
134
+ if ((_a3 = shared.shareConfig) == null ? void 0 : _a3.eager) {
135
+ if (!(devtoolsMessage2 == null ? void 0 : devtoolsMessage2[__EAGER_SHARE__])) {
136
+ const eagerShare = [];
137
+ eagerShare.push(share, shared.version);
138
+ devtoolsMessage2[__EAGER_SHARE__] = eagerShare;
139
+ localStorage.setItem(
140
+ __FEDERATION_DEVTOOLS__,
141
+ JSON.stringify(devtoolsMessage2)
142
+ );
143
+ window.location.reload();
144
+ }
145
+ if (share === "react-dom") {
146
+ shared.lib = () => window.ReactDOM;
147
+ }
148
+ if (share === "react") {
149
+ shared.lib = () => window.React;
150
+ }
151
+ return;
152
+ }
84
153
  let get;
85
154
  if (share === "react") {
86
155
  get = () => loadScript(getUnpkgUrl(share, shared.version), {
87
- attrs: { defer: true, async: false }
156
+ attrs: {
157
+ defer: false,
158
+ async: false,
159
+ "data-mf-injected": "true"
160
+ }
88
161
  }).then(() => {
89
162
  orderResolve();
90
163
  });
@@ -96,7 +169,7 @@ const fastRefreshPlugin = () => {
96
169
  })
97
170
  );
98
171
  }
99
- if (enableFastRefresh && typeof get === "function") {
172
+ if (typeof get === "function") {
100
173
  if (share === "react") {
101
174
  shared.get = () => __async(this, null, function* () {
102
175
  if (!window.React) {
@@ -188,6 +188,7 @@ const Layout = (props) => {
188
188
  (0, import_utils.mergeStorage)(import_constant.__FEDERATION_DEVTOOLS__, import_constant.__ENABLE_FAST_REFRESH__, on);
189
189
  } else {
190
190
  (0, import_utils.removeStorageKey)(import_constant.__FEDERATION_DEVTOOLS__, import_constant.__ENABLE_FAST_REFRESH__);
191
+ (0, import_utils.removeStorageKey)(import_constant.__FEDERATION_DEVTOOLS__, import_constant.__EAGER_SHARE__);
191
192
  }
192
193
  (0, import_utils.injectScript)(import_utils.reloadPage, false);
193
194
  };
@@ -35,6 +35,7 @@ __export(constant_exports, {
35
35
  BROWSER_ENV_KEY: () => BROWSER_ENV_KEY,
36
36
  ENABLEHMR: () => ENABLEHMR,
37
37
  FormID: () => FormID,
38
+ __EAGER_SHARE__: () => __EAGER_SHARE__,
38
39
  __ENABLE_FAST_REFRESH__: () => __ENABLE_FAST_REFRESH__,
39
40
  __FEDERATION_DEVTOOLS__: () => __FEDERATION_DEVTOOLS__,
40
41
  defaultDataItem: () => defaultDataItem,
@@ -79,6 +80,7 @@ const statusInfo = {
79
80
  }
80
81
  };
81
82
  const __ENABLE_FAST_REFRESH__ = "enableFastRefresh";
83
+ const __EAGER_SHARE__ = "eagerShare";
82
84
  const BROWSER_ENV_KEY = "MF_ENV";
83
85
  const __FEDERATION_DEVTOOLS__ = "__MF_DEVTOOLS__";
84
86
  // Annotate the CommonJS export names for ESM import in node:
@@ -86,6 +88,7 @@ const __FEDERATION_DEVTOOLS__ = "__MF_DEVTOOLS__";
86
88
  BROWSER_ENV_KEY,
87
89
  ENABLEHMR,
88
90
  FormID,
91
+ __EAGER_SHARE__,
89
92
  __ENABLE_FAST_REFRESH__,
90
93
  __FEDERATION_DEVTOOLS__,
91
94
  defaultDataItem,
@@ -50,8 +50,45 @@ var __async = (__this, __arguments, generator) => {
50
50
  var import_sdk = require("@module-federation/sdk");
51
51
  var import__ = require("../index");
52
52
  var import_sdk2 = require("../sdk");
53
- var import_template = require("../../template");
53
+ var import_constant = require("../../template/constant");
54
54
  var _a;
55
+ const SUPPORT_PKGS = ["react", "react-dom"];
56
+ const fetchAndExecuteUmdSync = (url) => {
57
+ try {
58
+ const response = new XMLHttpRequest();
59
+ response.open("GET", url, false);
60
+ response.overrideMimeType("text/plain");
61
+ response.send();
62
+ if (response.status === 200) {
63
+ const scriptContent = response.responseText;
64
+ const moduleFunction = new Function(scriptContent);
65
+ return moduleFunction(window);
66
+ } else {
67
+ throw new Error(
68
+ `Failed to load module from ${url}: HTTP ${response.status}`
69
+ );
70
+ }
71
+ } catch (error) {
72
+ throw new Error(`Failed to fetch module from ${url}: ${error.message}`);
73
+ }
74
+ };
75
+ const getDevtoolsMessage = () => {
76
+ const devtoolsMessageStr = localStorage.getItem(import_constant.__FEDERATION_DEVTOOLS__);
77
+ if (devtoolsMessageStr) {
78
+ try {
79
+ return JSON.parse(devtoolsMessageStr);
80
+ } catch (e) {
81
+ console.debug("Fast Refresh Plugin Error: ", e);
82
+ }
83
+ }
84
+ return null;
85
+ };
86
+ const devtoolsMessage = getDevtoolsMessage();
87
+ if ((devtoolsMessage == null ? void 0 : devtoolsMessage[import_constant.__ENABLE_FAST_REFRESH__]) && (devtoolsMessage == null ? void 0 : devtoolsMessage[import_constant.__EAGER_SHARE__])) {
88
+ const [_name, version] = devtoolsMessage[import_constant.__EAGER_SHARE__];
89
+ fetchAndExecuteUmdSync((0, import__.getUnpkgUrl)("react", version));
90
+ fetchAndExecuteUmdSync((0, import__.getUnpkgUrl)("react-dom", version));
91
+ }
55
92
  const fastRefreshPlugin = () => {
56
93
  return {
57
94
  name: "mf-fast-refresh-plugin",
@@ -59,17 +96,22 @@ const fastRefreshPlugin = () => {
59
96
  var _b = _a2, { userOptions } = _b, args = __objRest(_b, ["userOptions"]);
60
97
  const shareInfo = userOptions.shared;
61
98
  const twinsShareInfo = args.shareInfo;
62
- let enableFastRefresh;
63
- let devtoolsMessage;
64
- const devtoolsMessageStr = localStorage.getItem(import_template.__FEDERATION_DEVTOOLS__);
99
+ let enableFastRefresh = false;
100
+ let devtoolsMessage2 = {};
101
+ const devtoolsMessageStr = localStorage.getItem(import_constant.__FEDERATION_DEVTOOLS__);
65
102
  if (devtoolsMessageStr) {
66
103
  try {
67
- devtoolsMessage = JSON.parse(devtoolsMessageStr);
68
- enableFastRefresh = devtoolsMessage == null ? void 0 : devtoolsMessage.enableFastRefresh;
104
+ devtoolsMessage2 = JSON.parse(devtoolsMessageStr);
105
+ enableFastRefresh = devtoolsMessage2 == null ? void 0 : devtoolsMessage2[import_constant.__ENABLE_FAST_REFRESH__];
69
106
  } catch (e) {
70
107
  console.debug("Fast Refresh Plugin Error: ", e);
71
108
  }
72
109
  }
110
+ if (!enableFastRefresh) {
111
+ return __spreadValues({
112
+ userOptions
113
+ }, args);
114
+ }
73
115
  if (shareInfo && (0, import__.isObject)(shareInfo)) {
74
116
  let orderResolve;
75
117
  const orderPromise = new Promise((resolve) => {
@@ -82,10 +124,37 @@ const fastRefreshPlugin = () => {
82
124
  twinsSharedArr = Array.isArray(twinsShareInfo[share]) ? twinsShareInfo[share] : [twinsShareInfo[share]];
83
125
  }
84
126
  sharedArr.forEach((shared, idx) => {
127
+ var _a3;
128
+ if (!SUPPORT_PKGS.includes(share)) {
129
+ return;
130
+ }
131
+ if ((_a3 = shared.shareConfig) == null ? void 0 : _a3.eager) {
132
+ if (!(devtoolsMessage2 == null ? void 0 : devtoolsMessage2[import_constant.__EAGER_SHARE__])) {
133
+ const eagerShare = [];
134
+ eagerShare.push(share, shared.version);
135
+ devtoolsMessage2[import_constant.__EAGER_SHARE__] = eagerShare;
136
+ localStorage.setItem(
137
+ import_constant.__FEDERATION_DEVTOOLS__,
138
+ JSON.stringify(devtoolsMessage2)
139
+ );
140
+ window.location.reload();
141
+ }
142
+ if (share === "react-dom") {
143
+ shared.lib = () => window.ReactDOM;
144
+ }
145
+ if (share === "react") {
146
+ shared.lib = () => window.React;
147
+ }
148
+ return;
149
+ }
85
150
  let get;
86
151
  if (share === "react") {
87
152
  get = () => (0, import_sdk.loadScript)((0, import__.getUnpkgUrl)(share, shared.version), {
88
- attrs: { defer: true, async: false }
153
+ attrs: {
154
+ defer: false,
155
+ async: false,
156
+ "data-mf-injected": "true"
157
+ }
89
158
  }).then(() => {
90
159
  orderResolve();
91
160
  });
@@ -97,7 +166,7 @@ const fastRefreshPlugin = () => {
97
166
  })
98
167
  );
99
168
  }
100
- if (enableFastRefresh && typeof get === "function") {
169
+ if (typeof get === "function") {
101
170
  if (share === "react") {
102
171
  shared.get = () => __async(this, null, function* () {
103
172
  if (!window.React) {
@@ -19,5 +19,6 @@ export declare const statusInfo: Record<string, {
19
19
  color: string;
20
20
  }>;
21
21
  export declare const __ENABLE_FAST_REFRESH__ = "enableFastRefresh";
22
+ export declare const __EAGER_SHARE__ = "eagerShare";
22
23
  export declare const BROWSER_ENV_KEY = "MF_ENV";
23
24
  export declare const __FEDERATION_DEVTOOLS__ = "__MF_DEVTOOLS__";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@module-federation/devtools",
3
- "version": "0.21.3",
3
+ "version": "0.21.4",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -44,7 +44,7 @@
44
44
  "react": "~18.3.1",
45
45
  "react-dom": "~18.3.1",
46
46
  "reactflow": "11.11.4",
47
- "@module-federation/sdk": "0.21.3"
47
+ "@module-federation/sdk": "0.21.4"
48
48
  },
49
49
  "devDependencies": {
50
50
  "@modern-js-app/eslint-config": "2.59.0",
@@ -65,7 +65,7 @@
65
65
  "rimraf": "~6.0.1",
66
66
  "typescript": "~5.0.4",
67
67
  "vitest": "1.2.2",
68
- "@module-federation/runtime": "0.21.3"
68
+ "@module-federation/runtime": "0.21.4"
69
69
  },
70
70
  "scripts": {
71
71
  "build:storybook": "storybook build",