dumi 2.1.9 → 2.1.10
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/types.d.ts +22 -5
- package/dist/client/theme-api/useNavData.d.ts +2 -3
- package/dist/client/theme-api/useNavData.js +29 -4
- package/dist/client/theme-api/utils.d.ts +4 -3
- package/dist/client/theme-api/utils.js +4 -1
- package/dist/features/derivative.js +7 -0
- package/dist/loaders/markdown/index.js +2 -0
- package/dist/loaders/markdown/transformer/rehypeDemo.js +1 -1
- package/dist/types.d.ts +5 -0
- package/package.json +1 -1
|
@@ -160,14 +160,31 @@ export interface ISidebarGroup {
|
|
|
160
160
|
[key: string]: any;
|
|
161
161
|
}
|
|
162
162
|
export declare type SocialTypes = 'github' | 'weibo' | 'twitter' | 'gitlab' | 'facebook' | 'zhihu' | 'yuque' | 'linkedin';
|
|
163
|
+
export declare type INavItems = (INavItem & {
|
|
164
|
+
children?: INavItem[];
|
|
165
|
+
})[];
|
|
166
|
+
export declare type INav = INavItems | Record<string, INavItems>;
|
|
167
|
+
declare type IUserNavItem = Pick<INavItem, 'title' | 'link'>;
|
|
168
|
+
export declare type IUserNavMode = 'override' | 'append' | 'prepend';
|
|
169
|
+
export declare type IUserNavItems = (IUserNavItem & {
|
|
170
|
+
children?: IUserNavItem[];
|
|
171
|
+
})[];
|
|
172
|
+
export declare type IUserNavValue = IUserNavItems | Record<string, IUserNavItems>;
|
|
173
|
+
export declare type NavWithMode<T extends IUserNavValue> = {
|
|
174
|
+
/**
|
|
175
|
+
* 扩展导航的模式
|
|
176
|
+
* @description
|
|
177
|
+
* - 'override': 用 value 中配置的导航直接覆盖约定路由的导航
|
|
178
|
+
* - 'append': 将 value 中配置的导航追加到约定路由导航后面
|
|
179
|
+
* - 'prepend': 将 value 中配置的导航添加到约定路由导航前面
|
|
180
|
+
*/
|
|
181
|
+
mode: IUserNavMode;
|
|
182
|
+
value: T;
|
|
183
|
+
};
|
|
163
184
|
export interface IThemeConfig {
|
|
164
185
|
name?: string;
|
|
165
186
|
logo?: string | false;
|
|
166
|
-
nav?:
|
|
167
|
-
children?: INavItem[];
|
|
168
|
-
})[] | Record<string, (INavItem & {
|
|
169
|
-
children?: INavItem[];
|
|
170
|
-
})[]>;
|
|
187
|
+
nav?: IUserNavValue | NavWithMode<IUserNavValue>;
|
|
171
188
|
sidebar?: Record<string, ISidebarGroup[]>;
|
|
172
189
|
footer?: string | false;
|
|
173
190
|
prefersColor: {
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
+
import type { IUserNavItems } from './types';
|
|
1
2
|
/**
|
|
2
3
|
* hook for get nav data
|
|
3
4
|
*/
|
|
4
|
-
export declare const useNavData: () =>
|
|
5
|
-
children?: import("./types").INavItem[] | undefined;
|
|
6
|
-
})[];
|
|
5
|
+
export declare const useNavData: () => IUserNavItems;
|
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
2
|
+
|
|
3
|
+
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."); }
|
|
4
|
+
|
|
5
|
+
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
6
|
+
|
|
7
|
+
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
8
|
+
|
|
1
9
|
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
2
10
|
|
|
3
11
|
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."); }
|
|
@@ -12,7 +20,7 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
|
12
20
|
|
|
13
21
|
import { useFullSidebarData, useLocale, useSiteData } from 'dumi';
|
|
14
22
|
import { useState } from 'react';
|
|
15
|
-
import { pickRouteSortMeta, useLocaleDocRoutes, useRouteDataComparer } from "./utils";
|
|
23
|
+
import { getLocaleNav, pickRouteSortMeta, useLocaleDocRoutes, useRouteDataComparer } from "./utils";
|
|
16
24
|
|
|
17
25
|
/**
|
|
18
26
|
* hook for get nav data
|
|
@@ -29,7 +37,22 @@ export var useNavData = function useNavData() {
|
|
|
29
37
|
|
|
30
38
|
var _useState = useState(function () {
|
|
31
39
|
// use user config first
|
|
32
|
-
|
|
40
|
+
var userNavValue = [];
|
|
41
|
+
var mode;
|
|
42
|
+
|
|
43
|
+
if (themeConfig.nav) {
|
|
44
|
+
// 形如:{mode: "append", value: []}
|
|
45
|
+
if ('mode' in themeConfig.nav && typeof themeConfig.nav.mode === 'string') {
|
|
46
|
+
mode = themeConfig.nav.mode;
|
|
47
|
+
userNavValue = getLocaleNav(themeConfig.nav.value, locale);
|
|
48
|
+
} else if (!('mode' in themeConfig.nav)) {
|
|
49
|
+
// 形如:[] 或 {"zh-CN": []}
|
|
50
|
+
userNavValue = getLocaleNav(themeConfig.nav, locale);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (!mode || mode === 'override') return userNavValue;
|
|
54
|
+
} // fallback to generate nav data from sidebar data
|
|
55
|
+
|
|
33
56
|
|
|
34
57
|
var data = Object.entries(sidebar).map(function (_ref) {
|
|
35
58
|
var _ref2 = _slicedToArray(_ref, 2),
|
|
@@ -50,9 +73,11 @@ export var useNavData = function useNavData() {
|
|
|
50
73
|
link: groups[0].children[0].link,
|
|
51
74
|
activePath: link
|
|
52
75
|
};
|
|
53
|
-
});
|
|
76
|
+
});
|
|
77
|
+
data.sort(sidebarDataComparer); // TODO: 2-level nav data
|
|
54
78
|
|
|
55
|
-
|
|
79
|
+
if (mode === 'prepend') data.unshift.apply(data, _toConsumableArray(userNavValue));else if (mode === 'append') data.push.apply(data, _toConsumableArray(userNavValue));
|
|
80
|
+
return data;
|
|
56
81
|
}),
|
|
57
82
|
_useState2 = _slicedToArray(_useState, 1),
|
|
58
83
|
nav = _useState2[0];
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type { INavItem, IRouteMeta, IRoutesById } from './types';
|
|
1
|
+
import { useLayoutEffect } from 'react';
|
|
2
|
+
import type { ILocale, INav, INavItem, IRouteMeta, IRoutesById, IUserNavValue } from './types';
|
|
3
3
|
export declare const useLocaleDocRoutes: () => IRoutesById;
|
|
4
4
|
/**
|
|
5
5
|
* 在 react 18 中需要新的 render 方式,这个函数用来处理不同的 jsx 模式。
|
|
@@ -7,7 +7,7 @@ export declare const useLocaleDocRoutes: () => IRoutesById;
|
|
|
7
7
|
* @returns code string
|
|
8
8
|
*/
|
|
9
9
|
export declare const genReactRenderCode: (version: string) => string;
|
|
10
|
-
export declare const useIsomorphicLayoutEffect: typeof
|
|
10
|
+
export declare const useIsomorphicLayoutEffect: typeof useLayoutEffect;
|
|
11
11
|
/**
|
|
12
12
|
* common comparer for sidebar/nav items
|
|
13
13
|
*/
|
|
@@ -21,3 +21,4 @@ export declare const useRouteDataComparer: <T extends {
|
|
|
21
21
|
* common util for pick meta to sort sidebar/nav items
|
|
22
22
|
*/
|
|
23
23
|
export declare const pickRouteSortMeta: (original: Partial<Pick<INavItem, 'order' | 'title'>>, field: 'nav' | 'group', fm: IRouteMeta['frontmatter']) => Partial<Pick<INavItem, "title" | "order">>;
|
|
24
|
+
export declare function getLocaleNav(nav: IUserNavValue | INav, locale: ILocale): import("./types").IUserNavItems;
|
|
@@ -60,6 +60,13 @@ var derivative_default = (api) => {
|
|
|
60
60
|
if (((_b = api.userConfig.history) == null ? void 0 : _b.type) === "hash") {
|
|
61
61
|
import_plugin_utils.logger.warn("Hash history is temporarily incompatible, it is recommended to use browser history for now.");
|
|
62
62
|
}
|
|
63
|
+
const { themeConfig } = api.config;
|
|
64
|
+
if (themeConfig == null ? void 0 : themeConfig.nav) {
|
|
65
|
+
const hasOrder = !!JSON.stringify(themeConfig.nav).includes('"order":');
|
|
66
|
+
if (hasOrder) {
|
|
67
|
+
import_plugin_utils.logger.warn(`\`order\` is deprecated in \`themeConfig.nav\`, you can order them directly in config`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
63
70
|
try {
|
|
64
71
|
const tsconfig = require(import_path.default.join(api.cwd, "tsconfig.json"));
|
|
65
72
|
const expected = [".dumi/**/*"];
|
|
@@ -75,6 +75,8 @@ export const texts = {{{texts}}};
|
|
|
75
75
|
let { asset } = this;
|
|
76
76
|
const { sources } = this;
|
|
77
77
|
Object.keys(this.sources).forEach((file) => {
|
|
78
|
+
if (!asset.dependencies[file])
|
|
79
|
+
return;
|
|
78
80
|
asset = import_plugin_utils.lodash.cloneDeep(asset);
|
|
79
81
|
asset.dependencies[file].value = `{{{require('-!${sources[file]}?dumi-raw').default}}}`;
|
|
80
82
|
});
|
|
@@ -203,7 +203,7 @@ function rehypeDemo(opts) {
|
|
|
203
203
|
id: asset.id,
|
|
204
204
|
component,
|
|
205
205
|
asset: techStack.generateMetadata ? await techStack.generateMetadata(asset, techStackOpts) : asset,
|
|
206
|
-
sources
|
|
206
|
+
sources: techStack.generateSources ? await techStack.generateSources(sources, techStackOpts) : sources
|
|
207
207
|
};
|
|
208
208
|
}));
|
|
209
209
|
demosPropData.push({
|
package/dist/types.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type AtomAssetsParser from "./assetParsers/atom";
|
|
2
|
+
import type { IParsedBlockAsset } from "./assetParsers/block";
|
|
2
3
|
import type { IDumiDemoProps } from "./client/theme-api/DumiDemo";
|
|
3
4
|
import type { ILocalesConfig, IThemeConfig } from "./client/theme-api/types";
|
|
4
5
|
import type { IContentTab } from "./features/tabs";
|
|
@@ -82,6 +83,10 @@ export declare abstract class IDumiTechStack {
|
|
|
82
83
|
* generator for return previewer props
|
|
83
84
|
*/
|
|
84
85
|
abstract generatePreviewerProps?(props: IDumiDemoProps['previewerProps'], opts: Parameters<NonNullable<IDumiTechStack['generateMetadata']>>[1]): Promise<IDumiDemoProps['previewerProps']> | IDumiDemoProps['previewerProps'];
|
|
86
|
+
/**
|
|
87
|
+
* generator for return file path of demo sources
|
|
88
|
+
*/
|
|
89
|
+
abstract generateSources?(sources: IParsedBlockAsset['sources'], opts: Parameters<NonNullable<IDumiTechStack['generateMetadata']>>[1]): Promise<IParsedBlockAsset['sources']> | IParsedBlockAsset['sources'];
|
|
85
90
|
}
|
|
86
91
|
export declare type IApi = IUmiApi & {
|
|
87
92
|
config: IDumiConfig & {
|