dumi 2.3.0-rc.0 → 2.3.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.
@@ -83,7 +83,7 @@ async function parseBlockAsset(opts) {
83
83
  type: "NPM",
84
84
  value: pkg.version
85
85
  };
86
- result.resolveMap[args.path] = resolved;
86
+ result.resolveMap[args.path] = args.path;
87
87
  }
88
88
  return { path: args.path, external: true };
89
89
  }
@@ -148,7 +148,7 @@ async function parseBlockAsset(opts) {
148
148
  result.frontmatter = frontmatter;
149
149
  }
150
150
  }
151
- if (!isEntryPoint || !opts.entryPointCode) {
151
+ if (opts.techStack.runtimeOpts && (!isEntryPoint || !opts.entryPointCode)) {
152
152
  result.resolveMap[filename] = args.path;
153
153
  }
154
154
  return {
@@ -3,17 +3,23 @@ import { createElement, useEffect } from 'react';
3
3
  import { useRenderer } from "../../theme-api/useRenderer";
4
4
  import "./index.less";
5
5
  var DemoRenderPage = function DemoRenderPage() {
6
- var _useParams = useParams(),
7
- id = _useParams.id;
6
+ var params = useParams();
7
+ var id = params.id;
8
8
  var demo = useDemo(id);
9
- var canvasRef = useRenderer(demo);
9
+ var _useRenderer = useRenderer({
10
+ id: id,
11
+ component: demo.component,
12
+ renderOpts: demo.renderOpts
13
+ }),
14
+ canvasRef = _useRenderer.canvasRef;
10
15
  var _ref = demo || {},
11
16
  component = _ref.component,
12
17
  renderOpts = _ref.renderOpts;
13
18
  var _useLiveDemo = useLiveDemo(id),
14
19
  liveDemoNode = _useLiveDemo.node,
15
20
  setSource = _useLiveDemo.setSource,
16
- liveDemoError = _useLiveDemo.error;
21
+ liveDemoError = _useLiveDemo.error,
22
+ loading = _useLiveDemo.loading;
17
23
  var finalNode = liveDemoNode || (renderOpts !== null && renderOpts !== void 0 && renderOpts.renderer ? /*#__PURE__*/createElement('div', {
18
24
  ref: canvasRef
19
25
  }) : component && /*#__PURE__*/createElement(component));
@@ -33,7 +39,7 @@ var DemoRenderPage = function DemoRenderPage() {
33
39
 
34
40
  // notify parent window that compile done
35
41
  useEffect(function () {
36
- if (liveDemoNode || liveDemoError) {
42
+ if (!loading && (liveDemoError || liveDemoNode)) {
37
43
  window.postMessage({
38
44
  type: 'dumi.liveDemo.compileDone',
39
45
  value: {
@@ -41,7 +47,7 @@ var DemoRenderPage = function DemoRenderPage() {
41
47
  }
42
48
  });
43
49
  }
44
- }, [liveDemoNode, liveDemoError]);
50
+ }, [liveDemoError, liveDemoNode, loading]);
45
51
  return finalNode;
46
52
  };
47
53
  export default DemoRenderPage;
@@ -15,9 +15,12 @@ var InternalDumiDemo = function InternalDumiDemo(props) {
15
15
  var component = demo.component,
16
16
  asset = demo.asset,
17
17
  renderOpts = demo.renderOpts;
18
- var canvasRef = useRenderer(Object.assign(demo, {
19
- id: id
20
- }));
18
+ var _useRenderer = useRenderer({
19
+ id: id,
20
+ renderOpts: demo.renderOpts,
21
+ component: demo.component
22
+ }),
23
+ canvasRef = _useRenderer.canvasRef;
21
24
 
22
25
  // hide debug demo in production
23
26
  if (process.env.NODE_ENV === 'production' && props.previewerProps.debug) return null;
@@ -233,6 +233,7 @@ export type IDemoCompileFn = (code: string, opts: {
233
233
  filename: string;
234
234
  }) => Promise<string>;
235
235
  export type IDemoCancelableFn = (canvas: HTMLElement, component: AgnosticComponentModule) => (() => void) | Promise<() => void>;
236
+ export type IDemoPreflightFn = (component: AgnosticComponentModule) => Promise<void>;
236
237
  export type IDemoData = {
237
238
  component: ReactComponentType | AgnosticComponentType;
238
239
  asset: IPreviewerProps['asset'];
@@ -243,7 +244,15 @@ export type IDemoData = {
243
244
  * provide a runtime compile function for compile demo code for live preview
244
245
  */
245
246
  compile?: IDemoCompileFn;
247
+ /**
248
+ * Component rendering function, used to manage the creation and unmount of components
249
+ */
246
250
  renderer?: IDemoCancelableFn;
251
+ /**
252
+ * Used to detect initialization errors of components in advance
253
+ * (if there is an error, the component will not be mounted)
254
+ */
255
+ preflight?: IDemoPreflightFn;
247
256
  };
248
257
  };
249
258
  export {};
@@ -2,11 +2,6 @@ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" =
2
2
  function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = "function" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || "@@iterator", asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, ""); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, "_invoke", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: "normal", arg: fn.call(obj, arg) }; } catch (err) { return { type: "throw", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { ["next", "throw", "return"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if ("throw" !== record.type) { var result = record.arg, value = result.value; return value && "object" == _typeof(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke("next", value, resolve, reject); }, function (err) { invoke("throw", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke("throw", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, "_invoke", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = "suspendedStart"; return function (method, arg) { if ("executing" === state) throw new Error("Generator is already running"); if ("completed" === state) { if ("throw" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) { if ("suspendedStart" === state) throw state = "completed", context.arg; context.dispatchException(context.arg); } else "return" === context.method && context.abrupt("return", context.arg); state = "executing"; var record = tryCatch(innerFn, self, context); if ("normal" === record.type) { if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, "throw" === methodName && delegate.iterator.return && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method) || "return" !== methodName && (context.method = "throw", context.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = "normal", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: "root" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if ("function" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) { var ctor = "function" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, "toString", function () { return "[object Generator]"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if ("throw" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if ("root" === entry.tryLoc) return handle("end"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error("try statement without catch or finally"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if ("throw" === record.type) throw record.arg; return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, catch: function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if ("throw" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, "next" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }
3
3
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
4
4
  function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
5
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
6
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
7
- function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
8
- function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
9
- function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
10
5
  function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
11
6
  function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
12
7
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
@@ -18,6 +13,7 @@ import throttle from 'lodash.throttle';
18
13
  import { createElement, useCallback, useRef, useState } from 'react';
19
14
  import DemoErrorBoundary from "./DumiDemo/DemoErrorBoundary";
20
15
  import { useRenderer } from "./useRenderer";
16
+ import { getAgnosticComponentModule } from "./utils";
21
17
  var THROTTLE_WAIT = 500;
22
18
  function evalCommonJS(js, _ref) {
23
19
  var module = _ref.module,
@@ -33,40 +29,38 @@ export var useLiveDemo = function useLiveDemo(id, opts) {
33
29
  setLoading = _useState2[1];
34
30
  var loadingTimer = useRef();
35
31
  var taskToken = useRef();
32
+ function resetLoadingStatus() {
33
+ clearTimeout(loadingTimer.current);
34
+ setLoading(false);
35
+ }
36
36
  var _demo$context = demo.context,
37
37
  context = _demo$context === void 0 ? {} : _demo$context,
38
38
  asset = demo.asset,
39
39
  renderOpts = demo.renderOpts;
40
- var _useState3 = useState(),
40
+ var _useState3 = useState(null),
41
41
  _useState4 = _slicedToArray(_useState3, 2),
42
- component = _useState4[0],
43
- setComponent = _useState4[1];
44
- var ref = useRenderer(component ? _objectSpread(_objectSpread({
45
- id: id
46
- }, demo), {}, {
47
- component: component
48
- }) : Object.assign(demo, {
49
- id: id
50
- }));
42
+ error = _useState4[0],
43
+ setError = _useState4[1];
44
+ var _useRenderer = useRenderer({
45
+ id: id,
46
+ renderOpts: demo.renderOpts,
47
+ onResolved: function onResolved() {
48
+ resetLoadingStatus();
49
+ }
50
+ }),
51
+ ref = _useRenderer.canvasRef,
52
+ setComponent = _useRenderer.setComponent;
51
53
  var _useState5 = useState(),
52
54
  _useState6 = _slicedToArray(_useState5, 2),
53
55
  demoNode = _useState6[0],
54
56
  setDemoNode = _useState6[1];
55
- var _useState7 = useState(null),
56
- _useState8 = _slicedToArray(_useState7, 2),
57
- error = _useState8[0],
58
- setError = _useState8[1];
59
57
  var setSource = useCallback(throttle( /*#__PURE__*/function () {
60
58
  var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(source) {
61
59
  var _opts$containerRef;
62
- var resetLoadingStatus, iframeWindow, entryFileName, require, token, entryFileCode, exports, module, renderToStaticMarkupDeferred, _exports, _module, newDemoNode, oError;
60
+ var iframeWindow, entryFileName, require, token, entryFileCode, exports, module, component, renderToStaticMarkupDeferred, _exports, _module, newDemoNode, oError, shouldSkipError;
63
61
  return _regeneratorRuntime().wrap(function _callee$(_context) {
64
62
  while (1) switch (_context.prev = _context.next) {
65
63
  case 0:
66
- resetLoadingStatus = function _resetLoadingStatus() {
67
- clearTimeout(loadingTimer.current);
68
- setLoading(false);
69
- };
70
64
  // set loading status if still compiling after 499ms
71
65
  loadingTimer.current = window.setTimeout(function () {
72
66
  setLoading(true);
@@ -74,11 +68,11 @@ export var useLiveDemo = function useLiveDemo(id, opts) {
74
68
  // make sure timer be fired before next throttle
75
69
  THROTTLE_WAIT - 1);
76
70
  if (!(opts !== null && opts !== void 0 && opts.iframe && opts !== null && opts !== void 0 && (_opts$containerRef = opts.containerRef) !== null && _opts$containerRef !== void 0 && _opts$containerRef.current)) {
77
- _context.next = 8;
71
+ _context.next = 7;
78
72
  break;
79
73
  }
80
74
  iframeWindow = opts.containerRef.current.querySelector('iframe').contentWindow;
81
- _context.next = 6;
75
+ _context.next = 5;
82
76
  return new Promise(function (resolve) {
83
77
  var handler = function handler(ev) {
84
78
  if (ev.data.type.startsWith('dumi.liveDemo.compileDone')) {
@@ -93,10 +87,10 @@ export var useLiveDemo = function useLiveDemo(id, opts) {
93
87
  value: source
94
88
  });
95
89
  });
96
- case 6:
97
- _context.next = 50;
90
+ case 5:
91
+ _context.next = 74;
98
92
  break;
99
- case 8:
93
+ case 7:
100
94
  entryFileName = Object.keys(asset.dependencies).find(function (k) {
101
95
  return asset.dependencies[k].type === 'FILE';
102
96
  });
@@ -107,62 +101,77 @@ export var useLiveDemo = function useLiveDemo(id, opts) {
107
101
  token = taskToken.current = Math.random();
108
102
  entryFileCode = source[entryFileName];
109
103
  if (!(renderOpts !== null && renderOpts !== void 0 && renderOpts.compile)) {
110
- _context.next = 24;
104
+ _context.next = 23;
111
105
  break;
112
106
  }
113
- _context.prev = 13;
114
- _context.next = 16;
107
+ _context.prev = 12;
108
+ _context.next = 15;
115
109
  return renderOpts.compile(entryFileCode, {
116
110
  filename: entryFileName
117
111
  });
118
- case 16:
112
+ case 15:
119
113
  entryFileCode = _context.sent;
120
- _context.next = 24;
114
+ _context.next = 23;
121
115
  break;
122
- case 19:
123
- _context.prev = 19;
124
- _context.t0 = _context["catch"](13);
116
+ case 18:
117
+ _context.prev = 18;
118
+ _context.t0 = _context["catch"](12);
125
119
  setError(_context.t0);
126
120
  resetLoadingStatus();
127
121
  return _context.abrupt("return");
128
- case 24:
122
+ case 23:
129
123
  if (!(renderOpts !== null && renderOpts !== void 0 && renderOpts.renderer && renderOpts !== null && renderOpts !== void 0 && renderOpts.compile)) {
130
- _context.next = 28;
124
+ _context.next = 44;
131
125
  break;
132
126
  }
133
- try {
134
- exports = {};
135
- module = {
136
- exports: exports
137
- };
138
- evalCommonJS(entryFileCode, {
139
- exports: exports,
140
- module: module,
141
- require: require
142
- });
143
- setComponent(exports);
144
- setDemoNode( /*#__PURE__*/createElement('div', {
145
- ref: ref
146
- }));
147
- setError(null);
148
- } catch (err) {
149
- setError(err);
127
+ _context.prev = 24;
128
+ exports = {};
129
+ module = {
130
+ exports: exports
131
+ };
132
+ evalCommonJS(entryFileCode, {
133
+ exports: exports,
134
+ module: module,
135
+ require: require
136
+ });
137
+ _context.next = 30;
138
+ return getAgnosticComponentModule(exports);
139
+ case 30:
140
+ component = _context.sent;
141
+ if (!renderOpts.preflight) {
142
+ _context.next = 34;
143
+ break;
150
144
  }
145
+ _context.next = 34;
146
+ return renderOpts.preflight(component);
147
+ case 34:
148
+ setComponent(component);
149
+ setDemoNode( /*#__PURE__*/createElement('div', {
150
+ ref: ref
151
+ }));
152
+ setError(null);
153
+ _context.next = 43;
154
+ break;
155
+ case 39:
156
+ _context.prev = 39;
157
+ _context.t1 = _context["catch"](24);
158
+ setError(_context.t1);
151
159
  resetLoadingStatus();
160
+ case 43:
152
161
  return _context.abrupt("return");
153
- case 28:
154
- _context.prev = 28;
162
+ case 44:
163
+ _context.prev = 44;
155
164
  // load renderToStaticMarkup in async way
156
165
  renderToStaticMarkupDeferred = import('react-dom/server').then(function (_ref3) {
157
166
  var renderToStaticMarkup = _ref3.renderToStaticMarkup;
158
167
  return renderToStaticMarkup;
159
168
  }); // skip current task if another task is running
160
169
  if (!(token !== taskToken.current)) {
161
- _context.next = 32;
170
+ _context.next = 48;
162
171
  break;
163
172
  }
164
173
  return _context.abrupt("return");
165
- case 32:
174
+ case 48:
166
175
  _exports = {};
167
176
  _module = {
168
177
  exports: _exports
@@ -182,29 +191,42 @@ export var useLiveDemo = function useLiveDemo(id, opts) {
182
191
  };
183
192
 
184
193
  // check component is able to render, to avoid show react overlay error
185
- _context.next = 40;
194
+ _context.prev = 54;
195
+ _context.next = 57;
186
196
  return renderToStaticMarkupDeferred;
187
- case 40:
188
- _context.t1 = _context.sent;
189
- (0, _context.t1)(newDemoNode);
197
+ case 57:
198
+ _context.t2 = _context.sent;
199
+ (0, _context.t2)(newDemoNode);
200
+ _context.next = 66;
201
+ break;
202
+ case 61:
203
+ _context.prev = 61;
204
+ _context.t3 = _context["catch"](54);
205
+ shouldSkipError = _context.t3.message.includes('Unable to find node on an unmounted component') || _context.t3.message.includes('Portals are not currently supported by the server renderer');
206
+ if (shouldSkipError) {
207
+ _context.next = 66;
208
+ break;
209
+ }
210
+ throw _context.t3;
211
+ case 66:
190
212
  console.error = oError;
191
213
 
192
214
  // set new demo node with passing source
193
215
  setDemoNode(newDemoNode);
194
216
  setError(null);
195
- _context.next = 50;
217
+ _context.next = 74;
196
218
  break;
197
- case 47:
198
- _context.prev = 47;
199
- _context.t2 = _context["catch"](28);
200
- setError(_context.t2);
201
- case 50:
219
+ case 71:
220
+ _context.prev = 71;
221
+ _context.t4 = _context["catch"](44);
222
+ setError(_context.t4);
223
+ case 74:
202
224
  resetLoadingStatus();
203
- case 51:
225
+ case 75:
204
226
  case "end":
205
227
  return _context.stop();
206
228
  }
207
- }, _callee, null, [[13, 19], [28, 47]]);
229
+ }, _callee, null, [[12, 18], [24, 39], [44, 71], [54, 61]]);
208
230
  }));
209
231
  return function (_x2) {
210
232
  return _ref2.apply(this, arguments);
@@ -1,5 +1,12 @@
1
1
  /// <reference types="react" />
2
- import type { IDemoData } from './types';
3
- export declare const useRenderer: ({ id, component, renderOpts, }: IDemoData & {
2
+ import type { AgnosticComponentType, IDemoData } from './types';
3
+ export interface UseRendererOptions {
4
4
  id: string;
5
- }) => import("react").RefObject<HTMLDivElement>;
5
+ component?: AgnosticComponentType;
6
+ renderOpts: IDemoData['renderOpts'];
7
+ onResolved?: () => void;
8
+ }
9
+ export declare const useRenderer: ({ id, component, renderOpts, onResolved, }: UseRendererOptions) => {
10
+ canvasRef: import("react").RefObject<HTMLDivElement>;
11
+ setComponent: import("react").Dispatch<import("react").SetStateAction<AgnosticComponentType | null>>;
12
+ };
@@ -2,22 +2,41 @@ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" =
2
2
  function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = "function" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || "@@iterator", asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, ""); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, "_invoke", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: "normal", arg: fn.call(obj, arg) }; } catch (err) { return { type: "throw", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { ["next", "throw", "return"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if ("throw" !== record.type) { var result = record.arg, value = result.value; return value && "object" == _typeof(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke("next", value, resolve, reject); }, function (err) { invoke("throw", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke("throw", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, "_invoke", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = "suspendedStart"; return function (method, arg) { if ("executing" === state) throw new Error("Generator is already running"); if ("completed" === state) { if ("throw" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) { if ("suspendedStart" === state) throw state = "completed", context.arg; context.dispatchException(context.arg); } else "return" === context.method && context.abrupt("return", context.arg); state = "executing"; var record = tryCatch(innerFn, self, context); if ("normal" === record.type) { if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, "throw" === methodName && delegate.iterator.return && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method) || "return" !== methodName && (context.method = "throw", context.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = "normal", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: "root" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if ("function" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) { var ctor = "function" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, "toString", function () { return "[object Generator]"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if ("throw" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if ("root" === entry.tryLoc) return handle("end"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error("try statement without catch or finally"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if ("throw" === record.type) throw record.arg; return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, catch: function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if ("throw" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, "next" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }
3
3
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
4
4
  function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
5
- import { useEffect, useRef } from 'react';
5
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
6
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
7
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
8
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
9
+ function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }
10
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
11
+ import { useEffect, useRef, useState } from 'react';
12
+ import { getAgnosticComponentModule } from "./utils";
13
+
6
14
  // maintain all the mounted instance
7
15
  var map = new Map();
8
16
  export var useRenderer = function useRenderer(_ref) {
9
17
  var id = _ref.id,
10
18
  component = _ref.component,
11
- renderOpts = _ref.renderOpts;
19
+ renderOpts = _ref.renderOpts,
20
+ onResolved = _ref.onResolved;
21
+ var _useState = useState(component ? getAgnosticComponentModule(component) : null),
22
+ _useState2 = _slicedToArray(_useState, 2),
23
+ deferedComponent = _useState2[0],
24
+ setComponent = _useState2[1];
12
25
  var canvasRef = useRef(null);
13
26
  var teardownRef = useRef(function () {});
14
- var prevComponent = useRef(component);
15
-
16
- // forcibly destroyed
17
- if (prevComponent.current !== component) {
18
- var teardown = map.get(id);
19
- teardown === null || teardown === void 0 ? void 0 : teardown();
20
- prevComponent.current = component;
27
+ var prevCanvas = useRef(canvasRef.current);
28
+ var resolving = useRef(false);
29
+ if (prevCanvas.current !== canvasRef.current) {
30
+ if (prevCanvas.current === null) {
31
+ // When first render, component maintained by the parent component userRenderer may be removed.
32
+ // The hosted element should be added back
33
+ var handler = map.get(id);
34
+ if (handler !== null && handler !== void 0 && handler.teardown && handler !== null && handler !== void 0 && handler.hostElement && canvasRef.current) {
35
+ canvasRef.current.appendChild(handler.hostElement);
36
+ teardownRef.current = handler.teardown;
37
+ }
38
+ }
39
+ prevCanvas.current = canvasRef.current;
21
40
  }
22
41
  var renderer = renderOpts === null || renderOpts === void 0 ? void 0 : renderOpts.renderer;
23
42
  useEffect(function () {
@@ -26,63 +45,77 @@ export var useRenderer = function useRenderer(_ref) {
26
45
  }
27
46
  function _resolveRender() {
28
47
  _resolveRender = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
29
- var _module$default;
30
- var module, teardown;
48
+ var legacyHandler, legacyTeardown, comp, hostElement, _legacyHandler$hostEl, teardown;
31
49
  return _regeneratorRuntime().wrap(function _callee$(_context) {
32
50
  while (1) switch (_context.prev = _context.next) {
33
51
  case 0:
34
- if (!(!canvasRef.current || !renderer || !component)) {
52
+ if (!(!canvasRef.current || !renderer || !deferedComponent)) {
35
53
  _context.next = 2;
36
54
  break;
37
55
  }
38
56
  return _context.abrupt("return");
39
57
  case 2:
40
- if (!map.get(id)) {
41
- _context.next = 4;
58
+ legacyHandler = map.get(id);
59
+ if (!resolving.current) {
60
+ _context.next = 5;
42
61
  break;
43
62
  }
44
63
  return _context.abrupt("return");
45
- case 4:
46
- map.set(id, function () {});
47
- if (!(component instanceof Promise)) {
48
- _context.next = 11;
49
- break;
50
- }
51
- _context.next = 8;
52
- return component;
53
- case 8:
54
- _context.t0 = _context.sent;
55
- _context.next = 12;
56
- break;
57
- case 11:
58
- _context.t0 = component;
59
- case 12:
60
- module = _context.t0;
61
- module = (_module$default = module.default) !== null && _module$default !== void 0 ? _module$default : module;
62
- _context.next = 16;
63
- return renderer(canvasRef.current, module);
64
- case 16:
64
+ case 5:
65
+ resolving.current = true;
66
+ legacyTeardown = legacyHandler === null || legacyHandler === void 0 ? void 0 : legacyHandler.teardown;
67
+ _context.next = 9;
68
+ return deferedComponent;
69
+ case 9:
70
+ comp = _context.sent;
71
+ hostElement = document.createElement('div');
72
+ _context.prev = 11;
73
+ canvasRef.current.appendChild(hostElement);
74
+ _context.next = 15;
75
+ return renderer(hostElement, comp);
76
+ case 15:
65
77
  teardown = _context.sent;
78
+ legacyTeardown === null || legacyTeardown === void 0 ? void 0 : legacyTeardown();
79
+ legacyHandler === null || legacyHandler === void 0 ? void 0 : (_legacyHandler$hostEl = legacyHandler.hostElement) === null || _legacyHandler$hostEl === void 0 ? void 0 : _legacyHandler$hostEl.remove();
66
80
  // remove instance when react component is unmounted
67
81
  teardownRef.current = function () {
68
82
  teardown();
83
+ hostElement.remove();
69
84
  map.delete(id);
70
85
  };
71
- map.set(id, teardownRef.current);
72
- case 19:
86
+ map.set(id, {
87
+ teardown: teardownRef.current,
88
+ hostElement: hostElement
89
+ });
90
+ _context.next = 26;
91
+ break;
92
+ case 22:
93
+ _context.prev = 22;
94
+ _context.t0 = _context["catch"](11);
95
+ hostElement.remove();
96
+ throw _context.t0;
97
+ case 26:
98
+ _context.prev = 26;
99
+ resolving.current = false;
100
+ onResolved === null || onResolved === void 0 ? void 0 : onResolved();
101
+ return _context.finish(26);
102
+ case 30:
73
103
  case "end":
74
104
  return _context.stop();
75
105
  }
76
- }, _callee);
106
+ }, _callee, null, [[11, 22, 26, 30]]);
77
107
  }));
78
108
  return _resolveRender.apply(this, arguments);
79
109
  }
80
110
  resolveRender();
81
- }, [canvasRef.current, component, renderer]);
111
+ }, [canvasRef.current, deferedComponent, renderer]);
82
112
  useEffect(function () {
83
113
  return function () {
84
114
  return teardownRef.current();
85
115
  };
86
116
  }, []);
87
- return canvasRef;
117
+ return {
118
+ canvasRef: canvasRef,
119
+ setComponent: setComponent
120
+ };
88
121
  };
@@ -1,6 +1,6 @@
1
1
  import { PluginManager } from 'dumi';
2
- import { useEffect } from 'react';
3
- import type { ILocale, INav, INavItem, IRouteMeta, IRoutesById, IUserNavValue } from './types';
2
+ import { useLayoutEffect } from 'react';
3
+ import type { AgnosticComponentModule, IDemoData, ILocale, INav, INavItem, IRouteMeta, IRoutesById, IUserNavValue } from './types';
4
4
  /**
5
5
  * private instance, do not use it in your code
6
6
  */
@@ -13,7 +13,7 @@ export declare const useLocaleDocRoutes: () => IRoutesById;
13
13
  * @returns code string
14
14
  */
15
15
  export declare const genReactRenderCode: (version: string) => string;
16
- export declare const useIsomorphicLayoutEffect: typeof useEffect;
16
+ export declare const useIsomorphicLayoutEffect: typeof useLayoutEffect;
17
17
  /**
18
18
  * common comparer for sidebar/nav items
19
19
  */
@@ -28,3 +28,4 @@ export declare const useRouteDataComparer: <T extends {
28
28
  */
29
29
  export declare const pickRouteSortMeta: (original: Partial<Pick<INavItem, 'order' | 'title'>>, field: 'nav' | 'nav.second' | 'group', fm: IRouteMeta['frontmatter']) => Partial<Pick<INavItem, "title" | "order">>;
30
30
  export declare function getLocaleNav(nav: IUserNavValue | INav, locale: ILocale): import("./types").IUserNavItems;
31
+ export declare function getAgnosticComponentModule(component: IDemoData['component']): Promise<AgnosticComponentModule>;
@@ -1,3 +1,6 @@
1
+ function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return exports; }; var exports = {}, Op = Object.prototype, hasOwn = Op.hasOwnProperty, defineProperty = Object.defineProperty || function (obj, key, desc) { obj[key] = desc.value; }, $Symbol = "function" == typeof Symbol ? Symbol : {}, iteratorSymbol = $Symbol.iterator || "@@iterator", asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator", toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; function define(obj, key, value) { return Object.defineProperty(obj, key, { value: value, enumerable: !0, configurable: !0, writable: !0 }), obj[key]; } try { define({}, ""); } catch (err) { define = function define(obj, key, value) { return obj[key] = value; }; } function wrap(innerFn, outerFn, self, tryLocsList) { var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, generator = Object.create(protoGenerator.prototype), context = new Context(tryLocsList || []); return defineProperty(generator, "_invoke", { value: makeInvokeMethod(innerFn, self, context) }), generator; } function tryCatch(fn, obj, arg) { try { return { type: "normal", arg: fn.call(obj, arg) }; } catch (err) { return { type: "throw", arg: err }; } } exports.wrap = wrap; var ContinueSentinel = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var IteratorPrototype = {}; define(IteratorPrototype, iteratorSymbol, function () { return this; }); var getProto = Object.getPrototypeOf, NativeIteratorPrototype = getProto && getProto(getProto(values([]))); NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); function defineIteratorMethods(prototype) { ["next", "throw", "return"].forEach(function (method) { define(prototype, method, function (arg) { return this._invoke(method, arg); }); }); } function AsyncIterator(generator, PromiseImpl) { function invoke(method, arg, resolve, reject) { var record = tryCatch(generator[method], generator, arg); if ("throw" !== record.type) { var result = record.arg, value = result.value; return value && "object" == _typeof(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) { invoke("next", value, resolve, reject); }, function (err) { invoke("throw", err, resolve, reject); }) : PromiseImpl.resolve(value).then(function (unwrapped) { result.value = unwrapped, resolve(result); }, function (error) { return invoke("throw", error, resolve, reject); }); } reject(record.arg); } var previousPromise; defineProperty(this, "_invoke", { value: function value(method, arg) { function callInvokeWithMethodAndArg() { return new PromiseImpl(function (resolve, reject) { invoke(method, arg, resolve, reject); }); } return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(innerFn, self, context) { var state = "suspendedStart"; return function (method, arg) { if ("executing" === state) throw new Error("Generator is already running"); if ("completed" === state) { if ("throw" === method) throw arg; return doneResult(); } for (context.method = method, context.arg = arg;;) { var delegate = context.delegate; if (delegate) { var delegateResult = maybeInvokeDelegate(delegate, context); if (delegateResult) { if (delegateResult === ContinueSentinel) continue; return delegateResult; } } if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) { if ("suspendedStart" === state) throw state = "completed", context.arg; context.dispatchException(context.arg); } else "return" === context.method && context.abrupt("return", context.arg); state = "executing"; var record = tryCatch(innerFn, self, context); if ("normal" === record.type) { if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue; return { value: record.arg, done: context.done }; } "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg); } }; } function maybeInvokeDelegate(delegate, context) { var methodName = context.method, method = delegate.iterator[methodName]; if (undefined === method) return context.delegate = null, "throw" === methodName && delegate.iterator.return && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method) || "return" !== methodName && (context.method = "throw", context.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel; var record = tryCatch(method, delegate.iterator, context.arg); if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel; var info = record.arg; return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel); } function pushTryEntry(locs) { var entry = { tryLoc: locs[0] }; 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); } function resetTryEntry(entry) { var record = entry.completion || {}; record.type = "normal", delete record.arg, entry.completion = record; } function Context(tryLocsList) { this.tryEntries = [{ tryLoc: "root" }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); } function values(iterable) { if (iterable) { var iteratorMethod = iterable[iteratorSymbol]; if (iteratorMethod) return iteratorMethod.call(iterable); if ("function" == typeof iterable.next) return iterable; if (!isNaN(iterable.length)) { var i = -1, next = function next() { for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; return next.value = undefined, next.done = !0, next; }; return next.next = next; } } return { next: doneResult }; } function doneResult() { return { value: undefined, done: !0 }; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), defineProperty(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) { var ctor = "function" == typeof genFun && genFun.constructor; return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name)); }, exports.mark = function (genFun) { return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun; }, exports.awrap = function (arg) { return { __await: arg }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { return this; }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { void 0 === PromiseImpl && (PromiseImpl = Promise); var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { return result.done ? result.value : iter.next(); }); }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () { return this; }), define(Gp, "toString", function () { return "[object Generator]"; }), exports.keys = function (val) { var object = Object(val), keys = []; for (var key in object) keys.push(key); return keys.reverse(), function next() { for (; keys.length;) { var key = keys.pop(); if (key in object) return next.value = key, next.done = !1, next; } return next.done = !0, next; }; }, exports.values = values, Context.prototype = { constructor: Context, reset: function reset(skipTempReset) { if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); }, stop: function stop() { this.done = !0; var rootRecord = this.tryEntries[0].completion; if ("throw" === rootRecord.type) throw rootRecord.arg; return this.rval; }, dispatchException: function dispatchException(exception) { if (this.done) throw exception; var context = this; function handle(loc, caught) { return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught; } for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i], record = entry.completion; if ("root" === entry.tryLoc) return handle("end"); if (entry.tryLoc <= this.prev) { var hasCatch = hasOwn.call(entry, "catchLoc"), hasFinally = hasOwn.call(entry, "finallyLoc"); if (hasCatch && hasFinally) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } else if (hasCatch) { if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); } else { if (!hasFinally) throw new Error("try statement without catch or finally"); if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); } } } }, abrupt: function abrupt(type, arg) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { var finallyEntry = entry; break; } } finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); var record = finallyEntry ? finallyEntry.completion : {}; return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); }, complete: function complete(record, afterLoc) { if ("throw" === record.type) throw record.arg; return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; }, finish: function finish(finallyLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; } }, catch: function _catch(tryLoc) { for (var i = this.tryEntries.length - 1; i >= 0; --i) { var entry = this.tryEntries[i]; if (entry.tryLoc === tryLoc) { var record = entry.completion; if ("throw" === record.type) { var thrown = record.arg; resetTryEntry(entry); } return thrown; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(iterable, resultName, nextLoc) { return this.delegate = { iterator: values(iterable), resultName: resultName, nextLoc: nextLoc }, "next" === this.method && (this.arg = undefined), ContinueSentinel; } }, exports; }
2
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
3
+ function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
1
4
  function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
2
5
  function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
3
6
  function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
@@ -96,4 +99,37 @@ export var pickRouteSortMeta = function pickRouteSortMeta(original, field, fm) {
96
99
  };
97
100
  export function getLocaleNav(nav, locale) {
98
101
  return Array.isArray(nav) ? nav : nav[locale.id];
102
+ }
103
+ export function getAgnosticComponentModule(_x2) {
104
+ return _getAgnosticComponentModule.apply(this, arguments);
105
+ }
106
+ function _getAgnosticComponentModule() {
107
+ _getAgnosticComponentModule = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(component) {
108
+ var _mod$default;
109
+ var mod;
110
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
111
+ while (1) switch (_context.prev = _context.next) {
112
+ case 0:
113
+ if (!(component instanceof Promise)) {
114
+ _context.next = 6;
115
+ break;
116
+ }
117
+ _context.next = 3;
118
+ return component;
119
+ case 3:
120
+ _context.t0 = _context.sent;
121
+ _context.next = 7;
122
+ break;
123
+ case 6:
124
+ _context.t0 = component;
125
+ case 7:
126
+ mod = _context.t0;
127
+ return _context.abrupt("return", (_mod$default = mod.default) !== null && _mod$default !== void 0 ? _mod$default : mod);
128
+ case 9:
129
+ case "end":
130
+ return _context.stop();
131
+ }
132
+ }, _callee);
133
+ }));
134
+ return _getAgnosticComponentModule.apply(this, arguments);
99
135
  }
@@ -86,6 +86,9 @@ var compile_default = (api) => {
86
86
  api.chainWebpack(async (memo) => {
87
87
  const babelInUmi = memo.module.rule("src").use("babel-loader").entries();
88
88
  const loaderPath = require.resolve("../../loaders/markdown");
89
+ memo.resolve.merge({
90
+ conditionNames: ["require", "node", "import"]
91
+ });
89
92
  const loaderBaseOpts = {
90
93
  techStacks,
91
94
  cwd: api.cwd,
@@ -35,13 +35,16 @@ module.exports = __toCommonJS(markdown_exports);
35
35
  var import_tabs = require("../../features/tabs");
36
36
  var import_utils = require("../../utils");
37
37
  var import_fs = __toESM(require("fs"));
38
+ var import_path = __toESM(require("path"));
38
39
  var import_plugin_utils = require("umi/plugin-utils");
39
40
  var import_transformer = __toESM(require("./transformer"));
40
41
  var import_rehypeText = require("./transformer/rehypeText");
41
42
  function getDemoSourceFiles(demos = []) {
42
43
  return demos.reduce((ret, demo) => {
43
44
  if ("resolveMap" in demo) {
44
- ret.push(...Object.values(demo.resolveMap));
45
+ ret.push(
46
+ ...Object.values(demo.resolveMap).filter((p) => import_path.default.isAbsolute(p))
47
+ );
45
48
  }
46
49
  return ret;
47
50
  }, []);
@@ -114,11 +117,11 @@ export const demos = {
114
117
  return "undefined";
115
118
  const entryFileName = Object.keys(this.asset.dependencies)[0];
116
119
  const context = Object.entries(this.resolveMap).reduce(
117
- (acc, [key, path]) => ({
120
+ (acc, [key, path2]) => ({
118
121
  ...acc,
119
122
  // omit entry file
120
123
  ...key !== entryFileName ? {
121
- [key]: `{{{require('${path}')}}}`
124
+ [key]: `{{{require('${path2}')}}}`
122
125
  } : {}
123
126
  }),
124
127
  {}
@@ -145,6 +148,12 @@ export const demos = {
145
148
  renderOpts.rendererPath
146
149
  )}')).default,`);
147
150
  }
151
+ if (renderOpts.preflightPath) {
152
+ propertyArray.push(`
153
+ preflight: (await import('${(0, import_plugin_utils.winPath)(
154
+ renderOpts.preflightPath
155
+ )}')).default,`);
156
+ }
148
157
  if (propertyArray.length === 0)
149
158
  return "undefined";
150
159
  return `{
@@ -26,6 +26,7 @@ declare module 'vfile' {
26
26
  renderOpts: {
27
27
  type?: string;
28
28
  rendererPath?: string;
29
+ preflightPath?: string;
29
30
  compilePath?: string;
30
31
  };
31
32
  } | {
@@ -34,6 +35,7 @@ declare module 'vfile' {
34
35
  renderOpts: {
35
36
  type?: string;
36
37
  rendererPath?: string;
38
+ preflightPath?: string;
37
39
  compilePath?: string;
38
40
  };
39
41
  })[];
@@ -294,7 +294,8 @@ function rehypeDemo(opts) {
294
294
  id: asset.id,
295
295
  component,
296
296
  renderOpts: {
297
- rendererPath: runtimeOpts == null ? void 0 : runtimeOpts.rendererPath
297
+ rendererPath: runtimeOpts == null ? void 0 : runtimeOpts.rendererPath,
298
+ preflightPath: runtimeOpts == null ? void 0 : runtimeOpts.preflightPath
298
299
  }
299
300
  };
300
301
  }
@@ -332,7 +333,8 @@ function rehypeDemo(opts) {
332
333
  ) : resolveMap,
333
334
  renderOpts: {
334
335
  rendererPath: runtimeOpts == null ? void 0 : runtimeOpts.rendererPath,
335
- compilePath: runtimeOpts == null ? void 0 : runtimeOpts.compilePath
336
+ compilePath: runtimeOpts == null ? void 0 : runtimeOpts.compilePath,
337
+ preflightPath: runtimeOpts == null ? void 0 : runtimeOpts.preflightPath
336
338
  }
337
339
  };
338
340
  }
package/dist/types.d.ts CHANGED
@@ -58,6 +58,11 @@ export type IDumiTechStackOnBlockLoadArgs = OnLoadArgs & {
58
58
  filename: string;
59
59
  };
60
60
  export interface IDumiTechStackRuntimeOpts {
61
+ /**
62
+ * Component detection function path,
63
+ * used to detect errors that occur from application creation to component mounting.
64
+ */
65
+ preflightPath?: string;
61
66
  /**
62
67
  * path of the cancelable{@link IDemoCancelableFn} function
63
68
  * that manipulate(mount/unmount) third-party framework component
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dumi",
3
- "version": "2.3.0-rc.0",
3
+ "version": "2.3.0",
4
4
  "description": "📖 Documentation Generator of React Component",
5
5
  "keywords": [
6
6
  "generator",
@@ -163,7 +163,7 @@
163
163
  "typescript": "~5.0.4",
164
164
  "vitest": "^0.33.0",
165
165
  "zx": "^7.2.3",
166
- "dumi-theme-mobile": "2.3.0-rc.0"
166
+ "dumi-theme-mobile": "2.3.0"
167
167
  },
168
168
  "peerDependencies": {
169
169
  "react": ">=16.8",
@@ -64,9 +64,11 @@ var ContentFooter = function ContentFooter() {
64
64
  }, [showLastUpdated]);
65
65
  return /*#__PURE__*/React.createElement("footer", {
66
66
  className: "dumi-default-content-footer"
67
- }, /*#__PURE__*/React.createElement("dl", null, showLastUpdated && /*#__PURE__*/React.createElement("dd", null, /*#__PURE__*/React.createElement(IconClock, null), /*#__PURE__*/React.createElement(FormattedMessage, {
67
+ }, /*#__PURE__*/React.createElement("dl", null, showLastUpdated && /*#__PURE__*/React.createElement("dd", null, /*#__PURE__*/React.createElement(IconClock, null), /*#__PURE__*/React.createElement("span", {
68
+ className: "dumi-default-mobile-hidden"
69
+ }, /*#__PURE__*/React.createElement(FormattedMessage, {
68
70
  id: "content.footer.last.updated"
69
- }), /*#__PURE__*/React.createElement("time", {
71
+ })), /*#__PURE__*/React.createElement("time", {
70
72
  dateTime: isoLastUpdated
71
73
  }, lastUpdated)), showEditLink && /*#__PURE__*/React.createElement("dd", null, /*#__PURE__*/React.createElement("a", {
72
74
  target: "_blank",
@@ -33,6 +33,11 @@
33
33
 
34
34
  dd {
35
35
  margin: 0;
36
+ @media @mobile {
37
+ .dumi-default-mobile-hidden {
38
+ display: none;
39
+ }
40
+ }
36
41
 
37
42
  svg {
38
43
  margin-inline-end: 4px;