@docusaurus/plugin-content-docs 2.0.0-beta.138b4c997 → 2.0.0-beta.14

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 (201) hide show
  1. package/lib/categoryGeneratedIndex.d.ts +12 -0
  2. package/lib/categoryGeneratedIndex.js +37 -0
  3. package/lib/cli.d.ts +2 -2
  4. package/lib/cli.js +14 -35
  5. package/lib/client/docsClientUtils.d.ts +0 -3
  6. package/lib/client/docsClientUtils.js +19 -22
  7. package/lib/docFrontMatter.d.ts +1 -1
  8. package/lib/docFrontMatter.js +8 -4
  9. package/lib/docs.d.ts +25 -3
  10. package/lib/docs.js +126 -41
  11. package/lib/globalData.d.ts +1 -1
  12. package/lib/index.d.ts +1 -1
  13. package/lib/index.js +101 -133
  14. package/lib/lastUpdate.js +12 -12
  15. package/lib/markdown/index.d.ts +3 -6
  16. package/lib/markdown/index.js +3 -3
  17. package/lib/markdown/linkify.js +2 -2
  18. package/lib/numberPrefix.d.ts +1 -1
  19. package/lib/options.d.ts +3 -3
  20. package/lib/options.js +48 -11
  21. package/lib/props.d.ts +7 -2
  22. package/lib/props.js +60 -9
  23. package/lib/routes.d.ts +27 -0
  24. package/lib/routes.js +105 -0
  25. package/lib/{sidebarItemsGenerator.d.ts → sidebars/generator.d.ts} +5 -2
  26. package/lib/sidebars/generator.js +216 -0
  27. package/lib/sidebars/index.d.ts +15 -0
  28. package/lib/sidebars/index.js +73 -0
  29. package/lib/sidebars/normalization.d.ts +14 -0
  30. package/lib/sidebars/normalization.js +77 -0
  31. package/lib/sidebars/processor.d.ts +18 -0
  32. package/lib/sidebars/processor.js +85 -0
  33. package/lib/sidebars/types.d.ts +127 -0
  34. package/{src/__tests__/__fixtures__/site-with-autogenerated-sidebar/partialAutogeneratedSidebars2.js → lib/sidebars/types.js} +2 -10
  35. package/lib/sidebars/utils.d.ts +35 -0
  36. package/lib/sidebars/utils.js +228 -0
  37. package/lib/sidebars/validation.d.ts +10 -0
  38. package/lib/sidebars/validation.js +138 -0
  39. package/lib/slug.d.ts +4 -3
  40. package/lib/slug.js +27 -15
  41. package/{src/__tests__/__fixtures__/site-with-doc-label/docusaurus.config.js → lib/tags.d.ts} +2 -8
  42. package/lib/tags.js +20 -0
  43. package/lib/theme/hooks/useDocs.js +24 -21
  44. package/lib/translations.d.ts +2 -2
  45. package/lib/translations.js +71 -29
  46. package/lib/types.d.ts +52 -64
  47. package/lib/versions.d.ts +3 -3
  48. package/lib/versions.js +41 -22
  49. package/package.json +20 -20
  50. package/src/categoryGeneratedIndex.ts +57 -0
  51. package/src/cli.ts +10 -42
  52. package/src/client/docsClientUtils.ts +14 -26
  53. package/{types.d.ts → src/deps.d.ts} +0 -0
  54. package/src/docFrontMatter.ts +10 -5
  55. package/src/docs.ts +164 -36
  56. package/src/globalData.ts +6 -1
  57. package/src/index.ts +127 -177
  58. package/src/lastUpdate.ts +14 -16
  59. package/src/markdown/index.ts +8 -12
  60. package/src/numberPrefix.ts +5 -3
  61. package/src/options.ts +56 -15
  62. package/src/plugin-content-docs.d.ts +172 -43
  63. package/src/props.ts +90 -16
  64. package/src/routes.ts +169 -0
  65. package/src/sidebars/generator.ts +302 -0
  66. package/src/sidebars/index.ts +94 -0
  67. package/src/sidebars/normalization.ts +112 -0
  68. package/src/sidebars/processor.ts +154 -0
  69. package/src/sidebars/types.ts +211 -0
  70. package/src/sidebars/utils.ts +329 -0
  71. package/src/sidebars/validation.ts +168 -0
  72. package/src/slug.ts +32 -17
  73. package/src/tags.ts +19 -0
  74. package/src/theme/hooks/useDocs.ts +5 -1
  75. package/src/translations.ts +103 -47
  76. package/src/types.ts +64 -108
  77. package/src/versions.ts +59 -25
  78. package/lib/.tsbuildinfo +0 -1
  79. package/lib/sidebarItemsGenerator.js +0 -211
  80. package/lib/sidebars.d.ts +0 -43
  81. package/lib/sidebars.js +0 -320
  82. package/src/__tests__/__fixtures__/bad-id-site/docs/invalid-id.md +0 -5
  83. package/src/__tests__/__fixtures__/bad-slug-on-doc-home-site/docs/docWithSlug.md +0 -5
  84. package/src/__tests__/__fixtures__/empty-site/docusaurus.config.js +0 -16
  85. package/src/__tests__/__fixtures__/empty-site/sidebars.json +0 -1
  86. package/src/__tests__/__fixtures__/sidebars/sidebars-category-shorthand.js +0 -34
  87. package/src/__tests__/__fixtures__/sidebars/sidebars-category-wrong-items.json +0 -11
  88. package/src/__tests__/__fixtures__/sidebars/sidebars-category-wrong-label.json +0 -11
  89. package/src/__tests__/__fixtures__/sidebars/sidebars-category.js +0 -44
  90. package/src/__tests__/__fixtures__/sidebars/sidebars-collapsed-first-level.json +0 -20
  91. package/src/__tests__/__fixtures__/sidebars/sidebars-collapsed.json +0 -21
  92. package/src/__tests__/__fixtures__/sidebars/sidebars-doc-id-not-string.json +0 -10
  93. package/src/__tests__/__fixtures__/sidebars/sidebars-first-level-not-category.js +0 -20
  94. package/src/__tests__/__fixtures__/sidebars/sidebars-link-wrong-href.json +0 -11
  95. package/src/__tests__/__fixtures__/sidebars/sidebars-link-wrong-label.json +0 -11
  96. package/src/__tests__/__fixtures__/sidebars/sidebars-link.json +0 -11
  97. package/src/__tests__/__fixtures__/sidebars/sidebars-unknown-type.json +0 -14
  98. package/src/__tests__/__fixtures__/sidebars/sidebars-wrong-field.json +0 -20
  99. package/src/__tests__/__fixtures__/sidebars/sidebars.json +0 -20
  100. package/src/__tests__/__fixtures__/simple-site/docs/foo/bar.md +0 -69
  101. package/src/__tests__/__fixtures__/simple-site/docs/foo/baz.md +0 -70
  102. package/src/__tests__/__fixtures__/simple-site/docs/headingAsTitle.md +0 -1
  103. package/src/__tests__/__fixtures__/simple-site/docs/hello.md +0 -53
  104. package/src/__tests__/__fixtures__/simple-site/docs/ipsum.md +0 -5
  105. package/src/__tests__/__fixtures__/simple-site/docs/lorem.md +0 -6
  106. package/src/__tests__/__fixtures__/simple-site/docs/rootAbsoluteSlug.md +0 -5
  107. package/src/__tests__/__fixtures__/simple-site/docs/rootRelativeSlug.md +0 -5
  108. package/src/__tests__/__fixtures__/simple-site/docs/rootResolvedSlug.md +0 -5
  109. package/src/__tests__/__fixtures__/simple-site/docs/rootTryToEscapeSlug.md +0 -5
  110. package/src/__tests__/__fixtures__/simple-site/docs/slugs/absoluteSlug.md +0 -5
  111. package/src/__tests__/__fixtures__/simple-site/docs/slugs/relativeSlug.md +0 -5
  112. package/src/__tests__/__fixtures__/simple-site/docs/slugs/resolvedSlug.md +0 -5
  113. package/src/__tests__/__fixtures__/simple-site/docs/slugs/tryToEscapeSlug.md +0 -5
  114. package/src/__tests__/__fixtures__/simple-site/docusaurus.config.js +0 -14
  115. package/src/__tests__/__fixtures__/simple-site/sidebars.json +0 -23
  116. package/src/__tests__/__fixtures__/simple-site/wrong-sidebars.json +0 -7
  117. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/0-getting-started.md +0 -3
  118. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/1-installation.md +0 -3
  119. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/00_api-overview.md +0 -3
  120. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/01_Core APIs/0 --- Client API.md +0 -1
  121. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/01_Core APIs/1 --- Server API.md +0 -1
  122. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/02_Extension APIs/0. Plugin API.md +0 -1
  123. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/02_Extension APIs/1. Theme API.md +0 -1
  124. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/02_Extension APIs/_category_.yml +0 -1
  125. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/03_api-end.md +0 -3
  126. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/_category_.json +0 -3
  127. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/0-guide2.5.md +0 -8
  128. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/02-guide2.md +0 -7
  129. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/_category_.json +0 -3
  130. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/a-guide4.md +0 -7
  131. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/b-guide5.md +0 -7
  132. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/guide3.md +0 -8
  133. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/z-guide1.md +0 -8
  134. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docusaurus.config.js +0 -14
  135. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/partialAutogeneratedSidebars.js +0 -23
  136. package/src/__tests__/__fixtures__/site-with-doc-label/docs/hello-1.md +0 -7
  137. package/src/__tests__/__fixtures__/site-with-doc-label/docs/hello-2.md +0 -8
  138. package/src/__tests__/__fixtures__/site-with-doc-label/sidebars.json +0 -14
  139. package/src/__tests__/__fixtures__/versioned-site/community/team.md +0 -1
  140. package/src/__tests__/__fixtures__/versioned-site/community_sidebars.json +0 -3
  141. package/src/__tests__/__fixtures__/versioned-site/community_versioned_docs/version-1.0.0/team.md +0 -1
  142. package/src/__tests__/__fixtures__/versioned-site/community_versioned_sidebars/version-1.0.0-sidebars.json +0 -3
  143. package/src/__tests__/__fixtures__/versioned-site/community_versions.json +0 -1
  144. package/src/__tests__/__fixtures__/versioned-site/docs/foo/bar.md +0 -4
  145. package/src/__tests__/__fixtures__/versioned-site/docs/hello.md +0 -1
  146. package/src/__tests__/__fixtures__/versioned-site/docs/slugs/absoluteSlug.md +0 -5
  147. package/src/__tests__/__fixtures__/versioned-site/docs/slugs/relativeSlug.md +0 -5
  148. package/src/__tests__/__fixtures__/versioned-site/docs/slugs/resolvedSlug.md +0 -5
  149. package/src/__tests__/__fixtures__/versioned-site/docs/slugs/tryToEscapeSlug.md +0 -5
  150. package/src/__tests__/__fixtures__/versioned-site/docusaurus.config.js +0 -18
  151. package/src/__tests__/__fixtures__/versioned-site/i18n/en/docusaurus-plugin-content-docs/version-1.0.0/hello.md +0 -1
  152. package/src/__tests__/__fixtures__/versioned-site/i18n/en/docusaurus-plugin-content-docs-community/current/team.md +0 -5
  153. package/src/__tests__/__fixtures__/versioned-site/i18n/fr/docusaurus-plugin-content-docs/version-1.0.0/hello.md +0 -1
  154. package/src/__tests__/__fixtures__/versioned-site/sidebars.json +0 -10
  155. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.0/foo/bar.md +0 -4
  156. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.0/foo/baz.md +0 -1
  157. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.0/hello.md +0 -1
  158. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.1/foo/bar.md +0 -1
  159. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.1/hello.md +0 -1
  160. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootAbsoluteSlug.md +0 -5
  161. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootRelativeSlug.md +0 -5
  162. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootResolvedSlug.md +0 -5
  163. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootTryToEscapeSlug.md +0 -5
  164. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/absoluteSlug.md +0 -5
  165. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/relativeSlug.md +0 -5
  166. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/resolvedSlug.md +0 -5
  167. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/tryToEscapeSlug.md +0 -5
  168. package/src/__tests__/__fixtures__/versioned-site/versioned_sidebars/version-1.0.0-sidebars.json +0 -11
  169. package/src/__tests__/__fixtures__/versioned-site/versioned_sidebars/version-1.0.1-sidebars.json +0 -10
  170. package/src/__tests__/__fixtures__/versioned-site/versioned_sidebars/version-withSlugs-sidebars.json +0 -5
  171. package/src/__tests__/__fixtures__/versioned-site/versions.json +0 -5
  172. package/src/__tests__/__snapshots__/cli.test.ts.snap +0 -90
  173. package/src/__tests__/__snapshots__/index.test.ts.snap +0 -1916
  174. package/src/__tests__/__snapshots__/sidebars.test.ts.snap +0 -218
  175. package/src/__tests__/__snapshots__/translations.test.ts.snap +0 -487
  176. package/src/__tests__/cli.test.ts +0 -333
  177. package/src/__tests__/docFrontMatter.test.ts +0 -244
  178. package/src/__tests__/docs.test.ts +0 -878
  179. package/src/__tests__/index.test.ts +0 -1871
  180. package/src/__tests__/lastUpdate.test.ts +0 -69
  181. package/src/__tests__/numberPrefix.test.ts +0 -199
  182. package/src/__tests__/options.test.ts +0 -231
  183. package/src/__tests__/sidebarItemsGenerator.test.ts +0 -336
  184. package/src/__tests__/sidebars.test.ts +0 -639
  185. package/src/__tests__/slug.test.ts +0 -109
  186. package/src/__tests__/translations.test.ts +0 -159
  187. package/src/__tests__/versions.test.ts +0 -741
  188. package/src/client/__tests__/docsClientUtils.test.ts +0 -371
  189. package/src/markdown/__tests__/__fixtures__/docs/doc-localized.md +0 -1
  190. package/src/markdown/__tests__/__fixtures__/docs/doc1.md +0 -13
  191. package/src/markdown/__tests__/__fixtures__/docs/doc2.md +0 -12
  192. package/src/markdown/__tests__/__fixtures__/docs/doc4.md +0 -19
  193. package/src/markdown/__tests__/__fixtures__/docs/doc5.md +0 -6
  194. package/src/markdown/__tests__/__fixtures__/docs/subdir/doc3.md +0 -3
  195. package/src/markdown/__tests__/__fixtures__/versioned_docs/version-1.0.0/doc2.md +0 -7
  196. package/src/markdown/__tests__/__fixtures__/versioned_docs/version-1.0.0/subdir/doc1.md +0 -3
  197. package/src/markdown/__tests__/__snapshots__/linkify.test.ts.snap +0 -82
  198. package/src/markdown/__tests__/linkify.test.ts +0 -190
  199. package/src/sidebarItemsGenerator.ts +0 -307
  200. package/src/sidebars.ts +0 -522
  201. package/tsconfig.json +0 -9
