@docusaurus/plugin-content-docs 2.0.0-beta.15a2b59f9 → 2.0.0-beta.17

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 (213) hide show
  1. package/lib/categoryGeneratedIndex.d.ts +12 -0
  2. package/lib/categoryGeneratedIndex.js +38 -0
  3. package/lib/cli.d.ts +2 -2
  4. package/lib/cli.js +27 -44
  5. package/lib/client/docsClientUtils.d.ts +3 -25
  6. package/lib/client/docsClientUtils.js +25 -24
  7. package/lib/{theme/hooks/useDocs.d.ts → client/index.d.ts} +1 -2
  8. package/lib/{theme/hooks/useDocs.js → client/index.js} +26 -26
  9. package/lib/docFrontMatter.d.ts +1 -1
  10. package/lib/docFrontMatter.js +9 -3
  11. package/lib/docs.d.ts +39 -3
  12. package/lib/docs.js +157 -53
  13. package/lib/globalData.d.ts +5 -1
  14. package/lib/globalData.js +35 -2
  15. package/lib/index.d.ts +4 -3
  16. package/lib/index.js +110 -144
  17. package/lib/lastUpdate.js +15 -28
  18. package/lib/markdown/index.d.ts +3 -6
  19. package/lib/markdown/index.js +3 -3
  20. package/lib/markdown/linkify.d.ts +1 -1
  21. package/lib/markdown/linkify.js +2 -2
  22. package/lib/numberPrefix.d.ts +1 -1
  23. package/lib/numberPrefix.js +9 -9
  24. package/lib/options.d.ts +3 -3
  25. package/lib/options.js +50 -10
  26. package/lib/props.d.ts +7 -2
  27. package/lib/props.js +66 -11
  28. package/lib/routes.d.ts +28 -0
  29. package/lib/routes.js +110 -0
  30. package/lib/server-export.d.ts +8 -0
  31. package/lib/server-export.js +23 -0
  32. package/lib/{sidebarItemsGenerator.d.ts → sidebars/generator.d.ts} +1 -6
  33. package/lib/sidebars/generator.js +193 -0
  34. package/lib/sidebars/index.d.ts +13 -0
  35. package/lib/sidebars/index.js +88 -0
  36. package/lib/sidebars/normalization.d.ts +13 -0
  37. package/lib/sidebars/normalization.js +55 -0
  38. package/lib/sidebars/postProcessor.d.ts +8 -0
  39. package/lib/sidebars/postProcessor.js +70 -0
  40. package/lib/sidebars/processor.d.ts +8 -0
  41. package/lib/sidebars/processor.js +79 -0
  42. package/lib/sidebars/types.d.ts +166 -0
  43. package/{src/__tests__/__fixtures__/site-with-autogenerated-sidebar/partialAutogeneratedSidebars2.js → lib/sidebars/types.js} +2 -10
  44. package/lib/sidebars/utils.d.ts +43 -0
  45. package/lib/sidebars/utils.js +259 -0
  46. package/lib/sidebars/validation.d.ts +9 -0
  47. package/lib/sidebars/validation.js +137 -0
  48. package/lib/slug.d.ts +6 -4
  49. package/lib/slug.js +28 -17
  50. package/{src/__tests__/__fixtures__/site-with-doc-label/docusaurus.config.js → lib/tags.d.ts} +2 -8
  51. package/lib/tags.js +21 -0
  52. package/lib/translations.d.ts +2 -2
  53. package/lib/translations.js +91 -49
  54. package/lib/types.d.ts +40 -126
  55. package/lib/versions.d.ts +29 -4
  56. package/lib/versions.js +92 -87
  57. package/package.json +30 -27
  58. package/src/categoryGeneratedIndex.ts +59 -0
  59. package/src/cli.ts +34 -54
  60. package/src/client/docsClientUtils.ts +32 -57
  61. package/src/{theme/hooks/useDocs.ts → client/index.ts} +11 -10
  62. package/{types.d.ts → src/deps.d.ts} +0 -0
  63. package/src/docFrontMatter.ts +12 -5
  64. package/src/docs.ts +213 -47
  65. package/src/globalData.ts +53 -2
  66. package/src/index.ts +151 -197
  67. package/src/lastUpdate.ts +14 -37
  68. package/src/markdown/index.ts +9 -13
  69. package/src/markdown/linkify.ts +1 -1
  70. package/src/numberPrefix.ts +11 -8
  71. package/src/options.ts +59 -15
  72. package/src/plugin-content-docs.d.ts +249 -54
  73. package/src/props.ts +97 -18
  74. package/src/routes.ts +185 -0
  75. package/src/server-export.ts +24 -0
  76. package/src/sidebars/README.md +9 -0
  77. package/src/sidebars/generator.ts +269 -0
  78. package/src/sidebars/index.ts +113 -0
  79. package/src/sidebars/normalization.ts +85 -0
  80. package/src/sidebars/postProcessor.ts +94 -0
  81. package/src/sidebars/processor.ts +126 -0
  82. package/src/sidebars/types.ts +273 -0
  83. package/src/sidebars/utils.ts +392 -0
  84. package/src/sidebars/validation.ts +173 -0
  85. package/src/slug.ts +39 -21
  86. package/src/tags.ts +19 -0
  87. package/src/translations.ts +121 -62
  88. package/src/types.ts +46 -183
  89. package/src/versions.ts +136 -102
  90. package/lib/.tsbuildinfo +0 -1
  91. package/lib/sidebarItemsGenerator.js +0 -211
  92. package/lib/sidebars.d.ts +0 -43
  93. package/lib/sidebars.js +0 -320
  94. package/src/__tests__/__fixtures__/bad-id-site/docs/invalid-id.md +0 -5
  95. package/src/__tests__/__fixtures__/bad-slug-on-doc-home-site/docs/docWithSlug.md +0 -5
  96. package/src/__tests__/__fixtures__/empty-site/docusaurus.config.js +0 -16
  97. package/src/__tests__/__fixtures__/empty-site/sidebars.json +0 -1
  98. package/src/__tests__/__fixtures__/sidebars/sidebars-category-shorthand.js +0 -34
  99. package/src/__tests__/__fixtures__/sidebars/sidebars-category-wrong-items.json +0 -11
  100. package/src/__tests__/__fixtures__/sidebars/sidebars-category-wrong-label.json +0 -11
  101. package/src/__tests__/__fixtures__/sidebars/sidebars-category.js +0 -44
  102. package/src/__tests__/__fixtures__/sidebars/sidebars-collapsed-first-level.json +0 -20
  103. package/src/__tests__/__fixtures__/sidebars/sidebars-collapsed.json +0 -21
  104. package/src/__tests__/__fixtures__/sidebars/sidebars-doc-id-not-string.json +0 -10
  105. package/src/__tests__/__fixtures__/sidebars/sidebars-first-level-not-category.js +0 -20
  106. package/src/__tests__/__fixtures__/sidebars/sidebars-link-wrong-href.json +0 -11
  107. package/src/__tests__/__fixtures__/sidebars/sidebars-link-wrong-label.json +0 -11
  108. package/src/__tests__/__fixtures__/sidebars/sidebars-link.json +0 -11
  109. package/src/__tests__/__fixtures__/sidebars/sidebars-unknown-type.json +0 -14
  110. package/src/__tests__/__fixtures__/sidebars/sidebars-wrong-field.json +0 -20
  111. package/src/__tests__/__fixtures__/sidebars/sidebars.json +0 -20
  112. package/src/__tests__/__fixtures__/simple-site/docs/foo/bar.md +0 -69
  113. package/src/__tests__/__fixtures__/simple-site/docs/foo/baz.md +0 -70
  114. package/src/__tests__/__fixtures__/simple-site/docs/headingAsTitle.md +0 -1
  115. package/src/__tests__/__fixtures__/simple-site/docs/hello.md +0 -53
  116. package/src/__tests__/__fixtures__/simple-site/docs/ipsum.md +0 -5
  117. package/src/__tests__/__fixtures__/simple-site/docs/lorem.md +0 -6
  118. package/src/__tests__/__fixtures__/simple-site/docs/rootAbsoluteSlug.md +0 -5
  119. package/src/__tests__/__fixtures__/simple-site/docs/rootRelativeSlug.md +0 -5
  120. package/src/__tests__/__fixtures__/simple-site/docs/rootResolvedSlug.md +0 -5
  121. package/src/__tests__/__fixtures__/simple-site/docs/rootTryToEscapeSlug.md +0 -5
  122. package/src/__tests__/__fixtures__/simple-site/docs/slugs/absoluteSlug.md +0 -5
  123. package/src/__tests__/__fixtures__/simple-site/docs/slugs/relativeSlug.md +0 -5
  124. package/src/__tests__/__fixtures__/simple-site/docs/slugs/resolvedSlug.md +0 -5
  125. package/src/__tests__/__fixtures__/simple-site/docs/slugs/tryToEscapeSlug.md +0 -5
  126. package/src/__tests__/__fixtures__/simple-site/docusaurus.config.js +0 -14
  127. package/src/__tests__/__fixtures__/simple-site/sidebars.json +0 -23
  128. package/src/__tests__/__fixtures__/simple-site/wrong-sidebars.json +0 -7
  129. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/0-getting-started.md +0 -3
  130. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/1-installation.md +0 -3
  131. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/00_api-overview.md +0 -3
  132. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/01_Core APIs/0 --- Client API.md +0 -1
  133. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/01_Core APIs/1 --- Server API.md +0 -1
  134. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/02_Extension APIs/0. Plugin API.md +0 -1
  135. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/02_Extension APIs/1. Theme API.md +0 -1
  136. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/02_Extension APIs/_category_.yml +0 -1
  137. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/03_api-end.md +0 -3
  138. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/_category_.json +0 -3
  139. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/0-guide2.5.md +0 -8
  140. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/02-guide2.md +0 -7
  141. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/_category_.json +0 -3
  142. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/a-guide4.md +0 -7
  143. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/b-guide5.md +0 -7
  144. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/guide3.md +0 -8
  145. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/z-guide1.md +0 -8
  146. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docusaurus.config.js +0 -14
  147. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/partialAutogeneratedSidebars.js +0 -23
  148. package/src/__tests__/__fixtures__/site-with-doc-label/docs/hello-1.md +0 -7
  149. package/src/__tests__/__fixtures__/site-with-doc-label/docs/hello-2.md +0 -8
  150. package/src/__tests__/__fixtures__/site-with-doc-label/sidebars.json +0 -14
  151. package/src/__tests__/__fixtures__/versioned-site/community/team.md +0 -1
  152. package/src/__tests__/__fixtures__/versioned-site/community_sidebars.json +0 -3
  153. package/src/__tests__/__fixtures__/versioned-site/community_versioned_docs/version-1.0.0/team.md +0 -1
  154. package/src/__tests__/__fixtures__/versioned-site/community_versioned_sidebars/version-1.0.0-sidebars.json +0 -3
  155. package/src/__tests__/__fixtures__/versioned-site/community_versions.json +0 -1
  156. package/src/__tests__/__fixtures__/versioned-site/docs/foo/bar.md +0 -4
  157. package/src/__tests__/__fixtures__/versioned-site/docs/hello.md +0 -1
  158. package/src/__tests__/__fixtures__/versioned-site/docs/slugs/absoluteSlug.md +0 -5
  159. package/src/__tests__/__fixtures__/versioned-site/docs/slugs/relativeSlug.md +0 -5
  160. package/src/__tests__/__fixtures__/versioned-site/docs/slugs/resolvedSlug.md +0 -5
  161. package/src/__tests__/__fixtures__/versioned-site/docs/slugs/tryToEscapeSlug.md +0 -5
  162. package/src/__tests__/__fixtures__/versioned-site/docusaurus.config.js +0 -18
  163. package/src/__tests__/__fixtures__/versioned-site/i18n/en/docusaurus-plugin-content-docs/version-1.0.0/hello.md +0 -1
  164. package/src/__tests__/__fixtures__/versioned-site/i18n/en/docusaurus-plugin-content-docs-community/current/team.md +0 -5
  165. package/src/__tests__/__fixtures__/versioned-site/i18n/fr/docusaurus-plugin-content-docs/version-1.0.0/hello.md +0 -1
  166. package/src/__tests__/__fixtures__/versioned-site/sidebars.json +0 -10
  167. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.0/foo/bar.md +0 -4
  168. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.0/foo/baz.md +0 -1
  169. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.0/hello.md +0 -1
  170. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.1/foo/bar.md +0 -1
  171. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.1/hello.md +0 -1
  172. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootAbsoluteSlug.md +0 -5
  173. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootRelativeSlug.md +0 -5
  174. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootResolvedSlug.md +0 -5
  175. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootTryToEscapeSlug.md +0 -5
  176. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/absoluteSlug.md +0 -5
  177. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/relativeSlug.md +0 -5
  178. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/resolvedSlug.md +0 -5
  179. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/tryToEscapeSlug.md +0 -5
  180. package/src/__tests__/__fixtures__/versioned-site/versioned_sidebars/version-1.0.0-sidebars.json +0 -11
  181. package/src/__tests__/__fixtures__/versioned-site/versioned_sidebars/version-1.0.1-sidebars.json +0 -10
  182. package/src/__tests__/__fixtures__/versioned-site/versioned_sidebars/version-withSlugs-sidebars.json +0 -5
  183. package/src/__tests__/__fixtures__/versioned-site/versions.json +0 -5
  184. package/src/__tests__/__snapshots__/cli.test.ts.snap +0 -90
  185. package/src/__tests__/__snapshots__/index.test.ts.snap +0 -1916
  186. package/src/__tests__/__snapshots__/sidebars.test.ts.snap +0 -218
  187. package/src/__tests__/__snapshots__/translations.test.ts.snap +0 -487
  188. package/src/__tests__/cli.test.ts +0 -333
  189. package/src/__tests__/docFrontMatter.test.ts +0 -244
  190. package/src/__tests__/docs.test.ts +0 -878
  191. package/src/__tests__/index.test.ts +0 -1871
  192. package/src/__tests__/lastUpdate.test.ts +0 -69
  193. package/src/__tests__/numberPrefix.test.ts +0 -199
  194. package/src/__tests__/options.test.ts +0 -231
  195. package/src/__tests__/sidebarItemsGenerator.test.ts +0 -336
  196. package/src/__tests__/sidebars.test.ts +0 -639
  197. package/src/__tests__/slug.test.ts +0 -109
  198. package/src/__tests__/translations.test.ts +0 -159
  199. package/src/__tests__/versions.test.ts +0 -741
  200. package/src/client/__tests__/docsClientUtils.test.ts +0 -371
  201. package/src/markdown/__tests__/__fixtures__/docs/doc-localized.md +0 -1
  202. package/src/markdown/__tests__/__fixtures__/docs/doc1.md +0 -13
  203. package/src/markdown/__tests__/__fixtures__/docs/doc2.md +0 -12
  204. package/src/markdown/__tests__/__fixtures__/docs/doc4.md +0 -19
  205. package/src/markdown/__tests__/__fixtures__/docs/doc5.md +0 -6
  206. package/src/markdown/__tests__/__fixtures__/docs/subdir/doc3.md +0 -3
  207. package/src/markdown/__tests__/__fixtures__/versioned_docs/version-1.0.0/doc2.md +0 -7
  208. package/src/markdown/__tests__/__fixtures__/versioned_docs/version-1.0.0/subdir/doc1.md +0 -3
  209. package/src/markdown/__tests__/__snapshots__/linkify.test.ts.snap +0 -82
  210. package/src/markdown/__tests__/linkify.test.ts +0 -190
  211. package/src/sidebarItemsGenerator.ts +0 -307
  212. package/src/sidebars.ts +0 -522
  213. package/tsconfig.json +0 -9
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+ import type { CategoryGeneratedIndexMetadata, DocMetadataBase } from './types';
8
+ import { type SidebarsUtils } from './sidebars/utils';
9
+ export declare function getCategoryGeneratedIndexMetadataList({ docs, sidebarsUtils, }: {
10
+ sidebarsUtils: SidebarsUtils;
11
+ docs: DocMetadataBase[];
12
+ }): CategoryGeneratedIndexMetadata[];
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright (c) Facebook, Inc. and its affiliates.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.getCategoryGeneratedIndexMetadataList = void 0;
10
+ const utils_1 = require("./sidebars/utils");
11
+ const docs_1 = require("./docs");
12
+ function getCategoryGeneratedIndexMetadata({ category, sidebarsUtils, docsById, }) {
13
+ const { sidebarName, previous, next } = sidebarsUtils.getCategoryGeneratedIndexNavigation(category.link.permalink);
14
+ if (!sidebarName) {
15
+ throw new Error('unexpected');
16
+ }
17
+ return {
18
+ title: category.link.title ?? category.label,
19
+ description: category.link.description,
20
+ image: category.link.image,
21
+ keywords: category.link.keywords,
22
+ slug: category.link.slug,
23
+ permalink: category.link.permalink,
24
+ sidebar: sidebarName,
25
+ previous: (0, utils_1.toNavigationLink)(previous, docsById),
26
+ next: (0, utils_1.toNavigationLink)(next, docsById),
27
+ };
28
+ }
29
+ function getCategoryGeneratedIndexMetadataList({ docs, sidebarsUtils, }) {
30
+ const docsById = (0, docs_1.createDocsByIdIndex)(docs);
31
+ const categoryGeneratedIndexItems = sidebarsUtils.getCategoryGeneratedIndexList();
32
+ return categoryGeneratedIndexItems.map((category) => getCategoryGeneratedIndexMetadata({
33
+ category,
34
+ sidebarsUtils,
35
+ docsById,
36
+ }));
37
+ }
38
+ exports.getCategoryGeneratedIndexMetadataList = getCategoryGeneratedIndexMetadataList;
package/lib/cli.d.ts CHANGED
@@ -4,5 +4,5 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
- import { PathOptions } from './types';
8
- export declare function cliDocsVersionCommand(version: string | null | undefined, siteDir: string, pluginId: string, options: PathOptions): void;
7
+ import type { PathOptions, SidebarOptions } from '@docusaurus/plugin-content-docs';
8
+ export declare function cliDocsVersionCommand(version: string | null | undefined, siteDir: string, pluginId: string, options: PathOptions & SidebarOptions): Promise<void>;
package/lib/cli.js CHANGED
@@ -12,47 +12,29 @@ const versions_1 = require("./versions");
12
12
  const fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
