dumi 2.0.0-rc.0 → 2.0.0-rc.1

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.
@@ -16,5 +16,5 @@ export var DumiDemo = function DumiDemo(props) {
16
16
  asset: asset,
17
17
  demoUrl: // allow user override demoUrl by frontmatter
18
18
  props.previewerProps.demoUrl || "/".concat(SP_ROUTE_PREFIX, "demos/").concat(props.demo.id)
19
- }, props.previewerProps), /*#__PURE__*/createElement(component));
19
+ }, props.previewerProps), props.previewerProps.iframe ? null : /*#__PURE__*/createElement(component));
20
20
  };
@@ -14,6 +14,7 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
14
14
 
15
15
  import { useFullSidebarData, useSiteData } from 'dumi';
16
16
  import { useState } from 'react';
17
+ import { useSidebarDataCompare } from "./useSidebarData";
17
18
  import { useLocaleDocRoutes } from "./utils";
18
19
  /**
19
20
  * hook for get nav data
@@ -26,6 +27,7 @@ export var useNavData = function useNavData() {
26
27
  themeConfig = _useSiteData.themeConfig;
27
28
 
28
29
  var sidebar = useFullSidebarData();
30
+ var sidebarDataCompare = useSidebarDataCompare();
29
31
 
30
32
  var _useState = useState(function () {
31
33
  // use user config first
@@ -65,11 +67,7 @@ export var useNavData = function useNavData() {
65
67
  };
66
68
  }); // TODO: 2-level nav data
67
69
 
68
- return data.sort(function (a, b) {
69
- var _a$title;
70
-
71
- return a.order - b.order || ((_a$title = a.title) === null || _a$title === void 0 ? void 0 : _a$title.localeCompare(b.title));
72
- });
70
+ return data.sort(sidebarDataCompare);
73
71
  }),
74
72
  _useState2 = _slicedToArray(_useState, 1),
75
73
  nav = _useState2[0];
@@ -11,11 +11,12 @@ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Sy
11
11
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
12
12
 
13
13
  import { matchRoutes, useAppData, useLocation, useRouteData } from 'dumi';
14
- import { useCallback, useLayoutEffect, useState } from 'react';
15
-
14
+ import { useCallback, useState } from 'react';
15
+ import { useIsomorphicLayoutEffect } from "./utils";
16
16
  /**
17
17
  * hook for get matched route meta
18
18
  */
