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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (230) 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 -72
  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 +34 -7
  12. package/lib/docs.js +202 -79
  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 +124 -154
  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 +56 -23
  29. package/lib/props.d.ts +7 -2
  30. package/lib/props.js +84 -14
  31. package/lib/routes.d.ts +29 -0
  32. package/lib/routes.js +96 -0
  33. package/lib/server-export.d.ts +9 -0
  34. package/lib/server-export.js +25 -0
  35. package/lib/{sidebarItemsGenerator.d.ts → sidebars/generator.d.ts} +1 -6
  36. package/lib/sidebars/generator.js +209 -0
  37. package/lib/sidebars/index.d.ts +13 -0
  38. package/lib/sidebars/index.js +92 -0
  39. package/lib/sidebars/normalization.d.ts +13 -0
  40. package/lib/sidebars/normalization.js +59 -0
  41. package/lib/sidebars/postProcessor.d.ts +11 -0
  42. package/lib/sidebars/postProcessor.js +81 -0
  43. package/lib/sidebars/processor.d.ts +10 -0
  44. package/lib/sidebars/processor.js +79 -0
  45. package/lib/sidebars/types.d.ts +183 -0
  46. package/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 -185
  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 -114
  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 +281 -83
  71. package/src/frontMatter.ts +63 -0
  72. package/src/globalData.ts +57 -7
  73. package/src/index.ts +183 -224
  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 +61 -29
  79. package/src/plugin-content-docs.d.ts +569 -93
  80. package/src/props.ts +121 -21
  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 -250
  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 -211
  101. package/lib/sidebars.d.ts +0 -43
  102. package/lib/sidebars.js +0 -320
  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/foo/bar.md +0 -69
  125. package/src/__tests__/__fixtures__/simple-site/docs/foo/baz.md +0 -70
  126. package/src/__tests__/__fixtures__/simple-site/docs/headingAsTitle.md +0 -1
  127. package/src/__tests__/__fixtures__/simple-site/docs/hello.md +0 -53
  128. package/src/__tests__/__fixtures__/simple-site/docs/ipsum.md +0 -5
  129. package/src/__tests__/__fixtures__/simple-site/docs/lorem.md +0 -6
  130. package/src/__tests__/__fixtures__/simple-site/docs/rootAbsoluteSlug.md +0 -5
  131. package/src/__tests__/__fixtures__/simple-site/docs/rootRelativeSlug.md +0 -5
  132. package/src/__tests__/__fixtures__/simple-site/docs/rootResolvedSlug.md +0 -5
  133. package/src/__tests__/__fixtures__/simple-site/docs/rootTryToEscapeSlug.md +0 -5
  134. package/src/__tests__/__fixtures__/simple-site/docs/slugs/absoluteSlug.md +0 -5
  135. package/src/__tests__/__fixtures__/simple-site/docs/slugs/relativeSlug.md +0 -5
  136. package/src/__tests__/__fixtures__/simple-site/docs/slugs/resolvedSlug.md +0 -5
  137. package/src/__tests__/__fixtures__/simple-site/docs/slugs/tryToEscapeSlug.md +0 -5
  138. package/src/__tests__/__fixtures__/simple-site/docusaurus.config.js +0 -14
  139. package/src/__tests__/__fixtures__/simple-site/sidebars.json +0 -23
  140. package/src/__tests__/__fixtures__/simple-site/wrong-sidebars.json +0 -7
  141. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/0-getting-started.md +0 -3
  142. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/1-installation.md +0 -3
  143. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/00_api-overview.md +0 -3
  144. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/01_Core APIs/0 --- Client API.md +0 -1
  145. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/01_Core APIs/1 --- Server API.md +0 -1
  146. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/02_Extension APIs/0. Plugin API.md +0 -1
  147. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/02_Extension APIs/1. Theme API.md +0 -1
  148. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/02_Extension APIs/_category_.yml +0 -1
  149. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/03_api-end.md +0 -3
  150. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/_category_.json +0 -3
  151. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/0-guide2.5.md +0 -8
  152. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/02-guide2.md +0 -7
  153. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/_category_.json +0 -3
  154. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/a-guide4.md +0 -7
  155. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/b-guide5.md +0 -7
  156. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/guide3.md +0 -8
  157. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/z-guide1.md +0 -8
  158. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/partialAutogeneratedSidebars.js +0 -23
  159. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/partialAutogeneratedSidebars2.js +0 -16
  160. package/src/__tests__/__fixtures__/site-with-doc-label/docs/hello-1.md +0 -7
  161. package/src/__tests__/__fixtures__/site-with-doc-label/docs/hello-2.md +0 -8
  162. package/src/__tests__/__fixtures__/site-with-doc-label/docusaurus.config.js +0 -14
  163. package/src/__tests__/__fixtures__/site-with-doc-label/sidebars.json +0 -14
  164. package/src/__tests__/__fixtures__/versioned-site/community/team.md +0 -1
  165. package/src/__tests__/__fixtures__/versioned-site/community_sidebars.json +0 -3
  166. package/src/__tests__/__fixtures__/versioned-site/community_versioned_docs/version-1.0.0/team.md +0 -1
  167. package/src/__tests__/__fixtures__/versioned-site/community_versioned_sidebars/version-1.0.0-sidebars.json +0 -3
  168. package/src/__tests__/__fixtures__/versioned-site/community_versions.json +0 -1
  169. package/src/__tests__/__fixtures__/versioned-site/docs/foo/bar.md +0 -4
  170. package/src/__tests__/__fixtures__/versioned-site/docs/hello.md +0 -1
  171. package/src/__tests__/__fixtures__/versioned-site/docs/slugs/absoluteSlug.md +0 -5
  172. package/src/__tests__/__fixtures__/versioned-site/docs/slugs/relativeSlug.md +0 -5
  173. package/src/__tests__/__fixtures__/versioned-site/docs/slugs/resolvedSlug.md +0 -5
  174. package/src/__tests__/__fixtures__/versioned-site/docs/slugs/tryToEscapeSlug.md +0 -5
  175. package/src/__tests__/__fixtures__/versioned-site/docusaurus.config.js +0 -18
  176. package/src/__tests__/__fixtures__/versioned-site/i18n/en/docusaurus-plugin-content-docs/version-1.0.0/hello.md +0 -1
  177. package/src/__tests__/__fixtures__/versioned-site/i18n/en/docusaurus-plugin-content-docs-community/current/team.md +0 -5
  178. package/src/__tests__/__fixtures__/versioned-site/i18n/fr/docusaurus-plugin-content-docs/version-1.0.0/hello.md +0 -1
  179. package/src/__tests__/__fixtures__/versioned-site/sidebars.json +0 -10
  180. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.0/foo/bar.md +0 -4
  181. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.0/foo/baz.md +0 -1
  182. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.0/hello.md +0 -1
  183. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.1/foo/bar.md +0 -1
  184. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.1/hello.md +0 -1
  185. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootAbsoluteSlug.md +0 -5
  186. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootRelativeSlug.md +0 -5
  187. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootResolvedSlug.md +0 -5
  188. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootTryToEscapeSlug.md +0 -5
  189. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/absoluteSlug.md +0 -5
  190. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/relativeSlug.md +0 -5
  191. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/resolvedSlug.md +0 -5
  192. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/tryToEscapeSlug.md +0 -5
  193. package/src/__tests__/__fixtures__/versioned-site/versioned_sidebars/version-1.0.0-sidebars.json +0 -11
  194. package/src/__tests__/__fixtures__/versioned-site/versioned_sidebars/version-1.0.1-sidebars.json +0 -10
  195. package/src/__tests__/__fixtures__/versioned-site/versioned_sidebars/version-withSlugs-sidebars.json +0 -5
  196. package/src/__tests__/__fixtures__/versioned-site/versions.json +0 -5
  197. package/src/__tests__/__snapshots__/cli.test.ts.snap +0 -90
  198. package/src/__tests__/__snapshots__/index.test.ts.snap +0 -1916
  199. package/src/__tests__/__snapshots__/sidebars.test.ts.snap +0 -218
  200. package/src/__tests__/__snapshots__/translations.test.ts.snap +0 -487
  201. package/src/__tests__/cli.test.ts +0 -333
  202. package/src/__tests__/docFrontMatter.test.ts +0 -244
  203. package/src/__tests__/docs.test.ts +0 -878
  204. package/src/__tests__/index.test.ts +0 -1871
  205. package/src/__tests__/lastUpdate.test.ts +0 -69
  206. package/src/__tests__/numberPrefix.test.ts +0 -199
  207. package/src/__tests__/options.test.ts +0 -231
  208. package/src/__tests__/sidebarItemsGenerator.test.ts +0 -336
  209. package/src/__tests__/sidebars.test.ts +0 -639
  210. package/src/__tests__/slug.test.ts +0 -109
  211. package/src/__tests__/translations.test.ts +0 -159
  212. package/src/__tests__/versions.test.ts +0 -741
  213. package/src/client/__tests__/docsClientUtils.test.ts +0 -371
  214. package/src/docFrontMatter.ts +0 -41
  215. package/src/markdown/__tests__/__fixtures__/docs/doc-localized.md +0 -1
  216. package/src/markdown/__tests__/__fixtures__/docs/doc1.md +0 -13
  217. package/src/markdown/__tests__/__fixtures__/docs/doc2.md +0 -12
  218. package/src/markdown/__tests__/__fixtures__/docs/doc4.md +0 -19
  219. package/src/markdown/__tests__/__fixtures__/docs/doc5.md +0 -6
  220. package/src/markdown/__tests__/__fixtures__/docs/subdir/doc3.md +0 -3
  221. package/src/markdown/__tests__/__fixtures__/versioned_docs/version-1.0.0/doc2.md +0 -7
  222. package/src/markdown/__tests__/__fixtures__/versioned_docs/version-1.0.0/subdir/doc1.md +0 -3
  223. package/src/markdown/__tests__/__snapshots__/linkify.test.ts.snap +0 -82
  224. package/src/markdown/__tests__/linkify.test.ts +0 -190
  225. package/src/sidebarItemsGenerator.ts +0 -307
  226. package/src/sidebars.ts +0 -522
  227. package/src/theme/hooks/useDocs.ts +0 -103
  228. package/src/versions.ts +0 -572
  229. package/tsconfig.json +0 -9
  230. 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,
