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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (213) hide show
  1. package/lib/categoryGeneratedIndex.d.ts +12 -0
  2. package/lib/categoryGeneratedIndex.js +38 -0
  3. package/lib/cli.d.ts +2 -2
  4. package/lib/cli.js +27 -44
  5. package/lib/client/docsClientUtils.d.ts +3 -25
  6. package/lib/client/docsClientUtils.js +25 -24
  7. package/lib/{theme/hooks/useDocs.d.ts → client/index.d.ts} +1 -2
  8. package/lib/{theme/hooks/useDocs.js → client/index.js} +26 -26
  9. package/lib/docFrontMatter.d.ts +1 -1
  10. package/lib/docFrontMatter.js +9 -3
  11. package/lib/docs.d.ts +39 -3
  12. package/lib/docs.js +157 -53
  13. package/lib/globalData.d.ts +5 -1
  14. package/lib/globalData.js +35 -2
  15. package/lib/index.d.ts +4 -3
  16. package/lib/index.js +110 -144
  17. package/lib/lastUpdate.js +15 -28
  18. package/lib/markdown/index.d.ts +3 -6
  19. package/lib/markdown/index.js +3 -3
  20. package/lib/markdown/linkify.d.ts +1 -1
  21. package/lib/markdown/linkify.js +2 -2
  22. package/lib/numberPrefix.d.ts +1 -1
  23. package/lib/numberPrefix.js +9 -9
  24. package/lib/options.d.ts +3 -3
  25. package/lib/options.js +50 -10
  26. package/lib/props.d.ts +7 -2
  27. package/lib/props.js +66 -11
  28. package/lib/routes.d.ts +28 -0
  29. package/lib/routes.js +110 -0
  30. package/lib/server-export.d.ts +8 -0
  31. package/lib/server-export.js +23 -0
  32. package/lib/{sidebarItemsGenerator.d.ts → sidebars/generator.d.ts} +1 -6
  33. package/lib/sidebars/generator.js +193 -0
  34. package/lib/sidebars/index.d.ts +13 -0
  35. package/lib/sidebars/index.js +88 -0
  36. package/lib/sidebars/normalization.d.ts +13 -0
  37. package/lib/sidebars/normalization.js +55 -0
  38. package/lib/sidebars/postProcessor.d.ts +8 -0
  39. package/lib/sidebars/postProcessor.js +70 -0
  40. package/lib/sidebars/processor.d.ts +8 -0
  41. package/lib/sidebars/processor.js +79 -0
  42. package/lib/sidebars/types.d.ts +166 -0
  43. package/{src/__tests__/__fixtures__/site-with-autogenerated-sidebar/partialAutogeneratedSidebars2.js → lib/sidebars/types.js} +2 -10
  44. package/lib/sidebars/utils.d.ts +43 -0
  45. package/lib/sidebars/utils.js +259 -0
  46. package/lib/sidebars/validation.d.ts +9 -0
  47. package/lib/sidebars/validation.js +137 -0
  48. package/lib/slug.d.ts +6 -4
  49. package/lib/slug.js +28 -17
  50. package/{src/__tests__/__fixtures__/site-with-doc-label/docusaurus.config.js → lib/tags.d.ts} +2 -8
  51. package/lib/tags.js +21 -0
  52. package/lib/translations.d.ts +2 -2
  53. package/lib/translations.js +91 -49
  54. package/lib/types.d.ts +40 -126
  55. package/lib/versions.d.ts +29 -4
  56. package/lib/versions.js +92 -87
  57. package/package.json +30 -27
  58. package/src/categoryGeneratedIndex.ts +59 -0
  59. package/src/cli.ts +34 -54
  60. package/src/client/docsClientUtils.ts +32 -57
  61. package/src/{theme/hooks/useDocs.ts → client/index.ts} +11 -10
  62. package/{types.d.ts → src/deps.d.ts} +0 -0
  63. package/src/docFrontMatter.ts +12 -5
  64. package/src/docs.ts +213 -47
  65. package/src/globalData.ts +53 -2
  66. package/src/index.ts +151 -197
  67. package/src/lastUpdate.ts +14 -37
  68. package/src/markdown/index.ts +9 -13
  69. package/src/markdown/linkify.ts +1 -1
  70. package/src/numberPrefix.ts +11 -8
  71. package/src/options.ts +59 -15
  72. package/src/plugin-content-docs.d.ts +249 -54
  73. package/src/props.ts +97 -18
  74. package/src/routes.ts +185 -0
  75. package/src/server-export.ts +24 -0
  76. package/src/sidebars/README.md +9 -0
  77. package/src/sidebars/generator.ts +269 -0
  78. package/src/sidebars/index.ts +113 -0
  79. package/src/sidebars/normalization.ts +85 -0
  80. package/src/sidebars/postProcessor.ts +94 -0
  81. package/src/sidebars/processor.ts +126 -0
  82. package/src/sidebars/types.ts +273 -0
  83. package/src/sidebars/utils.ts +392 -0
  84. package/src/sidebars/validation.ts +173 -0
  85. package/src/slug.ts +39 -21
  86. package/src/tags.ts +19 -0
  87. package/src/translations.ts +121 -62
  88. package/src/types.ts +46 -183
  89. package/src/versions.ts +136 -102
  90. package/lib/.tsbuildinfo +0 -1
  91. package/lib/sidebarItemsGenerator.js +0 -211
  92. package/lib/sidebars.d.ts +0 -43
  93. package/lib/sidebars.js +0 -320
  94. package/src/__tests__/__fixtures__/bad-id-site/docs/invalid-id.md +0 -5
  95. package/src/__tests__/__fixtures__/bad-slug-on-doc-home-site/docs/docWithSlug.md +0 -5
  96. package/src/__tests__/__fixtures__/empty-site/docusaurus.config.js +0 -16
  97. package/src/__tests__/__fixtures__/empty-site/sidebars.json +0 -1
  98. package/src/__tests__/__fixtures__/sidebars/sidebars-category-shorthand.js +0 -34
  99. package/src/__tests__/__fixtures__/sidebars/sidebars-category-wrong-items.json +0 -11
  100. package/src/__tests__/__fixtures__/sidebars/sidebars-category-wrong-label.json +0 -11
  101. package/src/__tests__/__fixtures__/sidebars/sidebars-category.js +0 -44
  102. package/src/__tests__/__fixtures__/sidebars/sidebars-collapsed-first-level.json +0 -20
  103. package/src/__tests__/__fixtures__/sidebars/sidebars-collapsed.json +0 -21
  104. package/src/__tests__/__fixtures__/sidebars/sidebars-doc-id-not-string.json +0 -10
  105. package/src/__tests__/__fixtures__/sidebars/sidebars-first-level-not-category.js +0 -20
  106. package/src/__tests__/__fixtures__/sidebars/sidebars-link-wrong-href.json +0 -11
  107. package/src/__tests__/__fixtures__/sidebars/sidebars-link-wrong-label.json +0 -11
  108. package/src/__tests__/__fixtures__/sidebars/sidebars-link.json +0 -11
  109. package/src/__tests__/__fixtures__/sidebars/sidebars-unknown-type.json +0 -14
  110. package/src/__tests__/__fixtures__/sidebars/sidebars-wrong-field.json +0 -20
  111. package/src/__tests__/__fixtures__/sidebars/sidebars.json +0 -20
  112. package/src/__tests__/__fixtures__/simple-site/docs/foo/bar.md +0 -69
  113. package/src/__tests__/__fixtures__/simple-site/docs/foo/baz.md +0 -70
  114. package/src/__tests__/__fixtures__/simple-site/docs/headingAsTitle.md +0 -1
  115. package/src/__tests__/__fixtures__/simple-site/docs/hello.md +0 -53
  116. package/src/__tests__/__fixtures__/simple-site/docs/ipsum.md +0 -5
  117. package/src/__tests__/__fixtures__/simple-site/docs/lorem.md +0 -6
  118. package/src/__tests__/__fixtures__/simple-site/docs/rootAbsoluteSlug.md +0 -5
  119. package/src/__tests__/__fixtures__/simple-site/docs/rootRelativeSlug.md +0 -5
  120. package/src/__tests__/__fixtures__/simple-site/docs/rootResolvedSlug.md +0 -5
  121. package/src/__tests__/__fixtures__/simple-site/docs/rootTryToEscapeSlug.md +0 -5
  122. package/src/__tests__/__fixtures__/simple-site/docs/slugs/absoluteSlug.md +0 -5
  123. package/src/__tests__/__fixtures__/simple-site/docs/slugs/relativeSlug.md +0 -5
  124. package/src/__tests__/__fixtures__/simple-site/docs/slugs/resolvedSlug.md +0 -5
  125. package/src/__tests__/__fixtures__/simple-site/docs/slugs/tryToEscapeSlug.md +0 -5
  126. package/src/__tests__/__fixtures__/simple-site/docusaurus.config.js +0 -14
  127. package/src/__tests__/__fixtures__/simple-site/sidebars.json +0 -23
  128. package/src/__tests__/__fixtures__/simple-site/wrong-sidebars.json +0 -7
  129. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/0-getting-started.md +0 -3
  130. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/1-installation.md +0 -3
  131. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/00_api-overview.md +0 -3
  132. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/01_Core APIs/0 --- Client API.md +0 -1
  133. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/01_Core APIs/1 --- Server API.md +0 -1
  134. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/02_Extension APIs/0. Plugin API.md +0 -1
  135. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/02_Extension APIs/1. Theme API.md +0 -1
  136. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/02_Extension APIs/_category_.yml +0 -1
  137. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/03_api-end.md +0 -3
  138. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/_category_.json +0 -3
  139. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/0-guide2.5.md +0 -8
  140. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/02-guide2.md +0 -7
  141. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/_category_.json +0 -3
  142. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/a-guide4.md +0 -7
  143. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/b-guide5.md +0 -7
  144. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/guide3.md +0 -8
  145. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/z-guide1.md +0 -8
  146. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docusaurus.config.js +0 -14
  147. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/partialAutogeneratedSidebars.js +0 -23
  148. package/src/__tests__/__fixtures__/site-with-doc-label/docs/hello-1.md +0 -7
  149. package/src/__tests__/__fixtures__/site-with-doc-label/docs/hello-2.md +0 -8
  150. package/src/__tests__/__fixtures__/site-with-doc-label/sidebars.json +0 -14
  151. package/src/__tests__/__fixtures__/versioned-site/community/team.md +0 -1
  152. package/src/__tests__/__fixtures__/versioned-site/community_sidebars.json +0 -3
  153. package/src/__tests__/__fixtures__/versioned-site/community_versioned_docs/version-1.0.0/team.md +0 -1
  154. package/src/__tests__/__fixtures__/versioned-site/community_versioned_sidebars/version-1.0.0-sidebars.json +0 -3
  155. package/src/__tests__/__fixtures__/versioned-site/community_versions.json +0 -1
  156. package/src/__tests__/__fixtures__/versioned-site/docs/foo/bar.md +0 -4
  157. package/src/__tests__/__fixtures__/versioned-site/docs/hello.md +0 -1
  158. package/src/__tests__/__fixtures__/versioned-site/docs/slugs/absoluteSlug.md +0 -5
  159. package/src/__tests__/__fixtures__/versioned-site/docs/slugs/relativeSlug.md +0 -5
  160. package/src/__tests__/__fixtures__/versioned-site/docs/slugs/resolvedSlug.md +0 -5
  161. package/src/__tests__/__fixtures__/versioned-site/docs/slugs/tryToEscapeSlug.md +0 -5
  162. package/src/__tests__/__fixtures__/versioned-site/docusaurus.config.js +0 -18
  163. package/src/__tests__/__fixtures__/versioned-site/i18n/en/docusaurus-plugin-content-docs/version-1.0.0/hello.md +0 -1
  164. package/src/__tests__/__fixtures__/versioned-site/i18n/en/docusaurus-plugin-content-docs-community/current/team.md +0 -5
  165. package/src/__tests__/__fixtures__/versioned-site/i18n/fr/docusaurus-plugin-content-docs/version-1.0.0/hello.md +0 -1
  166. package/src/__tests__/__fixtures__/versioned-site/sidebars.json +0 -10
  167. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.0/foo/bar.md +0 -4
  168. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.0/foo/baz.md +0 -1
  169. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.0/hello.md +0 -1
  170. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.1/foo/bar.md +0 -1
  171. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.1/hello.md +0 -1
  172. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootAbsoluteSlug.md +0 -5
  173. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootRelativeSlug.md +0 -5
  174. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootResolvedSlug.md +0 -5
  175. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootTryToEscapeSlug.md +0 -5
  176. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/absoluteSlug.md +0 -5
  177. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/relativeSlug.md +0 -5
  178. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/resolvedSlug.md +0 -5
  179. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/tryToEscapeSlug.md +0 -5
  180. package/src/__tests__/__fixtures__/versioned-site/versioned_sidebars/version-1.0.0-sidebars.json +0 -11
  181. package/src/__tests__/__fixtures__/versioned-site/versioned_sidebars/version-1.0.1-sidebars.json +0 -10
  182. package/src/__tests__/__fixtures__/versioned-site/versioned_sidebars/version-withSlugs-sidebars.json +0 -5
  183. package/src/__tests__/__fixtures__/versioned-site/versions.json +0 -5
  184. package/src/__tests__/__snapshots__/cli.test.ts.snap +0 -90
  185. package/src/__tests__/__snapshots__/index.test.ts.snap +0 -1916
  186. package/src/__tests__/__snapshots__/sidebars.test.ts.snap +0 -218
  187. package/src/__tests__/__snapshots__/translations.test.ts.snap +0 -487
  188. package/src/__tests__/cli.test.ts +0 -333
  189. package/src/__tests__/docFrontMatter.test.ts +0 -244
  190. package/src/__tests__/docs.test.ts +0 -878
  191. package/src/__tests__/index.test.ts +0 -1871
  192. package/src/__tests__/lastUpdate.test.ts +0 -69
  193. package/src/__tests__/numberPrefix.test.ts +0 -199
  194. package/src/__tests__/options.test.ts +0 -231
  195. package/src/__tests__/sidebarItemsGenerator.test.ts +0 -336
  196. package/src/__tests__/sidebars.test.ts +0 -639
  197. package/src/__tests__/slug.test.ts +0 -109
  198. package/src/__tests__/translations.test.ts +0 -159
  199. package/src/__tests__/versions.test.ts +0 -741
  200. package/src/client/__tests__/docsClientUtils.test.ts +0 -371
  201. package/src/markdown/__tests__/__fixtures__/docs/doc-localized.md +0 -1
  202. package/src/markdown/__tests__/__fixtures__/docs/doc1.md +0 -13
  203. package/src/markdown/__tests__/__fixtures__/docs/doc2.md +0 -12
  204. package/src/markdown/__tests__/__fixtures__/docs/doc4.md +0 -19
  205. package/src/markdown/__tests__/__fixtures__/docs/doc5.md +0 -6
  206. package/src/markdown/__tests__/__fixtures__/docs/subdir/doc3.md +0 -3
  207. package/src/markdown/__tests__/__fixtures__/versioned_docs/version-1.0.0/doc2.md +0 -7
  208. package/src/markdown/__tests__/__fixtures__/versioned_docs/version-1.0.0/subdir/doc1.md +0 -3
  209. package/src/markdown/__tests__/__snapshots__/linkify.test.ts.snap +0 -82
  210. package/src/markdown/__tests__/linkify.test.ts +0 -190
  211. package/src/sidebarItemsGenerator.ts +0 -307
  212. package/src/sidebars.ts +0 -522
  213. package/tsconfig.json +0 -9
