remote-reload-utils 0.0.10 → 0.0.11

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/CHANGELOG.md CHANGED
@@ -7,6 +7,13 @@
7
7
 
8
8
  ## [未发布]
9
9
 
10
+ ## [0.0.11] - 2026-03-16
11
+
12
+ ### Release
13
+
14
+ - Published version 0.0.11 with patch bump
15
+
16
+
10
17
  ## [0.0.10] - 2026-03-15
11
18
 
12
19
  ### Release
@@ -130,6 +137,8 @@
130
137
 
131
138
  | 版本 | 日期 | 主要变更 |
132
139
  |------|------|----------|
140
+ | 0.0.11 | 2026-03-16 | patch 版本发布 |
141
+ |------|------|----------|
133
142
  | 0.0.10 | 2026-03-15 | patch 版本发布 |
134
143
  |------|------|----------|
135
144
  | 0.0.9 | 2026-03-15 | patch 版本发布 |
package/README.md CHANGED
@@ -24,6 +24,8 @@ pnpm dev
24
24
 
25
25
  ### 使用方式
26
26
 
27
+ #### 1. 基础加载远程模块
28
+
27
29
  ```ts
28
30
  import { loadRemoteMultiVersion } from 'remote-reload-utils';
29
31
  const [comp, setComp] = useState(null);
@@ -52,3 +54,63 @@ useEffect(() => {
52
54
  init();
53
55
  }, []);
54
56
  ```