18
+ createAbsoluteFilePathMatcher,
19
+ createSlugger,
20
+ DEFAULT_PLUGIN_ID,
21
21
  } from '@docusaurus/utils';
22
- import {LoadContext, Plugin, RouteConfig} from '@docusaurus/types';
23
- import {loadSidebars, createSidebarsUtils, processSidebars} from './sidebars';
24
- import {readVersionDocs, processDocMetadata} from './docs';
25
- import {getDocsDirPaths, readVersionsMetadata} from './versions';
26
-
22
+ import {loadSidebars, resolveSidebarPathOption} from './sidebars';
23
+ import {CategoryMetadataFilenamePattern} from './sidebars/generator';
27
24
  import {
28
- PluginOptions,
29
- LoadedContent,
30
- SourceToPermalink,
31
- DocMetadataBase,
32
- DocMetadata,
33
- GlobalPluginData,
34
- VersionMetadata,
35
- DocNavLink,
36
- LoadedVersion,
37
- DocFile,
38
- DocsMarkdownOption,
39
- } from './types';
40
- import {PermalinkToSidebar} from '@docusaurus/plugin-content-docs-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';
53
43
 
54
- export default function pluginContentDocs(
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';
62
+
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,34 +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
- });
104
- });
102
+ .action((version: unknown) =>
103
+ cliDocsVersionCommand(version, options, context),
104
+ );
105
105
  },
