@docusaurus/plugin-content-docs 2.0.0-beta.15d451942 → 2.0.0-beta.18

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 (214) hide show
  1. package/lib/categoryGeneratedIndex.d.ts +12 -0
  2. package/lib/categoryGeneratedIndex.js +35 -0
  3. package/lib/cli.d.ts +2 -2
  4. package/lib/cli.js +37 -51
  5. package/lib/client/docsClientUtils.d.ts +6 -26
  6. package/lib/client/docsClientUtils.js +28 -34
  7. package/lib/{theme/hooks/useDocs.d.ts → client/index.d.ts} +4 -3
  8. package/lib/{theme/hooks/useDocs.js → client/index.js} +28 -25
  9. package/lib/docs.d.ts +31 -4
  10. package/lib/docs.js +160 -54
  11. package/{src/__tests__/__fixtures__/simple-site/docusaurus.config.js → lib/frontMatter.d.ts} +4 -8
  12. package/lib/{docFrontMatter.js → frontMatter.js} +13 -6
  13. package/lib/globalData.d.ts +2 -2
  14. package/lib/globalData.js +32 -3
  15. package/lib/index.d.ts +4 -3
  16. package/lib/index.js +123 -136
  17. package/lib/lastUpdate.d.ts +4 -6
  18. package/lib/lastUpdate.js +22 -26
  19. package/lib/markdown/index.d.ts +3 -6
  20. package/lib/markdown/index.js +3 -3
  21. package/lib/markdown/linkify.d.ts +1 -1
  22. package/lib/markdown/linkify.js +7 -3
  23. package/lib/numberPrefix.d.ts +1 -1
  24. package/lib/numberPrefix.js +16 -21
  25. package/lib/options.d.ts +3 -5
  26. package/lib/options.js +55 -19
  27. package/lib/props.d.ts +7 -2
  28. package/lib/props.js +70 -14
  29. package/lib/routes.d.ts +28 -0
  30. package/lib/routes.js +110 -0
  31. package/lib/server-export.d.ts +8 -0
  32. package/lib/server-export.js +23 -0
  33. package/lib/{sidebarItemsGenerator.d.ts → sidebars/generator.d.ts} +1 -6
  34. package/lib/sidebars/generator.js +209 -0
  35. package/lib/sidebars/index.d.ts +13 -0
  36. package/lib/sidebars/index.js +94 -0
  37. package/lib/sidebars/normalization.d.ts +13 -0
  38. package/lib/sidebars/normalization.js +55 -0
  39. package/lib/sidebars/postProcessor.d.ts +8 -0
  40. package/lib/sidebars/postProcessor.js +65 -0
  41. package/lib/sidebars/processor.d.ts +10 -0
  42. package/lib/sidebars/processor.js +79 -0
  43. package/lib/sidebars/types.d.ts +174 -0
  44. package/{src/__tests__/__fixtures__/site-with-autogenerated-sidebar/partialAutogeneratedSidebars2.js → lib/sidebars/types.js} +2 -10
  45. package/lib/sidebars/utils.d.ts +54 -0
  46. package/lib/sidebars/utils.js +255 -0
  47. package/lib/sidebars/validation.d.ts +11 -0
  48. package/lib/sidebars/validation.js +138 -0
  49. package/lib/slug.d.ts +6 -4
  50. package/lib/slug.js +29 -19
  51. package/{src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docusaurus.config.js → lib/tags.d.ts} +2 -8
  52. package/lib/tags.js +21 -0
  53. package/lib/translations.d.ts +2 -2
  54. package/lib/translations.js +89 -49
  55. package/lib/types.d.ts +60 -130
  56. package/lib/versions.d.ts +29 -4
  57. package/lib/versions.js +134 -97
  58. package/package.json +30 -26
  59. package/src/categoryGeneratedIndex.ts +55 -0
  60. package/src/cli.ts +47 -63
  61. package/src/client/docsClientUtils.ts +38 -73
  62. package/src/{theme/hooks/useDocs.ts → client/index.ts} +16 -11
  63. package/{types.d.ts → src/deps.d.ts} +1 -1
  64. package/src/docs.ts +212 -46
  65. package/src/{docFrontMatter.ts → frontMatter.ts} +21 -26
  66. package/src/globalData.ts +53 -3
  67. package/src/index.ts +168 -178
  68. package/src/lastUpdate.ts +26 -33
  69. package/src/markdown/index.ts +10 -16
  70. package/src/markdown/linkify.ts +6 -2
  71. package/src/numberPrefix.ts +19 -26
  72. package/src/options.ts +60 -32
  73. package/src/plugin-content-docs.d.ts +263 -40
  74. package/src/props.ts +105 -21
  75. package/src/routes.ts +185 -0
  76. package/src/server-export.ts +24 -0
  77. package/src/sidebars/README.md +9 -0
  78. package/src/sidebars/generator.ts +292 -0
  79. package/src/sidebars/index.ts +120 -0
  80. package/src/sidebars/normalization.ts +85 -0
  81. package/src/sidebars/postProcessor.ts +89 -0
  82. package/src/sidebars/processor.ts +120 -0
  83. package/src/sidebars/types.ts +274 -0
  84. package/src/sidebars/utils.ts +388 -0
  85. package/src/sidebars/validation.ts +174 -0
  86. package/src/slug.ts +40 -23
  87. package/src/tags.ts +19 -0
  88. package/src/translations.ts +124 -66
  89. package/src/types.ts +67 -187
  90. package/src/versions.ts +205 -110
  91. package/lib/.tsbuildinfo +0 -4717
  92. package/lib/docFrontMatter.d.ts +0 -21
  93. package/lib/sidebarItemsGenerator.js +0 -211
  94. package/lib/sidebars.d.ts +0 -42
  95. package/lib/sidebars.js +0 -309
  96. package/src/__tests__/__fixtures__/bad-id-site/docs/invalid-id.md +0 -5
  97. package/src/__tests__/__fixtures__/bad-slug-on-doc-home-site/docs/docWithSlug.md +0 -5
  98. package/src/__tests__/__fixtures__/empty-site/docusaurus.config.js +0 -16
  99. package/src/__tests__/__fixtures__/empty-site/sidebars.json +0 -1
  100. package/src/__tests__/__fixtures__/sidebars/sidebars-category-shorthand.js +0 -34
  101. package/src/__tests__/__fixtures__/sidebars/sidebars-category-wrong-items.json +0 -11
  102. package/src/__tests__/__fixtures__/sidebars/sidebars-category-wrong-label.json +0 -11
  103. package/src/__tests__/__fixtures__/sidebars/sidebars-category.js +0 -44
  104. package/src/__tests__/__fixtures__/sidebars/sidebars-collapsed-first-level.json +0 -20
  105. package/src/__tests__/__fixtures__/sidebars/sidebars-collapsed.json +0 -21
  106. package/src/__tests__/__fixtures__/sidebars/sidebars-doc-id-not-string.json +0 -10
  107. package/src/__tests__/__fixtures__/sidebars/sidebars-first-level-not-category.js +0 -20
  108. package/src/__tests__/__fixtures__/sidebars/sidebars-link-wrong-href.json +0 -11
  109. package/src/__tests__/__fixtures__/sidebars/sidebars-link-wrong-label.json +0 -11
  110. package/src/__tests__/__fixtures__/sidebars/sidebars-link.json +0 -11
  111. package/src/__tests__/__fixtures__/sidebars/sidebars-unknown-type.json +0 -14
  112. package/src/__tests__/__fixtures__/sidebars/sidebars-wrong-field.json +0 -20
  113. package/src/__tests__/__fixtures__/sidebars/sidebars.json +0 -20
  114. package/src/__tests__/__fixtures__/simple-site/docs/foo/bar.md +0 -69
  115. package/src/__tests__/__fixtures__/simple-site/docs/foo/baz.md +0 -67
  116. package/src/__tests__/__fixtures__/simple-site/docs/headingAsTitle.md +0 -1
  117. package/src/__tests__/__fixtures__/simple-site/docs/hello.md +0 -52
  118. package/src/__tests__/__fixtures__/simple-site/docs/ipsum.md +0 -5
  119. package/src/__tests__/__fixtures__/simple-site/docs/lorem.md +0 -6
  120. package/src/__tests__/__fixtures__/simple-site/docs/rootAbsoluteSlug.md +0 -5
  121. package/src/__tests__/__fixtures__/simple-site/docs/rootRelativeSlug.md +0 -5
  122. package/src/__tests__/__fixtures__/simple-site/docs/rootResolvedSlug.md +0 -5
  123. package/src/__tests__/__fixtures__/simple-site/docs/rootTryToEscapeSlug.md +0 -5
  124. package/src/__tests__/__fixtures__/simple-site/docs/slugs/absoluteSlug.md +0 -5
  125. package/src/__tests__/__fixtures__/simple-site/docs/slugs/relativeSlug.md +0 -5
  126. package/src/__tests__/__fixtures__/simple-site/docs/slugs/resolvedSlug.md +0 -5
  127. package/src/__tests__/__fixtures__/simple-site/docs/slugs/tryToEscapeSlug.md +0 -5
  128. package/src/__tests__/__fixtures__/simple-site/sidebars.json +0 -23
  129. package/src/__tests__/__fixtures__/simple-site/wrong-sidebars.json +0 -7
  130. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/0-getting-started.md +0 -3
  131. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/1-installation.md +0 -3
  132. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/00_api-overview.md +0 -3
  133. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/01_Core APIs/0 --- Client API.md +0 -1
  134. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/01_Core APIs/1 --- Server API.md +0 -1
  135. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/02_Extension APIs/0. Plugin API.md +0 -1
  136. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/02_Extension APIs/1. Theme API.md +0 -1
  137. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/02_Extension APIs/_category_.yml +0 -1
  138. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/03_api-end.md +0 -3
  139. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/3-API/_category_.json +0 -3
  140. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/0-guide2.5.md +0 -8
  141. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/02-guide2.md +0 -7
  142. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/_category_.json +0 -3
  143. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/a-guide4.md +0 -7
  144. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/b-guide5.md +0 -7
  145. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/guide3.md +0 -8
  146. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/docs/Guides/z-guide1.md +0 -8
  147. package/src/__tests__/__fixtures__/site-with-autogenerated-sidebar/partialAutogeneratedSidebars.js +0 -23
  148. package/src/__tests__/__fixtures__/site-with-doc-label/docs/hello-1.md +0 -7
  149. package/src/__tests__/__fixtures__/site-with-doc-label/docs/hello-2.md +0 -8
  150. package/src/__tests__/__fixtures__/site-with-doc-label/docusaurus.config.js +0 -14
  151. package/src/__tests__/__fixtures__/site-with-doc-label/sidebars.json +0 -14
  152. package/src/__tests__/__fixtures__/versioned-site/community/team.md +0 -1
  153. package/src/__tests__/__fixtures__/versioned-site/community_sidebars.json +0 -3
  154. package/src/__tests__/__fixtures__/versioned-site/community_versioned_docs/version-1.0.0/team.md +0 -1
  155. package/src/__tests__/__fixtures__/versioned-site/community_versioned_sidebars/version-1.0.0-sidebars.json +0 -3
  156. package/src/__tests__/__fixtures__/versioned-site/community_versions.json +0 -1
  157. package/src/__tests__/__fixtures__/versioned-site/docs/foo/bar.md +0 -4
  158. package/src/__tests__/__fixtures__/versioned-site/docs/hello.md +0 -1
  159. package/src/__tests__/__fixtures__/versioned-site/docs/slugs/absoluteSlug.md +0 -5
  160. package/src/__tests__/__fixtures__/versioned-site/docs/slugs/relativeSlug.md +0 -5
  161. package/src/__tests__/__fixtures__/versioned-site/docs/slugs/resolvedSlug.md +0 -5
  162. package/src/__tests__/__fixtures__/versioned-site/docs/slugs/tryToEscapeSlug.md +0 -5
  163. package/src/__tests__/__fixtures__/versioned-site/docusaurus.config.js +0 -18
  164. package/src/__tests__/__fixtures__/versioned-site/i18n/en/docusaurus-plugin-content-docs/version-1.0.0/hello.md +0 -1
  165. package/src/__tests__/__fixtures__/versioned-site/i18n/en/docusaurus-plugin-content-docs-community/current/team.md +0 -5
  166. package/src/__tests__/__fixtures__/versioned-site/i18n/fr/docusaurus-plugin-content-docs/version-1.0.0/hello.md +0 -1
  167. package/src/__tests__/__fixtures__/versioned-site/sidebars.json +0 -10
  168. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.0/foo/bar.md +0 -4
  169. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.0/foo/baz.md +0 -1
  170. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.0/hello.md +0 -1
  171. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.1/foo/bar.md +0 -1
  172. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-1.0.1/hello.md +0 -1
  173. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootAbsoluteSlug.md +0 -5
  174. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootRelativeSlug.md +0 -5
  175. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootResolvedSlug.md +0 -5
  176. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/rootTryToEscapeSlug.md +0 -5
  177. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/absoluteSlug.md +0 -5
  178. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/relativeSlug.md +0 -5
  179. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/resolvedSlug.md +0 -5
  180. package/src/__tests__/__fixtures__/versioned-site/versioned_docs/version-withSlugs/slugs/tryToEscapeSlug.md +0 -5
  181. package/src/__tests__/__fixtures__/versioned-site/versioned_sidebars/version-1.0.0-sidebars.json +0 -11
  182. package/src/__tests__/__fixtures__/versioned-site/versioned_sidebars/version-1.0.1-sidebars.json +0 -10
  183. package/src/__tests__/__fixtures__/versioned-site/versioned_sidebars/version-withSlugs-sidebars.json +0 -5
  184. package/src/__tests__/__fixtures__/versioned-site/versions.json +0 -5
  185. package/src/__tests__/__snapshots__/cli.test.ts.snap +0 -90
  186. package/src/__tests__/__snapshots__/index.test.ts.snap +0 -1907
  187. package/src/__tests__/__snapshots__/sidebars.test.ts.snap +0 -218
  188. package/src/__tests__/__snapshots__/translations.test.ts.snap +0 -487
  189. package/src/__tests__/cli.test.ts +0 -333
  190. package/src/__tests__/docFrontMatter.test.ts +0 -204
  191. package/src/__tests__/docs.test.ts +0 -875
  192. package/src/__tests__/index.test.ts +0 -1831
  193. package/src/__tests__/lastUpdate.test.ts +0 -68
  194. package/src/__tests__/numberPrefix.test.ts +0 -199
  195. package/src/__tests__/options.test.ts +0 -232
  196. package/src/__tests__/sidebarItemsGenerator.test.ts +0 -336
  197. package/src/__tests__/sidebars.test.ts +0 -638
  198. package/src/__tests__/slug.test.ts +0 -109
  199. package/src/__tests__/translations.test.ts +0 -159
  200. package/src/__tests__/versions.test.ts +0 -718
  201. package/src/client/__tests__/docsClientUtils.test.ts +0 -372
  202. package/src/markdown/__tests__/__fixtures__/docs/doc-localized.md +0 -1
  203. package/src/markdown/__tests__/__fixtures__/docs/doc1.md +0 -13
  204. package/src/markdown/__tests__/__fixtures__/docs/doc2.md +0 -12
  205. package/src/markdown/__tests__/__fixtures__/docs/doc4.md +0 -19
  206. package/src/markdown/__tests__/__fixtures__/docs/doc5.md +0 -6
  207. package/src/markdown/__tests__/__fixtures__/docs/subdir/doc3.md +0 -3
  208. package/src/markdown/__tests__/__fixtures__/versioned_docs/version-1.0.0/doc2.md +0 -7
  209. package/src/markdown/__tests__/__fixtures__/versioned_docs/version-1.0.0/subdir/doc1.md +0 -3
  210. package/src/markdown/__tests__/__snapshots__/linkify.test.ts.snap +0 -82
  211. package/src/markdown/__tests__/linkify.test.ts +0 -190
  212. package/src/sidebarItemsGenerator.ts +0 -307
  213. package/src/sidebars.ts +0 -489
  214. package/tsconfig.json +0 -9
