@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/lib/docs.js CHANGED
@@ -6,84 +6,93 @@
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
- const versions_1 = require("./versions");
19
18
  const numberPrefix_1 = require("./numberPrefix");
20
- const docFrontMatter_1 = require("./docFrontMatter");
21
- const chalk_1 = tslib_1.__importDefault(require("chalk"));
22
- async function readLastUpdateData(filePath, options) {
19
+ const frontMatter_1 = require("./frontMatter");
20
+ const utils_2 = require("./sidebars/utils");
21
+ async function readLastUpdateData(filePath, options, lastUpdateFrontMatter) {
23
22
  const { showLastUpdateAuthor, showLastUpdateTime } = options;
24
23
  if (showLastUpdateAuthor || showLastUpdateTime) {
24
+ const frontMatterTimestamp = lastUpdateFrontMatter?.date
25
+ ? new Date(lastUpdateFrontMatter.date).getTime() / 1000
26
+ : undefined;
27
+ if (lastUpdateFrontMatter?.author && lastUpdateFrontMatter.date) {
28
+ return {
29
+ lastUpdatedAt: frontMatterTimestamp,
30
+ lastUpdatedBy: lastUpdateFrontMatter.author,
31
+ };
32
+ }
25
33
  // Use fake data in dev for faster development.
26
34
  const fileLastUpdateData = process.env.NODE_ENV === 'production'
27
- ? await lastUpdate_1.getFileLastUpdate(filePath)
35
+ ? await (0, lastUpdate_1.getFileLastUpdate)(filePath)
28
36
  : {
29
37
  author: 'Author',
30
38
  timestamp: 1539502055,
31
39
  };
32
- if (fileLastUpdateData) {
33
- const { author, timestamp } = fileLastUpdateData;
34
- return {
35
- lastUpdatedAt: showLastUpdateTime ? timestamp : undefined,
36
- lastUpdatedBy: showLastUpdateAuthor ? author : undefined,
37
- };
38
- }
40
+ const { author, timestamp } = fileLastUpdateData ?? {};
41
+ return {
42
+ lastUpdatedBy: showLastUpdateAuthor
43
+ ? lastUpdateFrontMatter?.author ?? author
44
+ : undefined,
45
+ lastUpdatedAt: showLastUpdateTime
46
+ ? frontMatterTimestamp ?? timestamp
47
+ : undefined,
48
+ };
39
49
  }
40
50
  return {};
41
51
  }
42
- async function readDocFile(versionMetadata, source, options) {
43
- const contentPath = await utils_1.getFolderContainingFile(versions_1.getDocsDirPaths(versionMetadata), source);
52
+ async function readDocFile(versionMetadata, source) {
53
+ const contentPath = await (0, utils_1.getFolderContainingFile)((0, utils_1.getContentPathList)(versionMetadata), source);
44
54
  const filePath = path_1.default.join(contentPath, source);
45
- const [content, lastUpdate] = await Promise.all([
46
- fs_extra_1.default.readFile(filePath, 'utf-8'),
47
- readLastUpdateData(filePath, options),
48
- ]);
49
- return { source, content, lastUpdate, contentPath, filePath };
55
+ const content = await fs_extra_1.default.readFile(filePath, 'utf-8');
56
+ return { source, content, contentPath, filePath };
50
57
  }
51
58
  exports.readDocFile = readDocFile;
52
59
  async function readVersionDocs(versionMetadata, options) {
53
- const sources = await globby_1.default(options.include, {
60
+ const sources = await (0, utils_1.Globby)(options.include, {
54
61
  cwd: versionMetadata.contentPath,
62
+ ignore: options.exclude,
55
63
  });
56
- return Promise.all(sources.map((source) => readDocFile(versionMetadata, source, options)));
64
+ return Promise.all(sources.map((source) => readDocFile(versionMetadata, source)));
57
65
  }
58
66
  exports.readVersionDocs = readVersionDocs;
59
- function doProcessDocMetadata({ docFile, versionMetadata, context, options, }) {
60
- var _a, _b, _c, _d, _e, _f;
61
- const { source, content, lastUpdate, contentPath, filePath } = docFile;
62
- const { homePageId } = options;
67
+ /** Docs with draft front matter are only considered draft in production. */
68
+ function isDraftForEnvironment({ env, frontMatter, }) {
69
+ return (env === 'production' && frontMatter.draft) ?? false;
70
+ }
71
+ async function doProcessDocMetadata({ docFile, versionMetadata, context, options, env, }) {
72
+ const { source, content, contentPath, filePath } = docFile;
63
73
  const { siteDir, i18n } = context;
64
- const { frontMatter: unsafeFrontMatter, contentTitle, excerpt, } = utils_1.parseMarkdownString(content);
65
- const frontMatter = docFrontMatter_1.validateDocFrontMatter(unsafeFrontMatter);
74
+ const { frontMatter: unsafeFrontMatter, contentTitle, excerpt, } = (0, utils_1.parseMarkdownString)(content);
75
+ const frontMatter = (0, frontMatter_1.validateDocFrontMatter)(unsafeFrontMatter);
66
76
  const { custom_edit_url: customEditURL,
67
- // Strip number prefixes by default (01-MyFolder/01-MyDoc.md => MyFolder/MyDoc) by default,
68
- // but allow to disable this behavior with frontmatterr
69
- // eslint-disable-next-line camelcase
70
- parse_number_prefixes = true, } = frontMatter;
71
- // ex: api/plugins/myDoc -> myDoc
72
- // ex: myDoc -> myDoc
77
+ // Strip number prefixes by default
78
+ // (01-MyFolder/01-MyDoc.md => MyFolder/MyDoc)
79
+ // but allow to disable this behavior with front matter
80
+ parse_number_prefixes: parseNumberPrefixes = true, last_update: lastUpdateFrontMatter, } = frontMatter;
81
+ const lastUpdate = await readLastUpdateData(filePath, options, lastUpdateFrontMatter);
82
+ // E.g. api/plugins/myDoc -> myDoc; myDoc -> myDoc
73
83
  const sourceFileNameWithoutExtension = path_1.default.basename(source, path_1.default.extname(source));
74
- // ex: api/plugins/myDoc -> api/plugins
75
- // ex: myDoc -> .
84
+ // E.g. api/plugins/myDoc -> api/plugins; myDoc -> .
76
85
  const sourceDirName = path_1.default.dirname(source);
77
- // eslint-disable-next-line camelcase
78
- const { filename: unprefixedFileName, numberPrefix } = parse_number_prefixes
86
+ const { filename: unprefixedFileName, numberPrefix } = parseNumberPrefixes
79
87
  ? options.numberPrefixParser(sourceFileNameWithoutExtension)
80
88
  : { filename: sourceFileNameWithoutExtension, numberPrefix: undefined };
81
- const baseID = (_a = frontMatter.id) !== null && _a !== void 0 ? _a : unprefixedFileName;
89
+ const baseID = frontMatter.id ?? unprefixedFileName;
82
90
  if (baseID.includes('/')) {
83
91
  throw new Error(`Document id "${baseID}" cannot include slash.`);
84
92
  }
85
- // For autogenerated sidebars, sidebar position can come from filename number prefix or frontmatter
86
- const sidebarPosition = (_b = frontMatter.sidebar_position) !== null && _b !== void 0 ? _b : numberPrefix;
93
+ // For autogenerated sidebars, sidebar position can come from filename number
94
+ // prefix or front matter
95
+ const sidebarPosition = frontMatter.sidebar_position ?? numberPrefix;
87
96
  // TODO legacy retrocompatibility
88
97
  // The same doc in 2 distinct version could keep the same id,
89
98
  // we just need to namespace the data by version
@@ -91,15 +100,14 @@ function doProcessDocMetadata({ docFile, versionMetadata, context, options, }) {
91
100
  ? undefined
92
101
  : `version-${versionMetadata.versionName}`;
93
102
  // TODO legacy retrocompatibility
94
- // I think it's bad to affect the frontmatter id with the dirname?
103
+ // I think it's bad to affect the front matter id with the dirname?
95
104
  function computeDirNameIdPrefix() {
96
105
  if (sourceDirName === '.') {
97
106
  return undefined;
98
107
  }
99
108
  // Eventually remove the number prefixes from intermediate directories
100
- // eslint-disable-next-line camelcase
101
- return parse_number_prefixes
102
- ? numberPrefix_1.stripPathNumberPrefixes(sourceDirName, options.numberPrefixParser)
109
+ return parseNumberPrefixes
110
+ ? (0, numberPrefix_1.stripPathNumberPrefixes)(sourceDirName, options.numberPrefixParser)
103
111
  : sourceDirName;
104
112
  }
105
113
  const unversionedId = [computeDirNameIdPrefix(), baseID]
@@ -108,32 +116,27 @@ function doProcessDocMetadata({ docFile, versionMetadata, context, options, }) {
108
116
  // TODO is versioning the id very useful in practice?
109
117
  // legacy versioned id, requires a breaking change to modify this
110
118
  const id = [versionIdPrefix, unversionedId].filter(Boolean).join('/');
111
- // TODO remove soon, deprecated homePageId
112
- const isDocsHomePage = unversionedId === (homePageId !== null && homePageId !== void 0 ? homePageId : '_index');
113
- if (frontMatter.slug && isDocsHomePage) {
114
- 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`);
115
- }
116
- const docSlug = isDocsHomePage
117
- ? '/'
118
- : slug_1.default({
119
- baseID,
120
- dirName: sourceDirName,
121
- frontmatterSlug: frontMatter.slug,
122
- stripDirNumberPrefixes: parse_number_prefixes,
123
- numberPrefixParser: options.numberPrefixParser,
124
- });
125
- // Note: the title is used by default for page title, sidebar label, pagination buttons...
126
- // frontMatter.title should be used in priority over contentTitle (because it can contain markdown/JSX syntax)
127
- const title = (_d = (_c = frontMatter.title) !== null && _c !== void 0 ? _c : contentTitle) !== null && _d !== void 0 ? _d : baseID;
128
- const description = (_f = (_e = frontMatter.description) !== null && _e !== void 0 ? _e : excerpt) !== null && _f !== void 0 ? _f : '';
129
- const permalink = utils_1.normalizeUrl([versionMetadata.versionPath, docSlug]);
119
+ const docSlug = (0, slug_1.default)({
120
+ baseID,
121
+ source,
122
+ sourceDirName,
123
+ frontMatterSlug: frontMatter.slug,
124
+ stripDirNumberPrefixes: parseNumberPrefixes,
125
+ numberPrefixParser: options.numberPrefixParser,
126
+ });
127
+ // Note: the title is used by default for page title, sidebar label,
128
+ // pagination buttons... frontMatter.title should be used in priority over
129
+ // contentTitle (because it can contain markdown/JSX syntax)
130
+ const title = frontMatter.title ?? contentTitle ?? baseID;
131
+ const description = frontMatter.description ?? excerpt ?? '';
132
+ const permalink = (0, utils_1.normalizeUrl)([versionMetadata.path, docSlug]);
130
133
  function getDocEditUrl() {
131
134
  const relativeFilePath = path_1.default.relative(contentPath, filePath);
132
135
  if (typeof options.editUrl === 'function') {
133
136
  return options.editUrl({
134
137
  version: versionMetadata.versionName,
135
- versionDocsDirPath: utils_1.posixPath(path_1.default.relative(siteDir, versionMetadata.contentPath)),
136
- docPath: utils_1.posixPath(relativeFilePath),
138
+ versionDocsDirPath: (0, utils_1.posixPath)(path_1.default.relative(siteDir, versionMetadata.contentPath)),
139
+ docPath: (0, utils_1.posixPath)(relativeFilePath),
137
140
  permalink,
138
141
  locale: context.i18n.currentLocale,
139
142
  });
@@ -141,14 +144,28 @@ function doProcessDocMetadata({ docFile, versionMetadata, context, options, }) {
141
144
  else if (typeof options.editUrl === 'string') {
142
145
  const isLocalized = contentPath === versionMetadata.contentPathLocalized;
143
146
  const baseVersionEditUrl = isLocalized && options.editLocalizedFiles
144
- ? versionMetadata.versionEditUrlLocalized
145
- : versionMetadata.versionEditUrl;
146
- return utils_1.getEditUrl(relativeFilePath, baseVersionEditUrl);
147
- }
148
- else {
149
- return undefined;
147
+ ? versionMetadata.editUrlLocalized
148
+ : versionMetadata.editUrl;
149
+ return (0, utils_1.getEditUrl)(relativeFilePath, baseVersionEditUrl);
150
150
  }
151
+ return undefined;
151
152
  }
153
+ const draft = isDraftForEnvironment({ env, frontMatter });
154
+ const formatDate = (locale, date, calendar) => {
155
+ try {
156
+ return new Intl.DateTimeFormat(locale, {
157
+ day: 'numeric',
158
+ month: 'short',
159
+ year: 'numeric',
160
+ timeZone: 'UTC',
161
+ calendar,
162
+ }).format(date);
163
+ }
164
+ catch (err) {
165
+ logger_1.default.error `Can't format docs lastUpdatedAt date "${String(date)}"`;
166
+ throw err;
167
+ }
168
+ };
152
169
  // Assign all of object properties during instantiation (if possible) for
153
170
  // NodeJS optimization.
154
171
  // Adding properties to object after instantiation will cause hidden
@@ -156,19 +173,20 @@ function doProcessDocMetadata({ docFile, versionMetadata, context, options, }) {
156
173
  return {
157
174
  unversionedId,
158
175
  id,
159
- isDocsHomePage,
160
176
  title,
161
177
  description,
162
- source: utils_1.aliasedSitePath(filePath, siteDir),
178
+ source: (0, utils_1.aliasedSitePath)(filePath, siteDir),
163
179
  sourceDirName,
164
180
  slug: docSlug,
165
181
  permalink,
182
+ draft,
166
183
  editUrl: customEditURL !== undefined ? customEditURL : getDocEditUrl(),
184
+ tags: (0, utils_1.normalizeFrontMatterTags)(versionMetadata.tagsPath, frontMatter.tags),
167
185
  version: versionMetadata.versionName,
168
186
  lastUpdatedBy: lastUpdate.lastUpdatedBy,
169
187
  lastUpdatedAt: lastUpdate.lastUpdatedAt,
170
188
  formattedLastUpdatedAt: lastUpdate.lastUpdatedAt
171
- ? new Intl.DateTimeFormat(i18n.currentLocale).format(lastUpdate.lastUpdatedAt * 1000)
189
+ ? formatDate(i18n.currentLocale, new Date(lastUpdate.lastUpdatedAt * 1000), i18n.localeConfigs[i18n.currentLocale].calendar)
172
190
  : undefined,
173
191
  sidebarPosition,
174
192
  frontMatter,
@@ -178,9 +196,114 @@ function processDocMetadata(args) {
178
196
  try {
179
197
  return doProcessDocMetadata(args);
180
198
  }
181
- catch (e) {
182
- console.error(chalk_1.default.red(`Can't process doc metadatas for doc at path "${args.docFile.filePath}" in version "${args.versionMetadata.versionName}"`));
183
- throw e;
199
+ catch (err) {
200
+ logger_1.default.error `Can't process doc metadata for doc at path path=${args.docFile.filePath} in version name=${args.versionMetadata.versionName}`;
201
+ throw err;
184
202
  }
185
203
  }
186
204
  exports.processDocMetadata = processDocMetadata;
205
+ function addDocNavigation(docsBase, sidebarsUtils, sidebarFilePath) {
206
+ const docsById = createDocsByIdIndex(docsBase);
207
+ sidebarsUtils.checkSidebarsDocIds(docsBase.flatMap(getDocIds), sidebarFilePath);
208
+ // Add sidebar/next/previous to the docs
209
+ function addNavData(doc) {
210
+ const navigation = sidebarsUtils.getDocNavigation(doc.unversionedId, doc.id, doc.frontMatter.displayed_sidebar);
211
+ const toNavigationLinkByDocId = (docId, type) => {
212
+ if (!docId) {
213
+ return undefined;
214
+ }
215
+ const navDoc = docsById[docId];
216
+ if (!navDoc) {
217
+ // This could only happen if user provided the ID through front matter
218
+ throw new Error(`Error when loading ${doc.id} in ${doc.sourceDirName}: the pagination_${type} front matter points to a non-existent ID ${docId}.`);
219
+ }
220
+ return (0, utils_2.toDocNavigationLink)(navDoc);
221
+ };
222
+ const previous = doc.frontMatter.pagination_prev !== undefined
223
+ ? toNavigationLinkByDocId(doc.frontMatter.pagination_prev, 'prev')
224
+ : (0, utils_2.toNavigationLink)(navigation.previous, docsById);
225
+ const next = doc.frontMatter.pagination_next !== undefined
226
+ ? toNavigationLinkByDocId(doc.frontMatter.pagination_next, 'next')
227
+ : (0, utils_2.toNavigationLink)(navigation.next, docsById);
228
+ return { ...doc, sidebar: navigation.sidebarName, previous, next };
229
+ }
230
+ const docsWithNavigation = docsBase.map(addNavData);
231
+ // Sort to ensure consistent output for tests
232
+ docsWithNavigation.sort((a, b) => a.id.localeCompare(b.id));
233
+ return docsWithNavigation;
234
+ }
235
+ exports.addDocNavigation = addDocNavigation;
236
+ /**
237
+ * The "main doc" is the "version entry point"
238
+ * We browse this doc by clicking on a version:
239
+ * - the "home" doc (at '/docs/')
240
+ * - the first doc of the first sidebar
241
+ * - a random doc (if no docs are in any sidebar... edge case)
242
+ */
243
+ function getMainDocId({ docs, sidebarsUtils, }) {
244
+ function getMainDoc() {
245
+ const versionHomeDoc = docs.find((doc) => doc.slug === '/');
246
+ const firstDocIdOfFirstSidebar = sidebarsUtils.getFirstDocIdOfFirstSidebar();
247
+ if (versionHomeDoc) {
248
+ return versionHomeDoc;
249
+ }
250
+ else if (firstDocIdOfFirstSidebar) {
251
+ return docs.find((doc) => doc.id === firstDocIdOfFirstSidebar ||
252
+ doc.unversionedId === firstDocIdOfFirstSidebar);
253
+ }
254
+ return docs[0];
255
+ }
256
+ return getMainDoc().unversionedId;
257
+ }
258
+ exports.getMainDocId = getMainDocId;
259
+ // By convention, Docusaurus considers some docs are "indexes":
260
+ // - index.md
261
+ // - readme.md
262
+ // - <folder>/<folder>.md
263
+ //
264
+ // This function is the default implementation of this convention
265
+ //
266
+ // Those index docs produce a different behavior
267
+ // - Slugs do not end with a weird "/index" suffix
268
+ // - Auto-generated sidebar categories link to them as intro
269
+ const isCategoryIndex = ({ fileName, directories, }) => {
270
+ const eligibleDocIndexNames = [
271
+ 'index',
272
+ 'readme',
273
+ directories[0]?.toLowerCase(),
274
+ ];
275
+ return eligibleDocIndexNames.includes(fileName.toLowerCase());
276
+ };
277
+ exports.isCategoryIndex = isCategoryIndex;
278
+ /**
279
+ * `guides/sidebar/autogenerated.md` ->
280
+ * `'autogenerated', '.md', ['sidebar', 'guides']`
281
+ */
282
+ function toCategoryIndexMatcherParam({ source, sourceDirName, }) {
283
+ // source + sourceDirName are always posix-style
284
+ return {
285
+ fileName: path_1.default.posix.parse(source).name,
286
+ extension: path_1.default.posix.parse(source).ext,
287
+ directories: sourceDirName.split(path_1.default.posix.sep).reverse(),
288
+ };
289
+ }
290
+ exports.toCategoryIndexMatcherParam = toCategoryIndexMatcherParam;
291
+ // Return both doc ids
292
+ // TODO legacy retro-compatibility due to old versioned sidebars using
293
+ // versioned doc ids ("id" should be removed & "versionedId" should be renamed
294
+ // to "id")
295
+ function getDocIds(doc) {
296
+ return [doc.unversionedId, doc.id];
297
+ }
298
+ exports.getDocIds = getDocIds;
299
+ // Docs are indexed by both versioned and unversioned ids at the same time
300
+ // TODO legacy retro-compatibility due to old versioned sidebars using
301
+ // versioned doc ids ("id" should be removed & "versionedId" should be renamed
302
+ // to "id")
303
+ function createDocsByIdIndex(docs) {
304
+ return Object.fromEntries(docs.flatMap((doc) => [
305
+ [doc.unversionedId, doc],
306
+ [doc.id, doc],
307
+ ]));
308
+ }
309
+ 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 '@docusaurus/plugin-content-docs';
8
+ export declare function validateDocFrontMatter(frontMatter: {
9
+ [key: string]: unknown;
10
+ }): DocFrontMatter;
@@ -7,28 +7,47 @@
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");
11
+ const FrontMatterLastUpdateErrorMessage = '{{#label}} does not look like a valid front matter FileChange object. Please use a FileChange object (with an author and/or date).';
12
12
  // 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
13
+ // We don't want default values to magically appear in doc metadata and props
14
14
  // While the user did not provide those values explicitly
15
15
  // We use default values in code instead
16
16
  const DocFrontMatterSchema = utils_validation_1.JoiFrontMatter.object({
17
17
  id: utils_validation_1.JoiFrontMatter.string(),
18
+ // See https://github.com/facebook/docusaurus/issues/4591#issuecomment-822372398
18
19
  title: utils_validation_1.JoiFrontMatter.string().allow(''),
19
20
  hide_title: utils_validation_1.JoiFrontMatter.boolean(),
20
21
  hide_table_of_contents: utils_validation_1.JoiFrontMatter.boolean(),
21
22
  keywords: utils_validation_1.JoiFrontMatter.array().items(utils_validation_1.JoiFrontMatter.string().required()),
22
23
  image: utils_validation_1.URISchema,
24
+ // See https://github.com/facebook/docusaurus/issues/4591#issuecomment-822372398
23
25
  description: utils_validation_1.JoiFrontMatter.string().allow(''),
24
26
  slug: utils_validation_1.JoiFrontMatter.string(),
25
27
  sidebar_label: utils_validation_1.JoiFrontMatter.string(),
26
28
  sidebar_position: utils_validation_1.JoiFrontMatter.number(),
29
+ sidebar_class_name: utils_validation_1.JoiFrontMatter.string(),
30
+ sidebar_custom_props: utils_validation_1.JoiFrontMatter.object().unknown(),
31
+ displayed_sidebar: utils_validation_1.JoiFrontMatter.string().allow(null),
32
+ tags: utils_validation_1.FrontMatterTagsSchema,
27
33
  pagination_label: utils_validation_1.JoiFrontMatter.string(),
28
34
  custom_edit_url: utils_validation_1.URISchema.allow('', null),
29
35
  parse_number_prefixes: utils_validation_1.JoiFrontMatter.boolean(),
36
+ pagination_next: utils_validation_1.JoiFrontMatter.string().allow(null),
37
+ pagination_prev: utils_validation_1.JoiFrontMatter.string().allow(null),
38
+ draft: utils_validation_1.JoiFrontMatter.boolean(),
39
+ ...utils_validation_1.FrontMatterTOCHeadingLevels,
40
+ last_update: utils_validation_1.JoiFrontMatter.object({
41
+ author: utils_validation_1.JoiFrontMatter.string(),
42
+ date: utils_validation_1.JoiFrontMatter.date().raw(),
43
+ })
44
+ .or('author', 'date')
45
+ .messages({
46
+ 'object.missing': FrontMatterLastUpdateErrorMessage,
47
+ 'object.base': FrontMatterLastUpdateErrorMessage,
48
+ }),
30
49
  }).unknown();
31
50
  function validateDocFrontMatter(frontMatter) {
32
- return utils_validation_1.validateFrontMatter(frontMatter, DocFrontMatterSchema);
51
+ return (0, utils_validation_1.validateFrontMatter)(frontMatter, DocFrontMatterSchema);
33
52
  }
34
53
  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;
9
- export declare function toGlobalDataVersion(version: LoadedVersion): GlobalVersion;
7
+ import type { FullVersion } from './types';
8
+ import type { GlobalVersion } from '@docusaurus/plugin-content-docs/client';
9
+ export declare function toGlobalDataVersion(version: FullVersion): 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 docs_1 = require("./docs");
10
13
  function toGlobalDataDoc(doc) {
11
14
  return {
12
15
  id: doc.unversionedId,
@@ -14,15 +17,41 @@ 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
+ return lodash_1.default.mapValues(sidebars, (sidebar, sidebarId) => {
29
+ const firstLink = version.sidebarsUtils.getFirstLink(sidebarId);
30
+ if (!firstLink) {
31
+ return {};
32
+ }
33
+ return {
34
+ link: {
35
+ path: firstLink.type === 'generated-index'
36
+ ? firstLink.permalink
37
+ : version.docs.find((doc) => doc.id === firstLink.id || doc.unversionedId === firstLink.id).permalink,
38
+ label: firstLink.label,
39
+ },
40
+ };
41
+ });
42
+ }
18
43
  function toGlobalDataVersion(version) {
19
44
  return {
20
45
  name: version.versionName,
21
- label: version.versionLabel,
46
+ label: version.label,
22
47
  isLast: version.isLast,
23
- path: version.versionPath,
24
- mainDocId: version.mainDocId,
25
- docs: version.docs.map(toGlobalDataDoc),
48
+ path: version.path,
49
+ mainDocId: (0, docs_1.getMainDocId)(version),
50
+ docs: version.docs
51
+ .map(toGlobalDataDoc)
52
+ .concat(version.categoryGeneratedIndices.map(toGlobalDataGeneratedIndex)),
53
+ draftIds: version.drafts.map((doc) => doc.unversionedId),
54
+ sidebars: toGlobalSidebars(version.sidebars, version),
26
55
  };
27
56
  }
28
57
  exports.toGlobalDataVersion = toGlobalDataVersion;
package/lib/index.d.ts CHANGED
@@ -4,7 +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
- 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 { PluginOptions, LoadedContent } from '@docusaurus/plugin-content-docs';
8
+ import type { LoadContext, Plugin } from '@docusaurus/types';
9
+ export default function pluginContentDocs(context: LoadContext, options: PluginOptions): Promise<Plugin<LoadedContent>>;
10
10
  export { validateOptions } from './options';