dumi 2.3.0-beta.8 → 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.
Files changed (42) hide show
  1. package/compiled/crates/swc_plugin_react_demo.wasm +0 -0
  2. package/dist/assetParsers/block.d.ts +1 -0
  3. package/dist/assetParsers/block.js +7 -3
  4. package/dist/client/pages/Demo/index.js +12 -6
  5. package/dist/client/theme-api/DumiDemo/index.js +6 -3
  6. package/dist/client/theme-api/types.d.ts +14 -0
  7. package/dist/client/theme-api/useLiveDemo.js +94 -72
  8. package/dist/client/theme-api/useRenderer.d.ts +10 -3
  9. package/dist/client/theme-api/useRenderer.js +72 -39
  10. package/dist/client/theme-api/utils.d.ts +4 -3
  11. package/dist/client/theme-api/utils.js +36 -0
  12. package/dist/features/compile/index.js +3 -0
  13. package/dist/features/locales.js +4 -0
  14. package/dist/features/theme/index.js +22 -6
  15. package/dist/loaders/markdown/index.js +12 -3
  16. package/dist/loaders/markdown/transformer/index.d.ts +4 -1
  17. package/dist/loaders/markdown/transformer/rehypeDemo.d.ts +1 -0
  18. package/dist/loaders/markdown/transformer/rehypeDemo.js +29 -10
  19. package/dist/loaders/markdown/transformer/rehypeEnhancedTag.js +12 -2
  20. package/dist/loaders/markdown/transformer/remarkContainer.js +37 -6
  21. package/dist/techStacks/utils.d.ts +22 -0
  22. package/dist/techStacks/utils.js +5 -0
  23. package/dist/types.d.ts +8 -1
  24. package/package.json +28 -25
  25. package/tech-stack-utils.d.ts +4 -2
  26. package/theme-default/builtins/API/index.d.ts +2 -1
  27. package/theme-default/builtins/API/index.js +173 -43
  28. package/theme-default/builtins/API/index.less +47 -0
  29. package/theme-default/builtins/CodeGroup/index.d.ts +3 -0
  30. package/theme-default/builtins/CodeGroup/index.js +29 -0
  31. package/theme-default/builtins/Previewer/index.js +1 -1
  32. package/theme-default/builtins/SourceCode/index.d.ts +3 -2
  33. package/theme-default/locales/en-US.json +4 -0
  34. package/theme-default/locales/zh-CN.json +4 -0
  35. package/theme-default/slots/ContentFooter/index.js +4 -2
  36. package/theme-default/slots/ContentFooter/index.less +5 -0
  37. package/theme-default/slots/PreviewerActions/index.d.ts +6 -1
  38. package/theme-default/slots/PreviewerActions/index.js +30 -13
  39. package/theme-default/slots/PreviewerActions/index.less +30 -140
  40. package/theme-default/slots/Tabs/index.d.ts +6 -0
  41. package/theme-default/slots/Tabs/index.js +11 -0
  42. package/theme-default/slots/Tabs/index.less +151 -0
File without changes
@@ -15,6 +15,7 @@ export interface IParsedBlockAsset {
15
15
  }
16
16
  declare function parseBlockAsset(opts: {
17
17
  fileAbsPath: string;
18
+ fileLocale?: string;
18
19
  id: string;
19
20
  refAtomIds: string[];
20
21
  entryPointCode?: string;
@@ -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
  }
@@ -136,15 +136,19 @@ async function parseBlockAsset(opts) {
136
136
  asset.entry = filename;
137
137
  if (frontmatter) {
138
138
  file.value = code;
139
- result.frontmatter = frontmatter;
139
+ asset.dependencies[filename].value = code;
140
140
  ["description", "title", "snapshot", "keywords"].forEach(
141
141
  (key) => {
142
142
  asset[key] = frontmatter == null ? void 0 : frontmatter[key];
143
143
  }
144
144
  );
145
+ ["description", "title"].forEach((key) => {
146
+ frontmatter[key] || (frontmatter[key] = frontmatter[`${key}.${opts.fileLocale}`]);
147
+ });
148
+ result.frontmatter = frontmatter;
145
149
  }
146
150
  }
147
- if (!isEntryPoint || !opts.entryPointCode) {
151
+ if (opts.techStack.runtimeOpts && (!isEntryPoint || !opts.entryPointCode)) {
148
152
  result.resolveMap[filename] = args.path;
149
153
  }
150
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;
@@ -49,6 +49,10 @@ export interface IPreviewerProps {
49
49
  * react node of current demo
50
50
  */
51
51
  children: ReactNode;
52
+ /**
53
+ * private field, do not use it in your code
54
+ */
55
+ _live_in_iframe: boolean;
52
56
  [key: string]: any;
53
57
  }
54
58
  export interface IRouteMeta {
@@ -208,6 +212,7 @@ export interface IThemeConfig {
208
212
  [key in SocialTypes]?: string;
209
213
  };
210
214
  editLink?: boolean | string;
215
+ sourceLink?: boolean | string;
211
216
  lastUpdated?: boolean;
212
217
  [key: string]: any;
213
218
  }
@@ -228,6 +233,7 @@ export type IDemoCompileFn = (code: string, opts: {
228
233
  filename: string;
229
234
  }) => Promise<string>;
230
235
  export type IDemoCancelableFn = (canvas: HTMLElement, component: AgnosticComponentModule) => (() => void) | Promise<() => void>;
236
+ export type IDemoPreflightFn = (component: AgnosticComponentModule) => Promise<void>;
231
237
  export type IDemoData = {
232
238
  component: ReactComponentType | AgnosticComponentType;
233
239
  asset: IPreviewerProps['asset'];
@@ -238,7 +244,15 @@ export type IDemoData = {
238
244
  * provide a runtime compile function for compile demo code for live preview
239
245
  */
240
246
  compile?: IDemoCompileFn;
247
+ /**
248
+ * Component rendering function, used to manage the creation and unmount of components
249
+ */
241
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;
242
256
  };
243
257
  };
244
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
+ };