dumi 2.0.0-alpha.2 → 2.0.0-alpha.4

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 (93) hide show
  1. package/dist/client/pages/404.d.ts +1 -0
  2. package/dist/client/pages/404.js +2 -0
  3. package/dist/client/pages/Demo.d.ts +3 -0
  4. package/dist/client/pages/Demo.js +17 -0
  5. package/dist/client/theme-api/DumiDemo.js +8 -5
  6. package/dist/client/theme-api/DumiDemoGrid.d.ts +1 -1
  7. package/dist/client/theme-api/DumiDemoGrid.js +9 -8
  8. package/dist/client/theme-api/context.d.ts +7 -4
  9. package/dist/client/theme-api/context.js +8 -4
  10. package/dist/client/theme-api/index.d.ts +8 -5
  11. package/dist/client/theme-api/index.js +7 -5
  12. package/dist/client/theme-api/types.d.ts +77 -9
  13. package/dist/client/theme-api/useLocale.d.ts +1 -0
  14. package/dist/client/theme-api/useLocale.js +31 -0
  15. package/dist/client/theme-api/useNavData.d.ts +6 -0
  16. package/dist/client/theme-api/useNavData.js +78 -0
  17. package/dist/client/theme-api/{useMatchedRouteMeta.d.ts → useRouteMeta.d.ts} +1 -1
  18. package/dist/client/theme-api/{useMatchedRouteMeta.js → useRouteMeta.js} +6 -3
  19. package/dist/client/theme-api/useSidebarData.d.ts +8 -0
  20. package/dist/client/theme-api/useSidebarData.js +131 -0
  21. package/dist/client/theme-api/utils.d.ts +2 -0
  22. package/dist/client/theme-api/utils.js +44 -0
  23. package/dist/client/tsconfig.json +2 -1
  24. package/dist/constants.d.ts +1 -0
  25. package/dist/constants.js +3 -0
  26. package/dist/features/compile.js +1 -1
  27. package/dist/features/configPlugins/index.js +2 -1
  28. package/dist/features/configPlugins/schema.js +2 -1
  29. package/dist/features/exports.d.ts +3 -0
  30. package/dist/features/exports.js +45 -0
  31. package/dist/features/locales.js +18 -10
  32. package/dist/features/meta.js +2 -2
  33. package/dist/features/routes.js +29 -2
  34. package/dist/features/theme/index.js +6 -6
  35. package/dist/index.d.ts +4 -3
  36. package/dist/index.js +1 -0
  37. package/dist/loaders/markdown/index.js +4 -2
  38. package/dist/loaders/markdown/transformer/index.d.ts +5 -2
  39. package/dist/loaders/markdown/transformer/index.js +4 -2
  40. package/dist/loaders/markdown/transformer/rehypeDemo.d.ts +3 -0
  41. package/dist/loaders/markdown/transformer/rehypeDemo.js +14 -6
  42. package/dist/loaders/markdown/transformer/rehypeEmbed.d.ts +9 -1
  43. package/dist/loaders/markdown/transformer/rehypeEmbed.js +16 -4
  44. package/dist/loaders/markdown/transformer/rehypeRaw.js +2 -2
  45. package/dist/loaders/markdown/transformer/rehypeSlug.d.ts +4 -0
  46. package/dist/loaders/markdown/transformer/rehypeSlug.js +105 -0
  47. package/dist/loaders/markdown/transformer/remarkMeta.d.ts +4 -2
  48. package/dist/loaders/markdown/transformer/remarkMeta.js +24 -3
  49. package/dist/preset.js +1 -0
  50. package/dist/types.d.ts +8 -2
  51. package/package.json +16 -1
  52. package/theme-default/builtins/{Previewer.d.ts → Previewer/index.d.ts} +2 -1
  53. package/theme-default/builtins/Previewer/index.js +162 -0
  54. package/theme-default/builtins/Previewer/index.less +297 -0
  55. package/theme-default/builtins/SourceCode/index.d.ts +9 -0
  56. package/theme-default/builtins/SourceCode/index.js +87 -0
  57. package/theme-default/builtins/SourceCode/index.less +50 -0
  58. package/theme-default/layouts/DocLayout/index.d.ts +1 -0
  59. package/theme-default/layouts/DocLayout/index.js +28 -6
  60. package/theme-default/layouts/DocLayout/index.less +17 -0
  61. package/theme-default/locales/en-US.json +9 -1
  62. package/theme-default/locales/zh-CN.json +9 -1
  63. package/theme-default/slots/Content/heti.scss +3 -0
  64. package/theme-default/slots/Content/index.d.ts +2 -0
  65. package/theme-default/slots/Content/index.js +6 -5
  66. package/theme-default/slots/Content/index.less +31 -0
  67. package/theme-default/slots/Header/index.d.ts +1 -0
  68. package/theme-default/slots/Header/index.js +10 -7
  69. package/theme-default/slots/Header/index.less +22 -0
  70. package/theme-default/slots/LangSwitch/index.d.ts +4 -0
  71. package/theme-default/slots/LangSwitch/index.js +81 -0
  72. package/theme-default/slots/LangSwitch/index.less +13 -0
  73. package/theme-default/slots/Logo/index.d.ts +1 -0
  74. package/theme-default/slots/Logo/index.js +13 -1
  75. package/theme-default/slots/Logo/index.less +16 -0
  76. package/theme-default/slots/Navbar/index.d.ts +1 -0
  77. package/theme-default/slots/Navbar/index.js +20 -1
  78. package/theme-default/slots/Navbar/index.less +33 -0
  79. package/theme-default/slots/NotFound/index.d.ts +4 -0
  80. package/theme-default/slots/NotFound/index.js +20 -0
  81. package/theme-default/slots/NotFound/index.less +26 -0
  82. package/theme-default/slots/SearchBar/index.d.ts +1 -0
  83. package/theme-default/slots/SearchBar/index.js +32 -4
  84. package/theme-default/slots/SearchBar/index.less +61 -0
  85. package/theme-default/slots/Sidebar/index.d.ts +1 -0
  86. package/theme-default/slots/Sidebar/index.js +23 -8
  87. package/theme-default/slots/Sidebar/index.less +57 -0
  88. package/theme-default/slots/Toc/index.d.ts +4 -0
  89. package/theme-default/slots/Toc/index.js +30 -0
  90. package/theme-default/slots/Toc/index.less +31 -0
  91. package/theme-default/styles/utils.less +46 -0
  92. package/theme-default/styles/variables.less +13 -0
  93. package/theme-default/builtins/Previewer.js +0 -11
