dumi 2.0.0-rc.9 → 2.0.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 (52) 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/useSiteSearch/index.d.ts +7 -0
  8. package/dist/client/theme-api/useSiteSearch/index.js +108 -0
  9. package/dist/client/theme-api/{useSiteSearch.d.ts → useSiteSearch/worker.d.ts} +1 -7
  10. package/dist/client/theme-api/{useSiteSearch.js → useSiteSearch/worker.js} +36 -69
  11. package/dist/constants.js +0 -1
  12. package/dist/features/exportStatic.js +18 -3
  13. package/dist/features/routes.js +18 -3
  14. package/dist/features/tabs.js +7 -4
  15. package/dist/features/theme/loader.js +1 -1
  16. package/dist/loaders/markdown/index.js +6 -5
  17. package/dist/loaders/markdown/transformer/index.d.ts +1 -1
  18. package/dist/loaders/markdown/transformer/rehypeEnhancedTag.js +12 -2
  19. package/dist/loaders/markdown/transformer/remarkEmbed.js +33 -9
  20. package/dist/loaders/markdown/transformer/remarkMeta.js +1 -1
  21. package/dist/loaders/page/index.js +1 -1
  22. package/dist/service/cli.js +1 -0
  23. package/package.json +7 -8
  24. package/theme-default/builtins/Badge/index.less +1 -1
  25. package/theme-default/builtins/Container/index.js +1 -1
  26. package/theme-default/builtins/Container/index.less +15 -11
  27. package/theme-default/builtins/Previewer/index.less +1 -1
  28. package/theme-default/builtins/SourceCode/index.less +1 -0
  29. package/theme-default/layouts/DocLayout/index.js +1 -2
  30. package/theme-default/layouts/DocLayout/index.less +2 -1
  31. package/theme-default/locales/en-US.json +1 -0
  32. package/theme-default/locales/zh-CN.json +1 -0
  33. package/theme-default/slots/Content/index.less +6 -2
  34. package/theme-default/slots/ContentTabs/index.less +2 -2
  35. package/theme-default/slots/Features/index.less +4 -4
  36. package/theme-default/slots/Header/index.js +2 -1
  37. package/theme-default/slots/Hero/index.less +1 -1
  38. package/theme-default/slots/LangSwitch/index.less +5 -2
  39. package/theme-default/slots/Logo/index.less +1 -1
  40. package/theme-default/slots/Navbar/index.less +2 -2
  41. package/theme-default/slots/PreviewerActions/index.d.ts +1 -1
  42. package/theme-default/slots/PreviewerActions/index.js +13 -3
  43. package/theme-default/slots/PreviewerActions/index.less +147 -148
  44. package/theme-default/slots/RtlSwitch/index.d.ts +4 -0
  45. package/theme-default/slots/RtlSwitch/index.js +50 -0
  46. package/theme-default/slots/RtlSwitch/index.less +5 -0
  47. package/theme-default/slots/SearchBar/index.js +2 -2
  48. package/theme-default/slots/SearchBar/index.less +9 -7
  49. package/theme-default/slots/SearchResult/index.js +7 -0
  50. package/theme-default/slots/SearchResult/index.less +12 -9
  51. package/theme-default/slots/Sidebar/index.less +5 -2
  52. 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