57
+
58
+ #### 2. 使用 React 组件加载远程模块
59
+
60
+ ```tsx
61
+ import { RemoteModuleCard, ErrorBoundary, lazyRemote } from 'remote-reload-utils';
62
+ import React, { Suspense } from 'react';
63
+
64
+ // 方式一:使用 RemoteModuleCard 组件(推荐)
65
+ function App() {
66
+ return (
67
+ <RemoteModuleCard
68
+ pkg="@myorg/remote-app"
69
+ version="^1.0.0"
70
+ moduleName="Dashboard"
71
+ scopeName="myorg"
72
+ loadingFallback={<Spinner />}
73
+ errorFallback={(error, reset) => (
74
+ <div>
75
+ <p>加载失败:{error.message}</p>
76
+ <button onClick={reset}>重试</button>
77
+ </div>
78
+ )}
79
+ componentProps={{ userId: 123 }}
80
+ />
81
+ );
82
+ }
83
+
84
+ // 方式二:使用 lazy + Suspense
85
+ const LazyDashboard = lazyRemote({
86
+ pkg: "@myorg/remote-app",
87
+ version: "^1.0.0",
88
+ moduleName: "Dashboard",
89
+ scopeName: "myorg"
90
+ });
91
+
92
+ function App() {
93
+ return (
94
+ <ErrorBoundary fallback={(error) => <div>错误:{error.message}</div>}>
95
+ <Suspense fallback={<Spinner />}>
96
+ <LazyDashboard userId={123} />
97
+ </Suspense>
98
+ </ErrorBoundary>
99
+ );
100
+ }
101
+
102
+ // 方式三:使用 SuspenseRemoteLoader(一体化方案)
103
+ function App() {
104
+ return (
105
+ <SuspenseRemoteLoader
106
+ pkg="@myorg/remote-app"
107
+ version="^1.0.0"
108
+ moduleName="Dashboard"
109
+ scopeName="myorg"
110
+ fallback={<Spinner />}
111
+ errorFallback={(error) => <div>错误:{error.message}</div>}
112
+ componentProps={{ userId: 123 }}
113
+ />
114
+ );
115
+ }
116
+ ```
@@ -0,0 +1,34 @@
1
+ import React from 'react';
2
+ export interface ErrorBoundaryProps {
3
+ children: React.ReactNode;
4
+ fallback?: React.ReactNode | ((error: Error, resetError: () => void) => React.ReactNode);
5
+ onError?: (error: Error, errorInfo: React.ErrorInfo) => void;
6
+ onReset?: () => void;
7
+ }
8
+ interface ErrorBoundaryState {
9
+ hasError: boolean;
10
+ error: Error | null;
11
+ errorInfo?: React.ErrorInfo | null;
12
+ }
13
+ /**
14
+ * 错误边界组件
15
+ * 用于捕获子组件树中的错误,并显示降级 UI
16
+ *
17
+ * @example
18
+ * ```tsx
19
+ * <ErrorBoundary
20
+ * fallback={(error, reset) => <div onClick={reset}>Error: {error.message}</div>}
21
+ * onError={(error, info) => console.error(error, info)}
22
+ * >
23
+ * <MyComponent />
24
+ * </ErrorBoundary>
25
+ * ```
26
+ */
27
+ export declare class ErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> {
28
+ constructor(props: ErrorBoundaryProps);
29
+ static getDerivedStateFromError(error: Error): ErrorBoundaryState;
30
+ componentDidCatch(error: Error, errorInfo: React.ErrorInfo): void;
31
+ handleReset: () => void;
32
+ render(): string | number | boolean | Iterable<React.ReactNode> | import("react/jsx-runtime").JSX.Element | null | undefined;
33
+ }
34
+ export {};
@@ -0,0 +1,84 @@
1
+ import React from 'react';
2
+ import type { ErrorBoundaryProps } from './ErrorBoundary';
3
+ export interface RemoteModuleCardProps {
4
+ /** 包名称 */
5
+ pkg: string;
6
+ /** 版本号,支持 semver 范围 */
7
+ version: string;
8
+ /** 远程模块名称(导出名) */
9
+ moduleName: string;
10
+ /** 作用域名称 */
11
+ scopeName: string;
12
+ /** 加载中的占位内容 */
13
+ loadingFallback?: React.ReactNode;
14
+ /** 错误状态的占位内容 */
15
+ errorFallback?: React.ReactNode | ((error: Error, resetError: () => void) => React.ReactNode);
16
+ /** 传递给远程组件的 props */
17
+ componentProps?: Record<string, any>;
18
+ /** 容器类名 */
19
+ className?: string;
20
+ /** 容器样式 */
21
+ style?: React.CSSProperties;
22
+ /** 加载成功回调 */
23
+ onLoad?: (component: React.ComponentType<any>) => void;
24
+ /** 加载失败回调 */
25
+ onError?: (error: Error) => void;
26
+ /** 是否禁用错误边界 */
27
+ disableErrorBoundary?: boolean;
28
+ /** 错误边界配置 */
29
+ errorBoundaryOptions?: Omit<ErrorBoundaryProps, 'children' | 'fallback'>;
30
+ }
31
+ interface ModuleState {
32
+ loading: boolean;
33
+ error: Error | null;
34
+ component: React.ComponentType<any> | null;
35
+ }
36
+ /**
37
+ * 内部 Hook:加载远程模块
38
+ */
39
+ export declare function useRemoteModule({ pkg, version, moduleName, scopeName, onError, onLoad, }: RemoteModuleCardProps): ModuleState;
40
+ /**
41
+ * 内部组件:纯内容渲染(不含 Suspense/ErrorBoundary)
42
+ */
43
+ export declare function RemoteModuleCardContent({ pkg, version, moduleName, scopeName, loadingFallback, errorFallback, componentProps, className, style, onError, onLoad, }: RemoteModuleCardProps): import("react/jsx-runtime").JSX.Element | null;
44
+ /**
45
+ * 远程模块卡片组件
46
+ * 负责加载和渲染远程模块,内置 Suspense 和 ErrorBoundary 支持
47
+ *
48
+ * @features
49
+ * - 自动加载远程模块
50
+ * - 内置加载状态和错误处理
51
+ * - 支持 Suspense 惰性加载
52
+ * - 可配置的错误边界
53
+ * - 支持重试机制
54
+ *
55
+ * @example
56
+ * ```tsx
57
+ * <RemoteModuleCard
58
+ * pkg="@myorg/remote-app"
59
+ * version="^1.0.0"
60
+ * moduleName="Dashboard"
61
+ * scopeName="myorg"
62
+ * loadingFallback={<Spinner />}
63
+ * errorFallback={(error, reset) => <Button onClick={reset}>Retry</Button>}
64
+ * componentProps={{ userId: 123 }}
65
+ * />
66
+ * ```
67
+ *
68
+ * @example
69
+ * ```tsx
70
+ * // 使用 lazy + Suspense 模式
71
+ * const LazyRemote = lazyRemote({
72
+ * pkg: "@myorg/remote-app",
73
+ * version: "^1.0.0",
74
+ * moduleName: "Dashboard",
75
+ * scopeName: "myorg"
76
+ * });
77
+ *
78
+ * <Suspense fallback={<Spinner />}>
79
+ * <LazyRemote userId={123} />
80
+ * </Suspense>
81
+ * ```
82
+ */
83
+ export declare function RemoteModuleCard(props: RemoteModuleCardProps): import("react/jsx-runtime").JSX.Element;
84
+ export {};
@@ -0,0 +1,131 @@
1
+ import React, { type ComponentType, type ReactNode } from 'react';
2
+ export interface LazyRemoteOptions {
3
+ /** 包名称 */
4
+ pkg: string;
5
+ /** 版本号 */
6
+ version?: string;
7
+ /** 模块名称 */
8
+ moduleName: string;
9
+ /** 作用域名称 */
10
+ scopeName: string;
11
+ /** 加载失败时的最大重试次数 */
12
+ maxRetries?: number;
13
+ /** 重试延迟(毫秒) */
14
+ retryDelay?: number;
15
+ }
16
+ export interface SuspenseRemoteProps {
17
+ /** 加载中的占位内容 */
18
+ fallback?: ReactNode;
19
+ children: ReactNode;
20
+ }
21
+ export interface SuspenseRemoteWithPropsProps extends LazyRemoteOptions {
22
+ /** 加载中的占位内容 */
23
+ fallback?: ReactNode;
24
+ /** 错误状态的占位内容 */
25
+ errorFallback?: ReactNode | ((error: Error) => ReactNode);
26
+ /** 传递给远程组件的 props */
27
+ componentProps?: Record<string, any>;
28
+ }
29
+ /**
30
+ * 创建一个惰性加载的远程组件
31
+ * 返回一个可用于 React.lazy() 的 Promise
32
+ *
33
+ * @example
34
+ * ```tsx
35
+ * const LazyDashboard = lazyRemote({
36
+ * pkg: "@myorg/remote-app",
37
+ * version: "^1.0.0",
38
+ * moduleName: "Dashboard",
39
+ * scopeName: "myorg"
40
+ * });
41
+ *
42
+ * function App() {
43
+ * return (
44
+ * <Suspense fallback={<Spinner />}>
45
+ * <LazyDashboard userId={123} />
46
+ * </Suspense>
47
+ * );
48
+ * }
49
+ * ```
50
+ */
51
+ export declare function lazyRemote(options: LazyRemoteOptions): React.LazyExoticComponent<React.ComponentType<any>>;
52
+ /**
53
+ * 带 Suspense 和错误处理的远程组件包装器
54
+ * 注意:错误处理需要与 ErrorBoundary 配合使用
55
+ *
56
+ * @example
57
+ * ```tsx
58
+ * // 与 ErrorBoundary 配合使用
59
+ * <ErrorBoundary fallback={(error) => <div>Error: {error.message}</div>}>
60
+ * <SuspenseRemote fallback={<Spinner />}>
61
+ * <RemoteModuleCard pkg="@myorg/remote-app" version="^1.0.0" moduleName="Dashboard" scopeName="myorg" />
62
+ * </SuspenseRemote>
63
+ * </ErrorBoundary>
64
+ * ```
65
+ */
66
+ export declare function SuspenseRemote({ fallback, children, }: {
67
+ fallback?: ReactNode;
68
+ children: ReactNode;
69
+ }): import("react/jsx-runtime").JSX.Element;
70
+ /**
71
+ * 一体化的远程组件加载器(包含 Suspense 和 ErrorBoundary)
72
+ *
73
+ * @example
74
+ * ```tsx
75
+ * <SuspenseRemoteLoader
76
+ * pkg="@myorg/remote-app"
77
+ * version="^1.0.0"
78
+ * moduleName="Dashboard"
79
+ * scopeName="myorg"
80
+ * fallback={<Spinner />}
81
+ * errorFallback={(error) => <div>Error: {error.message}</div>}
82
+ * componentProps={{ userId: 123 }}
83
+ * />
84
+ * ```
85
+ */
86
+ export declare function SuspenseRemoteLoader({ pkg, version, moduleName, scopeName, fallback, errorFallback, componentProps, }: SuspenseRemoteWithPropsProps): import("react/jsx-runtime").JSX.Element;
87
+ /**
88
+ * HOC:为组件添加远程加载能力
89
+ *
90
+ * @example
91
+ * ```tsx
92
+ * const EnhancedComponent = withRemote(
93
+ * (props) => <div>{props.message}</div>,
94
+ * {
95
+ * pkg: "@myorg/remote-app",
96
+ * version: "^1.0.0",
97
+ * moduleName: "RemoteComponent",
98
+ * scopeName: "myorg"
99
+ * }
100
+ * );
101
+ *
102
+ * <EnhancedComponent message="Hello" />
103
+ * ```
104
+ */
105
+ export declare function withRemote<P extends object>(WrappedComponent: ComponentType<P>, options: LazyRemoteOptions): (props: P) => import("react/jsx-runtime").JSX.Element;
106
+ /**
107
+ * Hook:在函数组件中加载远程模块
108
+ *
109
+ * @example
110
+ * ```tsx
111
+ * function MyComponent() {
112
+ * const { component: RemoteComp, loading, error } = useRemoteModule({
113
+ * pkg: "@myorg/remote-app",
114
+ * version: "^1.0.0",
115
+ * moduleName: "Dashboard",
116
+ * scopeName: "myorg"
117
+ * });
118
+ *
119
+ * if (loading) return <Spinner />;
120
+ * if (error) return <div>Error: {error.message}</div>;
121
+ * if (!RemoteComp) return null;
122
+ *
123
+ * return <RemoteComp userId={123} />;
124
+ * }
125
+ * ```
126
+ */
127
+ export declare function useRemoteModuleHook(options: LazyRemoteOptions): {
128
+ component: ComponentType<any> | null;
129
+ loading: boolean;
130
+ error: Error | null;
131
+ };
@@ -0,0 +1,6 @@
1
+ export { ErrorBoundary } from './ErrorBoundary';
2
+ export type { ErrorBoundaryProps } from './ErrorBoundary';
3
+ export { RemoteModuleCard } from './RemoteModuleCard';
4
+ export type { RemoteModuleCardProps } from './RemoteModuleCard';
5
+ export { lazyRemote, SuspenseRemote, SuspenseRemoteLoader, withRemote, useRemoteModuleHook, } from './SuspenseLoader';
6
+ export type { LazyRemoteOptions, SuspenseRemoteProps, SuspenseRemoteWithPropsProps } from './SuspenseLoader';
package/dist/index.d.ts CHANGED
@@ -8,3 +8,5 @@ export { checkRemoteHealth, checkModuleLoadable, getRemoteHealthReport, formatHe
8
8
  export { eventBus, createEventBus, } from './event-bus';
9
9
  export type { LoadRemoteOptions, VersionCache, PreloadOptions, PreloadCacheItem, PreloadStatus, } from './types';
10
10
  export { fallbackPlugin } from './plugins/fallback';
11
+ export { ErrorBoundary, RemoteModuleCard, lazyRemote, SuspenseRemote, SuspenseRemoteLoader, withRemote, useRemoteModuleHook, } from './components';
12
+ export type { ErrorBoundaryProps, RemoteModuleCardProps, LazyRemoteOptions, SuspenseRemoteProps, SuspenseRemoteWithPropsProps, } from './components';
package/dist/main.cjs CHANGED
@@ -1,5 +1,14 @@
1
1
  "use strict";
2
2
  var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.n = (module)=>{
5
+ var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
6
+ __webpack_require__.d(getter, {
7
+ a: getter
8
+ });
9
+ return getter;
10
+ };
11
+ })();
3
12
  (()=>{
4
13
  __webpack_require__.d = (exports1, definition)=>{
5
14
  for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
@@ -27,31 +36,36 @@ __webpack_require__.d(__webpack_exports__, {
27
36
  compareVersions: ()=>compareVersions,
28
37
  fetchAvailableVersions: ()=>fetchAvailableVersions,
29
38
  sortVersions: ()=>sortVersions,
39
+ useRemoteModuleHook: ()=>useRemoteModuleHook,
30
40
  registerRemoteInstance: ()=>registerRemoteInstance,
31
41
  fallbackPlugin: ()=>fallbackPlugin,
32
42
  createEventBus: ()=>createEventBus,
43
+ withRemote: ()=>withRemote,
33
44
  getPreloadStatus: ()=>getPreloadStatus,
34
45
  parseVersion: ()=>parseVersion,
35
46
  resolveFinalVersion: ()=>resolveFinalVersion,
36
47
  buildFinalUrls: ()=>buildFinalUrls,
37
48
  fetchLatestVersion: ()=>fetchLatestVersion,
38
- isRemoteLoaded: ()=>isRemoteLoaded,
49
+ ErrorBoundary: ()=>ErrorBoundary,
39
50
  getFinalSharedConfig: ()=>getFinalSharedConfig,
51
+ isRemoteLoaded: ()=>isRemoteLoaded,
40
52
  tryLoadRemote: ()=>tryLoadRemote,
41
53
  getVersionCache: ()=>getVersionCache,
42
54
  eventBus: ()=>eventBus,
43
55
  loadRemoteMultiVersion: ()=>loadRemoteMultiVersion,
44
56
  clearPreloadCache: ()=>clearPreloadCache,
45
- loadReactVersion: ()=>loadReactVersion,
46
57
  getRemoteHealthReport: ()=>getRemoteHealthReport,
47
- getStableVersions: ()=>getStableVersions,
48
58
  checkModuleLoadable: ()=>checkModuleLoadable,
49
- buildCdnUrls: ()=>buildCdnUrls,
59
+ getStableVersions: ()=>getStableVersions,
50
60
  extractMajorVersion: ()=>extractMajorVersion,
61
+ buildCdnUrls: ()=>buildCdnUrls,
62
+ loadReactVersion: ()=>loadReactVersion,
51
63
  preloadRemoteList: ()=>preloadRemoteList,
64
+ SuspenseRemoteLoader: ()=>SuspenseRemoteLoader,
52
65
  registerLoadedModule: ()=>registerLoadedModule,
53
- unloadRemote: ()=>unloadRemote,
54
66
  getCompatibleReactVersions: ()=>getCompatibleReactVersions,
67
+ SuspenseRemote: ()=>SuspenseRemote,
68
+ unloadRemote: ()=>unloadRemote,
55
69
  cancelPreload: ()=>cancelPreload,
56
70
  findCompatibleVersion: ()=>findCompatibleVersion,
57
71
  getLoadedRemotes: ()=>getLoadedRemotes,
@@ -59,10 +73,12 @@ __webpack_require__.d(__webpack_exports__, {
59
73
  preloadRemote: ()=>preloadRemote,
60
74
  satisfiesVersion: ()=>satisfiesVersion,
61
75
  formatHealthStatus: ()=>formatHealthStatus,
76
+ RemoteModuleCard: ()=>RemoteModuleCard,
62
77
  unloadAll: ()=>unloadAll,
63
78
  setVersionCache: ()=>setVersionCache,
64
- isPrerelease: ()=>isPrerelease,
79
+ lazyRemote: ()=>lazyRemote,
65
80
  checkRemoteHealth: ()=>checkRemoteHealth,
81
+ isPrerelease: ()=>isPrerelease,
66
82
  checkVersionCompatibility: ()=>checkVersionCompatibility
67
83
  });
68
84
  const runtime_namespaceObject = require("@module-federation/enhanced/runtime");
@@ -751,6 +767,301 @@ const eventBus = EventBusClass.create();
751
767
  function createEventBus() {
752
768
  return EventBusClass.create();
753
769
  }
770
+ const external_react_namespaceObject = require("react");
771
+ var external_react_default = /*#__PURE__*/ __webpack_require__.n(external_react_namespaceObject);
772
+ class ErrorBoundary extends external_react_default().Component {
773
+ constructor(props){
774
+ super(props);
775
+ this.state = {
776
+ hasError: false,
777
+ error: null,
778
+ errorInfo: null
779
+ };
780
+ }
781
+ static getDerivedStateFromError(error) {
782
+ return {
783
+ hasError: true,
784
+ error,
785
+ errorInfo: null
786
+ };
787
+ }
788
+ componentDidCatch(error, errorInfo) {
789
+ this.setState({
790
+ errorInfo
791
+ });
792
+ this.props.onError?.(error, errorInfo);
793
+ console.error('[RemoteReloadUtils] ErrorBoundary caught error:', error, errorInfo);
794
+ }
795
+ handleReset = ()=>{
796
+ this.setState({
797
+ hasError: false,
798
+ error: null,
799
+ errorInfo: null
800
+ });
801
+ this.props.onReset?.();
802
+ };
803
+ render() {
804
+ if (this.state.hasError && this.state.error) {
805
+ if ('function' == typeof this.props.fallback) return this.props.fallback(this.state.error, this.handleReset);
806
+ if (void 0 !== this.props.fallback) return this.props.fallback;
807
+ return /*#__PURE__*/ external_react_default().createElement("div", {
808
+ role: "alert",
809
+ style: {
810
+ padding: '16px',
811
+ border: '1px solid #ffcccc',
812
+ backgroundColor: '#fff5f5',
813
+ borderRadius: '4px'
814
+ }
815
+ }, /*#__PURE__*/ external_react_default().createElement("h3", null, "Something went wrong"), /*#__PURE__*/ external_react_default().createElement("p", null, this.state.error.message), /*#__PURE__*/ external_react_default().createElement("button", {
816
+ onClick: this.handleReset,
817
+ style: {
818
+ marginTop: '8px',
819
+ padding: '8px 16px',
820
+ cursor: 'pointer'
821
+ }
822
+ }, "Try again"));
823
+ }
824
+ return this.props.children;
825
+ }
826
+ }
827
+ function useRemoteModule({ pkg, version, moduleName, scopeName, onError, onLoad }) {
828
+ const [moduleState, setModuleState] = (0, external_react_namespaceObject.useState)({
829
+ loading: true,
830
+ error: null,
831
+ component: null
832
+ });
833
+ (0, external_react_namespaceObject.useEffect)(()=>{
834
+ let mounted = true;
835
+ async function loadModule() {
836
+ try {
837
+ setModuleState((prev)=>({
838
+ ...prev,
839
+ loading: true,
840
+ error: null
841
+ }));
842
+ const { mf } = await loadRemoteMultiVersion({
843
+ name: scopeName,
844
+ pkg,
845
+ version
846
+ }, []);
847
+ if (!mf || !mounted) return;
848
+ const mod = await mf.loadRemote(`${scopeName}/${moduleName}`);
849
+ if (!mounted) return;
850
+ if (mod && 'object' == typeof mod && 'default' in mod) {
851
+ const Component = mod.default;
852
+ setModuleState({
853
+ loading: false,
854
+ error: null,
855
+ component: Component
856
+ });
857
+ onLoad?.(Component);
858
+ } else throw new Error(`Module "${scopeName}/${moduleName}" does not export a default component`);
859
+ } catch (err) {
860
+ if (mounted) {
861
+ const error = err instanceof Error ? err : new Error(String(err));
862
+ setModuleState({
863
+ loading: false,
864
+ error,
865
+ component: null
866
+ });
867
+ onError?.(error);
868
+ }
869
+ }
870
+ }
871
+ loadModule();
872
+ return ()=>{
873
+ mounted = false;
874
+ };
875
+ }, [
876
+ pkg,
877
+ version,
878
+ moduleName,
879
+ scopeName,
880
+ onError,
881
+ onLoad
882
+ ]);
883
+ return moduleState;
884
+ }
885
+ function RemoteModuleCardContent({ pkg, version, moduleName, scopeName, loadingFallback, errorFallback, componentProps, className, style, onError, onLoad }) {
886
+ const moduleState = useRemoteModule({
887
+ pkg,
888
+ version,
889
+ moduleName,
890
+ scopeName,
891
+ onError,
892
+ onLoad
893
+ });
894
+ const [retryCount, setRetryCount] = (0, external_react_namespaceObject.useState)(0);
895
+ const handleRetry = (0, external_react_namespaceObject.useCallback)(()=>{
896
+ setRetryCount((prev)=>prev + 1);
897
+ }, []);
898
+ (0, external_react_namespaceObject.useEffect)(()=>{}, [
899
+ retryCount
900
+ ]);
901
+ if (moduleState.loading) return /*#__PURE__*/ external_react_default().createElement("div", {
902
+ className: className,
903
+ style: style,
904
+ role: "status",
905
+ "aria-live": "polite"
906
+ }, loadingFallback || /*#__PURE__*/ external_react_default().createElement("div", {
907
+ className: "module-card module-card--loading"
908
+ }, /*#__PURE__*/ external_react_default().createElement("div", {
909
+ className: "loading-spinner",
910
+ "aria-hidden": "true"
911
+ }), /*#__PURE__*/ external_react_default().createElement("span", null, "Loading ", moduleName, "...")));
912
+ if (moduleState.error) {
913
+ if ('function' == typeof errorFallback) return /*#__PURE__*/ external_react_default().createElement(external_react_default().Fragment, null, errorFallback(moduleState.error, handleRetry));
914
+ if (void 0 !== errorFallback) return /*#__PURE__*/ external_react_default().createElement(external_react_default().Fragment, null, errorFallback);
915
+ return /*#__PURE__*/ external_react_default().createElement("div", {
916
+ className: className,
917
+ style: style,
918
+ role: "alert"
919
+ }, /*#__PURE__*/ external_react_default().createElement("div", {
920
+ className: "module-card module-card--error"
921
+ }, /*#__PURE__*/ external_react_default().createElement("span", {
922
+ className: "error-icon",
923
+ "aria-hidden": "true"
924
+ }, "!"), /*#__PURE__*/ external_react_default().createElement("span", null, "Failed to load ", moduleName), /*#__PURE__*/ external_react_default().createElement("p", {
925
+ className: "error-message"
926
+ }, moduleState.error.message), /*#__PURE__*/ external_react_default().createElement("button", {
927
+ onClick: handleRetry,
928
+ className: "retry-button",
929
+ type: "button"
930
+ }, "Retry")));
931
+ }
932
+ if (!moduleState.component) return null;
933
+ const Component = moduleState.component;
934
+ return /*#__PURE__*/ external_react_default().createElement("div", {
935
+ className: className,
936
+ style: style
937
+ }, /*#__PURE__*/ external_react_default().createElement(Component, componentProps));
938
+ }
939
+ function RemoteModuleCard(props) {
940
+ const { disableErrorBoundary, errorFallback, loadingFallback, errorBoundaryOptions } = props;
941
+ if (disableErrorBoundary) return /*#__PURE__*/ external_react_default().createElement(external_react_namespaceObject.Suspense, {
942
+ fallback: loadingFallback || /*#__PURE__*/ external_react_default().createElement("div", null, "Loading...")
943
+ }, /*#__PURE__*/ external_react_default().createElement(RemoteModuleCardContent, props));
944
+ return /*#__PURE__*/ external_react_default().createElement(ErrorBoundary, {
945
+ fallback: errorFallback,
946
+ onError: errorBoundaryOptions?.onError,
947
+ onReset: errorBoundaryOptions?.onReset
948
+ }, /*#__PURE__*/ external_react_default().createElement(external_react_namespaceObject.Suspense, {
949
+ fallback: loadingFallback || /*#__PURE__*/ external_react_default().createElement("div", null, "Loading...")
950
+ }, /*#__PURE__*/ external_react_default().createElement(RemoteModuleCardContent, props)));
951
+ }
952
+ function lazyRemote(options) {
953
+ const { pkg, version = 'latest', moduleName, scopeName, maxRetries = 3, retryDelay = 1000 } = options;
954
+ let retryCount = 0;
955
+ const loadComponent = async ()=>{
956
+ try {
957
+ const { mf } = await loadRemoteMultiVersion({
958
+ name: scopeName,
959
+ pkg,
960
+ version
961
+ }, []);
962
+ if (!mf) throw new Error(`[RemoteReloadUtils] Failed to get Module Federation instance for ${scopeName}`);
963
+ const mod = await mf.loadRemote(`${scopeName}/${moduleName}`);
964
+ if (!mod || 'object' != typeof mod || !('default' in mod)) throw new Error(`[RemoteReloadUtils] Module "${scopeName}/${moduleName}" does not export a default component`);
965
+ return {
966
+ default: mod.default
967
+ };
968
+ } catch (error) {
969
+ if (retryCount < maxRetries) {
970
+ retryCount++;
971
+ await new Promise((resolve)=>setTimeout(resolve, retryDelay * retryCount));
972
+ return loadComponent();
973
+ }
974
+ throw error;
975
+ }
976
+ };
977
+ return /*#__PURE__*/ (0, external_react_namespaceObject.lazy)(loadComponent);
978
+ }
979
+ function SuspenseRemote({ fallback, children }) {
980
+ return /*#__PURE__*/ external_react_default().createElement(external_react_namespaceObject.Suspense, {
981
+ fallback: fallback || /*#__PURE__*/ external_react_default().createElement("div", null, "Loading...")
982
+ }, children);
983
+ }
984
+ function SuspenseRemoteLoader({ pkg, version = 'latest', moduleName, scopeName, fallback, errorFallback, componentProps }) {
985
+ const RemoteComponent = lazyRemote({
986
+ pkg,
987
+ version,
988
+ moduleName,
989
+ scopeName
990
+ });
991
+ if (errorFallback) return /*#__PURE__*/ external_react_default().createElement(ErrorBoundary, {
992
+ fallback: errorFallback
993
+ }, /*#__PURE__*/ external_react_default().createElement(external_react_namespaceObject.Suspense, {
994
+ fallback: fallback || /*#__PURE__*/ external_react_default().createElement("div", null, "Loading...")
995
+ }, /*#__PURE__*/ external_react_default().createElement(RemoteComponent, componentProps)));
996
+ return /*#__PURE__*/ external_react_default().createElement(external_react_namespaceObject.Suspense, {
997
+ fallback: fallback || /*#__PURE__*/ external_react_default().createElement("div", null, "Loading...")
998
+ }, /*#__PURE__*/ external_react_default().createElement(RemoteComponent, componentProps));
999
+ }
1000
+ function withRemote(WrappedComponent, options) {
1001
+ const RemoteComponent = lazyRemote(options);
1002
+ return function(props) {
1003
+ return /*#__PURE__*/ external_react_default().createElement(external_react_namespaceObject.Suspense, {
1004
+ fallback: /*#__PURE__*/ external_react_default().createElement("div", null, "Loading...")
1005
+ }, /*#__PURE__*/ external_react_default().createElement(RemoteComponent, props));
1006
+ };
1007
+ }
1008
+ function useRemoteModuleHook(options) {
1009
+ const { pkg, version = 'latest', moduleName, scopeName } = options;
1010
+ const [state, setState] = (0, external_react_namespaceObject.useState)({
1011
+ component: null,
1012
+ loading: true,
1013
+ error: null
1014
+ });
1015
+ (0, external_react_namespaceObject.useEffect)(()=>{
1016
+ let mounted = true;
1017
+ async function load() {
1018
+ try {
1019
+ setState((prev)=>({
1020
+ ...prev,
1021
+ loading: true,
1022
+ error: null
1023
+ }));
1024
+ const { mf } = await loadRemoteMultiVersion({
1025
+ name: scopeName,
1026
+ pkg,
1027
+ version
1028
+ }, []);
1029
+ if (!mf) throw new Error(`[RemoteReloadUtils] Failed to get Module Federation instance for ${scopeName}`);
1030
+ const mod = await mf.loadRemote(`${scopeName}/${moduleName}`);
1031
+ if (mounted) if (mod && 'object' == typeof mod && 'default' in mod) setState({
1032
+ component: mod.default,
1033
+ loading: false,
1034
+ error: null
1035
+ });
1036
+ else throw new Error(`[RemoteReloadUtils] Module "${scopeName}/${moduleName}" does not export a default component`);
1037
+ } catch (err) {
1038
+ if (mounted) setState({
1039
+ component: null,
1040
+ loading: false,
1041
+ error: err instanceof Error ? err : new Error(String(err))
1042
+ });
1043
+ }
1044
+ }
1045
+ load();
1046
+ return ()=>{
1047
+ mounted = false;
1048
+ };
1049
+ }, [
1050
+ pkg,
1051
+ version,
1052
+ moduleName,
1053
+ scopeName
1054
+ ]);
1055
+ return {
1056
+ component: state.component,
1057
+ loading: state.loading,
1058
+ error: state.error
1059
+ };
1060
+ }
1061
+ exports.ErrorBoundary = __webpack_exports__.ErrorBoundary;
1062
+ exports.RemoteModuleCard = __webpack_exports__.RemoteModuleCard;
1063
+ exports.SuspenseRemote = __webpack_exports__.SuspenseRemote;
1064
+ exports.SuspenseRemoteLoader = __webpack_exports__.SuspenseRemoteLoader;
754
1065
  exports.buildCdnUrls = __webpack_exports__.buildCdnUrls;
755
1066
  exports.buildFinalUrls = __webpack_exports__.buildFinalUrls;
756
1067
  exports.cancelPreload = __webpack_exports__.cancelPreload;
@@ -777,6 +1088,7 @@ exports.getStableVersions = __webpack_exports__.getStableVersions;
777
1088
  exports.getVersionCache = __webpack_exports__.getVersionCache;
778
1089
  exports.isPrerelease = __webpack_exports__.isPrerelease;
779
1090
  exports.isRemoteLoaded = __webpack_exports__.isRemoteLoaded;
1091
+ exports.lazyRemote = __webpack_exports__.lazyRemote;
780
1092
  exports.loadReactVersion = __webpack_exports__.loadReactVersion;
781
1093
  exports.loadRemoteMultiVersion = __webpack_exports__.loadRemoteMultiVersion;
782
1094
  exports.parseVersion = __webpack_exports__.parseVersion;
@@ -791,7 +1103,13 @@ exports.sortVersions = __webpack_exports__.sortVersions;
791
1103
  exports.tryLoadRemote = __webpack_exports__.tryLoadRemote;
792
1104
  exports.unloadAll = __webpack_exports__.unloadAll;
793
1105
  exports.unloadRemote = __webpack_exports__.unloadRemote;
1106
+ exports.useRemoteModuleHook = __webpack_exports__.useRemoteModuleHook;
1107
+ exports.withRemote = __webpack_exports__.withRemote;
794
1108
  for(var __webpack_i__ in __webpack_exports__)if (-1 === [
1109
+ "ErrorBoundary",
1110
+ "RemoteModuleCard",
1111
+ "SuspenseRemote",
1112
+ "SuspenseRemoteLoader",
795
1113
  "buildCdnUrls",
796
1114
  "buildFinalUrls",
797
1115
  "cancelPreload",
@@ -818,6 +1136,7 @@ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
818
1136
  "getVersionCache",
819
1137
  "isPrerelease",
820
1138
  "isRemoteLoaded",
1139
+ "lazyRemote",
821
1140
  "loadReactVersion",
822
1141
  "loadRemoteMultiVersion",
823
1142
  "parseVersion",
@@ -831,7 +1150,9 @@ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
831
1150
  "sortVersions",
832
1151
  "tryLoadRemote",
833
1152
  "unloadAll",
834
- "unloadRemote"
1153
+ "unloadRemote",
1154
+ "useRemoteModuleHook",
1155
+ "withRemote"
835
1156
  ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
836
1157
  Object.defineProperty(exports, '__esModule', {
837
1158
  value: true
package/dist/main.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { createInstance } from "@module-federation/enhanced/runtime";
2
+ import react, { Suspense, lazy, useCallback, useEffect, useState } from "react";
2
3
  async function loadReactVersion(version) {
3
4
  const runtime = await createInstance({
4
5
  name: `react_${version}_runtime`,
@@ -684,4 +685,293 @@ const eventBus = EventBusClass.create();
684
685
  function createEventBus() {
685
686
  return EventBusClass.create();
686
687
  }
687
- export { buildCdnUrls, buildFinalUrls, cancelPreload, checkModuleLoadable, checkRemoteHealth, checkVersionCompatibility, clearPreloadCache, compareVersions, createEventBus, eventBus, extractMajorVersion, fallbackPlugin, fetchAvailableVersions, fetchLatestVersion, findCompatibleVersion, formatHealthStatus, getCompatibleReactVersions, getFinalSharedConfig, getLatestVersion, getLoadedRemotes, getPreloadStatus, getRemoteHealthReport, getStableVersions, getVersionCache, isPrerelease, isRemoteLoaded, loadReactVersion, loadRemoteMultiVersion, parseVersion, preloadRemote, preloadRemoteList, registerLoadedModule, registerRemoteInstance, resolveFinalVersion, satisfiesVersion, setVersionCache, sortVersions, tryLoadRemote, unloadAll, unloadRemote };
688
+ class ErrorBoundary extends react.Component {
689
+ constructor(props){
690
+ super(props);
691
+ this.state = {
692
+ hasError: false,
693
+ error: null,
694
+ errorInfo: null
695
+ };
696
+ }
697
+ static getDerivedStateFromError(error) {
698
+ return {
699
+ hasError: true,
700
+ error,
701
+ errorInfo: null
702
+ };
703
+ }
704
+ componentDidCatch(error, errorInfo) {
705
+ this.setState({
706
+ errorInfo
707
+ });
708
+ this.props.onError?.(error, errorInfo);
709
+ console.error('[RemoteReloadUtils] ErrorBoundary caught error:', error, errorInfo);
710
+ }
711
+ handleReset = ()=>{
712
+ this.setState({
713
+ hasError: false,
714
+ error: null,
715
+ errorInfo: null
716
+ });
717
+ this.props.onReset?.();
718
+ };
719
+ render() {
720
+ if (this.state.hasError && this.state.error) {
721
+ if ('function' == typeof this.props.fallback) return this.props.fallback(this.state.error, this.handleReset);
722
+ if (void 0 !== this.props.fallback) return this.props.fallback;
723
+ return /*#__PURE__*/ react.createElement("div", {
724
+ role: "alert",
725
+ style: {
726
+ padding: '16px',
727
+ border: '1px solid #ffcccc',
728
+ backgroundColor: '#fff5f5',
729
+ borderRadius: '4px'
730
+ }
731
+ }, /*#__PURE__*/ react.createElement("h3", null, "Something went wrong"), /*#__PURE__*/ react.createElement("p", null, this.state.error.message), /*#__PURE__*/ react.createElement("button", {
732
+ onClick: this.handleReset,
733
+ style: {
734
+ marginTop: '8px',
735
+ padding: '8px 16px',
736
+ cursor: 'pointer'
737
+ }
738
+ }, "Try again"));
739
+ }
740
+ return this.props.children;
741
+ }
742
+ }
743
+ function useRemoteModule({ pkg, version, moduleName, scopeName, onError, onLoad }) {
744
+ const [moduleState, setModuleState] = useState({
745
+ loading: true,
746
+ error: null,
747
+ component: null
748
+ });
749
+ useEffect(()=>{
750
+ let mounted = true;
751
+ async function loadModule() {
752
+ try {
753
+ setModuleState((prev)=>({
754
+ ...prev,
755
+ loading: true,
756
+ error: null
757
+ }));
758
+ const { mf } = await loadRemoteMultiVersion({
759
+ name: scopeName,
760
+ pkg,
761
+ version
762
+ }, []);
763
+ if (!mf || !mounted) return;
764
+ const mod = await mf.loadRemote(`${scopeName}/${moduleName}`);
765
+ if (!mounted) return;
766
+ if (mod && 'object' == typeof mod && 'default' in mod) {
767
+ const Component = mod.default;
768
+ setModuleState({
769
+ loading: false,
770
+ error: null,
771
+ component: Component
772
+ });
773
+ onLoad?.(Component);
774
+ } else throw new Error(`Module "${scopeName}/${moduleName}" does not export a default component`);
775
+ } catch (err) {
776
+ if (mounted) {
777
+ const error = err instanceof Error ? err : new Error(String(err));
778
+ setModuleState({
779
+ loading: false,
780
+ error,
781
+ component: null
782
+ });
783
+ onError?.(error);
784
+ }
785
+ }
786
+ }
787
+ loadModule();
788
+ return ()=>{
789
+ mounted = false;
790
+ };
791
+ }, [
792
+ pkg,
793
+ version,
794
+ moduleName,
795
+ scopeName,
796
+ onError,
797
+ onLoad
798
+ ]);
799
+ return moduleState;
800
+ }
801
+ function RemoteModuleCardContent({ pkg, version, moduleName, scopeName, loadingFallback, errorFallback, componentProps, className, style, onError, onLoad }) {
802
+ const moduleState = useRemoteModule({
803
+ pkg,
804
+ version,
805
+ moduleName,
806
+ scopeName,
807
+ onError,
808
+ onLoad
809
+ });
810
+ const [retryCount, setRetryCount] = useState(0);
811
+ const handleRetry = useCallback(()=>{
812
+ setRetryCount((prev)=>prev + 1);
813
+ }, []);
814
+ useEffect(()=>{}, [
815
+ retryCount
816
+ ]);
817
+ if (moduleState.loading) return /*#__PURE__*/ react.createElement("div", {
818
+ className: className,
819
+ style: style,
820
+ role: "status",
821
+ "aria-live": "polite"
822
+ }, loadingFallback || /*#__PURE__*/ react.createElement("div", {
823
+ className: "module-card module-card--loading"
824
+ }, /*#__PURE__*/ react.createElement("div", {
825
+ className: "loading-spinner",
826
+ "aria-hidden": "true"
827
+ }), /*#__PURE__*/ react.createElement("span", null, "Loading ", moduleName, "...")));
828
+ if (moduleState.error) {
829
+ if ('function' == typeof errorFallback) return /*#__PURE__*/ react.createElement(react.Fragment, null, errorFallback(moduleState.error, handleRetry));
830
+ if (void 0 !== errorFallback) return /*#__PURE__*/ react.createElement(react.Fragment, null, errorFallback);
831
+ return /*#__PURE__*/ react.createElement("div", {
832
+ className: className,
833
+ style: style,
834
+ role: "alert"
835
+ }, /*#__PURE__*/ react.createElement("div", {
836
+ className: "module-card module-card--error"
837
+ }, /*#__PURE__*/ react.createElement("span", {
838
+ className: "error-icon",
839
+ "aria-hidden": "true"
840
+ }, "!"), /*#__PURE__*/ react.createElement("span", null, "Failed to load ", moduleName), /*#__PURE__*/ react.createElement("p", {
841
+ className: "error-message"
842
+ }, moduleState.error.message), /*#__PURE__*/ react.createElement("button", {
843
+ onClick: handleRetry,
844
+ className: "retry-button",
845
+ type: "button"
846
+ }, "Retry")));
847
+ }
848
+ if (!moduleState.component) return null;
849
+ const Component = moduleState.component;
850
+ return /*#__PURE__*/ react.createElement("div", {
851
+ className: className,
852
+ style: style
853
+ }, /*#__PURE__*/ react.createElement(Component, componentProps));
854
+ }
855
+ function RemoteModuleCard(props) {
856
+ const { disableErrorBoundary, errorFallback, loadingFallback, errorBoundaryOptions } = props;
857
+ if (disableErrorBoundary) return /*#__PURE__*/ react.createElement(Suspense, {
858
+ fallback: loadingFallback || /*#__PURE__*/ react.createElement("div", null, "Loading...")
859
+ }, /*#__PURE__*/ react.createElement(RemoteModuleCardContent, props));
860
+ return /*#__PURE__*/ react.createElement(ErrorBoundary, {
861
+ fallback: errorFallback,
862
+ onError: errorBoundaryOptions?.onError,
863
+ onReset: errorBoundaryOptions?.onReset
864
+ }, /*#__PURE__*/ react.createElement(Suspense, {
865
+ fallback: loadingFallback || /*#__PURE__*/ react.createElement("div", null, "Loading...")
866
+ }, /*#__PURE__*/ react.createElement(RemoteModuleCardContent, props)));
867
+ }
868
+ function lazyRemote(options) {
869
+ const { pkg, version = 'latest', moduleName, scopeName, maxRetries = 3, retryDelay = 1000 } = options;
870
+ let retryCount = 0;
871
+ const loadComponent = async ()=>{
872
+ try {
873
+ const { mf } = await loadRemoteMultiVersion({
874
+ name: scopeName,
875
+ pkg,
876
+ version
877
+ }, []);
878
+ if (!mf) throw new Error(`[RemoteReloadUtils] Failed to get Module Federation instance for ${scopeName}`);
879
+ const mod = await mf.loadRemote(`${scopeName}/${moduleName}`);
880
+ if (!mod || 'object' != typeof mod || !('default' in mod)) throw new Error(`[RemoteReloadUtils] Module "${scopeName}/${moduleName}" does not export a default component`);
881
+ return {
882
+ default: mod.default
883
+ };
884
+ } catch (error) {
885
+ if (retryCount < maxRetries) {
886
+ retryCount++;
887
+ await new Promise((resolve)=>setTimeout(resolve, retryDelay * retryCount));
888
+ return loadComponent();
889
+ }
890
+ throw error;
891
+ }
892
+ };
893
+ return /*#__PURE__*/ lazy(loadComponent);
894
+ }
895
+ function SuspenseRemote({ fallback, children }) {
896
+ return /*#__PURE__*/ react.createElement(Suspense, {
897
+ fallback: fallback || /*#__PURE__*/ react.createElement("div", null, "Loading...")
898
+ }, children);
899
+ }
900
+ function SuspenseRemoteLoader({ pkg, version = 'latest', moduleName, scopeName, fallback, errorFallback, componentProps }) {
901
+ const RemoteComponent = lazyRemote({
902
+ pkg,
903
+ version,
904
+ moduleName,
905
+ scopeName
906
+ });
907
+ if (errorFallback) return /*#__PURE__*/ react.createElement(ErrorBoundary, {
908
+ fallback: errorFallback
909
+ }, /*#__PURE__*/ react.createElement(Suspense, {
910
+ fallback: fallback || /*#__PURE__*/ react.createElement("div", null, "Loading...")
911
+ }, /*#__PURE__*/ react.createElement(RemoteComponent, componentProps)));
912
+ return /*#__PURE__*/ react.createElement(Suspense, {
913
+ fallback: fallback || /*#__PURE__*/ react.createElement("div", null, "Loading...")
914
+ }, /*#__PURE__*/ react.createElement(RemoteComponent, componentProps));
915
+ }
916
+ function withRemote(WrappedComponent, options) {
917
+ const RemoteComponent = lazyRemote(options);
918
+ return function(props) {
919
+ return /*#__PURE__*/ react.createElement(Suspense, {
920
+ fallback: /*#__PURE__*/ react.createElement("div", null, "Loading...")
921
+ }, /*#__PURE__*/ react.createElement(RemoteComponent, props));
922
+ };
923
+ }
924
+ function useRemoteModuleHook(options) {
925
+ const { pkg, version = 'latest', moduleName, scopeName } = options;
926
+ const [state, setState] = useState({
927
+ component: null,
928
+ loading: true,
929
+ error: null
930
+ });
931
+ useEffect(()=>{
932
+ let mounted = true;
933
+ async function load() {
934
+ try {
935
+ setState((prev)=>({
936
+ ...prev,
937
+ loading: true,
938
+ error: null
939
+ }));
940
+ const { mf } = await loadRemoteMultiVersion({
941
+ name: scopeName,
942
+ pkg,
943
+ version
944
+ }, []);
945
+ if (!mf) throw new Error(`[RemoteReloadUtils] Failed to get Module Federation instance for ${scopeName}`);
946
+ const mod = await mf.loadRemote(`${scopeName}/${moduleName}`);
947
+ if (mounted) if (mod && 'object' == typeof mod && 'default' in mod) setState({
948
+ component: mod.default,
949
+ loading: false,
950
+ error: null
951
+ });
952
+ else throw new Error(`[RemoteReloadUtils] Module "${scopeName}/${moduleName}" does not export a default component`);
953
+ } catch (err) {
954
+ if (mounted) setState({
955
+ component: null,
956
+ loading: false,
957
+ error: err instanceof Error ? err : new Error(String(err))
958
+ });
959
+ }
960
+ }
961
+ load();
962
+ return ()=>{
963
+ mounted = false;
964
+ };
965
+ }, [
966
+ pkg,
967
+ version,
968
+ moduleName,
969
+ scopeName
970
+ ]);
971
+ return {
972
+ component: state.component,
973
+ loading: state.loading,
974
+ error: state.error
975
+ };
976
+ }
977
+ export { ErrorBoundary, RemoteModuleCard, SuspenseRemote, SuspenseRemoteLoader, buildCdnUrls, buildFinalUrls, cancelPreload, checkModuleLoadable, checkRemoteHealth, checkVersionCompatibility, clearPreloadCache, compareVersions, createEventBus, eventBus, extractMajorVersion, fallbackPlugin, fetchAvailableVersions, fetchLatestVersion, findCompatibleVersion, formatHealthStatus, getCompatibleReactVersions, getFinalSharedConfig, getLatestVersion, getLoadedRemotes, getPreloadStatus, getRemoteHealthReport, getStableVersions, getVersionCache, isPrerelease, isRemoteLoaded, lazyRemote, loadReactVersion, loadRemoteMultiVersion, parseVersion, preloadRemote, preloadRemoteList, registerLoadedModule, registerRemoteInstance, resolveFinalVersion, satisfiesVersion, setVersionCache, sortVersions, tryLoadRemote, unloadAll, unloadRemote, useRemoteModuleHook, withRemote };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "remote-reload-utils",
3
- "version": "0.0.10",
3
+ "version": "0.0.11",
4
4
  "type": "module",
5
5
  "description": "Utilities for remote reload in Module Federation & React Component",
6
6
  "exports": {