106
106
 
107
- async getTranslationFiles({content}) {
107
+ getTranslationFiles({content}) {
108
108
  return getLoadedContentTranslationFiles(content);
109
109
  },
110
110
 
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
111
  getPathsToWatch() {
120
112
  function getVersionPathsToWatch(version: VersionMetadata): string[] {
121
113
  const result = [
122
- ...flatten(
123
- options.include.map((pattern) =>
124
- getDocsDirPaths(version).map(
125
- (docsDirPath) => `${docsDirPath}/${pattern}`,
126
- ),
114
+ ...options.include.flatMap((pattern) =>
115
+ getContentPathList(version).map(
116
+ (docsDirPath) => `${docsDirPath}/${pattern}`,
127
117
  ),
128
118
  ),
129
119
  `${version.contentPath}/**/${CategoryMetadataFilenamePattern}`,
@@ -134,7 +124,7 @@ export default function pluginContentDocs(
134
124
  return result;
135
125
  }
136
126
 
137
- return flatten(versionsMetadata.map(getVersionPathsToWatch));
127
+ return versionsMetadata.flatMap(getVersionPathsToWatch);
138
128
  },
139
129
 
140
130
  async loadContent() {
@@ -152,12 +142,13 @@ export default function pluginContentDocs(
152
142
  )}".`,
153
143
  );
154
144
  }
155
- async function processVersionDoc(docFile: DocFile) {
145
+ function processVersionDoc(docFile: DocFile) {
156
146
  return processDocMetadata({
157
147
  docFile,
158
148
  versionMetadata,
159
149
  context,
160
150
  options,
151
+ env: process.env.NODE_ENV as DocEnv,
161
152
  });
162
153
  }
163
154
  return Promise.all(docFiles.map(processVersionDoc));
@@ -166,111 +157,45 @@ export default function pluginContentDocs(
166
157
  async function doLoadVersion(
167
158
  versionMetadata: VersionMetadata,
168
159
  ): Promise<LoadedVersion> {
169
- const unprocessedSidebars = loadSidebars(
170
- versionMetadata.sidebarFilePath,
171
- );
172
-
173
160
  const docsBase: DocMetadataBase[] = await loadVersionDocsBase(
174
161
  versionMetadata,
175
162
  );
176
- const docsBaseById: Record<string, DocMetadataBase> = keyBy(
177
- docsBase,
178
- (doc) => doc.id,
179
- );
180
163
 
181
- const sidebars = await processSidebars({
164
+ const [drafts, docs] = _.partition(docsBase, (doc) => doc.draft);
165
+
166
+ const sidebars = await loadSidebars(versionMetadata.sidebarFilePath, {
182
167
  sidebarItemsGenerator: options.sidebarItemsGenerator,
183
168
  numberPrefixParser: options.numberPrefixParser,
184
- unprocessedSidebars,
185
- docs: docsBase,
169
+ docs,
170
+ drafts,
186
171
  version: versionMetadata,
172
+ sidebarOptions: {
173
+ sidebarCollapsed: options.sidebarCollapsed,
174
+ sidebarCollapsible: options.sidebarCollapsible,
175
+ },
176
+ categoryLabelSlugger: createSlugger(),
187
177
  });
188
178
 
189
179
  const sidebarsUtils = createSidebarsUtils(sidebars);
190
180
 
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
181
  return {
256
182
  ...versionMetadata,
257
- mainDocId: getMainDoc().unversionedId,
183
+ docs: addDocNavigation(
184
+ docs,
185
+ sidebarsUtils,
186
+ versionMetadata.sidebarFilePath as string,
187
+ ),
188
+ drafts,
258
189
  sidebars,
259
- permalinkToSidebar,
260
- docs: docs.map(addNavData),
261
190
  };
262
191
  }
263
192
 
264
193
  async function loadVersion(versionMetadata: VersionMetadata) {
265
194
  try {
266
195
  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;
196
+ } catch (err) {
197
+ logger.error`Loading of version failed for version name=${versionMetadata.versionName}`;
198
+ throw err;
274
199
  }
275
200
  }
276
201
 
@@ -285,80 +210,101 @@ export default function pluginContentDocs(
285
210
 
286
211
  async contentLoaded({content, actions}) {
287
212
  const {loadedVersions} = content;
288
- const {docLayoutComponent, docItemComponent} = options;
213
+ const {
214
+ docLayoutComponent,
215
+ docItemComponent,
216
+ docCategoryGeneratedIndexComponent,
217
+ breadcrumbs,
218
+ } = options;
289
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
+ });
290
231
 
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),
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),
301
250
  );
302
-
303
- return {
304
- path: metadataItem.permalink,
305
- component: docItemComponent,
251
+ addRoute({
252
+ path: version.tagsPath,
306
253
  exact: true,
254
+ component: options.docTagsListComponent,
307
255
  modules: {
308
- content: metadataItem.source,
256
+ tags: aliasedSource(tagsPropPath),
309
257
  },
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
- }
258
+ });
259
+ }
260
+ }
343
261
 
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
- ),
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),
352
272
  );