13
13
  const path_1 = tslib_1.__importDefault(require("path"));
14
14
  const sidebars_1 = require("./sidebars");
15
- const constants_1 = require("@docusaurus/core/lib/constants");
16
- function createVersionedSidebarFile({ siteDir, pluginId, sidebarPath, version, }) {
15
+ const utils_1 = require("@docusaurus/utils");
16
+ const logger_1 = tslib_1.__importDefault(require("@docusaurus/logger"));
17
+ async function createVersionedSidebarFile({ siteDir, pluginId, sidebarPath, version, }) {
17
18
  // Load current sidebar and create a new versioned sidebars file (if needed).
18
- const loadedSidebars = sidebars_1.loadSidebars(sidebarPath);
19
- // Do not create a useless versioned sidebars file if sidebars file is empty or sidebars are disabled/false)
20
- const shouldCreateVersionedSidebarFile = Object.keys(loadedSidebars).length > 0;
19
+ // Note: we don't need the sidebars file to be normalized: it's ok to let
20
+ // plugin option changes to impact older, versioned sidebars
21
+ // We don't validate here, assuming the user has already built the version
22
+ const sidebars = await (0, sidebars_1.loadSidebarsFileUnsafe)(sidebarPath);
23
+ // Do not create a useless versioned sidebars file if sidebars file is empty
24
+ // or sidebars are disabled/false)
25
+ const shouldCreateVersionedSidebarFile = Object.keys(sidebars).length > 0;
21
26
  if (shouldCreateVersionedSidebarFile) {
22
- // TODO @slorber: this "version prefix" in versioned sidebars looks like a bad idea to me
23
- // TODO try to get rid of it
24
- // Transform id in original sidebar to versioned id.
25
- const normalizeItem = (item) => {
26
- switch (item.type) {
27
- case 'category':
28
- return { ...item, items: item.items.map(normalizeItem) };
29
- case 'ref':
30
- case 'doc':
31
- return {
32
- type: item.type,
33
- id: `version-${version}/${item.id}`,
34
- };
35
- default:
36
- return item;
37
- }
38
- };
39
- const versionedSidebar = Object.entries(loadedSidebars).reduce((acc, [sidebarId, sidebarItems]) => {
40
- const newVersionedSidebarId = `version-${version}/${sidebarId}`;
41
- acc[newVersionedSidebarId] = sidebarItems.map(normalizeItem);
42
- return acc;
43
- }, {});
44
- const versionedSidebarsDir = versions_1.getVersionedSidebarsDirPath(siteDir, pluginId);
27
+ const versionedSidebarsDir = (0, versions_1.getVersionedSidebarsDirPath)(siteDir, pluginId);
45
28
  const newSidebarFile = path_1.default.join(versionedSidebarsDir, `version-${version}-sidebars.json`);
46
- fs_extra_1.default.ensureDirSync(path_1.default.dirname(newSidebarFile));
47
- fs_extra_1.default.writeFileSync(newSidebarFile, `${JSON.stringify(versionedSidebar, null, 2)}\n`, 'utf8');
29
+ await fs_extra_1.default.ensureDir(path_1.default.dirname(newSidebarFile));
30
+ await fs_extra_1.default.writeFile(newSidebarFile, `${JSON.stringify(sidebars, null, 2)}\n`, 'utf8');
48
31
  }
49
32
  }
50
33
  // Tests depend on non-default export for mocking.
51
- // eslint-disable-next-line import/prefer-default-export
52
- function cliDocsVersionCommand(version, siteDir, pluginId, options) {
34
+ async function cliDocsVersionCommand(version, siteDir, pluginId, options) {
53
35
  // It wouldn't be very user-friendly to show a [default] log prefix,
54
36
  // so we use [docs] instead of [default]
55
- const pluginIdLogPrefix = pluginId === constants_1.DEFAULT_PLUGIN_ID ? '[docs]' : `[${pluginId}]`;
37
+ const pluginIdLogPrefix = pluginId === utils_1.DEFAULT_PLUGIN_ID ? '[docs]' : `[${pluginId}]`;
56
38
  if (!version) {
57
39
  throw new Error(`${pluginIdLogPrefix}: no version tag specified! Pass the version you wish to create as an argument, for example: 1.0.0.`);
58
40
  }
@@ -73,9 +55,9 @@ function cliDocsVersionCommand(version, siteDir, pluginId, options) {
73
55
  }
74
56
  // Load existing versions.
75
57
  let versions = [];
76
- const versionsJSONFile = versions_1.getVersionsFilePath(siteDir, pluginId);
77
- if (fs_extra_1.default.existsSync(versionsJSONFile)) {
78
- versions = JSON.parse(fs_extra_1.default.readFileSync(versionsJSONFile, 'utf8'));
58
+ const versionsJSONFile = (0, versions_1.getVersionsFilePath)(siteDir, pluginId);
59
+ if (await fs_extra_1.default.pathExists(versionsJSONFile)) {
60
+ versions = JSON.parse(await fs_extra_1.default.readFile(versionsJSONFile, 'utf8'));
79
61
  }
80
62
  // Check if version already exists.
81
63
  if (versions.includes(version)) {
@@ -84,24 +66,25 @@ function cliDocsVersionCommand(version, siteDir, pluginId, options) {
84
66
  const { path: docsPath, sidebarPath } = options;
85
67
  // Copy docs files.
86
68
  const docsDir = path_1.default.join(siteDir, docsPath);
87
- if (fs_extra_1.default.existsSync(docsDir) && fs_extra_1.default.readdirSync(docsDir).length > 0) {
88
- const versionedDir = versions_1.getVersionedDocsDirPath(siteDir, pluginId);
69
+ if ((await fs_extra_1.default.pathExists(docsDir)) &&
70
+ (await fs_extra_1.default.readdir(docsDir)).length > 0) {
71
+ const versionedDir = (0, versions_1.getVersionedDocsDirPath)(siteDir, pluginId);
89
72
  const newVersionDir = path_1.default.join(versionedDir, `version-${version}`);
90
- fs_extra_1.default.copySync(docsDir, newVersionDir);
73
+ await fs_extra_1.default.copy(docsDir, newVersionDir);
91
74
  }
92
75
  else {
93
76
  throw new Error(`${pluginIdLogPrefix}: there is no docs to version!`);
94
77
  }
95
- createVersionedSidebarFile({
78
+ await createVersionedSidebarFile({
96
79
  siteDir,
97
80
  pluginId,
98
81
  version,
99
- sidebarPath: sidebars_1.resolveSidebarPathOption(siteDir, sidebarPath),
82
+ sidebarPath: (0, sidebars_1.resolveSidebarPathOption)(siteDir, sidebarPath),
100
83
  });
101
84
  // Update versions.json file.
102
85
  versions.unshift(version);
103
- fs_extra_1.default.ensureDirSync(path_1.default.dirname(versionsJSONFile));
104
- fs_extra_1.default.writeFileSync(versionsJSONFile, `${JSON.stringify(versions, null, 2)}\n`);
105
- console.log(`${pluginIdLogPrefix}: version ${version} created!`);
86
+ await fs_extra_1.default.ensureDir(path_1.default.dirname(versionsJSONFile));
87
+ await fs_extra_1.default.writeFile(versionsJSONFile, `${JSON.stringify(versions, null, 2)}\n`);
88
+ logger_1.default.success `name=${pluginIdLogPrefix}: version name=${version} created!`;
106
89
  }
107
90
  exports.cliDocsVersionCommand = cliDocsVersionCommand;
@@ -4,31 +4,9 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
- import { GlobalPluginData, GlobalVersion, GlobalDoc } from '../types';
8
- declare type Version = GlobalVersion;
9
- declare type Doc = GlobalDoc;
10
- export declare type ActivePlugin = {
11
- pluginId: string;
12
- pluginData: GlobalPluginData;
13
- };
14
- export declare type GetActivePluginOptions = {
15
- failfast?: boolean;
16
- };
17
- export declare function getActivePlugin(allPluginDatas: Record<string, GlobalPluginData>, pathname: string, options: {
18
- failfast: true;
19
- }): ActivePlugin;
7
+ import type { GlobalPluginData, GlobalVersion, GetActivePluginOptions, ActivePlugin, ActiveDocContext, DocVersionSuggestions } from '@docusaurus/plugin-content-docs/client';
20
8
  export declare function getActivePlugin(allPluginDatas: Record<string, GlobalPluginData>, pathname: string, options?: GetActivePluginOptions): ActivePlugin | undefined;
21
- export declare type ActiveDocContext = {
22
- activeVersion?: Version;
23
- activeDoc?: Doc;
24
- alternateDocVersions: Record<string, Doc>;
25
- };
26
- export declare const getLatestVersion: (data: GlobalPluginData) => Version;
27
- export declare const getActiveVersion: (data: GlobalPluginData, pathname: string) => Version | undefined;
9
+ export declare const getLatestVersion: (data: GlobalPluginData) => GlobalVersion;
10
+ export declare const getActiveVersion: (data: GlobalPluginData, pathname: string) => GlobalVersion | undefined;
28
11
  export declare const getActiveDocContext: (data: GlobalPluginData, pathname: string) => ActiveDocContext;
29
- export declare type DocVersionSuggestions = {
30
- latestVersionSuggestion: GlobalVersion;
31
- latestDocSuggestion?: GlobalDoc;
32
- };
33
12
  export declare const getDocVersionSuggestions: (data: GlobalPluginData, pathname: string) => DocVersionSuggestions;
34
- export {};
@@ -8,14 +8,19 @@
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.getDocVersionSuggestions = exports.getActiveDocContext = exports.getActiveVersion = exports.getLatestVersion = exports.getActivePlugin = void 0;
10
10
  const router_1 = require("@docusaurus/router");
11
+ // This code is not part of the api surface, not in ./theme on purpose
12
+ // get the data of the plugin that is currently "active"
13
+ // ie the docs of that plugin are currently browsed
14
+ // it is useful to support multiple docs plugin instances
11
15
  function getActivePlugin(allPluginDatas, pathname, options = {}) {
12
- const activeEntry = Object.entries(allPluginDatas).find(([_id, pluginData]) => {
13
- return !!router_1.matchPath(pathname, {
14
- path: pluginData.path,
15
- exact: false,
16
- strict: false,
17
- });
18
- });
16
+ const activeEntry = Object.entries(allPluginDatas)
17
+ // Route sorting: '/android/foo' should match '/android' instead of '/'
18
+ .sort((a, b) => b[1].path.localeCompare(a[1].path))
19
+ .find(([, pluginData]) => !!(0, router_1.matchPath)(pathname, {
20
+ path: pluginData.path,
21
+ exact: false,
22
+ strict: false,
23
+ }));
19
24
  const activePlugin = activeEntry
20
25
  ? { pluginId: activeEntry[0], pluginData: activeEntry[1] }
21
26
  : undefined;
@@ -27,32 +32,28 @@ function getActivePlugin(allPluginDatas, pathname, options = {}) {
27
32
  return activePlugin;
28
33
  }
29
34
  exports.getActivePlugin = getActivePlugin;
30
- const getLatestVersion = (data) => {
31
- return data.versions.find((version) => version.isLast);
32
- };
35
+ const getLatestVersion = (data) => data.versions.find((version) => version.isLast);
33
36
  exports.getLatestVersion = getLatestVersion;
34
37
  // Note: return undefined on doc-unrelated pages,
35
38
  // because there's no version currently considered as active
36
39
  const getActiveVersion = (data, pathname) => {
37
- const lastVersion = exports.getLatestVersion(data);
40
+ const lastVersion = (0, exports.getLatestVersion)(data);
38
41
  // Last version is a route like /docs/*,
39
- // we need to try to match it last or it would match /docs/version-1.0/* as well
42
+ // we need to match it last or it would match /docs/version-1.0/* as well
40
43
  const orderedVersionsMetadata = [
41
44
  ...data.versions.filter((version) => version !== lastVersion),
42
45
  lastVersion,
43
46
  ];
44
- return orderedVersionsMetadata.find((version) => {
45
- return !!router_1.matchPath(pathname, {
46
- path: version.path,
47
- exact: false,
48
- strict: false,
49
- });
50
- });
47
+ return orderedVersionsMetadata.find((version) => !!(0, router_1.matchPath)(pathname, {
48
+ path: version.path,
49
+ exact: false,
50
+ strict: false,
51
+ }));
51
52
  };
52
53
  exports.getActiveVersion = getActiveVersion;
53
54
  const getActiveDocContext = (data, pathname) => {
54
- const activeVersion = exports.getActiveVersion(data, pathname);
55
- const activeDoc = activeVersion === null || activeVersion === void 0 ? void 0 : activeVersion.docs.find((doc) => !!router_1.matchPath(pathname, {
55
+ const activeVersion = (0, exports.getActiveVersion)(data, pathname);
56
+ const activeDoc = activeVersion?.docs.find((doc) => !!(0, router_1.matchPath)(pathname, {
56
57
  path: doc.path,
57
58
  exact: true,
58
59
  strict: false,
@@ -79,9 +80,9 @@ const getActiveDocContext = (data, pathname) => {
79
80
  };
80
81
  exports.getActiveDocContext = getActiveDocContext;
81
82
  const getDocVersionSuggestions = (data, pathname) => {
82
- const latestVersion = exports.getLatestVersion(data);
83
- const activeDocContext = exports.getActiveDocContext(data, pathname);
84
- const latestDocSuggestion = activeDocContext === null || activeDocContext === void 0 ? void 0 : activeDocContext.alternateDocVersions[latestVersion.name];
83
+ const latestVersion = (0, exports.getLatestVersion)(data);
84
+ const activeDocContext = (0, exports.getActiveDocContext)(data, pathname);
85
+ const latestDocSuggestion = activeDocContext?.alternateDocVersions[latestVersion.name];
85
86
  return { latestDocSuggestion, latestVersionSuggestion: latestVersion };
86
87
  };
87
88
  exports.getDocVersionSuggestions = getDocVersionSuggestions;
@@ -4,8 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
- import { GlobalPluginData, GlobalVersion } from '../../types';
8
- import { ActivePlugin, ActiveDocContext, DocVersionSuggestions, GetActivePluginOptions } from '../../client/docsClientUtils';
7
+ import type { GlobalPluginData, GlobalVersion, ActivePlugin, ActiveDocContext, DocVersionSuggestions, GetActivePluginOptions } from '@docusaurus/plugin-content-docs/client';
9
8
  export declare const useAllDocsData: () => Record<string, GlobalPluginData>;
10
9
  export declare const useDocsData: (pluginId: string | undefined) => GlobalPluginData;
11
10
  export declare const useActivePlugin: (options?: GetActivePluginOptions) => ActivePlugin | undefined;
@@ -10,29 +10,29 @@ exports.useDocVersionSuggestions = exports.useActiveDocContext = exports.useActi
10
10
  const tslib_1 = require("tslib");
11
11
  const router_1 = require("@docusaurus/router");
12
12
  const useGlobalData_1 = tslib_1.__importStar(require("@docusaurus/useGlobalData"));
13
- const docsClientUtils_1 = require("../../client/docsClientUtils");
14
- // Important to use a constant object to avoid React useEffect executions etc...,
13
+ const docsClientUtils_1 = require("./docsClientUtils");
14
+ // Important to use a constant object to avoid React useEffect executions etc.
15
15
  // see https://github.com/facebook/docusaurus/issues/5089
16
16
  const StableEmptyObject = {};
17
- // Not using useAllPluginInstancesData() because in blog-only mode, docs hooks are still used by the theme
18
- // We need a fail-safe fallback when the docs plugin is not in use
19
- const useAllDocsData = () => { var _a;
20
- // useAllPluginInstancesData('docusaurus-plugin-content-docs');
21
- return (_a = useGlobalData_1.default()['docusaurus-plugin-content-docs']) !== null && _a !== void 0 ? _a : StableEmptyObject; };
17
+ // Not using useAllPluginInstancesData() because in blog-only mode, docs hooks
18
+ // are still used by the theme. We need a fail-safe fallback when the docs
19
+ // plugin is not in use
20
+ const useAllDocsData = () => (0, useGlobalData_1.default)()['docusaurus-plugin-content-docs'] ?? StableEmptyObject;
22
21
  exports.useAllDocsData = useAllDocsData;
23
- const useDocsData = (pluginId) => useGlobalData_1.usePluginData('docusaurus-plugin-content-docs', pluginId);
22
+ const useDocsData = (pluginId) => (0, useGlobalData_1.usePluginData)('docusaurus-plugin-content-docs', pluginId);
24
23
  exports.useDocsData = useDocsData;
24
+ // TODO this feature should be provided by docusaurus core
25
25
  const useActivePlugin = (options = {}) => {
26
- const data = exports.useAllDocsData();
27
- const { pathname } = router_1.useLocation();
28
- return docsClientUtils_1.getActivePlugin(data, pathname, options);
26
+ const data = (0, exports.useAllDocsData)();
27
+ const { pathname } = (0, router_1.useLocation)();
28
+ return (0, docsClientUtils_1.getActivePlugin)(data, pathname, options);
29
29
  };
30
30
  exports.useActivePlugin = useActivePlugin;
31
31
  const useActivePluginAndVersion = (options = {}) => {
32
- const activePlugin = exports.useActivePlugin(options);
33
- const { pathname } = router_1.useLocation();
32
+ const activePlugin = (0, exports.useActivePlugin)(options);
33
+ const { pathname } = (0, router_1.useLocation)();
34
34
  if (activePlugin) {
35
- const activeVersion = docsClientUtils_1.getActiveVersion(activePlugin.pluginData, pathname);
35
+ const activeVersion = (0, docsClientUtils_1.getActiveVersion)(activePlugin.pluginData, pathname);
36
36
  return {
37
37
  activePlugin,
38
38
  activeVersion,
@@ -43,33 +43,33 @@ const useActivePluginAndVersion = (options = {}) => {
43
43
  exports.useActivePluginAndVersion = useActivePluginAndVersion;
44
44
  // versions are returned ordered (most recent first)
45
45
  const useVersions = (pluginId) => {
46
- const data = exports.useDocsData(pluginId);
46
+ const data = (0, exports.useDocsData)(pluginId);
47
47
  return data.versions;
48
48
  };
49
49
  exports.useVersions = useVersions;
50
50
  const useLatestVersion = (pluginId) => {
51
- const data = exports.useDocsData(pluginId);
52
- return docsClientUtils_1.getLatestVersion(data);
51
+ const data = (0, exports.useDocsData)(pluginId);
52
+ return (0, docsClientUtils_1.getLatestVersion)(data);
53
53
  };
54
54
  exports.useLatestVersion = useLatestVersion;
55
55
  // Note: return undefined on doc-unrelated pages,
56
56
  // because there's no version currently considered as active
57
57
  const useActiveVersion = (pluginId) => {
58
- const data = exports.useDocsData(pluginId);
59
- const { pathname } = router_1.useLocation();
60
- return docsClientUtils_1.getActiveVersion(data, pathname);
58
+ const data = (0, exports.useDocsData)(pluginId);
59
+ const { pathname } = (0, router_1.useLocation)();
60
+ return (0, docsClientUtils_1.getActiveVersion)(data, pathname);
61
61
  };
62
62
  exports.useActiveVersion = useActiveVersion;
63
63
  const useActiveDocContext = (pluginId) => {
64
- const data = exports.useDocsData(pluginId);
65
- const { pathname } = router_1.useLocation();
66
- return docsClientUtils_1.getActiveDocContext(data, pathname);
64
+ const data = (0, exports.useDocsData)(pluginId);
65
+ const { pathname } = (0, router_1.useLocation)();
66
+ return (0, docsClientUtils_1.getActiveDocContext)(data, pathname);
67
67
  };
68
68
  exports.useActiveDocContext = useActiveDocContext;
69
69
  // Useful to say "hey, you are not on the latest docs version, please switch"
70
70
  const useDocVersionSuggestions = (pluginId) => {
71
- const data = exports.useDocsData(pluginId);
72
- const { pathname } = router_1.useLocation();
73
- return docsClientUtils_1.getDocVersionSuggestions(data, pathname);
71
+ const data = (0, exports.useDocsData)(pluginId);
72
+ const { pathname } = (0, router_1.useLocation)();
73
+ return (0, docsClientUtils_1.getDocVersionSuggestions)(data, pathname);
74
74
  };
75
75
  exports.useDocVersionSuggestions = useDocVersionSuggestions;
@@ -4,5 +4,5 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
- import { DocFrontMatter } from './types';
7
+ import type { DocFrontMatter } from './types';
8
8
  export declare function validateDocFrontMatter(frontMatter: Record<string, unknown>): DocFrontMatter;
@@ -7,10 +7,9 @@
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.validateDocFrontMatter = void 0;
10
- /* eslint-disable camelcase */
11
10
  const utils_validation_1 = require("@docusaurus/utils-validation");
12
11
  // NOTE: we don't add any default value on purpose here
13
- // We don't want default values to magically appear in doc metadatas and props
12
+ // We don't want default values to magically appear in doc metadata and props
14
13
  // While the user did not provide those values explicitly
15
14
  // We use default values in code instead
16
15
  const DocFrontMatterSchema = utils_validation_1.JoiFrontMatter.object({
@@ -24,11 +23,18 @@ const DocFrontMatterSchema = utils_validation_1.JoiFrontMatter.object({
24
23
  slug: utils_validation_1.JoiFrontMatter.string(),
25
24
  sidebar_label: utils_validation_1.JoiFrontMatter.string(),
26
25
  sidebar_position: utils_validation_1.JoiFrontMatter.number(),
26
+ sidebar_class_name: utils_validation_1.JoiFrontMatter.string(),
27
+ sidebar_custom_props: utils_validation_1.JoiFrontMatter.object().unknown(),
28
+ displayed_sidebar: utils_validation_1.JoiFrontMatter.string().allow(null),
29
+ tags: utils_validation_1.FrontMatterTagsSchema,
27
30
  pagination_label: utils_validation_1.JoiFrontMatter.string(),
28
31
  custom_edit_url: utils_validation_1.URISchema.allow('', null),
29
32
  parse_number_prefixes: utils_validation_1.JoiFrontMatter.boolean(),
33
+ pagination_next: utils_validation_1.JoiFrontMatter.string().allow(null),
34
+ pagination_prev: utils_validation_1.JoiFrontMatter.string().allow(null),
35
+ ...utils_validation_1.FrontMatterTOCHeadingLevels,
30
36
  }).unknown();
31
37
  function validateDocFrontMatter(frontMatter) {
32
- return utils_validation_1.validateFrontMatter(frontMatter, DocFrontMatterSchema);
38
+ return (0, utils_validation_1.validateFrontMatter)(frontMatter, DocFrontMatterSchema);
33
39
  }
34
40
  exports.validateDocFrontMatter = validateDocFrontMatter;
package/lib/docs.d.ts CHANGED
@@ -4,15 +4,51 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
- import { LoadContext } from '@docusaurus/types';
8
- import { DocFile, DocMetadataBase, MetadataOptions, PluginOptions, VersionMetadata } from './types';
7
+ import type { LoadContext } from '@docusaurus/types';
8
+ import type { DocFile, DocMetadataBase, VersionMetadata, LoadedVersion } from './types';
9
+ import type { SidebarsUtils } from './sidebars/utils';
10
+ import type { MetadataOptions, PluginOptions, CategoryIndexMatcher, CategoryIndexMatcherParam } from '@docusaurus/plugin-content-docs';
9
11
  declare type LastUpdateOptions = Pick<PluginOptions, 'showLastUpdateAuthor' | 'showLastUpdateTime'>;
10
12
  export declare function readDocFile(versionMetadata: Pick<VersionMetadata, 'contentPath' | 'contentPathLocalized'>, source: string, options: LastUpdateOptions): Promise<DocFile>;
11
- export declare function readVersionDocs(versionMetadata: VersionMetadata, options: Pick<PluginOptions, 'include' | 'showLastUpdateAuthor' | 'showLastUpdateTime'>): Promise<DocFile[]>;
13
+ export declare function readVersionDocs(versionMetadata: VersionMetadata, options: Pick<PluginOptions, 'include' | 'exclude' | 'showLastUpdateAuthor' | 'showLastUpdateTime'>): Promise<DocFile[]>;
12
14
  export declare function processDocMetadata(args: {
13
15
  docFile: DocFile;
14
16
  versionMetadata: VersionMetadata;
15
17
  context: LoadContext;
16
18
  options: MetadataOptions;
17
19
  }): DocMetadataBase;
20
+ export declare function addDocNavigation(docsBase: DocMetadataBase[], sidebarsUtils: SidebarsUtils, sidebarFilePath: string): LoadedVersion['docs'];
21
+ /**
22
+ * The "main doc" is the "version entry point"
23
+ * We browse this doc by clicking on a version:
24
+ * - the "home" doc (at '/docs/')
25
+ * - the first doc of the first sidebar
26
+ * - a random doc (if no docs are in any sidebar... edge case)
27
+ */
28
+ export declare function getMainDocId({ docs, sidebarsUtils, }: {
29
+ docs: DocMetadataBase[];
30
+ sidebarsUtils: SidebarsUtils;
31
+ }): string;
32
+ export declare const isCategoryIndex: CategoryIndexMatcher;
33
+ export declare function toCategoryIndexMatcherParam({ source, sourceDirName, }: Pick<DocMetadataBase, 'source' | 'sourceDirName'>): CategoryIndexMatcherParam;
34
+ /**
35
+ * `guides/sidebar/autogenerated.md` ->
36
+ * `'autogenerated', '.md', ['sidebar', 'guides']`
37
+ */
38
+ export declare function splitPath(str: string): {
39
+ /**
40
+ * The list of directories, from lowest level to highest.
41
+ * If there's no dir name, directories is ['.']
42
+ */
43
+ directories: string[];
44
+ /** The file name, without extension */
45
+ fileName: string;
46
+ /** The extension, with a leading dot */
47
+ extension: string;
48
+ };
49
+ export declare function getDocIds(doc: DocMetadataBase): [string, string];
50
+ export declare function createDocsByIdIndex<Doc extends {
51
+ id: string;
52
+ unversionedId: string;
53
+ }>(docs: Doc[]): Record<string, Doc>;
18
54
  export {};