package/src/docs.ts CHANGED
@@ -7,6 +7,8 @@
7
7
 
8
8
  import path from 'path';
9
9
  import fs from 'fs-extra';
10
+ import logger from '@docusaurus/logger';
11
+ import {keyBy, last} from 'lodash';
10
12
  import {
11
13
  aliasedSitePath,
12
14
  getEditUrl,
@@ -14,25 +16,33 @@ import {
14
16
  normalizeUrl,
15
17
  parseMarkdownString,
16
18
  posixPath,
19
+ Globby,
20
+ normalizeFrontMatterTags,
17
21
  } from '@docusaurus/utils';
18
- import {LoadContext} from '@docusaurus/types';
22
+ import type {LoadContext} from '@docusaurus/types';
19
23
 
20
24
  import {getFileLastUpdate} from './lastUpdate';
21
25
  import {
22
26
  DocFile,
23
27
  DocMetadataBase,
28
+ DocMetadata,
29
+ DocNavLink,
24
30
  LastUpdateData,
25
31
  MetadataOptions,
26
32
  PluginOptions,
27
33
  VersionMetadata,
34
+ LoadedVersion,
28
35
  } from './types';
29
36
  import getSlug from './slug';
30
37
  import {CURRENT_VERSION_NAME} from './constants';
31
- import globby from 'globby';
32
38
  import {getDocsDirPaths} from './versions';
33
39
  import {stripPathNumberPrefixes} from './numberPrefix';
34
40
  import {validateDocFrontMatter} from './docFrontMatter';
35
- import chalk from 'chalk';
41
+ import {
42
+ SidebarsUtils,
43
+ toDocNavigationLink,
44
+ toNavigationLink,
45
+ } from './sidebars/utils';
36
46
 
37
47
  type LastUpdateOptions = Pick<
38
48
  PluginOptions,
@@ -92,11 +102,12 @@ export async function readVersionDocs(
92
102
  versionMetadata: VersionMetadata,
93
103
  options: Pick<
94
104
  PluginOptions,
95
- 'include' | 'showLastUpdateAuthor' | 'showLastUpdateTime'
105
+ 'include' | 'exclude' | 'showLastUpdateAuthor' | 'showLastUpdateTime'
96
106
  >,
97
107
  ): Promise<DocFile[]> {
98
- const sources = await globby(options.include, {
108
+ const sources = await Globby(options.include, {
99
109
  cwd: versionMetadata.contentPath,
110
+ ignore: options.exclude,
100
111
  });
101
112
  return Promise.all(
102
113
  sources.map((source) => readDocFile(versionMetadata, source, options)),
@@ -115,7 +126,6 @@ function doProcessDocMetadata({
115
126
  options: MetadataOptions;
116
127
  }): DocMetadataBase {
117
128
  const {source, content, lastUpdate, contentPath, filePath} = docFile;
118
- const {homePageId} = options;
119
129
  const {siteDir, i18n} = context;
120
130
 
121
131
  const {
@@ -129,9 +139,8 @@ function doProcessDocMetadata({
129
139
  custom_edit_url: customEditURL,
130
140
 
131
141
  // Strip number prefixes by default (01-MyFolder/01-MyDoc.md => MyFolder/MyDoc) by default,
132
- // but allow to disable this behavior with frontmatterr
133
- // eslint-disable-next-line camelcase
134
- parse_number_prefixes = true,
142
+ // but allow to disable this behavior with frontmatter
143
+ parse_number_prefixes: parseNumberPrefixes = true,
135
144
  } = frontMatter;
136
145
 
137
146
  // ex: api/plugins/myDoc -> myDoc
@@ -145,8 +154,7 @@ function doProcessDocMetadata({
145
154
  // ex: myDoc -> .
146
155
  const sourceDirName = path.dirname(source);
147
156
 
148
- // eslint-disable-next-line camelcase
149
- const {filename: unprefixedFileName, numberPrefix} = parse_number_prefixes
157
+ const {filename: unprefixedFileName, numberPrefix} = parseNumberPrefixes
150
158
  ? options.numberPrefixParser(sourceFileNameWithoutExtension)
151
159
  : {filename: sourceFileNameWithoutExtension, numberPrefix: undefined};
152
160
 
@@ -174,8 +182,7 @@ function doProcessDocMetadata({
174
182
  return undefined;
175
183
  }
176
184
  // Eventually remove the number prefixes from intermediate directories
177
- // eslint-disable-next-line camelcase
178
- return parse_number_prefixes
185
+ return parseNumberPrefixes
179
186
  ? stripPathNumberPrefixes(sourceDirName, options.numberPrefixParser)
180
187
  : sourceDirName;
181
188
  }
@@ -188,23 +195,14 @@ function doProcessDocMetadata({
188
195
  // legacy versioned id, requires a breaking change to modify this
189
196
  const id = [versionIdPrefix, unversionedId].filter(Boolean).join('/');
190
197
 
191
- // TODO remove soon, deprecated homePageId
192
- const isDocsHomePage = unversionedId === (homePageId ?? '_index');
193
- if (frontMatter.slug && isDocsHomePage) {
194
- throw new Error(
195
- `The docs homepage (homePageId=${homePageId}) is not allowed to have a frontmatter slug=${frontMatter.slug} => you have to choose either homePageId or slug, not both`,
196
- );
197
- }
198
-
199
- const docSlug = isDocsHomePage
200
- ? '/'
201
- : getSlug({
202
- baseID,
203
- dirName: sourceDirName,
204
- frontmatterSlug: frontMatter.slug,
205
- stripDirNumberPrefixes: parse_number_prefixes,
206
- numberPrefixParser: options.numberPrefixParser,
207
- });
198
+ const docSlug = getSlug({
199
+ baseID,
200
+ source,
201
+ sourceDirName,
202
+ frontmatterSlug: frontMatter.slug,
203
+ stripDirNumberPrefixes: parseNumberPrefixes,
204
+ numberPrefixParser: options.numberPrefixParser,
205
+ });
208
206
 
209
207
  // Note: the title is used by default for page title, sidebar label, pagination buttons...
210
208
  // frontMatter.title should be used in priority over contentTitle (because it can contain markdown/JSX syntax)
@@ -246,7 +244,6 @@ function doProcessDocMetadata({
246
244
  return {
247
245
  unversionedId,
248
246
  id,
249
- isDocsHomePage,
250
247
  title,
251
248
  description,
252
249
  source: aliasedSitePath(filePath, siteDir),
@@ -254,6 +251,7 @@ function doProcessDocMetadata({
254
251
  slug: docSlug,
255
252
  permalink,
256
253
  editUrl: customEditURL !== undefined ? customEditURL : getDocEditUrl(),
254
+ tags: normalizeFrontMatterTags(versionMetadata.tagsPath, frontMatter.tags),
257
255
  version: versionMetadata.versionName,
258
256
  lastUpdatedBy: lastUpdate.lastUpdatedBy,
259
257
  lastUpdatedAt: lastUpdate.lastUpdatedAt,
@@ -276,11 +274,141 @@ export function processDocMetadata(args: {
276
274
  try {
277
275
  return doProcessDocMetadata(args);
278
276
  } catch (e) {
279
- console.error(
280
- chalk.red(
281
- `Can't process doc metadatas for doc at path "${args.docFile.filePath}" in version "${args.versionMetadata.versionName}"`,
282
- ),
283
- );
277
+ logger.error`Can't process doc metadata for doc at path path=${args.docFile.filePath} in version name=${args.versionMetadata.versionName}`;
284
278
  throw e;
285
279
  }
286
280
  }
281
+
282
+ export function addDocNavigation(
283
+ docsBase: DocMetadataBase[],
284
+ sidebarsUtils: SidebarsUtils,
285
+ sidebarFilePath: string,
286
+ ): LoadedVersion['docs'] {
287
+ const docsById = createDocsByIdIndex(docsBase);
288
+
289
+ sidebarsUtils.checkSidebarsDocIds(
290
+ docsBase.flatMap(getDocIds),
291
+ sidebarFilePath,
292
+ );
293
+
294
+ // Add sidebar/next/previous to the docs
295
+ function addNavData(doc: DocMetadataBase): DocMetadata {
296
+ const navigation = sidebarsUtils.getDocNavigation(
297
+ doc.unversionedId,
298
+ doc.id,
299
+ );
300
+
301
+ const toNavigationLinkByDocId = (
302
+ docId: string | null | undefined,
303
+ type: 'prev' | 'next',
304
+ ): DocNavLink | undefined => {
305
+ if (!docId) {
306
+ return undefined;
307
+ }
308
+ const navDoc = docsById[docId];
309
+ if (!navDoc) {
310
+ // This could only happen if user provided the ID through front matter
311
+ throw new Error(
312
+ `Error when loading ${doc.id} in ${doc.sourceDirName}: the pagination_${type} front matter points to a non-existent ID ${docId}.`,
313
+ );
314
+ }
315
+ return toDocNavigationLink(navDoc);
316
+ };
317
+
318
+ const previous =
319
+ doc.frontMatter.pagination_prev !== undefined
320
+ ? toNavigationLinkByDocId(doc.frontMatter.pagination_prev, 'prev')
321
+ : toNavigationLink(navigation.previous, docsById);
322
+ const next =
323
+ doc.frontMatter.pagination_next !== undefined
324
+ ? toNavigationLinkByDocId(doc.frontMatter.pagination_next, 'next')
325
+ : toNavigationLink(navigation.next, docsById);
326
+
327
+ return {...doc, sidebar: navigation.sidebarName, previous, next};
328
+ }
329
+
330
+ const docsWithNavigation = docsBase.map(addNavData);
331
+ // sort to ensure consistent output for tests
332
+ docsWithNavigation.sort((a, b) => a.id.localeCompare(b.id));
333
+ return docsWithNavigation;
334
+ }
335
+
336
+ /**
337
+ * The "main doc" is the "version entry point"
338
+ * We browse this doc by clicking on a version:
339
+ * - the "home" doc (at '/docs/')
340
+ * - the first doc of the first sidebar
341
+ * - a random doc (if no docs are in any sidebar... edge case)
342
+ */
343
+ export function getMainDocId({
344
+ docs,
345
+ sidebarsUtils,
346
+ }: {
347
+ docs: DocMetadataBase[];
348
+ sidebarsUtils: SidebarsUtils;
349
+ }): string {
350
+ function getMainDoc(): DocMetadata {
351
+ const versionHomeDoc = docs.find((doc) => doc.slug === '/');
352
+ const firstDocIdOfFirstSidebar =
353
+ sidebarsUtils.getFirstDocIdOfFirstSidebar();
354
+ if (versionHomeDoc) {
355
+ return versionHomeDoc;
356
+ } else if (firstDocIdOfFirstSidebar) {
357
+ return docs.find(
358
+ (doc) =>
359
+ doc.id === firstDocIdOfFirstSidebar ||
360
+ doc.unversionedId === firstDocIdOfFirstSidebar,
361
+ )!;
362
+ } else {
363
+ return docs[0];
364
+ }
365
+ }
366
+
367
+ return getMainDoc().unversionedId;
368
+ }
369
+
370
+ function getLastPathSegment(str: string): string {
371
+ return last(str.split('/'))!;
372
+ }
373
+
374
+ // By convention, Docusaurus considers some docs are "indexes":
375
+ // - index.md
376
+ // - readme.md
377
+ // - <folder>/<folder>.md
378
+ //
379
+ // Those index docs produce a different behavior
380
+ // - Slugs do not end with a weird "/index" suffix
381
+ // - Auto-generated sidebar categories link to them as intro
382
+ export function isConventionalDocIndex(doc: {
383
+ source: DocMetadataBase['slug'];
384
+ sourceDirName: DocMetadataBase['sourceDirName'];
385
+ }): boolean {
386
+ // "@site/docs/folder/subFolder/subSubFolder/myDoc.md" => "myDoc"
387
+ const docName = path.parse(doc.source).name;
388
+
389
+ // "folder/subFolder/subSubFolder" => "subSubFolder"
390
+ const lastDirName = getLastPathSegment(doc.sourceDirName);
391
+
392
+ const eligibleDocIndexNames = ['index', 'readme', lastDirName.toLowerCase()];
393
+
394
+ return eligibleDocIndexNames.includes(docName.toLowerCase());
395
+ }
396
+
397
+ // Return both doc ids
398
+ // TODO legacy retro-compatibility due to old versioned sidebars using versioned doc ids
399
+ // ("id" should be removed & "versionedId" should be renamed to "id")
400
+ export function getDocIds(doc: DocMetadataBase): [string, string] {
401
+ return [doc.unversionedId, doc.id];
402
+ }
403
+
404
+ // docs are indexed by both versioned and unversioned ids at the same time
405
+ // TODO legacy retro-compatibility due to old versioned sidebars using versioned doc ids
406
+ // ("id" should be removed & "versionedId" should be renamed to "id")
407
+ export function createDocsByIdIndex<
408
+ Doc extends {id: string; unversionedId: string},
409
+ >(docs: Doc[]): Record<string, Doc> {
410
+ return {
411
+ ...keyBy(docs, (doc) => doc.unversionedId),
412
+ ...keyBy(docs, (doc) => doc.id),
413
+ };
414
+ }
package/src/globalData.ts CHANGED
@@ -5,7 +5,12 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- import {DocMetadata, GlobalDoc, LoadedVersion, GlobalVersion} from './types';
8
+ import type {
9
+ DocMetadata,
10
+ GlobalDoc,
11
+ LoadedVersion,
12
+ GlobalVersion,
13
+ } from './types';
9
14
 
10
15
  export function toGlobalDataDoc(doc: DocMetadata): GlobalDoc {
11
16
  return {