@docusaurus/plugin-content-docs 2.0.0-beta.fc64c12e4 → 2.0.0

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