19
+
19
20
  export var useRouteMeta = function useRouteMeta() {
20
21
  var _useRouteData = useRouteData(),
21
22
  route = _useRouteData.route;
@@ -52,7 +53,7 @@ export var useRouteMeta = function useRouteMeta() {
52
53
  meta = _useState2[0],
53
54
  setMeta = _useState2[1];
54
55
 
55
- useLayoutEffect(function () {
56
+ useIsomorphicLayoutEffect(function () {
56
57
  setMeta(getter);
57
58
  }, [clientRoutes.length, pathname]);
58
59
  return meta;
@@ -1,4 +1,5 @@
1
1
  import type { ISidebarGroup } from './types';
2
+ export declare const useSidebarDataCompare: () => (a: ISidebarGroup | ISidebarGroup['children'][0], b: ISidebarGroup | ISidebarGroup['children'][0]) => number;
2
3
  /**
3
4
  * hook for get sidebar data for all nav
4
5
  */
@@ -21,18 +21,28 @@ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Sy
21
21
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
22
22
 
23
23
  import { useLocale, useLocation, useSiteData } from 'dumi';
24
- import { useState } from 'react';
24
+ import { useCallback, useState } from 'react';
25
25
  import { useLocaleDocRoutes } from "./utils";
26
26
  var DEFAULT_GROUP_STUB_TITLE = '$default-group-title';
27
27
 
28
28
  var getLocaleClearPath = function getLocaleClearPath(routePath, locale) {
29
29
  return 'base' in locale ? routePath.replace(locale.base.slice(1), '').replace(/^\//, '') : routePath;
30
30
  };
31
+
32
+ export var useSidebarDataCompare = function useSidebarDataCompare() {
33
+ var locale = useLocale();
34
+ return useCallback(function (a, b) {
35
+ return (// small before large
36
+ a.order - b.order || ( // shallower before deeper for sidebar item
37
+ a.link ? a.link.split('/').length - b.link.split('/').length : 0) || ( // fallback to compare title (put non-title group at the end)
38
+ a.title ? a.title.localeCompare(b.title || '', locale.id) : -1)
39
+ );
40
+ }, []);
41
+ };
31
42
  /**
32
43
  * hook for get sidebar data for all nav
33
44
  */
34
45
 
35
-
36
46
  export var useFullSidebarData = function useFullSidebarData() {
37
47
  var locale = useLocale();
38
48
  var routes = useLocaleDocRoutes();
@@ -40,6 +50,8 @@ export var useFullSidebarData = function useFullSidebarData() {
40
50
  var _useSiteData = useSiteData(),
41
51
  themeConfig = _useSiteData.themeConfig;
42
52
 
53
+ var sidebarDataCompare = useSidebarDataCompare();
54
+
43
55
  var _useState = useState(function () {
44
56
  // auto generate sidebar data from routes
45
57
  var data = Object.values(routes).reduce(function (ret, route) {
@@ -85,20 +97,10 @@ export var useFullSidebarData = function useFullSidebarData() {
85
97
  navPath = _ref3[0],
86
98
  groups = _ref3[1];
87
99
 
88
- ret[navPath] = Object.values(groups).sort(function (a, b) {
89
- var _a$title;
90
-
91
- return (// sort by group order
92
- a.order - b.order || (a.title ? // sort by group title
93
- (_a$title = a.title) === null || _a$title === void 0 ? void 0 : _a$title.localeCompare(b.title || '') : // put non-title group at the end
94
- 1)
95
- );
96
- }); // sort group children by order or title
100
+ ret[navPath] = Object.values(groups).sort(sidebarDataCompare); // sort group children by order or title
97
101
 
98
102
  ret[navPath].forEach(function (group) {
99
- return group.children.sort(function (a, b) {
100
- return a.order - b.order || a.title.localeCompare(b.title);
101
- });
103
+ return group.children.sort(sidebarDataCompare);
102
104
  });
103
105
  return ret;
104
106
  }, {}); // allow user partial override
@@ -1,3 +1,4 @@
1
+ import { useEffect } from 'react';
1
2
  import type { IRoutesById } from './types';
2
3
  export declare const useLocaleDocRoutes: () => IRoutesById;
3
4
  /**
@@ -6,3 +7,4 @@ export declare const useLocaleDocRoutes: () => IRoutesById;
6
7
  * @returns code string
7
8
  */
8
9
  export declare const genReactRenderCode: (version: string) => string;
10
+ export declare const useIsomorphicLayoutEffect: typeof useEffect;
@@ -11,7 +11,7 @@ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Sy
11
11
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
12
12
 
13
13
  import { useAppData, useIntl, useSiteData } from 'dumi';
14
- import { useState } from 'react';
14
+ import { useEffect, useLayoutEffect, useState } from 'react';
15
15
  export var useLocaleDocRoutes = function useLocaleDocRoutes() {
16
16
  var intl = useIntl();
17
17
 
@@ -55,5 +55,6 @@ export var genReactRenderCode = function genReactRenderCode(version) {
55
55
  return "".concat(annotation, "\n\nimport React from 'react';\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\n\nconst rootElement = document.getElementById(\"root\");\nconst root = createRoot(rootElement);\n\nroot.render(<App />);");
56
56
  }
57
57
 
58
- return "".concat(annotation, "\n \nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './App';\n \nReactDOM.render(\n <App />,\n document.getElementById('root'),\n);");
59
- };
58
+ return "".concat(annotation, "\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './App';\n\nReactDOM.render(\n <App />,\n document.getElementById('root'),\n);");
59
+ };
60
+ export var useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;
@@ -67,7 +67,7 @@ var compile_default = (api) => {
67
67
  memo.module.rule("dumi-page").type("javascript/auto").test(/\.(j|t)sx?$/).resourceQuery(/meta$/).use("page-meta-loader").loader(require.resolve("../loaders/page"));
68
68
  memo.module.rule("dumi-demo").type("javascript/auto").test(/\..+$/).enforce("pre").resourceQuery(/techStack/).use("demo-loader").loader(require.resolve("../loaders/demo")).options({ techStacks, cwd: api.cwd });
69
69
  memo.module.rule("dumi-raw").resourceQuery(/raw/).use("raw-loader").loader(require.resolve("raw-loader"));
70
- if (api.env === "development") {
70
+ if (api.env === "development" && memo.plugins.has("fastRefresh")) {
71
71
  memo.plugin("fastRefresh").tap(([params]) => [
72
72
  {
73
73
  ...params,
@@ -77,6 +77,7 @@ export const messages = ${JSON.stringify(api.service.themeData.locales, null, 2)
77
77
  import { history } from 'dumi';
78
78
  import React, { useState, useLayoutEffect, useCallback, type ReactNode } from 'react';
79
79
  import { RawIntlProvider, createIntl, createIntlCache } from '${(0, import_plugin_utils.winPath)(import_path.default.dirname(require.resolve("react-intl/package")))}';
80
+ import { useIsomorphicLayoutEffect } from '${(0, import_plugin_utils.winPath)(require.resolve("../client/theme-api/utils"))}'
80
81
  import { locales, messages } from './config';
81
82
 
82
83
  const cache = createIntlCache();
@@ -96,7 +97,7 @@ const LocalesContainer: FC<{ children: ReactNode }> = (props) => {
96
97
  }, []);
97
98
  const [intl, setIntl] = useState(() => getIntl());
98
99
 
99
- useLayoutEffect(() => {
100
+ useIsomorphicLayoutEffect(() => {
100
101
  return history.listen(() => {
101
102
  setIntl(getIntl());
102
103
  });
@@ -27,6 +27,7 @@ __export(transformer_exports, {
27
27
  module.exports = __toCommonJS(transformer_exports);
28
28
  var import_enhanced_resolve = __toESM(require("enhanced-resolve"));
29
29
  var import_rehypeDemo = __toESM(require("./rehypeDemo"));
30
+ var import_rehypeDesc = __toESM(require("./rehypeDesc"));
30
31
  var import_rehypeEnhancedTag = __toESM(require("./rehypeEnhancedTag"));
31
32
  var import_rehypeImg = __toESM(require("./rehypeImg"));
32
33
  var import_rehypeIsolation = __toESM(require("./rehypeIsolation"));
@@ -73,7 +74,7 @@ var transformer_default = async (raw, opts) => {
73
74
  fileAbsPath: opts.fileAbsPath,
74
75
  resolve: opts.resolve,
75
76
  resolver
76
- }).use(import_rehypeSlug.default).use(rehypeAutolinkHeadings).use(import_rehypeIsolation.default).use(import_rehypeEnhancedTag.default).use(import_rehypeText.default);
77
+ }).use(import_rehypeSlug.default).use(rehypeAutolinkHeadings).use(import_rehypeIsolation.default).use(import_rehypeEnhancedTag.default).use(import_rehypeDesc.default).use(import_rehypeText.default);
77
78
  (_b = opts.extraRehypePlugins) == null ? void 0 : _b.forEach((plugin) => applyUnifiedPlugin({
78
79
  plugin,
79
80
  processor,
@@ -0,0 +1,6 @@
1
+ import type { Root } from 'hast';
2
+ import type { Transformer } from 'unified';
3
+ /**
4
+ * rehype plugin for extract fallback description from markdown content
5
+ */
6
+ export default function rehypeDesc(): Transformer<Root>;
@@ -0,0 +1,51 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod));
20
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
+
22
+ // src/loaders/markdown/transformer/rehypeDesc.ts
23
+ var rehypeDesc_exports = {};
24
+ __export(rehypeDesc_exports, {
25
+ default: () => rehypeDesc
26
+ });
27
+ module.exports = __toCommonJS(rehypeDesc_exports);
28
+ var visit;
29
+ var EXIT;
30
+ var toString;
31
+ (async () => {
32
+ ({ visit, EXIT } = await import("unist-util-visit"));
33
+ ({ toString } = await import("hast-util-to-string"));
34
+ })();
35
+ function rehypeDesc() {
36
+ return async (tree, vFile) => {
37
+ if (!vFile.data.frontmatter.description) {
38
+ visit(tree, "element", (node) => {
39
+ if (node.tagName === "p") {
40
+ const text = toString(node).trim();
41
+ if (text) {
42
+ vFile.data.frontmatter.description = text;
43
+ return EXIT;
44
+ }
45
+ }
46
+ });
47
+ }
48
+ };
49
+ }
50
+ // Annotate the CommonJS export names for ESM import in node:
51
+ 0 && (module.exports = {});
@@ -68,7 +68,7 @@ function remarkEmbed(opts) {
68
68
  } else if (hash.startsWith("RE-")) {
69
69
  content = (0, import_utils.getFileContentByRegExp)(content, hash.slice(3), absPath);
70
70
  }
71
- const mdast = unified().use(remarkParse).use(remarkFrontmatter).use(remarkRawAST).processSync(content).result;
71
+ const mdast = unified().use(remarkParse).use(remarkEmbed, { ...opts, fileAbsPath: absPath }).use(remarkFrontmatter).use(remarkRawAST).processSync(content).result;
72
72
  if (!node.value.endsWith(EMBED_CLOSE_TAG)) {
73
73
  for (let j = i; j < parent.children.length; j++) {
74
74
  const sibling = parent.children[j];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dumi",
3
- "version": "2.0.0-rc.0",
3
+ "version": "2.0.0-rc.1",
4
4
  "description": "Framework for developing UI components",
5
5
  "keywords": [],
6
6
  "license": "MIT",
@@ -21,10 +21,11 @@
21
21
  "dev": "father dev",
22
22
  "docs:build": "node ./bin/dumi.js build",
23
23
  "docs:dev": "node ./bin/dumi.js dev",
24
+ "docs:sync": "node ./scripts/sync-from-umi.js",
24
25
  "lint": "npm run lint:es && npm run lint:css",
25
26
  "lint:css": "stylelint \"{src,test}/**/*.{css,less}\"",
26
27
  "lint:es": "eslint \"{src,test}/**/*.{js,jsx,ts,tsx}\"",
27
- "prepare": "npm run build && node ./bin/dumi.js setup",
28
+ "prepare": "npm run build && node ./bin/dumi.js setup && npm run docs:sync",
28
29
  "prepublishOnly": "npm run build",
29
30
  "test": "vitest"
30
31
  },
@@ -24,7 +24,8 @@ var Hero = function Hero() {
24
24
  return /^(\w+:)\/\/|^(mailto|tel):/.test(link) ? /*#__PURE__*/React.createElement("a", {
25
25
  href: link,
26
26
  target: "_blank",
27
- rel: "noreferrer"
27
+ rel: "noreferrer",
28
+ key: text
28
29
  }, text) : /*#__PURE__*/React.createElement(Link, {
29
30
  key: text,
30
31
  to: link
@@ -1,3 +1,5 @@
1
+ var _navigator;
2
+
1
3
  function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
2
4
 
3
5
  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."); }
@@ -15,7 +17,7 @@ import { useIntl, useSiteSearch } from 'dumi';
15
17
  import React, { useEffect, useRef, useState } from 'react';
16
18
  import { SearchResult } from "../SearchResult";
17
19
  import "./index.less";
18
- var isAppleDevice = /(mac|iphone|ipod|ipad)/i.test(navigator.platform);
20
+ var isAppleDevice = /(mac|iphone|ipod|ipad)/i.test(typeof navigator !== 'undefined' ? (_navigator = navigator) === null || _navigator === void 0 ? void 0 : _navigator.platform : '');
19
21
 
20
22
  var SearchBar = function SearchBar() {
21
23
  var intl = useIntl();
@@ -27,7 +29,11 @@ var SearchBar = function SearchBar() {
27
29
  setFocusing = _useState2[1];
28
30
 
29
31
  var input = useRef(null);
30
- var symbol = isAppleDevice ? '⌘' : 'Ctrl';
32
+
33
+ var _useState3 = useState('⌘'),
34
+ _useState4 = _slicedToArray(_useState3, 2),
35
+ symbol = _useState4[0],
36
+ setSymbol = _useState4[1];
31
37
 
32
38
  var _useSiteSearch = useSiteSearch(),
33
39
  keywords = _useSiteSearch.keywords,
@@ -36,6 +42,12 @@ var SearchBar = function SearchBar() {
36
42
  loading = _useSiteSearch.loading;
37
43
 
38
44
  useEffect(function () {
45
+ // why put useEffect?
46
+ // to avoid Text content mismatch between server & client in ssr
47
+ if (!isAppleDevice) {
48
+ setSymbol('Ctrl');
49
+ }
50
+
39
51
  var handler = function handler(ev) {
40
52
  if ((isAppleDevice ? ev.metaKey : ev.ctrlKey) && ev.key === 'k') {
41
53
  var _input$current;