dumi 2.4.54 → 2.4.55

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.
@@ -1,5 +1,6 @@
1
1
  import { useDemo, useLiveDemo, useLocation, useParams } from 'dumi';
2
2
  import { createElement, useEffect } from 'react';
3
+ import { isLiveDemoMessage, isLiveDemoSource } from "../../theme-api/liveDemoMessage";
3
4
  import { useRenderer } from "../../theme-api/useRenderer";
4
5
  import "./index.less";
5
6
  var DemoRenderPage = function DemoRenderPage() {
@@ -29,8 +30,13 @@ var DemoRenderPage = function DemoRenderPage() {
29
30
 
30
31
  // listen message event for setSource
31
32
  useEffect(function () {
33
+ var _demo$asset;
34
+ var dependencies = (_demo$asset = demo.asset) === null || _demo$asset === void 0 ? void 0 : _demo$asset.dependencies;
35
+ var entryFileName = dependencies && Object.keys(dependencies).find(function (key) {
36
+ return dependencies[key].type === 'FILE';
37
+ });
32
38
  var handler = function handler(ev) {
33
- if (ev.data.type === 'dumi.liveDemo.setSource') {
39
+ if (isLiveDemoMessage(ev, window.parent, 'dumi.liveDemo.setSource') && isLiveDemoSource(ev.data.value, entryFileName)) {
34
40
  setSource(ev.data.value);
35
41
  }
36
42
  };
@@ -38,9 +44,9 @@ var DemoRenderPage = function DemoRenderPage() {
38
44
  return function () {
39
45
  return window.removeEventListener('message', handler);
40
46
  };
41
- }, [setSource]);
47
+ }, [demo.asset, setSource]);
42
48
 
43
- // notify parent window that compile done
49
+ // The parent listens on this window for compilation completion.
44
50
  useEffect(function () {
45
51
  if (!loading && (liveDemoError || liveDemoNode)) {
46
52
  window.postMessage({
@@ -48,7 +54,7 @@ var DemoRenderPage = function DemoRenderPage() {
48
54
  value: {
49
55
  err: liveDemoError
50
56
  }
51
- });
57
+ }, window.location.origin);
52
58
  }
53
59
  }, [liveDemoError, liveDemoNode, loading]);
54
60
  return finalNode;
@@ -0,0 +1,4 @@
1
+ /** Only trust messages from the expected window on this site's origin. */
2
+ export declare function isLiveDemoMessage(event: MessageEvent, source: Window, type: 'dumi.liveDemo.setSource' | 'dumi.liveDemo.compileDone'): boolean;
3
+ export declare function isLiveDemoSource(value: unknown, entryFileName: string | undefined): value is Record<string, string>;
4
+ export declare function isLiveDemoCompileResult(value: unknown): boolean;
@@ -0,0 +1,19 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function isRecord(value) {
3
+ return _typeof(value) === 'object' && value !== null && !Array.isArray(value);
4
+ }
5
+
6
+ /** Only trust messages from the expected window on this site's origin. */
7
+ export function isLiveDemoMessage(event, source, type) {
8
+ var origin = window.location.origin;
9
+ return origin !== 'null' && event.origin === origin && event.source === source && isRecord(event.data) && event.data.type === type;
10
+ }
11
+ export function isLiveDemoSource(value, entryFileName) {
12
+ return isRecord(value) && entryFileName !== undefined && Object.prototype.hasOwnProperty.call(value, entryFileName) && typeof value[entryFileName] === 'string' && Object.values(value).every(function (source) {
13
+ return typeof source === 'string';
14
+ });
15
+ }
16
+ export function isLiveDemoCompileResult(value) {
17
+ // Preserve arbitrary compiler throw values, including errors from other realms.
18
+ return isRecord(value) && Object.prototype.hasOwnProperty.call(value, 'err');
19
+ }
@@ -13,6 +13,7 @@ import { useDemo } from 'dumi';
13
13
  import throttle from 'lodash.throttle';
14
14
  import { createElement, useCallback, useRef, useState } from 'react';
15
15
  import DemoErrorBoundary from "./DumiDemo/DemoErrorBoundary";
16
+ import { isLiveDemoCompileResult, isLiveDemoMessage } from "./liveDemoMessage";
16
17
  import { useRenderer } from "./useRenderer";
17
18
  import { getAgnosticComponentModule } from "./utils";
18
19
  var THROTTLE_WAIT = 500;
@@ -76,7 +77,7 @@ export var useLiveDemo = function useLiveDemo(id, opts) {
76
77
  _context.next = 5;
77
78
  return new Promise(function (resolve) {
78
79
  var handler = function handler(ev) {
79
- if (ev.data.type.startsWith('dumi.liveDemo.compileDone')) {
80
+ if (isLiveDemoMessage(ev, iframeWindow, 'dumi.liveDemo.compileDone') && isLiveDemoCompileResult(ev.data.value)) {
80
81
  iframeWindow.removeEventListener('message', handler);
81
82
  setError(ev.data.value.err);
82
83
  resolve();
@@ -86,7 +87,7 @@ export var useLiveDemo = function useLiveDemo(id, opts) {
86
87
  iframeWindow.postMessage({
87
88
  type: 'dumi.liveDemo.setSource',
88
89
  value: source
89
- });
90
+ }, window.location.origin);
90
91
  });
91
92
  case 5:
92
93
  _context.next = 74;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dumi",
3
- "version": "2.4.54",
3
+ "version": "2.4.55",
4
4
  "description": "📖 Documentation Generator of React Component",
5
5
  "keywords": [
6
6
  "generator",
@@ -157,6 +157,7 @@
157
157
  "git-repo-info": "^2.1.1",
158
158
  "highlight-words-core": "^1.2.2",
159
159
  "husky": "^8.0.3",
160
+ "jsdom": "^26.1.0",
160
161
  "lint-staged": "^13.2.3",
161
162
  "prettier": "^2.8.8",
162
163
  "prettier-plugin-organize-imports": "^3.2.3",