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.
@@ -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
- parent?: Omit<IRouteMeta['frontmatter']['nav'], 'parent'>;
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, will be removed in the future
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.parent', route.meta.frontmatter);
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
- rootMeta = _Object$values$reduce2[0],
108
- parentMeta = _Object$values$reduce2[1];
108
+ firstMeta = _Object$values$reduce2[0],
109
+ secondMeta = _Object$values$reduce2[1];
109
110
 
110
111
  if (isNestedNav) {
111
- var _parentMeta$title, _ret$parentPath, _parent$children;
112
+ var _firstMeta$title, _ret$parentPath, _second$children;
112
113
 
113
- // fallback to use parent path as title
114
- (_parentMeta$title = parentMeta.title) !== null && _parentMeta$title !== void 0 ? _parentMeta$title : parentMeta.title = parentPath.slice(1).replace(/^[a-z]/, function (s) {
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 parent = (_ret$parentPath = ret[parentPath]) !== null && _ret$parentPath !== void 0 ? _ret$parentPath : ret[parentPath] = genNavItem(parentMeta, groups, parentPath);
119
- (_parent$children = parent.children) !== null && _parent$children !== void 0 ? _parent$children : parent.children = [];
120
- ret[parentPath].children.push(genNavItem(rootMeta, groups, link, groups[0].children[0].link));
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(rootMeta, groups, link, groups[0].children[0].link);
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, isIndexRoute) {
43
- var paths = path.split('/');
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
- isIndexRoute ? paths.length : paths.length - 1, // least 1-level
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
- var _frontmatter$filename;
83
-
84
- return getRouteParentPath(s, (_frontmatter$filename = route.meta.frontmatter.filename) === null || _frontmatter$filename === void 0 ? void 0 : _frontmatter$filename.endsWith('index.md'));
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, _ref) {
112
- var _ref2 = _slicedToArray(_ref, 2),
113
- navPath = _ref2[0],
114
- groups = _ref2[1];
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, _ref3) {
184
- var _ref4 = _slicedToArray(_ref3, 2),
185
- path = _ref4[0],
186
- data = _ref4[1];
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 _useRouteMeta = useRouteMeta(),
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
- var _frontmatter$filename2;
254
-
255
- return getRouteParentPath(s, (_frontmatter$filename2 = frontmatter.filename) === null || _frontmatter$filename2 === void 0 ? void 0 : _frontmatter$filename2.endsWith('index.md'));
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.parent' | 'group', fm: IRouteMeta['frontmatter']) => Partial<Pick<INavItem, "title" | "order">>;
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.parent' ? _typeof(fm.nav) === 'object' ? fm.nav.parent : {} : fm[field];
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':
@@ -15,3 +15,4 @@ export declare const PICKED_PKG_FIELDS: {
15
15
  authors: string;
16
16
  };
17
17
  export declare const USELESS_TMP_FILES: string[];
18
+ export declare const VERSION_2_LEVEL_NAV = "^2.2.0";
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
  });
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dumi",
3
- "version": "2.2.0-rc.0",
3
+ "version": "2.2.0",
4
4
  "description": "📖 Documentation Generator of React Component",
5
5
  "keywords": [
6
6
  "generator",
@@ -78,8 +78,10 @@
78
78
  }
79
79
  }
80
80
 
81
- &[data-collapsed] > svg {
82
- transform: rotate(180deg);
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.5;
127
+ line-height: 1.6;
126
128
  text-align: left;
127
129
 
128
130
  @media @mobile {