@docusaurus/plugin-content-docs 2.0.0-beta.12faed89d → 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 (200) 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 +7 -3
  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 -132
  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 -8
  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 +21 -21
  44. package/lib/translations.d.ts +2 -2
  45. package/lib/translations.js +71 -29
  46. package/lib/types.d.ts +52 -63
  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 +9 -4
  55. package/src/docs.ts +164 -36
  56. package/src/globalData.ts +6 -1
  57. package/src/index.ts +127 -175
  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 +173 -40
  63. package/src/props.ts +90 -15
  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/translations.ts +103 -47
  75. package/src/types.ts +64 -107
  76. package/src/versions.ts +59 -25
  77. package/lib/.tsbuildinfo +0 -1
  78. package/lib/sidebarItemsGenerator.js +0 -211
  79. package/lib/sidebars.d.ts +0 -43
  80. package/lib/sidebars.js +0 -320
  81. package/src/__tests__/__fixtures__/bad-id-site/docs/invalid-id.md +0 -5
  82. package/src/__tests__/__fixtures__/bad-slug-on-doc-home-site/docs/docWithSlug.md +0 -5
  83. package/src/__tests__/__fixtures__/empty-site/docusaurus.config.js +0 -16
  84. package/src/__tests__/__fixtures__/empty-site/sidebars.json +0 -1
  85. package/src/__tests__/__fixtures__/sidebars/sidebars-category-shorthand.js +0 -34
  86. package/src/__tests__/__fixtures__/sidebars/sidebars-category-wrong-items.json +0 -11
  87. package/src/__tests__/__fixtures__/sidebars/sidebars-category-wrong-label.json +0 -11
  88. package/src/__tests__/__fixtures__/sidebars/sidebars-category.js +0 -44
  89. package/src/__tests__/__fixtures__/sidebars/sidebars-collapsed-first-level.json +0 -20
  90. package/src/__tests__/__fixtures__/sidebars/sidebars-collapsed.json +0 -21
  91. package/src/__tests__/__fixtures__/sidebars/sidebars-doc-id-not-string.json +0 -10
  92. package/src/__tests__/__fixtures__/sidebars/sidebars-first-level-not-category.js +0 -20
  93. package/src/__tests__/__fixtures__/sidebars/sidebars-link-wrong-href.json +0 -11
  94. package/src/__tests__/__fixtures__/sidebars/sidebars-link-wrong-label.json +0 -11
  95. package/src/__tests__/__fixtures__/sidebars/sidebars-link.json +0 -11
  96. package/src/__tests__/__fixtures__/sidebars/sidebars-unknown-type.json +0 -14
  97. package/src/__tests__/__fixtures__/sidebars/sidebars-wrong-field.json +0 -20
  98. package/src/__tests__/__fixtures__/sidebars/sidebars.json +0 -20
  99. package/src/__tests__/__fixtures__/simple-site/docs/foo/bar.md +0 -69
  100. package/src/__tests__/__fixtures__/simple-site/docs/foo/baz.md +0 -70
  101. package/src/__tests__/__fixtures__/simple-site/docs/headingAsTitle.md +0 -1
  102. package/src/__tests__/__fixtures__/simple-site/docs/hello.md +0 -53
  103. package/src/__tests__/__fixtures__/simple-site/docs/ipsum.md +0 -5
  104. package/src/__tests__/__fixtures__/simple-site/docs/lorem.md +0 -6
  105. package/src/__tests__/__fixtures__/simple-site/docs/rootAbsoluteSlug.md +0 -5
  106. package/src/__tests__/__fixtures__/simple-site/docs/rootRelativeSlug.md +0 -5
  107. package/src/__tests__/__fixtures__/simple-site/docs/rootResolvedSlug.md +0 -5
  108. package/src/__tests__/__fixtures__/simple-site/docs/rootTryToEscapeSlug.md +0 -5
  109. package/src/__tests__/__fixtures__/simple-site/docs/slugs/absoluteSlug.md +0 -5
  110. package/src/__tests__/__fixtures__/simple-site/docs/slugs/relativeSlug.md +0 -5
  111. package/src/__tests__/__fixtures__/simple-site/docs/slugs/resolvedSlug.md +0 -5
  112. package/src/__tests__/__fixtures__/simple-site/docs/slugs/tryToEscapeSlug.md +0 -5
  113. package/src/__tests__/__fixtures__/simple-site/docusaurus.config.js +0 -14
  114. package/src/__tests__/__fixtures__/simple-site/sidebars.json +0 -23
  115. package/src/__tests__/__fixtures__/simple-site/wrong-sidebars.json +0 -7
  116. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/0-getting-started.md +0 -3
  117. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/1-installation.md +0 -3
  118. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/00_api-overview.md +0 -3
  119. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/01_Core APIs/0 --- Client API.md +0 -1
  120. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/01_Core APIs/1 --- Server API.md +0 -1
  121. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/02_Extension APIs/0. Plugin API.md +0 -1
  122. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/02_Extension APIs/1. Theme API.md +0 -1
  123. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/02_Extension APIs/_category_.yml +0 -1
  124. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/03_api-end.md +0 -3
  125. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/_category_.json +0 -3
  126. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/0-guide2.5.md +0 -8
  127. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/02-guide2.md +0 -7
  128. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/_category_.json +0 -3
  129. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/a-guide4.md +0 -7
  130. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/b-guide5.md +0 -7
  131. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/guide3.md +0 -8
  132. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/z-guide1.md +0 -8
  133. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docusaurus.config.js +0 -14
  134. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/partialAutogeneratedSidebars.js +0 -23
  135. package/src/__tests__/__fixtures__/site-with-doc-label/docs/hello-1.md +0 -7
  136. package/src/__tests__/__fixtures__/site-with-doc-label/docs/hello-2.md +0 -8
  137. package/src/__tests__/__fixtures__/site-with-doc-label/sidebars.json +0 -14
  138. package/src/__tests__/__fixtures__/versioned-site/community/team.md +0 -1
  139. package/src/__tests__/__fixtures__/versioned-site/community_sidebars.json +0 -3
  140. package/src/__tests__/__fixtures__/versioned-site/community_versioned_docs/version-1.0.0/team.md +0 -1
  141. package/src/__tests__/__fixtures__/versioned-site/community_versioned_sidebars/version-1.0.0-sidebars.json +0 -3
  142. package/src/__tests__/__fixtures__/versioned-site/community_versions.json +0 -1
  143. package/src/__tests__/__fixtures__/versioned-site/docs/foo/bar.md +0 -4
  144. package/src/__tests__/__fixtures__/versioned-site/docs/hello.md +0 -1
  145. package/src/__tests__/__fixtures__/versioned-site/docs/slugs/absoluteSlug.md +0 -5
  146. package/src/__tests__/__fixtures__/versioned-site/docs/slugs/relativeSlug.md +0 -5
  147. package/src/__tests__/__fixtures__/versioned-site/docs/slugs/resolvedSlug.md +0 -5
  148. package/src/__tests__/__fixtures__/versioned-site/docs/slugs/tryToEscapeSlug.md +0 -5
  149. package/src/__tests__/__fixtures__/versioned-site/docusaurus.config.js +0 -18
  150. package/src/__tests__/__fixtures__/versioned-site/i18n/en/docusaurus-plugin-content-docs/version-1.0.0/hello.md +0 -1
  151. package/src/__tests__/__fixtures__/versioned-site/i18n/en/docusaurus-plugin-content-docs-community/current/team.md +0 -5
  152. package/src/__tests__/__fixtures__/versioned-site/i18n/fr/docusaurus-plugin-content-docs/version-1.0.0/hello.md +0 -1
  153. package/src/__tests__/__fixtures__/versioned-site/sidebars.json +0 -10
  154. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.0/foo/bar.md +0 -4
  155. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.0/foo/baz.md +0 -1
  156. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.0/hello.md +0 -1
  157. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.1/foo/bar.md +0 -1
  158. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.1/hello.md +0 -1
  159. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootAbsoluteSlug.md +0 -5
  160. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootRelativeSlug.md +0 -5
  161. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootResolvedSlug.md +0 -5
  162. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootTryToEscapeSlug.md +0 -5
  163. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/absoluteSlug.md +0 -5
  164. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/relativeSlug.md +0 -5
  165. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/resolvedSlug.md +0 -5
  166. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/tryToEscapeSlug.md +0 -5
  167. package/src/__tests__/__fixtures__/versioned-site/versioned_sidebars/version-1.0.0-sidebars.json +0 -11
  168. package/src/__tests__/__fixtures__/versioned-site/versioned_sidebars/version-1.0.1-sidebars.json +0 -10
  169. package/src/__tests__/__fixtures__/versioned-site/versioned_sidebars/version-withSlugs-sidebars.json +0 -5
  170. package/src/__tests__/__fixtures__/versioned-site/versions.json +0 -5
  171. package/src/__tests__/__snapshots__/cli.test.ts.snap +0 -90
  172. package/src/__tests__/__snapshots__/index.test.ts.snap +0 -1902
  173. package/src/__tests__/__snapshots__/sidebars.test.ts.snap +0 -218
  174. package/src/__tests__/__snapshots__/translations.test.ts.snap +0 -484
  175. package/src/__tests__/cli.test.ts +0 -333
  176. package/src/__tests__/docFrontMatter.test.ts +0 -244
  177. package/src/__tests__/docs.test.ts +0 -878
  178. package/src/__tests__/index.test.ts +0 -1868
  179. package/src/__tests__/lastUpdate.test.ts +0 -69
  180. package/src/__tests__/numberPrefix.test.ts +0 -199
  181. package/src/__tests__/options.test.ts +0 -231
  182. package/src/__tests__/sidebarItemsGenerator.test.ts +0 -336
  183. package/src/__tests__/sidebars.test.ts +0 -639
  184. package/src/__tests__/slug.test.ts +0 -109
  185. package/src/__tests__/translations.test.ts +0 -158
  186. package/src/__tests__/versions.test.ts +0 -741
  187. package/src/client/__tests__/docsClientUtils.test.ts +0 -371
  188. package/src/markdown/__tests__/__fixtures__/docs/doc-localized.md +0 -1
  189. package/src/markdown/__tests__/__fixtures__/docs/doc1.md +0 -13
  190. package/src/markdown/__tests__/__fixtures__/docs/doc2.md +0 -12
  191. package/src/markdown/__tests__/__fixtures__/docs/doc4.md +0 -19
  192. package/src/markdown/__tests__/__fixtures__/docs/doc5.md +0 -6
  193. package/src/markdown/__tests__/__fixtures__/docs/subdir/doc3.md +0 -3
  194. package/src/markdown/__tests__/__fixtures__/versioned_docs/version-1.0.0/doc2.md +0 -7
  195. package/src/markdown/__tests__/__fixtures__/versioned_docs/version-1.0.0/subdir/doc1.md +0 -3
  196. package/src/markdown/__tests__/__snapshots__/linkify.test.ts.snap +0 -82
  197. package/src/markdown/__tests__/linkify.test.ts +0 -190
  198. package/src/sidebarItemsGenerator.ts +0 -307
  199. package/src/sidebars.ts +0 -522
  200. package/tsconfig.json +0 -9