@@ -0,0 +1 @@
1
+ export { default } from 'dumi/theme/slots/NotFound';
@@ -0,0 +1,2 @@
1
+ // allow customize 404 via theme slots
2
+ export { default } from 'dumi/theme/slots/NotFound';
@@ -0,0 +1,3 @@
1
+ import { type FC } from 'react';
2
+ declare const DemoRenderPage: FC;
3
+ export default DemoRenderPage;
@@ -0,0 +1,17 @@
1
+ import { useParams, useSiteData } from 'dumi';
2
+ import { createElement } from 'react';
3
+
4
+ var DemoRenderPage = function DemoRenderPage() {
5
+ var _useParams = useParams(),
6
+ id = _useParams.id;
7
+
8
+ var _useSiteData = useSiteData(),
9
+ demos = _useSiteData.demos;
10
+
11
+ var _ref = demos[id] || {},
12
+ component = _ref.component;
13
+
14
+ return component && /*#__PURE__*/createElement(component);
15
+ };
16
+
17
+ export default DemoRenderPage;
@@ -1,16 +1,19 @@
1
1
  function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
2
2
 
3
+ import { SP_ROUTE_PREFIX } from "../../constants";
4
+ import { useSiteData } from 'dumi';
3
5
  import Previewer from 'dumi/theme/builtins/Previewer';
4
- import React, { createElement, useContext } from 'react';
5
- import { Context } from "./context";
6
+ import React, { createElement } from 'react';
6
7
  export var DumiDemo = function DumiDemo(props) {
7
- var _useContext = useContext(Context),
8
- demos = _useContext.demos;
8
+ var _useSiteData = useSiteData(),
9
+ demos = _useSiteData.demos;
9
10
 
10
11
  var _demos$props$demo$id = demos[props.demo.id],
11
12
  component = _demos$props$demo$id.component,
12
13
  asset = _demos$props$demo$id.asset;
13
14
  return /*#__PURE__*/React.createElement(Previewer, _extends({
14
- asset: asset
15
+ asset: asset,
16
+ demoUrl: // allow user override demoUrl by frontmatter
17
+ props.previewerProps.demoUrl || "".concat(SP_ROUTE_PREFIX, "demos/").concat(props.demo.id)
15
18
  }, props.previewerProps), /*#__PURE__*/createElement(component));
16
19
  };