353
- throw e;
273
+ addRoute({
274
+ path: tag.permalink,
275
+ component: options.docTagDocListComponent,
276
+ exact: true,
277
+ modules: {
278
+ tag: aliasedSource(tagPropPath),
279
+ },
280
+ });
354
281
  }
282
+
283
+ await createTagsListPage();
284
+ await Promise.all(Object.values(versionTags).map(createTagDocListPage));
355
285
  }
356
286
 
357
- 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));
358
303
 
359
- setGlobalData<GlobalPluginData>({
304
+ setGlobalData({
360
305
  path: normalizeUrl([baseUrl, options.routeBasePath]),
361
- versions: loadedVersions.map(toGlobalDataVersion),
306
+ versions: versions.map(toGlobalDataVersion),
307
+ breadcrumbs,
362
308
  });
363
309
  },
364
310
 
@@ -372,10 +318,9 @@ export default function pluginContentDocs(
372
318
  } = options;
373
319
 
374
320
  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,
321
+ const allDocs = content.loadedVersions.flatMap((v) => v.docs);
322
+ return Object.fromEntries(
323
+ allDocs.map(({source, permalink}) => [source, permalink]),
379
324
  );
380
325
  }
381
326
 
@@ -384,45 +329,59 @@ export default function pluginContentDocs(
384
329
  sourceToPermalink: getSourceToPermalink(),
385
330
  versionsMetadata,
386
331
  onBrokenMarkdownLink: (brokenMarkdownLink) => {
387
- if (siteConfig.onBrokenMarkdownLinks === 'ignore') {
388
- return;
389
- }
390
- reportMessage(
391
- `Docs markdown link couldn't be resolved: (${brokenMarkdownLink.link}) in ${brokenMarkdownLink.filePath} for version ${brokenMarkdownLink.contentPaths.versionName}`,
332
+ logger.report(
392
333
  siteConfig.onBrokenMarkdownLinks,
393
- );
334
+ )`Docs markdown link couldn't be resolved: (url=${brokenMarkdownLink.link}) in path=${brokenMarkdownLink.filePath} for version number=${brokenMarkdownLink.contentPaths.versionName}`;
394
335
  },
395
336
  };
