dumi 2.0.0-rc.0 → 2.0.0-rc.2
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.
- package/dist/assetParsers/block.js +1 -1
- package/dist/client/theme-api/DumiDemo.js +1 -1
- package/dist/client/theme-api/types.d.ts +2 -1
- package/dist/client/theme-api/useNavData.js +4 -22
- package/dist/client/theme-api/useRouteMeta.js +4 -3
- package/dist/client/theme-api/useSidebarData.d.ts +11 -0
- package/dist/client/theme-api/useSidebarData.js +122 -25
- package/dist/client/theme-api/utils.d.ts +16 -1
- package/dist/client/theme-api/utils.js +45 -2
- package/dist/features/compile.js +1 -1
- package/dist/features/derivative.js +1 -0
- package/dist/features/locales.js +2 -1
- package/dist/loaders/markdown/index.js +15 -6
- package/dist/loaders/markdown/transformer/index.js +2 -1
- package/dist/loaders/markdown/transformer/rehypeDesc.d.ts +6 -0
- package/dist/loaders/markdown/transformer/rehypeDesc.js +51 -0
- package/dist/loaders/markdown/transformer/remarkEmbed.js +1 -1
- package/package.json +4 -2
- package/theme-default/slots/Hero/index.js +2 -1
- package/theme-default/slots/SearchBar/index.js +14 -2
|
@@ -71,7 +71,7 @@ async function parseBlockAsset(opts) {
|
|
|
71
71
|
return { path: args.path, external: true };
|
|
72
72
|
}
|
|
73
73
|
return {
|
|
74
|
-
path: import_path.default.join(args.resolveDir, args.path),
|
|
74
|
+
path: args.kind !== "entry-point" ? opts.resolver(args.resolveDir, args.path) : import_path.default.join(args.resolveDir, args.path),
|
|
75
75
|
pluginData: { kind: args.kind, resolveDir: args.resolveDir }
|
|
76
76
|
};
|
|
77
77
|
});
|
|
@@ -16,5 +16,5 @@ export var DumiDemo = function DumiDemo(props) {
|
|
|
16
16
|
asset: asset,
|
|
17
17
|
demoUrl: // allow user override demoUrl by frontmatter
|
|
18
18
|
props.previewerProps.demoUrl || "/".concat(SP_ROUTE_PREFIX, "demos/").concat(props.demo.id)
|
|
19
|
-
}, props.previewerProps), /*#__PURE__*/createElement(component));
|
|
19
|
+
}, props.previewerProps), props.previewerProps.iframe ? null : /*#__PURE__*/createElement(component));
|
|
20
20
|
};
|
|
@@ -127,10 +127,11 @@ export declare type ILocalesConfig = ILocale[];
|
|
|
127
127
|
export interface INavItem {
|
|
128
128
|
title: string;
|
|
129
129
|
link: string;
|
|
130
|
+
order: number;
|
|
130
131
|
activePath?: string;
|
|
131
132
|
[key: string]: any;
|
|
132
133
|
}
|
|
133
|
-
interface ISidebarItem {
|
|
134
|
+
export interface ISidebarItem {
|
|
134
135
|
title: string;
|
|
135
136
|
link: string;
|
|
136
137
|
order: number;
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
|
2
|
-
|
|
3
1
|
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
4
2
|
|
|
5
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."); }
|
|
@@ -14,7 +12,7 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
|
14
12
|
|
|
15
13
|
import { useFullSidebarData, useSiteData } from 'dumi';
|
|
16
14
|
import { useState } from 'react';
|
|
17
|
-
import { useLocaleDocRoutes } from "./utils";
|
|
15
|
+
import { pickRouteSortMeta, useLocaleDocRoutes, useRouteDataComparer } from "./utils";
|
|
18
16
|
/**
|
|
19
17
|
* hook for get nav data
|
|
20
18
|
*/
|
|
@@ -26,6 +24,7 @@ export var useNavData = function useNavData() {
|
|
|
26
24
|
themeConfig = _useSiteData.themeConfig;
|
|
27
25
|
|
|
28
26
|
var sidebar = useFullSidebarData();
|
|
27
|
+
var sidebarDataComparer = useRouteDataComparer();
|
|
29
28
|
|
|
30
29
|
var _useState = useState(function () {
|
|
31
30
|
// use user config first
|
|
@@ -37,22 +36,9 @@ export var useNavData = function useNavData() {
|
|
|
37
36
|
groups = _ref2[1];
|
|
38
37
|
|
|
39
38
|
var meta = Object.values(routes).reduce(function (ret, route) {
|
|
40
|
-
var _route$meta, _frontmatter$nav$orde;
|
|
41
|
-
|
|
42
39
|
// find routes which within the nav path
|
|
43
40
|
if (route.path.startsWith(link.slice(1))) {
|
|
44
|
-
|
|
45
|
-
case 'object':
|
|
46
|
-
ret.title = route.meta.frontmatter.nav.title || ret.title;
|
|
47
|
-
ret.order = (_frontmatter$nav$orde = route.meta.frontmatter.nav.order) !== null && _frontmatter$nav$orde !== void 0 ? _frontmatter$nav$orde : ret.order;
|
|
48
|
-
break;
|
|
49
|
-
|
|
50
|
-
case 'string':
|
|
51
|
-
ret.title = route.meta.frontmatter.nav || ret.title;
|
|
52
|
-
break;
|
|
53
|
-
|
|
54
|
-
default:
|
|
55
|
-
}
|
|
41
|
+
pickRouteSortMeta(ret, 'nav', route.meta.frontmatter);
|
|
56
42
|
}
|
|
57
43
|
|
|
58
44
|
return ret;
|
|
@@ -65,11 +51,7 @@ export var useNavData = function useNavData() {
|
|
|
65
51
|
};
|
|
66
52
|
}); // TODO: 2-level nav data
|
|
67
53
|
|
|
68
|
-
return data.sort(
|
|
69
|
-
var _a$title;
|
|
70
|
-
|
|
71
|
-
return a.order - b.order || ((_a$title = a.title) === null || _a$title === void 0 ? void 0 : _a$title.localeCompare(b.title));
|
|
72
|
-
});
|
|
54
|
+
return data.sort(sidebarDataComparer);
|
|
73
55
|
}),
|
|
74
56
|
_useState2 = _slicedToArray(_useState, 1),
|
|
75
57
|
nav = _useState2[0];
|
|
@@ -11,11 +11,12 @@ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Sy
|
|
|
11
11
|
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
12
12
|
|
|
13
13
|
import { matchRoutes, useAppData, useLocation, useRouteData } from 'dumi';
|
|
14
|
-
import { useCallback,
|
|
15
|
-
|
|
14
|
+
import { useCallback, useState } from 'react';
|
|
15
|
+
import { useIsomorphicLayoutEffect } from "./utils";
|
|
16
16
|
/**
|
|
17
17
|
* hook for get matched route meta
|
|
18
18
|
*/
|
|
19
|
+
|
|
19
20
|
export var useRouteMeta = function useRouteMeta() {
|
|
20
21
|
var _useRouteData = useRouteData(),
|
|
21
22
|
route = _useRouteData.route;
|
|
@@ -52,7 +53,7 @@ export var useRouteMeta = function useRouteMeta() {
|
|
|
52
53
|
meta = _useState2[0],
|
|
53
54
|
setMeta = _useState2[1];
|
|
54
55
|
|
|
55
|
-
|
|
56
|
+
useIsomorphicLayoutEffect(function () {
|
|
56
57
|
setMeta(getter);
|
|
57
58
|
}, [clientRoutes.length, pathname]);
|
|
58
59
|
return meta;
|
|
@@ -3,7 +3,18 @@ import type { ISidebarGroup } from './types';
|
|
|
3
3
|
* hook for get sidebar data for all nav
|
|
4
4
|
*/
|
|
5
5
|
export declare const useFullSidebarData: () => Record<string, ISidebarGroup[]>;
|
|
6
|
+
interface ITreeSidebarLeaf {
|
|
7
|
+
path: string;
|
|
8
|
+
title: string;
|
|
9
|
+
order: number;
|
|
10
|
+
children: (ITreeSidebarLeaf | ISidebarGroup)[];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* hook for get full sidebar data in tree structure
|
|
14
|
+
*/
|
|
15
|
+
export declare const useTreeSidebarData: () => ITreeSidebarLeaf[];
|
|
6
16
|
/**
|
|
7
17
|
* hook for get sidebar data for current nav
|
|
8
18
|
*/
|
|
9
19
|
export declare const useSidebarData: () => ISidebarGroup[];
|
|
20
|
+
export {};
|
|
@@ -1,3 +1,11 @@
|
|
|
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 _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; } } }; }
|
|
8
|
+
|
|
1
9
|
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
2
10
|
|
|
3
11
|
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."); }
|
|
@@ -6,8 +14,6 @@ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symb
|
|
|
6
14
|
|
|
7
15
|
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
8
16
|
|
|
9
|
-
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
|
10
|
-
|
|
11
17
|
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
12
18
|
|
|
13
19
|
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."); }
|
|
@@ -22,7 +28,7 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
|
22
28
|
|
|
23
29
|
import { useLocale, useLocation, useSiteData } from 'dumi';
|
|
24
30
|
import { useState } from 'react';
|
|
25
|
-
import { useLocaleDocRoutes } from "./utils";
|
|
31
|
+
import { pickRouteSortMeta, useLocaleDocRoutes, useRouteDataComparer } from "./utils";
|
|
26
32
|
var DEFAULT_GROUP_STUB_TITLE = '$default-group-title';
|
|
27
33
|
|
|
28
34
|
var getLocaleClearPath = function getLocaleClearPath(routePath, locale) {
|
|
@@ -40,6 +46,8 @@ export var useFullSidebarData = function useFullSidebarData() {
|
|
|
40
46
|
var _useSiteData = useSiteData(),
|
|
41
47
|
themeConfig = _useSiteData.themeConfig;
|
|
42
48
|
|
|
49
|
+
var sidebarDataComparer = useRouteDataComparer();
|
|
50
|
+
|
|
43
51
|
var _useState = useState(function () {
|
|
44
52
|
// auto generate sidebar data from routes
|
|
45
53
|
var data = Object.values(routes).reduce(function (ret, route) {
|
|
@@ -55,12 +63,11 @@ export var useFullSidebarData = function useFullSidebarData() {
|
|
|
55
63
|
// en-US/a/b => /en-US/a
|
|
56
64
|
var parentPath = "/".concat(route.path.replace(/\/[^/]+$/, ''));
|
|
57
65
|
|
|
58
|
-
var
|
|
59
|
-
|
|
60
|
-
},
|
|
61
|
-
title =
|
|
62
|
-
|
|
63
|
-
order = _ref$order === void 0 ? 0 : _ref$order;
|
|
66
|
+
var _pickRouteSortMeta = pickRouteSortMeta({
|
|
67
|
+
order: 0
|
|
68
|
+
}, 'group', route.meta.frontmatter),
|
|
69
|
+
title = _pickRouteSortMeta.title,
|
|
70
|
+
order = _pickRouteSortMeta.order;
|
|
64
71
|
|
|
65
72
|
var titleKey = title || DEFAULT_GROUP_STUB_TITLE; // create group data by nav path & group name
|
|
66
73
|
|
|
@@ -80,25 +87,15 @@ export var useFullSidebarData = function useFullSidebarData() {
|
|
|
80
87
|
return ret;
|
|
81
88
|
}, {}); // destruct sidebar data into sidebar config
|
|
82
89
|
|
|
83
|
-
var sidebarConfig = Object.entries(data).reduce(function (ret,
|
|
84
|
-
var
|
|
85
|
-
navPath =
|
|
86
|
-
groups =
|
|
87
|
-
|
|
88
|
-
ret[navPath] = Object.values(groups).sort(function (a, b) {
|
|
89
|
-
var _a$title;
|
|
90
|
+
var sidebarConfig = Object.entries(data).reduce(function (ret, _ref) {
|
|
91
|
+
var _ref2 = _slicedToArray(_ref, 2),
|
|
92
|
+
navPath = _ref2[0],
|
|
93
|
+
groups = _ref2[1];
|
|
90
94
|
|
|
91
|
-
|
|
92
|
-
a.order - b.order || (a.title ? // sort by group title
|
|
93
|
-
(_a$title = a.title) === null || _a$title === void 0 ? void 0 : _a$title.localeCompare(b.title || '') : // put non-title group at the end
|
|
94
|
-
1)
|
|
95
|
-
);
|
|
96
|
-
}); // sort group children by order or title
|
|
95
|
+
ret[navPath] = Object.values(groups).sort(sidebarDataComparer); // sort group children by order or title
|
|
97
96
|
|
|
98
97
|
ret[navPath].forEach(function (group) {
|
|
99
|
-
return group.children.sort(
|
|
100
|
-
return a.order - b.order || a.title.localeCompare(b.title);
|
|
101
|
-
});
|
|
98
|
+
return group.children.sort(sidebarDataComparer);
|
|
102
99
|
});
|
|
103
100
|
return ret;
|
|
104
101
|
}, {}); // allow user partial override
|
|
@@ -110,6 +107,106 @@ export var useFullSidebarData = function useFullSidebarData() {
|
|
|
110
107
|
|
|
111
108
|
return sidebar;
|
|
112
109
|
};
|
|
110
|
+
|
|
111
|
+
function getLeafMeta(data) {
|
|
112
|
+
var leafMeta = {
|
|
113
|
+
order: 0,
|
|
114
|
+
title: ''
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
var _iterator = _createForOfIteratorHelper(data),
|
|
118
|
+
_step;
|
|
119
|
+
|
|
120
|
+
try {
|
|
121
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
122
|
+
var group = _step.value;
|
|
123
|
+
|
|
124
|
+
var _iterator2 = _createForOfIteratorHelper(group.children),
|
|
125
|
+
_step2;
|
|
126
|
+
|
|
127
|
+
try {
|
|
128
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
129
|
+
var item = _step2.value;
|
|
130
|
+
|
|
131
|
+
if ('frontmatter' in item) {
|
|
132
|
+
pickRouteSortMeta(leafMeta, 'nav', item.frontmatter);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
} catch (err) {
|
|
136
|
+
_iterator2.e(err);
|
|
137
|
+
} finally {
|
|
138
|
+
_iterator2.f();
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
} catch (err) {
|
|
142
|
+
_iterator.e(err);
|
|
143
|
+
} finally {
|
|
144
|
+
_iterator.f();
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return leafMeta;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* hook for get full sidebar data in tree structure
|
|
151
|
+
*/
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
export var useTreeSidebarData = function useTreeSidebarData() {
|
|
155
|
+
var original = useFullSidebarData();
|
|
156
|
+
var sidebarDataComparer = useRouteDataComparer();
|
|
157
|
+
|
|
158
|
+
var _useState3 = useState(function () {
|
|
159
|
+
var data = Object.entries(original) // match from the deepest level
|
|
160
|
+
.sort(function (a, b) {
|
|
161
|
+
return b[0].split('/').length - a[0].split('/').length;
|
|
162
|
+
}).reduce(function (ret, _ref3) {
|
|
163
|
+
var _ref4 = _slicedToArray(_ref3, 2),
|
|
164
|
+
path = _ref4[0],
|
|
165
|
+
data = _ref4[1];
|
|
166
|
+
|
|
167
|
+
var parent = path.replace(/\/[^/]+$/, '');
|
|
168
|
+
|
|
169
|
+
if (parent) {
|
|
170
|
+
var _ret$parent;
|
|
171
|
+
|
|
172
|
+
// handle nested sidebar data
|
|
173
|
+
// init parent first
|
|
174
|
+
(_ret$parent = ret[parent]) !== null && _ret$parent !== void 0 ? _ret$parent : ret[parent] = _objectSpread({
|
|
175
|
+
path: parent,
|
|
176
|
+
children: original[parent] || []
|
|
177
|
+
}, getLeafMeta(original[parent] || []));
|
|
178
|
+
|
|
179
|
+
if (ret[path]) {
|
|
180
|
+
// sort children first
|
|
181
|
+
ret[path].children.sort(sidebarDataComparer); // put n-level sidebar data as parent children
|
|
182
|
+
|
|
183
|
+
ret[parent].children.push(ret[path]);
|
|
184
|
+
delete ret[path];
|
|
185
|
+
} else {
|
|
186
|
+
var _ret$parent$children;
|
|
187
|
+
|
|
188
|
+
// put last-level sidebar data as parent children
|
|
189
|
+
(_ret$parent$children = ret[parent].children).push.apply(_ret$parent$children, _toConsumableArray(data));
|
|
190
|
+
}
|
|
191
|
+
} else {
|
|
192
|
+
// sort children first
|
|
193
|
+
data.sort(sidebarDataComparer); // put top-level sidebar data
|
|
194
|
+
|
|
195
|
+
ret[path] = _objectSpread({
|
|
196
|
+
path: path,
|
|
197
|
+
children: data
|
|
198
|
+
}, getLeafMeta(data));
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
return ret;
|
|
202
|
+
}, {});
|
|
203
|
+
return Object.values(data);
|
|
204
|
+
}),
|
|
205
|
+
_useState4 = _slicedToArray(_useState3, 1),
|
|
206
|
+
sidebar = _useState4[0];
|
|
207
|
+
|
|
208
|
+
return sidebar;
|
|
209
|
+
};
|
|
113
210
|
/**
|
|
114
211
|
* hook for get sidebar data for current nav
|
|
115
212
|
*/
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
import type { INavItem, IRouteMeta, IRoutesById } from './types';
|
|
2
3
|
export declare const useLocaleDocRoutes: () => IRoutesById;
|
|
3
4
|
/**
|
|
4
5
|
* 在 react 18 中需要新的 render 方式,这个函数用来处理不同的 jsx 模式。
|
|
@@ -6,3 +7,17 @@ export declare const useLocaleDocRoutes: () => IRoutesById;
|
|
|
6
7
|
* @returns code string
|
|
7
8
|
*/
|
|
8
9
|
export declare const genReactRenderCode: (version: string) => string;
|
|
10
|
+
export declare const useIsomorphicLayoutEffect: typeof useEffect;
|
|
11
|
+
/**
|
|
12
|
+
* common comparer for sidebar/nav items
|
|
13
|
+
*/
|
|
14
|
+
export declare const useRouteDataComparer: <T extends {
|
|
15
|
+
order?: number | undefined;
|
|
16
|
+
link?: string | undefined;
|
|
17
|
+
path?: string | undefined;
|
|
18
|
+
title?: string | undefined;
|
|
19
|
+
}>() => (a: T, b: T) => number;
|
|
20
|
+
/**
|
|
21
|
+
* common util for pick meta to sort sidebar/nav items
|
|
22
|
+
*/
|
|
23
|
+
export declare const pickRouteSortMeta: (original: Partial<Pick<INavItem, 'order' | 'title'>>, field: 'nav' | 'group', fm: IRouteMeta['frontmatter']) => Partial<Pick<INavItem, "title" | "order">>;
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
|
2
|
+
|
|
1
3
|
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
2
4
|
|
|
3
5
|
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
@@ -11,7 +13,8 @@ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Sy
|
|
|
11
13
|
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
12
14
|
|
|
13
15
|
import { useAppData, useIntl, useSiteData } from 'dumi';
|
|
14
|
-
import { useState } from 'react';
|
|
16
|
+
import { useCallback, useEffect, useLayoutEffect, useState } from 'react';
|
|
17
|
+
import { useLocale } from "./useLocale";
|
|
15
18
|
export var useLocaleDocRoutes = function useLocaleDocRoutes() {
|
|
16
19
|
var intl = useIntl();
|
|
17
20
|
|
|
@@ -55,5 +58,45 @@ export var genReactRenderCode = function genReactRenderCode(version) {
|
|
|
55
58
|
return "".concat(annotation, "\n\nimport React from 'react';\nimport { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\n\nconst rootElement = document.getElementById(\"root\");\nconst root = createRoot(rootElement);\n\nroot.render(<App />);");
|
|
56
59
|
}
|
|
57
60
|
|
|
58
|
-
return "".concat(annotation, "\n
|
|
61
|
+
return "".concat(annotation, "\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './App';\n\nReactDOM.render(\n <App />,\n document.getElementById('root'),\n);");
|
|
62
|
+
};
|
|
63
|
+
export var useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;
|
|
64
|
+
/**
|
|
65
|
+
* common comparer for sidebar/nav items
|
|
66
|
+
*/
|
|
67
|
+
|
|
68
|
+
export var useRouteDataComparer = function useRouteDataComparer() {
|
|
69
|
+
var locale = useLocale();
|
|
70
|
+
return useCallback(function (a, b) {
|
|
71
|
+
return (// smaller before larger for all
|
|
72
|
+
('order' in a && 'order' in b ? a.order - b.order : 0) || ( // shallower before deeper for sidebar item
|
|
73
|
+
'link' in a && 'link' in b ? a.link.split('/').length - b.link.split('/').length : 0) || ( // shallower before deeper for sidebar leaf
|
|
74
|
+
'path' in a && 'path' in b ? a.path.split('/').length - b.path.split('/').length : 0) || ( // fallback to compare title (put non-title item at the end)
|
|
75
|
+
a.title ? a.title.localeCompare(b.title || '', locale.id) : -1)
|
|
76
|
+
);
|
|
77
|
+
}, []);
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* common util for pick meta to sort sidebar/nav items
|
|
81
|
+
*/
|
|
82
|
+
|
|
83
|
+
export var pickRouteSortMeta = function pickRouteSortMeta(original, field, fm) {
|
|
84
|
+
var _sub$order;
|
|
85
|
+
|
|
86
|
+
var sub = fm[field];
|
|
87
|
+
|
|
88
|
+
switch (_typeof(sub)) {
|
|
89
|
+
case 'object':
|
|
90
|
+
original.title = sub.title || original.title;
|
|
91
|
+
original.order = (_sub$order = sub.order) !== null && _sub$order !== void 0 ? _sub$order : original.order;
|
|
92
|
+
break;
|
|
93
|
+
|
|
94
|
+
case 'string':
|
|
95
|
+
original.title = sub || original.title;
|
|
96
|
+
break;
|
|
97
|
+
|
|
98
|
+
default:
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return original;
|
|
59
102
|
};
|
package/dist/features/compile.js
CHANGED
|
@@ -67,7 +67,7 @@ var compile_default = (api) => {
|
|
|
67
67
|
memo.module.rule("dumi-page").type("javascript/auto").test(/\.(j|t)sx?$/).resourceQuery(/meta$/).use("page-meta-loader").loader(require.resolve("../loaders/page"));
|
|
68
68
|
memo.module.rule("dumi-demo").type("javascript/auto").test(/\..+$/).enforce("pre").resourceQuery(/techStack/).use("demo-loader").loader(require.resolve("../loaders/demo")).options({ techStacks, cwd: api.cwd });
|
|
69
69
|
memo.module.rule("dumi-raw").resourceQuery(/raw/).use("raw-loader").loader(require.resolve("raw-loader"));
|
|
70
|
-
if (api.env === "development") {
|
|
70
|
+
if (api.env === "development" && memo.plugins.has("fastRefresh")) {
|
|
71
71
|
memo.plugin("fastRefresh").tap(([params]) => [
|
|
72
72
|
{
|
|
73
73
|
...params,
|
|
@@ -103,6 +103,7 @@ var derivative_default = (api) => {
|
|
|
103
103
|
api.addRuntimePlugin(() => {
|
|
104
104
|
return strategies.appJS().slice(0, 1);
|
|
105
105
|
});
|
|
106
|
+
api.registerPlugins([require.resolve("@umijs/plugins/dist/analytics")]);
|
|
106
107
|
};
|
|
107
108
|
// Annotate the CommonJS export names for ESM import in node:
|
|
108
109
|
0 && (module.exports = {
|
package/dist/features/locales.js
CHANGED
|
@@ -77,6 +77,7 @@ export const messages = ${JSON.stringify(api.service.themeData.locales, null, 2)
|
|
|
77
77
|
import { history } from 'dumi';
|
|
78
78
|
import React, { useState, useLayoutEffect, useCallback, type ReactNode } from 'react';
|
|
79
79
|
import { RawIntlProvider, createIntl, createIntlCache } from '${(0, import_plugin_utils.winPath)(import_path.default.dirname(require.resolve("react-intl/package")))}';
|
|
80
|
+
import { useIsomorphicLayoutEffect } from '${(0, import_plugin_utils.winPath)(require.resolve("../client/theme-api/utils"))}'
|
|
80
81
|
import { locales, messages } from './config';
|
|
81
82
|
|
|
82
83
|
const cache = createIntlCache();
|
|
@@ -96,7 +97,7 @@ const LocalesContainer: FC<{ children: ReactNode }> = (props) => {
|
|
|
96
97
|
}, []);
|
|
97
98
|
const [intl, setIntl] = useState(() => getIntl());
|
|
98
99
|
|
|
99
|
-
|
|
100
|
+
useIsomorphicLayoutEffect(() => {
|
|
100
101
|
return history.listen(() => {
|
|
101
102
|
setIntl(getIntl());
|
|
102
103
|
});
|
|
@@ -31,10 +31,19 @@ var import_fs = __toESM(require("fs"));
|
|
|
31
31
|
var import_plugin_utils = require("umi/plugin-utils");
|
|
32
32
|
var import_transformer = __toESM(require("./transformer"));
|
|
33
33
|
var import_rehypeText = require("./transformer/rehypeText");
|
|
34
|
+
function getDemoSourceFiles(demos = []) {
|
|
35
|
+
return demos.reduce((ret, demo) => {
|
|
36
|
+
if ("sources" in demo) {
|
|
37
|
+
ret.push(...Object.values(demo.sources));
|
|
38
|
+
}
|
|
39
|
+
return ret;
|
|
40
|
+
}, []);
|
|
41
|
+
}
|
|
34
42
|
function emit(opts, ret) {
|
|
35
43
|
if (opts.mode === "meta") {
|
|
36
44
|
const { demos, frontmatter, toc, texts, embeds = [] } = ret.meta;
|
|
37
45
|
embeds.forEach((file) => this.addDependency(file));
|
|
46
|
+
getDemoSourceFiles(demos).forEach((file) => this.addDependency(file));
|
|
38
47
|
if (demos && opts.onResolveDemos) {
|
|
39
48
|
opts.onResolveDemos(demos);
|
|
40
49
|
}
|
|
@@ -87,11 +96,11 @@ function DumiMarkdownContent() {
|
|
|
87
96
|
export default DumiMarkdownContent;`;
|
|
88
97
|
}
|
|
89
98
|
}
|
|
90
|
-
function
|
|
91
|
-
return JSON.stringify(
|
|
99
|
+
function getDepsCacheKey(deps = []) {
|
|
100
|
+
return JSON.stringify(deps.map((file) => `${file}:${import_fs.default.statSync(file).mtimeMs}`));
|
|
92
101
|
}
|
|
93
102
|
var deferrer = {};
|
|
94
|
-
var
|
|
103
|
+
var depsMapping = {};
|
|
95
104
|
function mdLoader(content) {
|
|
96
105
|
const opts = this.getOptions();
|
|
97
106
|
const cb = this.async();
|
|
@@ -103,7 +112,7 @@ function mdLoader(content) {
|
|
|
103
112
|
].join(":");
|
|
104
113
|
const cacheKey = [
|
|
105
114
|
baseCacheKey,
|
|
106
|
-
|
|
115
|
+
getDepsCacheKey(depsMapping[this.resourcePath])
|
|
107
116
|
].join(":");
|
|
108
117
|
const cacheRet = cache.getSync(cacheKey, "");
|
|
109
118
|
if (cacheRet) {
|
|
@@ -120,11 +129,11 @@ function mdLoader(content) {
|
|
|
120
129
|
fileAbsPath: this.resourcePath
|
|
121
130
|
});
|
|
122
131
|
deferrer[cacheKey].then((ret) => {
|
|
132
|
+
depsMapping[this.resourcePath] = (ret.meta.embeds || []).concat(getDemoSourceFiles(ret.meta.demos));
|
|
123
133
|
const finalCacheKey = [
|
|
124
134
|
baseCacheKey,
|
|
125
|
-
|
|
135
|
+
getDepsCacheKey(depsMapping[this.resourcePath])
|
|
126
136
|
].join(":");
|
|
127
|
-
embedsMapping[this.resourcePath] = ret.meta.embeds || [];
|
|
128
137
|
cache.setSync(finalCacheKey, ret);
|
|
129
138
|
cb(null, emit.call(this, opts, ret));
|
|
130
139
|
}).catch(cb);
|
|
@@ -27,6 +27,7 @@ __export(transformer_exports, {
|
|
|
27
27
|
module.exports = __toCommonJS(transformer_exports);
|
|
28
28
|
var import_enhanced_resolve = __toESM(require("enhanced-resolve"));
|
|
29
29
|
var import_rehypeDemo = __toESM(require("./rehypeDemo"));
|
|
30
|
+
var import_rehypeDesc = __toESM(require("./rehypeDesc"));
|
|
30
31
|
var import_rehypeEnhancedTag = __toESM(require("./rehypeEnhancedTag"));
|
|
31
32
|
var import_rehypeImg = __toESM(require("./rehypeImg"));
|
|
32
33
|
var import_rehypeIsolation = __toESM(require("./rehypeIsolation"));
|
|
@@ -73,7 +74,7 @@ var transformer_default = async (raw, opts) => {
|
|
|
73
74
|
fileAbsPath: opts.fileAbsPath,
|
|
74
75
|
resolve: opts.resolve,
|
|
75
76
|
resolver
|
|
76
|
-
}).use(import_rehypeSlug.default).use(rehypeAutolinkHeadings).use(import_rehypeIsolation.default).use(import_rehypeEnhancedTag.default).use(import_rehypeText.default);
|
|
77
|
+
}).use(import_rehypeSlug.default).use(rehypeAutolinkHeadings).use(import_rehypeIsolation.default).use(import_rehypeEnhancedTag.default).use(import_rehypeDesc.default).use(import_rehypeText.default);
|
|
77
78
|
(_b = opts.extraRehypePlugins) == null ? void 0 : _b.forEach((plugin) => applyUnifiedPlugin({
|
|
78
79
|
plugin,
|
|
79
80
|
processor,
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod));
|
|
20
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
21
|
+
|
|
22
|
+
// src/loaders/markdown/transformer/rehypeDesc.ts
|
|
23
|
+
var rehypeDesc_exports = {};
|
|
24
|
+
__export(rehypeDesc_exports, {
|
|
25
|
+
default: () => rehypeDesc
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(rehypeDesc_exports);
|
|
28
|
+
var visit;
|
|
29
|
+
var EXIT;
|
|
30
|
+
var toString;
|
|
31
|
+
(async () => {
|
|
32
|
+
({ visit, EXIT } = await import("unist-util-visit"));
|
|
33
|
+
({ toString } = await import("hast-util-to-string"));
|
|
34
|
+
})();
|
|
35
|
+
function rehypeDesc() {
|
|
36
|
+
return async (tree, vFile) => {
|
|
37
|
+
if (!vFile.data.frontmatter.description) {
|
|
38
|
+
visit(tree, "element", (node) => {
|
|
39
|
+
if (node.tagName === "p") {
|
|
40
|
+
const text = toString(node).trim();
|
|
41
|
+
if (text) {
|
|
42
|
+
vFile.data.frontmatter.description = text;
|
|
43
|
+
return EXIT;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
51
|
+
0 && (module.exports = {});
|
|
@@ -68,7 +68,7 @@ function remarkEmbed(opts) {
|
|
|
68
68
|
} else if (hash.startsWith("RE-")) {
|
|
69
69
|
content = (0, import_utils.getFileContentByRegExp)(content, hash.slice(3), absPath);
|
|
70
70
|
}
|
|
71
|
-
const mdast = unified().use(remarkParse).use(remarkFrontmatter).use(remarkRawAST).processSync(content).result;
|
|
71
|
+
const mdast = unified().use(remarkParse).use(remarkEmbed, { ...opts, fileAbsPath: absPath }).use(remarkFrontmatter).use(remarkRawAST).processSync(content).result;
|
|
72
72
|
if (!node.value.endsWith(EMBED_CLOSE_TAG)) {
|
|
73
73
|
for (let j = i; j < parent.children.length; j++) {
|
|
74
74
|
const sibling = parent.children[j];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dumi",
|
|
3
|
-
"version": "2.0.0-rc.
|
|
3
|
+
"version": "2.0.0-rc.2",
|
|
4
4
|
"description": "Framework for developing UI components",
|
|
5
5
|
"keywords": [],
|
|
6
6
|
"license": "MIT",
|
|
@@ -21,10 +21,11 @@
|
|
|
21
21
|
"dev": "father dev",
|
|
22
22
|
"docs:build": "node ./bin/dumi.js build",
|
|
23
23
|
"docs:dev": "node ./bin/dumi.js dev",
|
|
24
|
+
"docs:sync": "node ./scripts/sync-from-umi.js",
|
|
24
25
|
"lint": "npm run lint:es && npm run lint:css",
|
|
25
26
|
"lint:css": "stylelint \"{src,test}/**/*.{css,less}\"",
|
|
26
27
|
"lint:es": "eslint \"{src,test}/**/*.{js,jsx,ts,tsx}\"",
|
|
27
|
-
"prepare": "npm run build && node ./bin/dumi.js setup",
|
|
28
|
+
"prepare": "npm run build && node ./bin/dumi.js setup && npm run docs:sync",
|
|
28
29
|
"prepublishOnly": "npm run build",
|
|
29
30
|
"test": "vitest"
|
|
30
31
|
},
|
|
@@ -58,6 +59,7 @@
|
|
|
58
59
|
"@types/mdast": "^3.0.10",
|
|
59
60
|
"@umijs/bundler-utils": "^4.0.29",
|
|
60
61
|
"@umijs/core": "^4.0.29",
|
|
62
|
+
"@umijs/plugins": "^4.0.29",
|
|
61
63
|
"codesandbox": "^2.2.3",
|
|
62
64
|
"deepmerge": "^4.2.2",
|
|
63
65
|
"dumi-afx-deps": "^1.0.0-alpha.1",
|
|
@@ -24,7 +24,8 @@ var Hero = function Hero() {
|
|
|
24
24
|
return /^(\w+:)\/\/|^(mailto|tel):/.test(link) ? /*#__PURE__*/React.createElement("a", {
|
|
25
25
|
href: link,
|
|
26
26
|
target: "_blank",
|
|
27
|
-
rel: "noreferrer"
|
|
27
|
+
rel: "noreferrer",
|
|
28
|
+
key: text
|
|
28
29
|
}, text) : /*#__PURE__*/React.createElement(Link, {
|
|
29
30
|
key: text,
|
|
30
31
|
to: link
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
var _navigator;
|
|
2
|
+
|
|
1
3
|
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
2
4
|
|
|
3
5
|
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
@@ -15,7 +17,7 @@ import { useIntl, useSiteSearch } from 'dumi';
|
|
|
15
17
|
import React, { useEffect, useRef, useState } from 'react';
|
|
16
18
|
import { SearchResult } from "../SearchResult";
|
|
17
19
|
import "./index.less";
|
|
18
|
-
var isAppleDevice = /(mac|iphone|ipod|ipad)/i.test(navigator.platform);
|
|
20
|
+
var isAppleDevice = /(mac|iphone|ipod|ipad)/i.test(typeof navigator !== 'undefined' ? (_navigator = navigator) === null || _navigator === void 0 ? void 0 : _navigator.platform : '');
|
|
19
21
|
|
|
20
22
|
var SearchBar = function SearchBar() {
|
|
21
23
|
var intl = useIntl();
|
|
@@ -27,7 +29,11 @@ var SearchBar = function SearchBar() {
|
|
|
27
29
|
setFocusing = _useState2[1];
|
|
28
30
|
|
|
29
31
|
var input = useRef(null);
|
|
30
|
-
|
|
32
|
+
|
|
33
|
+
var _useState3 = useState('⌘'),
|
|
34
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
35
|
+
symbol = _useState4[0],
|
|
36
|
+
setSymbol = _useState4[1];
|
|
31
37
|
|
|
32
38
|
var _useSiteSearch = useSiteSearch(),
|
|
33
39
|
keywords = _useSiteSearch.keywords,
|
|
@@ -36,6 +42,12 @@ var SearchBar = function SearchBar() {
|
|
|
36
42
|
loading = _useSiteSearch.loading;
|
|
37
43
|
|
|
38
44
|
useEffect(function () {
|
|
45
|
+
// why put useEffect?
|
|
46
|
+
// to avoid Text content mismatch between server & client in ssr
|
|
47
|
+
if (!isAppleDevice) {
|
|
48
|
+
setSymbol('Ctrl');
|
|
49
|
+
}
|
|
50
|
+
|
|
39
51
|
var handler = function handler(ev) {
|
|
40
52
|
if ((isAppleDevice ? ev.metaKey : ev.ctrlKey) && ev.key === 'k') {
|
|
41
53
|
var _input$current;
|