package/lib/docs.js CHANGED
@@ -6,24 +6,25 @@
6
6
  * LICENSE file in the root directory of this source tree.
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.processDocMetadata = exports.readVersionDocs = exports.readDocFile = void 0;
9
+ exports.createDocsByIdIndex = exports.getDocIds = exports.toCategoryIndexMatcherParam = exports.isCategoryIndex = exports.getMainDocId = exports.addDocNavigation = exports.processDocMetadata = exports.readVersionDocs = exports.readDocFile = void 0;
10
10
  const tslib_1 = require("tslib");
11
11
  const path_1 = tslib_1.__importDefault(require("path"));
12
12
  const fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
13
+ const logger_1 = tslib_1.__importDefault(require("@docusaurus/logger"));
13
14
  const utils_1 = require("@docusaurus/utils");
14
15
  const lastUpdate_1 = require("./lastUpdate");
15
16
  const slug_1 = tslib_1.__importDefault(require("./slug"));
16
17
  const constants_1 = require("./constants");
17
- const globby_1 = tslib_1.__importDefault(require("globby"));
18
18
  const versions_1 = require("./versions");
19
19
  const numberPrefix_1 = require("./numberPrefix");
20
- const docFrontMatter_1 = require("./docFrontMatter");
20
+ const frontMatter_1 = require("./frontMatter");
21
+ const utils_2 = require("./sidebars/utils");
21
22
  async function readLastUpdateData(filePath, options) {
22
23
  const { showLastUpdateAuthor, showLastUpdateTime } = options;
23
24
  if (showLastUpdateAuthor || showLastUpdateTime) {
24
25
  // Use fake data in dev for faster development.
25
26
  const fileLastUpdateData = process.env.NODE_ENV === 'production'
26
- ? await lastUpdate_1.getFileLastUpdate(filePath)
27
+ ? await (0, lastUpdate_1.getFileLastUpdate)(filePath)
27
28
  : {
28
29
  author: 'Author',
29
30
  timestamp: 1539502055,
@@ -39,7 +40,7 @@ async function readLastUpdateData(filePath, options) {
39
40
  return {};
40
41
  }
41
42
  async function readDocFile(versionMetadata, source, options) {
42
- const contentPath = await utils_1.getFolderContainingFile(versions_1.getDocsDirPaths(versionMetadata), source);
43
+ const contentPath = await (0, utils_1.getFolderContainingFile)((0, versions_1.getDocsDirPaths)(versionMetadata), source);
43
44
  const filePath = path_1.default.join(contentPath, source);
44
45
  const [content, lastUpdate] = await Promise.all([
45
46
  fs_extra_1.default.readFile(filePath, 'utf-8'),
@@ -49,38 +50,39 @@ async function readDocFile(versionMetadata, source, options) {
49
50
  }
50
51
  exports.readDocFile = readDocFile;
51
52
  async function readVersionDocs(versionMetadata, options) {
52
- const sources = await globby_1.default(options.include, {
53
+ const sources = await (0, utils_1.Globby)(options.include, {
53
54
  cwd: versionMetadata.contentPath,
55
+ ignore: options.exclude,
54
56
  });
55
57
  return Promise.all(sources.map((source) => readDocFile(versionMetadata, source, options)));
56
58
  }
57
59
  exports.readVersionDocs = readVersionDocs;
58
- function processDocMetadata({ docFile, versionMetadata, context, options, }) {
59
- var _a, _b, _c, _d, _e;
60
+ function doProcessDocMetadata({ docFile, versionMetadata, context, options, }) {
60
61
  const { source, content, lastUpdate, contentPath, filePath } = docFile;
61
- const { homePageId } = options;
62
62
  const { siteDir, i18n } = context;
63
- const { frontMatter: unsafeFrontMatter, contentTitle, excerpt, } = utils_1.parseMarkdownString(content);
64
- const frontMatter = docFrontMatter_1.validateDocFrontMatter(unsafeFrontMatter);
65
- const { sidebar_label: sidebarLabel, custom_edit_url: customEditURL,
66
- // Strip number prefixes by default (01-MyFolder/01-MyDoc.md => MyFolder/MyDoc) by default,
67
- // but allow to disable this behavior with frontmatterr
68
- parse_number_prefixes = true, } = frontMatter;
63
+ const { frontMatter: unsafeFrontMatter, contentTitle, excerpt, } = (0, utils_1.parseMarkdownString)(content);
64
+ const frontMatter = (0, frontMatter_1.validateDocFrontMatter)(unsafeFrontMatter);
65
+ const { custom_edit_url: customEditURL,
66
+ // Strip number prefixes by default
67
+ // (01-MyFolder/01-MyDoc.md => MyFolder/MyDoc)
68
+ // but allow to disable this behavior with front matter
69
+ parse_number_prefixes: parseNumberPrefixes = true, } = frontMatter;
69
70
  // ex: api/plugins/myDoc -> myDoc
70
71
  // ex: myDoc -> myDoc
71
72
  const sourceFileNameWithoutExtension = path_1.default.basename(source, path_1.default.extname(source));
72
73
  // ex: api/plugins/myDoc -> api/plugins
73
74
  // ex: myDoc -> .
74
75
  const sourceDirName = path_1.default.dirname(source);
75
- const { filename: unprefixedFileName, numberPrefix } = parse_number_prefixes
76
+ const { filename: unprefixedFileName, numberPrefix } = parseNumberPrefixes
76
77
  ? options.numberPrefixParser(sourceFileNameWithoutExtension)
77
78
  : { filename: sourceFileNameWithoutExtension, numberPrefix: undefined };
78
- const baseID = (_a = frontMatter.id) !== null && _a !== void 0 ? _a : unprefixedFileName;
79
+ const baseID = frontMatter.id ?? unprefixedFileName;
79
80
  if (baseID.includes('/')) {
80
- throw new Error(`Document id [${baseID}] cannot include "/".`);
81
+ throw new Error(`Document id "${baseID}" cannot include slash.`);
81
82
  }
82
- // For autogenerated sidebars, sidebar position can come from filename number prefix or frontmatter
83
- const sidebarPosition = (_b = frontMatter.sidebar_position) !== null && _b !== void 0 ? _b : numberPrefix;
83
+ // For autogenerated sidebars, sidebar position can come from filename number
84
+ // prefix or front matter
85
+ const sidebarPosition = frontMatter.sidebar_position ?? numberPrefix;
84
86
  // TODO legacy retrocompatibility
85
87
  // The same doc in 2 distinct version could keep the same id,
86
88
  // we just need to namespace the data by version
@@ -88,14 +90,14 @@ function processDocMetadata({ docFile, versionMetadata, context, options, }) {
88
90
  ? undefined
89
91
  : `version-${versionMetadata.versionName}`;
90
92
  // TODO legacy retrocompatibility
91
- // I think it's bad to affect the frontmatter id with the dirname?
93
+ // I think it's bad to affect the front matter id with the dirname?
92
94
  function computeDirNameIdPrefix() {
93
95
  if (sourceDirName === '.') {
94
96
  return undefined;
95
97
  }
96
98
  // Eventually remove the number prefixes from intermediate directories
97
- return parse_number_prefixes
98
- ? numberPrefix_1.stripPathNumberPrefixes(sourceDirName, options.numberPrefixParser)
99
+ return parseNumberPrefixes
100
+ ? (0, numberPrefix_1.stripPathNumberPrefixes)(sourceDirName, options.numberPrefixParser)
99
101
  : sourceDirName;
100
102
  }
101
103
  const unversionedId = [computeDirNameIdPrefix(), baseID]
@@ -104,34 +106,27 @@ function processDocMetadata({ docFile, versionMetadata, context, options, }) {
104
106
  // TODO is versioning the id very useful in practice?
105
107
  // legacy versioned id, requires a breaking change to modify this
106
108
  const id = [versionIdPrefix, unversionedId].filter(Boolean).join('/');
107
- // TODO remove soon, deprecated homePageId
108
- const isDocsHomePage = unversionedId === (homePageId !== null && homePageId !== void 0 ? homePageId : '_index');
109
- if (frontMatter.slug && isDocsHomePage) {
110
- throw new Error(`The docs homepage (homePageId=${homePageId}) is not allowed to have a frontmatter slug=${frontMatter.slug} => you have to choose either homePageId or slug, not both`);
111
- }
112
- const docSlug = isDocsHomePage
113
- ? '/'
114
- : slug_1.default({
115
- baseID,
116
- dirName: sourceDirName,
117
- frontmatterSlug: frontMatter.slug,
118
- stripDirNumberPrefixes: parse_number_prefixes,
119
- numberPrefixParser: options.numberPrefixParser,
120
- });
121
- // TODO expose both headingTitle+metaTitle to theme?
122
- // Different fallbacks order on purpose!
123
- // See https://github.com/facebook/docusaurus/issues/4665#issuecomment-825831367
124
- const headingTitle = (_c = contentTitle !== null && contentTitle !== void 0 ? contentTitle : frontMatter.title) !== null && _c !== void 0 ? _c : baseID;
125
- // const metaTitle: string = frontMatter.title ?? contentTitle ?? baseID;
126
- const description = (_e = (_d = frontMatter.description) !== null && _d !== void 0 ? _d : excerpt) !== null && _e !== void 0 ? _e : '';
127
- const permalink = utils_1.normalizeUrl([versionMetadata.versionPath, docSlug]);
109
+ const docSlug = (0, slug_1.default)({
110
+ baseID,
111
+ source,
112
+ sourceDirName,
113
+ frontMatterSlug: frontMatter.slug,
114
+ stripDirNumberPrefixes: parseNumberPrefixes,
115
+ numberPrefixParser: options.numberPrefixParser,
116
+ });
117
+ // Note: the title is used by default for page title, sidebar label,
118
+ // pagination buttons... frontMatter.title should be used in priority over
119
+ // contentTitle (because it can contain markdown/JSX syntax)
120
+ const title = frontMatter.title ?? contentTitle ?? baseID;
121
+ const description = frontMatter.description ?? excerpt ?? '';
122
+ const permalink = (0, utils_1.normalizeUrl)([versionMetadata.versionPath, docSlug]);
128
123
  function getDocEditUrl() {
129
124
  const relativeFilePath = path_1.default.relative(contentPath, filePath);
130
125
  if (typeof options.editUrl === 'function') {
131
126
  return options.editUrl({
132
127
  version: versionMetadata.versionName,
133
- versionDocsDirPath: utils_1.posixPath(path_1.default.relative(siteDir, versionMetadata.contentPath)),
134
- docPath: utils_1.posixPath(relativeFilePath),
128
+ versionDocsDirPath: (0, utils_1.posixPath)(path_1.default.relative(siteDir, versionMetadata.contentPath)),
129
+ docPath: (0, utils_1.posixPath)(relativeFilePath),
135
130
  permalink,
136
131
  locale: context.i18n.currentLocale,
137
132
  });
@@ -141,11 +136,9 @@ function processDocMetadata({ docFile, versionMetadata, context, options, }) {
141
136
  const baseVersionEditUrl = isLocalized && options.editLocalizedFiles
142
137
  ? versionMetadata.versionEditUrlLocalized
143
138
  : versionMetadata.versionEditUrl;
144
- return utils_1.getEditUrl(relativeFilePath, baseVersionEditUrl);
145
- }
146
- else {
147
- return undefined;
139
+ return (0, utils_1.getEditUrl)(relativeFilePath, baseVersionEditUrl);
148
140
  }
141
+ return undefined;
149
142
  }
150
143
  // Assign all of object properties during instantiation (if possible) for
151
144
  // NodeJS optimization.
@@ -154,23 +147,136 @@ function processDocMetadata({ docFile, versionMetadata, context, options, }) {
154
147
  return {
155
148
  unversionedId,
156
149
  id,
157
- isDocsHomePage,
158
- title: headingTitle,
150
+ title,
159
151
  description,
160
- source: utils_1.aliasedSitePath(filePath, siteDir),
152
+ source: (0, utils_1.aliasedSitePath)(filePath, siteDir),
161
153
  sourceDirName,
162
154
  slug: docSlug,
163
155
  permalink,
164
156
  editUrl: customEditURL !== undefined ? customEditURL : getDocEditUrl(),
157
+ tags: (0, utils_1.normalizeFrontMatterTags)(versionMetadata.tagsPath, frontMatter.tags),
165
158
  version: versionMetadata.versionName,
166
159
  lastUpdatedBy: lastUpdate.lastUpdatedBy,
167
160
  lastUpdatedAt: lastUpdate.lastUpdatedAt,
168
161
  formattedLastUpdatedAt: lastUpdate.lastUpdatedAt
169
162
  ? new Intl.DateTimeFormat(i18n.currentLocale).format(lastUpdate.lastUpdatedAt * 1000)
170
163
  : undefined,
171
- sidebar_label: sidebarLabel,
172
164
  sidebarPosition,
173
165
  frontMatter,
174
166
  };
175
167
  }
168
+ function processDocMetadata(args) {
169
+ try {
170
+ return doProcessDocMetadata(args);
171
+ }
172
+ catch (err) {
173
+ logger_1.default.error `Can't process doc metadata for doc at path path=${args.docFile.filePath} in version name=${args.versionMetadata.versionName}`;
174
+ throw err;
175
+ }
176
+ }
176
177
  exports.processDocMetadata = processDocMetadata;
178
+ function addDocNavigation(docsBase, sidebarsUtils, sidebarFilePath) {
179
+ const docsById = createDocsByIdIndex(docsBase);
180
+ sidebarsUtils.checkSidebarsDocIds(docsBase.flatMap(getDocIds), sidebarFilePath);
181
+ // Add sidebar/next/previous to the docs
182
+ function addNavData(doc) {
183
+ const navigation = sidebarsUtils.getDocNavigation(doc.unversionedId, doc.id, doc.frontMatter.displayed_sidebar);
184
+ const toNavigationLinkByDocId = (docId, type) => {
185
+ if (!docId) {
186
+ return undefined;
187
+ }
188
+ const navDoc = docsById[docId];
189
+ if (!navDoc) {
190
+ // This could only happen if user provided the ID through front matter
191
+ throw new Error(`Error when loading ${doc.id} in ${doc.sourceDirName}: the pagination_${type} front matter points to a non-existent ID ${docId}.`);
192
+ }
193
+ return (0, utils_2.toDocNavigationLink)(navDoc);
194
+ };
195
+ const previous = doc.frontMatter.pagination_prev !== undefined
196
+ ? toNavigationLinkByDocId(doc.frontMatter.pagination_prev, 'prev')
197
+ : (0, utils_2.toNavigationLink)(navigation.previous, docsById);
198
+ const next = doc.frontMatter.pagination_next !== undefined
199
+ ? toNavigationLinkByDocId(doc.frontMatter.pagination_next, 'next')
200
+ : (0, utils_2.toNavigationLink)(navigation.next, docsById);
201
+ return { ...doc, sidebar: navigation.sidebarName, previous, next };
202
+ }
203
+ const docsWithNavigation = docsBase.map(addNavData);
204
+ // sort to ensure consistent output for tests
205
+ docsWithNavigation.sort((a, b) => a.id.localeCompare(b.id));
206
+ return docsWithNavigation;
207
+ }
208
+ exports.addDocNavigation = addDocNavigation;
209
+ /**
210
+ * The "main doc" is the "version entry point"
211
+ * We browse this doc by clicking on a version:
212
+ * - the "home" doc (at '/docs/')
213
+ * - the first doc of the first sidebar
214
+ * - a random doc (if no docs are in any sidebar... edge case)
215
+ */
216
+ function getMainDocId({ docs, sidebarsUtils, }) {
217
+ function getMainDoc() {
218
+ const versionHomeDoc = docs.find((doc) => doc.slug === '/');
219
+ const firstDocIdOfFirstSidebar = sidebarsUtils.getFirstDocIdOfFirstSidebar();
220
+ if (versionHomeDoc) {
221
+ return versionHomeDoc;
222
+ }
223
+ else if (firstDocIdOfFirstSidebar) {
224
+ return docs.find((doc) => doc.id === firstDocIdOfFirstSidebar ||
225
+ doc.unversionedId === firstDocIdOfFirstSidebar);
226
+ }
227
+ return docs[0];
228
+ }
229
+ return getMainDoc().unversionedId;
230
+ }
231
+ exports.getMainDocId = getMainDocId;
232
+ // By convention, Docusaurus considers some docs are "indexes":
233
+ // - index.md
234
+ // - readme.md
235
+ // - <folder>/<folder>.md
236
+ //
237
+ // This function is the default implementation of this convention
238
+ //
239
+ // Those index docs produce a different behavior
240
+ // - Slugs do not end with a weird "/index" suffix
241
+ // - Auto-generated sidebar categories link to them as intro
242
+ const isCategoryIndex = ({ fileName, directories, }) => {
243
+ const eligibleDocIndexNames = [
244
+ 'index',
245
+ 'readme',
246
+ directories[0]?.toLowerCase(),
247
+ ];
248
+ return eligibleDocIndexNames.includes(fileName.toLowerCase());
249
+ };
250
+ exports.isCategoryIndex = isCategoryIndex;
251
+ /**
252
+ * `guides/sidebar/autogenerated.md` ->
253
+ * `'autogenerated', '.md', ['sidebar', 'guides']`
254
+ */
255
+ function toCategoryIndexMatcherParam({ source, sourceDirName, }) {
256
+ // source + sourceDirName are always posix-style
257
+ return {
258
+ fileName: path_1.default.posix.parse(source).name,
259
+ extension: path_1.default.posix.parse(source).ext,
260
+ directories: sourceDirName.split(path_1.default.posix.sep).reverse(),
261
+ };
262
+ }
263
+ exports.toCategoryIndexMatcherParam = toCategoryIndexMatcherParam;
264
+ // Return both doc ids
265
+ // TODO legacy retro-compatibility due to old versioned sidebars using
266
+ // versioned doc ids ("id" should be removed & "versionedId" should be renamed
267
+ // to "id")
268
+ function getDocIds(doc) {
269
+ return [doc.unversionedId, doc.id];
270
+ }
271
+ exports.getDocIds = getDocIds;
272
+ // docs are indexed by both versioned and unversioned ids at the same time
273
+ // TODO legacy retro-compatibility due to old versioned sidebars using
274
+ // versioned doc ids ("id" should be removed & "versionedId" should be renamed
275
+ // to "id")
276
+ function createDocsByIdIndex(docs) {
277
+ return Object.fromEntries(docs.flatMap((doc) => [
278
+ [doc.unversionedId, doc],
279
+ [doc.id, doc],
280
+ ]));
281
+ }
282
+ exports.createDocsByIdIndex = createDocsByIdIndex;
@@ -4,11 +4,7 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
-
8
- module.exports = {
9
- title: 'My Site',
10
- tagline: 'The tagline of my site',
11
- url: 'https://your-docusaurus-test-site.com',
12
- baseUrl: '/',
13
- favicon: 'img/favicon.ico',
14
- };
7
+ import type { DocFrontMatter } from './types';
8
+ export declare function validateDocFrontMatter(frontMatter: {
9
+ [key: string]: unknown;
10
+ }): DocFrontMatter;
@@ -7,10 +7,9 @@
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.validateDocFrontMatter = void 0;
10
- /* eslint-disable camelcase */
11
10
  const utils_validation_1 = require("@docusaurus/utils-validation");
12
11
  // NOTE: we don't add any default value on purpose here
13
- // We don't want default values to magically appear in doc metadatas and props
12
+ // We don't want default values to magically appear in doc metadata and props
14
13
  // While the user did not provide those values explicitly
15
14
  // We use default values in code instead
16
15
  const DocFrontMatterSchema = utils_validation_1.JoiFrontMatter.object({
@@ -19,15 +18,23 @@ const DocFrontMatterSchema = utils_validation_1.JoiFrontMatter.object({
19
18
  hide_title: utils_validation_1.JoiFrontMatter.boolean(),
20
19
  hide_table_of_contents: utils_validation_1.JoiFrontMatter.boolean(),
21
20
  keywords: utils_validation_1.JoiFrontMatter.array().items(utils_validation_1.JoiFrontMatter.string().required()),
22
- image: utils_validation_1.JoiFrontMatter.string().uri({ allowRelative: false }),
21
+ image: utils_validation_1.URISchema,
23
22
  description: utils_validation_1.JoiFrontMatter.string().allow(''),
24
23
  slug: utils_validation_1.JoiFrontMatter.string(),
25
24
  sidebar_label: utils_validation_1.JoiFrontMatter.string(),
26
- sidebar_position: utils_validation_1.JoiFrontMatter.number().min(0),
27
- custom_edit_url: utils_validation_1.JoiFrontMatter.string().uri({ allowRelative: true }).allow('', null),
25
+ sidebar_position: utils_validation_1.JoiFrontMatter.number(),
26
+ sidebar_class_name: utils_validation_1.JoiFrontMatter.string(),
27
+ sidebar_custom_props: utils_validation_1.JoiFrontMatter.object().unknown(),
28
+ displayed_sidebar: utils_validation_1.JoiFrontMatter.string().allow(null),
29
+ tags: utils_validation_1.FrontMatterTagsSchema,
30
+ pagination_label: utils_validation_1.JoiFrontMatter.string(),
31
+ custom_edit_url: utils_validation_1.URISchema.allow('', null),
28
32
  parse_number_prefixes: utils_validation_1.JoiFrontMatter.boolean(),
33
+ pagination_next: utils_validation_1.JoiFrontMatter.string().allow(null),
34
+ pagination_prev: utils_validation_1.JoiFrontMatter.string().allow(null),
35
+ ...utils_validation_1.FrontMatterTOCHeadingLevels,
29
36
  }).unknown();
30
37
  function validateDocFrontMatter(frontMatter) {
31
- return utils_validation_1.validateFrontMatter(frontMatter, DocFrontMatterSchema);
38
+ return (0, utils_validation_1.validateFrontMatter)(frontMatter, DocFrontMatterSchema);
32
39
  }
33
40
  exports.validateDocFrontMatter = validateDocFrontMatter;
@@ -4,6 +4,6 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
- import { DocMetadata, GlobalDoc, LoadedVersion, GlobalVersion } from './types';
8
- export declare function toGlobalDataDoc(doc: DocMetadata): GlobalDoc;
7
+ import type { LoadedVersion } from './types';
8
+ import type { GlobalVersion } from '@docusaurus/plugin-content-docs/client';
9
9
  export declare function toGlobalDataVersion(version: LoadedVersion): GlobalVersion;
package/lib/globalData.js CHANGED
@@ -6,7 +6,10 @@
6
6
  * LICENSE file in the root directory of this source tree.
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.toGlobalDataVersion = exports.toGlobalDataDoc = void 0;
9
+ exports.toGlobalDataVersion = void 0;
10
+ const tslib_1 = require("tslib");
11
+ const lodash_1 = tslib_1.__importDefault(require("lodash"));
12
+ const utils_1 = require("./sidebars/utils");
10
13
  function toGlobalDataDoc(doc) {
11
14
  return {
12
15
  id: doc.unversionedId,
@@ -14,7 +17,30 @@ function toGlobalDataDoc(doc) {
14
17
  sidebar: doc.sidebar,
15
18
  };
16
19
  }
17
- exports.toGlobalDataDoc = toGlobalDataDoc;
20
+ function toGlobalDataGeneratedIndex(doc) {
21
+ return {
22
+ id: doc.slug,
23
+ path: doc.permalink,
24
+ sidebar: doc.sidebar,
25
+ };
26
+ }
27
+ function toGlobalSidebars(sidebars, version) {
28
+ const { getFirstLink } = (0, utils_1.createSidebarsUtils)(sidebars);
29
+ return lodash_1.default.mapValues(sidebars, (sidebar, sidebarId) => {
30
+ const firstLink = getFirstLink(sidebarId);
31
+ if (!firstLink) {
32
+ return {};
33
+ }
34
+ return {
35
+ link: {
36
+ path: firstLink.type === 'generated-index'
37
+ ? firstLink.permalink
38
+ : version.docs.find((doc) => doc.id === firstLink.id || doc.unversionedId === firstLink.id).permalink,
39
+ label: firstLink.label,
40
+ },
41
+ };
42
+ });
43
+ }
18
44
  function toGlobalDataVersion(version) {
19
45
  return {
20
46
  name: version.versionName,
@@ -22,7 +48,10 @@ function toGlobalDataVersion(version) {
22
48
  isLast: version.isLast,
23
49
  path: version.versionPath,
24
50
  mainDocId: version.mainDocId,
25
- docs: version.docs.map(toGlobalDataDoc),
51
+ docs: version.docs
52
+ .map(toGlobalDataDoc)
53
+ .concat(version.categoryGeneratedIndices.map(toGlobalDataGeneratedIndex)),
54
+ sidebars: toGlobalSidebars(version.sidebars, version),
26
55
  };
27
56
  }
28
57
  exports.toGlobalDataVersion = toGlobalDataVersion;
package/lib/index.d.ts CHANGED
@@ -4,7 +4,8 @@
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
- import { LoadContext, Plugin } from '@docusaurus/types';
8
- import { PluginOptions, LoadedContent } from './types';
9
- export default function pluginContentDocs(context: LoadContext, options: PluginOptions): Plugin<LoadedContent>;
7
+ import type { LoadContext, Plugin } from '@docusaurus/types';
8
+ import type { LoadedContent } from './types';
9
+ import type { PluginOptions } from '@docusaurus/plugin-content-docs';
10
+ export default function pluginContentDocs(context: LoadContext, options: PluginOptions): Promise<Plugin<LoadedContent>>;
10
11
  export { validateOptions } from './options';