+ };
@@ -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;
@@ -131,6 +128,7 @@ function generateSearchMetadata(routes, demos, nav) {
131
128
  function generateHighlightTexts() {
132
129
  var str = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
133
130
  var keywords = arguments.length > 1 ? arguments[1] : undefined;
131
+ var priority = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
134
132
  var chunks = findAll({
135
133
  textToHighlight: str,
136
134
  searchWords: keywords,
@@ -155,7 +153,7 @@ function generateHighlightTexts() {
155
153
  highlightText.highlighted = true;
156
154
  matchedMapping[keywords.find(function (k) {
157
155
  return highlightText.text.includes(k);
158
- })] = true;
156
+ })] = priority;
159
157
  }
160
158
 
161
159
  return highlightText;
@@ -180,7 +178,7 @@ function generateSearchResult(metadata, keywordsStr) {
180
178
  var p = _step.value;
181
179
 
182
180
  if (matchReg.test(p)) {
183
- var _generateHighlightTex3 = generateHighlightTexts(sec.title, keywords),
181
+ var _generateHighlightTex3 = generateHighlightTexts(sec.title, keywords, 10),
184
182
  _generateHighlightTex4 = _slicedToArray(_generateHighlightTex3, 2),
185
183
  _highlightTitleTexts = _generateHighlightTex4[0],
186
184
  _titleMatchMapping = _generateHighlightTex4[1];
@@ -193,7 +191,9 @@ function generateSearchResult(metadata, keywordsStr) {
193
191
  hints.push({
194
192
  type: 'content',
195
193
  link: sec.link,
196
- priority: Object.keys(_objectSpread(_objectSpread({}, _titleMatchMapping), matchMapping)).length,
194
+ priority: Object.values(_objectSpread(_objectSpread({}, matchMapping), _titleMatchMapping)).reduce(function (acc, p) {
195
+ return acc + p;
196
+ }, 0),
197
197
  highlightTitleTexts: _highlightTitleTexts,
198
198
  highlightTexts: highlightTexts
199
199
  }); // match at most once in the same section
@@ -209,7 +209,7 @@ function generateSearchResult(metadata, keywordsStr) {
209
209
  }
210
210
 
211
211
  if (matchReg.test(sec.rawTitle)) {
212
- var _generateHighlightTex = generateHighlightTexts(sec.title, keywords),
212
+ var _generateHighlightTex = generateHighlightTexts(sec.title, keywords, 10),
213
213
  _generateHighlightTex2 = _slicedToArray(_generateHighlightTex, 2),
214
214
  highlightTitleTexts = _generateHighlightTex2[0],
215
215
  titleMatchMapping = _generateHighlightTex2[1];
@@ -217,7 +217,9 @@ function generateSearchResult(metadata, keywordsStr) {
217
217
  hints.push({
218
218
  type: 'title',
219
219
  link: sec.link,
220
- priority: Object.keys(titleMatchMapping).length,
220
+ priority: Object.values(titleMatchMapping).reduce(function (acc, p) {
221
+ return acc + p;
222
+ }, 0),
221
223
  highlightTitleTexts: highlightTitleTexts,
222
224
  highlightTexts: generateHighlightTexts(sec.paragraphs[0] || '', keywords)[0]
223
225
  });
@@ -226,7 +228,7 @@ function generateSearchResult(metadata, keywordsStr) {
226
228
 
227
229
  data.demos.forEach(function (demo) {
228
230
  if (matchReg.test(demo.rawTitle) || matchReg.test(demo.description)) {
229
- var _generateHighlightTex7 = generateHighlightTexts(demo.title, keywords),
231
+ var _generateHighlightTex7 = generateHighlightTexts(demo.title, keywords, 10),
230
232
  _generateHighlightTex8 = _slicedToArray(_generateHighlightTex7, 2),
231
233
  highlightTitleTexts = _generateHighlightTex8[0],
232
234
  titleMatchMapping = _generateHighlightTex8[1];
@@ -239,7 +241,9 @@ function generateSearchResult(metadata, keywordsStr) {
239
241
  hints.push({
240
242
  type: 'demo',
241
243
  link: demo.link,
242
- priority: Object.keys(_objectSpread(_objectSpread({}, titleMatchMapping), matchMapping)).length,
244
+ priority: Object.values(_objectSpread(_objectSpread({}, matchMapping), titleMatchMapping)).reduce(function (acc, p) {
245
+ return acc + p;
246
+ }, 0),
243
247
  highlightTitleTexts: highlightTitleTexts,
244
248
  highlightTexts: highlightTexts
245
249
  });
@@ -249,7 +253,7 @@ function generateSearchResult(metadata, keywordsStr) {
249
253
  if (matchReg.test(data.title)) {
250
254
  var _data$sections$;
251
255
 
252
- var _generateHighlightTex11 = generateHighlightTexts(data.title, keywords),
256
+ var _generateHighlightTex11 = generateHighlightTexts(data.title, keywords, 100),
253
257
  _generateHighlightTex12 = _slicedToArray(_generateHighlightTex11, 2),
254
258
  highlightTitleTexts = _generateHighlightTex12[0],
255
259
  titleMatchMapping = _generateHighlightTex12[1];
@@ -257,7 +261,9 @@ function generateSearchResult(metadata, keywordsStr) {
257
261
  hints.push({
258
262
  type: 'page',
259
263
  link: data.link,
260
- priority: Object.keys(titleMatchMapping).length,
264
+ priority: Object.values(titleMatchMapping).reduce(function (acc, p) {
265
+ return acc + p;
266
+ }, 0),
261
267
  highlightTitleTexts: highlightTitleTexts,
262
268
  highlightTexts: generateHighlightTexts(((_data$sections$ = data.sections[0]) === null || _data$sections$ === void 0 ? void 0 : _data$sections$.paragraphs[0]) || '', keywords)[0]
263
269
  });
@@ -270,7 +276,7 @@ function generateSearchResult(metadata, keywordsStr) {
270
276
  var key = data.navTitle || '$ROOT';
271
277
  (_resultMapping$key = resultMapping[key]) !== null && _resultMapping$key !== void 0 ? _resultMapping$key : resultMapping[key] = {
272
278
  title: data.navTitle,
273
- priority: data.navOrder,
279
+ priority: data.navOrder * 1000,
274
280
  hints: []
275
281
  };
276
282
 
@@ -289,59 +295,20 @@ function generateSearchResult(metadata, keywordsStr) {
289
295
  });
290
296
  }
291
297
 
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
- };
298
+ var metadata;
299
+
300
+ self.onmessage = function (_ref4) {
301
+ var data = _ref4.data;
302
+
303
+ switch (data.action) {
304
+ case 'generate-metadata':
305
+ metadata = generateSearchMetadata(data.args.routes, data.args.demos, data.args.nav);
306
+ break;
307
+
308
+ case 'get-search-result':
309
+ self.postMessage(generateSearchResult(metadata, data.args.keywords));
310
+ break;
311
+
312
+ default:
313
+ }
347
314
  };
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 = {});
@@ -55,6 +55,7 @@ var tabs_default = (api) => {
55
55
  api.modifyRoutes((routes) => {
56
56
  tabs.length = 0;
57
57
  Object.values(routes).forEach((route) => {
58
+ var _a;
58
59
  if (route.file && isTabRouteFile(route.file)) {
59
60
  delete routes[route.id];
60
61
  const rtlFile = (0, import_plugin_utils.winPath)(import_path.default.relative(api.cwd, route.file));
@@ -67,12 +68,14 @@ var tabs_default = (api) => {
67
68
  id: routeId,
68
69
  file: route.file
69
70
  });
70
- routesTabMapping[parentFile] ?? (routesTabMapping[parentFile] = []);
71
- routesTabMapping[parentFile].push(routeId);
71
+ if (!((_a = routesTabMapping[parentFile]) == null ? void 0 : _a.includes(routeId))) {
72
+ routesTabMapping[parentFile] ?? (routesTabMapping[parentFile] = []);
73
+ routesTabMapping[parentFile].push(routeId);
74
+ }
72
75
  } else {
73
76
  tabsFromPlugins.forEach((tab) => {
74
- var _a, _b;
75
- if ((!tab.test || route.absPath.match(tab.test)) && !((_a = routesTabMapping[route.file]) == null ? void 0 : _a.includes(tab.id))) {
77
+ var _a2, _b;
78
+ if ((!tab.test || route.absPath.match(tab.test)) && !((_a2 = routesTabMapping[route.file]) == null ? void 0 : _a2.includes(tab.id))) {
76
79
  routesTabMapping[_b = route.file] ?? (routesTabMapping[_b] = []);
77
80
  routesTabMapping[route.file].push(tab.id);
78
81
  }
@@ -29,7 +29,7 @@ var import_path = __toESM(require("path"));
29
29
  var import_plugin_utils = require("umi/plugin-utils");
30
30
  function getComponentMapFromDir(globExp, dir) {
31
31
  return import_plugin_utils.glob.sync(globExp, { cwd: dir }).reduce((ret, file) => {
32
- const specifier = import_path.default.basename(file.replace(/(\/index)?\.[a-z]+$/, ""));
32
+ const specifier = import_path.default.basename((0, import_plugin_utils.winPath)(file).replace(/(\/index)?\.[a-z]+$/, ""));
33
33
  if (/^[A-Z\d]/.test(specifier)) {
34
34
  ret[specifier] = {
35
35
  specifier,
@@ -40,10 +40,11 @@ function getDemoSourceFiles(demos = []) {
40
40
  }, []);
41
41
  }
42
42
  function emit(opts, ret) {
43
+ const { demos, embeds } = ret.meta;
44
+ embeds.forEach((file) => this.addDependency(file));
45
+ getDemoSourceFiles(demos).forEach((file) => this.addDependency(file));
43
46
  if (opts.mode === "meta") {
44
- const { demos, frontmatter, toc, texts, embeds = [] } = ret.meta;
45
- embeds.forEach((file) => this.addDependency(file));
46
- getDemoSourceFiles(demos).forEach((file) => this.addDependency(file));
47
+ const { frontmatter, toc, texts } = ret.meta;
47
48
  if (demos && opts.onResolveDemos) {
48
49
  opts.onResolveDemos(demos);
49
50
  }
@@ -126,10 +127,10 @@ function mdLoader(content) {
126
127
  }
127
128
  deferrer[cacheKey] = (0, import_transformer.default)(content, {
128
129
  ...import_plugin_utils.lodash.omit(opts, ["mode", "builtins", "onResolveDemos"]),
129
- fileAbsPath: this.resourcePath
130
+ fileAbsPath: (0, import_plugin_utils.winPath)(this.resourcePath)
130
131
  });
131
132
  deferrer[cacheKey].then((ret) => {
132
- depsMapping[this.resourcePath] = (ret.meta.embeds || []).concat(getDemoSourceFiles(ret.meta.demos));
133
+ depsMapping[this.resourcePath] = ret.meta.embeds.concat(getDemoSourceFiles(ret.meta.demos));
133
134
  const finalCacheKey = [
134
135
  baseCacheKey,
135
136
  getDepsCacheKey(depsMapping[this.resourcePath])
@@ -29,7 +29,7 @@ declare module 'vfile' {
29
29
  texts: IRouteMeta['texts'];
30
30
  frontmatter: IRouteMeta['frontmatter'];
31
31
  toc: IRouteMeta['toc'];
32
- embeds?: string[];
32
+ embeds: string[];
33
33
  }
34
34
  }
35
35
  export interface IMdTransformerOptions {