package/src/slug.ts CHANGED
@@ -15,39 +15,52 @@ import {
15
15
  DefaultNumberPrefixParser,
16
16
  stripPathNumberPrefixes,
17
17
  } from './numberPrefix';
18
- import {NumberPrefixParser} from './types';
18
+ import type {DocMetadataBase, NumberPrefixParser} from './types';
19
+ import {isConventionalDocIndex} from './docs';
19
20
 
20
21
  export default function getSlug({
21
22
  baseID,
22
23
  frontmatterSlug,
23
- dirName,
24
+ source,
25
+ sourceDirName,
24
26
  stripDirNumberPrefixes = true,
25
27
  numberPrefixParser = DefaultNumberPrefixParser,
26
28
  }: {
27
29
  baseID: string;
28
30
  frontmatterSlug?: string;
29
- dirName: string;
31
+ source: DocMetadataBase['slug'];
32
+ sourceDirName: DocMetadataBase['sourceDirName'];
30
33
  stripDirNumberPrefixes?: boolean;
31
34
  numberPrefixParser?: NumberPrefixParser;
32
35
  }): string {
33
- const baseSlug = frontmatterSlug || baseID;
34
- let slug: string;
35
- if (baseSlug.startsWith('/')) {
36
- slug = baseSlug;
37
- } else {
36
+ function getDirNameSlug(): string {
38
37
  const dirNameStripped = stripDirNumberPrefixes
39
- ? stripPathNumberPrefixes(dirName, numberPrefixParser)
40
- : dirName;
38
+ ? stripPathNumberPrefixes(sourceDirName, numberPrefixParser)
39
+ : sourceDirName;
41
40
  const resolveDirname =
42
- dirName === '.'
41
+ sourceDirName === '.'
43
42
  ? '/'
44
43
  : addLeadingSlash(addTrailingSlash(dirNameStripped));
45
- slug = resolvePathname(baseSlug, resolveDirname);
44
+ return resolveDirname;
46
45
  }
47
46
 
48
- if (!isValidPathname(slug)) {
49
- throw new Error(
50
- `We couldn't compute a valid slug for document with id "${baseID}" in "${dirName}" directory.
47
+ function computeSlug(): string {
48
+ if (frontmatterSlug?.startsWith('/')) {
49
+ return frontmatterSlug;
50
+ } else {
51
+ const dirNameSlug = getDirNameSlug();
52
+ if (!frontmatterSlug && isConventionalDocIndex({source, sourceDirName})) {
53
+ return dirNameSlug;
54
+ }
55
+ const baseSlug = frontmatterSlug || baseID;
56
+ return resolvePathname(baseSlug, getDirNameSlug());
57
+ }
58
+ }
59
+
60
+ function ensureValidSlug(slug: string): string {
61
+ if (!isValidPathname(slug)) {
62
+ throw new Error(
63
+ `We couldn't compute a valid slug for document with id "${baseID}" in "${sourceDirName}" directory.
51
64
  The slug we computed looks invalid: ${slug}.
52
65
  Maybe your slug frontmatter is incorrect or you use weird chars in the file path?
53
66
  By using the slug frontmatter, you should be able to fix this error, by using the slug of your choice:
@@ -57,8 +70,10 @@ Example =>
57
70
  slug: /my/customDocPath
58
71
  ---
59
72
  `,
60
- );
73
+ );
74
+ }
75
+ return slug;
61
76
  }
62
77
 
63
- return slug;
78
+ return ensureValidSlug(computeSlug());
64
79
  }
package/src/tags.ts ADDED
@@ -0,0 +1,19 @@
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 {groupTaggedItems} from '@docusaurus/utils';
9
+ import type {VersionTags, DocMetadata} from './types';
10
+ import {mapValues} from 'lodash';
11
+
12
+ export function getVersionTags(docs: DocMetadata[]): VersionTags {
13
+ const groups = groupTaggedItems(docs, (doc) => doc.tags);
14
+ return mapValues(groups, (group) => ({
15
+ name: group.tag.label,
16
+ docIds: group.items.map((item) => item.id),
17
+ permalink: group.tag.permalink,
18
+ }));
19
+ }
@@ -5,27 +5,28 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- import {
9
- LoadedVersion,
8
+ import type {LoadedVersion, LoadedContent} from './types';
9
+ import type {
10
10
  Sidebar,
11
- LoadedContent,
11
+ SidebarItemCategory,
12
+ SidebarItemCategoryLink,
12
13
  Sidebars,
13
- SidebarItem,
14
- } from './types';
14
+ } from './sidebars/types';
15
15
 
16
- import {chain, mapValues, flatten, keyBy} from 'lodash';
16
+ import {chain, mapValues, keyBy} from 'lodash';
17
17
  import {
18
18
  collectSidebarCategories,
19
19
  transformSidebarItems,
20
20
  collectSidebarLinks,
21
- } from './sidebars';
22
- import {
21
+ } from './sidebars/utils';
22
+ import type {
23
23
  TranslationFileContent,
24
24
  TranslationFile,
25
25
  TranslationFiles,
26
26
  } from '@docusaurus/types';
27
27
  import {mergeTranslations} from '@docusaurus/utils';
28
28
  import {CURRENT_VERSION_NAME} from './constants';
29
+ import {TranslationMessage} from '@docusaurus/types';
29
30
 
30
31
  function getVersionFileName(versionName: string): string {
31
32
  if (versionName === CURRENT_VERSION_NAME) {
@@ -55,7 +56,7 @@ function getNormalizedSidebarName({
55
56
  }
56
57
 
57
58
  /*
58
- // Do we need to translate doc metadatas?
59
+ // Do we need to translate doc metadata?
59
60
  // It seems translating frontmatter labels is good enough
60
61
  function getDocTranslations(doc: DocMetadata): TranslationFileContent {
61
62
  return {
@@ -101,14 +102,48 @@ function getSidebarTranslationFileContent(
101
102
  sidebar: Sidebar,
102
103
  sidebarName: string,
103
104
  ): TranslationFileContent {
105
+ type TranslationMessageEntry = [string, TranslationMessage];
106
+
104
107
  const categories = collectSidebarCategories(sidebar);
105
- const categoryContent: TranslationFileContent = chain(categories)
106
- .keyBy((category) => `sidebar.${sidebarName}.category.${category.label}`)
107
- .mapValues((category) => ({
108
- message: category.label,
109
- description: `The label for category ${category.label} in sidebar ${sidebarName}`,
110
- }))
111
- .value();
108
+
109
+ const categoryContent: TranslationFileContent = Object.fromEntries(
110
+ categories.flatMap((category) => {
111
+ const entries: TranslationMessageEntry[] = [];
112
+
113
+ entries.push([
114
+ `sidebar.${sidebarName}.category.${category.label}`,
115
+ {
116
+ message: category.label,
117
+ description: `The label for category ${category.label} in sidebar ${sidebarName}`,
118
+ },
119
+ ]);
120
+
121
+ if (category.link) {
122
+ if (category.link.type === 'generated-index') {
123
+ if (category.link.title) {
124
+ entries.push([
125
+ `sidebar.${sidebarName}.category.${category.label}.link.generated-index.title`,
126
+ {
127
+ message: category.link.title,
128
+ description: `The generated-index page title for category ${category.label} in sidebar ${sidebarName}`,
129
+ },
130
+ ]);
131
+ }
132
+ if (category.link.description) {
133
+ entries.push([
134
+ `sidebar.${sidebarName}.category.${category.label}.link.generated-index.description`,
135
+ {
136
+ message: category.link.description,
137
+ description: `The generated-index page description for category ${category.label} in sidebar ${sidebarName}`,
138
+ },
139
+ ]);
140
+ }
141
+ }
142
+ }
143
+
144
+ return entries;
145
+ }),
146
+ );
112
147
 
113
148
  const links = collectSidebarLinks(sidebar);
114
149
  const linksContent: TranslationFileContent = chain(links)
@@ -131,29 +166,51 @@ function translateSidebar({
131
166
  sidebarName: string;
132
167
  sidebarsTranslations: TranslationFileContent;
133
168
  }): Sidebar {
134
- return transformSidebarItems(
135
- sidebar,
136
- (item: SidebarItem): SidebarItem => {
137
- if (item.type === 'category') {
138
- return {
139
- ...item,
140
- label:
141
- sidebarsTranslations[
142
- `sidebar.${sidebarName}.category.${item.label}`
143
- ]?.message ?? item.label,
144
- };
145
- }
146
- if (item.type === 'link') {
147
- return {
148
- ...item,
149
- label:
150
- sidebarsTranslations[`sidebar.${sidebarName}.link.${item.label}`]
151
- ?.message ?? item.label,
152
- };
153
- }
154
- return item;
155
- },
156
- );
169
+ function transformSidebarCategoryLink(
170
+ category: SidebarItemCategory,
171
+ ): SidebarItemCategoryLink | undefined {
172
+ if (!category.link) {
173
+ return undefined;
174
+ }
175
+ if (category.link.type === 'generated-index') {
176
+ const title =
177
+ sidebarsTranslations[
178
+ `sidebar.${sidebarName}.category.${category.label}.link.generated-index.title`
179
+ ]?.message ?? category.link.title;
180
+ const description =
181
+ sidebarsTranslations[
182
+ `sidebar.${sidebarName}.category.${category.label}.link.generated-index.description`
183
+ ]?.message ?? category.link.description;
184
+ return {
185
+ ...category.link,
186
+ title,
187
+ description,
188
+ };
189
+ }
190
+ return category.link;
191
+ }
192
+
193
+ return transformSidebarItems(sidebar, (item) => {
194
+ if (item.type === 'category') {
195
+ const link = transformSidebarCategoryLink(item);
196
+ return {
197
+ ...item,
198
+ label:
199
+ sidebarsTranslations[`sidebar.${sidebarName}.category.${item.label}`]
200
+ ?.message ?? item.label,
201
+ ...(link && {link}),
202
+ };
203
+ }
204
+ if (item.type === 'link') {
205
+ return {
206
+ ...item,
207
+ label:
208
+ sidebarsTranslations[`sidebar.${sidebarName}.link.${item.label}`]
209
+ ?.message ?? item.label,
210
+ };
211
+ }
212
+ return item;
213
+ });
157
214
  }
158
215
 
159
216
  function getSidebarsTranslations(
@@ -173,16 +230,16 @@ function translateSidebars(
173
230
  version: LoadedVersion,
174
231
  sidebarsTranslations: TranslationFileContent,
175
232
  ): Sidebars {
176
- return mapValues(version.sidebars, (sidebar, sidebarName) => {
177
- return translateSidebar({
233
+ return mapValues(version.sidebars, (sidebar, sidebarName) =>
234
+ translateSidebar({
178
235
  sidebar,
179
236
  sidebarName: getNormalizedSidebarName({
180
237
  sidebarName,
181
238
  versionName: version.versionName,
182
239
  }),
183
240
  sidebarsTranslations,
184
- });
185
- });
241
+ }),
242
+ );
186
243
  }
187
244
 
188
245
  function getVersionTranslationFiles(version: LoadedVersion): TranslationFiles {
@@ -193,9 +250,8 @@ function getVersionTranslationFiles(version: LoadedVersion): TranslationFiles {
193
250
  },
194
251
  };
195
252
 
196
- const sidebarsTranslations: TranslationFileContent = getSidebarsTranslations(
197
- version,
198
- );
253
+ const sidebarsTranslations: TranslationFileContent =
254
+ getSidebarsTranslations(version);
199
255
 
200
256
  // const docsTranslations: TranslationFileContent = getDocsTranslations(version);
201
257
 
@@ -227,7 +283,7 @@ function translateVersion(
227
283
  function getVersionsTranslationFiles(
228
284
  versions: LoadedVersion[],
229
285
  ): TranslationFiles {
230
- return flatten(versions.map(getVersionTranslationFiles));
286
+ return versions.flatMap(getVersionTranslationFiles);
231
287
  }
232
288
  function translateVersions(
233
289
  versions: LoadedVersion[],
package/src/types.ts CHANGED
@@ -5,14 +5,15 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- // eslint-disable-next-line spaced-comment
9
8
  /// <reference types="@docusaurus/module-type-aliases" />
10
9
 
11
10
  import type {RemarkAndRehypePluginOptions} from '@docusaurus/mdx-loader';
12
- import {
11
+ import type {Tag, FrontMatterTag, Slugger} from '@docusaurus/utils';
12
+ import type {
13
13
  BrokenMarkdownLink as IBrokenMarkdownLink,
14
14
  ContentPaths,
15
15
  } from '@docusaurus/utils/lib/markdownLinks';
16
+ import type {SidebarItemsGeneratorOption, Sidebars} from './sidebars/types';
16
17
 
17
18
  export type DocFile = {
18
19
  contentPath: string; // /!\ may be localized
@@ -28,9 +29,12 @@ export type VersionMetadata = ContentPaths & {
28
29
  versionName: VersionName; // 1.0.0
29
30
  versionLabel: string; // Version 1.0.0
30
31
  versionPath: string; // /baseUrl/docs/1.0.0
32
+ tagsPath: string;
31
33
  versionEditUrl?: string | undefined;
32
34
  versionEditUrlLocalized?: string | undefined;
33
- versionBanner: VersionBanner;
35
+ versionBanner: VersionBanner | null;
36
+ versionBadge: boolean;
37
+ versionClassName: string;
34
38
  isLast: boolean;
35
39
  sidebarFilePath: string | false | undefined; // versioned_sidebars/1.0.0.json
36
40
  routePriority: number | undefined; // -1 for the latest docs
@@ -46,7 +50,6 @@ export type EditUrlFunction = (editUrlParams: {
46
50
 
47
51
  export type MetadataOptions = {
48
52
  routeBasePath: string;
49
- homePageId?: string;
50
53
  editUrl?: string | EditUrlFunction;
51
54
  editCurrentVersion: boolean;
52
55
  editLocalizedFiles: boolean;
@@ -61,12 +64,14 @@ export type PathOptions = {
61
64
  };
62
65
 
63
66
  // TODO support custom version banner? {type: "error", content: "html content"}
64
- export type VersionBanner = 'none' | 'unreleased' | 'unmaintained';
67
+ export type VersionBanner = 'unreleased' | 'unmaintained';
65
68
 
66
69
  export type VersionOptions = {
67
70
  path?: string;
68
71
  label?: string;
69
- banner?: VersionBanner;
72
+ banner?: 'none' | VersionBanner;
73
+ badge?: boolean;
74
+ className?: string;
70
75
  };
71
76
 
72
77
  export type VersionsOptions = {
@@ -75,110 +80,36 @@ export type VersionsOptions = {
75
80
  onlyIncludeVersions?: string[];
76
81
  };
77
82
 
83
+ export type SidebarOptions = {
84
+ sidebarCollapsible: boolean;
85
+ sidebarCollapsed: boolean;
86
+ };
87
+
88
+ export type NormalizeSidebarsParams = SidebarOptions & {
89
+ version: VersionMetadata;
90
+ categoryLabelSlugger: Slugger;
91
+ };
92
+
78
93
  export type PluginOptions = MetadataOptions &
79
94
  PathOptions &
80
95
  VersionsOptions &
81
- RemarkAndRehypePluginOptions & {
96
+ RemarkAndRehypePluginOptions &
97
+ SidebarOptions & {
82
98
  id: string;
83
99
  include: string[];
100
+ exclude: string[];
84
101
  docLayoutComponent: string;
85
102
  docItemComponent: string;
103
+ docTagDocListComponent: string;
104
+ docTagsListComponent: string;
105
+ docCategoryGeneratedIndexComponent: string;
86
106
  admonitions: Record<string, unknown>;
87
107
  disableVersioning: boolean;
88
108
  includeCurrentVersion: boolean;
89
109
  sidebarItemsGenerator: SidebarItemsGeneratorOption;
110
+ tagsBasePath: string;
90
111
  };
91
112
 
92
- export type SidebarItemBase = {
93
- customProps?: Record<string, unknown>;
94
- };
95
-
96
- export type SidebarItemDoc = SidebarItemBase & {
97
- type: 'doc' | 'ref';
98
- label?: string;
99
- id: string;
100
- };
101
-
102
- export type SidebarItemLink = SidebarItemBase & {
103
- type: 'link';
104
- href: string;
105
- label: string;
106
- };
107
-
108
- export type SidebarItemCategory = SidebarItemBase & {
109
- type: 'category';
110
- label: string;
111
- items: SidebarItem[];
112
- collapsed: boolean;
113
- };
114
-
115
- export type UnprocessedSidebarItemAutogenerated = {
116
- type: 'autogenerated';
117
- dirName: string;
118
- };
119
-
120
- export type UnprocessedSidebarItemCategory = SidebarItemBase & {
121
- type: 'category';
122
- label: string;
123
- items: UnprocessedSidebarItem[];
124
- collapsed: boolean;
125
- };
126
-
127
- export type UnprocessedSidebarItem =
128
- | SidebarItemDoc
129
- | SidebarItemLink
130
- | UnprocessedSidebarItemCategory
131
- | UnprocessedSidebarItemAutogenerated;
132
-
133
- export type UnprocessedSidebar = UnprocessedSidebarItem[];
134
- export type UnprocessedSidebars = Record<string, UnprocessedSidebar>;
135
-
136
- export type SidebarItem =
137
- | SidebarItemDoc
138
- | SidebarItemLink
139
- | SidebarItemCategory;
140
-
141
- export type Sidebar = SidebarItem[];
142
- export type SidebarItemType = SidebarItem['type'];
143
- export type Sidebars = Record<string, Sidebar>;
144
-
145
- // Reduce API surface for options.sidebarItemsGenerator
146
- // The user-provided generator fn should receive only a subset of metadatas
147
- // A change to any of these metadatas can be considered as a breaking change
148
- export type SidebarItemsGeneratorDoc = Pick<
149
- DocMetadataBase,
150
- 'id' | 'frontMatter' | 'source' | 'sourceDirName' | 'sidebarPosition'
151
- >;
152
- export type SidebarItemsGeneratorVersion = Pick<
153
- VersionMetadata,
154
- 'versionName' | 'contentPath'
155
- >;
156
-
157
- export type SidebarItemsGeneratorArgs = {
158
- item: UnprocessedSidebarItemAutogenerated;
159
- version: SidebarItemsGeneratorVersion;
160
- docs: SidebarItemsGeneratorDoc[];
161
- numberPrefixParser: NumberPrefixParser;
162
- };
163
- export type SidebarItemsGenerator = (
164
- generatorArgs: SidebarItemsGeneratorArgs,
165
- ) => Promise<SidebarItem[]>;
166
-
167
- // Also inject the default generator to conveniently wrap/enhance/sort the default sidebar gen logic
168
- // see https://github.com/facebook/docusaurus/issues/4640#issuecomment-822292320
169
- export type SidebarItemsGeneratorOptionArgs = {
170
- defaultSidebarItemsGenerator: SidebarItemsGenerator;
171
- } & SidebarItemsGeneratorArgs;
172
- export type SidebarItemsGeneratorOption = (
173
- generatorArgs: SidebarItemsGeneratorOptionArgs,
174
- ) => Promise<SidebarItem[]>;
175
-
176
- export type OrderMetadata = {
177
- previous?: string;
178
- next?: string;
179
- sidebar?: string;
180
- };
181
-
182
113
  export type LastUpdateData = {
183
114
  lastUpdatedAt?: number;
184
115
  formattedLastUpdatedAt?: string;
@@ -187,9 +118,9 @@ export type LastUpdateData = {
187
118
 
188
119
  export type DocFrontMatter = {
189
120
  // Front matter uses snake case
190
- /* eslint-disable camelcase */
191
121
  id?: string;
192
122
  title?: string;
123
+ tags?: FrontMatterTag[];
193
124
  hide_title?: boolean;
194
125
  hide_table_of_contents?: boolean;
195
126
  keywords?: string[];
@@ -198,25 +129,29 @@ export type DocFrontMatter = {
198
129
  slug?: string;
199
130
  sidebar_label?: string;
200
131
  sidebar_position?: number;
132
+ sidebar_class_name?: string;
201
133
  pagination_label?: string;
202
134
  custom_edit_url?: string | null;
203
135
  parse_number_prefixes?: boolean;
204
- /* eslint-enable camelcase */
136
+ toc_min_heading_level?: number;
137
+ toc_max_heading_level?: number;
138
+ pagination_next?: string | null;
139
+ pagination_prev?: string | null;
205
140
  };
206
141
 
207
142
  export type DocMetadataBase = LastUpdateData & {
143
+ id: string; // TODO legacy versioned id => try to remove
144
+ unversionedId: string; // TODO new unversioned id => try to rename to "id"
208
145
  version: VersionName;
209
- unversionedId: string;
210
- id: string;
211
- isDocsHomePage: boolean;
212
146
  title: string;
213
147
  description: string;
214
- source: string;
215
- sourceDirName: string; // relative to the docs folder (can be ".")
148
+ source: string; // @site aliased source => "@site/docs/folder/subFolder/subSubFolder/myDoc.md"
149
+ sourceDirName: string; // relative to the versioned docs folder (can be ".") => "folder/subFolder/subSubFolder"
216
150
  slug: string;
217
151
  permalink: string;
218
152
  sidebarPosition?: number;
219
153
  editUrl?: string | null;
154
+ tags: Tag[];
220
155
  frontMatter: DocFrontMatter & Record<string, unknown>;
221
156
  };
222
157
 
@@ -231,14 +166,35 @@ export type DocMetadata = DocMetadataBase & {
231
166
  next?: DocNavLink;
232
167
  };
233
168
 
169
+ export type CategoryGeneratedIndexMetadata = {
170
+ title: string;
171
+ description?: string;
172
+ slug: string;
173
+ permalink: string;
174
+ sidebar: string;
175
+ previous?: DocNavLink;
176
+ next?: DocNavLink;
177
+ };
178
+
234
179
  export type SourceToPermalink = {
235
180
  [source: string]: string;
236
181
  };
182
+
183
+ export type VersionTag = {
184
+ name: string; // normalized name/label of the tag
185
+ docIds: string[]; // all doc ids having this tag
186
+ permalink: string; // pathname of the tag
187
+ };
188
+ export type VersionTags = {
189
+ [key: string]: VersionTag;
190
+ };
191
+
237
192
  export type LoadedVersion = VersionMetadata & {
238
193
  versionPath: string;
239
194
  mainDocId: string;
240
195
  docs: DocMetadata[];
241
196
  sidebars: Sidebars;
197
+ categoryGeneratedIndices: CategoryGeneratedIndexMetadata[];
242
198
  };
243
199
 
244
200
  export type LoadedContent = {
@@ -274,6 +230,7 @@ export type DocsMarkdownOption = {
274
230
  onBrokenMarkdownLink: (brokenMarkdownLink: BrokenMarkdownLink) => void;
275
231
  };
276
232
 
277
- export type NumberPrefixParser = (
278
- filename: string,
279
- ) => {filename: string; numberPrefix?: number};
233
+ export type NumberPrefixParser = (filename: string) => {
234
+ filename: string;
235
+ numberPrefix?: number;
236
+ };