@docusaurus/plugin-content-docs 2.0.0-beta.ff31de0ff → 2.0.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 (231) 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 +62 -72
  5. package/lib/client/docsClientUtils.d.ts +9 -28
  6. package/lib/client/docsClientUtils.js +35 -51
  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 +35 -8
  12. package/lib/docs.js +211 -78
  13. package/{src/__tests__/__fixtures__/site-with-autogenerated-sidebar/partialAutogeneratedSidebars2.js → lib/frontMatter.d.ts} +4 -10
  14. package/lib/frontMatter.js +53 -0
  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 +137 -146
  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 +7 -4
  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 +57 -29
  29. package/lib/props.d.ts +7 -2
  30. package/lib/props.js +87 -16
  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/{types.d.ts → lib/sidebars/types.js} +2 -7
  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 +29 -19
  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 -172
  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 -29
  65. package/src/categoryGeneratedIndex.ts +60 -0
  66. package/src/cli.ts +94 -114
  67. package/src/client/docsClientUtils.ts +47 -84
  68. package/src/client/index.ts +158 -0
  69. package/src/constants.ts +4 -2
  70. package/src/docs.ts +294 -78
  71. package/src/frontMatter.ts +63 -0
  72. package/src/globalData.ts +57 -7
  73. package/src/index.ts +200 -204
  74. package/src/lastUpdate.ts +27 -34
  75. package/src/markdown/index.ts +10 -16
  76. package/src/markdown/linkify.ts +8 -5
  77. package/src/numberPrefix.ts +19 -26
  78. package/src/options.ts +61 -43
  79. package/src/plugin-content-docs.d.ts +575 -78
  80. package/src/props.ts +128 -23
  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 +42 -23
  93. package/src/tags.ts +20 -0
  94. package/src/translations.ts +155 -124
  95. package/src/types.ts +17 -234
  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 -4673
  100. package/lib/docFrontMatter.d.ts +0 -21
  101. package/lib/docFrontMatter.js +0 -33
  102. package/lib/sidebarItemsGenerator.js +0 -211
  103. package/lib/sidebars.d.ts +0 -42
  104. package/lib/sidebars.js +0 -309
  105. package/lib/theme/hooks/useDocs.d.ts +0 -20
  106. package/lib/theme/hooks/useDocs.js +0 -72
  107. package/lib/versions.d.ts +0 -16
  108. package/lib/versions.js +0 -287
  109. package/src/__tests__/__fixtures__/bad-id-site/docs/invalid-id.md +0 -5
  110. package/src/__tests__/__fixtures__/bad-slug-on-doc-home-site/docs/docWithSlug.md +0 -5
  111. package/src/__tests__/__fixtures__/empty-site/docusaurus.config.js +0 -16
  112. package/src/__tests__/__fixtures__/empty-site/sidebars.json +0 -1
  113. package/src/__tests__/__fixtures__/sidebars/sidebars-category-shorthand.js +0 -34
  114. package/src/__tests__/__fixtures__/sidebars/sidebars-category-wrong-items.json +0 -11
  115. package/src/__tests__/__fixtures__/sidebars/sidebars-category-wrong-label.json +0 -11
  116. package/src/__tests__/__fixtures__/sidebars/sidebars-category.js +0 -44
  117. package/src/__tests__/__fixtures__/sidebars/sidebars-collapsed-first-level.json +0 -20
  118. package/src/__tests__/__fixtures__/sidebars/sidebars-collapsed.json +0 -21
  119. package/src/__tests__/__fixtures__/sidebars/sidebars-doc-id-not-string.json +0 -10
  120. package/src/__tests__/__fixtures__/sidebars/sidebars-link-wrong-href.json +0 -11
  121. package/src/__tests__/__fixtures__/sidebars/sidebars-link-wrong-label.json +0 -11
  122. package/src/__tests__/__fixtures__/sidebars/sidebars-link.json +0 -11
  123. package/src/__tests__/__fixtures__/sidebars/sidebars-unknown-type.json +0 -14
  124. package/src/__tests__/__fixtures__/sidebars/sidebars-wrong-field.json +0 -20
  125. package/src/__tests__/__fixtures__/sidebars/sidebars.json +0 -20
  126. package/src/__tests__/__fixtures__/simple-site/docs/foo/bar.md +0 -69
  127. package/src/__tests__/__fixtures__/simple-site/docs/foo/baz.md +0 -67
  128. package/src/__tests__/__fixtures__/simple-site/docs/headingAsTitle.md +0 -1
  129. package/src/__tests__/__fixtures__/simple-site/docs/hello.md +0 -52
  130. package/src/__tests__/__fixtures__/simple-site/docs/ipsum.md +0 -5
  131. package/src/__tests__/__fixtures__/simple-site/docs/lorem.md +0 -6
  132. package/src/__tests__/__fixtures__/simple-site/docs/rootAbsoluteSlug.md +0 -5
  133. package/src/__tests__/__fixtures__/simple-site/docs/rootRelativeSlug.md +0 -5
  134. package/src/__tests__/__fixtures__/simple-site/docs/rootResolvedSlug.md +0 -5
  135. package/src/__tests__/__fixtures__/simple-site/docs/rootTryToEscapeSlug.md +0 -5
  136. package/src/__tests__/__fixtures__/simple-site/docs/slugs/absoluteSlug.md +0 -5
  137. package/src/__tests__/__fixtures__/simple-site/docs/slugs/relativeSlug.md +0 -5
  138. package/src/__tests__/__fixtures__/simple-site/docs/slugs/resolvedSlug.md +0 -5
  139. package/src/__tests__/__fixtures__/simple-site/docs/slugs/tryToEscapeSlug.md +0 -5
  140. package/src/__tests__/__fixtures__/simple-site/docusaurus.config.js +0 -14
  141. package/src/__tests__/__fixtures__/simple-site/sidebars.json +0 -23
  142. package/src/__tests__/__fixtures__/simple-site/wrong-sidebars.json +0 -7
  143. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/0-getting-started.md +0 -3
  144. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/1-installation.md +0 -3
  145. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/00_api-overview.md +0 -3
  146. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/01_Core APIs/0 --- Client API.md +0 -1
  147. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/01_Core APIs/1 --- Server API.md +0 -1
  148. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/02_Extension APIs/0. Plugin API.md +0 -1
  149. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/02_Extension APIs/1. Theme API.md +0 -1
  150. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/02_Extension APIs/_category_.yml +0 -1
  151. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/03_api-end.md +0 -3
  152. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/_category_.json +0 -3
  153. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/0-guide2.5.md +0 -8
  154. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/02-guide2.md +0 -7
  155. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/_category_.json +0 -3
  156. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/a-guide4.md +0 -7
  157. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/b-guide5.md +0 -7
  158. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/guide3.md +0 -8
  159. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/z-guide1.md +0 -8
  160. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docusaurus.config.js +0 -14
  161. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/partialAutogeneratedSidebars.js +0 -23
  162. package/src/__tests__/__fixtures__/site-with-doc-label/docs/hello-1.md +0 -7
  163. package/src/__tests__/__fixtures__/site-with-doc-label/docs/hello-2.md +0 -8
  164. package/src/__tests__/__fixtures__/site-with-doc-label/docusaurus.config.js +0 -14
  165. package/src/__tests__/__fixtures__/site-with-doc-label/sidebars.json +0 -14
  166. package/src/__tests__/__fixtures__/versioned-site/community/team.md +0 -1
  167. package/src/__tests__/__fixtures__/versioned-site/community_sidebars.json +0 -3
  168. package/src/__tests__/__fixtures__/versioned-site/community_versioned_docs/version-1.0.0/team.md +0 -1
  169. package/src/__tests__/__fixtures__/versioned-site/community_versioned_sidebars/version-1.0.0-sidebars.json +0 -3
  170. package/src/__tests__/__fixtures__/versioned-site/community_versions.json +0 -1
  171. package/src/__tests__/__fixtures__/versioned-site/docs/foo/bar.md +0 -4
  172. package/src/__tests__/__fixtures__/versioned-site/docs/hello.md +0 -1
  173. package/src/__tests__/__fixtures__/versioned-site/docs/slugs/absoluteSlug.md +0 -5
  174. package/src/__tests__/__fixtures__/versioned-site/docs/slugs/relativeSlug.md +0 -5
  175. package/src/__tests__/__fixtures__/versioned-site/docs/slugs/resolvedSlug.md +0 -5
  176. package/src/__tests__/__fixtures__/versioned-site/docs/slugs/tryToEscapeSlug.md +0 -5
  177. package/src/__tests__/__fixtures__/versioned-site/docusaurus.config.js +0 -18
  178. package/src/__tests__/__fixtures__/versioned-site/i18n/en/docusaurus-plugin-content-docs/version-1.0.0/hello.md +0 -1
  179. package/src/__tests__/__fixtures__/versioned-site/i18n/en/docusaurus-plugin-content-docs-community/current/team.md +0 -5
  180. package/src/__tests__/__fixtures__/versioned-site/i18n/fr/docusaurus-plugin-content-docs/version-1.0.0/hello.md +0 -1
  181. package/src/__tests__/__fixtures__/versioned-site/sidebars.json +0 -10
  182. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.0/foo/bar.md +0 -4
  183. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.0/foo/baz.md +0 -1
  184. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.0/hello.md +0 -1
  185. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.1/foo/bar.md +0 -1
  186. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.1/hello.md +0 -1
  187. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootAbsoluteSlug.md +0 -5
  188. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootRelativeSlug.md +0 -5
  189. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootResolvedSlug.md +0 -5
  190. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootTryToEscapeSlug.md +0 -5
  191. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/absoluteSlug.md +0 -5
  192. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/relativeSlug.md +0 -5
  193. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/resolvedSlug.md +0 -5
  194. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/tryToEscapeSlug.md +0 -5
  195. package/src/__tests__/__fixtures__/versioned-site/versioned_sidebars/version-1.0.0-sidebars.json +0 -11
  196. package/src/__tests__/__fixtures__/versioned-site/versioned_sidebars/version-1.0.1-sidebars.json +0 -10
  197. package/src/__tests__/__fixtures__/versioned-site/versioned_sidebars/version-withSlugs-sidebars.json +0 -5
  198. package/src/__tests__/__fixtures__/versioned-site/versions.json +0 -5
  199. package/src/__tests__/__snapshots__/cli.test.ts.snap +0 -90
  200. package/src/__tests__/__snapshots__/index.test.ts.snap +0 -1907
  201. package/src/__tests__/__snapshots__/sidebars.test.ts.snap +0 -218
  202. package/src/__tests__/__snapshots__/translations.test.ts.snap +0 -487
  203. package/src/__tests__/cli.test.ts +0 -333
  204. package/src/__tests__/docFrontMatter.test.ts +0 -204
  205. package/src/__tests__/docs.test.ts +0 -875
  206. package/src/__tests__/index.test.ts +0 -1831
  207. package/src/__tests__/lastUpdate.test.ts +0 -68
  208. package/src/__tests__/numberPrefix.test.ts +0 -199
  209. package/src/__tests__/options.test.ts +0 -232
  210. package/src/__tests__/sidebarItemsGenerator.test.ts +0 -336
  211. package/src/__tests__/sidebars.test.ts +0 -638
  212. package/src/__tests__/slug.test.ts +0 -109
  213. package/src/__tests__/translations.test.ts +0 -159
  214. package/src/__tests__/versions.test.ts +0 -718
  215. package/src/client/__tests__/docsClientUtils.test.ts +0 -372
  216. package/src/docFrontMatter.ts +0 -53
  217. package/src/markdown/__tests__/__fixtures__/docs/doc-localized.md +0 -1
  218. package/src/markdown/__tests__/__fixtures__/docs/doc1.md +0 -13
  219. package/src/markdown/__tests__/__fixtures__/docs/doc2.md +0 -12
  220. package/src/markdown/__tests__/__fixtures__/docs/doc4.md +0 -19
  221. package/src/markdown/__tests__/__fixtures__/docs/doc5.md +0 -6
  222. package/src/markdown/__tests__/__fixtures__/docs/subdir/doc3.md +0 -3
  223. package/src/markdown/__tests__/__fixtures__/versioned_docs/version-1.0.0/doc2.md +0 -7
  224. package/src/markdown/__tests__/__fixtures__/versioned_docs/version-1.0.0/subdir/doc1.md +0 -3
  225. package/src/markdown/__tests__/__snapshots__/linkify.test.ts.snap +0 -82
  226. package/src/markdown/__tests__/linkify.test.ts +0 -190
  227. package/src/sidebarItemsGenerator.ts +0 -307
  228. package/src/sidebars.ts +0 -489
  229. package/src/theme/hooks/useDocs.ts +0 -99
  230. package/src/versions.ts +0 -511
  231. package/tsconfig.json +0 -9
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} 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';
40
+ import {getVersionTags} from './tags';
41
+ import {createVersionRoutes} from './routes';
42
+ import {createSidebarsUtils} from './sidebars/utils';
52
43
 