@@ -1,5 +1,5 @@
1
1
  import { type FC } from 'react';
2
- import { IDumiDemoProps } from './DumiDemo';
2
+ import type { IDumiDemoProps } from './DumiDemo';
3
3
  export interface IDumiDemoGridProps {
4
4
  items: IDumiDemoProps[];
5
5
  }
@@ -12,20 +12,20 @@ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Sy
12
12
 
13
13
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
14
14
 
15
- import { useMatchedRouteMeta } from 'dumi/theme';
15
+ import { DumiDemo, useRouteMeta } from 'dumi';
16
16
  import React, { useState } from 'react';
17
- import { DumiDemo } from "./DumiDemo";
18
17
  export var DumiDemoGrid = function DumiDemoGrid(props) {
19
- var meta = useMatchedRouteMeta();
18
+ var _useRouteMeta = useRouteMeta(),
19
+ fm = _useRouteMeta.frontmatter;
20
20
 
21
21
  var _useState = useState(function () {
22
- var _meta$demo;
22
+ var _fm$demo;
23
23
 
24
24
  var cols = [];
25
25
 
26
- if ((_meta$demo = meta.demo) !== null && _meta$demo !== void 0 && _meta$demo.cols && meta.demo.cols > 1) {
27
- for (var i = 0; i < props.items.length; i += meta.demo.cols) {
28
- props.items.slice(i, i + meta.demo.cols).forEach(function (item, j) {
26
+ if ((_fm$demo = fm.demo) !== null && _fm$demo !== void 0 && _fm$demo.cols && fm.demo.cols > 1) {
27
+ for (var i = 0; i < props.items.length; i += fm.demo.cols) {
28
+ props.items.slice(i, i + fm.demo.cols).forEach(function (item, j) {
29
29
  var _cols$j;
30
30
 
31
31
  (_cols$j = cols[j]) !== null && _cols$j !== void 0 ? _cols$j : cols[j] = [];
@@ -47,7 +47,8 @@ export var DumiDemoGrid = function DumiDemoGrid(props) {
47
47
  style: {
48
48
  display: 'flex',
49
49
  margin: -8
50
- }
50
+ },
51
+ "data-dumi-demo-grid": true
51
52
  }, cols.map(function (col, i) {
52
53
  return /*#__PURE__*/React.createElement("section", {
53
54
  style: {
@@ -1,10 +1,13 @@
1
1
  import { type ComponentType } from 'react';
2
- import type { ILocalesConfig, IPreviewerProps } from './types';
3
- export interface IThemeContext {
2
+ import type { ILocalesConfig, IPreviewerProps, IThemeConfig } from './types';
3
+ interface ISiteContext {
4
4
  demos: Record<string, {
5
5
  component: ComponentType;
6
6
  asset: IPreviewerProps['asset'];
7
7
  }>;
8
- locales: ILocalesConfig;
8
+ locales: NonNullable<ILocalesConfig>;
9
+ themeConfig: IThemeConfig;
9
10
  }
10
- export declare const Context: import("react").Context<IThemeContext>;
11
+ export declare const SiteContext: import("react").Context<ISiteContext>;
12
+ export declare const useSiteData: () => ISiteContext;
13
+ export {};
@@ -1,5 +1,9 @@
1
- import { createContext } from 'react';
2
- export var Context = /*#__PURE__*/createContext({
1
+ import { createContext, useContext } from 'react';
2
+ export var SiteContext = /*#__PURE__*/createContext({
3
3
  demos: {},
4
- locales: []
5
- });
4
+ locales: [],
5
+ themeConfig: {}
6
+ });
7
+ export var useSiteData = function useSiteData() {
8
+ return useContext(SiteContext);
9
+ };
@@ -1,6 +1,9 @@
1
1
  export { useIntl } from 'react-intl';
2
- export * from './context';
3
- export * from './DumiDemo';
4
- export * from './DumiDemoGrid';
5
- export * from './types';
6
- export * from './useMatchedRouteMeta';
2
+ export { useSiteData } from './context';
3
+ export { DumiDemo } from './DumiDemo';
4
+ export { DumiDemoGrid } from './DumiDemoGrid';
5
+ export type { IPreviewerProps } from './types';
6
+ export { useLocale } from './useLocale';
7
+ export { useNavData } from './useNavData';
8
+ export { useRouteMeta } from './useRouteMeta';
9
+ export { useFullSidebarData, useSidebarData } from './useSidebarData';
@@ -1,6 +1,8 @@
1
1
  export { useIntl } from 'react-intl';
2
- export * from "./context";
3
- export * from "./DumiDemo";
4
- export * from "./DumiDemoGrid";
5
- export * from "./types";
6
- export * from "./useMatchedRouteMeta";
2
+ export { useSiteData } from "./context";
3
+ export { DumiDemo } from "./DumiDemo";
4
+ export { DumiDemoGrid } from "./DumiDemoGrid";
5
+ export { useLocale } from "./useLocale";
6
+ export { useNavData } from "./useNavData";
7
+ export { useRouteMeta } from "./useRouteMeta";
8
+ export { useFullSidebarData, useSidebarData } from "./useSidebarData";
@@ -13,6 +13,26 @@ export interface IPreviewerProps {
13
13
  * file path of current demo
14
14
  */
15
15
  filePath?: string;
16
+ /**
17
+ * use iframe to render demo
18
+ */
19
+ iframe?: boolean | number;
20
+ /**
21
+ * debug mark (will only render in dev by default)
22
+ */
23
+ debug?: boolean;
24
+ /**
25
+ * disable demo content padding
26
+ */
27
+ compact?: boolean;
28
+ /**
29
+ * add transform property for handle absolute/fixed position element
30
+ */
31
+ transform?: boolean;
32
+ /**
33
+ * background color for demo content
34
+ */
35
+ background?: string;
16
36
  /**
17
37
  * asset metadata of current demo
18
38
  */
@@ -24,15 +44,30 @@ export interface IPreviewerProps {
24
44
  [key: string]: any;
25
45
  }
26
46
  export interface IRouteMeta {
27
- title?: string;
28
- description?: string;
29
- keywords?: string[];
30
- category?: string;
31
- order?: number;
32
- toc?: boolean | 'content' | 'menu';
33
- demo?: {
34
- cols?: number;
47
+ frontmatter: {
48
+ title: string;
49
+ description?: string;
50
+ keywords?: string[];
51
+ nav?: string | {
52
+ title?: string;
53
+ order?: number;
54
+ };
55
+ group?: string | {
56
+ title?: string;
57
+ order?: number;
58
+ };
59
+ order?: number;
60
+ toc?: boolean | 'content' | 'menu';
61
+ demo?: {
62
+ cols?: number;
63
+ tocDepth?: number;
64
+ };
35
65
  };
66
+ toc: {
67
+ id: string;
68
+ depth: number;
69
+ title: string;
70
+ }[];
36
71
  [key: string]: any;
37
72
  }
38
73
  declare type IBasicLocale = {
@@ -40,8 +75,41 @@ declare type IBasicLocale = {
40
75
  name: string;
41
76
  };
42
77
  export declare type ILocalesConfig = ((IBasicLocale & {
43
- base?: string;
78
+ base: string;
44
79
  }) | (IBasicLocale & {
45
80
  suffix: string;
46
81
  }))[];
82
+ export interface INavItem {
83
+ title: string;
84
+ link: string;
85
+ activePath?: string;
86
+ [key: string]: any;
87
+ }
88
+ interface ISidebarItem {
89
+ title: string;
90
+ link: string;
91
+ [key: string]: any;
92
+ }
93
+ export interface ISidebarGroup {
94
+ title?: string;
95
+ children: ISidebarItem[];
96
+ [key: string]: any;
97
+ }
98
+ export interface IThemeConfig {
99
+ name?: string;
100
+ logo?: string;
101
+ nav?: (INavItem & {
102
+ children?: INavItem[];
103
+ })[];
104
+ sidebar?: Record<string, ISidebarGroup[]>;
105
+ [key: string]: any;
106
+ }
107
+ export declare type IRoutesById = Record<string, {
108
+ path?: string;
109
+ parentId?: string;
110
+ meta?: IRouteMeta;
111
+ id: string;
112
+ redirect?: string;
113
+ [key: string]: any;
114
+ }>;
47
115
  export {};
@@ -0,0 +1 @@
1
+ export declare const useLocale: () => any;
@@ -0,0 +1,31 @@
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 { useIntl, useSiteData } from 'dumi';
14
+ import { useState } from 'react';
15
+ export var useLocale = function useLocale() {
16
+ var intl = useIntl();
17
+
18
+ var _useSiteData = useSiteData(),
19
+ locales = _useSiteData.locales;
20
+
21
+ var _useState = useState(function () {
22
+ return locales.find(function (_ref) {
23
+ var id = _ref.id;
24
+ return id === intl.locale;
25
+ });
26
+ }),
27
+ _useState2 = _slicedToArray(_useState, 1),
28
+ locale = _useState2[0];
29
+
30
+ return locale;
31
+ };
@@ -0,0 +1,6 @@
1
+ /**
2
+ * hook for get nav data
3
+ */
4
+ export declare const useNavData: () => (import("./types").INavItem & {
5
+ children?: import("./types").INavItem[] | undefined;
6
+ })[];
@@ -0,0 +1,78 @@
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
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
4
+
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."); }
6
+
7
+ 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); }
8
+
9
+ 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; }
10
+
11
+ 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; }
12
+
13
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
14
+
15
+ import { useFullSidebarData, useSiteData } from 'dumi';
16
+ import { useState } from 'react';
17
+ import { useLocaleDocRoutes } from "./utils";
18
+ /**
19
+ * hook for get nav data
20
+ */
21
+
22
+ export var useNavData = function useNavData() {
23
+ var routes = useLocaleDocRoutes();
24
+
25
+ var _useSiteData = useSiteData(),
26
+ themeConfig = _useSiteData.themeConfig;
27
+
28
+ var sidebar = useFullSidebarData();
29
+
30
+ var _useState = useState(function () {
31
+ // use user config first
32
+ if (themeConfig.nav) return themeConfig.nav; // fallback to generate nav data from sidebar data
33
+
34
+ var data = Object.entries(sidebar).map(function (_ref) {
35
+ var _ref2 = _slicedToArray(_ref, 2),
36
+ link = _ref2[0],
37
+ groups = _ref2[1];
38
+
39
+ var meta = Object.values(routes).reduce(function (ret, route) {
40
+ var _frontmatter$nav$orde;
41
+
42
+ // find routes which within the nav path
43
+ if (route.path.startsWith(link.slice(1))) {
44
+ switch (_typeof(route.meta.frontmatter.nav)) {
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
+ }
56
+ }
57
+
58
+ return ret;
59
+ }, {});
60
+ return {
61
+ title: meta.title || groups[0].title || groups[0].children[0].title,
62
+ order: meta.order || 0,
63
+ link: groups[0].children[0].link,
64
+ activePath: link
65
+ };
66
+ }); // TODO: 2-level nav data
67
+
68
+ return data.sort(function (a, b) {
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
+ });
73
+ }),
74
+ _useState2 = _slicedToArray(_useState, 1),
75
+ nav = _useState2[0];
76
+
77
+ return nav;
78
+ };
@@ -2,4 +2,4 @@ import type { IRouteMeta } from './types';
2
2
  /**
3
3
  * hook for get matched route meta
4
4
  */
5
- export declare const useMatchedRouteMeta: () => IRouteMeta;
5
+ export declare const useRouteMeta: () => IRouteMeta;
@@ -16,7 +16,7 @@ import { useCallback, useEffect, useState } from 'react';
16
16
  /**
17
17
  * hook for get matched route meta
18
18
  */
19
- export var useMatchedRouteMeta = function useMatchedRouteMeta() {
19
+ export var useRouteMeta = function useRouteMeta() {
20
20
  var _useRouteData = useRouteData(),
21
21
  route = _useRouteData.route;
22
22
 
@@ -29,7 +29,7 @@ export var useMatchedRouteMeta = function useMatchedRouteMeta() {
29
29
  var getter = useCallback(function () {
30
30
  var ret;
31
31
 
32
- if (route.path === pathname) {
32
+ if (route.path === pathname && !('isLayout' in route)) {
33
33
  // use `useRouteData` result if matched, for performance
34
34
  ret = route.meta;
35
35
  } else {
@@ -40,7 +40,10 @@ export var useMatchedRouteMeta = function useMatchedRouteMeta() {
40
40
  ret = matched === null || matched === void 0 ? void 0 : (_matched$route = matched.route) === null || _matched$route === void 0 ? void 0 : _matched$route.meta;
41
41
  }
42
42
 
43
- return ret || {};
43
+ return ret || {
44
+ frontmatter: {},
45
+ toc: []
46
+ };
44
47
  }, [clientRoutes.length, pathname]);
45
48
 
46
49
  var _useState = useState(getter),
@@ -0,0 +1,8 @@
1
+ /**
2
+ * hook for get sidebar data for all nav
3
+ */
4
+ export declare const useFullSidebarData: () => any;
5
+ /**
6
+ * hook for get sidebar data for current nav
7
+ */
8
+ export declare const useSidebarData: () => any;
@@ -0,0 +1,131 @@
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
+
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
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
12
+
13
+ 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
+
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 _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; }
18
+
19
+ 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; }
20
+
21
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
22
+
23
+ import { useLocale, useLocation, useSiteData } from 'dumi';
24
+ import { useState } from 'react';
25
+ import { useLocaleDocRoutes } from "./utils";
26
+ var DEFAULT_GROUP_STUB_TITLE = '$default-group-title';
27
+
28
+ var getLocaleClearPath = function getLocaleClearPath(routePath, locale) {
29
+ return 'base' in locale ? routePath.replace(locale.base.slice(1), '').replace(/^\//, '') : routePath;
30
+ };
31
+ /**
32
+ * hook for get sidebar data for all nav
33
+ */
34
+
35
+
36
+ export var useFullSidebarData = function useFullSidebarData() {
37
+ var locale = useLocale();
38
+ var routes = useLocaleDocRoutes();
39
+
40
+ var _useSiteData = useSiteData(),
41
+ themeConfig = _useSiteData.themeConfig;
42
+
43
+ var _useState = useState(function () {
44
+ // auto generate sidebar data from routes
45
+ var data = Object.values(routes).reduce(function (ret, route) {
46
+ var clearPath = getLocaleClearPath(route.path, locale); // skip index routes
47
+
48
+ if (clearPath && route.meta) {
49
+ var _ret$parentPath, _ret$parentPath$title, _ret$parentPath$title2;
50
+
51
+ // extract parent path from route path
52
+ // a => /a
53
+ // en-US/a => /en-US/a
54
+ // a/b => /a
55
+ // en-US/a/b => /en-US/a
56
+ var parentPath = "/".concat(route.path.replace(/\/[^/]+$/, ''));
57
+
58
+ var _ref = _typeof(route.meta.frontmatter.group) === 'object' ? route.meta.frontmatter.group : {
59
+ title: route.meta.frontmatter.group
60
+ },
61
+ title = _ref.title,
62
+ _ref$order = _ref.order,
63
+ order = _ref$order === void 0 ? 0 : _ref$order;
64
+
65
+ var titleKey = title || DEFAULT_GROUP_STUB_TITLE; // create group data by nav path & group name
66
+
67
+ (_ret$parentPath = ret[parentPath]) !== null && _ret$parentPath !== void 0 ? _ret$parentPath : ret[parentPath] = {};
68
+ ret[parentPath][titleKey] = {
69
+ title: title,
70
+ order: ((_ret$parentPath$title = ret[parentPath][titleKey]) === null || _ret$parentPath$title === void 0 ? void 0 : _ret$parentPath$title.order) || order,
71
+ children: [].concat(_toConsumableArray(((_ret$parentPath$title2 = ret[parentPath][titleKey]) === null || _ret$parentPath$title2 === void 0 ? void 0 : _ret$parentPath$title2.children) || []), [{
72
+ title: route.meta.frontmatter.title,
73
+ link: "/".concat(route.path),
74
+ order: route.meta.frontmatter.order || 0
75
+ }])
76
+ };
77
+ }
78
+
79
+ return ret;
80
+ }, {}); // destruct sidebar data into sidebar config
81
+
82
+ var sidebarConfig = Object.entries(data).reduce(function (ret, _ref2) {
83
+ var _ref3 = _slicedToArray(_ref2, 2),
84
+ navPath = _ref3[0],
85
+ groups = _ref3[1];
86
+
87
+ ret[navPath] = Object.values(groups).sort(function (a, b) {
88
+ var _a$title;
89
+
90
+ return (// sort by group order
91
+ a.order - b.order || (a.title ? // sort by group title
92
+ (_a$title = a.title) === null || _a$title === void 0 ? void 0 : _a$title.localeCompare(b.title || '') : // put non-title group at the end
93
+ 1)
94
+ );
95
+ }); // sort group children by order or title
96
+
97
+ ret[navPath].forEach(function (group) {
98
+ return group.children.sort(function (a, b) {
99
+ return a.order - b.order || a.title.localeCompare(b.title);
100
+ });
101
+ });
102
+ return ret;
103
+ }, {}); // allow user partial override
104
+
105
+ return Object.assign(sidebarConfig, themeConfig.sidebar);
106
+ }),
107
+ _useState2 = _slicedToArray(_useState, 1),
108
+ sidebar = _useState2[0];
109
+
110
+ return sidebar;
111
+ };
112
+ /**
113
+ * hook for get sidebar data for current nav
114
+ */
115
+
116
+ export var useSidebarData = function useSidebarData() {
117
+ var locale = useLocale();
118
+ var sidebar = useFullSidebarData();
119
+
120
+ var _useLocation = useLocation(),
121
+ pathname = _useLocation.pathname;
122
+
123
+ var clearPath = getLocaleClearPath(pathname.slice(1), locale); // extract parent path from location pathname
124
+ // /a => /a
125
+ // /a/b => /a
126
+ // /en-US/a => /en-US/a
127
+ // /en-US/a/b => /en-US/a
128
+
129
+ var parentPath = clearPath ? pathname.replace(/(\/[^/]+)(\/[^/]+)$/, '$1') : pathname;
130
+ return parentPath ? sidebar[parentPath] : [];
131
+ };
@@ -0,0 +1,2 @@
1
+ import type { IRoutesById } from './types';
2
+ export declare const useLocaleDocRoutes: () => IRoutesById;
@@ -0,0 +1,44 @@
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 { useAppData, useIntl, useSiteData } from 'dumi';
14
+ import { useState } from 'react';
15
+ export var useLocaleDocRoutes = function useLocaleDocRoutes() {
16
+ var intl = useIntl();
17
+
18
+ var _useAppData = useAppData(),
19
+ routes = _useAppData.routes;
20
+
21
+ var _useSiteData = useSiteData(),
22
+ locales = _useSiteData.locales;
23
+
24
+ var _useState = useState(function () {
25
+ var reversedLocales = locales.slice().reverse();
26
+ return Object.values(routes).reduce(function (ret, route) {
27
+ var matched = reversedLocales.find(function (locale) {
28
+ return 'suffix' in locale ? // suffix mode
29
+ route.path.endsWith(locale.suffix) : // base mode
30
+ route.path.startsWith(locale.base.slice(1));
31
+ });
32
+
33
+ if (route.parentId === 'DocLayout' && matched.id === intl.locale) {
34
+ ret[route.id] = route;
35
+ }
36
+
37
+ return ret;
38
+ }, {});
39
+ }),
40
+ _useState2 = _slicedToArray(_useState, 1),
41
+ localeDocRoutes = _useState2[0];
42
+
43
+ return localeDocRoutes;
44
+ };
@@ -7,6 +7,7 @@
7
7
  "dumi": ["src"],
8
8
  "dumi/theme": ["src/client/theme-api"],
9
9
  "dumi/theme/*": ["src/client/theme-default/*"]
10
- }
10
+ },
11
+ "types": ["../../src/.umi/typings"]
11
12
  }
12
13
  }
@@ -1,2 +1,3 @@
1
1
  export declare const LOCAL_THEME_DIR = ".dumi/theme";
2
2
  export declare const THEME_PREFIX = "dumi-theme-";
3
+ export declare const SP_ROUTE_PREFIX = "~";