package/src/index.ts CHANGED
@@ -7,10 +7,6 @@
7
7
 
8
8
  import path from 'path';
9
9
 
10
- import {
11
- STATIC_DIR_NAME,
12
- DEFAULT_PLUGIN_ID,
13
- } from '@docusaurus/core/lib/constants';
14
10
  import {
15
11
  normalizeUrl,
16
12
  docuHash,
@@ -18,46 +14,59 @@ import {
18
14
  reportMessage,
19
15
  posixPath,
20
16
  addTrailingPathSeparator,
17
+ createAbsoluteFilePathMatcher,
18
+ createSlugger,
19
+ DEFAULT_PLUGIN_ID,
21
20
  } from '@docusaurus/utils';
22
- import {LoadContext, Plugin, RouteConfig} from '@docusaurus/types';
23
- import {loadSidebars, createSidebarsUtils, processSidebars} from './sidebars';
24
- import {readVersionDocs, processDocMetadata} from './docs';
21
+ import type {LoadContext, Plugin} from '@docusaurus/types';
22
+ import {loadSidebars} from './sidebars';
23
+ import {CategoryMetadataFilenamePattern} from './sidebars/generator';
24
+ import {
25
+ readVersionDocs,
26
+ processDocMetadata,
27
+ addDocNavigation,
28
+ getMainDocId,
29
+ } from './docs';
25
30
  import {getDocsDirPaths, readVersionsMetadata} from './versions';
26
31
 
27
- import {
28
- PluginOptions,
32
+ import type {
29
33
  LoadedContent,
30
34
  SourceToPermalink,
31
35
  DocMetadataBase,
32
- DocMetadata,
33
- GlobalPluginData,
34
36
  VersionMetadata,
35
- DocNavLink,
36
37
  LoadedVersion,
37
38
  DocFile,
38
39
  DocsMarkdownOption,
40
+ VersionTag,
41
+ DocFrontMatter,
39
42
  } from './types';
40
- import {PermalinkToSidebar} from '@docusaurus/plugin-content-docs-types';
41
- import {RuleSetRule} from 'webpack';
43
+ import type {RuleSetRule} from 'webpack';
42
44
  import {cliDocsVersionCommand} from './cli';
43
45
  import {VERSIONS_JSON_FILE} from './constants';
44
- import {flatten, keyBy, compact, mapValues} from 'lodash';
45
46
  import {toGlobalDataVersion} from './globalData';
46
- import {toVersionMetadataProp} from './props';
47
+ import {toTagDocListProp} from './props';
47
48
  import {
48
49
  translateLoadedContent,
49
50
  getLoadedContentTranslationFiles,
50
51
  } from './translations';
51
- import {CategoryMetadataFilenamePattern} from './sidebarItemsGenerator';
52
- import chalk from 'chalk';
52
+ import logger from '@docusaurus/logger';
53
+ import {getVersionTags} from './tags';
54
+ import {createVersionRoutes} from './routes';
55
+ import type {
56
+ PropTagsListPage,
57
+ PluginOptions,
58
+ } from '@docusaurus/plugin-content-docs';
59
+ import type {GlobalPluginData} from '@docusaurus/plugin-content-docs/client';
60
+ import {createSidebarsUtils} from './sidebars/utils';
61
+ import {getCategoryGeneratedIndexMetadataList} from './categoryGeneratedIndex';
53
62
 
54
- export default function pluginContentDocs(
63
+ export default async function pluginContentDocs(
55
64
  context: LoadContext,
56
65
  options: PluginOptions,
57
- ): Plugin<LoadedContent> {
66
+ ): Promise<Plugin<LoadedContent>> {
58
67
  const {siteDir, generatedFilesDir, baseUrl, siteConfig} = context;
59
68
 
60
- const versionsMetadata = readVersionsMetadata({context, options});
69
+ const versionsMetadata = await readVersionsMetadata({context, options});
61
70
 
62
71
  const pluginId = options.id ?? DEFAULT_PLUGIN_ID;
63
72
 
@@ -72,14 +81,6 @@ export default function pluginContentDocs(
72
81
  return {
73
82
  name: 'docusaurus-plugin-content-docs',
74
83
 
75
- getThemePath() {
76
- return path.resolve(__dirname, './theme');
77
- },
78
-
79
- getTypeScriptThemePath() {
80
- return path.resolve(__dirname, '..', 'src', 'theme');
81
- },
82
-
83
84
  extendCli(cli) {
84
85
  const isDefaultPluginId = pluginId === DEFAULT_PLUGIN_ID;
85
86
 
@@ -100,6 +101,8 @@ export default function pluginContentDocs(
100
101
  cliDocsVersionCommand(version, siteDir, pluginId, {
101
102
  path: options.path,
102
103
  sidebarPath: options.sidebarPath,
104
+ sidebarCollapsed: options.sidebarCollapsed,
105
+ sidebarCollapsible: options.sidebarCollapsible,
103
106
  });
104
107
  });
105
108
  },
@@ -108,22 +111,12 @@ export default function pluginContentDocs(
108
111
  return getLoadedContentTranslationFiles(content);
109
112
  },
110
113
 
111
- getClientModules() {
112
- const modules = [];
113
- if (options.admonitions) {
114
- modules.push(require.resolve('remark-admonitions/styles/infima.css'));
115
- }
116
- return modules;
117
- },
118
-
119
114
  getPathsToWatch() {
120
115
  function getVersionPathsToWatch(version: VersionMetadata): string[] {
121
116
  const result = [
122
- ...flatten(
123
- options.include.map((pattern) =>
124
- getDocsDirPaths(version).map(
125
- (docsDirPath) => `${docsDirPath}/${pattern}`,
126
- ),
117
+ ...options.include.flatMap((pattern) =>
118
+ getDocsDirPaths(version).map(
119
+ (docsDirPath) => `${docsDirPath}/${pattern}`,
127
120
  ),
128
121
  ),
129
122
  `${version.contentPath}/**/${CategoryMetadataFilenamePattern}`,
@@ -134,7 +127,7 @@ export default function pluginContentDocs(
134
127
  return result;
135
128
  }
136
129
 
137
- return flatten(versionsMetadata.map(getVersionPathsToWatch));
130
+ return versionsMetadata.flatMap(getVersionPathsToWatch);
138
131
  },
139
132
 
140
133
  async loadContent() {
@@ -166,111 +159,46 @@ export default function pluginContentDocs(
166
159
  async function doLoadVersion(
167
160
  versionMetadata: VersionMetadata,
168
161
  ): Promise<LoadedVersion> {
169
- const unprocessedSidebars = loadSidebars(
170
- versionMetadata.sidebarFilePath,
171
- );
172
-
173
- const docsBase: DocMetadataBase[] = await loadVersionDocsBase(
162
+ const docs: DocMetadataBase[] = await loadVersionDocsBase(
174
163
  versionMetadata,
175
164
  );
176
- const docsBaseById: Record<string, DocMetadataBase> = keyBy(
177
- docsBase,
178
- (doc) => doc.id,
179
- );
180
165
 
181
- const sidebars = await processSidebars({
166
+ const sidebars = await loadSidebars(versionMetadata.sidebarFilePath, {
182
167
  sidebarItemsGenerator: options.sidebarItemsGenerator,
183
168
  numberPrefixParser: options.numberPrefixParser,
184
- unprocessedSidebars,
185
- docs: docsBase,
169
+ docs,
186
170
  version: versionMetadata,
171
+ sidebarOptions: {
172
+ sidebarCollapsed: options.sidebarCollapsed,
173
+ sidebarCollapsible: options.sidebarCollapsible,
174
+ },
175
+ categoryLabelSlugger: createSlugger(),
187
176
  });
188
177
 
189
178
  const sidebarsUtils = createSidebarsUtils(sidebars);
190
179
 
191
- const validDocIds = Object.keys(docsBaseById);
192
- sidebarsUtils.checkSidebarsDocIds(
193
- validDocIds,
194
- versionMetadata.sidebarFilePath as string,
195
- );
196
-
197
- // Add sidebar/next/previous to the docs
198
- function addNavData(doc: DocMetadataBase): DocMetadata {
199
- const {
200
- sidebarName,
201
- previousId,
202
- nextId,
203
- } = sidebarsUtils.getDocNavigation(doc.id);
204
- const toDocNavLink = (navDocId: string): DocNavLink => {
205
- const {title, permalink, frontMatter} = docsBaseById[navDocId];
206
- return {
207
- title:
208
- frontMatter.pagination_label ??
209
- frontMatter.sidebar_label ??
210
- title,
211
- permalink,
212
- };
213
- };
214
- return {
215
- ...doc,
216
- sidebar: sidebarName,
217
- previous: previousId ? toDocNavLink(previousId) : undefined,
218
- next: nextId ? toDocNavLink(nextId) : undefined,
219
- };
220
- }
221
-
222
- const docs = docsBase.map(addNavData);
223
-
224
- // sort to ensure consistent output for tests
225
- docs.sort((a, b) => a.id.localeCompare(b.id));
226
-
227
- // TODO really useful? replace with global state logic?
228
- const permalinkToSidebar: PermalinkToSidebar = {};
229
- Object.values(docs).forEach((doc) => {
230
- if (doc.sidebar) {
231
- permalinkToSidebar[doc.permalink] = doc.sidebar;
232
- }
233
- });
234
-
235
- // The "main doc" is the "version entry point"
236
- // We browse this doc by clicking on a version:
237
- // - the "home" doc (at '/docs/')
238
- // - the first doc of the first sidebar
239
- // - a random doc (if no docs are in any sidebar... edge case)
240
- function getMainDoc(): DocMetadata {
241
- const versionHomeDoc = docs.find(
242
- (doc) =>
243
- doc.unversionedId === options.homePageId || doc.slug === '/',
244
- );
245
- const firstDocIdOfFirstSidebar = sidebarsUtils.getFirstDocIdOfFirstSidebar();
246
- if (versionHomeDoc) {
247
- return versionHomeDoc;
248
- } else if (firstDocIdOfFirstSidebar) {
249
- return docs.find((doc) => doc.id === firstDocIdOfFirstSidebar)!;
250
- } else {
251
- return docs[0];
252
- }
253
- }
254
-
255
180
  return {
256
181
  ...versionMetadata,
257
- mainDocId: getMainDoc().unversionedId,
182
+ docs: addDocNavigation(
183
+ docs,
184
+ sidebarsUtils,
185
+ versionMetadata.sidebarFilePath as string,
186
+ ),
258
187
  sidebars,
259
- permalinkToSidebar,
260
- docs: docs.map(addNavData),
188
+ mainDocId: getMainDocId({docs, sidebarsUtils}),
189
+ categoryGeneratedIndices: getCategoryGeneratedIndexMetadataList({
190
+ docs,
191
+ sidebarsUtils,
192
+ }),
261
193
  };
262
194
  }
263
195
 
264
196
  async function loadVersion(versionMetadata: VersionMetadata) {
265
197
  try {
266
198
  return await doLoadVersion(versionMetadata);
267
- } catch (e) {
268
- console.error(
269
- chalk.red(
270
- `Loading of version failed for version "${versionMetadata.versionName}"`,
271
- ),
272
- );
273
- throw e;
199
+ } catch (err) {
200
+ logger.error`Loading of version failed for version name=${versionMetadata.versionName}`;
201
+ throw err;
274
202
  }
275
203
  }
276
204
 
@@ -285,80 +213,90 @@ export default function pluginContentDocs(
285
213
 
286
214
  async contentLoaded({content, actions}) {
287
215
  const {loadedVersions} = content;
288
- const {docLayoutComponent, docItemComponent} = options;
216
+ const {
217
+ docLayoutComponent,
218
+ docItemComponent,
219
+ docCategoryGeneratedIndexComponent,
220
+ breadcrumbs,
221
+ } = options;
289
222
  const {addRoute, createData, setGlobalData} = actions;
290
223
 
291
- const createDocRoutes = async (
292
- docs: DocMetadata[],
293
- ): Promise<RouteConfig[]> => {
294
- const routes = await Promise.all(
295
- docs.map(async (metadataItem) => {
296
- await createData(
297
- // Note that this created data path must be in sync with
298
- // metadataPath provided to mdx-loader.
299
- `${docuHash(metadataItem.source)}.json`,
300
- JSON.stringify(metadataItem, null, 2),
224
+ async function createVersionTagsRoutes(version: LoadedVersion) {
225
+ const versionTags = getVersionTags(version.docs);
226
+
227
+ // TODO tags should be a sub route of the version route
228
+ async function createTagsListPage() {
229
+ const tagsProp: PropTagsListPage['tags'] = Object.values(
230
+ versionTags,
231
+ ).map((tagValue) => ({
232
+ name: tagValue.name,
233
+ permalink: tagValue.permalink,
234
+ count: tagValue.docIds.length,
235
+ }));
236
+
237
+ // Only create /tags page if there are tags.
238
+ if (Object.keys(tagsProp).length > 0) {
239
+ const tagsPropPath = await createData(
240
+ `${docuHash(`tags-list-${version.versionName}-prop`)}.json`,
241
+ JSON.stringify(tagsProp, null, 2),
301
242
  );
302
-
303
- return {
304
- path: metadataItem.permalink,
305
- component: docItemComponent,
243
+ addRoute({
244
+ path: version.tagsPath,
306
245
  exact: true,
246
+ component: options.docTagsListComponent,
307
247
  modules: {
308
- content: metadataItem.source,
248
+ tags: aliasedSource(tagsPropPath),
309
249
  },
310
- };
311
- }),
312
- );
313
-
314
- return routes.sort((a, b) => a.path.localeCompare(b.path));
315
- };
316
-
317
- async function doCreateVersionRoutes(loadedVersion: LoadedVersion) {
318
- const versionMetadataPropPath = await createData(
319
- `${docuHash(
320
- `version-${loadedVersion.versionName}-metadata-prop`,
321
- )}.json`,
322
- JSON.stringify(
323
- toVersionMetadataProp(pluginId, loadedVersion),
324
- null,
325
- 2,
326
- ),
327
- );
328
-
329
- addRoute({
330
- path: loadedVersion.versionPath,
331
- // allow matching /docs/* as well
332
- exact: false,
333
- // main docs component (DocPage)
334
- component: docLayoutComponent,
335
- // sub-routes for each doc
336
- routes: await createDocRoutes(loadedVersion.docs),
337
- modules: {
338
- versionMetadata: aliasedSource(versionMetadataPropPath),
339
- },
340
- priority: loadedVersion.routePriority,
341
- });
342
- }
250
+ });
251
+ }
252
+ }
343
253
 
344
- async function createVersionRoutes(loadedVersion: LoadedVersion) {
345
- try {
346
- return await doCreateVersionRoutes(loadedVersion);
347
- } catch (e) {
348
- console.error(
349
- chalk.red(
350
- `Can't create version routes for version "${loadedVersion.versionName}"`,
351
- ),
254
+ // TODO tags should be a sub route of the version route
255
+ async function createTagDocListPage(tag: VersionTag) {
256
+ const tagProps = toTagDocListProp({
257
+ allTagsPath: version.tagsPath,
258
+ tag,
259
+ docs: version.docs,
260
+ });
261
+ const tagPropPath = await createData(
262
+ `${docuHash(`tag-${tag.permalink}`)}.json`,
263
+ JSON.stringify(tagProps, null, 2),
352
264
  );
353
- throw e;
265
+ addRoute({
266
+ path: tag.permalink,
267
+ component: options.docTagDocListComponent,
268
+ exact: true,
269
+ modules: {
270
+ tag: aliasedSource(tagPropPath),
271
+ },
272
+ });
354
273
  }
274
+
275
+ await createTagsListPage();
276
+ await Promise.all(Object.values(versionTags).map(createTagDocListPage));
355
277
  }
356
278
 
357
- await Promise.all(loadedVersions.map(createVersionRoutes));
279
+ await Promise.all(
280
+ loadedVersions.map((loadedVersion) =>
281
+ createVersionRoutes({
282
+ loadedVersion,
283
+ docItemComponent,
284
+ docLayoutComponent,
285
+ docCategoryGeneratedIndexComponent,
286
+ pluginId,
287
+ aliasedSource,
288
+ actions,
289
+ }),
290
+ ),
291
+ );
292
+
293
+ // TODO tags should be a sub route of the version route
294
+ await Promise.all(loadedVersions.map(createVersionTagsRoutes));
358
295
 
359
296
  setGlobalData<GlobalPluginData>({
360
297
  path: normalizeUrl([baseUrl, options.routeBasePath]),
361
298
  versions: loadedVersions.map(toGlobalDataVersion),
299
+ breadcrumbs,
362
300
  });
363
301
  },
364
302
 
@@ -372,10 +310,9 @@ export default function pluginContentDocs(
372
310
  } = options;
373
311
 
374
312
  function getSourceToPermalink(): SourceToPermalink {
375
- const allDocs = flatten(content.loadedVersions.map((v) => v.docs));
376
- return mapValues(
377
- keyBy(allDocs, (d) => d.source),
378
- (d) => d.permalink,
313
+ const allDocs = content.loadedVersions.flatMap((v) => v.docs);
314
+ return Object.fromEntries(
315
+ allDocs.map(({source, permalink}) => [source, permalink]),
379
316
  );
380
317
  }
381
318
 
@@ -395,12 +332,13 @@ export default function pluginContentDocs(
395
332
  };
396
333
 
397
334
  function createMDXLoaderRule(): RuleSetRule {
335
+ const contentDirs = versionsMetadata.flatMap(getDocsDirPaths);
398
336
  return {
399
- test: /(\.mdx?)$/,
400
- include: flatten(versionsMetadata.map(getDocsDirPaths))
337
+ test: /\.mdx?$/i,
338
+ include: contentDirs
401
339
  // Trailing slash is important, see https://github.com/facebook/docusaurus/pull/3970
402
340
  .map(addTrailingPathSeparator),
403
- use: compact([
341
+ use: [
404
342
  getJSLoader({isServer}),
405
343
  {
406
344
  loader: require.resolve('@docusaurus/mdx-loader'),
@@ -409,20 +347,36 @@ export default function pluginContentDocs(
409
347
  rehypePlugins,
410
348
  beforeDefaultRehypePlugins,
411
349
  beforeDefaultRemarkPlugins,
412
- staticDir: path.join(siteDir, STATIC_DIR_NAME),
350
+ staticDirs: siteConfig.staticDirectories.map((dir) =>
351
+ path.resolve(siteDir, dir),
352
+ ),
353
+ siteDir,
354
+ isMDXPartial: createAbsoluteFilePathMatcher(
355
+ options.exclude,
356
+ contentDirs,
357
+ ),
413
358
  metadataPath: (mdxPath: string) => {
414
359
  // Note that metadataPath must be the same/in-sync as
415
360
  // the path from createData for each MDX.
416
361
  const aliasedPath = aliasedSitePath(mdxPath, siteDir);
417
362
  return path.join(dataDir, `${docuHash(aliasedPath)}.json`);
418
363
  },
364
+ // Assets allow to convert some relative images paths to
365
+ // require(...) calls
366
+ createAssets: ({
367
+ frontMatter,
368
+ }: {
369
+ frontMatter: DocFrontMatter;
370
+ }) => ({
371
+ image: frontMatter.image,
372
+ }),
419
373
  },
420
374
  },
421
375
  {
422
376
  loader: path.resolve(__dirname, './markdown/index.js'),
423
377
  options: docsMarkdownOptions,
424
378
  },
425
- ]),
379
+ ].filter(Boolean),
426
380
  };
427
381
  }
428
382
 
package/src/lastUpdate.ts CHANGED
@@ -5,14 +5,11 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- import shell from 'shelljs';
9
- import execa from 'execa';
10
- import path from 'path';
8
+ import logger from '@docusaurus/logger';
9
+ import {getFileCommitDate, GitNotFoundError} from '@docusaurus/utils';
11
10
 
12
11
  type FileLastUpdateData = {timestamp?: number; author?: string};
13
12
 
14
- const GIT_COMMIT_TIMESTAMP_AUTHOR_REGEX = /^(\d+), (.+)$/;
15
-
16
13
  let showedGitRequirementError = false;
17
14
 
18
15
  export async function getFileLastUpdate(
@@ -21,42 +18,22 @@ export async function getFileLastUpdate(
21
18
  if (!filePath) {
22
19
  return null;
23
20
  }
24
- function getTimestampAndAuthor(str: string): FileLastUpdateData | null {
25
- if (!str) {
26
- return null;
27
- }
28
-
29
- const temp = str.match(GIT_COMMIT_TIMESTAMP_AUTHOR_REGEX);
30
- return !temp || temp.length < 3
31
- ? null
32
- : {timestamp: +temp[1], author: temp[2]};
33
- }
34
21
 
35
22
  // Wrap in try/catch in case the shell commands fail
36
23
  // (e.g. project doesn't use Git, etc).
37
24
  try {
38
- if (!shell.which('git')) {
39
- if (!showedGitRequirementError) {
40
- showedGitRequirementError = true;
41
- console.warn('Sorry, the docs plugin last update options require Git.');
42
- }
43
-
44
- return null;
25
+ const result = getFileCommitDate(filePath, {
26
+ age: 'newest',
27
+ includeAuthor: true,
28
+ });
29
+ return {timestamp: result.timestamp, author: result.author};
30
+ } catch (err) {
31
+ if (err instanceof GitNotFoundError && !showedGitRequirementError) {
32
+ logger.warn('Sorry, the docs plugin last update options require Git.');
33
+ showedGitRequirementError = true;
34
+ } else {
35
+ logger.error(err);
45
36
  }
46
-
47
- const fileBasename = path.basename(filePath);
48
- const fileDirname = path.dirname(filePath);
49
- const {stdout} = await execa(
50
- 'git',
51
- ['log', '-1', '--format=%ct, %an', fileBasename],
52
- {
53
- cwd: fileDirname,
54
- },
55
- );
56
- return getTimestampAndAuthor(stdout);
57
- } catch (error) {
58
- console.error(error);
37
+ return null;
59
38
  }
60
-
61
- return null;
62
39
  }
@@ -6,21 +6,17 @@
6
6
  */
7
7
 
8
8
  import {linkify} from './linkify';
9
- import {DocsMarkdownOption} from '../types';
9
+ import type {DocsMarkdownOption} from '../types';
10
+ import type {LoaderContext} from 'webpack';
10
11
 
11
- // TODO temporary until Webpack5 export this type
12
- // see https://github.com/webpack/webpack/issues/11630
13
- interface Loader extends Function {
14
- (this: any, source: string): string | Buffer | void | undefined;
15
- }
16
-
17
- const markdownLoader: Loader = function (source) {
18
- const fileString = source as string;
12
+ export default function markdownLoader(
13
+ this: LoaderContext<DocsMarkdownOption>,
14
+ source: string,
15
+ ): void {
16
+ const fileString = source;
19
17
  const callback = this.async();
20
- const options = this.getOptions() as DocsMarkdownOption;
18
+ const options = this.getOptions();
21
19
  return (
22
20
  callback && callback(null, linkify(fileString, this.resourcePath, options))
23
21
  );
24
- };
25
-
26
- export default markdownLoader;
22
+ }
@@ -5,7 +5,7 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- import {DocsMarkdownOption} from '../types';
8
+ import type {DocsMarkdownOption} from '../types';
9
9
  import {getDocsDirPaths} from '../versions';
10
10
  import {replaceMarkdownLinks} from '@docusaurus/utils';
11
11
 
@@ -5,25 +5,28 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- import {NumberPrefixParser} from './types';
8
+ import type {NumberPrefixParser} from '@docusaurus/plugin-content-docs';
9
9
 
10
10
  // Best-effort to avoid parsing some patterns as number prefix
11
- const IgnoredPrefixPatterns = (function () {
11
+ const IgnoredPrefixPatterns = (() => {
12
12
  // ignore common date-like patterns: https://github.com/facebook/docusaurus/issues/4640
13
- const DateLikePrefixRegex = /^((\d{2}|\d{4})[-_.]\d{2}([-_.](\d{2}|\d{4}))?)(.*)$/;
13
+ const DateLikePrefixRegex =
14
+ /^(?:\d{2}|\d{4})[-_.]\d{2}(?:[-_.](?:\d{2}|\d{4}))?.*$/;
14
15
 
15
16
  // ignore common versioning patterns: https://github.com/facebook/docusaurus/issues/4653
16
- // note: we could try to parse float numbers in filenames but that is probably not worth it
17
- // as a version such as "8.0" can be interpreted as both a version and a float
18
- // User can configure his own NumberPrefixParser if he wants 8.0 to be interpreted as a float
19
- const VersionLikePrefixRegex = /^(\d+[-_.]\d+)(.*)$/;
17
+ // note: we could try to parse float numbers in filenames but that is
18
+ // probably not worth it as a version such as "8.0" can be interpreted as both
19
+ // a version and a float. User can configure her own NumberPrefixParser if
20
+ // she wants 8.0 to be interpreted as a float
21
+ const VersionLikePrefixRegex = /^\d+[-_.]\d+.*$/;
20
22
 
21
23
  return new RegExp(
22
24
  `${DateLikePrefixRegex.source}|${VersionLikePrefixRegex.source}`,
23
25
  );
24
26
  })();
25
27
 
26
- const NumberPrefixRegex = /^(?<numberPrefix>\d+)(?<separator>\s*[-_.]+\s*)(?<suffix>.*)$/;
28
+ const NumberPrefixRegex =
29
+ /^(?<numberPrefix>\d+)(?<separator>\s*[-_.]+\s*)(?<suffix>.*)$/;
27
30
 
28
31
  // 0-myDoc => {filename: myDoc, numberPrefix: 0}
29
32
  // 003 - myDoc => {filename: myDoc, numberPrefix: 3}