dumi 2.0.0-rc.9 → 2.0.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.
Files changed (56) hide show
  1. package/dist/client/theme-api/DumiDemo.js +5 -2
  2. package/dist/client/theme-api/DumiDemoGrid.js +23 -8
  3. package/dist/client/theme-api/index.d.ts +1 -0
  4. package/dist/client/theme-api/index.js +1 -0
  5. package/dist/client/theme-api/openStackBlitz.d.ts +1 -0
  6. package/dist/client/theme-api/openStackBlitz.js +60 -0
  7. package/dist/client/theme-api/types.d.ts +4 -0
  8. package/dist/client/theme-api/useSiteSearch/index.d.ts +7 -0
  9. package/dist/client/theme-api/useSiteSearch/index.js +108 -0
  10. package/dist/client/theme-api/{useSiteSearch.d.ts → useSiteSearch/worker.d.ts} +1 -7
  11. package/dist/client/theme-api/{useSiteSearch.js → useSiteSearch/worker.js} +46 -75
  12. package/dist/constants.js +0 -1
  13. package/dist/features/exportStatic.js +18 -3
  14. package/dist/features/routes.js +18 -3
  15. package/dist/features/tabs.js +7 -4
  16. package/dist/features/theme/loader.js +1 -1
  17. package/dist/loaders/markdown/index.js +6 -5
  18. package/dist/loaders/markdown/transformer/index.d.ts +1 -1
  19. package/dist/loaders/markdown/transformer/rehypeEnhancedTag.js +12 -2
  20. package/dist/loaders/markdown/transformer/remarkEmbed.js +33 -9
  21. package/dist/loaders/markdown/transformer/remarkMeta.js +1 -1
  22. package/dist/loaders/page/index.js +1 -1
  23. package/dist/service/cli.js +1 -0
  24. package/package.json +7 -8
  25. package/theme-default/builtins/Badge/index.less +1 -1
  26. package/theme-default/builtins/Container/index.js +1 -1
  27. package/theme-default/builtins/Container/index.less +15 -11
  28. package/theme-default/builtins/Previewer/index.js +1 -1
  29. package/theme-default/builtins/Previewer/index.less +1 -1
  30. package/theme-default/builtins/SourceCode/index.d.ts +1 -1
  31. package/theme-default/builtins/SourceCode/index.js +1 -1
  32. package/theme-default/builtins/SourceCode/index.less +10 -3
  33. package/theme-default/layouts/DocLayout/index.js +1 -2
  34. package/theme-default/layouts/DocLayout/index.less +2 -1
  35. package/theme-default/locales/en-US.json +1 -0
  36. package/theme-default/locales/zh-CN.json +1 -0
  37. package/theme-default/slots/Content/index.less +6 -2
  38. package/theme-default/slots/ContentTabs/index.less +2 -2
  39. package/theme-default/slots/Features/index.less +4 -4
  40. package/theme-default/slots/Header/index.js +2 -1
  41. package/theme-default/slots/Hero/index.less +1 -1
  42. package/theme-default/slots/LangSwitch/index.less +5 -2
  43. package/theme-default/slots/Logo/index.less +1 -1
  44. package/theme-default/slots/Navbar/index.less +2 -2
  45. package/theme-default/slots/PreviewerActions/index.d.ts +1 -1
  46. package/theme-default/slots/PreviewerActions/index.js +13 -3
  47. package/theme-default/slots/PreviewerActions/index.less +147 -148
  48. package/theme-default/slots/RtlSwitch/index.d.ts +4 -0
  49. package/theme-default/slots/RtlSwitch/index.js +50 -0
  50. package/theme-default/slots/RtlSwitch/index.less +5 -0
  51. package/theme-default/slots/SearchBar/index.js +2 -2
  52. package/theme-default/slots/SearchBar/index.less +9 -7
  53. package/theme-default/slots/SearchResult/index.js +7 -0
  54. package/theme-default/slots/SearchResult/index.less +12 -9
  55. package/theme-default/slots/Sidebar/index.less +5 -2
  56. package/theme-default/slots/Toc/index.less +2 -2
@@ -1,7 +1,7 @@
1
1
  function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
2
2
 
3
3
  import { SP_ROUTE_PREFIX } from "../../constants";
4
- import { useSiteData } from 'dumi';
4
+ import { useAppData, useSiteData } from 'dumi';
5
5
  import Container from "dumi/theme/builtins/Container";
6
6
  import Previewer from "dumi/theme/builtins/Previewer";
