@xfe-repo/web-micro 1.6.0 → 1.7.0

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/index.d.mts CHANGED
@@ -14,6 +14,7 @@ type MicroAppProps = {
14
14
  loadingFallback?: React.ReactNode;
15
15
  errorFallback?: React.ReactNode;
16
16
  aHrefResolver?: (hrefValue: string) => string;
17
+ onChunkLoadError?: (error: unknown, appName: string) => void;
17
18
  };
18
19
  declare const MicroAppRoute: React.MemoExoticComponent<(props: MicroAppProps) => react_jsx_runtime.JSX.Element>;
19
20
 
@@ -28,6 +29,10 @@ type NavigateToWithMicroAppOptions = {
28
29
  };
29
30
  declare const navigateToWithMicroApp: (to: string, options?: NavigateToWithMicroAppOptions) => void;
30
31
 
32
+ declare function isChunkLoadError(error: unknown): boolean;
33
+ type ChunkLoadErrorHandler = (error: unknown) => void;
34
+ declare function subscribeChunkLoadError(handler: ChunkLoadErrorHandler): () => void;
35
+
31
36
  declare enum MicroAppEventEnum {
32
37
  DISPATCH_ACTION = "dispatchAction"
33
38
  }
@@ -66,4 +71,4 @@ declare const aHrefResolverCollector: Record<string, AHrefResolverType>;
66
71
 
67
72
  declare const microApp: _micro_zoe_micro_app.MicroApp;
68
73
 
69
- export { type MicroAppActionMetaType, type MicroAppActionType, type MicroAppDispatchListener, MicroAppEventCenter, type MicroAppEventCenterConfig, MicroAppEventEnum, type MicroAppGlobalDataType, MicroAppLink, type MicroAppProps, MicroAppRoute, type NavigateToWithMicroAppOptions, aHrefResolverCollector, microApp, navigateToWithMicroApp };
74
+ export { type ChunkLoadErrorHandler, type MicroAppActionMetaType, type MicroAppActionType, type MicroAppDispatchListener, MicroAppEventCenter, type MicroAppEventCenterConfig, MicroAppEventEnum, type MicroAppGlobalDataType, MicroAppLink, type MicroAppProps, MicroAppRoute, type NavigateToWithMicroAppOptions, aHrefResolverCollector, isChunkLoadError, microApp, navigateToWithMicroApp, subscribeChunkLoadError };
package/dist/index.d.ts CHANGED
@@ -14,6 +14,7 @@ type MicroAppProps = {
14
14
  loadingFallback?: React.ReactNode;
15
15
  errorFallback?: React.ReactNode;
16
16
  aHrefResolver?: (hrefValue: string) => string;
17
+ onChunkLoadError?: (error: unknown, appName: string) => void;
17
18
  };
18
19
  declare const MicroAppRoute: React.MemoExoticComponent<(props: MicroAppProps) => react_jsx_runtime.JSX.Element>;
19
20
 
@@ -28,6 +29,10 @@ type NavigateToWithMicroAppOptions = {
28
29
  };
29
30
  declare const navigateToWithMicroApp: (to: string, options?: NavigateToWithMicroAppOptions) => void;
30
31
 
32
+ declare function isChunkLoadError(error: unknown): boolean;
33
+ type ChunkLoadErrorHandler = (error: unknown) => void;
34
+ declare function subscribeChunkLoadError(handler: ChunkLoadErrorHandler): () => void;
35
+
31
36
  declare enum MicroAppEventEnum {
32
37
  DISPATCH_ACTION = "dispatchAction"
33
38
  }
@@ -66,4 +71,4 @@ declare const aHrefResolverCollector: Record<string, AHrefResolverType>;
66
71
 
67
72
  declare const microApp: _micro_zoe_micro_app.MicroApp;
68
73
 
