dumi 2.0.0-beta.7 → 2.0.0-beta.8

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 (62) hide show
  1. package/dist/client/theme-api/DumiPage.js +24 -4
  2. package/dist/client/theme-api/context.d.ts +1 -0
  3. package/dist/client/theme-api/index.d.ts +2 -0
  4. package/dist/client/theme-api/index.js +3 -1
  5. package/dist/client/theme-api/types.d.ts +34 -3
  6. package/dist/client/theme-api/useRouteMeta.js +4 -3
  7. package/dist/client/theme-api/useSiteSearch.d.ts +23 -0
  8. package/dist/client/theme-api/useSiteSearch.js +331 -0
  9. package/dist/client/theme-api/useTabMeta.d.ts +4 -0
  10. package/dist/client/theme-api/useTabMeta.js +47 -0
  11. package/dist/features/configPlugins/index.js +1 -1
  12. package/dist/features/configPlugins/schema.js +2 -1
  13. package/dist/features/exports.d.ts +5 -0
  14. package/dist/features/exports.js +23 -2
  15. package/dist/features/meta.js +43 -22
  16. package/dist/features/routes.js +6 -6
  17. package/dist/features/theme/index.js +7 -2
  18. package/dist/loaders/markdown/index.d.ts +1 -1
  19. package/dist/loaders/markdown/index.js +69 -48
  20. package/dist/loaders/markdown/transformer/index.d.ts +4 -3
  21. package/dist/loaders/markdown/transformer/index.js +6 -6
  22. package/dist/loaders/markdown/transformer/rehypeDemo.js +2 -2
  23. package/dist/loaders/markdown/transformer/rehypeEnhancedTag.js +6 -1
  24. package/dist/loaders/markdown/transformer/rehypeImg.d.ts +6 -0
  25. package/dist/loaders/markdown/transformer/rehypeImg.js +57 -0
  26. package/dist/loaders/markdown/transformer/rehypeJsxify.js +17 -1
  27. package/dist/loaders/markdown/transformer/rehypeSlug.d.ts +2 -2
  28. package/dist/loaders/markdown/transformer/rehypeSlug.js +21 -57
  29. package/dist/loaders/markdown/transformer/rehypeText.d.ts +4 -0
  30. package/dist/loaders/markdown/transformer/rehypeText.js +110 -0
  31. package/dist/loaders/markdown/transformer/remarkEmbed.d.ts +4 -0
  32. package/dist/loaders/markdown/transformer/remarkEmbed.js +89 -0
  33. package/dist/loaders/page/index.js +1 -0
  34. package/dist/types.d.ts +8 -1
  35. package/dist/utils.d.ts +7 -0
  36. package/dist/utils.js +16 -0
  37. package/package.json +12 -11
  38. package/theme-default/builtins/Previewer/index.js +1 -0
  39. package/theme-default/layouts/DocLayout/index.js +3 -1
  40. package/theme-default/layouts/DocLayout/index.less +9 -4
  41. package/theme-default/locales/en-US.json +2 -1
  42. package/theme-default/locales/zh-CN.json +2 -1
  43. package/theme-default/slots/ContentTabs/index.d.ts +1 -1
  44. package/theme-default/slots/ContentTabs/index.js +1 -1
  45. package/theme-default/slots/Features/index.d.ts +4 -0
  46. package/theme-default/slots/Features/index.js +28 -0
  47. package/theme-default/slots/Features/index.less +49 -0
  48. package/theme-default/slots/Header/index.js +9 -2
  49. package/theme-default/slots/Header/index.less +18 -10
  50. package/theme-default/slots/Hero/index.d.ts +4 -0
  51. package/theme-default/slots/Hero/index.js +35 -0
  52. package/theme-default/slots/Hero/index.less +65 -0
  53. package/theme-default/slots/HeroTitle/index.d.ts +6 -0
  54. package/theme-default/slots/HeroTitle/index.js +10 -0
  55. package/theme-default/slots/HeroTitle/index.less +23 -0
  56. package/theme-default/slots/SearchBar/index.js +69 -9
  57. package/theme-default/slots/SearchBar/index.less +37 -4
  58. package/theme-default/slots/SearchResult/index.d.ts +9 -0
  59. package/theme-default/slots/SearchResult/index.js +168 -0
  60. package/theme-default/slots/SearchResult/index.less +119 -0
  61. package/dist/loaders/markdown/transformer/rehypeEmbed.d.ts +0 -12
  62. package/dist/loaders/markdown/transformer/rehypeEmbed.js +0 -88
