dumi 2.2.0-rc.0 → 2.2.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.
- package/dist/client/theme-api/context.d.ts +4 -0
- package/dist/client/theme-api/context.js +2 -1
- package/dist/client/theme-api/types.d.ts +6 -2
- package/dist/client/theme-api/useNavData.js +13 -12
- package/dist/client/theme-api/useSidebarData.js +33 -23
- package/dist/client/theme-api/utils.d.ts +1 -1
- package/dist/client/theme-api/utils.js +1 -1
- package/dist/constants.d.ts +1 -0
- package/dist/constants.js +5 -2
- package/dist/features/routes.js +2 -1
- package/dist/features/theme/index.js +15 -0
- package/package.json +1 -1
- package/theme-default/slots/Navbar/index.less +5 -3
|
@@ -16,6 +16,10 @@ interface ISiteContext {
|
|
|
16
16
|
themeConfig: IThemeConfig;
|
|
17
17
|
loading: boolean;
|
|
18
18
|
setLoading: (status: boolean) => void;
|
|
19
|
+
/**
|
|
20
|
+
* private field, do not use it in your code
|
|
21
|
+
*/
|
|
22
|
+
_2_level_nav_available: boolean;
|
|
19
23
|
}
|
|
20
24
|
export declare const SiteContext: import("react").Context<ISiteContext>;
|
|
21
25
|
export declare const useSiteData: () => ISiteContext;
|
|
@@ -8,7 +8,8 @@ export var SiteContext = /*#__PURE__*/createContext({
|
|
|
8
8
|
locales: [],
|
|
9
9
|
themeConfig: {},
|
|
10
10
|
loading: false,
|
|
11
|
-
setLoading: function setLoading() {}
|
|
11
|
+
setLoading: function setLoading() {},
|
|
12
|
+
_2_level_nav_available: true
|
|
12
13
|
});
|
|
13
14
|
export var useSiteData = function useSiteData() {
|
|
14
15
|
return useContext(SiteContext);
|
|
@@ -59,7 +59,7 @@ export interface IRouteMeta {
|
|
|
59
59
|
nav?: string | {
|
|
60
60
|
title?: string;
|
|
61
61
|
order?: number;
|
|
62
|
-
|
|
62
|
+
second?: Omit<IRouteMeta['frontmatter']['nav'], 'second'>;
|
|
63
63
|
};
|
|
64
64
|
group?: string | {
|
|
65
65
|
title?: string;
|
|
@@ -103,7 +103,7 @@ export interface IRouteMeta {
|
|
|
103
103
|
depth: number;
|
|
104
104
|
title: string;
|
|
105
105
|
/**
|
|
106
|
-
* private field,
|
|
106
|
+
* private field, do not use it in your code
|
|
107
107
|
*/
|
|
108
108
|
_debug_demo?: boolean;
|
|
109
109
|
}[];
|
|
@@ -135,6 +135,10 @@ export interface IRouteMeta {
|
|
|
135
135
|
[key: string]: any;
|
|
136
136
|
};
|
|
137
137
|
}[];
|
|
138
|
+
/**
|
|
139
|
+
* private field, do not use it in your code
|
|
140
|
+
*/
|
|
141
|
+
_atom_route?: boolean;
|
|
138
142
|
}
|
|
139
143
|
declare type IBasicLocale = {
|
|
140
144
|
id: string;
|
|
@@ -47,7 +47,8 @@ export var useNavData = function useNavData() {
|
|
|
47
47
|
var routes = useLocaleDocRoutes();
|
|
48
48
|
|
|
49
49
|
var _useSiteData = useSiteData(),
|
|
50
|
-
themeConfig = _useSiteData.themeConfig
|
|
50
|
+
themeConfig = _useSiteData.themeConfig,
|
|
51
|
+
is2LevelNav = _useSiteData._2_level_nav_available;
|
|
51
52
|
|
|
52
53
|
var sidebar = useFullSidebarData();
|
|
53
54
|
var sidebarDataComparer = useRouteDataComparer();
|
|
@@ -91,36 +92,36 @@ export var useNavData = function useNavData() {
|
|
|
91
92
|
parentPath = _ref8[1],
|
|
92
93
|
restPath = _ref8[2];
|
|
93
94
|
|
|
94
|
-
var isNestedNav = Boolean(restPath);
|
|
95
|
+
var isNestedNav = Boolean(restPath) && is2LevelNav;
|
|
95
96
|
|
|
96
97
|
var _Object$values$reduce = Object.values(routes).reduce(function (ret, route) {
|
|
97
98
|
// find routes which within the nav path
|
|
98
99
|
if (route.path.startsWith(link.slice(1))) {
|
|
99
100
|
pickRouteSortMeta(ret[0], 'nav', route.meta.frontmatter); // generate parent meta for nested nav
|
|
100
101
|
|
|
101
|
-
if (isNestedNav) pickRouteSortMeta(ret[1], 'nav.
|
|
102
|
+
if (isNestedNav) pickRouteSortMeta(ret[1], 'nav.second', route.meta.frontmatter);
|
|
102
103
|
}
|
|
103
104
|
|
|
104
105
|
return ret;
|
|
105
106
|
}, [{}, {}]),
|
|
106
107
|
_Object$values$reduce2 = _slicedToArray(_Object$values$reduce, 2),
|
|
107
|
-
|
|
108
|
-
|
|
108
|
+
firstMeta = _Object$values$reduce2[0],
|
|
109
|
+
secondMeta = _Object$values$reduce2[1];
|
|
109
110
|
|
|
110
111
|
if (isNestedNav) {
|
|
111
|
-
var
|
|
112
|
+
var _firstMeta$title, _ret$parentPath, _second$children;
|
|
112
113
|
|
|
113
|
-
// fallback to use parent path as title
|
|
114
|
-
(
|
|
114
|
+
// fallback to use parent path as 1-level nav title
|
|
115
|
+
(_firstMeta$title = firstMeta.title) !== null && _firstMeta$title !== void 0 ? _firstMeta$title : firstMeta.title = parentPath.slice(1).replace(/^[a-z]/, function (s) {
|
|
115
116
|
return s.toUpperCase();
|
|
116
117
|
}); // handle nested nav item as parent children
|
|
117
118
|
|
|
118
|
-
var
|
|
119
|
-
(
|
|
120
|
-
ret[parentPath].children.push(genNavItem(
|
|
119
|
+
var second = (_ret$parentPath = ret[parentPath]) !== null && _ret$parentPath !== void 0 ? _ret$parentPath : ret[parentPath] = genNavItem(firstMeta, groups, parentPath);
|
|
120
|
+
(_second$children = second.children) !== null && _second$children !== void 0 ? _second$children : second.children = [];
|
|
121
|
+
ret[parentPath].children.push(genNavItem(secondMeta, groups, link, groups[0].children[0].link));
|
|
121
122
|
} else {
|
|
122
123
|
// handle root nav item
|
|
123
|
-
ret[link] = genNavItem(
|
|
124
|
+
ret[link] = genNavItem(firstMeta, groups, link, groups[0].children[0].link);
|
|
124
125
|
}
|
|
125
126
|
|
|
126
127
|
return ret;
|
|
@@ -39,12 +39,18 @@ var getLocaleClearPath = function getLocaleClearPath(routePath, locale) {
|
|
|
39
39
|
*/
|
|
40
40
|
|
|
41
41
|
|
|
42
|
-
function getRouteParentPath(path,
|
|
43
|
-
var
|
|
42
|
+
function getRouteParentPath(path, _ref) {
|
|
43
|
+
var _meta$frontmatter$fil;
|
|
44
|
+
|
|
45
|
+
var meta = _ref.meta,
|
|
46
|
+
is2LevelNav = _ref.is2LevelNav;
|
|
47
|
+
var isIndexDocRoute = ((_meta$frontmatter$fil = meta.frontmatter.filename) === null || _meta$frontmatter$fil === void 0 ? void 0 : _meta$frontmatter$fil.endsWith('index.md')) && !meta._atom_route && is2LevelNav;
|
|
48
|
+
var paths = path.split('/') // strip end slash
|
|
49
|
+
.filter(Boolean);
|
|
44
50
|
var sliceEnd = Math.min(Math.max( // increase 1 level if route file is index.md
|
|
45
|
-
|
|
46
|
-
1), // up to 2-level
|
|
47
|
-
2);
|
|
51
|
+
isIndexDocRoute ? paths.length : paths.length - 1, // least 1-level
|
|
52
|
+
1), // up to 2-level when use conventional 2-level nav
|
|
53
|
+
is2LevelNav ? 2 : Infinity);
|
|
48
54
|
return paths.slice(0, sliceEnd).join('/');
|
|
49
55
|
}
|
|
50
56
|
/**
|
|
@@ -57,7 +63,8 @@ export var useFullSidebarData = function useFullSidebarData() {
|
|
|
57
63
|
var routes = useLocaleDocRoutes();
|
|
58
64
|
|
|
59
65
|
var _useSiteData = useSiteData(),
|
|
60
|
-
themeConfig = _useSiteData.themeConfig
|
|
66
|
+
themeConfig = _useSiteData.themeConfig,
|
|
67
|
+
is2LevelNav = _useSiteData._2_level_nav_available;
|
|
61
68
|
|
|
62
69
|
var sidebarDataComparer = useRouteDataComparer();
|
|
63
70
|
|
|
@@ -79,9 +86,10 @@ export var useFullSidebarData = function useFullSidebarData() {
|
|
|
79
86
|
// a/b => /a/b (if route file is a/b/index.md)
|
|
80
87
|
// a/b/c => /a/b
|
|
81
88
|
var parentPath = "/".concat(route.path.replace(clearPath, function (s) {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
89
|
+
return getRouteParentPath(s, {
|
|
90
|
+
is2LevelNav: is2LevelNav,
|
|
91
|
+
meta: route.meta
|
|
92
|
+
});
|
|
85
93
|
}));
|
|
86
94
|
|
|
87
95
|
var _pickRouteSortMeta = pickRouteSortMeta({
|
|
@@ -108,10 +116,10 @@ export var useFullSidebarData = function useFullSidebarData() {
|
|
|
108
116
|
return ret;
|
|
109
117
|
}, {}); // destruct sidebar data into sidebar config
|
|
110
118
|
|
|
111
|
-
var sidebarConfig = Object.entries(data).reduce(function (ret,
|
|
112
|
-
var
|
|
113
|
-
navPath =
|
|
114
|
-
groups =
|
|
119
|
+
var sidebarConfig = Object.entries(data).reduce(function (ret, _ref2) {
|
|
120
|
+
var _ref3 = _slicedToArray(_ref2, 2),
|
|
121
|
+
navPath = _ref3[0],
|
|
122
|
+
groups = _ref3[1];
|
|
115
123
|
|
|
116
124
|
ret[navPath] = Object.values(groups).sort(sidebarDataComparer); // sort group children by order or title
|
|
117
125
|
|
|
@@ -180,10 +188,10 @@ export var useTreeSidebarData = function useTreeSidebarData() {
|
|
|
180
188
|
var data = Object.entries(original) // match from the deepest level
|
|
181
189
|
.sort(function (a, b) {
|
|
182
190
|
return b[0].split('/').length - a[0].split('/').length;
|
|
183
|
-
}).reduce(function (ret,
|
|
184
|
-
var
|
|
185
|
-
path =
|
|
186
|
-
data =
|
|
191
|
+
}).reduce(function (ret, _ref4) {
|
|
192
|
+
var _ref5 = _slicedToArray(_ref4, 2),
|
|
193
|
+
path = _ref5[0],
|
|
194
|
+
data = _ref5[1];
|
|
187
195
|
|
|
188
196
|
var parent = path.replace(/\/[^/]+$/, '');
|
|
189
197
|
|
|
@@ -236,12 +244,13 @@ export var useSidebarData = function useSidebarData() {
|
|
|
236
244
|
var locale = useLocale();
|
|
237
245
|
var sidebar = useFullSidebarData();
|
|
238
246
|
|
|
247
|
+
var _useSiteData2 = useSiteData(),
|
|
248
|
+
is2LevelNav = _useSiteData2._2_level_nav_available;
|
|
249
|
+
|
|
239
250
|
var _useLocation = useLocation(),
|
|
240
251
|
pathname = _useLocation.pathname;
|
|
241
252
|
|
|
242
|
-
var
|
|
243
|
-
frontmatter = _useRouteMeta.frontmatter;
|
|
244
|
-
|
|
253
|
+
var meta = useRouteMeta();
|
|
245
254
|
var clearPath = getLocaleClearPath(pathname.slice(1), locale); // extract parent path from location pathname
|
|
246
255
|
// /a => /a
|
|
247
256
|
// /a/b => /a
|
|
@@ -250,9 +259,10 @@ export var useSidebarData = function useSidebarData() {
|
|
|
250
259
|
// /en-US/a/b/ => /en-US/a (also strip trailing /)
|
|
251
260
|
|
|
252
261
|
var parentPath = clearPath ? pathname.replace(clearPath, function (s) {
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
262
|
+
return getRouteParentPath(s, {
|
|
263
|
+
is2LevelNav: is2LevelNav,
|
|
264
|
+
meta: meta
|
|
265
|
+
});
|
|
256
266
|
}) : pathname;
|
|
257
267
|
return parentPath ? sidebar[parentPath] : [];
|
|
258
268
|
};
|
|
@@ -20,5 +20,5 @@ export declare const useRouteDataComparer: <T extends {
|
|
|
20
20
|
/**
|
|
21
21
|
* common util for pick meta to sort sidebar/nav items
|
|
22
22
|
*/
|
|
23
|
-
export declare const pickRouteSortMeta: (original: Partial<Pick<INavItem, 'order' | 'title'>>, field: 'nav' | 'nav.
|
|
23
|
+
export declare const pickRouteSortMeta: (original: Partial<Pick<INavItem, 'order' | 'title'>>, field: 'nav' | 'nav.second' | 'group', fm: IRouteMeta['frontmatter']) => Partial<Pick<INavItem, "title" | "order">>;
|
|
24
24
|
export declare function getLocaleNav(nav: IUserNavValue | INav, locale: ILocale): import("./types").IUserNavItems;
|
|
@@ -83,7 +83,7 @@ export var useRouteDataComparer = function useRouteDataComparer() {
|
|
|
83
83
|
export var pickRouteSortMeta = function pickRouteSortMeta(original, field, fm) {
|
|
84
84
|
var _sub$order;
|
|
85
85
|
|
|
86
|
-
var sub = field === 'nav.
|
|
86
|
+
var sub = field === 'nav.second' ? _typeof(fm.nav) === 'object' ? fm.nav.second : {} : fm[field];
|
|
87
87
|
|
|
88
88
|
switch (_typeof(sub)) {
|
|
89
89
|
case 'object':
|
package/dist/constants.d.ts
CHANGED
package/dist/constants.js
CHANGED
|
@@ -27,7 +27,8 @@ __export(constants_exports, {
|
|
|
27
27
|
PREFERS_COLOR_LS_KEY: () => PREFERS_COLOR_LS_KEY,
|
|
28
28
|
SP_ROUTE_PREFIX: () => SP_ROUTE_PREFIX,
|
|
29
29
|
THEME_PREFIX: () => THEME_PREFIX,
|
|
30
|
-
USELESS_TMP_FILES: () => USELESS_TMP_FILES
|
|
30
|
+
USELESS_TMP_FILES: () => USELESS_TMP_FILES,
|
|
31
|
+
VERSION_2_LEVEL_NAV: () => VERSION_2_LEVEL_NAV
|
|
31
32
|
});
|
|
32
33
|
module.exports = __toCommonJS(constants_exports);
|
|
33
34
|
var LOCAL_DUMI_DIR = ".dumi";
|
|
@@ -47,6 +48,7 @@ var PICKED_PKG_FIELDS = {
|
|
|
47
48
|
authors: ""
|
|
48
49
|
};
|
|
49
50
|
var USELESS_TMP_FILES = ["tsconfig.json", "typings.d.ts"];
|
|
51
|
+
var VERSION_2_LEVEL_NAV = "^2.2.0";
|
|
50
52
|
// Annotate the CommonJS export names for ESM import in node:
|
|
51
53
|
0 && (module.exports = {
|
|
52
54
|
LOCAL_DUMI_DIR,
|
|
@@ -57,5 +59,6 @@ var USELESS_TMP_FILES = ["tsconfig.json", "typings.d.ts"];
|
|
|
57
59
|
PREFERS_COLOR_LS_KEY,
|
|
58
60
|
SP_ROUTE_PREFIX,
|
|
59
61
|
THEME_PREFIX,
|
|
60
|
-
USELESS_TMP_FILES
|
|
62
|
+
USELESS_TMP_FILES,
|
|
63
|
+
VERSION_2_LEVEL_NAV
|
|
61
64
|
});
|
package/dist/features/routes.js
CHANGED
|
@@ -167,7 +167,8 @@ var routes_default = (api) => {
|
|
|
167
167
|
path: routePath,
|
|
168
168
|
absPath: `/${routePath}`,
|
|
169
169
|
parentId: docLayoutId,
|
|
170
|
-
file: (0, import_plugin_utils.winPath)(import_path.default.resolve(base, file))
|
|
170
|
+
file: (0, import_plugin_utils.winPath)(import_path.default.resolve(base, file)),
|
|
171
|
+
meta: { _atom_route: true }
|
|
171
172
|
};
|
|
172
173
|
});
|
|
173
174
|
});
|
|
@@ -51,6 +51,13 @@ function getModuleExports(modulePath) {
|
|
|
51
51
|
content: import_fs.default.readFileSync(modulePath, "utf-8")
|
|
52
52
|
})[1];
|
|
53
53
|
}
|
|
54
|
+
function checkMinor2ByPkg(pkg) {
|
|
55
|
+
var _a, _b, _c;
|
|
56
|
+
if ((_a = pkg.name) == null ? void 0 : _a.startsWith("@examples/"))
|
|
57
|
+
return true;
|
|
58
|
+
const ver = ((_b = pkg.peerDependencies) == null ? void 0 : _b.dumi) || ((_c = pkg.devDependencies) == null ? void 0 : _c.dumi) || "^2.0.0";
|
|
59
|
+
return import_plugin_utils.semver.subset(ver, import_constants.VERSION_2_LEVEL_NAV);
|
|
60
|
+
}
|
|
54
61
|
var theme_default = (api) => {
|
|
55
62
|
const defaultThemeData = (0, import_loader.default)(DEFAULT_THEME_PATH);
|
|
56
63
|
const pkgThemePath = getPkgThemePath(api);
|
|
@@ -105,6 +112,13 @@ var theme_default = (api) => {
|
|
|
105
112
|
return memo;
|
|
106
113
|
}
|
|
107
114
|
});
|
|
115
|
+
api.modifyAppData((memo) => {
|
|
116
|
+
memo._2LevelNavAvailable = checkMinor2ByPkg(api.pkg);
|
|
117
|
+
if (pkgThemePath && !memo._2LevelNavAvailable) {
|
|
118
|
+
memo._2LevelNavAvailable = checkMinor2ByPkg(require(import_path.default.join(pkgThemePath, "package.json")));
|
|
119
|
+
}
|
|
120
|
+
return memo;
|
|
121
|
+
});
|
|
108
122
|
api.modifyConfig((memo) => {
|
|
109
123
|
if (localThemeData) {
|
|
110
124
|
themeMapKeys.forEach((key) => {
|
|
@@ -215,6 +229,7 @@ export default function DumiContextWrapper() {
|
|
|
215
229
|
loading,
|
|
216
230
|
setLoading,
|
|
217
231
|
themeConfig: ${JSON.stringify(Object.assign(import_plugin_utils.lodash.pick(api.config, "logo", "description", "title"), api.config.themeConfig))},
|
|
232
|
+
_2_level_nav_available: ${api.appData._2LevelNavAvailable},
|
|
218
233
|
}}>
|
|
219
234
|
{outlet}
|
|
220
235
|
</SiteContext.Provider>
|
package/package.json
CHANGED
|
@@ -78,8 +78,10 @@
|
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
-
|
|
82
|
-
|
|
81
|
+
@media @mobile {
|
|
82
|
+
&[data-collapsed] > svg {
|
|
83
|
+
transform: rotate(180deg);
|
|
84
|
+
}
|
|
83
85
|
}
|
|
84
86
|
|
|
85
87
|
@media @desktop {
|
|
@@ -122,7 +124,7 @@
|
|
|
122
124
|
padding: 0 18px;
|
|
123
125
|
color: @c-text-secondary;
|
|
124
126
|
font-size: 15px;
|
|
125
|
-
line-height: 1.
|
|
127
|
+
line-height: 1.6;
|
|
126
128
|
text-align: left;
|
|
127
129
|
|
|
128
130
|
@media @mobile {
|