53
- 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(
54
64
  context: LoadContext,
55
65
  options: PluginOptions,
56
- ): Plugin<LoadedContent> {
66
+ ): Promise<Plugin<LoadedContent>> {
57
67
  const {siteDir, generatedFilesDir, baseUrl, siteConfig} = context;
68
+ // Mutate options to resolve sidebar path according to siteDir
69
+ options.sidebarPath = resolveSidebarPathOption(siteDir, options.sidebarPath);
58
70
 
59
- const versionsMetadata = readVersionsMetadata({context, options});
71
+ const versionsMetadata = await readVersionsMetadata({context, options});
60
72
 
61
- const sourceToPermalink: SourceToPermalink = {};
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() {
@@ -144,120 +134,71 @@ export default function pluginContentDocs(
144
134
  const docFiles = await readVersionDocs(versionMetadata, options);
145
135
  if (docFiles.length === 0) {
146
136
  throw new Error(
147
- `Docs version ${
137
+ `Docs version "${
148
138
  versionMetadata.versionName
149
- } has no docs! At least one doc should exist at path=[${path.relative(
139
+ }" has no docs! At least one doc should exist at "${path.relative(
150
140
  siteDir,
151
141
  versionMetadata.contentPath,
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));
164
155
  }
165
156
 
166
- async function loadVersion(
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(validDocIds);
193
-
194
- // Add sidebar/next/previous to the docs
195
- function addNavData(doc: DocMetadataBase): DocMetadata {
196
- const {
197
- sidebarName,
198
- previousId,
199
- nextId,
200
- } = sidebarsUtils.getDocNavigation(doc.id);
201
- const toDocNavLink = (navDocId: string): DocNavLink => ({
202
- title: docsBaseById[navDocId].title,
203
- permalink: docsBaseById[navDocId].permalink,
204
- });
205
- return {
206
- ...doc,
207
- sidebar: sidebarName,
208
- previous: previousId ? toDocNavLink(previousId) : undefined,
209
- next: nextId ? toDocNavLink(nextId) : undefined,
210
- };
211
- }
212
-
213
- const docs = docsBase.map(addNavData);
214
-
215
- // sort to ensure consistent output for tests
216
- docs.sort((a, b) => a.id.localeCompare(b.id));
217
-
218
- // TODO annoying side effect!
219
- Object.values(docs).forEach((loadedDoc) => {
220
- const {source, permalink} = loadedDoc;
221
- sourceToPermalink[source] = permalink;
222
- });
223
-
224
- // TODO really useful? replace with global state logic?
225
- const permalinkToSidebar: PermalinkToSidebar = {};
226
- Object.values(docs).forEach((doc) => {
227
- if (doc.sidebar) {
228
- permalinkToSidebar[doc.permalink] = doc.sidebar;
229
- }
230
- });
231
-
232
- // The "main doc" is the "version entry point"
233
- // We browse this doc by clicking on a version:
234
- // - the "home" doc (at '/docs/')
235
- // - the first doc of the first sidebar
236
- // - a random doc (if no docs are in any sidebar... edge case)
237
- function getMainDoc(): DocMetadata {
238
- const versionHomeDoc = docs.find(
239
- (doc) =>
240
- doc.unversionedId === options.homePageId || doc.slug === '/',
241
- );
242
- const firstDocIdOfFirstSidebar = sidebarsUtils.getFirstDocIdOfFirstSidebar();
243
- if (versionHomeDoc) {
244
- return versionHomeDoc;
245
- } else if (firstDocIdOfFirstSidebar) {
246
- return docs.find((doc) => doc.id === firstDocIdOfFirstSidebar)!;
247
- } else {
248
- return docs[0];
249
- }
250
- }
251
-
252
181
  return {
253
182
  ...versionMetadata,
254
- mainDocId: getMainDoc().unversionedId,
183
+ docs: addDocNavigation(
184
+ docs,
185
+ sidebarsUtils,
186
+ versionMetadata.sidebarFilePath as string,
187
+ ),
188
+ drafts,
255
189
  sidebars,
256
- permalinkToSidebar,
257
- docs: docs.map(addNavData),
258
190
  };
259
191
  }
260
192
 
193
+ async function loadVersion(versionMetadata: VersionMetadata) {
194
+ try {
195
+ return await doLoadVersion(versionMetadata);
196
+ } catch (err) {
197
+ logger.error`Loading of version failed for version name=${versionMetadata.versionName}`;
198
+ throw err;
199
+ }
200
+ }
201
+
261
202
  return {
262
203
  loadedVersions: await Promise.all(versionsMetadata.map(loadVersion)),
263
204
  };
@@ -269,71 +210,105 @@ export default function pluginContentDocs(
269
210
 
270
211
  async contentLoaded({content, actions}) {
271
212
  const {loadedVersions} = content;
272
- const {docLayoutComponent, docItemComponent} = options;
213
+ const {
214
+ docLayoutComponent,
215
+ docItemComponent,
216
+ docCategoryGeneratedIndexComponent,
217
+ breadcrumbs,
218
+ } = options;
273
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
+ });
274
231
 
275
- const createDocRoutes = async (
276
- docs: DocMetadata[],
277
- ): Promise<RouteConfig[]> => {
278
- const routes = await Promise.all(
279
- docs.map(async (metadataItem) => {
280
- await createData(
281
- // Note that this created data path must be in sync with
282
- // metadataPath provided to mdx-loader.
283
- `${docuHash(metadataItem.source)}.json`,
284
- 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),
285
250
  );
286
-
287
- return {
288
- path: metadataItem.permalink,
289
- component: docItemComponent,
251
+ addRoute({
252
+ path: version.tagsPath,
290
253
  exact: true,
254
+ component: options.docTagsListComponent,
291
255
  modules: {
292
- content: metadataItem.source,
256
+ tags: aliasedSource(tagsPropPath),
293
257
  },
294
- };
295
- }),
296
- );
297
-
298
- return routes.sort((a, b) => a.path.localeCompare(b.path));
299
- };
258
+ });
259
+ }
260
+ }
300
261
 
301
- async function handleVersion(loadedVersion: LoadedVersion) {
302
- const versionMetadataPropPath = await createData(
303
- `${docuHash(
304
- `version-${loadedVersion.versionName}-metadata-prop`,
305
- )}.json`,
306
- JSON.stringify(
307
- toVersionMetadataProp(pluginId, loadedVersion),
308
- null,
309
- 2,
310
- ),
311
- );
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),
272
+ );
273
+ addRoute({
274
+ path: tag.permalink,
275
+ component: options.docTagDocListComponent,
276
+ exact: true,
277
+ modules: {
278
+ tag: aliasedSource(tagPropPath),
279
+ },
280
+ });
281
+ }
312
282
 