@@ -10,14 +10,28 @@ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Sy
10
10
 
11
11
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
12
12
 
13
- import { useRouteMeta, useSiteData } from 'dumi';
13
+ import { useLocation, useRouteMeta, useSiteData } from 'dumi';
14
14
  import ContentTabs from 'dumi/theme/slots/ContentTabs';
15
15
  import React, { useEffect, useState } from 'react';
16
+ import { useTabQueryState } from "./useTabMeta";
16
17
  export var DumiPage = function DumiPage(props) {
18
+ var _useLocation = useLocation(),
19
+ hash = _useLocation.hash;
20
+
17
21
  var _useRouteMeta = useRouteMeta(),
18
22
  tabs = _useRouteMeta.tabs;
19
23
 
20
- var _useState = useState(),
24
+ var _useTabQueryState = useTabQueryState(),
25
+ _useTabQueryState2 = _slicedToArray(_useTabQueryState, 2),
26
+ tabKey = _useTabQueryState2[0],
27
+ setTabKey = _useTabQueryState2[1];
28
+
29
+ var _useState = useState(function () {
30
+ return tabs === null || tabs === void 0 ? void 0 : tabs.find(function (_ref) {
31
+ var key = _ref.key;
32
+ return key === tabKey;
33
+ });
34
+ }),
21
35
  _useState2 = _slicedToArray(_useState, 2),
22
36
  tab = _useState2[0],
23
37
  setTab = _useState2[1];
@@ -28,12 +42,18 @@ export var DumiPage = function DumiPage(props) {
28
42
 
29
43
  useEffect(function () {
30
44
  setLoading(false);
31
- }, []);
45
+ }, []); // handle hash change
46
+
47
+ useEffect(function () {
48
+ var elm = document.getElementById(hash.replace('#', ''));
49
+ if (elm) elm.scrollIntoView();
50
+ }, [hash]);
32
51
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ContentTabs, {
33
52
  tabs: tabs,
34
- tabKey: tab === null || tab === void 0 ? void 0 : tab.key,
53
+ tabKey: tabKey,
35
54
  onChange: function onChange(val) {
36
55
  setTab(val);
56
+ setTabKey(val === null || val === void 0 ? void 0 : val.key);
37
57
  }
38
58
  }), tab ? /*#__PURE__*/React.createElement(tab.components.default) : props.children);
39
59
  };