7
7
  import React, { createElement } from 'react';
@@ -24,6 +24,9 @@ export var DumiDemo = function DumiDemo(props) {
24
24
  var _useSiteData = useSiteData(),
25
25
  demos = _useSiteData.demos;
26
26
 
27
+ var _useAppData = useAppData(),
28
+ basename = _useAppData.basename;
29
+
27
30
  var _demos$props$demo$id = demos[props.demo.id],
28
31
  component = _demos$props$demo$id.component,
29
32
  asset = _demos$props$demo$id.asset;
@@ -35,6 +38,6 @@ export var DumiDemo = function DumiDemo(props) {
35
38
  return /*#__PURE__*/React.createElement(Previewer, _extends({
36
39
  asset: asset,
37
40
  demoUrl: // allow user override demoUrl by frontmatter
38
- props.previewerProps.demoUrl || "/".concat(SP_ROUTE_PREFIX, "demos/").concat(props.demo.id)
41
+ props.previewerProps.demoUrl || "".concat(basename).concat(SP_ROUTE_PREFIX, "demos/").concat(props.demo.id)
39
42
  }, props.previewerProps), props.previewerProps.iframe ? null : /*#__PURE__*/React.createElement(DemoErrorBoundary, null, /*#__PURE__*/createElement(component)));
40
43
  };
@@ -13,19 +13,19 @@ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Sy
13
13
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
14
14
 
15
15
  import { DumiDemo, useRouteMeta } from 'dumi';
16
- import React, { useState } from 'react';
16
+ import React, { useCallback, useEffect, useState } from 'react';
17
17
  export var DumiDemoGrid = function DumiDemoGrid(props) {
18
18
  var _useRouteMeta = useRouteMeta(),
19
19
  fm = _useRouteMeta.frontmatter;
20
20
 
21
- var _useState = useState(function () {
21
+ var generator = useCallback(function (fm, items) {
22
22
  var _fm$demo;
23
23
 
24
24
  var cols = [];
25
25
 
26
- if ((_fm$demo = fm.demo) !== null && _fm$demo !== void 0 && _fm$demo.cols && fm.demo.cols > 1) {
27
- for (var i = 0; i < props.items.length; i += fm.demo.cols) {
28
- props.items.slice(i, i + fm.demo.cols).forEach(function (item, j) {
26
+ if ((_fm$demo = fm.demo) !== null && _fm$demo !== void 0 && _fm$demo.cols && fm.demo.cols > 1 && window.innerWidth > 1024) {
27
+ for (var i = 0; i < items.length; i += fm.demo.cols) {
28
+ items.slice(i, i + fm.demo.cols).forEach(function (item, j) {
29
29
  var _cols$j;
30
30
 
31
31
  (_cols$j = cols[j]) !== null && _cols$j !== void 0 ? _cols$j : cols[j] = [];
@@ -35,14 +35,29 @@ export var DumiDemoGrid = function DumiDemoGrid(props) {
35
35
 
36
36
  return cols;
37
37
  } else {
38
- cols.push(props.items);
38
+ cols.push(items);
39
39
  }
40
40
 
41
41
  return cols;
42
+ }, []);
43
+
44
+ var _useState = useState(function () {
45
+ return generator(fm, props.items);
42
46
  }),
43
- _useState2 = _slicedToArray(_useState, 1),
44
- cols = _useState2[0];
47
+ _useState2 = _slicedToArray(_useState, 2),
48
+ cols = _useState2[0],
49
+ setCols = _useState2[1];
50
+
51
+ useEffect(function () {
52
+ var handler = function handler() {
53
+ return setCols(generator(fm, props.items));
54
+ };
45
55
 
56
+ window.addEventListener('resize', handler);
57
+ return function () {
58
+ return window.removeEventListener('resize', handler);
59
+ };
60
+ }, []);
46
61
  return /*#__PURE__*/React.createElement("div", {
47
62
  style: {
48
63
  display: 'flex',
@@ -4,6 +4,7 @@ export { DumiDemo } from './DumiDemo';
4
4
  export { DumiDemoGrid } from './DumiDemoGrid';
5
5
  export { DumiPage } from './DumiPage';
6
6
  export { openCodeSandbox } from './openCodeSandbox';
7
+ export { openStackBlitz } from './openStackBlitz';
7
8
  export type { IPreviewerProps } from './types';
8
9
  export { useAtomAssets } from './useAtomAssets';
9
10
  export { useLocale } from './useLocale';
@@ -4,6 +4,7 @@ export { DumiDemo } from "./DumiDemo";
4
4
  export { DumiDemoGrid } from "./DumiDemoGrid";
5
5
  export { DumiPage } from "./DumiPage";
6
6
  export { openCodeSandbox } from "./openCodeSandbox";
7
+ export { openStackBlitz } from "./openStackBlitz";
7
8
  export { useAtomAssets } from "./useAtomAssets";
8
9
  export { useLocale } from "./useLocale";
9
10
  export { useNavData } from "./useNavData";
@@ -0,0 +1 @@
1
+ export declare const openStackBlitz: (data: IPreviewerProps) => void;
@@ -0,0 +1,60 @@
1
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
2
+
3
+ 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."); }
4
+
5
+ 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); }
6
+
7
+ 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; }
8
+
9
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
10
+
11
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
12
+
13
+ import sdk from '@stackblitz/sdk';
14
+ import { genReactRenderCode } from "./utils";
15
+ export var openStackBlitz = function openStackBlitz(data) {
16
+ var _data$asset$dependenc, _react, _deps$_react, _reactDom, _deps$_reactDom;
17
+
18
+ var isTSX = Boolean((_data$asset$dependenc = data.asset.dependencies) === null || _data$asset$dependenc === void 0 ? void 0 : _data$asset$dependenc['index.tsx']);
19
+ var ext = isTSX ? '.tsx' : '.jsx';
20
+ var deps = {};
21
+ var entryFileName = "index".concat(ext);
22
+ var files = {
23
+ 'index.html': '<div style="margin: 16px;" id="root"></div>'
24
+ };
25
+ var config = {
26
+ title: data.title || '',
27
+ description: data.description || 'An auto-generated demo by dumi',
28
+ template: 'create-react-app',
29
+ files: {}
30
+ };
31
+ Object.entries(data.asset.dependencies).forEach(function (_ref) {
32
+ var _ref2 = _slicedToArray(_ref, 2),
33
+ name = _ref2[0],
34
+ _ref2$ = _ref2[1],
35
+ type = _ref2$.type,
36
+ value = _ref2$.value;
37
+
38
+ if (type === 'NPM') {
39
+ // generate dependencies
40
+ deps[name] = value;
41
+ } else {
42
+ // append other imported local files
43
+ files[name === entryFileName ? "App".concat(ext) : name] = value;
44
+ }
45
+ });
46
+ (_deps$_react = deps[_react = 'react']) !== null && _deps$_react !== void 0 ? _deps$_react : deps[_react] = 'latest';
47
+ (_deps$_reactDom = deps[_reactDom = 'react-dom']) !== null && _deps$_reactDom !== void 0 ? _deps$_reactDom : deps[_reactDom] = deps.react;
48
+ files['package.json'] = JSON.stringify({
49
+ name: data.title,
50
+ description: data.description || 'An auto-generated demo by dumi',
51
+ dependencies: deps,
52
+ // add TypeScript dependency if required, must in devDeps to avoid csb compile error
53
+ devDependencies: isTSX ? {
54
+ typescript: '^4'
55
+ } : {}
56
+ }, null, 2);
57
+ files[entryFileName] = genReactRenderCode(deps.react);
58
+ config.files = files;
59
+ sdk.openProject(config);
60
+ };
@@ -21,6 +21,10 @@ export interface IPreviewerProps {
21
21
  * debug mark (will only render in dev by default)
22
22
  */
23
23
  debug?: boolean;
24
+ /**
25
+ * url for render current demo in a single page
26
+ */
27
+ demoUrl: string;
24
28
  /**
25
29
  * disable demo content padding
26
30
  */
@@ -0,0 +1,7 @@
1
+ import type { ISearchResult } from './worker';
2
+ export declare const useSiteSearch: () => {
3
+ keywords: string;
4
+ setKeywords: (val: string) => void;
5
+ result: ISearchResult;
6
+ loading: boolean;
7
+ };
@@ -0,0 +1,108 @@
1
+ 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; }
2
+
3
+ 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; }
4
+
5
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
+
7
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
8
+
9
+ 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."); }
10
+
11
+ 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); }
12
+
13
+ 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; }
14
+
15
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
16
+
17
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
18
+
19
+ import { useNavData, useSiteData } from 'dumi';
20
+ import { useCallback, useEffect, useRef, useState } from 'react';
21
+ import { useLocaleDocRoutes } from "../utils";
22
+ var worker; // for ssr
23
+
24
+ if (typeof window !== 'undefined') {
25
+ worker = new Worker(new URL('./worker', import.meta.url));
26
+ }
27
+
28
+ export var useSiteSearch = function useSiteSearch() {
29
+ var debounceTimer = useRef();
30
+ var routes = useLocaleDocRoutes();
31
+
32
+ var _useSiteData = useSiteData(),
33
+ demos = _useSiteData.demos;
34
+
35
+ var _useState = useState(false),
36
+ _useState2 = _slicedToArray(_useState, 2),
37
+ loading = _useState2[0],
38
+ setLoading = _useState2[1];
39
+
40
+ var _useState3 = useState(''),
41
+ _useState4 = _slicedToArray(_useState3, 2),
42
+ keywords = _useState4[0],
43
+ setKeywords = _useState4[1];
44
+
45
+ var navData = useNavData();
46
+
47
+ var _useState5 = useState([]),
48
+ _useState6 = _slicedToArray(_useState5, 2),
49
+ result = _useState6[0],
50
+ setResult = _useState6[1];
51
+
52
+ var setter = useCallback(function (val) {
53
+ setLoading(true);
54
+ setKeywords(val);
55
+ }, []);
56
+ useEffect(function () {
57
+ worker.onmessage = function (e) {
58
+ setResult(e.data);
59
+ setLoading(false);
60
+ };
61
+ }, []);
62
+ useEffect(function () {
63
+ // omit demo component for postmessage
64
+ var demoData = Object.entries(demos).reduce(function (acc, _ref) {
65
+ var _ref2 = _slicedToArray(_ref, 2),
66
+ key = _ref2[0],
67
+ _ref2$ = _ref2[1],
68
+ asset = _ref2$.asset,
69
+ routeId = _ref2$.routeId;
70
+
71
+ return _objectSpread(_objectSpread({}, acc), {}, _defineProperty({}, key, {
72
+ asset: asset,
73
+ routeId: routeId
74
+ }));
75
+ }, {});
76
+ worker.postMessage({
77
+ action: 'generate-metadata',
78
+ args: {
79
+ routes: JSON.parse(JSON.stringify(routes)),
80
+ nav: navData,
81
+ demos: demoData
82
+ }
83
+ });
84
+ }, [routes, demos, navData]);
85
+ useEffect(function () {
86
+ var str = keywords.trim();
87
+
88
+ if (str) {
89
+ clearTimeout(debounceTimer.current);
90
+ debounceTimer.current = window.setTimeout(function () {
91
+ worker.postMessage({
92
+ action: 'get-search-result',
93
+ args: {
94
+ keywords: str
95
+ }
96
+ });
97
+ }, 200);
98
+ } else {
99
+ setResult([]);
100
+ }
101
+ }, [keywords]);
102
+ return {
103
+ keywords: keywords,
104
+ setKeywords: setter,
105
+ result: result,
106
+ loading: loading
107
+ };
108
+ };
@@ -13,11 +13,5 @@ interface ISearchNavResult {
13
13
  highlightTexts: IHighlightText[];
14
14
  }[];
15
15
  }
16
- declare type ISearchResult = ISearchNavResult[];
17
- export declare const useSiteSearch: () => {
18
- keywords: string;
19
- setKeywords: (val: string) => void;
20
- result: ISearchResult;
21
- loading: boolean;
22
- };
16
+ export declare type ISearchResult = ISearchNavResult[];
23
17
  export {};
@@ -26,11 +26,8 @@ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToAr
26
26
 
27
27
  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; }
28
28
 
29
- import { useNavData, useSiteData } from 'dumi';
30
29
  import { findAll } from 'highlight-words-core';
31
- import { useCallback, useEffect, useRef, useState } from 'react';
32
- import { TAB_QUERY_KEY } from "./useTabMeta";
33
- import { useLocaleDocRoutes } from "./utils";
30
+ var TAB_QUERY_KEY = 'tab';
34
31
 
35
32
  function createMetadataSection(rawTitle, title, link, texts, tocIndex) {
36
33
  var allowEmptyParas = tocIndex !== undefined;
@@ -58,6 +55,10 @@ function createMetadataSection(rawTitle, title, link, texts, tocIndex) {
58
55
  } : null;
59
56
  }
60
57
 
58
+ function generateRouteTitle(fm) {
59
+ return [fm.title, fm.subtitle].filter(Boolean).join(' ');
60
+ }
61
+
61
62
  function generateSearchMetadata(routes, demos, nav) {
62
63
  var metadata = []; // generate demos mapping by route.id
63
64
 
@@ -86,11 +87,11 @@ function generateSearchMetadata(routes, demos, nav) {
86
87
 
87
88
  return (_demo$asset = demo.asset) === null || _demo$asset === void 0 ? void 0 : _demo$asset.id;
88
89
  });
89
- var orphanSection = createMetadataSection('', routeMeta.frontmatter.title, routeAbsPath, routeMeta.texts);
90
+ var orphanSection = createMetadataSection('', generateRouteTitle(routeMeta.frontmatter), routeAbsPath, routeMeta.texts);
90
91
  var tocSections = routeMeta.toc.reduce(function (acc, toc, i) {
91
92
  // exclude demo id, to avoid duplicate
92
93
  if (!demoIds.includes(toc.id) && toc.depth > 1) {
93
- acc.push(createMetadataSection(toc.title, "".concat(routeMeta.frontmatter.title, " - ").concat(toc.title), "".concat(routeAbsPath, "#").concat(toc.id), routeMeta.texts, i));
94
+ acc.push(createMetadataSection(toc.title, "".concat(generateRouteTitle(routeMeta.frontmatter), " - ").concat(toc.title), "".concat(routeAbsPath, "#").concat(toc.id), routeMeta.texts, i));
94
95
  }
95
96
 
96
97
  return acc;
@@ -99,25 +100,25 @@ function generateSearchMetadata(routes, demos, nav) {
99
100
  var key = _ref.key,
100
101
  meta = _ref.meta;
101
102
  // collect orphan section that not in toc
102
- var tabOrphanSection = createMetadataSection('', "".concat(routeMeta.frontmatter.title, " - ").concat(meta.frontmatter.title), "".concat(routeAbsPath, "?").concat(TAB_QUERY_KEY, "=").concat(key), meta.texts);
103
+ var tabOrphanSection = createMetadataSection('', "".concat(generateRouteTitle(routeMeta.frontmatter), " - ").concat(meta.frontmatter.title), "".concat(routeAbsPath, "?").concat(TAB_QUERY_KEY, "=").concat(key), meta.texts);
103
104
  if (tabOrphanSection) acc.push(tabOrphanSection); // collect sections by toc
104
105
 
105
106
  acc.push.apply(acc, _toConsumableArray(meta.toc.map(function (toc, i) {
106
- return createMetadataSection(toc.title, "".concat(routeMeta.frontmatter.title, " - ").concat(meta.frontmatter.title, " - ").concat(toc.title), "".concat(routeAbsPath, "?").concat(TAB_QUERY_KEY, "=").concat(key, "#").concat(toc.id), meta.texts, i);
107
+ return createMetadataSection(toc.title, "".concat(generateRouteTitle(routeMeta.frontmatter), " - ").concat(meta.frontmatter.title, " - ").concat(toc.title), "".concat(routeAbsPath, "?").concat(TAB_QUERY_KEY, "=").concat(key, "#").concat(toc.id), meta.texts, i);
107
108
  })));
108
109
  return acc;
109
110
  }, []);
110
111
  metadata.push({
111
112
  navTitle: routeNav === null || routeNav === void 0 ? void 0 : routeNav.title,
112
113
  navOrder: routeNav ? nav.indexOf(routeNav) : Infinity,
113
- title: routeMeta.frontmatter.title,
114
+ title: generateRouteTitle(routeMeta.frontmatter),
114
115
  link: routeAbsPath,
115
116
  sections: [].concat(_toConsumableArray(orphanSection ? [orphanSection] : []), _toConsumableArray(tocSections), _toConsumableArray(tabSections)),
116
117
  demos: ((_demosMapping$route$i = demosMapping[route.id]) === null || _demosMapping$route$i === void 0 ? void 0 : _demosMapping$route$i.map(function (demo) {
117
118
  return {
118
119
  link: "".concat(routeAbsPath, "#").concat(demo.asset.id),
119
120
  rawTitle: demo.asset.title || '',
120
- title: demo.asset.title || routeMeta.frontmatter.title,
121
+ title: demo.asset.title || generateRouteTitle(routeMeta.frontmatter),
121
122
  description: demo.asset.description || '',
122
123
  keywords: demo.asset.keywords || []
123
124
  };
@@ -131,6 +132,7 @@ function generateSearchMetadata(routes, demos, nav) {
131
132
  function generateHighlightTexts() {
132
133
  var str = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
133
134
  var keywords = arguments.length > 1 ? arguments[1] : undefined;
135
+ var priority = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
134
136
  var chunks = findAll({
135
137
  textToHighlight: str,
136
138
  searchWords: keywords,
@@ -155,7 +157,7 @@ function generateHighlightTexts() {
155
157
  highlightText.highlighted = true;
156
158
  matchedMapping[keywords.find(function (k) {
157
159
  return highlightText.text.includes(k);
158
- })] = true;
160
+ })] = priority;
159
161
  }
160
162
 
161
163
  return highlightText;
@@ -180,7 +182,7 @@ function generateSearchResult(metadata, keywordsStr) {
180
182
  var p = _step.value;
181
183
 
182
184
  if (matchReg.test(p)) {
183
- var _generateHighlightTex3 = generateHighlightTexts(sec.title, keywords),
185
+ var _generateHighlightTex3 = generateHighlightTexts(sec.title, keywords, 10),
184
186
  _generateHighlightTex4 = _slicedToArray(_generateHighlightTex3, 2),
185
187
  _highlightTitleTexts = _generateHighlightTex4[0],
186
188
  _titleMatchMapping = _generateHighlightTex4[1];
@@ -193,7 +195,9 @@ function generateSearchResult(metadata, keywordsStr) {
193
195
  hints.push({
194
196
  type: 'content',
195
197
  link: sec.link,
196
- priority: Object.keys(_objectSpread(_objectSpread({}, _titleMatchMapping), matchMapping)).length,
198
+ priority: Object.values(_objectSpread(_objectSpread({}, matchMapping), _titleMatchMapping)).reduce(function (acc, p) {
199
+ return acc + p;
200
+ }, 0),
197
201
  highlightTitleTexts: _highlightTitleTexts,
198
202
  highlightTexts: highlightTexts
199
203
  }); // match at most once in the same section
@@ -209,7 +213,7 @@ function generateSearchResult(metadata, keywordsStr) {
209
213
  }
210
214
 
211
215
  if (matchReg.test(sec.rawTitle)) {
212
- var _generateHighlightTex = generateHighlightTexts(sec.title, keywords),
216
+ var _generateHighlightTex = generateHighlightTexts(sec.title, keywords, 10),
213
217
  _generateHighlightTex2 = _slicedToArray(_generateHighlightTex, 2),
214
218
  highlightTitleTexts = _generateHighlightTex2[0],
215
219
  titleMatchMapping = _generateHighlightTex2[1];
@@ -217,7 +221,9 @@ function generateSearchResult(metadata, keywordsStr) {
217
221
  hints.push({
218
222
  type: 'title',
219
223
  link: sec.link,
220
- priority: Object.keys(titleMatchMapping).length,
224
+ priority: Object.values(titleMatchMapping).reduce(function (acc, p) {
225
+ return acc + p;
226
+ }, 0),
221
227
  highlightTitleTexts: highlightTitleTexts,
222
228
  highlightTexts: generateHighlightTexts(sec.paragraphs[0] || '', keywords)[0]
223
229
  });
@@ -226,7 +232,7 @@ function generateSearchResult(metadata, keywordsStr) {
226
232
 
227
233
  data.demos.forEach(function (demo) {
228
234
  if (matchReg.test(demo.rawTitle) || matchReg.test(demo.description)) {
229
- var _generateHighlightTex7 = generateHighlightTexts(demo.title, keywords),
235
+ var _generateHighlightTex7 = generateHighlightTexts(demo.title, keywords, 10),
230
236
  _generateHighlightTex8 = _slicedToArray(_generateHighlightTex7, 2),
231
237
  highlightTitleTexts = _generateHighlightTex8[0],
232
238
  titleMatchMapping = _generateHighlightTex8[1];
@@ -239,7 +245,9 @@ function generateSearchResult(metadata, keywordsStr) {
239
245
  hints.push({
240
246
  type: 'demo',
241
247
  link: demo.link,
242
- priority: Object.keys(_objectSpread(_objectSpread({}, titleMatchMapping), matchMapping)).length,
248
+ priority: Object.values(_objectSpread(_objectSpread({}, matchMapping), titleMatchMapping)).reduce(function (acc, p) {
249
+ return acc + p;
250
+ }, 0),
243
251
  highlightTitleTexts: highlightTitleTexts,
244
252
  highlightTexts: highlightTexts
245
253
  });
@@ -249,7 +257,7 @@ function generateSearchResult(metadata, keywordsStr) {
249
257
  if (matchReg.test(data.title)) {
250
258
  var _data$sections$;
251
259
 
252
- var _generateHighlightTex11 = generateHighlightTexts(data.title, keywords),
260
+ var _generateHighlightTex11 = generateHighlightTexts(data.title, keywords, 100),
253
261
  _generateHighlightTex12 = _slicedToArray(_generateHighlightTex11, 2),
254
262
  highlightTitleTexts = _generateHighlightTex12[0],
255
263
  titleMatchMapping = _generateHighlightTex12[1];
@@ -257,7 +265,9 @@ function generateSearchResult(metadata, keywordsStr) {
257
265
  hints.push({
258
266
  type: 'page',
259
267
  link: data.link,
260
- priority: Object.keys(titleMatchMapping).length,
268
+ priority: Object.values(titleMatchMapping).reduce(function (acc, p) {
269
+ return acc + p;
270
+ }, 0),
261
271
  highlightTitleTexts: highlightTitleTexts,
262
272
  highlightTexts: generateHighlightTexts(((_data$sections$ = data.sections[0]) === null || _data$sections$ === void 0 ? void 0 : _data$sections$.paragraphs[0]) || '', keywords)[0]
263
273
  });
@@ -270,7 +280,7 @@ function generateSearchResult(metadata, keywordsStr) {
270
280
  var key = data.navTitle || '$ROOT';
271
281
  (_resultMapping$key = resultMapping[key]) !== null && _resultMapping$key !== void 0 ? _resultMapping$key : resultMapping[key] = {
272
282
  title: data.navTitle,
273
- priority: data.navOrder,
283
+ priority: data.navOrder * 1000,
274
284
  hints: []
275
285
  };
276
286
 
@@ -289,59 +299,20 @@ function generateSearchResult(metadata, keywordsStr) {
289
299
  });
290
300
  }
291
301
 
292
- export var useSiteSearch = function useSiteSearch() {
293
- var debounceTimer = useRef();
294
- var routes = useLocaleDocRoutes();
295
-
296
- var _useSiteData = useSiteData(),
297
- demos = _useSiteData.demos;
298
-
299
- var _useState = useState(false),
300
- _useState2 = _slicedToArray(_useState, 2),
301
- loading = _useState2[0],
302
- setLoading = _useState2[1];
303
-
304
- var _useState3 = useState(''),
305
- _useState4 = _slicedToArray(_useState3, 2),
306
- keywords = _useState4[0],
307
- setKeywords = _useState4[1];
308
-
309
- var navData = useNavData();
310
-
311
- var _useState5 = useState([]),
312
- _useState6 = _slicedToArray(_useState5, 2),
313
- metadata = _useState6[0],
314
- setMetadata = _useState6[1];
315
-
316
- var _useState7 = useState([]),
317
- _useState8 = _slicedToArray(_useState7, 2),
318
- result = _useState8[0],
319
- setResult = _useState8[1];
320
-
321
- var setter = useCallback(function (val) {
322
- setLoading(true);
323
- setKeywords(val);
324
- }, []);
325
- useEffect(function () {
326
- setMetadata(generateSearchMetadata(routes, demos, navData));
327
- }, [routes, demos, navData]);
328
- useEffect(function () {
329
- var str = keywords.trim();
330
-
331
- if (str) {
332
- clearTimeout(debounceTimer.current);
333
- debounceTimer.current = window.setTimeout(function () {
334
- setResult(generateSearchResult(metadata, str));
335
- setLoading(false);
336
- }, 100);
337
- } else {
338
- setResult([]);
339
- }
340
- }, [keywords, metadata]);
341
- return {
342
- keywords: keywords,
343
- setKeywords: setter,
344
- result: result,
345
- loading: loading
346
- };
302
+ var metadata;
303
+
304
+ self.onmessage = function (_ref4) {
305
+ var data = _ref4.data;
306
+
307
+ switch (data.action) {
308
+ case 'generate-metadata':
309
+ metadata = generateSearchMetadata(data.args.routes, data.args.demos, data.args.nav);
310
+ break;
311
+
312
+ case 'get-search-result':
313
+ self.postMessage(generateSearchResult(metadata, data.args.keywords));
314
+ break;
315
+
316
+ default:
317
+ }
347
318
  };
package/dist/constants.js CHANGED
@@ -52,7 +52,6 @@ var CLIENT_DEPS = [
52
52
  "prismjs",
53
53
  "rc-tabs",
54
54
  "react-copy-to-clipboard",
55
- "react-helmet",
56
55
  "react-intl"
57
56
  ];
58
57
  // Annotate the CommonJS export names for ESM import in node:
@@ -25,18 +25,33 @@ module.exports = __toCommonJS(exportStatic_exports);
25
25
  var import_constants = require("../constants");
26
26
  var import_assets = require("./assets");
27
27
  var exportStatic_default = (api) => {
28
+ const prevExtraRoutePaths = [];
28
29
  api.describe({ key: "dumi:exportStatic" });
30
+ api.register({
31
+ key: "modifyDefaultConfig",
32
+ stage: Infinity,
33
+ fn(memo) {
34
+ if (memo.exportStatic && memo.exportStatic.extraRoutePaths) {
35
+ prevExtraRoutePaths.push(memo.exportStatic.extraRoutePaths);
36
+ }
37
+ }
38
+ });
29
39
  api.register({
30
40
  key: "modifyConfig",
31
41
  stage: Infinity,
32
42
  fn(memo) {
33
43
  var _a;
34
- if (api.userConfig.exportStatic !== false) {
35
- const prev = ((_a = memo.exportStatic) == null ? void 0 : _a.extraRoutePaths) || [];
44
+ if (memo.exportStatic !== false) {
45
+ if ((_a = memo.exportStatic) == null ? void 0 : _a.extraRoutePaths) {
46
+ prevExtraRoutePaths.push(memo.exportStatic.extraRoutePaths);
47
+ }
36
48
  memo.exportStatic ?? (memo.exportStatic = {});
37
49
  memo.exportStatic.extraRoutePaths = async () => {
38
50
  const examples = (0, import_assets.getExampleAssets)();
39
- const userExtraPaths = typeof prev === "function" ? await prev() : prev;
51
+ const userExtraPaths = [];
52
+ for (const prev of prevExtraRoutePaths) {
53
+ userExtraPaths.push(...typeof prev === "function" ? await prev() : prev);
54
+ }
40
55
  return userExtraPaths.concat(examples.map(({ id }) => `/${import_constants.SP_ROUTE_PREFIX}demos/${id}`));
41
56
  };
42
57
  }
@@ -40,8 +40,11 @@ function localizeUmiRoute(route, locales) {
40
40
  if (locale) {
41
41
  const base = !("base" in locale) || locale.base === "/" ? "" : locale.base.replace(/^(\/)(.+)$/, "$2$1");
42
42
  const suffix = "suffix" in locale ? locale.suffix : "";
43
- route.path = `${base}${route.path.replace(new RegExp(`/${locale.id}$`), "").replace(/((^|\/)(index|README))$/, "")}${suffix}`;
43
+ route.path = `${base}${route.path.replace(new RegExp(`/${locale.id}$`), "").replace(/((^|\/)(index|README))$/, "").toLowerCase()}${suffix}`;
44
44
  route.absPath = route.path !== "/" ? `/${route.path}` : route.path;
45
+ } else {
46
+ route.path = route.path.toLowerCase();
47
+ route.absPath = route.absPath.toLowerCase();
45
48
  }
46
49
  }
47
50
  function flatRoute(route, docLayoutId) {
@@ -163,8 +166,6 @@ var routes_default = (api) => {
163
166
  } else if (!route.isLayout) {
164
167
  flatRoute(route, docLayoutId);
165
168
  localizeUmiRoute(route, api.config.locales);
166
- route.path = route.path.toLowerCase();
167
- route.absPath = route.absPath.toLowerCase();
168
169
  }
169
170
  });
170
171
  if (Object.values(pages).every((route) => route.path !== "*")) {
@@ -201,6 +202,20 @@ var routes_default = (api) => {
201
202
  }
202
203
  return layouts;
203
204
  });
205
+ api.addEntryCodeAhead(() => `
206
+ // always remove trailing slash from location.pathname
207
+ if (
208
+ typeof history !== 'undefined' &&
209
+ location.pathname.length > 1 &&
210
+ location.pathname.endsWith('/')
211
+ ) {
212
+ history.replaceState(
213
+ {},
214
+ '',
215
+ location.pathname.slice(0, -1) + location.search + location.hash,
216
+ );
217
+ }
218
+ `);
204
219
  };
205
220
  // Annotate the CommonJS export names for ESM import in node:
206
221
  0 && (module.exports = {});