313
- addRoute({
314
- path: loadedVersion.versionPath,
315
- // allow matching /docs/* as well
316
- exact: false,
317
- // main docs component (DocPage)
318
- component: docLayoutComponent,
319
- // sub-routes for each doc
320
- routes: await createDocRoutes(loadedVersion.docs),
321
- modules: {
322
- versionMetadata: aliasedSource(versionMetadataPropPath),
323
- },
324
- priority: loadedVersion.routePriority,
325
- });
283
+ await createTagsListPage();
284
+ await Promise.all(Object.values(versionTags).map(createTagDocListPage));
326
285
  }
327
286
 
328
- await Promise.all(loadedVersions.map(handleVersion));
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));
329
303
 
330
- setGlobalData<GlobalPluginData>({
304
+ setGlobalData({
331
305
  path: normalizeUrl([baseUrl, options.routeBasePath]),
332
- versions: loadedVersions.map(toGlobalDataVersion),
306
+ versions: versions.map(toGlobalDataVersion),
307
+ breadcrumbs,
333
308
  });
334
309
  },
335
310
 
336
- configureWebpack(_config, isServer, utils) {
311
+ configureWebpack(_config, isServer, utils, content) {
337
312
  const {getJSLoader} = utils;
338
313
  const {
339
314
  rehypePlugins,
@@ -342,50 +317,71 @@ export default function pluginContentDocs(
342
317
  beforeDefaultRemarkPlugins,
343
318
  } = options;
344
319
 
320
+ function getSourceToPermalink(): SourceToPermalink {
321
+ const allDocs = content.loadedVersions.flatMap((v) => v.docs);
322
+ return Object.fromEntries(
323
+ allDocs.map(({source, permalink}) => [source, permalink]),
324
+ );
325
+ }
326
+
345
327
  const docsMarkdownOptions: DocsMarkdownOption = {
346
328
  siteDir,
347
- sourceToPermalink,
329
+ sourceToPermalink: getSourceToPermalink(),
348
330
  versionsMetadata,
349
331
  onBrokenMarkdownLink: (brokenMarkdownLink) => {
350
- if (siteConfig.onBrokenMarkdownLinks === 'ignore') {
351
- return;
352
- }
353
- reportMessage(
354
- `Docs markdown link couldn't be resolved: (${brokenMarkdownLink.link}) in ${brokenMarkdownLink.filePath} for version ${brokenMarkdownLink.contentPaths.versionName}`,
332
+ logger.report(
355
333
  siteConfig.onBrokenMarkdownLinks,
356
- );
334
+ )`Docs markdown link couldn't be resolved: (url=${brokenMarkdownLink.link}) in path=${brokenMarkdownLink.filePath} for version number=${brokenMarkdownLink.contentPaths.versionName}`;
357
335
  },
358
336
  };
359
337
 
360
338
  function createMDXLoaderRule(): RuleSetRule {
339
+ const contentDirs = versionsMetadata.flatMap(getContentPathList);
361
340
  return {
362
- test: /(\.mdx?)$/,
363
- include: flatten(versionsMetadata.map(getDocsDirPaths))
341
+ test: /\.mdx?$/i,
342
+ include: contentDirs
364
343
  // Trailing slash is important, see https://github.com/facebook/docusaurus/pull/3970
365
344
  .map(addTrailingPathSeparator),
366
- use: compact([
345
+ use: [
367
346
  getJSLoader({isServer}),
368
347
  {
369
348
  loader: require.resolve('@docusaurus/mdx-loader'),
370
349
  options: {
350
+ admonitions: options.admonitions,
371
351
  remarkPlugins,
372
352
  rehypePlugins,
373
353
  beforeDefaultRehypePlugins,
374
354
  beforeDefaultRemarkPlugins,
375
- 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
+ ),
376
363
  metadataPath: (mdxPath: string) => {
377
364
  // Note that metadataPath must be the same/in-sync as
378
365
  // the path from createData for each MDX.
379
366
  const aliasedPath = aliasedSitePath(mdxPath, siteDir);
380
367
  return path.join(dataDir, `${docuHash(aliasedPath)}.json`);
381
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
+ }),
382
378
  },
383
379
  },
384
380
  {
385
381
  loader: path.resolve(__dirname, './markdown/index.js'),
386
382
  options: docsMarkdownOptions,
387
383
  },
388
- ]),
384
+ ].filter(Boolean),
389
385
  };
390
386
  }
391
387
 
package/src/lastUpdate.ts CHANGED
@@ -5,54 +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
-
11
- type FileLastUpdateData = {timestamp?: number; author?: string};
12
-
13
- 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';
14
14
 
15
15
  let showedGitRequirementError = false;
16
+ let showedFileNotTrackedError = false;
16
17
 
17
18
  export async function getFileLastUpdate(
18
- filePath?: string,
19
- ): Promise<FileLastUpdateData | null> {
19
+ filePath: string,
20
+ ): Promise<{timestamp: number; author: string} | null> {
20
21
  if (!filePath) {
21
22
  return null;
22
23
  }
23
- function getTimestampAndAuthor(str: string): FileLastUpdateData | null {
24
- if (!str) {
25
- return null;
26
- }
27
-
28
- const temp = str.match(GIT_COMMIT_TIMESTAMP_AUTHOR_REGEX);
29
- return !temp || temp.length < 3
30
- ? null
31
- : {timestamp: +temp[1], author: temp[2]};
32
- }
33
24
 
34
25
  // Wrap in try/catch in case the shell commands fail
35
26
  // (e.g. project doesn't use Git, etc).
36
27
  try {
37
- 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) {
38
35
  if (!showedGitRequirementError) {
36
+ logger.warn('Sorry, the docs plugin last update options require Git.');
39
37
  showedGitRequirementError = true;
40
- console.warn('Sorry, the docs plugin last update options require Git.');
41
38
  }
42
-
43
- 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);
44
48
  }
45
-
46
- const {stdout} = await execa('git', [
47
- 'log',
48
- '-1',
49
- '--format=%ct, %an',
50
- filePath,
51
- ]);
52
- return getTimestampAndAuthor(stdout);
53
- } catch (error) {
54
- console.error(error);
49
+ return null;
55
50
  }
56
-
57
- return null;
58
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
+ }