@docusaurus/plugin-content-docs 2.0.0-beta.ff31de0ff → 2.0.0-rc.1

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 (231) hide show
  1. package/lib/categoryGeneratedIndex.d.ts +12 -0
  2. package/lib/categoryGeneratedIndex.js +37 -0
  3. package/lib/cli.d.ts +3 -2
  4. package/lib/cli.js +62 -72
  5. package/lib/client/docsClientUtils.d.ts +9 -28
  6. package/lib/client/docsClientUtils.js +35 -51
  7. package/lib/client/index.d.ts +81 -0
  8. package/lib/client/index.js +67 -0
  9. package/lib/constants.d.ts +4 -0
  10. package/lib/constants.js +4 -1
  11. package/lib/docs.d.ts +35 -8
  12. package/lib/docs.js +211 -78
  13. package/{src/__tests__/__fixtures__/site-with-autogenerated-sidebar/partialAutogeneratedSidebars2.js → lib/frontMatter.d.ts} +4 -10
  14. package/lib/frontMatter.js +53 -0
  15. package/lib/globalData.d.ts +3 -3
  16. package/lib/globalData.js +35 -6
  17. package/lib/index.d.ts +3 -3
  18. package/lib/index.js +137 -146
  19. package/lib/lastUpdate.d.ts +4 -6
  20. package/lib/lastUpdate.js +22 -26
  21. package/lib/markdown/index.d.ts +3 -6
  22. package/lib/markdown/index.js +3 -3
  23. package/lib/markdown/linkify.d.ts +1 -1
  24. package/lib/markdown/linkify.js +7 -4
  25. package/lib/numberPrefix.d.ts +1 -1
  26. package/lib/numberPrefix.js +16 -21
  27. package/lib/options.d.ts +3 -5
  28. package/lib/options.js +57 -29
  29. package/lib/props.d.ts +7 -2
  30. package/lib/props.js +87 -16
  31. package/lib/routes.d.ts +29 -0
  32. package/lib/routes.js +96 -0
  33. package/lib/server-export.d.ts +9 -0
  34. package/lib/server-export.js +25 -0
  35. package/lib/{sidebarItemsGenerator.d.ts → sidebars/generator.d.ts} +1 -6
  36. package/lib/sidebars/generator.js +209 -0
  37. package/lib/sidebars/index.d.ts +13 -0
  38. package/lib/sidebars/index.js +92 -0
  39. package/lib/sidebars/normalization.d.ts +13 -0
  40. package/lib/sidebars/normalization.js +59 -0
  41. package/lib/sidebars/postProcessor.d.ts +11 -0
  42. package/lib/sidebars/postProcessor.js +81 -0
  43. package/lib/sidebars/processor.d.ts +10 -0
  44. package/lib/sidebars/processor.js +79 -0
  45. package/lib/sidebars/types.d.ts +183 -0
  46. package/{types.d.ts → lib/sidebars/types.js} +2 -7
  47. package/lib/sidebars/utils.d.ts +55 -0
  48. package/lib/sidebars/utils.js +259 -0
  49. package/lib/sidebars/validation.d.ts +11 -0
  50. package/lib/sidebars/validation.js +143 -0
  51. package/lib/slug.d.ts +5 -4
  52. package/lib/slug.js +29 -19
  53. package/{src/__tests__/__fixtures__/sidebars/sidebars-first-level-not-category.js → lib/tags.d.ts} +3 -14
  54. package/lib/tags.js +21 -0
  55. package/lib/translations.d.ts +3 -3
  56. package/lib/translations.js +100 -93
  57. package/lib/types.d.ts +13 -172
  58. package/lib/versions/files.d.ts +50 -0
  59. package/lib/versions/files.js +141 -0
  60. package/lib/versions/index.d.ts +36 -0
  61. package/lib/versions/index.js +154 -0
  62. package/lib/versions/validation.d.ts +17 -0
  63. package/lib/versions/validation.js +71 -0
  64. package/package.json +44 -29
  65. package/src/categoryGeneratedIndex.ts +60 -0
  66. package/src/cli.ts +94 -114
  67. package/src/client/docsClientUtils.ts +47 -84
  68. package/src/client/index.ts +158 -0
  69. package/src/constants.ts +4 -2
  70. package/src/docs.ts +294 -78
  71. package/src/frontMatter.ts +63 -0
  72. package/src/globalData.ts +57 -7
  73. package/src/index.ts +200 -204
  74. package/src/lastUpdate.ts +27 -34
  75. package/src/markdown/index.ts +10 -16
  76. package/src/markdown/linkify.ts +8 -5
  77. package/src/numberPrefix.ts +19 -26
  78. package/src/options.ts +61 -43
  79. package/src/plugin-content-docs.d.ts +575 -78
  80. package/src/props.ts +128 -23
  81. package/src/routes.ts +159 -0
  82. package/src/server-export.ts +26 -0
  83. package/src/sidebars/README.md +10 -0
  84. package/src/sidebars/generator.ts +292 -0
  85. package/src/sidebars/index.ts +118 -0
  86. package/src/sidebars/normalization.ts +91 -0
  87. package/src/sidebars/postProcessor.ts +112 -0
  88. package/src/sidebars/processor.ts +123 -0
  89. package/src/sidebars/types.ts +280 -0
  90. package/src/sidebars/utils.ts +393 -0
  91. package/src/sidebars/validation.ts +179 -0
  92. package/src/slug.ts +42 -23
  93. package/src/tags.ts +20 -0
  94. package/src/translations.ts +155 -124
  95. package/src/types.ts +17 -234
  96. package/src/versions/files.ts +216 -0
  97. package/src/versions/index.ts +246 -0
  98. package/src/versions/validation.ts +115 -0
  99. package/lib/.tsbuildinfo +0 -4673
  100. package/lib/docFrontMatter.d.ts +0 -21
  101. package/lib/docFrontMatter.js +0 -33
  102. package/lib/sidebarItemsGenerator.js +0 -211
  103. package/lib/sidebars.d.ts +0 -42
  104. package/lib/sidebars.js +0 -309
  105. package/lib/theme/hooks/useDocs.d.ts +0 -20
  106. package/lib/theme/hooks/useDocs.js +0 -72
  107. package/lib/versions.d.ts +0 -16
  108. package/lib/versions.js +0 -287
  109. package/src/__tests__/__fixtures__/bad-id-site/docs/invalid-id.md +0 -5
  110. package/src/__tests__/__fixtures__/bad-slug-on-doc-home-site/docs/docWithSlug.md +0 -5
  111. package/src/__tests__/__fixtures__/empty-site/docusaurus.config.js +0 -16
  112. package/src/__tests__/__fixtures__/empty-site/sidebars.json +0 -1
  113. package/src/__tests__/__fixtures__/sidebars/sidebars-category-shorthand.js +0 -34
  114. package/src/__tests__/__fixtures__/sidebars/sidebars-category-wrong-items.json +0 -11
  115. package/src/__tests__/__fixtures__/sidebars/sidebars-category-wrong-label.json +0 -11
  116. package/src/__tests__/__fixtures__/sidebars/sidebars-category.js +0 -44
  117. package/src/__tests__/__fixtures__/sidebars/sidebars-collapsed-first-level.json +0 -20
  118. package/src/__tests__/__fixtures__/sidebars/sidebars-collapsed.json +0 -21
  119. package/src/__tests__/__fixtures__/sidebars/sidebars-doc-id-not-string.json +0 -10
  120. package/src/__tests__/__fixtures__/sidebars/sidebars-link-wrong-href.json +0 -11
  121. package/src/__tests__/__fixtures__/sidebars/sidebars-link-wrong-label.json +0 -11
  122. package/src/__tests__/__fixtures__/sidebars/sidebars-link.json +0 -11
  123. package/src/__tests__/__fixtures__/sidebars/sidebars-unknown-type.json +0 -14
  124. package/src/__tests__/__fixtures__/sidebars/sidebars-wrong-field.json +0 -20
  125. package/src/__tests__/__fixtures__/sidebars/sidebars.json +0 -20
  126. package/src/__tests__/__fixtures__/simple-site/docs/foo/bar.md +0 -69
  127. package/src/__tests__/__fixtures__/simple-site/docs/foo/baz.md +0 -67
  128. package/src/__tests__/__fixtures__/simple-site/docs/headingAsTitle.md +0 -1
  129. package/src/__tests__/__fixtures__/simple-site/docs/hello.md +0 -52
  130. package/src/__tests__/__fixtures__/simple-site/docs/ipsum.md +0 -5
  131. package/src/__tests__/__fixtures__/simple-site/docs/lorem.md +0 -6
  132. package/src/__tests__/__fixtures__/simple-site/docs/rootAbsoluteSlug.md +0 -5
  133. package/src/__tests__/__fixtures__/simple-site/docs/rootRelativeSlug.md +0 -5
  134. package/src/__tests__/__fixtures__/simple-site/docs/rootResolvedSlug.md +0 -5
  135. package/src/__tests__/__fixtures__/simple-site/docs/rootTryToEscapeSlug.md +0 -5
  136. package/src/__tests__/__fixtures__/simple-site/docs/slugs/absoluteSlug.md +0 -5
  137. package/src/__tests__/__fixtures__/simple-site/docs/slugs/relativeSlug.md +0 -5
  138. package/src/__tests__/__fixtures__/simple-site/docs/slugs/resolvedSlug.md +0 -5
  139. package/src/__tests__/__fixtures__/simple-site/docs/slugs/tryToEscapeSlug.md +0 -5
  140. package/src/__tests__/__fixtures__/simple-site/docusaurus.config.js +0 -14
  141. package/src/__tests__/__fixtures__/simple-site/sidebars.json +0 -23
  142. package/src/__tests__/__fixtures__/simple-site/wrong-sidebars.json +0 -7
  143. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/0-getting-started.md +0 -3
  144. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/1-installation.md +0 -3
  145. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/00_api-overview.md +0 -3
  146. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/01_Core APIs/0 --- Client API.md +0 -1
  147. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/01_Core APIs/1 --- Server API.md +0 -1
  148. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/02_Extension APIs/0. Plugin API.md +0 -1
  149. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/02_Extension APIs/1. Theme API.md +0 -1
  150. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/02_Extension APIs/_category_.yml +0 -1
  151. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/03_api-end.md +0 -3
  152. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/_category_.json +0 -3
  153. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/0-guide2.5.md +0 -8
  154. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/02-guide2.md +0 -7
  155. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/_category_.json +0 -3
  156. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/a-guide4.md +0 -7
  157. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/b-guide5.md +0 -7
  158. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/guide3.md +0 -8
  159. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/z-guide1.md +0 -8
  160. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docusaurus.config.js +0 -14
  161. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/partialAutogeneratedSidebars.js +0 -23
  162. package/src/__tests__/__fixtures__/site-with-doc-label/docs/hello-1.md +0 -7
  163. package/src/__tests__/__fixtures__/site-with-doc-label/docs/hello-2.md +0 -8
  164. package/src/__tests__/__fixtures__/site-with-doc-label/docusaurus.config.js +0 -14
  165. package/src/__tests__/__fixtures__/site-with-doc-label/sidebars.json +0 -14
  166. package/src/__tests__/__fixtures__/versioned-site/community/team.md +0 -1
  167. package/src/__tests__/__fixtures__/versioned-site/community_sidebars.json +0 -3
  168. package/src/__tests__/__fixtures__/versioned-site/community_versioned_docs/version-1.0.0/team.md +0 -1
  169. package/src/__tests__/__fixtures__/versioned-site/community_versioned_sidebars/version-1.0.0-sidebars.json +0 -3
  170. package/src/__tests__/__fixtures__/versioned-site/community_versions.json +0 -1
  171. package/src/__tests__/__fixtures__/versioned-site/docs/foo/bar.md +0 -4
  172. package/src/__tests__/__fixtures__/versioned-site/docs/hello.md +0 -1
  173. package/src/__tests__/__fixtures__/versioned-site/docs/slugs/absoluteSlug.md +0 -5
  174. package/src/__tests__/__fixtures__/versioned-site/docs/slugs/relativeSlug.md +0 -5
  175. package/src/__tests__/__fixtures__/versioned-site/docs/slugs/resolvedSlug.md +0 -5
  176. package/src/__tests__/__fixtures__/versioned-site/docs/slugs/tryToEscapeSlug.md +0 -5
  177. package/src/__tests__/__fixtures__/versioned-site/docusaurus.config.js +0 -18
  178. package/src/__tests__/__fixtures__/versioned-site/i18n/en/docusaurus-plugin-content-docs/version-1.0.0/hello.md +0 -1
  179. package/src/__tests__/__fixtures__/versioned-site/i18n/en/docusaurus-plugin-content-docs-community/current/team.md +0 -5
  180. package/src/__tests__/__fixtures__/versioned-site/i18n/fr/docusaurus-plugin-content-docs/version-1.0.0/hello.md +0 -1
  181. package/src/__tests__/__fixtures__/versioned-site/sidebars.json +0 -10
  182. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.0/foo/bar.md +0 -4
  183. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.0/foo/baz.md +0 -1
  184. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.0/hello.md +0 -1
  185. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.1/foo/bar.md +0 -1
  186. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.1/hello.md +0 -1
  187. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootAbsoluteSlug.md +0 -5
  188. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootRelativeSlug.md +0 -5
  189. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootResolvedSlug.md +0 -5
  190. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootTryToEscapeSlug.md +0 -5
  191. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/absoluteSlug.md +0 -5
  192. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/relativeSlug.md +0 -5
  193. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/resolvedSlug.md +0 -5
  194. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/tryToEscapeSlug.md +0 -5
  195. package/src/__tests__/__fixtures__/versioned-site/versioned_sidebars/version-1.0.0-sidebars.json +0 -11
  196. package/src/__tests__/__fixtures__/versioned-site/versioned_sidebars/version-1.0.1-sidebars.json +0 -10
  197. package/src/__tests__/__fixtures__/versioned-site/versioned_sidebars/version-withSlugs-sidebars.json +0 -5
  198. package/src/__tests__/__fixtures__/versioned-site/versions.json +0 -5
  199. package/src/__tests__/__snapshots__/cli.test.ts.snap +0 -90
  200. package/src/__tests__/__snapshots__/index.test.ts.snap +0 -1907
  201. package/src/__tests__/__snapshots__/sidebars.test.ts.snap +0 -218
  202. package/src/__tests__/__snapshots__/translations.test.ts.snap +0 -487
  203. package/src/__tests__/cli.test.ts +0 -333
  204. package/src/__tests__/docFrontMatter.test.ts +0 -204
  205. package/src/__tests__/docs.test.ts +0 -875
  206. package/src/__tests__/index.test.ts +0 -1831
  207. package/src/__tests__/lastUpdate.test.ts +0 -68
  208. package/src/__tests__/numberPrefix.test.ts +0 -199
  209. package/src/__tests__/options.test.ts +0 -232
  210. package/src/__tests__/sidebarItemsGenerator.test.ts +0 -336
  211. package/src/__tests__/sidebars.test.ts +0 -638
  212. package/src/__tests__/slug.test.ts +0 -109
  213. package/src/__tests__/translations.test.ts +0 -159
  214. package/src/__tests__/versions.test.ts +0 -718
  215. package/src/client/__tests__/docsClientUtils.test.ts +0 -372
  216. package/src/docFrontMatter.ts +0 -53
  217. package/src/markdown/__tests__/__fixtures__/docs/doc-localized.md +0 -1
  218. package/src/markdown/__tests__/__fixtures__/docs/doc1.md +0 -13
  219. package/src/markdown/__tests__/__fixtures__/docs/doc2.md +0 -12
  220. package/src/markdown/__tests__/__fixtures__/docs/doc4.md +0 -19
  221. package/src/markdown/__tests__/__fixtures__/docs/doc5.md +0 -6
  222. package/src/markdown/__tests__/__fixtures__/docs/subdir/doc3.md +0 -3
  223. package/src/markdown/__tests__/__fixtures__/versioned_docs/version-1.0.0/doc2.md +0 -7
  224. package/src/markdown/__tests__/__fixtures__/versioned_docs/version-1.0.0/subdir/doc1.md +0 -3
  225. package/src/markdown/__tests__/__snapshots__/linkify.test.ts.snap +0 -82
  226. package/src/markdown/__tests__/linkify.test.ts +0 -190
  227. package/src/sidebarItemsGenerator.ts +0 -307
  228. package/src/sidebars.ts +0 -489
  229. package/src/theme/hooks/useDocs.ts +0 -99
  230. package/src/versions.ts +0 -511
  231. package/tsconfig.json +0 -9