@@ -7,6 +7,7 @@ interface ISiteContext {
7
7
  demos: Record<string, {
8
8
  component: ComponentType;
9
9
  asset: IPreviewerProps['asset'];
10
+ routeId: string;
10
11
  }>;
11
12
  components: Record<string, AtomComponentAsset>;
12
13
  locales: NonNullable<ILocalesConfig>;
@@ -9,3 +9,5 @@ export { useLocale } from './useLocale';
9
9
  export { useNavData } from './useNavData';
10
10
  export { useRouteMeta } from './useRouteMeta';
11
11
  export { useFullSidebarData, useSidebarData } from './useSidebarData';
12
+ export { useSiteSearch } from './useSiteSearch';
13
+ export { useTabMeta } from './useTabMeta';
@@ -7,4 +7,6 @@ export { useAtomAssets } from "./useAtomAssets";
7
7
  export { useLocale } from "./useLocale";
8
8
  export { useNavData } from "./useNavData";
9
9
  export { useRouteMeta } from "./useRouteMeta";
10
- export { useFullSidebarData, useSidebarData } from "./useSidebarData";
10
+ export { useFullSidebarData, useSidebarData } from "./useSidebarData";
11
+ export { useSiteSearch } from "./useSiteSearch";
12
+ export { useTabMeta } from "./useTabMeta";
@@ -57,6 +57,22 @@ export interface IRouteMeta {
57
57
  order?: number;
58
58
  };
59
59
  order?: number;
60
+ hero?: {
61
+ title?: string;
62
+ description?: string;
63
+ background?: string;
64
+ links?: {
65
+ title: string;
66
+ link: string;
67
+ }[];
68
+ [key: string]: any;
69
+ };
70
+ features?: {
71
+ emoji?: string;
72
+ title?: string;
73
+ description?: string;
74
+ [key: string]: any;
75
+ }[];
60
76
  toc?: boolean | 'content' | 'menu';
61
77
  demo?: {
62
78
  cols?: number;
@@ -68,6 +84,18 @@ export interface IRouteMeta {
68
84
  depth: number;
69
85
  title: string;
70
86
  }[];
87
+ texts: {
88
+ type?: 'content';
89
+ value: string;
90
+ /**
91
+ * paragraph index
92
+ */
93
+ paraId: number;
94
+ /**
95
+ * title index in toc
96
+ */
97
+ tocIndex?: number;
98
+ }[];
71
99
  tabs?: {
72
100
  key: string;
73
101
  components: {
@@ -75,9 +103,12 @@ export interface IRouteMeta {
75
103
  Extra: ComponentType;
76
104
  Action: ComponentType;
77
105
  };
78
- frontmatter: Omit<IRouteMeta['frontmatter'], 'description' | 'keywords' | 'nav' | 'group'>;
79
- toc: IRouteMeta['toc'];
80
- [key: string]: any;
106
+ meta: {
107
+ frontmatter: Omit<IRouteMeta['frontmatter'], 'description' | 'keywords' | 'nav' | 'group' | 'hero' | 'features'>;
108
+ toc: IRouteMeta['toc'];
109
+ texts: IRouteMeta['texts'];
110
+ [key: string]: any;
111
+ };
81
112
  }[];
82
113
  [key: string]: any;
83
114
  }
@@ -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 { matchRoutes, useAppData, useLocation, useRouteData } from 'dumi';
14
- import { useCallback, useEffect, useState } from 'react';
14
+ import { useCallback, useLayoutEffect, useState } from 'react';
15
15
 
16
16
  /**
17
17
  * hook for get matched route meta
@@ -42,7 +42,8 @@ export var useRouteMeta = function useRouteMeta() {
42
42
 
43
43
  return ret || {
44
44
  frontmatter: {},
45
- toc: []
45
+ toc: [],
46
+ texts: []
46
47
  };
47
48
  }, [clientRoutes.length, pathname]);
48
49
 
@@ -51,7 +52,7 @@ export var useRouteMeta = function useRouteMeta() {
51
52
  meta = _useState2[0],
52
53
  setMeta = _useState2[1];
53
54
 
54
- useEffect(function () {
55
+ useLayoutEffect(function () {
55
56
  setMeta(getter);
56
57
  }, [clientRoutes.length, pathname]);
57
58
  return meta;
@@ -0,0 +1,23 @@
1
+ interface IHighlightText {
2
+ highlighted?: boolean;
3
+ text: string;
4
+ }
5
+ interface ISearchNavResult {
6
+ title?: string;
7
+ priority: number;
8
+ hints: {
9
+ type: 'page' | 'title' | 'demo' | 'content';
10
+ link: string;
11
+ priority: number;
12
+ highlightTitleTexts: IHighlightText[];
13
+ highlightTexts: IHighlightText[];
14
+ }[];
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
+ };
23
+ export {};
@@ -0,0 +1,331 @@
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 _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; }
6
+
7
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
8
+
9
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
10
+
11
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
12
+
13
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
14
+
15
+ 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); }
16
+
17
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
18
+
19
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
20
+
21
+ 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; }
22
+
23
+ import { useNavData, useSiteData } from 'dumi';
24
+ import { findAll } from 'highlight-words-core';
25
+ import { useCallback, useEffect, useRef, useState } from 'react';
26
+ import { TAB_QUERY_KEY } from "./useTabMeta";
27
+ import { useLocaleDocRoutes } from "./utils";
28
+
29
+ function createMetadataSection(rawTitle, title, link, texts, tocIndex) {
30
+ var allowEmptyParas = tocIndex !== undefined;
31
+ var paragraphs = texts.reduce(function (acc, text) {
32
+ if (text.tocIndex === tocIndex) {
33
+ acc[text.paraId] = (acc[text.paraId] || '').concat(text.value);
34
+ }
35
+
36
+ return acc;
37
+ }, []).filter(Boolean);
38
+ return Boolean(paragraphs.length) || allowEmptyParas ? {
39
+ rawTitle: rawTitle,
40
+ title: title,
41
+ link: link,
42
+ paragraphs: texts.reduce(function (acc, text) {
43
+ if (text.tocIndex === tocIndex) {
44
+ var _text$paraId, _acc$_text$paraId;
45
+
46
+ (_acc$_text$paraId = acc[_text$paraId = text.paraId]) !== null && _acc$_text$paraId !== void 0 ? _acc$_text$paraId : acc[_text$paraId] = '';
47
+ acc[text.paraId] += text.value;
48
+ }
49
+
50
+ return acc;
51
+ }, []).filter(Boolean)
52
+ } : null;
53
+ }
54
+
55
+ function generateSearchMetadata(routes, demos, nav) {
56
+ var metadata = []; // generate demos mapping by route.id
57
+
58
+ var demosMapping = Object.values(demos).reduce(function (acc, demo) {
59
+ if (demo.asset) {
60
+ var _demo$routeId, _acc$_demo$routeId;
61
+
62
+ (_acc$_demo$routeId = acc[_demo$routeId = demo.routeId]) !== null && _acc$_demo$routeId !== void 0 ? _acc$_demo$routeId : acc[_demo$routeId] = [];
63
+ acc[demo.routeId].push(demo);
64
+ }
65
+
66
+ return acc;
67
+ }, {});
68
+ Object.values(routes).forEach(function (route) {
69
+ // only process content route
70
+ if ('meta' in route && !('isLayout' in route)) {
71
+ var _demosMapping$route$i;
72
+
73
+ var routeMeta = route.meta;
74
+ var routeAbsPath = route.path.replace(/^([^/])/, '/$1');
75
+ var routeNav = nav.find(function (item) {
76
+ return routeAbsPath === item.link || routeAbsPath.startsWith("".concat(item.activePath, "/"));
77
+ });
78
+ var demoIds = (demosMapping[route.id] || []).map(function (demo) {
79
+ var _demo$asset;
80
+
81
+ return (_demo$asset = demo.asset) === null || _demo$asset === void 0 ? void 0 : _demo$asset.id;
82
+ });
83
+ var orphanSection = createMetadataSection('', routeMeta.frontmatter.title, routeAbsPath, routeMeta.texts);
84
+ var tocSections = routeMeta.toc // exclude demo id, to avoid duplicate
85
+ .filter(function (_ref) {
86
+ var id = _ref.id,
87
+ depth = _ref.depth;
88
+ return !demoIds.includes(id) && depth > 1;
89
+ }).map(function (toc, i) {
90
+ return createMetadataSection(toc.title, "".concat(routeMeta.frontmatter.title, " - ").concat(toc.title), "".concat(routeAbsPath, "#").concat(toc.id), routeMeta.texts, i);
91
+ });
92
+ var tabSections = (routeMeta.tabs || []).reduce(function (acc, _ref2) {
93
+ var key = _ref2.key,
94
+ meta = _ref2.meta;
95
+ // collect orphan section that not in toc
96
+ var tabOrphanSection = createMetadataSection('', "".concat(routeMeta.frontmatter.title, " - ").concat(meta.frontmatter.title), "".concat(routeAbsPath, "?").concat(TAB_QUERY_KEY, "=").concat(key), meta.texts);
97
+ if (tabOrphanSection) acc.push(tabOrphanSection); // collect sections by toc
98
+
99
+ acc.push.apply(acc, _toConsumableArray(meta.toc.map(function (toc, i) {
100
+ 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);
101
+ })));
102
+ return acc;
103
+ }, []);
104
+ metadata.push({
105
+ navTitle: routeNav === null || routeNav === void 0 ? void 0 : routeNav.title,
106
+ navOrder: routeNav ? nav.indexOf(routeNav) : Infinity,
107
+ title: routeMeta.frontmatter.title,
108
+ link: routeAbsPath,
109
+ sections: [].concat(_toConsumableArray(orphanSection ? [orphanSection] : []), _toConsumableArray(tocSections), _toConsumableArray(tabSections)),
110
+ demos: ((_demosMapping$route$i = demosMapping[route.id]) === null || _demosMapping$route$i === void 0 ? void 0 : _demosMapping$route$i.map(function (demo) {
111
+ return {
112
+ link: "".concat(routeAbsPath, "#").concat(demo.asset.id),
113
+ rawTitle: demo.asset.title || '',
114
+ title: demo.asset.title || routeMeta.frontmatter.title,
115
+ description: demo.asset.description || '',
116
+ keywords: demo.asset.keywords || []
117
+ };
118
+ })) || []
119
+ });
120
+ }
121
+ });
122
+ return metadata;
123
+ }
124
+
125
+ function generateHighlightTexts() {
126
+ var str = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
127
+ var keywords = arguments.length > 1 ? arguments[1] : undefined;
128
+ var chunks = findAll({
129
+ textToHighlight: str,
130
+ searchWords: keywords,
131
+ autoEscape: true
132
+ });
133
+ return [chunks.map(function (_ref3, i) {
134
+ var start = _ref3.start,
135
+ end = _ref3.end,
136
+ highlight = _ref3.highlight;
137
+ var highlightText = {
138
+ text: str.slice(start, end)
139
+ }; // omit long str before the first highlighted text
140
+
141
+ if (i === 0 && !highlight && chunks.length > 1 && highlightText.text.length > 20) {
142
+ highlightText.text = "...".concat(highlightText.text.slice(-20));
143
+ } // mark highlight
144
+
145
+
146
+ if (highlight) {
147
+ highlightText.highlighted = true;
148
+ }
149
+
150
+ return highlightText;
151
+ }), chunks.length];
152
+ }
153
+
154
+ function generateSearchResult(metadata, keywordsStr) {
155
+ var keywords = keywordsStr.split(' ');
156
+ var matchReg = new RegExp(keywordsStr.replace(/[.*+?^${}()|[\]\\]/g, '\\$&').replace(' ', '|'), 'gi');
157
+ var resultMapping = {}; // traverse metadata from all routes
158
+
159
+ metadata.forEach(function (data) {
160
+ var hints = []; // find content & section hints
161
+
162
+ data.sections.forEach(function (sec) {
163
+ // find matched keywords in paragraph
164
+ var _iterator = _createForOfIteratorHelper(sec.paragraphs),
165
+ _step;
166
+
167
+ try {
168
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
169
+ var p = _step.value;
170
+
171
+ if (matchReg.test(p)) {
172
+ var _generateHighlightTex3 = generateHighlightTexts(sec.title, keywords),
173
+ _generateHighlightTex4 = _slicedToArray(_generateHighlightTex3, 2),
174
+ _highlightTitleTexts = _generateHighlightTex4[0],
175
+ _titleMatchCount = _generateHighlightTex4[1];
176
+
177
+ var _generateHighlightTex5 = generateHighlightTexts(p, keywords),
178
+ _generateHighlightTex6 = _slicedToArray(_generateHighlightTex5, 2),
179
+ highlightTexts = _generateHighlightTex6[0],
180
+ matchCount = _generateHighlightTex6[1];
181
+
182
+ hints.push({
183
+ type: 'content',
184
+ link: sec.link,
185
+ priority: _titleMatchCount + matchCount,
186
+ highlightTitleTexts: _highlightTitleTexts,
187
+ highlightTexts: highlightTexts
188
+ }); // match at most once in the same section
189
+
190
+ return;
191
+ }
192
+ } // find matched keywords in section title
193
+
194
+ } catch (err) {
195
+ _iterator.e(err);
196
+ } finally {
197
+ _iterator.f();
198
+ }
199
+
200
+ if (matchReg.test(sec.rawTitle)) {
201
+ var _generateHighlightTex = generateHighlightTexts(sec.title, keywords),
202
+ _generateHighlightTex2 = _slicedToArray(_generateHighlightTex, 2),
203
+ highlightTitleTexts = _generateHighlightTex2[0],
204
+ titleMatchCount = _generateHighlightTex2[1];
205
+
206
+ hints.push({
207
+ type: 'title',
208
+ link: sec.link,
209
+ priority: titleMatchCount,
210
+ highlightTitleTexts: highlightTitleTexts,
211
+ highlightTexts: generateHighlightTexts(sec.paragraphs[0] || '', keywords)[0]
212
+ });
213
+ }
214
+ }); // find demo hints
215
+
216
+ data.demos.forEach(function (demo) {
217
+ if (matchReg.test(demo.rawTitle) || matchReg.test(demo.description)) {
218
+ var _generateHighlightTex7 = generateHighlightTexts(demo.title, keywords),
219
+ _generateHighlightTex8 = _slicedToArray(_generateHighlightTex7, 2),
220
+ highlightTitleTexts = _generateHighlightTex8[0],
221
+ titleMatchCount = _generateHighlightTex8[1];
222
+
223
+ var _generateHighlightTex9 = generateHighlightTexts(demo.description, keywords),
224
+ _generateHighlightTex10 = _slicedToArray(_generateHighlightTex9, 2),
225
+ highlightTexts = _generateHighlightTex10[0],
226
+ matchCount = _generateHighlightTex10[1];
227
+
228
+ hints.push({
229
+ type: 'demo',
230
+ link: demo.link,
231
+ priority: titleMatchCount + matchCount,
232
+ highlightTitleTexts: highlightTitleTexts,
233
+ highlightTexts: highlightTexts
234
+ });
235
+ }
236
+ }); // find page hints
237
+
238
+ if (matchReg.test(data.title)) {
239
+ var _data$sections$;
240
+
241
+ var _generateHighlightTex11 = generateHighlightTexts(data.title, keywords),
242
+ _generateHighlightTex12 = _slicedToArray(_generateHighlightTex11, 2),
243
+ highlightTitleTexts = _generateHighlightTex12[0],
244
+ titleMatchCount = _generateHighlightTex12[1];
245
+
246
+ hints.push({
247
+ type: 'page',
248
+ link: data.link,
249
+ priority: titleMatchCount,
250
+ highlightTitleTexts: highlightTitleTexts,
251
+ highlightTexts: generateHighlightTexts(((_data$sections$ = data.sections[0]) === null || _data$sections$ === void 0 ? void 0 : _data$sections$.paragraphs[0]) || '', keywords)[0]
252
+ });
253
+ } // create nav result if there has any hint
254
+
255
+
256
+ if (hints.length) {
257
+ var _resultMapping$key, _resultMapping$key$hi;
258
+
259
+ var key = data.navTitle || '$ROOT';
260
+ (_resultMapping$key = resultMapping[key]) !== null && _resultMapping$key !== void 0 ? _resultMapping$key : resultMapping[key] = {
261
+ title: data.navTitle,
262
+ priority: data.navOrder,
263
+ hints: []
264
+ };
265
+
266
+ (_resultMapping$key$hi = resultMapping[key].hints).push.apply(_resultMapping$key$hi, _toConsumableArray(hints.sort(function (prev, next) {
267
+ return next.priority - prev.priority;
268
+ })));
269
+ }
270
+ });
271
+ return Object.values(resultMapping).sort(function (prev, next) {
272
+ return next.priority - prev.priority;
273
+ });
274
+ }
275
+
276
+ export var useSiteSearch = function useSiteSearch() {
277
+ var debounceTimer = useRef();
278
+ var routes = useLocaleDocRoutes();
279
+
280
+ var _useSiteData = useSiteData(),
281
+ demos = _useSiteData.demos;
282
+
283
+ var _useState = useState(false),
284
+ _useState2 = _slicedToArray(_useState, 2),
285
+ loading = _useState2[0],
286
+ setLoading = _useState2[1];
287
+
288
+ var _useState3 = useState(''),
289
+ _useState4 = _slicedToArray(_useState3, 2),
290
+ keywords = _useState4[0],
291
+ setKeywords = _useState4[1];
292
+
293
+ var navData = useNavData();
294
+
295
+ var _useState5 = useState([]),
296
+ _useState6 = _slicedToArray(_useState5, 2),
297
+ metadata = _useState6[0],
298
+ setMetadata = _useState6[1];
299
+
300
+ var _useState7 = useState([]),
301
+ _useState8 = _slicedToArray(_useState7, 2),
302
+ result = _useState8[0],
303
+ setResult = _useState8[1];
304
+
305
+ var setter = useCallback(function (val) {
306
+ setLoading(true);
307
+ setKeywords(val);
308
+ }, []);
309
+ useEffect(function () {
310
+ setMetadata(generateSearchMetadata(routes, demos, navData));
311
+ }, [routes, demos, navData]);
312
+ useEffect(function () {
313
+ var str = keywords.trim();
314
+
315
+ if (str) {
316
+ clearTimeout(debounceTimer.current);
317
+ debounceTimer.current = window.setTimeout(function () {
318
+ setResult(generateSearchResult(metadata, str));
319
+ setLoading(false);
320
+ }, 100);
321
+ } else {
322
+ setResult([]);
323
+ }
324
+ }, [keywords, metadata]);
325
+ return {
326
+ keywords: keywords,
327
+ setKeywords: setter,
328
+ result: result,
329
+ loading: loading
330
+ };
331
+ };
@@ -0,0 +1,4 @@
1
+ import type { IRouteMeta } from './types';
2
+ export declare const TAB_QUERY_KEY = "tab";
3
+ export declare const useTabQueryState: () => [string | null, (val?: string) => void];
4
+ export declare const useTabMeta: () => NonNullable<IRouteMeta['tabs']>[0]['meta'] | undefined;
@@ -0,0 +1,47 @@
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 { history, useLocation, useRouteMeta, useSearchParams } from 'dumi';
14
+ import { useCallback } from 'react';
15
+ export var TAB_QUERY_KEY = 'tab';
16
+ export var useTabQueryState = function useTabQueryState() {
17
+ var _useLocation = useLocation(),
18
+ pathname = _useLocation.pathname;
19
+
20
+ var _useSearchParams = useSearchParams(),
21
+ _useSearchParams2 = _slicedToArray(_useSearchParams, 1),
22
+ params = _useSearchParams2[0];
23
+
24
+ var setTabQueryState = useCallback(function (val) {
25
+ if (val) params.set(TAB_QUERY_KEY, val);else params.delete(TAB_QUERY_KEY);
26
+ history.push({
27
+ pathname: pathname,
28
+ search: params.toString()
29
+ });
30
+ }, [params]);
31
+ return [params.get(TAB_QUERY_KEY), setTabQueryState];
32
+ };
33
+ export var useTabMeta = function useTabMeta() {
34
+ var _tabs$find;
35
+
36
+ var _useRouteMeta = useRouteMeta(),
37
+ tabs = _useRouteMeta.tabs;
38
+
39
+ var _useTabQueryState = useTabQueryState(),
40
+ _useTabQueryState2 = _slicedToArray(_useTabQueryState, 1),
41
+ tabKey = _useTabQueryState2[0];
42
+
43
+ return tabs === null || tabs === void 0 ? void 0 : (_tabs$find = tabs.find(function (_ref) {
44
+ var key = _ref.key;
45
+ return tabKey === key;
46
+ })) === null || _tabs$find === void 0 ? void 0 : _tabs$find.meta;
47
+ };
@@ -27,7 +27,7 @@ var configPlugins_default = (api) => {
27
27
  const configDefaults = {
28
28
  resolve: {
29
29
  docDirs: ["docs"],
30
- entityDirs: [{ type: "component", dir: "src" }],
30
+ atomDirs: [{ type: "component", dir: "src" }],
31
31
  codeBlockMode: "active"
32
32
  },
33
33
  themeConfig: {}
@@ -29,7 +29,8 @@ function getSchemas() {
29
29
  return {
30
30
  resolve: (Joi) => Joi.object({
31
31
  docDirs: Joi.array().items(Joi.alternatives(Joi.string(), Joi.object({ dir: Joi.string(), type: Joi.string().optional() }))).optional(),
32
- entityDirs: Joi.array().items(Joi.object({ type: Joi.string(), dir: Joi.string() })).optional(),
32
+ atomDirs: Joi.array().items(Joi.object({ type: Joi.string(), dir: Joi.string() })).optional(),
33
+ entityDirs: Joi.forbidden().error(new Error("`entityDirs` is already deprecated, please rename it to `atomDirs` in `.umirc.ts` or `config/config.ts`")),
33
34
  codeBlockMode: Joi.string().valid("active", "passive").optional(),
34
35
  entryFile: Joi.string().optional()
35
36
  }).optional(),
@@ -1,3 +1,8 @@
1
1
  import type { IApi } from "../types";
2
+ /**
3
+ * exclude pre-compiling modules in mfsu mode
4
+ * and make sure there has no multiple instances problem (such as react)
5
+ */
6
+ export declare function safeExcludeInMFSU(api: IApi, excludes: RegExp[]): void;
2
7
  declare const _default: (api: IApi) => void;
3
8
  export default _default;
@@ -22,12 +22,31 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
22
22
  // src/features/exports.ts
23
23
  var exports_exports = {};
24
24
  __export(exports_exports, {
25
- default: () => exports_default
25
+ default: () => exports_default,
26
+ safeExcludeInMFSU: () => safeExcludeInMFSU
26
27
  });
27
28
  module.exports = __toCommonJS(exports_exports);
28
29
  var import_plugin_utils = require("umi/plugin-utils");
30
+ function safeExcludeInMFSU(api, excludes) {
31
+ if (api.userConfig.mfsu !== false) {
32
+ api.modifyDefaultConfig((memo) => {
33
+ memo.mfsu ?? (memo.mfsu = {});
34
+ memo.mfsu.exclude = (0, import_plugin_utils.deepmerge)(memo.mfsu.exclude || [], excludes);
35
+ memo.extraBabelIncludes ?? (memo.extraBabelIncludes = []);
36
+ memo.extraBabelIncludes.push(...excludes);
37
+ return memo;
38
+ });
39
+ }
40
+ }
29
41
  var exports_default = (api) => {
30
42
  api.describe({ key: void 0 });
43
+ safeExcludeInMFSU(api, [new RegExp("dumi/dist/client")]);
44
+ api.modifyDefaultConfig((memo) => {
45
+ if (api.userConfig.mfsu !== false) {
46
+ memo.mfsu = { strategy: "normal" };
47
+ }
48
+ return memo;
49
+ });
31
50
  api.modifyConfig((memo) => {
32
51
  memo.alias["dumi$"] = "@@/dumi/exports";
33
52
  return memo;
@@ -42,4 +61,6 @@ export * from '${(0, import_plugin_utils.winPath)(require.resolve("../client/the
42
61
  });
43
62
  };
44
63
  // Annotate the CommonJS export names for ESM import in node:
45
- 0 && (module.exports = {});
64
+ 0 && (module.exports = {
65
+ safeExcludeInMFSU
66
+ });