69
- export { type MicroAppActionMetaType, type MicroAppActionType, type MicroAppDispatchListener, MicroAppEventCenter, type MicroAppEventCenterConfig, MicroAppEventEnum, type MicroAppGlobalDataType, MicroAppLink, type MicroAppProps, MicroAppRoute, type NavigateToWithMicroAppOptions, aHrefResolverCollector, microApp, navigateToWithMicroApp };
74
+ export { type ChunkLoadErrorHandler, type MicroAppActionMetaType, type MicroAppActionType, type MicroAppDispatchListener, MicroAppEventCenter, type MicroAppEventCenterConfig, MicroAppEventEnum, type MicroAppGlobalDataType, MicroAppLink, type MicroAppProps, MicroAppRoute, type NavigateToWithMicroAppOptions, aHrefResolverCollector, isChunkLoadError, microApp, navigateToWithMicroApp, subscribeChunkLoadError };
package/dist/index.js CHANGED
@@ -68,6 +68,14 @@ function _define_property(obj, key, value) {
68
68
  }
69
69
  return obj;
70
70
  }
71
+ function _instanceof(left, right) {
72
+ "@swc/helpers - instanceof";
73
+ if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
74
+ return !!right[Symbol.hasInstance](left);
75
+ } else {
76
+ return left instanceof right;
77
+ }
78
+ }
71
79
  function _iterable_to_array_limit(arr, i) {
72
80
  var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
73
81
  if (_i == null) return;
@@ -303,11 +311,17 @@ __export(index_exports, {
303
311
  aHrefResolverCollector: function aHrefResolverCollector1() {
304
312
  return aHrefResolverCollector;
305
313
  },
314
+ isChunkLoadError: function isChunkLoadError1() {
315
+ return isChunkLoadError;
316
+ },
306
317
  microApp: function microApp1() {
307
318
  return microApp;
308
319
  },
309
320
  navigateToWithMicroApp: function navigateToWithMicroApp1() {
310
321
  return navigateToWithMicroApp;
322
+ },
323
+ subscribeChunkLoadError: function subscribeChunkLoadError1() {
324
+ return subscribeChunkLoadError;
311
325
  }
312
326
  });
313
327
  module.exports = __toCommonJS(index_exports);
@@ -318,12 +332,63 @@ __reExport(index_exports, require("@micro-zoe/micro-app"), module.exports);
318
332
  // src/MicroAppRoute.tsx
319
333
  var import_react = require("react");
320
334
  var import_web_router = require("@xfe-repo/web-router");
335
+ // src/chunkLoadError.ts
336
+ var CHUNK_ERROR_PATTERNS = [
337
+ /Loading chunk \S+ failed/i,
338
+ /Loading CSS chunk \S+ failed/i,
339
+ /ChunkLoadError/i
340
+ ];
341
+ function isChunkLoadError(error) {
342
+ if (!error) return false;
343
+ if (typeof error === "string") return CHUNK_ERROR_PATTERNS.some(function(p) {
344
+ return p.test(error);
345
+ });
346
+ if (_instanceof(error, Error)) {
347
+ if (error.name === "ChunkLoadError") return true;
348
+ return CHUNK_ERROR_PATTERNS.some(function(p) {
349
+ return p.test(error.message);
350
+ });
351
+ }
352
+ var anyError = error;
353
+ if (anyError.message) return isChunkLoadError(anyError.message);
354
+ if (anyError.detail) return isChunkLoadError(anyError.detail);
355
+ if (anyError.reason) return isChunkLoadError(anyError.reason);
356
+ return false;
357
+ }
358
+ function subscribeChunkLoadError(handler) {
359
+ var onError = function onError(event) {
360
+ var target = event.error || event.message;
361
+ if (isChunkLoadError(target)) handler(target);
362
+ };
363
+ var onRejection = function onRejection(event) {
364
+ if (isChunkLoadError(event.reason)) handler(event.reason);
365
+ };
366
+ window.addEventListener("error", onError, true);
367
+ window.addEventListener("unhandledrejection", onRejection);
368
+ return function() {
369
+ window.removeEventListener("error", onError, true);
370
+ window.removeEventListener("unhandledrejection", onRejection);
371
+ };
372
+ }
373
+ // src/MicroAppRoute.tsx
321
374
  var import_jsx_custom_event = __toESM(require("@micro-zoe/micro-app/polyfill/jsx-custom-event.js"));
322
375
  var MicroAppRoute = (0, import_react.memo)(function(props) {
323
- var name = props.name, baseRoute = props.baseRoute, url = props.url, keepAlive = props.keepAlive, className = props.className, data = props.data, loadingFallback = props.loadingFallback, errorFallback = props.errorFallback, aHrefResolver = props.aHrefResolver;
376
+ var name = props.name, baseRoute = props.baseRoute, url = props.url, keepAlive = props.keepAlive, className = props.className, data = props.data, loadingFallback = props.loadingFallback, errorFallback = props.errorFallback, aHrefResolver = props.aHrefResolver, onChunkLoadError = props.onChunkLoadError;
324
377
  if (aHrefResolver) aHrefResolverCollector[name] = aHrefResolver;
325
378
  var _ref = _sliced_to_array((0, import_react.useState)(false), 2), microAppIsShow = _ref[0], setMicroAppIsShow = _ref[1];
326
379
  var _ref1 = _sliced_to_array((0, import_react.useState)(false), 2), microAppIsError = _ref1[0], setMicroAppIsError = _ref1[1];
380
+ var onChunkLoadErrorRef = (0, import_react.useRef)(onChunkLoadError);
381
+ onChunkLoadErrorRef.current = onChunkLoadError;
382
+ (0, import_react.useEffect)(function() {
383
+ if (!onChunkLoadError) return;
384
+ return subscribeChunkLoadError(function(error) {
385
+ var _onChunkLoadErrorRef_current;
386
+ (_onChunkLoadErrorRef_current = onChunkLoadErrorRef.current) === null || _onChunkLoadErrorRef_current === void 0 ? void 0 : _onChunkLoadErrorRef_current.call(onChunkLoadErrorRef, error, name);
387
+ });
388
+ }, [
389
+ name,
390
+ onChunkLoadError
391
+ ]);
327
392
  var handleMicroAppMounted = (0, import_react.useCallback)(function() {
328
393
  var navigator = (0, import_web_router.getClientNavigator)();
329
394
  navigator.replace(location.pathname + location.search, history.state);
@@ -340,9 +405,13 @@ var MicroAppRoute = (0, import_react.memo)(function(props) {
340
405
  });
341
406
  setMicroAppIsShow(true);
342
407
  }, []);
343
- var handleMicroAppError = (0, import_react.useCallback)(function() {
408
+ var handleMicroAppError = (0, import_react.useCallback)(function(event) {
409
+ var _onChunkLoadErrorRef_current;
344
410
  setMicroAppIsError(true);
345
- }, []);
411
+ if (isChunkLoadError(event)) (_onChunkLoadErrorRef_current = onChunkLoadErrorRef.current) === null || _onChunkLoadErrorRef_current === void 0 ? void 0 : _onChunkLoadErrorRef_current.call(onChunkLoadErrorRef, event, name);
412
+ }, [
413
+ name
414
+ ]);
346
415
  return /* @__PURE__ */ (0, import_jsx_custom_event.default)("div", {
347
416
  className: className
348
417
  }, microAppIsError && errorFallback, !microAppIsShow && !microAppIsError && loadingFallback, /* @__PURE__ */ (0, import_jsx_custom_event.default)("micro-app", {
@@ -590,6 +659,8 @@ var microApp = import_micro_app.default;
590
659
  MicroAppLink: MicroAppLink,
591
660
  MicroAppRoute: MicroAppRoute,
592
661
  aHrefResolverCollector: aHrefResolverCollector,
662
+ isChunkLoadError: isChunkLoadError,
593
663
  microApp: microApp,
594
- navigateToWithMicroApp: navigateToWithMicroApp
664
+ navigateToWithMicroApp: navigateToWithMicroApp,
665
+ subscribeChunkLoadError: subscribeChunkLoadError
595
666
  }, require("@micro-zoe/micro-app")));
package/dist/index.mjs CHANGED
@@ -67,6 +67,14 @@ function _define_property(obj, key, value) {
67
67
  }
68
68
  return obj;
69
69
  }
70
+ function _instanceof(left, right) {
71
+ "@swc/helpers - instanceof";
72
+ if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
73
+ return !!right[Symbol.hasInstance](left);
74
+ } else {
75
+ return left instanceof right;
76
+ }
77
+ }
70
78
  function _iterable_to_array_limit(arr, i) {
71
79
  var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
72
80
  if (_i == null) return;
@@ -225,14 +233,65 @@ import { uuid } from "@xfe-repo/web-utils/tools";
225
233
  import originMicroApp, { EventCenterForMicroApp } from "@micro-zoe/micro-app";
226
234
  export * from "@micro-zoe/micro-app";
227
235
  // src/MicroAppRoute.tsx
228
- import { memo, useCallback, useState } from "react";
236
+ import { memo, useCallback, useEffect, useRef, useState } from "react";
229
237
  import { getClientNavigator } from "@xfe-repo/web-router";
238
+ // src/chunkLoadError.ts
239
+ var CHUNK_ERROR_PATTERNS = [
240
+ /Loading chunk \S+ failed/i,
241
+ /Loading CSS chunk \S+ failed/i,
242
+ /ChunkLoadError/i
243
+ ];
244
+ function isChunkLoadError(error) {
245
+ if (!error) return false;
246
+ if (typeof error === "string") return CHUNK_ERROR_PATTERNS.some(function(p) {
247
+ return p.test(error);
248
+ });
249
+ if (_instanceof(error, Error)) {
250
+ if (error.name === "ChunkLoadError") return true;
251
+ return CHUNK_ERROR_PATTERNS.some(function(p) {
252
+ return p.test(error.message);
253
+ });
254
+ }
255
+ var anyError = error;
256
+ if (anyError.message) return isChunkLoadError(anyError.message);
257
+ if (anyError.detail) return isChunkLoadError(anyError.detail);
258
+ if (anyError.reason) return isChunkLoadError(anyError.reason);
259
+ return false;
260
+ }
261
+ function subscribeChunkLoadError(handler) {
262
+ var onError = function onError(event) {
263
+ var target = event.error || event.message;
264
+ if (isChunkLoadError(target)) handler(target);
265
+ };
266
+ var onRejection = function onRejection(event) {
267
+ if (isChunkLoadError(event.reason)) handler(event.reason);
268
+ };
269
+ window.addEventListener("error", onError, true);
270
+ window.addEventListener("unhandledrejection", onRejection);
271
+ return function() {
272
+ window.removeEventListener("error", onError, true);
273
+ window.removeEventListener("unhandledrejection", onRejection);
274
+ };
275
+ }
276
+ // src/MicroAppRoute.tsx
230
277
  import jsxCustomEvent from "@micro-zoe/micro-app/polyfill/jsx-custom-event.js";
231
278
  var MicroAppRoute = memo(function(props) {
232
- var name = props.name, baseRoute = props.baseRoute, url = props.url, keepAlive = props.keepAlive, className = props.className, data = props.data, loadingFallback = props.loadingFallback, errorFallback = props.errorFallback, aHrefResolver = props.aHrefResolver;
279
+ var name = props.name, baseRoute = props.baseRoute, url = props.url, keepAlive = props.keepAlive, className = props.className, data = props.data, loadingFallback = props.loadingFallback, errorFallback = props.errorFallback, aHrefResolver = props.aHrefResolver, onChunkLoadError = props.onChunkLoadError;
233
280
  if (aHrefResolver) aHrefResolverCollector[name] = aHrefResolver;
234
281
  var _useState = _sliced_to_array(useState(false), 2), microAppIsShow = _useState[0], setMicroAppIsShow = _useState[1];
235
282
  var _useState1 = _sliced_to_array(useState(false), 2), microAppIsError = _useState1[0], setMicroAppIsError = _useState1[1];
283
+ var onChunkLoadErrorRef = useRef(onChunkLoadError);
284
+ onChunkLoadErrorRef.current = onChunkLoadError;
285
+ useEffect(function() {
286
+ if (!onChunkLoadError) return;
287
+ return subscribeChunkLoadError(function(error) {
288
+ var _onChunkLoadErrorRef_current;
289
+ (_onChunkLoadErrorRef_current = onChunkLoadErrorRef.current) === null || _onChunkLoadErrorRef_current === void 0 ? void 0 : _onChunkLoadErrorRef_current.call(onChunkLoadErrorRef, error, name);
290
+ });
291
+ }, [
292
+ name,
293
+ onChunkLoadError
294
+ ]);
236
295
  var handleMicroAppMounted = useCallback(function() {
237
296
  var navigator = getClientNavigator();
238
297
  navigator.replace(location.pathname + location.search, history.state);
@@ -249,9 +308,13 @@ var MicroAppRoute = memo(function(props) {
249
308
  });
250
309
  setMicroAppIsShow(true);
251
310
  }, []);
252
- var handleMicroAppError = useCallback(function() {
311
+ var handleMicroAppError = useCallback(function(event) {
312
+ var _onChunkLoadErrorRef_current;
253
313
  setMicroAppIsError(true);
254
- }, []);
314
+ if (isChunkLoadError(event)) (_onChunkLoadErrorRef_current = onChunkLoadErrorRef.current) === null || _onChunkLoadErrorRef_current === void 0 ? void 0 : _onChunkLoadErrorRef_current.call(onChunkLoadErrorRef, event, name);
315
+ }, [
316
+ name
317
+ ]);
255
318
  return /* @__PURE__ */ jsxCustomEvent("div", {
256
319
  className: className
257
320
  }, microAppIsError && errorFallback, !microAppIsShow && !microAppIsError && loadingFallback, /* @__PURE__ */ jsxCustomEvent("micro-app", {
@@ -493,4 +556,4 @@ originMicroApp.options.aHrefResolver = function(hrefValue, appName) {
493
556
  return ((_aHrefResolverCollector_appName = aHrefResolverCollector[appName]) === null || _aHrefResolverCollector_appName === void 0 ? void 0 : _aHrefResolverCollector_appName.call(aHrefResolverCollector, hrefValue)) || hrefValue;
494
557
  };
495
558
  var microApp = originMicroApp;
496
- export { MicroAppEventCenter, MicroAppEventEnum, MicroAppLink, MicroAppRoute, aHrefResolverCollector, microApp, navigateToWithMicroApp };
559
+ export { MicroAppEventCenter, MicroAppEventEnum, MicroAppLink, MicroAppRoute, aHrefResolverCollector, isChunkLoadError, microApp, navigateToWithMicroApp, subscribeChunkLoadError };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xfe-repo/web-micro",
3
- "version": "1.6.0",
3
+ "version": "1.7.0",
4
4
  "sideEffects": false,
5
5
  "module": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -27,8 +27,8 @@
27
27
  "@types/node": "^20.17.0",
28
28
  "@types/react": "^18",
29
29
  "eslint": "8.57.1",
30
- "@xfe-repo/eslint-config": "1.6.0",
31
- "@xfe-repo/typescript-config": "1.6.0"
30
+ "@xfe-repo/typescript-config": "1.6.1",
31
+ "@xfe-repo/eslint-config": "1.6.0"
32
32
  },
33
33
  "peerDependencies": {
34
34
  "@xfe-repo/web-router": "1.6.0"