package/src/sidebars.ts DELETED
@@ -1,489 +0,0 @@
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
-
8
- import fs from 'fs-extra';
9
- import importFresh from 'import-fresh';
10
- import {
11
- Sidebars,
12
- SidebarItem,
13
- SidebarItemBase,
14
- SidebarItemLink,
15
- SidebarItemDoc,
16
- Sidebar,
17
- SidebarItemCategory,
18
- SidebarItemType,
19
- UnprocessedSidebarItem,
20
- UnprocessedSidebars,
21
- UnprocessedSidebar,
22
- DocMetadataBase,
23
- VersionMetadata,
24
- SidebarItemsGeneratorDoc,
25
- SidebarItemsGeneratorVersion,
26
- NumberPrefixParser,
27
- SidebarItemsGeneratorOption,
28
- } from './types';
29
- import {mapValues, flatten, flatMap, difference, pick, memoize} from 'lodash';
30
- import {getElementsAround} from '@docusaurus/utils';
31
- import combinePromises from 'combine-promises';
32
- import {DefaultSidebarItemsGenerator} from './sidebarItemsGenerator';
33
-
34
- type SidebarItemCategoryJSON = SidebarItemBase & {
35
- type: 'category';
36
- label: string;
37
- items: SidebarItemJSON[];
38
- collapsed?: boolean;
39
- };
40
-
41
- type SidebarItemAutogeneratedJSON = SidebarItemBase & {
42
- type: 'autogenerated';
43
- dirName: string;
44
- };
45
-
46
- type SidebarItemJSON =
47
- | string
48
- | SidebarCategoryShorthandJSON
49
- | SidebarItemDoc
50
- | SidebarItemLink
51
- | SidebarItemCategoryJSON
52
- | SidebarItemAutogeneratedJSON
53
- | {
54
- type: string;
55
- [key: string]: unknown;
56
- };
57
-
58
- type SidebarCategoryShorthandJSON = {
59
- [sidebarCategory: string]: SidebarItemJSON[];
60
- };
61
-
62
- type SidebarJSON = SidebarCategoryShorthandJSON | SidebarItemJSON[];
63
-
64
- // Sidebar given by user that is not normalized yet. e.g: sidebars.json
65
- type SidebarsJSON = {
66
- [sidebarId: string]: SidebarJSON;
67
- };
68
-
69
- function isCategoryShorthand(
70
- item: SidebarItemJSON,
71
- ): item is SidebarCategoryShorthandJSON {
72
- return typeof item !== 'string' && !item.type;
73
- }
74
-
75
- // categories are collapsed by default, unless user set collapsed = false
76
- export const DefaultCategoryCollapsedValue = true;
77
-
78
- /**
79
- * Convert {category1: [item1,item2]} shorthand syntax to long-form syntax
80
- */
81
- function normalizeCategoryShorthand(
82
- sidebar: SidebarCategoryShorthandJSON,
83
- ): SidebarItemCategoryJSON[] {
84
- return Object.entries(sidebar).map(([label, items]) => ({
85
- type: 'category',
86
- collapsed: DefaultCategoryCollapsedValue,
87
- label,
88
- items,
89
- }));
90
- }
91
-
92
- /**
93
- * Check that item contains only allowed keys.
94
- */
95
- function assertItem<K extends string>(
96
- item: Record<string, unknown>,
97
- keys: K[],
98
- ): asserts item is Record<K, unknown> {
99
- const unknownKeys = Object.keys(item).filter(
100
- // @ts-expect-error: key is always string
101
- (key) => !keys.includes(key as string) && key !== 'type',
102
- );
103
-
104
- if (unknownKeys.length) {
105
- throw new Error(
106
- `Unknown sidebar item keys: ${unknownKeys}. Item: ${JSON.stringify(
107
- item,
108
- )}`,
109
- );
110
- }
111
- }
112
-
113
- function assertIsCategory(
114
- item: Record<string, unknown>,
115
- ): asserts item is SidebarItemCategoryJSON {
116
- assertItem(item, ['items', 'label', 'collapsed', 'customProps']);
117
- if (typeof item.label !== 'string') {
118
- throw new Error(
119
- `Error loading ${JSON.stringify(item)}. "label" must be a string.`,
120
- );
121
- }
122
- if (!Array.isArray(item.items)) {
123
- throw new Error(
124
- `Error loading ${JSON.stringify(item)}. "items" must be an array.`,
125
- );
126
- }
127
- // "collapsed" is an optional property
128
- if (item.hasOwnProperty('collapsed') && typeof item.collapsed !== 'boolean') {
129
- throw new Error(
130
- `Error loading ${JSON.stringify(item)}. "collapsed" must be a boolean.`,
131
- );
132
- }
133
- }
134
-
135
- function assertIsAutogenerated(
136
- item: Record<string, unknown>,
137
- ): asserts item is SidebarItemAutogeneratedJSON {
138
- assertItem(item, ['dirName', 'customProps']);
139
- if (typeof item.dirName !== 'string') {
140
- throw new Error(
141
- `Error loading ${JSON.stringify(item)}. "dirName" must be a string.`,
142
- );
143
- }
144
- if (item.dirName.startsWith('/') || item.dirName.endsWith('/')) {
145
- throw new Error(
146
- `Error loading ${JSON.stringify(
147
- item,
148
- )}. "dirName" must be a dir path relative to the docs folder root, and should not start or end with /`,
149
- );
150
- }
151
- }
152
-
153
- function assertIsDoc(
154
- item: Record<string, unknown>,
155
- ): asserts item is SidebarItemDoc {
156
- assertItem(item, ['id', 'label', 'customProps']);
157
- if (typeof item.id !== 'string') {
158
- throw new Error(
159
- `Error loading ${JSON.stringify(item)}. "id" must be a string.`,
160
- );
161
- }
162
-
163
- if (item.label && typeof item.label !== 'string') {
164
- throw new Error(
165
- `Error loading ${JSON.stringify(item)}. "label" must be a string.`,
166
- );
167
- }
168
- }
169
-
170
- function assertIsLink(
171
- item: Record<string, unknown>,
172
- ): asserts item is SidebarItemLink {
173
- assertItem(item, ['href', 'label', 'customProps']);
174
- if (typeof item.href !== 'string') {
175
- throw new Error(
176
- `Error loading ${JSON.stringify(item)}. "href" must be a string.`,
177
- );
178
- }
179
- if (typeof item.label !== 'string') {
180
- throw new Error(
181
- `Error loading ${JSON.stringify(item)}. "label" must be a string.`,
182
- );
183
- }
184
- }
185
-
186
- /**
187
- * Normalizes recursively item and all its children. Ensures that at the end
188
- * each item will be an object with the corresponding type.
189
- */
190
- function normalizeItem(item: SidebarItemJSON): UnprocessedSidebarItem[] {
191
- if (typeof item === 'string') {
192
- return [
193
- {
194
- type: 'doc',
195
- id: item,
196
- },
197
- ];
198
- }
199
- if (isCategoryShorthand(item)) {
200
- return flatMap(normalizeCategoryShorthand(item), normalizeItem);
201
- }
202
- switch (item.type) {
203
- case 'category':
204
- assertIsCategory(item);
205
- return [
206
- {
207
- collapsed: DefaultCategoryCollapsedValue,
208
- ...item,
209
- items: flatMap(item.items, normalizeItem),
210
- },
211
- ];
212
- case 'autogenerated':
213
- assertIsAutogenerated(item);
214
- return [item];
215
- case 'link':
216
- assertIsLink(item);
217
- return [item];
218
- case 'ref':
219
- case 'doc':
220
- assertIsDoc(item);
221
- return [item];
222
- default: {
223
- const extraMigrationError =
224
- item.type === 'subcategory'
225
- ? "Docusaurus v2: 'subcategory' has been renamed as 'category'"
226
- : '';
227
- throw new Error(
228
- `Unknown sidebar item type [${
229
- item.type
230
- }]. Sidebar item=${JSON.stringify(item)} ${extraMigrationError}`,
231
- );
232
- }
233
- }
234
- }
235
-
236
- function normalizeSidebar(sidebar: SidebarJSON): UnprocessedSidebar {
237
- const normalizedSidebar: SidebarItemJSON[] = Array.isArray(sidebar)
238
- ? sidebar
239
- : normalizeCategoryShorthand(sidebar);
240
-
241
- return flatMap(normalizedSidebar, normalizeItem);
242
- }
243
-
244
- function normalizeSidebars(sidebars: SidebarsJSON): UnprocessedSidebars {
245
- return mapValues(sidebars, normalizeSidebar);
246
- }
247
-
248
- export const DefaultSidebars: UnprocessedSidebars = {
249
- defaultSidebar: [
250
- {
251
- type: 'autogenerated',
252
- dirName: '.',
253
- },
254
- ],
255
- };
256
-
257
- export const DisabledSidebars: UnprocessedSidebars = {};
258
-
259
- // TODO refactor: make async
260
- export function loadSidebars(
261
- sidebarFilePath: string | false | undefined,
262
- ): UnprocessedSidebars {
263
- // false => no sidebars
264
- if (sidebarFilePath === false) {
265
- return DisabledSidebars;
266
- }
267
-
268
- // undefined => defaults to autogenerated sidebars
269
- if (typeof sidebarFilePath === 'undefined') {
270
- return DefaultSidebars;
271
- }
272
-
273
- // unexisting sidebars file: no sidebars
274
- // Note: this edge case can happen on versioned docs, not current version
275
- // We avoid creating empty versioned sidebars file with the CLI
276
- if (!fs.existsSync(sidebarFilePath)) {
277
- return DisabledSidebars;
278
- }
279
-
280
- // We don't want sidebars to be cached because of hot reloading.
281
- const sidebarJson = importFresh(sidebarFilePath) as SidebarsJSON;
282
- return normalizeSidebars(sidebarJson);
283
- }
284
-
285
- export function toSidebarItemsGeneratorDoc(
286
- doc: DocMetadataBase,
287
- ): SidebarItemsGeneratorDoc {
288
- return pick(doc, [
289
- 'id',
290
- 'frontMatter',
291
- 'source',
292
- 'sourceDirName',
293
- 'sidebarPosition',
294
- ]);
295
- }
296
- export function toSidebarItemsGeneratorVersion(
297
- version: VersionMetadata,
298
- ): SidebarItemsGeneratorVersion {
299
- return pick(version, ['versionName', 'contentPath']);
300
- }
301
-
302
- // Handle the generation of autogenerated sidebar items
303
- export async function processSidebar({
304
- sidebarItemsGenerator,
305
- numberPrefixParser,
306
- unprocessedSidebar,
307
- docs,
308
- version,
309
- }: {
310
- sidebarItemsGenerator: SidebarItemsGeneratorOption;
311
- numberPrefixParser: NumberPrefixParser;
312
- unprocessedSidebar: UnprocessedSidebar;
313
- docs: DocMetadataBase[];
314
- version: VersionMetadata;
315
- }): Promise<Sidebar> {
316
- // Just a minor lazy transformation optimization
317
- const getSidebarItemsGeneratorDocsAndVersion = memoize(() => ({
318
- docs: docs.map(toSidebarItemsGeneratorDoc),
319
- version: toSidebarItemsGeneratorVersion(version),
320
- }));
321
-
322
- async function processRecursive(
323
- item: UnprocessedSidebarItem,
324
- ): Promise<SidebarItem[]> {
325
- if (item.type === 'category') {
326
- return [
327
- {
328
- ...item,
329
- items: (await Promise.all(item.items.map(processRecursive))).flat(),
330
- },
331
- ];
332
- }
333
- if (item.type === 'autogenerated') {
334
- return sidebarItemsGenerator({
335
- item,
336
- numberPrefixParser,
337
- defaultSidebarItemsGenerator: DefaultSidebarItemsGenerator,
338
- ...getSidebarItemsGeneratorDocsAndVersion(),
339
- });
340
- }
341
- return [item];
342
- }
343
-
344
- return (await Promise.all(unprocessedSidebar.map(processRecursive))).flat();
345
- }
346
-
347
- export async function processSidebars({
348
- sidebarItemsGenerator,
349
- numberPrefixParser,
350
- unprocessedSidebars,
351
- docs,
352
- version,
353
- }: {
354
- sidebarItemsGenerator: SidebarItemsGeneratorOption;
355
- numberPrefixParser: NumberPrefixParser;
356
- unprocessedSidebars: UnprocessedSidebars;
357
- docs: DocMetadataBase[];
358
- version: VersionMetadata;
359
- }): Promise<Sidebars> {
360
- return combinePromises(
361
- mapValues(unprocessedSidebars, (unprocessedSidebar) =>
362
- processSidebar({
363
- sidebarItemsGenerator,
364
- numberPrefixParser,
365
- unprocessedSidebar,
366
- docs,
367
- version,
368
- }),
369
- ),
370
- );
371
- }
372
-
373
- function collectSidebarItemsOfType<
374
- Type extends SidebarItemType,
375
- Item extends SidebarItem & {type: SidebarItemType}
376
- >(type: Type, sidebar: Sidebar): Item[] {
377
- function collectRecursive(item: SidebarItem): Item[] {
378
- const currentItemsCollected: Item[] =
379
- item.type === type ? [item as Item] : [];
380
-
381
- const childItemsCollected: Item[] =
382
- item.type === 'category' ? flatten(item.items.map(collectRecursive)) : [];
383
-
384
- return [...currentItemsCollected, ...childItemsCollected];
385
- }
386
-
387
- return flatten(sidebar.map(collectRecursive));
388
- }
389
-
390
- export function collectSidebarDocItems(sidebar: Sidebar): SidebarItemDoc[] {
391
- return collectSidebarItemsOfType('doc', sidebar);
392
- }
393
- export function collectSidebarCategories(
394
- sidebar: Sidebar,
395
- ): SidebarItemCategory[] {
396
- return collectSidebarItemsOfType('category', sidebar);
397
- }
398
- export function collectSidebarLinks(sidebar: Sidebar): SidebarItemLink[] {
399
- return collectSidebarItemsOfType('link', sidebar);
400
- }
401
-
402
- export function transformSidebarItems(
403
- sidebar: Sidebar,
404
- updateFn: (item: SidebarItem) => SidebarItem,
405
- ): Sidebar {
406
- function transformRecursive(item: SidebarItem): SidebarItem {
407
- if (item.type === 'category') {
408
- return updateFn({
409
- ...item,
410
- items: item.items.map(transformRecursive),
411
- });
412
- }
413
- return updateFn(item);
414
- }
415
- return sidebar.map(transformRecursive);
416
- }
417
-
418
- export function collectSidebarsDocIds(
419
- sidebars: Sidebars,
420
- ): Record<string, string[]> {
421
- return mapValues(sidebars, (sidebar) => {
422
- return collectSidebarDocItems(sidebar).map((docItem) => docItem.id);
423
- });
424
- }
425
-
426
- export function createSidebarsUtils(sidebars: Sidebars) {
427
- const sidebarNameToDocIds = collectSidebarsDocIds(sidebars);
428
-
429
- function getFirstDocIdOfFirstSidebar(): string | undefined {
430
- return Object.values(sidebarNameToDocIds)[0]?.[0];
431
- }
432
-
433
- function getSidebarNameByDocId(docId: string): string | undefined {
434
- // TODO lookup speed can be optimized
435
- const entry = Object.entries(
436
- sidebarNameToDocIds,
437
- ).find(([_sidebarName, docIds]) => docIds.includes(docId));
438
-
439
- return entry?.[0];
440
- }
441
-
442
- function getDocNavigation(
443
- docId: string,
444
- ): {
445
- sidebarName: string | undefined;
446
- previousId: string | undefined;
447
- nextId: string | undefined;
448
- } {
449
- const sidebarName = getSidebarNameByDocId(docId);
450
- if (sidebarName) {
451
- const docIds = sidebarNameToDocIds[sidebarName];
452
- const currentIndex = docIds.indexOf(docId);
453
- const {previous, next} = getElementsAround(docIds, currentIndex);
454
- return {
455
- sidebarName,
456
- previousId: previous,
457
- nextId: next,
458
- };
459
- } else {
460
- return {
461
- sidebarName: undefined,
462
- previousId: undefined,
463
- nextId: undefined,
464
- };
465
- }
466
- }
467
-
468
- function checkSidebarsDocIds(validDocIds: string[]) {
469
- const allSidebarDocIds = flatten(Object.values(sidebarNameToDocIds));
470
- const invalidSidebarDocIds = difference(allSidebarDocIds, validDocIds);
471
- if (invalidSidebarDocIds.length > 0) {
472
- throw new Error(
473
- `Bad sidebars file.
474
- These sidebar document ids do not exist:
475
- - ${invalidSidebarDocIds.sort().join('\n- ')},
476
-
477
- Available document ids=
478
- - ${validDocIds.sort().join('\n- ')}`,
479
- );
480
- }
481
- }
482
-
483
- return {
484
- getFirstDocIdOfFirstSidebar,
485
- getSidebarNameByDocId,
486
- getDocNavigation,
487
- checkSidebarsDocIds,
488
- };
489
- }
@@ -1,99 +0,0 @@
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
-
8
- import {useLocation} from '@docusaurus/router';
9
- import useGlobalData, {
10
- // useAllPluginInstancesData,
11
- usePluginData,
12
- } from '@docusaurus/useGlobalData';
13
-
14
- import {GlobalPluginData, GlobalVersion} from '../../types';
15
- import {
16
- getActivePlugin,
17
- getLatestVersion,
18
- getActiveVersion,
19
- getActiveDocContext,
20
- getDocVersionSuggestions,
21
- ActivePlugin,
22
- ActiveDocContext,
23
- DocVersionSuggestions,
24
- GetActivePluginOptions,
25
- } from '../../client/docsClientUtils';
26
-
27
- // Not using useAllPluginInstancesData() because in blog-only mode, docs hooks are still used by the theme
28
- // We need a fail-safe fallback when the docs plugin is not in use
29
- export const useAllDocsData = (): Record<string, GlobalPluginData> =>
30
- // useAllPluginInstancesData('docusaurus-plugin-content-docs');
31
- useGlobalData()['docusaurus-plugin-content-docs'] ?? {};
32
-
33
- export const useDocsData = (pluginId: string | undefined): GlobalPluginData =>
34
- usePluginData('docusaurus-plugin-content-docs', pluginId) as GlobalPluginData;
35
-
36
- export const useActivePlugin = (
37
- options: GetActivePluginOptions = {},
38
- ): ActivePlugin | undefined => {
39
- const data = useAllDocsData();
40
- const {pathname} = useLocation();
41
- return getActivePlugin(data, pathname, options);
42
- };
43
-
44
- export const useActivePluginAndVersion = (
45
- options: GetActivePluginOptions = {},
46
- ):
47
- | undefined
48
- | {activePlugin: ActivePlugin; activeVersion: GlobalVersion | undefined} => {
49
- const activePlugin = useActivePlugin(options);
50
- const {pathname} = useLocation();
51
- if (activePlugin) {
52
- const activeVersion = getActiveVersion(activePlugin.pluginData, pathname);
53
- return {
54
- activePlugin,
55
- activeVersion,
56
- };
57
- }
58
- return undefined;
59
- };
60
-
61
- // versions are returned ordered (most recent first)
62
- export const useVersions = (pluginId: string | undefined): GlobalVersion[] => {
63
- const data = useDocsData(pluginId);
64
- return data.versions;
65
- };
66
-
67
- export const useLatestVersion = (
68
- pluginId: string | undefined,
69
- ): GlobalVersion => {
70
- const data = useDocsData(pluginId);
71
- return getLatestVersion(data);
72
- };
73
-
74
- // Note: return undefined on doc-unrelated pages,
75
- // because there's no version currently considered as active
76
- export const useActiveVersion = (
77
- pluginId: string | undefined,
78
- ): GlobalVersion | undefined => {
79
- const data = useDocsData(pluginId);
80
- const {pathname} = useLocation();
81
- return getActiveVersion(data, pathname);
82
- };
83
-
84
- export const useActiveDocContext = (
85
- pluginId: string | undefined,
86
- ): ActiveDocContext => {
87
- const data = useDocsData(pluginId);
88
- const {pathname} = useLocation();
89
- return getActiveDocContext(data, pathname);
90
- };
91
-
92
- // Useful to say "hey, you are not on the latest docs version, please switch"
93
- export const useDocVersionSuggestions = (
94
- pluginId: string | undefined,
95
- ): DocVersionSuggestions => {
96
- const data = useDocsData(pluginId);
97
- const {pathname} = useLocation();
98
- return getDocVersionSuggestions(data, pathname);
99
- };