396
337
 
397
338
  function createMDXLoaderRule(): RuleSetRule {
339
+ const contentDirs = versionsMetadata.flatMap(getContentPathList);
398
340
  return {
399
- test: /(\.mdx?)$/,
400
- include: flatten(versionsMetadata.map(getDocsDirPaths))
341
+ test: /\.mdx?$/i,
342
+ include: contentDirs
401
343
  // Trailing slash is important, see https://github.com/facebook/docusaurus/pull/3970
402
344
  .map(addTrailingPathSeparator),
403
- use: compact([
345
+ use: [
404
346
  getJSLoader({isServer}),
405
347
  {
406
348
  loader: require.resolve('@docusaurus/mdx-loader'),
407
349
  options: {
350
+ admonitions: options.admonitions,
408
351
  remarkPlugins,
409
352
  rehypePlugins,
410
353
  beforeDefaultRehypePlugins,
411
354
  beforeDefaultRemarkPlugins,
412
- staticDir: path.join(siteDir, STATIC_DIR_NAME),
355
+ staticDirs: siteConfig.staticDirectories.map((dir) =>
356
+ path.resolve(siteDir, dir),
357
+ ),
358
+ siteDir,
359
+ isMDXPartial: createAbsoluteFilePathMatcher(
360
+ options.exclude,
361
+ contentDirs,
362
+ ),
413
363
  metadataPath: (mdxPath: string) => {
414
364
  // Note that metadataPath must be the same/in-sync as
415
365
  // the path from createData for each MDX.
416
366
  const aliasedPath = aliasedSitePath(mdxPath, siteDir);
417
367
  return path.join(dataDir, `${docuHash(aliasedPath)}.json`);
418
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
+ }),
419
378
  },
420
379
  },
421
380
  {
422
381
  loader: path.resolve(__dirname, './markdown/index.js'),
423
382
  options: docsMarkdownOptions,
424
383
  },
425
- ]),
384
+ ].filter(Boolean),
426
385
  };
427
386
  }
428
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
+ }